mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-12 13:30:12 -05:00
The PCM route plugin can assign the destination value from average of multiple sources with attenuation. This requires the read of each channel value, sums and writes the resultant value in the requested format. Currently, get_labels is used for reading source values while put32_labels is used for writing the dest value. This is, however, a buggy implementation; get_labels gives the value as is only with endianness and signedness conversions, but put32_labels assumes that the value is normalized to 32bit int and it shifts down to the dest format. In addition, the current code lacks get_labels entries for the 24bit formats, as Shengjiu Wang spotted out. For fixing these bugs, this patch replaces the read with get32_labels and use always 64bit int for sum. This simplifies the code a lot and drops many lines. Signed-off-by: Takashi Iwai <tiwai@suse.de>
1025 lines
40 KiB
C
1025 lines
40 KiB
C
/*
|
|
* Plugin sample operators with fast switch
|
|
* Copyright (c) 2000 by Jaroslav Kysela <perex@perex.cz>
|
|
*
|
|
*
|
|
* This library is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as
|
|
* published by the Free Software Foundation; either version 2.1 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
*/
|
|
|
|
#ifndef SX_INLINES
|
|
#define SX_INLINES
|
|
static inline u_int32_t sx24(u_int32_t x)
|
|
{
|
|
if(x&0x00800000)
|
|
return x|0xFF000000;
|
|
return x&0x00FFFFFF;
|
|
}
|
|
static inline u_int32_t sx24s(u_int32_t x)
|
|
{
|
|
if(x&0x00008000)
|
|
return x|0x000000FF;
|
|
return x&0xFFFFFF00;
|
|
}
|
|
#endif
|
|
|
|
#define as_u8(ptr) (*(u_int8_t*)(ptr))
|
|
#define as_u16(ptr) (*(u_int16_t*)(ptr))
|
|
#define as_u32(ptr) (*(u_int32_t*)(ptr))
|
|
#define as_u64(ptr) (*(u_int64_t*)(ptr))
|
|
#define as_s8(ptr) (*(int8_t*)(ptr))
|
|
#define as_s16(ptr) (*(int16_t*)(ptr))
|
|
#define as_s32(ptr) (*(int32_t*)(ptr))
|
|
#define as_s64(ptr) (*(int64_t*)(ptr))
|
|
#define as_float(ptr) (*(float_t*)(ptr))
|
|
#define as_double(ptr) (*(double_t*)(ptr))
|
|
|
|
#define as_u8c(ptr) (*(const u_int8_t*)(ptr))
|
|
#define as_u16c(ptr) (*(const u_int16_t*)(ptr))
|
|
#define as_u32c(ptr) (*(const u_int32_t*)(ptr))
|
|
#define as_u64c(ptr) (*(const u_int64_t*)(ptr))
|
|
#define as_s8c(ptr) (*(const int8_t*)(ptr))
|
|
#define as_s16c(ptr) (*(const int16_t*)(ptr))
|
|
#define as_s32c(ptr) (*(const int32_t*)(ptr))
|
|
#define as_s64c(ptr) (*(const int64_t*)(ptr))
|
|
#define as_floatc(ptr) (*(const float_t*)(ptr))
|
|
#define as_doublec(ptr) (*(const double_t*)(ptr))
|
|
|
|
#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)
|
|
#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))
|
|
#define _put_triple_le(ptr,val) do { \
|
|
u_int8_t *_tmp = (u_int8_t *)(ptr); \
|
|
u_int32_t _val = (val); \
|
|
_tmp[0] = _val; \
|
|
_tmp[1] = _val >> 8; \
|
|
_tmp[2] = _val >> 16; \
|
|
} while(0)
|
|
#define _put_triple_be(ptr,val) do { \
|
|
u_int8_t *_tmp = (u_int8_t *)(ptr); \
|
|
u_int32_t _val = (val); \
|
|
_tmp[0] = _val >> 16; \
|
|
_tmp[1] = _val >> 8; \
|
|
_tmp[2] = _val; \
|
|
} while(0)
|
|
|
|
#ifdef SNDRV_LITTLE_ENDIAN
|
|
#define _get_triple(ptr) _get_triple_le(ptr)
|
|
#define _get_triple_s(ptr) _get_triple_be(ptr)
|
|
#define _put_triple(ptr,val) _put_triple_le(ptr,val)
|
|
#define _put_triple_s(ptr,val) _put_triple_be(ptr,val)
|
|
#else
|
|
#define _get_triple(ptr) _get_triple_be(ptr)
|
|
#define _get_triple_s(ptr) _get_triple_le(ptr)
|
|
#define _put_triple(ptr,val) _put_triple_be(ptr,val)
|
|
#define _put_triple_s(ptr,val) _put_triple_le(ptr,val)
|
|
#endif
|
|
|
|
#ifdef COPY_LABELS
|
|
static void *copy_labels[5] = {
|
|
&©_8,
|
|
&©_16,
|
|
&©_24
|
|
&©_32,
|
|
&©_64
|
|
};
|
|
#endif
|
|
|
|
#ifdef COPY_END
|
|
while(0) {
|
|
copy_8: as_s8(dst) = as_s8c(src); goto COPY_END;
|
|
copy_16: as_s16(dst) = as_s16c(src); goto COPY_END;
|
|
copy_24: memcpy(dst,src,3); goto COPY_END;
|
|
copy_32: as_s32(dst) = as_s32c(src); goto COPY_END;
|
|
copy_64: as_s64(dst) = as_s64c(src); goto COPY_END;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONV_LABELS
|
|
/* src_wid src_endswap sign_toggle dst_wid dst_endswap */
|
|
static void *const conv_labels[4 * 2 * 2 * 4 * 2] = {
|
|
&&conv_xxx1_xxx1, /* 8h -> 8h */
|
|
&&conv_xxx1_xxx1, /* 8h -> 8s */
|
|
&&conv_xxx1_xx10, /* 8h -> 16h */
|
|
&&conv_xxx1_xx01, /* 8h -> 16s */
|
|
&&conv_xxx1_x100, /* 8h -> 24h */
|
|
&&conv_xxx1_001x, /* 8h -> 24s */
|
|
&&conv_xxx1_1000, /* 8h -> 32h */
|
|
&&conv_xxx1_0001, /* 8h -> 32s */
|
|
&&conv_xxx1_xxx9, /* 8h ^> 8h */
|
|
&&conv_xxx1_xxx9, /* 8h ^> 8s */
|
|
&&conv_xxx1_xx90, /* 8h ^> 16h */
|
|
&&conv_xxx1_xx09, /* 8h ^> 16s */
|
|
&&conv_xxx1_x900, /* 8h ^> 24h */
|
|
&&conv_xxx1_009x, /* 8h ^> 24s */
|
|
&&conv_xxx1_9000, /* 8h ^> 32h */
|
|
&&conv_xxx1_0009, /* 8h ^> 32s */
|
|
&&conv_xxx1_xxx1, /* 8s -> 8h */
|
|
&&conv_xxx1_xxx1, /* 8s -> 8s */
|
|
&&conv_xxx1_xx10, /* 8s -> 16h */
|
|
&&conv_xxx1_xx01, /* 8s -> 16s */
|
|
&&conv_xxx1_x100, /* 8s -> 24h */
|
|
&&conv_xxx1_001x, /* 8s -> 24s */
|
|
&&conv_xxx1_1000, /* 8s -> 32h */
|
|
&&conv_xxx1_0001, /* 8s -> 32s */
|
|
&&conv_xxx1_xxx9, /* 8s ^> 8h */
|
|
&&conv_xxx1_xxx9, /* 8s ^> 8s */
|
|
&&conv_xxx1_xx90, /* 8s ^> 16h */
|
|
&&conv_xxx1_xx09, /* 8s ^> 16s */
|
|
&&conv_xxx1_x900, /* 8s ^> 24h */
|
|
&&conv_xxx1_009x, /* 8s ^> 24s */
|
|
&&conv_xxx1_9000, /* 8s ^> 32h */
|
|
&&conv_xxx1_0009, /* 8s ^> 32s */
|
|
&&conv_xx12_xxx1, /* 16h -> 8h */
|
|
&&conv_xx12_xxx1, /* 16h -> 8s */
|
|
&&conv_xx12_xx12, /* 16h -> 16h */
|
|
&&conv_xx12_xx21, /* 16h -> 16s */
|
|
&&conv_xx12_x120, /* 16h -> 24h */
|
|
&&conv_xx12_021x, /* 16h -> 24s */
|
|
&&conv_xx12_1200, /* 16h -> 32h */
|
|
&&conv_xx12_0021, /* 16h -> 32s */
|
|
&&conv_xx12_xxx9, /* 16h ^> 8h */
|
|
&&conv_xx12_xxx9, /* 16h ^> 8s */
|
|
&&conv_xx12_xx92, /* 16h ^> 16h */
|
|
&&conv_xx12_xx29, /* 16h ^> 16s */
|
|
&&conv_xx12_x920, /* 16h ^> 24h */
|
|
&&conv_xx12_029x, /* 16h ^> 24s */
|
|
&&conv_xx12_9200, /* 16h ^> 32h */
|
|
&&conv_xx12_0029, /* 16h ^> 32s */
|
|
&&conv_xx12_xxx2, /* 16s -> 8h */
|
|
&&conv_xx12_xxx2, /* 16s -> 8s */
|
|
&&conv_xx12_xx21, /* 16s -> 16h */
|
|
&&conv_xx12_xx12, /* 16s -> 16s */
|
|
&&conv_xx12_x210, /* 16s -> 24h */
|
|
&&conv_xx12_012x, /* 16s -> 24s */
|
|
&&conv_xx12_2100, /* 16s -> 32h */
|
|
&&conv_xx12_0012, /* 16s -> 32s */
|
|
&&conv_xx12_xxxA, /* 16s ^> 8h */
|
|
&&conv_xx12_xxxA, /* 16s ^> 8s */
|
|
&&conv_xx12_xxA1, /* 16s ^> 16h */
|
|
&&conv_xx12_xx1A, /* 16s ^> 16s */
|
|
&&conv_xx12_xA10, /* 16s ^> 24h */
|
|
&&conv_xx12_01Ax, /* 16s ^> 24s */
|
|
&&conv_xx12_A100, /* 16s ^> 32h */
|
|
&&conv_xx12_001A, /* 16s ^> 32s */
|
|
&&conv_x123_xxx1, /* 24h -> 8h */
|
|
&&conv_x123_xxx1, /* 24h -> 8s */
|
|
&&conv_x123_xx12, /* 24h -> 16h */
|
|
&&conv_x123_xx21, /* 24h -> 16s */
|
|
&&conv_x123_x123, /* 24h -> 24h */
|
|
&&conv_x123_321x, /* 24h -> 24s */
|
|
&&conv_x123_1230, /* 24h -> 32h */
|
|
&&conv_x123_0321, /* 24h -> 32s */
|
|
&&conv_x123_xxx9, /* 24h ^> 8h */
|
|
&&conv_x123_xxx9, /* 24h ^> 8s */
|
|
&&conv_x123_xx92, /* 24h ^> 16h */
|
|
&&conv_x123_xx29, /* 24h ^> 16s */
|
|
&&conv_x123_x923, /* 24h ^> 24h */
|
|
&&conv_x123_329x, /* 24h ^> 24s */
|
|
&&conv_x123_9230, /* 24h ^> 32h */
|
|
&&conv_x123_0329, /* 24h ^> 32s */
|
|
&&conv_123x_xxx3, /* 24s -> 8h */
|
|
&&conv_123x_xxx3, /* 24s -> 8s */
|
|
&&conv_123x_xx32, /* 24s -> 16h */
|
|
&&conv_123x_xx23, /* 24s -> 16s */
|
|
&&conv_123x_x321, /* 24s -> 24h */
|
|
&&conv_123x_123x, /* 24s -> 24s */
|
|
&&conv_123x_3210, /* 24s -> 32h */
|
|
&&conv_123x_0123, /* 24s -> 32s */
|
|
&&conv_123x_xxxB, /* 24s ^> 8h */
|
|
&&conv_123x_xxxB, /* 24s ^> 8s */
|
|
&&conv_123x_xxB2, /* 24s ^> 16h */
|
|
&&conv_123x_xx2B, /* 24s ^> 16s */
|
|
&&conv_123x_xB21, /* 24s ^> 24h */
|
|
&&conv_123x_12Bx, /* 24s ^> 24s */
|
|
&&conv_123x_B210, /* 24s ^> 32h */
|
|
&&conv_123x_012B, /* 24s ^> 32s */
|
|
&&conv_1234_xxx1, /* 32h -> 8h */
|
|
&&conv_1234_xxx1, /* 32h -> 8s */
|
|
&&conv_1234_xx12, /* 32h -> 16h */
|
|
&&conv_1234_xx21, /* 32h -> 16s */
|
|
&&conv_1234_x123, /* 32h -> 24h */
|
|
&&conv_1234_321x, /* 32h -> 24s */
|
|
&&conv_1234_1234, /* 32h -> 32h */
|
|
&&conv_1234_4321, /* 32h -> 32s */
|
|
&&conv_1234_xxx9, /* 32h ^> 8h */
|
|
&&conv_1234_xxx9, /* 32h ^> 8s */
|
|
&&conv_1234_xx92, /* 32h ^> 16h */
|
|
&&conv_1234_xx29, /* 32h ^> 16s */
|
|
&&conv_1234_x923, /* 32h ^> 24h */
|
|
&&conv_1234_329x, /* 32h ^> 24s */
|
|
&&conv_1234_9234, /* 32h ^> 32h */
|
|
&&conv_1234_4329, /* 32h ^> 32s */
|
|
&&conv_1234_xxx4, /* 32s -> 8h */
|
|
&&conv_1234_xxx4, /* 32s -> 8s */
|
|
&&conv_1234_xx43, /* 32s -> 16h */
|
|
&&conv_1234_xx34, /* 32s -> 16s */
|
|
&&conv_1234_x432, /* 32s -> 24h */
|
|
&&conv_1234_234x, /* 32s -> 24s */
|
|
&&conv_1234_4321, /* 32s -> 32h */
|
|
&&conv_1234_1234, /* 32s -> 32s */
|
|
&&conv_1234_xxxC, /* 32s ^> 8h */
|
|
&&conv_1234_xxxC, /* 32s ^> 8s */
|
|
&&conv_1234_xxC3, /* 32s ^> 16h */
|
|
&&conv_1234_xx3C, /* 32s ^> 16s */
|
|
&&conv_1234_xC32, /* 32s ^> 24h */
|
|
&&conv_1234_23Cx, /* 32s ^> 24s */
|
|
&&conv_1234_C321, /* 32s ^> 32h */
|
|
&&conv_1234_123C, /* 32s ^> 32s */
|
|
};
|
|
#endif
|
|
|
|
#ifdef CONV_END
|
|
while(0) {
|
|
conv_xxx1_xxx1: as_u8(dst) = as_u8c(src); goto CONV_END;
|
|
conv_xxx1_xx10: as_u16(dst) = (u_int16_t)as_u8c(src) << 8; goto CONV_END;
|
|
conv_xxx1_xx01: as_u16(dst) = (u_int16_t)as_u8c(src); goto CONV_END;
|
|
conv_xxx1_x100: as_u32(dst) = sx24((u_int32_t)as_u8c(src) << 16); goto CONV_END;
|
|
conv_xxx1_001x: as_u32(dst) = sx24s((u_int32_t)as_u8c(src) << 8); goto CONV_END;
|
|
conv_xxx1_1000: as_u32(dst) = (u_int32_t)as_u8c(src) << 24; goto CONV_END;
|
|
conv_xxx1_0001: as_u32(dst) = (u_int32_t)as_u8c(src); goto CONV_END;
|
|
conv_xxx1_xxx9: as_u8(dst) = as_u8c(src) ^ 0x80; goto CONV_END;
|
|
conv_xxx1_xx90: as_u16(dst) = (u_int16_t)(as_u8c(src) ^ 0x80) << 8; goto CONV_END;
|
|
conv_xxx1_xx09: as_u16(dst) = (u_int16_t)(as_u8c(src) ^ 0x80); goto CONV_END;
|
|
conv_xxx1_x900: as_u32(dst) = sx24((u_int32_t)(as_u8c(src) ^ 0x80) << 16); goto CONV_END;
|
|
conv_xxx1_009x: as_u32(dst) = sx24s((u_int32_t)(as_u8c(src) ^ 0x80) << 8); goto CONV_END;
|
|
conv_xxx1_9000: as_u32(dst) = (u_int32_t)(as_u8c(src) ^ 0x80) << 24; goto CONV_END;
|
|
conv_xxx1_0009: as_u32(dst) = (u_int32_t)(as_u8c(src) ^ 0x80); goto CONV_END;
|
|
conv_xx12_xxx1: as_u8(dst) = as_u16c(src) >> 8; goto CONV_END;
|
|
conv_xx12_xx12: as_u16(dst) = as_u16c(src); goto CONV_END;
|
|
conv_xx12_xx21: as_u16(dst) = bswap_16(as_u16c(src)); goto CONV_END;
|
|
conv_xx12_x120: as_u32(dst) = sx24((u_int32_t)as_u16c(src) << 8); goto CONV_END;
|
|
conv_xx12_021x: as_u32(dst) = sx24s((u_int32_t)bswap_16(as_u16c(src)) << 8); goto CONV_END;
|
|
conv_xx12_1200: as_u32(dst) = (u_int32_t)as_u16c(src) << 16; goto CONV_END;
|
|
conv_xx12_0021: as_u32(dst) = (u_int32_t)bswap_16(as_u16c(src)); goto CONV_END;
|
|
conv_xx12_xxx9: as_u8(dst) = (as_u16c(src) >> 8) ^ 0x80; goto CONV_END;
|
|
conv_xx12_xx92: as_u16(dst) = as_u16c(src) ^ 0x8000; goto CONV_END;
|
|
conv_xx12_xx29: as_u16(dst) = bswap_16(as_u16c(src)) ^ 0x80; goto CONV_END;
|
|
conv_xx12_x920: as_u32(dst) = sx24((u_int32_t)(as_u16c(src) ^ 0x8000) << 8); goto CONV_END;
|
|
conv_xx12_029x: as_u32(dst) = sx24s((u_int32_t)(bswap_16(as_u16c(src)) ^ 0x80) << 8); goto CONV_END;
|
|
conv_xx12_9200: as_u32(dst) = (u_int32_t)(as_u16c(src) ^ 0x8000) << 16; goto CONV_END;
|
|
conv_xx12_0029: as_u32(dst) = (u_int32_t)(bswap_16(as_u16c(src)) ^ 0x80); goto CONV_END;
|
|
conv_xx12_xxx2: as_u8(dst) = as_u16c(src) & 0xff; goto CONV_END;
|
|
conv_xx12_x210: as_u32(dst) = sx24((u_int32_t)bswap_16(as_u16c(src)) << 8); goto CONV_END;
|
|
conv_xx12_012x: as_u32(dst) = sx24s((u_int32_t)as_u16c(src) << 8); goto CONV_END;
|
|
conv_xx12_2100: as_u32(dst) = (u_int32_t)bswap_16(as_u16c(src)) << 16; goto CONV_END;
|
|
conv_xx12_0012: as_u32(dst) = (u_int32_t)as_u16c(src); goto CONV_END;
|
|
conv_xx12_xxxA: as_u8(dst) = (as_u16c(src) ^ 0x80) & 0xff; goto CONV_END;
|
|
conv_xx12_xxA1: as_u16(dst) = bswap_16(as_u16c(src) ^ 0x80); goto CONV_END;
|
|
conv_xx12_xx1A: as_u16(dst) = as_u16c(src) ^ 0x80; goto CONV_END;
|
|
conv_xx12_xA10: as_u32(dst) = sx24((u_int32_t)bswap_16(as_u16c(src) ^ 0x80) << 8); goto CONV_END;
|
|
conv_xx12_01Ax: as_u32(dst) = sx24s((u_int32_t)(as_u16c(src) ^ 0x80) << 8); goto CONV_END;
|
|
conv_xx12_A100: as_u32(dst) = (u_int32_t)bswap_16(as_u16c(src) ^ 0x80) << 16; goto CONV_END;
|
|
conv_xx12_001A: as_u32(dst) = (u_int32_t)(as_u16c(src) ^ 0x80); goto CONV_END;
|
|
conv_x123_xxx1: as_u8(dst) = as_u32c(src) >> 16; goto CONV_END;
|
|
conv_x123_xx12: as_u16(dst) = as_u32c(src) >> 8; goto CONV_END;
|
|
conv_x123_xx21: as_u16(dst) = bswap_16(as_u32c(src) >> 8); goto CONV_END;
|
|
conv_x123_x123: as_u32(dst) = sx24(as_u32c(src)); goto CONV_END;
|
|
conv_x123_321x: as_u32(dst) = sx24s(bswap_32(as_u32c(src))); goto CONV_END;
|
|
conv_x123_1230: as_u32(dst) = as_u32c(src) << 8; goto CONV_END;
|
|
conv_x123_0321: as_u32(dst) = bswap_32(as_u32c(src)) >> 8; goto CONV_END;
|
|
conv_x123_xxx9: as_u8(dst) = (as_u32c(src) >> 16) ^ 0x80; goto CONV_END;
|
|
conv_x123_xx92: as_u16(dst) = (as_u32c(src) >> 8) ^ 0x8000; goto CONV_END;
|
|
conv_x123_xx29: as_u16(dst) = bswap_16(as_u32c(src) >> 8) ^ 0x80; goto CONV_END;
|
|
conv_x123_x923: as_u32(dst) = sx24(as_u32c(src) ^ 0x800000); goto CONV_END;
|
|
conv_x123_329x: as_u32(dst) = sx24s(bswap_32(as_u32c(src)) ^ 0x8000); goto CONV_END;
|
|
conv_x123_9230: as_u32(dst) = (as_u32c(src) ^ 0x800000) << 8; goto CONV_END;
|
|
conv_x123_0329: as_u32(dst) = (bswap_32(as_u32c(src)) >> 8) ^ 0x80; goto CONV_END;
|
|
conv_123x_xxx3: as_u8(dst) = (as_u32c(src) >> 8) & 0xff; goto CONV_END;
|
|
conv_123x_xx32: as_u16(dst) = bswap_16(as_u32c(src) >> 8); goto CONV_END;
|
|
conv_123x_xx23: as_u16(dst) = (as_u32c(src) >> 8) & 0xffff; goto CONV_END;
|
|
conv_123x_x321: as_u32(dst) = sx24(bswap_32(as_u32c(src))); goto CONV_END;
|
|
conv_123x_123x: as_u32(dst) = sx24s(as_u32c(src)); goto CONV_END;
|
|
conv_123x_3210: as_u32(dst) = bswap_32(as_u32c(src)) << 8; goto CONV_END;
|
|
conv_123x_0123: as_u32(dst) = as_u32c(src) >> 8; goto CONV_END;
|
|
conv_123x_xxxB: as_u8(dst) = ((as_u32c(src) >> 8) & 0xff) ^ 0x80; goto CONV_END;
|
|
conv_123x_xxB2: as_u16(dst) = bswap_16((as_u32c(src) >> 8) ^ 0x80); goto CONV_END;
|
|
conv_123x_xx2B: as_u16(dst) = ((as_u32c(src) >> 8) & 0xffff) ^ 0x80; goto CONV_END;
|
|
conv_123x_xB21: as_u32(dst) = sx24(bswap_32(as_u32c(src)) ^ 0x800000); goto CONV_END;
|
|
conv_123x_12Bx: as_u32(dst) = sx24s(as_u32c(src) ^ 0x8000); goto CONV_END;
|
|
conv_123x_B210: as_u32(dst) = bswap_32(as_u32c(src) ^ 0x8000) << 8; goto CONV_END;
|
|
conv_123x_012B: as_u32(dst) = (as_u32c(src) >> 8) ^ 0x80; goto CONV_END;
|
|
conv_1234_xxx1: as_u8(dst) = as_u32c(src) >> 24; goto CONV_END;
|
|
conv_1234_xx12: as_u16(dst) = as_u32c(src) >> 16; goto CONV_END;
|
|
conv_1234_xx21: as_u16(dst) = bswap_16(as_u32c(src) >> 16); goto CONV_END;
|
|
conv_1234_x123: as_u32(dst) = sx24(as_u32c(src) >> 8); goto CONV_END;
|
|
conv_1234_321x: as_u32(dst) = sx24s(bswap_32(as_u32c(src)) << 8); goto CONV_END;
|
|
conv_1234_1234: as_u32(dst) = as_u32c(src); goto CONV_END;
|
|
conv_1234_4321: as_u32(dst) = bswap_32(as_u32c(src)); goto CONV_END;
|
|
conv_1234_xxx9: as_u8(dst) = (as_u32c(src) >> 24) ^ 0x80; goto CONV_END;
|
|
conv_1234_xx92: as_u16(dst) = (as_u32c(src) >> 16) ^ 0x8000; goto CONV_END;
|
|
conv_1234_xx29: as_u16(dst) = bswap_16(as_u32c(src) >> 16) ^ 0x80; goto CONV_END;
|
|
conv_1234_x923: as_u32(dst) = sx24((as_u32c(src) >> 8) ^ 0x800000); goto CONV_END;
|
|
conv_1234_329x: as_u32(dst) = sx24s((bswap_32(as_u32c(src)) ^ 0x80) << 8); goto CONV_END;
|
|
conv_1234_9234: as_u32(dst) = as_u32c(src) ^ 0x80000000; goto CONV_END;
|
|
conv_1234_4329: as_u32(dst) = bswap_32(as_u32c(src)) ^ 0x80; goto CONV_END;
|
|
conv_1234_xxx4: as_u8(dst) = as_u32c(src) & 0xff; goto CONV_END;
|
|
conv_1234_xx43: as_u16(dst) = bswap_16(as_u32c(src)); goto CONV_END;
|
|
conv_1234_xx34: as_u16(dst) = as_u32c(src) & 0xffff; goto CONV_END;
|
|
conv_1234_x432: as_u32(dst) = sx24(bswap_32(as_u32c(src)) >> 8); goto CONV_END;
|
|
conv_1234_234x: as_u32(dst) = sx24s(as_u32c(src) << 8); goto CONV_END;
|
|
conv_1234_xxxC: as_u8(dst) = (as_u32c(src) & 0xff) ^ 0x80; goto CONV_END;
|
|
conv_1234_xxC3: as_u16(dst) = bswap_16(as_u32c(src) ^ 0x80); goto CONV_END;
|
|
conv_1234_xx3C: as_u16(dst) = (as_u32c(src) & 0xffff) ^ 0x80; goto CONV_END;
|
|
conv_1234_xC32: as_u32(dst) = sx24((bswap_32(as_u32c(src)) >> 8) ^ 0x800000); goto CONV_END;
|
|
conv_1234_23Cx: as_u32(dst) = sx24s((as_u32c(src) ^ 0x80) << 8); goto CONV_END;
|
|
conv_1234_C321: as_u32(dst) = bswap_32(as_u32c(src) ^ 0x80); goto CONV_END;
|
|
conv_1234_123C: as_u32(dst) = as_u32c(src) ^ 0x80; goto CONV_END;
|
|
}
|
|
#endif
|
|
|
|
#ifdef GET16_LABELS
|
|
/* src_wid src_endswap sign_toggle */
|
|
static void *const get16_labels[4 * 2 * 2 + 4 * 3] = {
|
|
&&get16_1_10, /* 8h -> 16h */
|
|
&&get16_1_90, /* 8h ^> 16h */
|
|
&&get16_1_10, /* 8s -> 16h */
|
|
&&get16_1_90, /* 8s ^> 16h */
|
|
&&get16_12_12, /* 16h -> 16h */
|
|
&&get16_12_92, /* 16h ^> 16h */
|
|
&&get16_12_21, /* 16s -> 16h */
|
|
&&get16_12_A1, /* 16s ^> 16h */
|
|
&&get16_0123_12, /* 24h -> 16h */
|
|
&&get16_0123_92, /* 24h ^> 16h */
|
|
&&get16_1230_32, /* 24s -> 16h */
|
|
&&get16_1230_B2, /* 24s ^> 16h */
|
|
&&get16_1234_12, /* 32h -> 16h */
|
|
&&get16_1234_92, /* 32h ^> 16h */
|
|
&&get16_1234_43, /* 32s -> 16h */
|
|
&&get16_1234_C3, /* 32s ^> 16h */
|
|
/* 3bytes format */
|
|
&&get16_123_12, /* 24h -> 16h */
|
|
&&get16_123_92, /* 24h ^> 16h */
|
|
&&get16_123_32, /* 24s -> 16h */
|
|
&&get16_123_B2, /* 24s ^> 16h */
|
|
&&get16_123_12_20, /* 20h -> 16h */
|
|
&&get16_123_92_20, /* 20h ^> 16h */
|
|
&&get16_123_32_20, /* 20s -> 16h */
|
|
&&get16_123_B2_20, /* 20s ^> 16h */
|
|
&&get16_123_12_18, /* 18h -> 16h */
|
|
&&get16_123_92_18, /* 18h ^> 16h */
|
|
&&get16_123_32_18, /* 18s -> 16h */
|
|
&&get16_123_B2_18, /* 18s ^> 16h */
|
|
};
|
|
#endif
|
|
|
|
#ifdef GET16_END
|
|
while(0) {
|
|
get16_1_10: sample = (u_int16_t)as_u8c(src) << 8; goto GET16_END;
|
|
get16_1_90: sample = (u_int16_t)(as_u8c(src) ^ 0x80) << 8; goto GET16_END;
|
|
get16_12_12: sample = as_u16c(src); goto GET16_END;
|
|
get16_12_92: sample = as_u16c(src) ^ 0x8000; goto GET16_END;
|
|
get16_12_21: sample = bswap_16(as_u16c(src)); goto GET16_END;
|
|
get16_12_A1: sample = bswap_16(as_u16c(src) ^ 0x80); goto GET16_END;
|
|
get16_0123_12: sample = as_u32c(src) >> 8; goto GET16_END;
|
|
get16_0123_92: sample = (as_u32c(src) >> 8) ^ 0x8000; goto GET16_END;
|
|
get16_1230_32: sample = bswap_16(as_u32c(src) >> 8); goto GET16_END;
|
|
get16_1230_B2: sample = bswap_16((as_u32c(src) >> 8) ^ 0x80); goto GET16_END;
|
|
get16_1234_12: sample = as_u32c(src) >> 16; goto GET16_END;
|
|
get16_1234_92: sample = (as_u32c(src) >> 16) ^ 0x8000; goto GET16_END;
|
|
get16_1234_43: sample = bswap_16(as_u32c(src)); goto GET16_END;
|
|
get16_1234_C3: sample = bswap_16(as_u32c(src) ^ 0x80); goto GET16_END;
|
|
get16_123_12: sample = _get_triple(src) >> 8; goto GET16_END;
|
|
get16_123_92: sample = (_get_triple(src) >> 8) ^ 0x8000; goto GET16_END;
|
|
get16_123_32: sample = _get_triple_s(src) >> 8; goto GET16_END;
|
|
get16_123_B2: sample = (_get_triple_s(src) >> 8) ^ 0x8000; goto GET16_END;
|
|
get16_123_12_20: sample = _get_triple(src) >> 4; goto GET16_END;
|
|
get16_123_92_20: sample = (_get_triple(src) >> 4) ^ 0x8000; goto GET16_END;
|
|
get16_123_32_20: sample = _get_triple_s(src) >> 4; goto GET16_END;
|
|
get16_123_B2_20: sample = (_get_triple_s(src) >> 4) ^ 0x8000; goto GET16_END;
|
|
get16_123_12_18: sample = _get_triple(src) >> 2; goto GET16_END;
|
|
get16_123_92_18: sample = (_get_triple(src) >> 2) ^ 0x8000; goto GET16_END;
|
|
get16_123_32_18: sample = _get_triple_s(src) >> 2; goto GET16_END;
|
|
get16_123_B2_18: sample = (_get_triple_s(src) >> 2) ^ 0x8000; goto GET16_END;
|
|
}
|
|
#endif
|
|
|
|
#ifdef PUT16_LABELS
|
|
/* dst_wid dst_endswap sign_toggle */
|
|
static void *const put16_labels[4 * 2 * 2 + 4 * 3] = {
|
|
&&put16_12_1, /* 16h -> 8h */
|
|
&&put16_12_9, /* 16h ^> 8h */
|
|
&&put16_12_1, /* 16h -> 8s */
|
|
&&put16_12_9, /* 16h ^> 8s */
|
|
&&put16_12_12, /* 16h -> 16h */
|
|
&&put16_12_92, /* 16h ^> 16h */
|
|
&&put16_12_21, /* 16h -> 16s */
|
|
&&put16_12_29, /* 16h ^> 16s */
|
|
&&put16_12_0120, /* 16h -> 24h */
|
|
&&put16_12_0920, /* 16h ^> 24h */
|
|
&&put16_12_0210, /* 16h -> 24s */
|
|
&&put16_12_0290, /* 16h ^> 24s */
|
|
&&put16_12_1200, /* 16h -> 32h */
|
|
&&put16_12_9200, /* 16h ^> 32h */
|
|
&&put16_12_0021, /* 16h -> 32s */
|
|
&&put16_12_0029, /* 16h ^> 32s */
|
|
/* 3bytes format */
|
|
&&put16_12_120, /* 16h -> 24h */
|
|
&&put16_12_920, /* 16h ^> 24h */
|
|
&&put16_12_021, /* 16h -> 24s */
|
|
&&put16_12_029, /* 16h ^> 24s */
|
|
&&put16_12_120_20, /* 16h -> 20h */
|
|
&&put16_12_920_20, /* 16h ^> 20h */
|
|
&&put16_12_021_20, /* 16h -> 20s */
|
|
&&put16_12_029_20, /* 16h ^> 20s */
|
|
&&put16_12_120_18, /* 16h -> 18h */
|
|
&&put16_12_920_18, /* 16h ^> 18h */
|
|
&&put16_12_021_18, /* 16h -> 18s */
|
|
&&put16_12_029_18, /* 16h ^> 18s */
|
|
};
|
|
#endif
|
|
|
|
#ifdef PUT16_END
|
|
while (0) {
|
|
put16_12_1: as_u8(dst) = sample >> 8; goto PUT16_END;
|
|
put16_12_9: as_u8(dst) = (sample >> 8) ^ 0x80; goto PUT16_END;
|
|
put16_12_12: as_u16(dst) = sample; goto PUT16_END;
|
|
put16_12_92: as_u16(dst) = sample ^ 0x8000; goto PUT16_END;
|
|
put16_12_21: as_u16(dst) = bswap_16(sample); goto PUT16_END;
|
|
put16_12_29: as_u16(dst) = bswap_16(sample) ^ 0x80; goto PUT16_END;
|
|
put16_12_0120: as_u32(dst) = sx24((u_int32_t)sample << 8); goto PUT16_END;
|
|
put16_12_0920: as_u32(dst) = sx24((u_int32_t)(sample ^ 0x8000) << 8); goto PUT16_END;
|
|
put16_12_0210: as_u32(dst) = sx24s((u_int32_t)bswap_16(sample) << 8); goto PUT16_END;
|
|
put16_12_0290: as_u32(dst) = sx24s((u_int32_t)(bswap_16(sample) ^ 0x80) << 8); goto PUT16_END;
|
|
put16_12_1200: as_u32(dst) = (u_int32_t)sample << 16; goto PUT16_END;
|
|
put16_12_9200: as_u32(dst) = (u_int32_t)(sample ^ 0x8000) << 16; goto PUT16_END;
|
|
put16_12_0021: as_u32(dst) = (u_int32_t)bswap_16(sample); goto PUT16_END;
|
|
put16_12_0029: as_u32(dst) = (u_int32_t)bswap_16(sample) ^ 0x80; goto PUT16_END;
|
|
put16_12_120: _put_triple(dst, (u_int32_t)sample << 8); goto PUT16_END;
|
|
put16_12_920: _put_triple(dst, (u_int32_t)(sample ^ 0x8000) << 8); goto PUT16_END;
|
|
put16_12_021: _put_triple_s(dst, (u_int32_t)sample << 8); goto PUT16_END;
|
|
put16_12_029: _put_triple_s(dst, (u_int32_t)(sample ^ 0x8000) << 8); goto PUT16_END;
|
|
put16_12_120_20: _put_triple(dst, (u_int32_t)sample << 4); goto PUT16_END;
|
|
put16_12_920_20: _put_triple(dst, (u_int32_t)(sample ^ 0x8000) << 4); goto PUT16_END;
|
|
put16_12_021_20: _put_triple_s(dst, (u_int32_t)sample << 4); goto PUT16_END;
|
|
put16_12_029_20: _put_triple_s(dst, (u_int32_t)(sample ^ 0x8000) << 4); goto PUT16_END;
|
|
put16_12_120_18: _put_triple(dst, (u_int32_t)sample << 2); goto PUT16_END;
|
|
put16_12_920_18: _put_triple(dst, (u_int32_t)(sample ^ 0x8000) << 2); goto PUT16_END;
|
|
put16_12_021_18: _put_triple_s(dst, (u_int32_t)sample << 2); goto PUT16_END;
|
|
put16_12_029_18: _put_triple_s(dst, (u_int32_t)(sample ^ 0x8000) << 2); goto PUT16_END;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONV24_LABELS
|
|
#define GET32_LABELS
|
|
#define PUT32_LABELS
|
|
#endif
|
|
|
|
#ifdef GET32_LABELS
|
|
/* src_wid src_endswap sign_toggle */
|
|
static void *const get32_labels[4 * 2 * 2 + 4 * 3] = {
|
|
&&get32_1_1000, /* 8h -> 32h */
|
|
&&get32_1_9000, /* 8h ^> 32h */
|
|
&&get32_1_1000, /* 8s -> 32h */
|
|
&&get32_1_9000, /* 8s ^> 32h */
|
|
&&get32_12_1200, /* 16h -> 32h */
|
|
&&get32_12_9200, /* 16h ^> 32h */
|
|
&&get32_12_2100, /* 16s -> 32h */
|
|
&&get32_12_A100, /* 16s ^> 32h */
|
|
&&get32_0123_1230, /* 24h -> 32h */
|
|
&&get32_0123_9230, /* 24h ^> 32h */
|
|
&&get32_1230_3210, /* 24s -> 32h */
|
|
&&get32_1230_B210, /* 24s ^> 32h */
|
|
&&get32_1234_1234, /* 32h -> 32h */
|
|
&&get32_1234_9234, /* 32h ^> 32h */
|
|
&&get32_1234_4321, /* 32s -> 32h */
|
|
&&get32_1234_C321, /* 32s ^> 32h */
|
|
/* 3bytes format */
|
|
&&get32_123_1230, /* 24h -> 32h */
|
|
&&get32_123_9230, /* 24h ^> 32h */
|
|
&&get32_123_3210, /* 24s -> 32h */
|
|
&&get32_123_B210, /* 24s ^> 32h */
|
|
&&get32_123_1230_20, /* 20h -> 32h */
|
|
&&get32_123_9230_20, /* 20h ^> 32h */
|
|
&&get32_123_3210_20, /* 20s -> 32h */
|
|
&&get32_123_B210_20, /* 20s ^> 32h */
|
|
&&get32_123_1230_18, /* 18h -> 32h */
|
|
&&get32_123_9230_18, /* 18h ^> 32h */
|
|
&&get32_123_3210_18, /* 18s -> 32h */
|
|
&&get32_123_B210_18, /* 18s ^> 32h */
|
|
};
|
|
#endif
|
|
|
|
#ifdef CONV24_END
|
|
#define GET32_END __conv24_get
|
|
#endif
|
|
|
|
#ifdef GET32_END
|
|
while (0) {
|
|
get32_1_1000: sample = (u_int32_t)as_u8c(src) << 24; goto GET32_END;
|
|
get32_1_9000: sample = (u_int32_t)(as_u8c(src) ^ 0x80) << 24; goto GET32_END;
|
|
get32_12_1200: sample = (u_int32_t)as_u16c(src) << 16; goto GET32_END;
|
|
get32_12_9200: sample = (u_int32_t)(as_u16c(src) ^ 0x8000) << 16; goto GET32_END;
|
|
get32_12_2100: sample = (u_int32_t)bswap_16(as_u16c(src)) << 16; goto GET32_END;
|
|
get32_12_A100: sample = (u_int32_t)bswap_16(as_u16c(src) ^ 0x80) << 16; goto GET32_END;
|
|
get32_0123_1230: sample = as_u32c(src) << 8; goto GET32_END;
|
|
get32_0123_9230: sample = (as_u32c(src) << 8) ^ 0x80000000; goto GET32_END;
|
|
get32_1230_3210: sample = bswap_32(as_u32c(src) >> 8); goto GET32_END;
|
|
get32_1230_B210: sample = bswap_32((as_u32c(src) >> 8) ^ 0x80); goto GET32_END;
|
|
get32_1234_1234: sample = as_u32c(src); goto GET32_END;
|
|
get32_1234_9234: sample = as_u32c(src) ^ 0x80000000; goto GET32_END;
|
|
get32_1234_4321: sample = bswap_32(as_u32c(src)); goto GET32_END;
|
|
get32_1234_C321: sample = bswap_32(as_u32c(src) ^ 0x80); goto GET32_END;
|
|
get32_123_1230: sample = _get_triple(src) << 8; goto GET32_END;
|
|
get32_123_9230: sample = (_get_triple(src) << 8) ^ 0x80000000; goto GET32_END;
|
|
get32_123_3210: sample = _get_triple_s(src) << 8; goto GET32_END;
|
|
get32_123_B210: sample = (_get_triple_s(src) << 8) ^ 0x80000000; goto GET32_END;
|
|
get32_123_1230_20: sample = _get_triple(src) << 12; goto GET32_END;
|
|
get32_123_9230_20: sample = (_get_triple(src) << 12) ^ 0x80000000; goto GET32_END;
|
|
get32_123_3210_20: sample = _get_triple_s(src) << 12; goto GET32_END;
|
|
get32_123_B210_20: sample = (_get_triple_s(src) << 12) ^ 0x80000000; goto GET32_END;
|
|
get32_123_1230_18: sample = _get_triple(src) << 14; goto GET32_END;
|
|
get32_123_9230_18: sample = (_get_triple(src) << 14) ^ 0x80000000; goto GET32_END;
|
|
get32_123_3210_18: sample = _get_triple_s(src) << 14; goto GET32_END;
|
|
get32_123_B210_18: sample = (_get_triple_s(src) << 14) ^ 0x80000000; goto GET32_END;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONV24_END
|
|
__conv24_get: goto *put;
|
|
#define PUT32_END CONV24_END
|
|
#endif
|
|
|
|
#ifdef PUT32_LABELS
|
|
/* dst_wid dst_endswap sign_toggle */
|
|
static void *const put32_labels[4 * 2 * 2 + 4 * 3] = {
|
|
&&put32_1234_1, /* 32h -> 8h */
|
|
&&put32_1234_9, /* 32h ^> 8h */
|
|
&&put32_1234_1, /* 32h -> 8s */
|
|
&&put32_1234_9, /* 32h ^> 8s */
|
|
&&put32_1234_12, /* 32h -> 16h */
|
|
&&put32_1234_92, /* 32h ^> 16h */
|
|
&&put32_1234_21, /* 32h -> 16s */
|
|
&&put32_1234_29, /* 32h ^> 16s */
|
|
&&put32_1234_0123, /* 32h -> 24h */
|
|
&&put32_1234_0923, /* 32h ^> 24h */
|
|
&&put32_1234_3210, /* 32h -> 24s */
|
|
&&put32_1234_3290, /* 32h ^> 24s */
|
|
&&put32_1234_1234, /* 32h -> 32h */
|
|
&&put32_1234_9234, /* 32h ^> 32h */
|
|
&&put32_1234_4321, /* 32h -> 32s */
|
|
&&put32_1234_4329, /* 32h ^> 32s */
|
|
/* 3bytes format */
|
|
&&put32_1234_123, /* 32h -> 24h */
|
|
&&put32_1234_923, /* 32h ^> 24h */
|
|
&&put32_1234_321, /* 32h -> 24s */
|
|
&&put32_1234_329, /* 32h ^> 24s */
|
|
&&put32_1234_123_20, /* 32h -> 24h */
|
|
&&put32_1234_923_20, /* 32h ^> 24h */
|
|
&&put32_1234_321_20, /* 32h -> 24s */
|
|
&&put32_1234_329_20, /* 32h ^> 24s */
|
|
&&put32_1234_123_18, /* 32h -> 24h */
|
|
&&put32_1234_923_18, /* 32h ^> 24h */
|
|
&&put32_1234_321_18, /* 32h -> 24s */
|
|
&&put32_1234_329_18, /* 32h ^> 24s */
|
|
};
|
|
#endif
|
|
|
|
#ifdef CONV24_LABELS
|
|
#undef GET32_LABELS
|
|
#undef PUT32_LABELS
|
|
#endif
|
|
|
|
#ifdef PUT32_END
|
|
while (0) {
|
|
put32_1234_1: as_u8(dst) = sample >> 24; goto PUT32_END;
|
|
put32_1234_9: as_u8(dst) = (sample >> 24) ^ 0x80; goto PUT32_END;
|
|
put32_1234_12: as_u16(dst) = sample >> 16; goto PUT32_END;
|
|
put32_1234_92: as_u16(dst) = (sample >> 16) ^ 0x8000; goto PUT32_END;
|
|
put32_1234_21: as_u16(dst) = bswap_16(sample >> 16); goto PUT32_END;
|
|
put32_1234_29: as_u16(dst) = bswap_16(sample >> 16) ^ 0x80; goto PUT32_END;
|
|
put32_1234_0123: as_u32(dst) = sx24(sample >> 8); goto PUT32_END;
|
|
put32_1234_0923: as_u32(dst) = sx24((sample >> 8) ^ 0x800000); goto PUT32_END;
|
|
put32_1234_3210: as_u32(dst) = sx24s(bswap_32(sample) << 8); goto PUT32_END;
|
|
put32_1234_3290: as_u32(dst) = sx24s((bswap_32(sample) ^ 0x80) << 8); goto PUT32_END;
|
|
put32_1234_1234: as_u32(dst) = sample; goto PUT32_END;
|
|
put32_1234_9234: as_u32(dst) = sample ^ 0x80000000; goto PUT32_END;
|
|
put32_1234_4321: as_u32(dst) = bswap_32(sample); goto PUT32_END;
|
|
put32_1234_4329: as_u32(dst) = bswap_32(sample) ^ 0x80; goto PUT32_END;
|
|
put32_1234_123: _put_triple(dst, sample >> 8); goto PUT32_END;
|
|
put32_1234_923: _put_triple(dst, (sample ^ 0x80000000) >> 8); goto PUT32_END;
|
|
put32_1234_321: _put_triple_s(dst, sample >> 8); goto PUT32_END;
|
|
put32_1234_329: _put_triple_s(dst, (sample ^ 0x80000000) >> 8); goto PUT32_END;
|
|
put32_1234_123_20: _put_triple(dst, sample >> 12); goto PUT32_END;
|
|
put32_1234_923_20: _put_triple(dst, (sample ^ 0x80000000) >> 12); goto PUT32_END;
|
|
put32_1234_321_20: _put_triple_s(dst, sample >> 12); goto PUT32_END;
|
|
put32_1234_329_20: _put_triple_s(dst, (sample ^ 0x80000000) >> 12); goto PUT32_END;
|
|
put32_1234_123_18: _put_triple(dst, sample >> 14); goto PUT32_END;
|
|
put32_1234_923_18: _put_triple(dst, (sample ^ 0x80000000) >> 14); goto PUT32_END;
|
|
put32_1234_321_18: _put_triple_s(dst, sample >> 14); goto PUT32_END;
|
|
put32_1234_329_18: _put_triple_s(dst, (sample ^ 0x80000000) >> 14); goto PUT32_END;
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONV24_END
|
|
#undef GET32_END
|
|
#undef PUT32_END
|
|
#endif
|
|
|
|
#ifdef GETU_LABELS
|
|
/* width endswap sign_toggle */
|
|
static void *const getu_labels[4 * 2 * 2] = {
|
|
&&getu_1_1, /* 8h -> 8h */
|
|
&&getu_1_9, /* 8h ^> 8h */
|
|
&&getu_1_1, /* 8s -> 8h */
|
|
&&getu_1_9, /* 8s ^> 8h */
|
|
&&getu_12_12, /* 16h -> 16h */
|
|
&&getu_12_92, /* 16h ^> 16h */
|
|
&&getu_12_21, /* 16s -> 16h */
|
|
&&getu_12_A1, /* 16s ^> 16h */
|
|
&&getu_0123_0123, /* 24h -> 24h */
|
|
&&getu_0123_0923, /* 24h ^> 24h */
|
|
&&getu_1230_0321, /* 24s -> 24h */
|
|
&&getu_1230_0B21, /* 24s ^> 24h */
|
|
&&getu_1234_1234, /* 32h -> 32h */
|
|
&&getu_1234_9234, /* 32h ^> 32h */
|
|
&&getu_1234_4321, /* 32s -> 32h */
|
|
&&getu_1234_C321, /* 32s ^> 32h */
|
|
};
|
|
#endif
|
|
|
|
#ifdef GETU_END
|
|
while (0) {
|
|
getu_1_1: sample = as_u8c(src); goto GETU_END;
|
|
getu_1_9: sample = as_u8c(src) ^ 0x80; goto GETU_END;
|
|
getu_12_12: sample = as_u16c(src); goto GETU_END;
|
|
getu_12_92: sample = as_u16c(src) ^ 0x8000; goto GETU_END;
|
|
getu_12_21: sample = bswap_16(as_u16c(src)); goto GETU_END;
|
|
getu_12_A1: sample = bswap_16(as_u16c(src) ^ 0x80); goto GETU_END;
|
|
getu_0123_0123: sample = sx24(as_u32c(src)); goto GETU_END;
|
|
getu_0123_0923: sample = sx24(as_u32c(src) ^ 0x800000); goto GETU_END;
|
|
getu_1230_0321: sample = sx24(bswap_32(as_u32c(src))); goto GETU_END;
|
|
getu_1230_0B21: sample = sx24(bswap_32(as_u32c(src) ^ 0x8000)); goto GETU_END;
|
|
getu_1234_1234: sample = as_u32c(src); goto GETU_END;
|
|
getu_1234_9234: sample = as_u32c(src) ^ 0x80000000; goto GETU_END;
|
|
getu_1234_4321: sample = bswap_32(as_u32c(src)); goto GETU_END;
|
|
getu_1234_C321: sample = bswap_32(as_u32c(src) ^ 0x80); goto GETU_END;
|
|
}
|
|
#endif
|
|
|
|
#ifdef PUT32F_LABELS
|
|
/* type (0 = float, 1 = float64), endswap */
|
|
static void *const put32float_labels[2 * 2] = {
|
|
&&put32f_1234_1234F, /* 32h -> (float)h */
|
|
&&put32f_1234_4321F, /* 32h -> (float)s */
|
|
&&put32f_1234_1234D, /* 32h -> (float64)h */
|
|
&&put32f_1234_4321D, /* 32h -> (float64)s */
|
|
};
|
|
#endif
|
|
|
|
#ifdef PUT32F_END
|
|
put32f_1234_1234F: as_float(dst) = (float_t)((int32_t)sample) / (float_t)0x80000000UL; goto PUT32F_END;
|
|
put32f_1234_4321F: tmp_float.f = (float_t)((int32_t)sample) / (float_t)0x80000000UL;
|
|
as_u32(dst) = bswap_32(tmp_float.i); goto PUT32F_END;
|
|
put32f_1234_1234D: as_double(dst) = (double_t)((int32_t)sample) / (double_t)0x80000000UL; goto PUT32F_END;
|
|
put32f_1234_4321D: tmp_double.d = (double_t)((int32_t)sample) / (double_t)0x80000000UL;
|
|
as_u64(dst) = bswap_64(tmp_double.l); goto PUT32F_END;
|
|
#endif
|
|
|
|
#ifdef GET32F_LABELS
|
|
/* type (0 = float, 1 = float64), endswap */
|
|
static void *const get32float_labels[2 * 2] = {
|
|
&&get32f_1234F_1234, /* (float)h -> 32h */
|
|
&&get32f_4321F_1234, /* (float)s -> 32h */
|
|
&&get32f_1234D_1234, /* (float64)h -> 32h */
|
|
&&get32f_4321D_1234, /* (float64)s -> 32h */
|
|
};
|
|
#endif
|
|
|
|
#ifdef GET32F_END
|
|
get32f_1234F_1234: tmp_float.f = as_floatc(src);
|
|
if (tmp_float.f >= 1.0)
|
|
sample = 0x7fffffff;
|
|
else if (tmp_float.f <= -1.0)
|
|
sample = 0x80000000;
|
|
else
|
|
sample = (int32_t)(tmp_float.f * (float_t)0x80000000UL);
|
|
goto GET32F_END;
|
|
get32f_4321F_1234: tmp_float.i = bswap_32(as_u32c(src));
|
|
if (tmp_float.f >= 1.0)
|
|
sample = 0x7fffffff;
|
|
else if (tmp_float.f <= -1.0)
|
|
sample = 0x80000000;
|
|
else
|
|
sample = (int32_t)(tmp_float.f * (float_t)0x80000000UL);
|
|
goto GET32F_END;
|
|
get32f_1234D_1234: tmp_double.d = as_doublec(src);
|
|
if (tmp_double.d >= 1.0)
|
|
sample = 0x7fffffff;
|
|
else if (tmp_double.d <= -1.0)
|
|
sample = 0x80000000;
|
|
else
|
|
sample = (int32_t)(tmp_double.d * (double_t)0x80000000UL);
|
|
goto GET32F_END;
|
|
get32f_4321D_1234: tmp_double.l = bswap_64(as_u64c(src));
|
|
if (tmp_double.d >= 1.0)
|
|
sample = 0x7fffffff;
|
|
else if (tmp_double.d <= -1.0)
|
|
sample = 0x80000000;
|
|
else
|
|
sample = (int32_t)(tmp_double.d * (double_t)0x80000000UL);
|
|
goto GET32F_END;
|
|
#endif
|
|
|
|
#ifdef NORMS_LABELS
|
|
static inline void _norms(const void *src, void *dst,
|
|
int src_wid,
|
|
int dst_sign, int dst_wid, int dst_end)
|
|
{
|
|
int32_t s;
|
|
switch (src_wid) {
|
|
case 8:
|
|
s = *(int32_t*)src;
|
|
if (s >= 0x7f)
|
|
goto _max;
|
|
else if (s <= -0x80)
|
|
goto _min;
|
|
break;
|
|
case 16:
|
|
s = *(int32_t*)src;
|
|
if (s >= 0x7fff)
|
|
goto _max;
|
|
else if (s <= -0x8000)
|
|
goto _min;
|
|
break;
|
|
case 24:
|
|
s = *(int32_t*)src;
|
|
if (s >= 0x7fffff)
|
|
goto _max;
|
|
else if (s <= -0x800000)
|
|
goto _min;
|
|
break;
|
|
case 32:
|
|
{
|
|
int64_t s64;
|
|
s64 = *(int64_t*)src;
|
|
if (s64 >= 0x7fffffff)
|
|
goto _max;
|
|
else if (s64 <= -0x80000000)
|
|
goto _min;
|
|
s = s64;
|
|
break;
|
|
}
|
|
default:
|
|
assert(0);
|
|
return;
|
|
}
|
|
if (src_wid < dst_wid) {
|
|
unsigned int bits = dst_wid - src_wid;
|
|
s *= 1 << bits;
|
|
} else if (src_wid > dst_wid) {
|
|
unsigned int bits = src_wid - dst_wid;
|
|
s = (s + (1 << (bits - 1))) / (1 << bits);
|
|
}
|
|
if (!dst_sign)
|
|
s += (1U << (dst_wid - 1));
|
|
switch (dst_wid) {
|
|
case 8:
|
|
*(u_int8_t*)dst = s;
|
|
break;
|
|
case 16:
|
|
if (dst_end)
|
|
s = bswap_16(s);
|
|
*(u_int16_t*)dst = s;
|
|
break;
|
|
case 24:
|
|
case 32:
|
|
if (dst_end)
|
|
s = bswap_32(s);
|
|
*(u_int32_t*)dst = s;
|
|
break;
|
|
}
|
|
return;
|
|
|
|
_min:
|
|
switch (dst_wid) {
|
|
case 8:
|
|
if (dst_sign)
|
|
*(u_int8_t*)dst = 0x80;
|
|
else
|
|
*(u_int8_t*)dst = 0;
|
|
break;
|
|
case 16:
|
|
if (dst_sign)
|
|
*(u_int16_t*)dst = dst_end ? 0x0080 : 0x8000;
|
|
else
|
|
*(u_int16_t*)dst = 0;
|
|
break;
|
|
case 24:
|
|
if (dst_sign)
|
|
*(u_int32_t*)dst = dst_end ? 0x00008000 : 0x00800000;
|
|
else
|
|
*(u_int32_t*)dst = 0;
|
|
break;
|
|
case 32:
|
|
if (dst_sign)
|
|
*(u_int32_t*)dst = dst_end ? 0x00000080 : 0x80000000;
|
|
else
|
|
*(u_int32_t*)dst = 0;
|
|
break;
|
|
default:
|
|
assert(0);
|
|
break;
|
|
}
|
|
return;
|
|
|
|
_max:
|
|
switch (dst_wid) {
|
|
case 8:
|
|
if (dst_sign)
|
|
*(u_int8_t*)dst = 0x7f;
|
|
else
|
|
*(u_int8_t*)dst = 0xff;
|
|
break;
|
|
case 16:
|
|
if (dst_sign)
|
|
*(u_int16_t*)dst = dst_end ? 0xff7f : 0x7fff;
|
|
else
|
|
*(u_int16_t*)dst = 0;
|
|
break;
|
|
case 24:
|
|
if (dst_sign)
|
|
*(u_int32_t*)dst = dst_end ? 0xffff7f00 : 0x007fffff;
|
|
else
|
|
*(u_int32_t*)dst = 0;
|
|
break;
|
|
case 32:
|
|
if (dst_sign)
|
|
*(u_int32_t*)dst = dst_end ? 0xffffff7f : 0x7fffffff;
|
|
else
|
|
*(u_int32_t*)dst = 0;
|
|
break;
|
|
default:
|
|
assert(0);
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
|
|
/* src_wid dst_sign dst_wid dst_end */
|
|
static void *const norms_labels[4 * 2 * 4 * 2] = {
|
|
&&norms_8_u8, /* s8 -> u8 */
|
|
&&norms_8_u8, /* s8 -> u8 */
|
|
&&norms_8_u16h, /* s8 -> u16h */
|
|
&&norms_8_u16s, /* s8 -> u16s */
|
|
&&norms_8_u24h, /* s8 -> u24h */
|
|
&&norms_8_u24s, /* s8 -> u24s */
|
|
&&norms_8_u32h, /* s8 -> u32h */
|
|
&&norms_8_u32s, /* s8 -> u32s */
|
|
&&norms_8_s8, /* s8 -> s8 */
|
|
&&norms_8_s8, /* s8 -> s8 */
|
|
&&norms_8_s16h, /* s8 -> s16h */
|
|
&&norms_8_s16s, /* s8 -> s16s */
|
|
&&norms_8_s24h, /* s8 -> s24h */
|
|
&&norms_8_s24s, /* s8 -> s24s */
|
|
&&norms_8_s32h, /* s8 -> s32h */
|
|
&&norms_8_s32s, /* s8 -> s32s */
|
|
&&norms_16_u8, /* s16 -> u8 */
|
|
&&norms_16_u8, /* s16 -> u8 */
|
|
&&norms_16_u16h, /* s16 -> u16h */
|
|
&&norms_16_u16s, /* s16 -> u16s */
|
|
&&norms_16_u24h, /* s16 -> u24h */
|
|
&&norms_16_u24s, /* s16 -> u24s */
|
|
&&norms_16_u32h, /* s16 -> u32h */
|
|
&&norms_16_u32s, /* s16 -> u32s */
|
|
&&norms_16_s8, /* s16 -> s8 h*/
|
|
&&norms_16_s8, /* s16 -> s8 */
|
|
&&norms_16_s16h, /* s16 -> s16h */
|
|
&&norms_16_s16s, /* s16 -> s16s */
|
|
&&norms_16_s24h, /* s16 -> s24h */
|
|
&&norms_16_s24s, /* s16 -> s24s */
|
|
&&norms_16_s32h, /* s16 -> s32h */
|
|
&&norms_16_s32s, /* s16 -> s32s */
|
|
&&norms_24_u8, /* s24 -> u8 */
|
|
&&norms_24_u8, /* s24 -> u8 */
|
|
&&norms_24_u16h, /* s24 -> u16h */
|
|
&&norms_24_u16s, /* s24 -> u16s */
|
|
&&norms_24_u24h, /* s24 -> u24h */
|
|
&&norms_24_u24s, /* s24 -> u24s */
|
|
&&norms_24_u32h, /* s24 -> u32h */
|
|
&&norms_24_u32s, /* s24 -> u32s */
|
|
&&norms_24_s8, /* s24 -> s8 */
|
|
&&norms_24_s8, /* s24 -> s8 */
|
|
&&norms_24_s16h, /* s24 -> s16h */
|
|
&&norms_24_s16s, /* s24 -> s16s */
|
|
&&norms_24_s24h, /* s24 -> s24h */
|
|
&&norms_24_s24s, /* s24 -> s24s */
|
|
&&norms_24_s32h, /* s24 -> s32h */
|
|
&&norms_24_s32s, /* s24 -> s32s */
|
|
&&norms_32_u8, /* s32 -> u8 */
|
|
&&norms_32_u8, /* s32 -> u8 */
|
|
&&norms_32_u16h, /* s32 -> u16h */
|
|
&&norms_32_u16s, /* s32 -> u16s */
|
|
&&norms_32_u24h, /* s32 -> u24h */
|
|
&&norms_32_u24s, /* s32 -> u24s */
|
|
&&norms_32_u32h, /* s32 -> u32h */
|
|
&&norms_32_u32s, /* s32 -> u32s */
|
|
&&norms_32_s8, /* s32 -> s8 */
|
|
&&norms_32_s8, /* s32 -> s8 */
|
|
&&norms_32_s16h, /* s32 -> s16h */
|
|
&&norms_32_s16s, /* s32 -> s16s */
|
|
&&norms_32_s24h, /* s32 -> s24h */
|
|
&&norms_32_s24s, /* s32 -> s24s */
|
|
&&norms_32_s32h, /* s32 -> s32h */
|
|
&&norms_32_s32s, /* s32 -> s32s */
|
|
};
|
|
#endif
|
|
|
|
#ifdef NORMS_END
|
|
norms_8_u8: _norms(src, dst, 8, 0, 8, 0); goto NORMS_END;
|
|
norms_8_u16h: _norms(src, dst, 8, 0, 16, 0); goto NORMS_END;
|
|
norms_8_u16s: _norms(src, dst, 8, 0, 16, 1); goto NORMS_END;
|
|
norms_8_u24h: _norms(src, dst, 8, 0, 24, 0); goto NORMS_END;
|
|
norms_8_u24s: _norms(src, dst, 8, 0, 24, 1); goto NORMS_END;
|
|
norms_8_u32h: _norms(src, dst, 8, 0, 32, 0); goto NORMS_END;
|
|
norms_8_u32s: _norms(src, dst, 8, 0, 32, 1); goto NORMS_END;
|
|
norms_8_s8: _norms(src, dst, 8, 1, 8, 0); goto NORMS_END;
|
|
norms_8_s16h: _norms(src, dst, 8, 1, 16, 0); goto NORMS_END;
|
|
norms_8_s16s: _norms(src, dst, 8, 1, 16, 1); goto NORMS_END;
|
|
norms_8_s24h: _norms(src, dst, 8, 1, 24, 0); goto NORMS_END;
|
|
norms_8_s24s: _norms(src, dst, 8, 1, 24, 1); goto NORMS_END;
|
|
norms_8_s32h: _norms(src, dst, 8, 1, 32, 0); goto NORMS_END;
|
|
norms_8_s32s: _norms(src, dst, 8, 1, 32, 1); goto NORMS_END;
|
|
norms_16_u8: _norms(src, dst, 16, 0, 8, 0); goto NORMS_END;
|
|
norms_16_u16h: _norms(src, dst, 16, 0, 16, 0); goto NORMS_END;
|
|
norms_16_u16s: _norms(src, dst, 16, 0, 16, 1); goto NORMS_END;
|
|
norms_16_u24h: _norms(src, dst, 16, 0, 24, 0); goto NORMS_END;
|
|
norms_16_u24s: _norms(src, dst, 16, 0, 24, 1); goto NORMS_END;
|
|
norms_16_u32h: _norms(src, dst, 16, 0, 32, 0); goto NORMS_END;
|
|
norms_16_u32s: _norms(src, dst, 16, 0, 32, 1); goto NORMS_END;
|
|
norms_16_s8: _norms(src, dst, 16, 1, 8, 0); goto NORMS_END;
|
|
norms_16_s16h: _norms(src, dst, 16, 1, 16, 0); goto NORMS_END;
|
|
norms_16_s16s: _norms(src, dst, 16, 1, 16, 1); goto NORMS_END;
|
|
norms_16_s24h: _norms(src, dst, 16, 1, 24, 0); goto NORMS_END;
|
|
norms_16_s24s: _norms(src, dst, 16, 1, 24, 1); goto NORMS_END;
|
|
norms_16_s32h: _norms(src, dst, 16, 1, 32, 0); goto NORMS_END;
|
|
norms_16_s32s: _norms(src, dst, 16, 1, 32, 1); goto NORMS_END;
|
|
norms_24_u8: _norms(src, dst, 24, 0, 8, 0); goto NORMS_END;
|
|
norms_24_u16h: _norms(src, dst, 24, 0, 16, 0); goto NORMS_END;
|
|
norms_24_u16s: _norms(src, dst, 24, 0, 16, 1); goto NORMS_END;
|
|
norms_24_u24h: _norms(src, dst, 24, 0, 24, 0); goto NORMS_END;
|
|
norms_24_u24s: _norms(src, dst, 24, 0, 24, 1); goto NORMS_END;
|
|
norms_24_u32h: _norms(src, dst, 24, 0, 32, 0); goto NORMS_END;
|
|
norms_24_u32s: _norms(src, dst, 24, 0, 32, 1); goto NORMS_END;
|
|
norms_24_s8: _norms(src, dst, 24, 1, 8, 0); goto NORMS_END;
|
|
norms_24_s16h: _norms(src, dst, 24, 1, 16, 0); goto NORMS_END;
|
|
norms_24_s16s: _norms(src, dst, 24, 1, 16, 1); goto NORMS_END;
|
|
norms_24_s24h: _norms(src, dst, 24, 1, 24, 0); goto NORMS_END;
|
|
norms_24_s24s: _norms(src, dst, 24, 1, 24, 1); goto NORMS_END;
|
|
norms_24_s32h: _norms(src, dst, 24, 1, 32, 0); goto NORMS_END;
|
|
norms_24_s32s: _norms(src, dst, 24, 1, 32, 1); goto NORMS_END;
|
|
norms_32_u8: _norms(src, dst, 32, 0, 8, 0); goto NORMS_END;
|
|
norms_32_u16h: _norms(src, dst, 32, 0, 16, 0); goto NORMS_END;
|
|
norms_32_u16s: _norms(src, dst, 32, 0, 16, 1); goto NORMS_END;
|
|
norms_32_u24h: _norms(src, dst, 32, 0, 24, 0); goto NORMS_END;
|
|
norms_32_u24s: _norms(src, dst, 32, 0, 24, 1); goto NORMS_END;
|
|
norms_32_u32h: _norms(src, dst, 32, 0, 32, 0); goto NORMS_END;
|
|
norms_32_u32s: _norms(src, dst, 32, 0, 32, 1); goto NORMS_END;
|
|
norms_32_s8: _norms(src, dst, 32, 1, 8, 0); goto NORMS_END;
|
|
norms_32_s16h: _norms(src, dst, 32, 1, 16, 0); goto NORMS_END;
|
|
norms_32_s16s: _norms(src, dst, 32, 1, 16, 1); goto NORMS_END;
|
|
norms_32_s24h: _norms(src, dst, 32, 1, 24, 0); goto NORMS_END;
|
|
norms_32_s24s: _norms(src, dst, 32, 1, 24, 1); goto NORMS_END;
|
|
norms_32_s32h: _norms(src, dst, 32, 1, 32, 0); goto NORMS_END;
|
|
norms_32_s32s: _norms(src, dst, 32, 1, 32, 1); goto NORMS_END;
|
|
#endif
|
|
|
|
|
|
#undef as_u8
|
|
#undef as_u16
|
|
#undef as_u32
|
|
#undef as_s8
|
|
#undef as_s16
|
|
#undef as_s32
|
|
#undef as_float
|
|
#undef as_double
|
|
|
|
#undef as_u8c
|
|
#undef as_u16c
|
|
#undef as_u32c
|
|
#undef as_s8c
|
|
#undef as_s16c
|
|
#undef as_s32c
|
|
#undef as_floatc
|
|
#undef as_doublec
|
|
|
|
#undef _get_triple
|
|
#undef _get_triple_s
|
|
#undef _get_triple_le
|
|
#undef _get_triple_be
|
|
#undef _put_triple
|
|
#undef _put_triple_s
|
|
#undef _put_triple_le
|
|
#undef _put_triple_be
|
|
|