Home | History | Annotate | Download | only in pcm
      1 /*
      2  *  Plugin sample operators with fast switch
      3  *  Copyright (c) 2000 by Jaroslav Kysela <perex (at) perex.cz>
      4  *
      5  *
      6  *   This library is free software; you can redistribute it and/or modify
      7  *   it under the terms of the GNU Lesser General Public License as
      8  *   published by the Free Software Foundation; either version 2.1 of
      9  *   the License, or (at your option) any later version.
     10  *
     11  *   This program is distributed in the hope that it will be useful,
     12  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14  *   GNU Lesser General Public License for more details.
     15  *
     16  *   You should have received a copy of the GNU Lesser General Public
     17  *   License along with this library; if not, write to the Free Software
     18  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
     19  *
     20  */
     21 
     22 #ifndef SX_INLINES
     23 #define SX_INLINES
     24 static inline u_int32_t sx24(u_int32_t x)
     25 {
     26 	if(x&0x00800000)
     27 		return x|0xFF000000;
     28 	return x&0x00FFFFFF;
     29 }
     30 static inline u_int32_t sx24s(u_int32_t x)
     31 {
     32 	if(x&0x00008000)
     33 		return x|0x000000FF;
     34 	return x&0xFFFFFF00;
     35 }
     36 #endif
     37 
     38 #define as_u8(ptr) (*(u_int8_t*)(ptr))
     39 #define as_u16(ptr) (*(u_int16_t*)(ptr))
     40 #define as_u32(ptr) (*(u_int32_t*)(ptr))
     41 #define as_u64(ptr) (*(u_int64_t*)(ptr))
     42 #define as_s8(ptr) (*(int8_t*)(ptr))
     43 #define as_s16(ptr) (*(int16_t*)(ptr))
     44 #define as_s32(ptr) (*(int32_t*)(ptr))
     45 #define as_s64(ptr) (*(int64_t*)(ptr))
     46 #define as_float(ptr) (*(float_t*)(ptr))
     47 #define as_double(ptr) (*(double_t*)(ptr))
     48 
     49 #define as_u8c(ptr) (*(const u_int8_t*)(ptr))
     50 #define as_u16c(ptr) (*(const u_int16_t*)(ptr))
     51 #define as_u32c(ptr) (*(const u_int32_t*)(ptr))
     52 #define as_u64c(ptr) (*(const u_int64_t*)(ptr))
     53 #define as_s8c(ptr) (*(const int8_t*)(ptr))
     54 #define as_s16c(ptr) (*(const int16_t*)(ptr))
     55 #define as_s32c(ptr) (*(const int32_t*)(ptr))
     56 #define as_s64c(ptr) (*(const int64_t*)(ptr))
     57 #define as_floatc(ptr) (*(const float_t*)(ptr))
     58 #define as_doublec(ptr) (*(const double_t*)(ptr))
     59 
     60 #define _get_triple_le(ptr) (*(u_int8_t*)(ptr) | (u_int32_t)*((u_int8_t*)(ptr) + 1) << 8 | (u_int32_t)*((u_int8_t*)(ptr) + 2) << 16)
     61 #define _get_triple_be(ptr) ((u_int32_t)*(u_int8_t*)(ptr) << 16 | (u_int32_t)*((u_int8_t*)(ptr) + 1) << 8 | *((u_int8_t*)(ptr) + 2))
     62 #define _put_triple_le(ptr,val) do { \
     63 	u_int8_t *_tmp = (u_int8_t *)(ptr); \
     64 	u_int32_t _val = (val); \
     65 	_tmp[0] = _val; \
     66 	_tmp[1] = _val >> 8; \
     67 	_tmp[2] = _val >> 16; \
     68 } while(0)
     69 #define _put_triple_be(ptr,val) do { \
     70 	u_int8_t *_tmp = (u_int8_t *)(ptr); \
     71 	u_int32_t _val = (val); \
     72 	_tmp[0] = _val >> 16; \
     73 	_tmp[1] = _val >> 8; \
     74 	_tmp[2] = _val; \
     75 } while(0)
     76 
     77 #ifdef SNDRV_LITTLE_ENDIAN
     78 #define _get_triple(ptr) _get_triple_le(ptr)
     79 #define _get_triple_s(ptr) _get_triple_be(ptr)
     80 #define _put_triple(ptr,val) _put_triple_le(ptr,val)
     81 #define _put_triple_s(ptr,val) _put_triple_be(ptr,val)
     82 #else
     83 #define _get_triple(ptr) _get_triple_be(ptr)
     84 #define _get_triple_s(ptr) _get_triple_le(ptr)
     85 #define _put_triple(ptr,val) _put_triple_be(ptr,val)
     86 #define _put_triple_s(ptr,val) _put_triple_le(ptr,val)
     87 #endif
     88 
     89 #ifdef COPY_LABELS
     90 static void *copy_labels[5] = {
     91 	&&copy_8,
     92 	&&copy_16,
     93 	&&copy_24
     94 	&&copy_32,
     95 	&&copy_64
     96 };
     97 #endif
     98 
     99 #ifdef COPY_END
    100 while(0) {
    101 copy_8: as_s8(dst) = as_s8c(src); goto COPY_END;
    102 copy_16: as_s16(dst) = as_s16c(src); goto COPY_END;
    103 copy_24: memcpy(dst,src,3); goto COPY_END;
    104 copy_32: as_s32(dst) = as_s32c(src); goto COPY_END;
    105 copy_64: as_s64(dst) = as_s64c(src); goto COPY_END;
    106 }
    107 #endif
    108 
    109 #ifdef CONV_LABELS
    110 /* src_wid src_endswap sign_toggle dst_wid dst_endswap */
    111 static void *const conv_labels[4 * 2 * 2 * 4 * 2] = {
    112 	&&conv_xxx1_xxx1,	 /*  8h ->  8h */
    113 	&&conv_xxx1_xxx1,	 /*  8h ->  8s */
    114 	&&conv_xxx1_xx10,	 /*  8h -> 16h */
    115 	&&conv_xxx1_xx01,	 /*  8h -> 16s */
    116 	&&conv_xxx1_x100,	 /*  8h -> 24h */
    117 	&&conv_xxx1_001x,	 /*  8h -> 24s */
    118 	&&conv_xxx1_1000,	 /*  8h -> 32h */
    119 	&&conv_xxx1_0001,	 /*  8h -> 32s */
    120 	&&conv_xxx1_xxx9,	 /*  8h ^>  8h */
    121 	&&conv_xxx1_xxx9,	 /*  8h ^>  8s */
    122 	&&conv_xxx1_xx90,	 /*  8h ^> 16h */
    123 	&&conv_xxx1_xx09,	 /*  8h ^> 16s */
    124 	&&conv_xxx1_x900,	 /*  8h ^> 24h */
    125 	&&conv_xxx1_009x,	 /*  8h ^> 24s */
    126 	&&conv_xxx1_9000,	 /*  8h ^> 32h */
    127 	&&conv_xxx1_0009,	 /*  8h ^> 32s */
    128 	&&conv_xxx1_xxx1,	 /*  8s ->  8h */
    129 	&&conv_xxx1_xxx1,	 /*  8s ->  8s */
    130 	&&conv_xxx1_xx10,	 /*  8s -> 16h */
    131 	&&conv_xxx1_xx01,	 /*  8s -> 16s */
    132 	&&conv_xxx1_x100,	 /*  8s -> 24h */
    133 	&&conv_xxx1_001x,	 /*  8s -> 24s */
    134 	&&conv_xxx1_1000,	 /*  8s -> 32h */
    135 	&&conv_xxx1_0001,	 /*  8s -> 32s */
    136 	&&conv_xxx1_xxx9,	 /*  8s ^>  8h */
    137 	&&conv_xxx1_xxx9,	 /*  8s ^>  8s */
    138 	&&conv_xxx1_xx90,	 /*  8s ^> 16h */
    139 	&&conv_xxx1_xx09,	 /*  8s ^> 16s */
    140 	&&conv_xxx1_x900,	 /*  8s ^> 24h */
    141 	&&conv_xxx1_009x,	 /*  8s ^> 24s */
    142 	&&conv_xxx1_9000,	 /*  8s ^> 32h */
    143 	&&conv_xxx1_0009,	 /*  8s ^> 32s */
    144 	&&conv_xx12_xxx1,	 /* 16h ->  8h */
    145 	&&conv_xx12_xxx1,	 /* 16h ->  8s */
    146 	&&conv_xx12_xx12,	 /* 16h -> 16h */
    147 	&&conv_xx12_xx21,	 /* 16h -> 16s */
    148 	&&conv_xx12_x120,	 /* 16h -> 24h */
    149 	&&conv_xx12_021x,	 /* 16h -> 24s */
    150 	&&conv_xx12_1200,	 /* 16h -> 32h */
    151 	&&conv_xx12_0021,	 /* 16h -> 32s */
    152 	&&conv_xx12_xxx9,	 /* 16h ^>  8h */
    153 	&&conv_xx12_xxx9,	 /* 16h ^>  8s */
    154 	&&conv_xx12_xx92,	 /* 16h ^> 16h */
    155 	&&conv_xx12_xx29,	 /* 16h ^> 16s */
    156 	&&conv_xx12_x920,	 /* 16h ^> 24h */
    157 	&&conv_xx12_029x,	 /* 16h ^> 24s */
    158 	&&conv_xx12_9200,	 /* 16h ^> 32h */
    159 	&&conv_xx12_0029,	 /* 16h ^> 32s */
    160 	&&conv_xx12_xxx2,	 /* 16s ->  8h */
    161 	&&conv_xx12_xxx2,	 /* 16s ->  8s */
    162 	&&conv_xx12_xx21,	 /* 16s -> 16h */
    163 	&&conv_xx12_xx12,	 /* 16s -> 16s */
    164 	&&conv_xx12_x210,	 /* 16s -> 24h */
    165 	&&conv_xx12_012x,	 /* 16s -> 24s */
    166 	&&conv_xx12_2100,	 /* 16s -> 32h */
    167 	&&conv_xx12_0012,	 /* 16s -> 32s */
    168 	&&conv_xx12_xxxA,	 /* 16s ^>  8h */
    169 	&&conv_xx12_xxxA,	 /* 16s ^>  8s */
    170 	&&conv_xx12_xxA1,	 /* 16s ^> 16h */
    171 	&&conv_xx12_xx1A,	 /* 16s ^> 16s */
    172 	&&conv_xx12_xA10,	 /* 16s ^> 24h */
    173 	&&conv_xx12_01Ax,	 /* 16s ^> 24s */
    174 	&&conv_xx12_A100,	 /* 16s ^> 32h */
    175 	&&conv_xx12_001A,	 /* 16s ^> 32s */
    176 	&&conv_x123_xxx1,	 /* 24h ->  8h */
    177 	&&conv_x123_xxx1,	 /* 24h ->  8s */
    178 	&&conv_x123_xx12,	 /* 24h -> 16h */
    179 	&&conv_x123_xx21,	 /* 24h -> 16s */
    180 	&&conv_x123_x123,	 /* 24h -> 24h */
    181 	&&conv_x123_321x,	 /* 24h -> 24s */
    182 	&&conv_x123_1230,	 /* 24h -> 32h */
    183 	&&conv_x123_0321,	 /* 24h -> 32s */
    184 	&&conv_x123_xxx9,	 /* 24h ^>  8h */
    185 	&&conv_x123_xxx9,	 /* 24h ^>  8s */
    186 	&&conv_x123_xx92,	 /* 24h ^> 16h */
    187 	&&conv_x123_xx29,	 /* 24h ^> 16s */
    188 	&&conv_x123_x923,	 /* 24h ^> 24h */
    189 	&&conv_x123_329x,	 /* 24h ^> 24s */
    190 	&&conv_x123_9230,	 /* 24h ^> 32h */
    191 	&&conv_x123_0329,	 /* 24h ^> 32s */
    192 	&&conv_123x_xxx3,	 /* 24s ->  8h */
    193 	&&conv_123x_xxx3,	 /* 24s ->  8s */
    194 	&&conv_123x_xx32,	 /* 24s -> 16h */
    195 	&&conv_123x_xx23,	 /* 24s -> 16s */
    196 	&&conv_123x_x321,	 /* 24s -> 24h */
    197 	&&conv_123x_123x,	 /* 24s -> 24s */
    198 	&&conv_123x_3210,	 /* 24s -> 32h */
    199 	&&conv_123x_0123,	 /* 24s -> 32s */
    200 	&&conv_123x_xxxB,	 /* 24s ^>  8h */
    201 	&&conv_123x_xxxB,	 /* 24s ^>  8s */
    202 	&&conv_123x_xxB2,	 /* 24s ^> 16h */
    203 	&&conv_123x_xx2B,	 /* 24s ^> 16s */
    204 	&&conv_123x_xB21,	 /* 24s ^> 24h */
    205 	&&conv_123x_12Bx,	 /* 24s ^> 24s */
    206 	&&conv_123x_B210,	 /* 24s ^> 32h */
    207 	&&conv_123x_012B,	 /* 24s ^> 32s */
    208 	&&conv_1234_xxx1,	 /* 32h ->  8h */
    209 	&&conv_1234_xxx1,	 /* 32h ->  8s */
    210 	&&conv_1234_xx12,	 /* 32h -> 16h */
    211 	&&conv_1234_xx21,	 /* 32h -> 16s */
    212 	&&conv_1234_x123,	 /* 32h -> 24h */
    213 	&&conv_1234_321x,	 /* 32h -> 24s */
    214 	&&conv_1234_1234,	 /* 32h -> 32h */
    215 	&&conv_1234_4321,	 /* 32h -> 32s */
    216 	&&conv_1234_xxx9,	 /* 32h ^>  8h */
    217 	&&conv_1234_xxx9,	 /* 32h ^>  8s */
    218 	&&conv_1234_xx92,	 /* 32h ^> 16h */
    219 	&&conv_1234_xx29,	 /* 32h ^> 16s */
    220 	&&conv_1234_x923,	 /* 32h ^> 24h */
    221 	&&conv_1234_329x,	 /* 32h ^> 24s */
    222 	&&conv_1234_9234,	 /* 32h ^> 32h */
    223 	&&conv_1234_4329,	 /* 32h ^> 32s */
    224 	&&conv_1234_xxx4,	 /* 32s ->  8h */
    225 	&&conv_1234_xxx4,	 /* 32s ->  8s */
    226 	&&conv_1234_xx43,	 /* 32s -> 16h */
    227 	&&conv_1234_xx34,	 /* 32s -> 16s */
    228 	&&conv_1234_x432,	 /* 32s -> 24h */
    229 	&&conv_1234_234x,	 /* 32s -> 24s */
    230 	&&conv_1234_4321,	 /* 32s -> 32h */
    231 	&&conv_1234_1234,	 /* 32s -> 32s */
    232 	&&conv_1234_xxxC,	 /* 32s ^>  8h */
    233 	&&conv_1234_xxxC,	 /* 32s ^>  8s */
    234 	&&conv_1234_xxC3,	 /* 32s ^> 16h */
    235 	&&conv_1234_xx3C,	 /* 32s ^> 16s */
    236 	&&conv_1234_xC32,	 /* 32s ^> 24h */
    237 	&&conv_1234_23Cx,	 /* 32s ^> 24s */
    238 	&&conv_1234_C321,	 /* 32s ^> 32h */
    239 	&&conv_1234_123C,	 /* 32s ^> 32s */
    240 };
    241 #endif
    242 
    243 #ifdef CONV_END
    244 while(0) {
    245 conv_xxx1_xxx1: as_u8(dst) = as_u8c(src); goto CONV_END;
    246 conv_xxx1_xx10: as_u16(dst) = (u_int16_t)as_u8c(src) << 8; goto CONV_END;
    247 conv_xxx1_xx01: as_u16(dst) = (u_int16_t)as_u8c(src); goto CONV_END;
    248 conv_xxx1_x100: as_u32(dst) = sx24((u_int32_t)as_u8c(src) << 16); goto CONV_END;
    249 conv_xxx1_001x: as_u32(dst) = sx24s((u_int32_t)as_u8c(src) << 8); goto CONV_END;
    250 conv_xxx1_1000: as_u32(dst) = (u_int32_t)as_u8c(src) << 24; goto CONV_END;
    251 conv_xxx1_0001: as_u32(dst) = (u_int32_t)as_u8c(src); goto CONV_END;
    252 conv_xxx1_xxx9: as_u8(dst) = as_u8c(src) ^ 0x80; goto CONV_END;
    253 conv_xxx1_xx90: as_u16(dst) = (u_int16_t)(as_u8c(src) ^ 0x80) << 8; goto CONV_END;
    254 conv_xxx1_xx09: as_u16(dst) = (u_int16_t)(as_u8c(src) ^ 0x80); goto CONV_END;
    255 conv_xxx1_x900: as_u32(dst) = sx24((u_int32_t)(as_u8c(src) ^ 0x80) << 16); goto CONV_END;
    256 conv_xxx1_009x: as_u32(dst) = sx24s((u_int32_t)(as_u8c(src) ^ 0x80) << 8); goto CONV_END;
    257 conv_xxx1_9000: as_u32(dst) = (u_int32_t)(as_u8c(src) ^ 0x80) << 24; goto CONV_END;
    258 conv_xxx1_0009: as_u32(dst) = (u_int32_t)(as_u8c(src) ^ 0x80); goto CONV_END;
    259 conv_xx12_xxx1: as_u8(dst) = as_u16c(src) >> 8; goto CONV_END;
    260 conv_xx12_xx12: as_u16(dst) = as_u16c(src); goto CONV_END;
    261 conv_xx12_xx21: as_u16(dst) = bswap_16(as_u16c(src)); goto CONV_END;
    262 conv_xx12_x120: as_u32(dst) = sx24((u_int32_t)as_u16c(src) << 8); goto CONV_END;
    263 conv_xx12_021x: as_u32(dst) = sx24s((u_int32_t)bswap_16(as_u16c(src)) << 8); goto CONV_END;
    264 conv_xx12_1200: as_u32(dst) = (u_int32_t)as_u16c(src) << 16; goto CONV_END;
    265 conv_xx12_0021: as_u32(dst) = (u_int32_t)bswap_16(as_u16c(src)); goto CONV_END;
    266 conv_xx12_xxx9: as_u8(dst) = (as_u16c(src) >> 8) ^ 0x80; goto CONV_END;
    267 conv_xx12_xx92: as_u16(dst) = as_u16c(src) ^ 0x8000; goto CONV_END;
    268 conv_xx12_xx29: as_u16(dst) = bswap_16(as_u16c(src)) ^ 0x80; goto CONV_END;
    269 conv_xx12_x920: as_u32(dst) = sx24((u_int32_t)(as_u16c(src) ^ 0x8000) << 8); goto CONV_END;
    270 conv_xx12_029x: as_u32(dst) = sx24s((u_int32_t)(bswap_16(as_u16c(src)) ^ 0x80) << 8); goto CONV_END;
    271 conv_xx12_9200: as_u32(dst) = (u_int32_t)(as_u16c(src) ^ 0x8000) << 16; goto CONV_END;
    272 conv_xx12_0029: as_u32(dst) = (u_int32_t)(bswap_16(as_u16c(src)) ^ 0x80); goto CONV_END;
    273 conv_xx12_xxx2: as_u8(dst) = as_u16c(src) & 0xff; goto CONV_END;
    274 conv_xx12_x210: as_u32(dst) = sx24((u_int32_t)bswap_16(as_u16c(src)) << 8); goto CONV_END;
    275 conv_xx12_012x: as_u32(dst) = sx24s((u_int32_t)as_u16c(src) << 8); goto CONV_END;
    276 conv_xx12_2100: as_u32(dst) = (u_int32_t)bswap_16(as_u16c(src)) << 16; goto CONV_END;
    277 conv_xx12_0012: as_u32(dst) = (u_int32_t)as_u16c(src); goto CONV_END;
    278 conv_xx12_xxxA: as_u8(dst) = (as_u16c(src) ^ 0x80) & 0xff; goto CONV_END;
    279 conv_xx12_xxA1: as_u16(dst) = bswap_16(as_u16c(src) ^ 0x80); goto CONV_END;
    280 conv_xx12_xx1A: as_u16(dst) = as_u16c(src) ^ 0x80; goto CONV_END;
    281 conv_xx12_xA10: as_u32(dst) = sx24((u_int32_t)bswap_16(as_u16c(src) ^ 0x80) << 8); goto CONV_END;
    282 conv_xx12_01Ax: as_u32(dst) = sx24s((u_int32_t)(as_u16c(src) ^ 0x80) << 8); goto CONV_END;
    283 conv_xx12_A100: as_u32(dst) = (u_int32_t)bswap_16(as_u16c(src) ^ 0x80) << 16; goto CONV_END;
    284 conv_xx12_001A: as_u32(dst) = (u_int32_t)(as_u16c(src) ^ 0x80); goto CONV_END;
    285 conv_x123_xxx1: as_u8(dst) = as_u32c(src) >> 16; goto CONV_END;
    286 conv_x123_xx12: as_u16(dst) = as_u32c(src) >> 8; goto CONV_END;
    287 conv_x123_xx21: as_u16(dst) = bswap_16(as_u32c(src) >> 8); goto CONV_END;
    288 conv_x123_x123: as_u32(dst) = sx24(as_u32c(src)); goto CONV_END;
    289 conv_x123_321x: as_u32(dst) = sx24s(bswap_32(as_u32c(src))); goto CONV_END;
    290 conv_x123_1230: as_u32(dst) = as_u32c(src) << 8; goto CONV_END;
    291 conv_x123_0321: as_u32(dst) = bswap_32(as_u32c(src)) >> 8; goto CONV_END;
    292 conv_x123_xxx9: as_u8(dst) = (as_u32c(src) >> 16) ^ 0x80; goto CONV_END;
    293 conv_x123_xx92: as_u16(dst) = (as_u32c(src) >> 8) ^ 0x8000; goto CONV_END;
    294 conv_x123_xx29: as_u16(dst) = bswap_16(as_u32c(src) >> 8) ^ 0x80; goto CONV_END;
    295 conv_x123_x923: as_u32(dst) = sx24(as_u32c(src) ^ 0x800000); goto CONV_END;
    296 conv_x123_329x: as_u32(dst) = sx24s(bswap_32(as_u32c(src)) ^ 0x8000); goto CONV_END;
    297 conv_x123_9230: as_u32(dst) = (as_u32c(src) ^ 0x800000) << 8; goto CONV_END;
    298 conv_x123_0329: as_u32(dst) = (bswap_32(as_u32c(src)) >> 8) ^ 0x80; goto CONV_END;
    299 conv_123x_xxx3: as_u8(dst) = (as_u32c(src) >> 8) & 0xff; goto CONV_END;
    300 conv_123x_xx32: as_u16(dst) = bswap_16(as_u32c(src) >> 8); goto CONV_END;
    301 conv_123x_xx23: as_u16(dst) = (as_u32c(src) >> 8) & 0xffff; goto CONV_END;
    302 conv_123x_x321: as_u32(dst) = sx24(bswap_32(as_u32c(src))); goto CONV_END;
    303 conv_123x_123x: as_u32(dst) = sx24s(as_u32c(src)); goto CONV_END;
    304 conv_123x_3210: as_u32(dst) = bswap_32(as_u32c(src)) << 8; goto CONV_END;
    305 conv_123x_0123: as_u32(dst) = as_u32c(src) >> 8; goto CONV_END;
    306 conv_123x_xxxB: as_u8(dst) = ((as_u32c(src) >> 8) & 0xff) ^ 0x80; goto CONV_END;
    307 conv_123x_xxB2: as_u16(dst) = bswap_16((as_u32c(src) >> 8) ^ 0x80); goto CONV_END;
    308 conv_123x_xx2B: as_u16(dst) = ((as_u32c(src) >> 8) & 0xffff) ^ 0x80; goto CONV_END;
    309 conv_123x_xB21: as_u32(dst) = sx24(bswap_32(as_u32c(src)) ^ 0x800000); goto CONV_END;
    310 conv_123x_12Bx: as_u32(dst) = sx24s(as_u32c(src) ^ 0x8000); goto CONV_END;
    311 conv_123x_B210: as_u32(dst) = bswap_32(as_u32c(src) ^ 0x8000) << 8; goto CONV_END;
    312 conv_123x_012B: as_u32(dst) = (as_u32c(src) >> 8) ^ 0x80; goto CONV_END;
    313 conv_1234_xxx1: as_u8(dst) = as_u32c(src) >> 24; goto CONV_END;
    314 conv_1234_xx12: as_u16(dst) = as_u32c(src) >> 16; goto CONV_END;
    315 conv_1234_xx21: as_u16(dst) = bswap_16(as_u32c(src) >> 16); goto CONV_END;
    316 conv_1234_x123: as_u32(dst) = sx24(as_u32c(src) >> 8); goto CONV_END;
    317 conv_1234_321x: as_u32(dst) = sx24s(bswap_32(as_u32c(src)) << 8); goto CONV_END;
    318 conv_1234_1234: as_u32(dst) = as_u32c(src); goto CONV_END;
    319 conv_1234_4321: as_u32(dst) = bswap_32(as_u32c(src)); goto CONV_END;
    320 conv_1234_xxx9: as_u8(dst) = (as_u32c(src) >> 24) ^ 0x80; goto CONV_END;
    321 conv_1234_xx92: as_u16(dst) = (as_u32c(src) >> 16) ^ 0x8000; goto CONV_END;
    322 conv_1234_xx29: as_u16(dst) = bswap_16(as_u32c(src) >> 16) ^ 0x80; goto CONV_END;
    323 conv_1234_x923: as_u32(dst) = sx24((as_u32c(src) >> 8) ^ 0x800000); goto CONV_END;
    324 conv_1234_329x: as_u32(dst) = sx24s((bswap_32(as_u32c(src)) ^ 0x80) << 8); goto CONV_END;
    325 conv_1234_9234: as_u32(dst) = as_u32c(src) ^ 0x80000000; goto CONV_END;
    326 conv_1234_4329: as_u32(dst) = bswap_32(as_u32c(src)) ^ 0x80; goto CONV_END;
    327 conv_1234_xxx4: as_u8(dst) = as_u32c(src) & 0xff; goto CONV_END;
    328 conv_1234_xx43: as_u16(dst) = bswap_16(as_u32c(src)); goto CONV_END;
    329 conv_1234_xx34: as_u16(dst) = as_u32c(src) & 0xffff; goto CONV_END;
    330 conv_1234_x432: as_u32(dst) = sx24(bswap_32(as_u32c(src)) >> 8); goto CONV_END;
    331 conv_1234_234x: as_u32(dst) = sx24s(as_u32c(src) << 8); goto CONV_END;
    332 conv_1234_xxxC: as_u8(dst) = (as_u32c(src) & 0xff) ^ 0x80; goto CONV_END;
    333 conv_1234_xxC3: as_u16(dst) = bswap_16(as_u32c(src) ^ 0x80); goto CONV_END;
    334 conv_1234_xx3C: as_u16(dst) = (as_u32c(src) & 0xffff) ^ 0x80; goto CONV_END;
    335 conv_1234_xC32: as_u32(dst) = sx24((bswap_32(as_u32c(src)) >> 8) ^ 0x800000); goto CONV_END;
    336 conv_1234_23Cx: as_u32(dst) = sx24s((as_u32c(src) ^ 0x80) << 8); goto CONV_END;
    337 conv_1234_C321: as_u32(dst) = bswap_32(as_u32c(src) ^ 0x80); goto CONV_END;
    338 conv_1234_123C: as_u32(dst) = as_u32c(src) ^ 0x80; goto CONV_END;
    339 }
    340 #endif
    341 
    342 #ifdef GET16_LABELS
    343 /* src_wid src_endswap sign_toggle */
    344 static void *const get16_labels[4 * 2 * 2 + 4 * 3] = {
    345 	&&get16_1_10,	 /*  8h -> 16h */
    346 	&&get16_1_90,	 /*  8h ^> 16h */
    347 	&&get16_1_10,	 /*  8s -> 16h */
    348 	&&get16_1_90,	 /*  8s ^> 16h */
    349 	&&get16_12_12,	 /* 16h -> 16h */
    350 	&&get16_12_92,	 /* 16h ^> 16h */
    351 	&&get16_12_21,	 /* 16s -> 16h */
    352 	&&get16_12_A1,	 /* 16s ^> 16h */
    353 	&&get16_0123_12, /* 24h -> 16h */
    354 	&&get16_0123_92, /* 24h ^> 16h */
    355 	&&get16_1230_32, /* 24s -> 16h */
    356 	&&get16_1230_B2, /* 24s ^> 16h */
    357 	&&get16_1234_12, /* 32h -> 16h */
    358 	&&get16_1234_92, /* 32h ^> 16h */
    359 	&&get16_1234_43, /* 32s -> 16h */
    360 	&&get16_1234_C3, /* 32s ^> 16h */
    361 	/* 3bytes format */
    362 	&&get16_123_12,	 /* 24h -> 16h */
    363 	&&get16_123_92,	 /* 24h ^> 16h */
    364 	&&get16_123_32,	 /* 24s -> 16h */
    365 	&&get16_123_B2,	 /* 24s ^> 16h */
    366 	&&get16_123_12_20,	 /* 20h -> 16h */
    367 	&&get16_123_92_20,	 /* 20h ^> 16h */
    368 	&&get16_123_32_20,	 /* 20s -> 16h */
    369 	&&get16_123_B2_20,	 /* 20s ^> 16h */
    370 	&&get16_123_12_18,	 /* 18h -> 16h */
    371 	&&get16_123_92_18,	 /* 18h ^> 16h */
    372 	&&get16_123_32_18,	 /* 18s -> 16h */
    373 	&&get16_123_B2_18,	 /* 18s ^> 16h */
    374 };
    375 #endif
    376 
    377 #ifdef GET16_END
    378 while(0) {
    379 get16_1_10: sample = (u_int16_t)as_u8c(src) << 8; goto GET16_END;
    380 get16_1_90: sample = (u_int16_t)(as_u8c(src) ^ 0x80) << 8; goto GET16_END;
    381 get16_12_12: sample = as_u16c(src); goto GET16_END;
    382 get16_12_92: sample = as_u16c(src) ^ 0x8000; goto GET16_END;
    383 get16_12_21: sample = bswap_16(as_u16c(src)); goto GET16_END;
    384 get16_12_A1: sample = bswap_16(as_u16c(src) ^ 0x80); goto GET16_END;
    385 get16_0123_12: sample = as_u32c(src) >> 8; goto GET16_END;
    386 get16_0123_92: sample = (as_u32c(src) >> 8) ^ 0x8000; goto GET16_END;
    387 get16_1230_32: sample = bswap_16(as_u32c(src) >> 8); goto GET16_END;
    388 get16_1230_B2: sample = bswap_16((as_u32c(src) >> 8) ^ 0x80); goto GET16_END;
    389 get16_1234_12: sample = as_u32c(src) >> 16; goto GET16_END;
    390 get16_1234_92: sample = (as_u32c(src) >> 16) ^ 0x8000; goto GET16_END;
    391 get16_1234_43: sample = bswap_16(as_u32c(src)); goto GET16_END;
    392 get16_1234_C3: sample = bswap_16(as_u32c(src) ^ 0x80); goto GET16_END;
    393 get16_123_12: sample = _get_triple(src) >> 8; goto GET16_END;
    394 get16_123_92: sample = (_get_triple(src) >> 8) ^ 0x8000; goto GET16_END;
    395 get16_123_32: sample = _get_triple_s(src) >> 8; goto GET16_END;
    396 get16_123_B2: sample = (_get_triple_s(src) >> 8) ^ 0x8000; goto GET16_END;
    397 get16_123_12_20: sample = _get_triple(src) >> 4; goto GET16_END;
    398 get16_123_92_20: sample = (_get_triple(src) >> 4) ^ 0x8000; goto GET16_END;
    399 get16_123_32_20: sample = _get_triple_s(src) >> 4; goto GET16_END;
    400 get16_123_B2_20: sample = (_get_triple_s(src) >> 4) ^ 0x8000; goto GET16_END;
    401 get16_123_12_18: sample = _get_triple(src) >> 2; goto GET16_END;
    402 get16_123_92_18: sample = (_get_triple(src) >> 2) ^ 0x8000; goto GET16_END;
    403 get16_123_32_18: sample = _get_triple_s(src) >> 2; goto GET16_END;
    404 get16_123_B2_18: sample = (_get_triple_s(src) >> 2) ^ 0x8000; goto GET16_END;
    405 }
    406 #endif
    407 
    408 #ifdef PUT16_LABELS
    409 /* dst_wid dst_endswap sign_toggle */
    410 static void *const put16_labels[4 * 2 * 2] = {
    411 	&&put16_12_1,		 /* 16h ->  8h */
    412 	&&put16_12_9,		 /* 16h ^>  8h */
    413 	&&put16_12_1,		 /* 16h ->  8s */
    414 	&&put16_12_9,		 /* 16h ^>  8s */
    415 	&&put16_12_12,		 /* 16h -> 16h */
    416 	&&put16_12_92,		 /* 16h ^> 16h */
    417 	&&put16_12_21,		 /* 16h -> 16s */
    418 	&&put16_12_29,		 /* 16h ^> 16s */
    419 	&&put16_12_0120,	 /* 16h -> 24h */
    420 	&&put16_12_0920,	 /* 16h ^> 24h */
    421 	&&put16_12_0210,	 /* 16h -> 24s */
    422 	&&put16_12_0290,	 /* 16h ^> 24s */
    423 	&&put16_12_1200,	 /* 16h -> 32h */
    424 	&&put16_12_9200,	 /* 16h ^> 32h */
    425 	&&put16_12_0021,	 /* 16h -> 32s */
    426 	&&put16_12_0029,	 /* 16h ^> 32s */
    427 };
    428 #endif
    429 
    430 #ifdef PUT16_END
    431 while (0) {
    432 put16_12_1: as_u8(dst) = sample >> 8; goto PUT16_END;
    433 put16_12_9: as_u8(dst) = (sample >> 8) ^ 0x80; goto PUT16_END;
    434 put16_12_12: as_u16(dst) = sample; goto PUT16_END;
    435 put16_12_92: as_u16(dst) = sample ^ 0x8000; goto PUT16_END;
    436 put16_12_21: as_u16(dst) = bswap_16(sample); goto PUT16_END;
    437 put16_12_29: as_u16(dst) = bswap_16(sample) ^ 0x80; goto PUT16_END;
    438 put16_12_0120: as_u32(dst) = sx24((u_int32_t)sample << 8); goto PUT16_END;
    439 put16_12_0920: as_u32(dst) = sx24((u_int32_t)(sample ^ 0x8000) << 8); goto PUT16_END;
    440 put16_12_0210: as_u32(dst) = sx24s((u_int32_t)bswap_16(sample) << 8); goto PUT16_END;
    441 put16_12_0290: as_u32(dst) = sx24s((u_int32_t)(bswap_16(sample) ^ 0x80) << 8); goto PUT16_END;
    442 put16_12_1200: as_u32(dst) = (u_int32_t)sample << 16; goto PUT16_END;
    443 put16_12_9200: as_u32(dst) = (u_int32_t)(sample ^ 0x8000) << 16; goto PUT16_END;
    444 put16_12_0021: as_u32(dst) = (u_int32_t)bswap_16(sample); goto PUT16_END;
    445 put16_12_0029: as_u32(dst) = (u_int32_t)bswap_16(sample) ^ 0x80; goto PUT16_END;
    446 }
    447 #endif
    448 
    449 #ifdef CONV24_LABELS
    450 #define GET32_LABELS
    451 #define PUT32_LABELS
    452 #endif
    453 
    454 #ifdef GET32_LABELS
    455 /* src_wid src_endswap sign_toggle */
    456 static void *const get32_labels[4 * 2 * 2 + 4 * 3] = {
    457 	&&get32_1_1000,	 	 /*  8h -> 32h */
    458 	&&get32_1_9000,	 	 /*  8h ^> 32h */
    459 	&&get32_1_1000,		 /*  8s -> 32h */
    460 	&&get32_1_9000,		 /*  8s ^> 32h */
    461 	&&get32_12_1200,	 /* 16h -> 32h */
    462 	&&get32_12_9200,	 /* 16h ^> 32h */
    463 	&&get32_12_2100,	 /* 16s -> 32h */
    464 	&&get32_12_A100,	 /* 16s ^> 32h */
    465 	&&get32_0123_1230,	 /* 24h -> 32h */
    466 	&&get32_0123_9230,	 /* 24h ^> 32h */
    467 	&&get32_1230_3210,	 /* 24s -> 32h */
    468 	&&get32_1230_B210,	 /* 24s ^> 32h */
    469 	&&get32_1234_1234,	 /* 32h -> 32h */
    470 	&&get32_1234_9234,	 /* 32h ^> 32h */
    471 	&&get32_1234_4321,	 /* 32s -> 32h */
    472 	&&get32_1234_C321,	 /* 32s ^> 32h */
    473 	/* 3bytes format */
    474 	&&get32_123_1230,	 /* 24h -> 32h */
    475 	&&get32_123_9230,	 /* 24h ^> 32h */
    476 	&&get32_123_3210,	 /* 24s -> 32h */
    477 	&&get32_123_B210,	 /* 24s ^> 32h */
    478 	&&get32_123_1230_20,	 /* 20h -> 32h */
    479 	&&get32_123_9230_20,	 /* 20h ^> 32h */
    480 	&&get32_123_3210_20,	 /* 20s -> 32h */
    481 	&&get32_123_B210_20,	 /* 20s ^> 32h */
    482 	&&get32_123_1230_18,	 /* 18h -> 32h */
    483 	&&get32_123_9230_18,	 /* 18h ^> 32h */
    484 	&&get32_123_3210_18,	 /* 18s -> 32h */
    485 	&&get32_123_B210_18,	 /* 18s ^> 32h */
    486 };
    487 #endif
    488 
    489 #ifdef CONV24_END
    490 #define GET32_END __conv24_get
    491 #endif
    492 
    493 #ifdef GET32_END
    494 while (0) {
    495 get32_1_1000: sample = (u_int32_t)as_u8c(src) << 24; goto GET32_END;
    496 get32_1_9000: sample = (u_int32_t)(as_u8c(src) ^ 0x80) << 24; goto GET32_END;
    497 get32_12_1200: sample = (u_int32_t)as_u16c(src) << 16; goto GET32_END;
    498 get32_12_9200: sample = (u_int32_t)(as_u16c(src) ^ 0x8000) << 16; goto GET32_END;
    499 get32_12_2100: sample = (u_int32_t)bswap_16(as_u16c(src)) << 16; goto GET32_END;
    500 get32_12_A100: sample = (u_int32_t)bswap_16(as_u16c(src) ^ 0x80) << 16; goto GET32_END;
    501 get32_0123_1230: sample = as_u32c(src) << 8; goto GET32_END;
    502 get32_0123_9230: sample = (as_u32c(src) << 8) ^ 0x80000000; goto GET32_END;
    503 get32_1230_3210: sample = bswap_32(as_u32c(src) >> 8); goto GET32_END;
    504 get32_1230_B210: sample = bswap_32((as_u32c(src) >> 8) ^ 0x80); goto GET32_END;
    505 get32_1234_1234: sample = as_u32c(src); goto GET32_END;
    506 get32_1234_9234: sample = as_u32c(src) ^ 0x80000000; goto GET32_END;
    507 get32_1234_4321: sample = bswap_32(as_u32c(src)); goto GET32_END;
    508 get32_1234_C321: sample = bswap_32(as_u32c(src) ^ 0x80); goto GET32_END;
    509 get32_123_1230: sample = _get_triple(src) << 8; goto GET32_END;
    510 get32_123_9230: sample = (_get_triple(src) << 8) ^ 0x80000000; goto GET32_END;
    511 get32_123_3210: sample = _get_triple_s(src) << 8; goto GET32_END;
    512 get32_123_B210: sample = (_get_triple_s(src) << 8) ^ 0x80000000; goto GET32_END;
    513 get32_123_1230_20: sample = _get_triple(src) << 12; goto GET32_END;
    514 get32_123_9230_20: sample = (_get_triple(src) << 12) ^ 0x80000000; goto GET32_END;
    515 get32_123_3210_20: sample = _get_triple_s(src) << 12; goto GET32_END;
    516 get32_123_B210_20: sample = (_get_triple_s(src) << 12) ^ 0x80000000; goto GET32_END;
    517 get32_123_1230_18: sample = _get_triple(src) << 14; goto GET32_END;
    518 get32_123_9230_18: sample = (_get_triple(src) << 14) ^ 0x80000000; goto GET32_END;
    519 get32_123_3210_18: sample = _get_triple_s(src) << 14; goto GET32_END;
    520 get32_123_B210_18: sample = (_get_triple_s(src) << 14) ^ 0x80000000; goto GET32_END;
    521 }
    522 #endif
    523 
    524 #ifdef CONV24_END
    525 __conv24_get: goto *put;
    526 #define PUT32_END CONV24_END
    527 #endif
    528 
    529 #ifdef PUT32_LABELS
    530 /* dst_wid dst_endswap sign_toggle */
    531 static void *const put32_labels[4 * 2 * 2 + 4 * 3] = {
    532 	&&put32_1234_1,	 	 /* 32h ->  8h */
    533 	&&put32_1234_9,	 	 /* 32h ^>  8h */
    534 	&&put32_1234_1,	 	 /* 32h ->  8s */
    535 	&&put32_1234_9,	 	 /* 32h ^>  8s */
    536 	&&put32_1234_12,	 /* 32h -> 16h */
    537 	&&put32_1234_92,	 /* 32h ^> 16h */
    538 	&&put32_1234_21,	 /* 32h -> 16s */
    539 	&&put32_1234_29,	 /* 32h ^> 16s */
    540 	&&put32_1234_0123,	 /* 32h -> 24h */
    541 	&&put32_1234_0923,	 /* 32h ^> 24h */
    542 	&&put32_1234_3210,	 /* 32h -> 24s */
    543 	&&put32_1234_3290,	 /* 32h ^> 24s */
    544 	&&put32_1234_1234,	 /* 32h -> 32h */
    545 	&&put32_1234_9234,	 /* 32h ^> 32h */
    546 	&&put32_1234_4321,	 /* 32h -> 32s */
    547 	&&put32_1234_4329,	 /* 32h ^> 32s */
    548 	/* 3bytes format */
    549 	&&put32_1234_123,	 /* 32h -> 24h */
    550 	&&put32_1234_923,	 /* 32h ^> 24h */
    551 	&&put32_1234_321,	 /* 32h -> 24s */
    552 	&&put32_1234_329,	 /* 32h ^> 24s */
    553 	&&put32_1234_123_20,	 /* 32h -> 24h */
    554 	&&put32_1234_923_20,	 /* 32h ^> 24h */
    555 	&&put32_1234_321_20,	 /* 32h -> 24s */
    556 	&&put32_1234_329_20,	 /* 32h ^> 24s */
    557 	&&put32_1234_123_18,	 /* 32h -> 24h */
    558 	&&put32_1234_923_18,	 /* 32h ^> 24h */
    559 	&&put32_1234_321_18,	 /* 32h -> 24s */
    560 	&&put32_1234_329_18,	 /* 32h ^> 24s */
    561 };
    562 #endif
    563 
    564 #ifdef CONV24_LABELS
    565 #undef GET32_LABELS
    566 #undef PUT32_LABELS
    567 #endif
    568 
    569 #ifdef PUT32_END
    570 while (0) {
    571 put32_1234_1: as_u8(dst) = sample >> 24; goto PUT32_END;
    572 put32_1234_9: as_u8(dst) = (sample >> 24) ^ 0x80; goto PUT32_END;
    573 put32_1234_12: as_u16(dst) = sample >> 16; goto PUT32_END;
    574 put32_1234_92: as_u16(dst) = (sample >> 16) ^ 0x8000; goto PUT32_END;
    575 put32_1234_21: as_u16(dst) = bswap_16(sample >> 16); goto PUT32_END;
    576 put32_1234_29: as_u16(dst) = bswap_16(sample >> 16) ^ 0x80; goto PUT32_END;
    577 put32_1234_0123: as_u32(dst) = sx24(sample >> 8); goto PUT32_END;
    578 put32_1234_0923: as_u32(dst) = sx24((sample >> 8) ^ 0x800000); goto PUT32_END;
    579 put32_1234_3210: as_u32(dst) = sx24s(bswap_32(sample) << 8); goto PUT32_END;
    580 put32_1234_3290: as_u32(dst) = sx24s((bswap_32(sample) ^ 0x80) << 8); goto PUT32_END;
    581 put32_1234_1234: as_u32(dst) = sample; goto PUT32_END;
    582 put32_1234_9234: as_u32(dst) = sample ^ 0x80000000; goto PUT32_END;
    583 put32_1234_4321: as_u32(dst) = bswap_32(sample); goto PUT32_END;
    584 put32_1234_4329: as_u32(dst) = bswap_32(sample) ^ 0x80; goto PUT32_END;
    585 put32_1234_123: _put_triple(dst, sample >> 8); goto PUT32_END;
    586 put32_1234_923: _put_triple(dst, (sample ^ 0x80000000) >> 8); goto PUT32_END;
    587 put32_1234_321: _put_triple_s(dst, sample >> 8); goto PUT32_END;
    588 put32_1234_329: _put_triple_s(dst, (sample ^ 0x80000000) >> 8); goto PUT32_END;
    589 put32_1234_123_20: _put_triple(dst, sample >> 12); goto PUT32_END;
    590 put32_1234_923_20: _put_triple(dst, (sample ^ 0x80000000) >> 12); goto PUT32_END;
    591 put32_1234_321_20: _put_triple_s(dst, sample >> 12); goto PUT32_END;
    592 put32_1234_329_20: _put_triple_s(dst, (sample ^ 0x80000000) >> 12); goto PUT32_END;
    593 put32_1234_123_18: _put_triple(dst, sample >> 14); goto PUT32_END;
    594 put32_1234_923_18: _put_triple(dst, (sample ^ 0x80000000) >> 14); goto PUT32_END;
    595 put32_1234_321_18: _put_triple_s(dst, sample >> 14); goto PUT32_END;
    596 put32_1234_329_18: _put_triple_s(dst, (sample ^ 0x80000000) >> 14); goto PUT32_END;
    597 }
    598 #endif
    599 
    600 #ifdef CONV24_END
    601 #undef GET32_END
    602 #undef PUT32_END
    603 #endif
    604 
    605 #ifdef GETU_LABELS
    606 /* width endswap sign_toggle */
    607 static void *const getu_labels[4 * 2 * 2] = {
    608 	&&getu_1_1,		/*  8h ->  8h */
    609 	&&getu_1_9,		/*  8h ^>  8h */
    610 	&&getu_1_1,		/*  8s ->  8h */
    611 	&&getu_1_9,		/*  8s ^>  8h */
    612 	&&getu_12_12,		/* 16h -> 16h */
    613 	&&getu_12_92,		/* 16h ^> 16h */
    614 	&&getu_12_21,		/* 16s -> 16h */
    615 	&&getu_12_A1,		/* 16s ^> 16h */
    616 	&&getu_0123_0123,	/* 24h -> 24h */
    617 	&&getu_0123_0923,	/* 24h ^> 24h */
    618 	&&getu_1230_0321,	/* 24s -> 24h */
    619 	&&getu_1230_0B21,	/* 24s ^> 24h */
    620 	&&getu_1234_1234,	/* 32h -> 32h */
    621 	&&getu_1234_9234,	/* 32h ^> 32h */
    622 	&&getu_1234_4321,	/* 32s -> 32h */
    623 	&&getu_1234_C321,	/* 32s ^> 32h */
    624 };
    625 #endif
    626 
    627 #ifdef GETU_END
    628 while (0) {
    629 getu_1_1: sample = as_u8c(src); goto GETU_END;
    630 getu_1_9: sample = as_u8c(src) ^ 0x80; goto GETU_END;
    631 getu_12_12: sample = as_u16c(src); goto GETU_END;
    632 getu_12_92: sample = as_u16c(src) ^ 0x8000; goto GETU_END;
    633 getu_12_21: sample = bswap_16(as_u16c(src)); goto GETU_END;
    634 getu_12_A1: sample = bswap_16(as_u16c(src) ^ 0x80); goto GETU_END;
    635 getu_0123_0123: sample = sx24(as_u32c(src)); goto GETU_END;
    636 getu_0123_0923: sample = sx24(as_u32c(src) ^ 0x800000); goto GETU_END;
    637 getu_1230_0321: sample = sx24(bswap_32(as_u32c(src))); goto GETU_END;
    638 getu_1230_0B21: sample = sx24(bswap_32(as_u32c(src) ^ 0x8000)); goto GETU_END;
    639 getu_1234_1234: sample = as_u32c(src); goto GETU_END;
    640 getu_1234_9234: sample = as_u32c(src) ^ 0x80000000; goto GETU_END;
    641 getu_1234_4321: sample = bswap_32(as_u32c(src)); goto GETU_END;
    642 getu_1234_C321: sample = bswap_32(as_u32c(src) ^ 0x80); goto GETU_END;
    643 }
    644 #endif
    645 
    646 #ifdef GETS_LABELS
    647 /* width endswap sign_toggle */
    648 static void *const gets_labels[4 * 2 * 2] = {
    649 	&&gets_1_1,		/*  8h ->  8h */
    650 	&&gets_1_9,		/*  8h ^>  8h */
    651 	&&gets_1_1,		/*  8s ->  8h */
    652 	&&gets_1_9,		/*  8s ^>  8h */
    653 	&&gets_12_12,		/* 16h -> 16h */
    654 	&&gets_12_92,		/* 16h ^> 16h */
    655 	&&gets_12_21,		/* 16s -> 16h */
    656 	&&gets_12_A1,		/* 16s ^> 16h */
    657 	&&gets_0123_0123,	/* 24h -> 24h */
    658 	&&gets_0123_0923,	/* 24h ^> 24h */
    659 	&&gets_1230_0321,	/* 24s -> 24h */
    660 	&&gets_1230_0B21,	/* 24s ^> 24h */
    661 	&&gets_1234_1234,	/* 32h -> 32h */
    662 	&&gets_1234_9234,	/* 32h ^> 32h */
    663 	&&gets_1234_4321,	/* 32s -> 32h */
    664 	&&gets_1234_C321,	/* 32s ^> 32h */
    665 };
    666 #endif
    667 
    668 #ifdef GETS_END
    669 while (0) {
    670 gets_1_1: sample = as_s8c(src); goto GETS_END;
    671 gets_1_9: sample = (int8_t)(as_s8c(src) ^ 0x80); goto GETS_END;
    672 gets_12_12: sample = as_s16c(src); goto GETS_END;
    673 gets_12_92: sample = (int16_t)(as_s16c(src) ^ 0x8000); goto GETS_END;
    674 gets_12_21: sample = (int16_t)bswap_16(as_s16c(src)); goto GETS_END;
    675 gets_12_A1: sample = (int16_t)bswap_16(as_s16c(src) ^ 0x80); goto GETS_END;
    676 gets_0123_0123: sample = sx24((int32_t)(as_s32c(src) << 8) >> 8); goto GETS_END;
    677 gets_0123_0923: sample = sx24((int32_t)((as_s32c(src) ^ 0x800000) << 8) >> 8); goto GETS_END;
    678 gets_1230_0321: sample = sx24((int32_t)(bswap_32(as_s32c(src)) << 8) >> 8); goto GETS_END;
    679 gets_1230_0B21: sample = sx24((int32_t)(bswap_32(as_s32c(src) ^ 0x8000) << 8) >> 8); goto GETS_END;
    680 gets_1234_1234: sample = as_s32c(src); goto GETS_END;
    681 gets_1234_9234: sample = (int32_t)(as_s32c(src) ^ 0x80000000); goto GETS_END;
    682 gets_1234_4321: sample = (int32_t)bswap_32(as_s32c(src)); goto GETS_END;
    683 gets_1234_C321: sample = (int32_t)bswap_32(as_s32c(src) ^ 0x80); goto GETS_END;
    684 }
    685 #endif
    686 
    687 #ifdef PUT_LABELS
    688 /* width endswap sign_toggle */
    689 static void *const put_labels[4 * 2 * 2] = {
    690 	&&put_1_1,		/*  8h ->  8h */
    691 	&&put_1_9,		/*  8h ^>  8h */
    692 	&&put_1_1,		/*  8h ->  8s */
    693 	&&put_1_9,		/*  8h ^>  8s */
    694 	&&put_12_12,		/* 16h -> 16h */
    695 	&&put_12_92,		/* 16h ^> 16h */
    696 	&&put_12_21,		/* 16h -> 16s */
    697 	&&put_12_29,		/* 16h ^> 16s */
    698 	&&put_0123_0123,	/* 24h -> 24h */
    699 	&&put_0123_0923,	/* 24h ^> 24h */
    700 	&&put_0123_3210,	/* 24h -> 24s */
    701 	&&put_0123_3290,	/* 24h ^> 24s */
    702 	&&put_1234_1234,	/* 32h -> 32h */
    703 	&&put_1234_9234,	/* 32h ^> 32h */
    704 	&&put_1234_4321,	/* 32h -> 32s */
    705 	&&put_1234_4329,	/* 32h ^> 32s */
    706 };
    707 #endif
    708 
    709 #ifdef PUT_END
    710 put_1_1: as_s8(dst) = sample; goto PUT_END;
    711 put_1_9: as_u8(dst) = sample ^ 0x80; goto PUT_END;
    712 put_12_12: as_s16(dst) = sample; goto PUT_END;
    713 put_12_92: as_u16(dst) = sample ^ 0x8000; goto PUT_END;
    714 put_12_21: as_s16(dst) = bswap_16(sample); goto PUT_END;
    715 put_12_29: as_u16(dst) = bswap_16(sample) ^ 0x80; goto PUT_END;
    716 /* this always writes the unused byte in 24-bit formats as 0x00 */
    717 put_0123_0123: as_s32(dst) = sx24(sample & 0x00ffffff); goto PUT_END;
    718 put_0123_0923: as_u32(dst) = sx24((sample & 0x00ffffff) ^ 0x800000); goto PUT_END;
    719 put_0123_3210: as_s32(dst) = sx24s(bswap_32(sample) & 0xffffff00); goto PUT_END;
    720 put_0123_3290: as_u32(dst) = sx24s((bswap_32(sample) & 0xffffff00) ^ 0x8000); goto PUT_END;
    721 put_1234_1234: as_s32(dst) = sample; goto PUT_END;
    722 put_1234_9234: as_u32(dst) = sample ^ 0x80000000; goto PUT_END;
    723 put_1234_4321: as_s32(dst) = bswap_32(sample); goto PUT_END;
    724 put_1234_4329: as_u32(dst) = bswap_32(sample) ^ 0x80; goto PUT_END;
    725 #endif
    726 
    727 #ifdef PUT32F_LABELS
    728 /* type (0 = float, 1 = float64), endswap */
    729 static void *const put32float_labels[2 * 2] = {
    730 	&&put32f_1234_1234F,	/* 32h -> (float)h */
    731 	&&put32f_1234_4321F,	/* 32h -> (float)s */
    732 	&&put32f_1234_1234D,	/* 32h -> (float64)h */
    733 	&&put32f_1234_4321D,	/* 32h -> (float64)s */
    734 };
    735 #endif
    736 
    737 #ifdef PUT32F_END
    738 put32f_1234_1234F: as_float(dst) = (float_t)((int32_t)sample) / (float_t)0x80000000UL; goto PUT32F_END;
    739 put32f_1234_4321F: tmp_float.f = (float_t)((int32_t)sample) / (float_t)0x80000000UL;
    740 		   as_u32(dst) = bswap_32(tmp_float.i); goto PUT32F_END;
    741 put32f_1234_1234D: as_double(dst) = (double_t)((int32_t)sample) / (double_t)0x80000000UL; goto PUT32F_END;
    742 put32f_1234_4321D: tmp_double.d = (double_t)((int32_t)sample) / (double_t)0x80000000UL;
    743 		   as_u64(dst) = bswap_64(tmp_double.l); goto PUT32F_END;
    744 #endif
    745 
    746 #ifdef GET32F_LABELS
    747 /* type (0 = float, 1 = float64), endswap */
    748 static void *const get32float_labels[2 * 2] = {
    749 	&&get32f_1234F_1234,	/* (float)h -> 32h */
    750 	&&get32f_4321F_1234,	/* (float)s -> 32h */
    751 	&&get32f_1234D_1234,	/* (float64)h -> 32h */
    752 	&&get32f_4321D_1234,	/* (float64)s -> 32h */
    753 };
    754 #endif
    755 
    756 #ifdef GET32F_END
    757 get32f_1234F_1234: tmp_float.f = as_floatc(src);
    758 		   if (tmp_float.f >= 1.0)
    759 		   	sample = 0x7fffffff;
    760 		   else if (tmp_float.f <= -1.0)
    761 		   	sample = 0x80000000;
    762 		   else
    763 		   	sample = (int32_t)(tmp_float.f * (float_t)0x80000000UL);
    764 		   goto GET32F_END;
    765 get32f_4321F_1234: tmp_float.i = bswap_32(as_u32c(src));
    766 		   if (tmp_float.f >= 1.0)
    767 		   	sample = 0x7fffffff;
    768 		   else if (tmp_float.f <= -1.0)
    769 		   	sample = 0x80000000;
    770 		   else
    771 		   	sample = (int32_t)(tmp_float.f * (float_t)0x80000000UL);
    772 		   goto GET32F_END;
    773 get32f_1234D_1234: tmp_double.d = as_doublec(src);
    774 		   if (tmp_double.d >= 1.0)
    775 		   	sample = 0x7fffffff;
    776 		   else if (tmp_double.d <= -1.0)
    777 		   	sample = 0x80000000;
    778 		   else
    779 		   	sample = (int32_t)(tmp_double.d * (double_t)0x80000000UL);
    780 		   goto GET32F_END;
    781 get32f_4321D_1234: tmp_double.l = bswap_64(as_u64c(src));
    782 		   if (tmp_double.d >= 1.0)
    783 		   	sample = 0x7fffffff;
    784 		   else if (tmp_double.d <= -1.0)
    785 		   	sample = 0x80000000;
    786 		   else
    787 		   	sample = (int32_t)(tmp_double.d * (double_t)0x80000000UL);
    788 		   goto GET32F_END;
    789 #endif
    790 
    791 #ifdef NORMS_LABELS
    792 static inline void _norms(const void *src, void *dst,
    793 			  int src_wid,
    794 			  int dst_sign, int dst_wid, int dst_end)
    795 {
    796 	int32_t s;
    797 	switch (src_wid) {
    798 	case 8:
    799 		s = *(int32_t*)src;
    800 		if (s >= 0x7f)
    801 			goto _max;
    802 		else if (s <= -0x80)
    803 			goto _min;
    804 		break;
    805 	case 16:
    806 		s = *(int32_t*)src;
    807 		if (s >= 0x7fff)
    808 			goto _max;
    809 		else if (s <= -0x8000)
    810 			goto _min;
    811 		break;
    812 	case 24:
    813 		s = *(int32_t*)src;
    814 		if (s >= 0x7fffff)
    815 			goto _max;
    816 		else if (s <= -0x800000)
    817 			goto _min;
    818 		break;
    819 	case 32:
    820 	{
    821 		int64_t s64;
    822 		s64 = *(int64_t*)src;
    823 		if (s64 >= 0x7fffffff)
    824 			goto _max;
    825 		else if (s64 <= -0x80000000)
    826 			goto _min;
    827 		s = s64;
    828 		break;
    829 	}
    830 	default:
    831 		assert(0);
    832 		return;
    833 	}
    834 	if (src_wid < dst_wid) {
    835 		unsigned int bits = dst_wid - src_wid;
    836 		s *= 1 << bits;
    837 	} else if (src_wid > dst_wid) {
    838 		unsigned int bits = src_wid - dst_wid;
    839 		s = (s + (1 << (bits - 1))) / (1 << bits);
    840 	}
    841 	if (!dst_sign)
    842 		s += (1U << (dst_wid - 1));
    843 	switch (dst_wid) {
    844 	case 8:
    845 		*(u_int8_t*)dst = s;
    846 		break;
    847 	case 16:
    848 		if (dst_end)
    849 			s = bswap_16(s);
    850 		*(u_int16_t*)dst = s;
    851 		break;
    852 	case 24:
    853 	case 32:
    854 		if (dst_end)
    855 			s = bswap_32(s);
    856 		*(u_int32_t*)dst = s;
    857 		break;
    858 	}
    859 	return;
    860 
    861  _min:
    862 	switch (dst_wid) {
    863 	case 8:
    864 		if (dst_sign)
    865 			*(u_int8_t*)dst = 0x80;
    866 		else
    867 			*(u_int8_t*)dst = 0;
    868 		break;
    869 	case 16:
    870 		if (dst_sign)
    871 			*(u_int16_t*)dst = dst_end ? 0x0080 : 0x8000;
    872 		else
    873 			*(u_int16_t*)dst = 0;
    874 		break;
    875 	case 24:
    876 		if (dst_sign)
    877 			*(u_int32_t*)dst = dst_end ? 0x00008000 : 0x00800000;
    878 		else
    879 			*(u_int32_t*)dst = 0;
    880 		break;
    881 	case 32:
    882 		if (dst_sign)
    883 			*(u_int32_t*)dst = dst_end ? 0x00000080 : 0x80000000;
    884 		else
    885 			*(u_int32_t*)dst = 0;
    886 		break;
    887 	default:
    888 		assert(0);
    889 		break;
    890 	}
    891 	return;
    892 
    893  _max:
    894 	switch (dst_wid) {
    895 	case 8:
    896 		if (dst_sign)
    897 			*(u_int8_t*)dst = 0x7f;
    898 		else
    899 			*(u_int8_t*)dst = 0xff;
    900 		break;
    901 	case 16:
    902 		if (dst_sign)
    903 			*(u_int16_t*)dst = dst_end ? 0xff7f : 0x7fff;
    904 		else
    905 			*(u_int16_t*)dst = 0;
    906 		break;
    907 	case 24:
    908 		if (dst_sign)
    909 			*(u_int32_t*)dst = dst_end ? 0xffff7f00 : 0x007fffff;
    910 		else
    911 			*(u_int32_t*)dst = 0;
    912 		break;
    913 	case 32:
    914 		if (dst_sign)
    915 			*(u_int32_t*)dst = dst_end ? 0xffffff7f : 0x7fffffff;
    916 		else
    917 			*(u_int32_t*)dst = 0;
    918 		break;
    919 	default:
    920 		assert(0);
    921 		break;
    922 	}
    923 	return;
    924 }
    925 
    926 /* src_wid dst_sign dst_wid dst_end */
    927 static void *const norms_labels[4 * 2 * 4 * 2] = {
    928 	&&norms_8_u8,	        /*  s8 -> u8 */
    929 	&&norms_8_u8,	        /*  s8 -> u8 */
    930 	&&norms_8_u16h,	        /*  s8 -> u16h */
    931 	&&norms_8_u16s,	        /*  s8 -> u16s */
    932 	&&norms_8_u24h,	        /*  s8 -> u24h */
    933 	&&norms_8_u24s,	        /*  s8 -> u24s */
    934 	&&norms_8_u32h,	        /*  s8 -> u32h */
    935 	&&norms_8_u32s,	        /*  s8 -> u32s */
    936 	&&norms_8_s8,	        /*  s8 -> s8 */
    937 	&&norms_8_s8,	        /*  s8 -> s8 */
    938 	&&norms_8_s16h,	        /*  s8 -> s16h */
    939 	&&norms_8_s16s,	        /*  s8 -> s16s */
    940 	&&norms_8_s24h,	        /*  s8 -> s24h */
    941 	&&norms_8_s24s,	        /*  s8 -> s24s */
    942 	&&norms_8_s32h,	        /*  s8 -> s32h */
    943 	&&norms_8_s32s,	        /*  s8 -> s32s */
    944 	&&norms_16_u8,	        /* s16 -> u8 */
    945 	&&norms_16_u8,	        /* s16 -> u8 */
    946 	&&norms_16_u16h,	/* s16 -> u16h */
    947 	&&norms_16_u16s,	/* s16 -> u16s */
    948 	&&norms_16_u24h,	/* s16 -> u24h */
    949 	&&norms_16_u24s,	/* s16 -> u24s */
    950 	&&norms_16_u32h,	/* s16 -> u32h */
    951 	&&norms_16_u32s,	/* s16 -> u32s */
    952 	&&norms_16_s8,		/* s16 -> s8 h*/
    953 	&&norms_16_s8,		/* s16 -> s8 */
    954 	&&norms_16_s16h,	/* s16 -> s16h */
    955 	&&norms_16_s16s,	/* s16 -> s16s */
    956 	&&norms_16_s24h,	/* s16 -> s24h */
    957 	&&norms_16_s24s,	/* s16 -> s24s */
    958 	&&norms_16_s32h,	/* s16 -> s32h */
    959 	&&norms_16_s32s,	/* s16 -> s32s */
    960 	&&norms_24_u8,		/* s24 -> u8 */
    961 	&&norms_24_u8,		/* s24 -> u8 */
    962 	&&norms_24_u16h,	/* s24 -> u16h */
    963 	&&norms_24_u16s,	/* s24 -> u16s */
    964 	&&norms_24_u24h,	/* s24 -> u24h */
    965 	&&norms_24_u24s,	/* s24 -> u24s */
    966 	&&norms_24_u32h,	/* s24 -> u32h */
    967 	&&norms_24_u32s,	/* s24 -> u32s */
    968 	&&norms_24_s8,		/* s24 -> s8 */
    969 	&&norms_24_s8,		/* s24 -> s8 */
    970 	&&norms_24_s16h,	/* s24 -> s16h */
    971 	&&norms_24_s16s,	/* s24 -> s16s */
    972 	&&norms_24_s24h,	/* s24 -> s24h */
    973 	&&norms_24_s24s,	/* s24 -> s24s */
    974 	&&norms_24_s32h,	/* s24 -> s32h */
    975 	&&norms_24_s32s,	/* s24 -> s32s */
    976 	&&norms_32_u8,		/* s32 -> u8 */
    977 	&&norms_32_u8,		/* s32 -> u8 */
    978 	&&norms_32_u16h,	/* s32 -> u16h */
    979 	&&norms_32_u16s,	/* s32 -> u16s */
    980 	&&norms_32_u24h,	/* s32 -> u24h */
    981 	&&norms_32_u24s,	/* s32 -> u24s */
    982 	&&norms_32_u32h,	/* s32 -> u32h */
    983 	&&norms_32_u32s,	/* s32 -> u32s */
    984 	&&norms_32_s8,		/* s32 -> s8 */
    985 	&&norms_32_s8,		/* s32 -> s8 */
    986 	&&norms_32_s16h,	/* s32 -> s16h */
    987 	&&norms_32_s16s,	/* s32 -> s16s */
    988 	&&norms_32_s24h,	/* s32 -> s24h */
    989 	&&norms_32_s24s,	/* s32 -> s24s */
    990 	&&norms_32_s32h,	/* s32 -> s32h */
    991 	&&norms_32_s32s,	/* s32 -> s32s */
    992 };
    993 #endif
    994 
    995 #ifdef NORMS_END
    996 norms_8_u8:	_norms(src, dst,  8, 0,  8, 0); goto NORMS_END;
    997 norms_8_u16h:	_norms(src, dst,  8, 0,  16, 0); goto NORMS_END;
    998 norms_8_u16s:	_norms(src, dst,  8, 0,  16, 1); goto NORMS_END;
    999 norms_8_u24h:	_norms(src, dst,  8, 0,  24, 0); goto NORMS_END;
   1000 norms_8_u24s:	_norms(src, dst,  8, 0,  24, 1); goto NORMS_END;
   1001 norms_8_u32h:	_norms(src, dst,  8, 0,  32, 0); goto NORMS_END;
   1002 norms_8_u32s:	_norms(src, dst,  8, 0,  32, 1); goto NORMS_END;
   1003 norms_8_s8:	_norms(src, dst,  8, 1,  8, 0); goto NORMS_END;
   1004 norms_8_s16h:	_norms(src, dst,  8, 1,  16, 0); goto NORMS_END;
   1005 norms_8_s16s:	_norms(src, dst,  8, 1,  16, 1); goto NORMS_END;
   1006 norms_8_s24h:	_norms(src, dst,  8, 1,  24, 0); goto NORMS_END;
   1007 norms_8_s24s:	_norms(src, dst,  8, 1,  24, 1); goto NORMS_END;
   1008 norms_8_s32h:	_norms(src, dst,  8, 1,  32, 0); goto NORMS_END;
   1009 norms_8_s32s:	_norms(src, dst,  8, 1,  32, 1); goto NORMS_END;
   1010 norms_16_u8:	_norms(src, dst, 16, 0,  8, 0); goto NORMS_END;
   1011 norms_16_u16h:	_norms(src, dst, 16, 0,  16, 0); goto NORMS_END;
   1012 norms_16_u16s:	_norms(src, dst, 16, 0,  16, 1); goto NORMS_END;
   1013 norms_16_u24h:	_norms(src, dst, 16, 0,  24, 0); goto NORMS_END;
   1014 norms_16_u24s:	_norms(src, dst, 16, 0,  24, 1); goto NORMS_END;
   1015 norms_16_u32h:	_norms(src, dst, 16, 0,  32, 0); goto NORMS_END;
   1016 norms_16_u32s:	_norms(src, dst, 16, 0,  32, 1); goto NORMS_END;
   1017 norms_16_s8:	_norms(src, dst, 16, 1,  8, 0); goto NORMS_END;
   1018 norms_16_s16h:	_norms(src, dst, 16, 1,  16, 0); goto NORMS_END;
   1019 norms_16_s16s:	_norms(src, dst, 16, 1,  16, 1); goto NORMS_END;
   1020 norms_16_s24h:	_norms(src, dst, 16, 1,  24, 0); goto NORMS_END;
   1021 norms_16_s24s:	_norms(src, dst, 16, 1,  24, 1); goto NORMS_END;
   1022 norms_16_s32h:	_norms(src, dst, 16, 1,  32, 0); goto NORMS_END;
   1023 norms_16_s32s:	_norms(src, dst, 16, 1,  32, 1); goto NORMS_END;
   1024 norms_24_u8:	_norms(src, dst, 24, 0,  8, 0); goto NORMS_END;
   1025 norms_24_u16h:	_norms(src, dst, 24, 0,  16, 0); goto NORMS_END;
   1026 norms_24_u16s:	_norms(src, dst, 24, 0,  16, 1); goto NORMS_END;
   1027 norms_24_u24h:	_norms(src, dst, 24, 0,  24, 0); goto NORMS_END;
   1028 norms_24_u24s:	_norms(src, dst, 24, 0,  24, 1); goto NORMS_END;
   1029 norms_24_u32h:	_norms(src, dst, 24, 0,  32, 0); goto NORMS_END;
   1030 norms_24_u32s:	_norms(src, dst, 24, 0,  32, 1); goto NORMS_END;
   1031 norms_24_s8:	_norms(src, dst, 24, 1,  8, 0); goto NORMS_END;
   1032 norms_24_s16h:	_norms(src, dst, 24, 1,  16, 0); goto NORMS_END;
   1033 norms_24_s16s:	_norms(src, dst, 24, 1,  16, 1); goto NORMS_END;
   1034 norms_24_s24h:	_norms(src, dst, 24, 1,  24, 0); goto NORMS_END;
   1035 norms_24_s24s:	_norms(src, dst, 24, 1,  24, 1); goto NORMS_END;
   1036 norms_24_s32h:	_norms(src, dst, 24, 1,  32, 0); goto NORMS_END;
   1037 norms_24_s32s:	_norms(src, dst, 24, 1,  32, 1); goto NORMS_END;
   1038 norms_32_u8:	_norms(src, dst, 32, 0,  8, 0); goto NORMS_END;
   1039 norms_32_u16h:	_norms(src, dst, 32, 0,  16, 0); goto NORMS_END;
   1040 norms_32_u16s:	_norms(src, dst, 32, 0,  16, 1); goto NORMS_END;
   1041 norms_32_u24h:	_norms(src, dst, 32, 0,  24, 0); goto NORMS_END;
   1042 norms_32_u24s:	_norms(src, dst, 32, 0,  24, 1); goto NORMS_END;
   1043 norms_32_u32h:	_norms(src, dst, 32, 0,  32, 0); goto NORMS_END;
   1044 norms_32_u32s:	_norms(src, dst, 32, 0,  32, 1); goto NORMS_END;
   1045 norms_32_s8:	_norms(src, dst, 32, 1,  8, 0); goto NORMS_END;
   1046 norms_32_s16h:	_norms(src, dst, 32, 1,  16, 0); goto NORMS_END;
   1047 norms_32_s16s:	_norms(src, dst, 32, 1,  16, 1); goto NORMS_END;
   1048 norms_32_s24h:	_norms(src, dst, 32, 1,  24, 0); goto NORMS_END;
   1049 norms_32_s24s:	_norms(src, dst, 32, 1,  24, 1); goto NORMS_END;
   1050 norms_32_s32h:	_norms(src, dst, 32, 1,  32, 0); goto NORMS_END;
   1051 norms_32_s32s:	_norms(src, dst, 32, 1,  32, 1); goto NORMS_END;
   1052 #endif
   1053 
   1054 
   1055 #undef as_u8
   1056 #undef as_u16
   1057 #undef as_u32
   1058 #undef as_s8
   1059 #undef as_s16
   1060 #undef as_s32
   1061 #undef as_float
   1062 #undef as_double
   1063 
   1064 #undef as_u8c
   1065 #undef as_u16c
   1066 #undef as_u32c
   1067 #undef as_s8c
   1068 #undef as_s16c
   1069 #undef as_s32c
   1070 #undef as_floatc
   1071 #undef as_doublec
   1072 
   1073 #undef _get_triple
   1074 #undef _get_triple_s
   1075 #undef _get_triple_le
   1076 #undef _get_triple_be
   1077 #undef _put_triple
   1078 #undef _put_triple_s
   1079 #undef _put_triple_le
   1080 #undef _put_triple_be
   1081 
   1082