From 33cc8c8e77a2282c11601a8a1e14fb2e856af0dc Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Fri, 31 May 2019 17:47:08 -0700 Subject: [PATCH] Use switch statements instead of labels as values --- src/pcm/pcm_adpcm.c | 20 +- src/pcm/pcm_alaw.c | 20 +- src/pcm/pcm_iec958.c | 22 +- src/pcm/pcm_lfloat.c | 42 +- src/pcm/pcm_linear.c | 22 +- src/pcm/pcm_mulaw.c | 20 +- src/pcm/pcm_rate_linear.c | 42 +- src/pcm/pcm_route.c | 163 +++---- src/pcm/plugin_ops.h | 937 ++++++++++++++------------------------ 9 files changed, 412 insertions(+), 876 deletions(-) diff --git a/src/pcm/pcm_adpcm.c b/src/pcm/pcm_adpcm.c index fd9b9e8e..d4546cd0 100644 --- a/src/pcm/pcm_adpcm.c +++ b/src/pcm/pcm_adpcm.c @@ -220,10 +220,6 @@ void snd_pcm_adpcm_decode(const snd_pcm_channel_area_t *dst_areas, unsigned int putidx, snd_pcm_adpcm_state_t *states) { -#define PUT16_LABELS -#include "plugin_ops.h" -#undef PUT16_LABELS - void *put = put16_labels[putidx]; unsigned int channel; for (channel = 0; channel < channels; ++channel, ++states) { const char *src; @@ -249,11 +245,7 @@ void snd_pcm_adpcm_decode(const snd_pcm_channel_area_t *dst_areas, else v = (*src >> 4) & 0x0f; sample = adpcm_decoder(v, states); - goto *put; -#define PUT16_END after -#include "plugin_ops.h" -#undef PUT16_END - after: + put16(dst, sample, putidx); src += src_step; srcbit += srcbit_step; if (srcbit == 8) { @@ -273,10 +265,6 @@ void snd_pcm_adpcm_encode(const snd_pcm_channel_area_t *dst_areas, unsigned int getidx, snd_pcm_adpcm_state_t *states) { -#define GET16_LABELS -#include "plugin_ops.h" -#undef GET16_LABELS - void *get = get16_labels[getidx]; unsigned int channel; int16_t sample = 0; for (channel = 0; channel < channels; ++channel, ++states) { @@ -297,11 +285,7 @@ void snd_pcm_adpcm_encode(const snd_pcm_channel_area_t *dst_areas, frames1 = frames; while (frames1-- > 0) { int v; - goto *get; -#define GET16_END after -#include "plugin_ops.h" -#undef GET16_END - after: + sample = get16(src, getidx); v = adpcm_encoder(sample, states); if (dstbit) *dst = (*dst & 0xf0) | v; diff --git a/src/pcm/pcm_alaw.c b/src/pcm/pcm_alaw.c index 0a889183..f24e6351 100644 --- a/src/pcm/pcm_alaw.c +++ b/src/pcm/pcm_alaw.c @@ -148,10 +148,6 @@ void snd_pcm_alaw_decode(const snd_pcm_channel_area_t *dst_areas, unsigned int channels, snd_pcm_uframes_t frames, unsigned int putidx) { -#define PUT16_LABELS -#include "plugin_ops.h" -#undef PUT16_LABELS - void *put = put16_labels[putidx]; unsigned int channel; for (channel = 0; channel < channels; ++channel) { const unsigned char *src; @@ -167,11 +163,7 @@ void snd_pcm_alaw_decode(const snd_pcm_channel_area_t *dst_areas, frames1 = frames; while (frames1-- > 0) { int16_t sample = alaw_to_s16(*src); - goto *put; -#define PUT16_END after -#include "plugin_ops.h" -#undef PUT16_END - after: + put16(dst, sample, putidx); src += src_step; dst += dst_step; } @@ -185,10 +177,6 @@ void snd_pcm_alaw_encode(const snd_pcm_channel_area_t *dst_areas, unsigned int channels, snd_pcm_uframes_t frames, unsigned int getidx) { -#define GET16_LABELS -#include "plugin_ops.h" -#undef GET16_LABELS - void *get = get16_labels[getidx]; unsigned int channel; int16_t sample = 0; for (channel = 0; channel < channels; ++channel) { @@ -204,11 +192,7 @@ void snd_pcm_alaw_encode(const snd_pcm_channel_area_t *dst_areas, dst_step = snd_pcm_channel_area_step(dst_area); frames1 = frames; while (frames1-- > 0) { - goto *get; -#define GET16_END after -#include "plugin_ops.h" -#undef GET16_END - after: + sample = get16(src, getidx); *dst = s16_to_alaw(sample); src += src_step; dst += dst_step; diff --git a/src/pcm/pcm_iec958.c b/src/pcm/pcm_iec958.c index 1afe7393..8f1cd9e9 100644 --- a/src/pcm/pcm_iec958.c +++ b/src/pcm/pcm_iec958.c @@ -149,11 +149,8 @@ static void snd_pcm_iec958_decode(snd_pcm_iec958_t *iec, snd_pcm_uframes_t src_offset, unsigned int channels, snd_pcm_uframes_t frames) { -#define PUT32_LABELS -#include "plugin_ops.h" -#undef PUT32_LABELS - void *put = put32_labels[iec->getput_idx]; unsigned int channel; + unsigned int idx = iec->getput_idx; for (channel = 0; channel < channels; ++channel) { const uint32_t *src; char *dst; @@ -168,11 +165,7 @@ static void snd_pcm_iec958_decode(snd_pcm_iec958_t *iec, frames1 = frames; while (frames1-- > 0) { int32_t sample = iec958_to_s32(iec, *src); - goto *put; -#define PUT32_END after -#include "plugin_ops.h" -#undef PUT32_END - after: + put32(dst, sample, idx); src += src_step; dst += dst_step; } @@ -186,10 +179,6 @@ static void snd_pcm_iec958_encode(snd_pcm_iec958_t *iec, snd_pcm_uframes_t src_offset, unsigned int channels, snd_pcm_uframes_t frames) { -#define GET32_LABELS -#include "plugin_ops.h" -#undef GET32_LABELS - void *get = get32_labels[iec->getput_idx]; unsigned int channel; int32_t sample = 0; int counter = iec->counter; @@ -197,6 +186,7 @@ static void snd_pcm_iec958_encode(snd_pcm_iec958_t *iec, (iec->status[0] & IEC958_AES0_NONAUDIO) && (channels == 8); int counter_step = single_stream ? ((channels + 1) >> 1) : 1; + unsigned int idx = iec->getput_idx; for (channel = 0; channel < channels; ++channel) { const char *src; uint32_t *dst; @@ -216,11 +206,7 @@ static void snd_pcm_iec958_encode(snd_pcm_iec958_t *iec, iec->counter = counter; while (frames1-- > 0) { - goto *get; -#define GET32_END after -#include "plugin_ops.h" -#undef GET32_END - after: + sample = get32(src, idx); sample = iec958_subframe(iec, sample, channel); // fprintf(stderr, "%d:%08x\n", frames1, sample); *dst = sample; diff --git a/src/pcm/pcm_lfloat.c b/src/pcm/pcm_lfloat.c index 7785e4b9..c2e07a57 100644 --- a/src/pcm/pcm_lfloat.c +++ b/src/pcm/pcm_lfloat.c @@ -97,13 +97,6 @@ void snd_pcm_lfloat_convert_integer_float(const snd_pcm_channel_area_t *dst_area unsigned int channels, snd_pcm_uframes_t frames, unsigned int get32idx, unsigned int put32floatidx) { -#define GET32_LABELS -#define PUT32F_LABELS -#include "plugin_ops.h" -#undef PUT32F_LABELS -#undef GET32_LABELS - void *get32 = get32_labels[get32idx]; - void *put32float = put32float_labels[put32floatidx]; unsigned int channel; for (channel = 0; channel < channels; ++channel) { const char *src; @@ -111,8 +104,6 @@ void snd_pcm_lfloat_convert_integer_float(const snd_pcm_channel_area_t *dst_area int src_step, dst_step; snd_pcm_uframes_t frames1; int32_t sample = 0; - snd_tmp_float_t tmp_float; - snd_tmp_double_t tmp_double; const snd_pcm_channel_area_t *src_area = &src_areas[channel]; const snd_pcm_channel_area_t *dst_area = &dst_areas[channel]; src = snd_pcm_channel_area_addr(src_area, src_offset); @@ -121,16 +112,8 @@ void snd_pcm_lfloat_convert_integer_float(const snd_pcm_channel_area_t *dst_area dst_step = snd_pcm_channel_area_step(dst_area); frames1 = frames; while (frames1-- > 0) { - goto *get32; -#define GET32_END sample_loaded -#include "plugin_ops.h" -#undef GET32_END - sample_loaded: - goto *put32float; -#define PUT32F_END sample_put -#include "plugin_ops.h" -#undef PUT32F_END - sample_put: + sample = get32(src, get32idx); + put32float(dst, sample, put32floatidx); src += src_step; dst += dst_step; } @@ -142,13 +125,6 @@ void snd_pcm_lfloat_convert_float_integer(const snd_pcm_channel_area_t *dst_area unsigned int channels, snd_pcm_uframes_t frames, unsigned int put32idx, unsigned int get32floatidx) { -#define PUT32_LABELS -#define GET32F_LABELS -#include "plugin_ops.h" -#undef GET32F_LABELS -#undef PUT32_LABELS - void *put32 = put32_labels[put32idx]; - void *get32float = get32float_labels[get32floatidx]; unsigned int channel; for (channel = 0; channel < channels; ++channel) { const char *src; @@ -156,8 +132,6 @@ void snd_pcm_lfloat_convert_float_integer(const snd_pcm_channel_area_t *dst_area int src_step, dst_step; snd_pcm_uframes_t frames1; int32_t sample = 0; - snd_tmp_float_t tmp_float; - snd_tmp_double_t tmp_double; const snd_pcm_channel_area_t *src_area = &src_areas[channel]; const snd_pcm_channel_area_t *dst_area = &dst_areas[channel]; src = snd_pcm_channel_area_addr(src_area, src_offset); @@ -166,16 +140,8 @@ void snd_pcm_lfloat_convert_float_integer(const snd_pcm_channel_area_t *dst_area dst_step = snd_pcm_channel_area_step(dst_area); frames1 = frames; while (frames1-- > 0) { - goto *get32float; -#define GET32F_END sample_loaded -#include "plugin_ops.h" -#undef GET32F_END - sample_loaded: - goto *put32; -#define PUT32_END sample_put -#include "plugin_ops.h" -#undef PUT32_END - sample_put: + sample = get32float(src, get32floatidx); + put32(dst, sample, put32idx); src += src_step; dst += dst_step; } diff --git a/src/pcm/pcm_linear.c b/src/pcm/pcm_linear.c index c95d1b95..bc8c7aa8 100644 --- a/src/pcm/pcm_linear.c +++ b/src/pcm/pcm_linear.c @@ -148,10 +148,6 @@ void snd_pcm_linear_convert(const snd_pcm_channel_area_t *dst_areas, snd_pcm_ufr unsigned int channels, snd_pcm_uframes_t frames, unsigned int convidx) { -#define CONV_LABELS -#include "plugin_ops.h" -#undef CONV_LABELS - void *conv = conv_labels[convidx]; unsigned int channel; for (channel = 0; channel < channels; ++channel) { const char *src; @@ -166,11 +162,7 @@ void snd_pcm_linear_convert(const snd_pcm_channel_area_t *dst_areas, snd_pcm_ufr dst_step = snd_pcm_channel_area_step(dst_area); frames1 = frames; while (frames1-- > 0) { - goto *conv; -#define CONV_END after -#include "plugin_ops.h" -#undef CONV_END - after: + conv(dst, src, convidx); src += src_step; dst += dst_step; } @@ -182,11 +174,6 @@ void snd_pcm_linear_getput(const snd_pcm_channel_area_t *dst_areas, snd_pcm_ufra unsigned int channels, snd_pcm_uframes_t frames, unsigned int get_idx, unsigned int put_idx) { -#define CONV24_LABELS -#include "plugin_ops.h" -#undef CONV24_LABELS - void *get = get32_labels[get_idx]; - void *put = put32_labels[put_idx]; unsigned int channel; uint32_t sample = 0; for (channel = 0; channel < channels; ++channel) { @@ -202,11 +189,8 @@ void snd_pcm_linear_getput(const snd_pcm_channel_area_t *dst_areas, snd_pcm_ufra dst_step = snd_pcm_channel_area_step(dst_area); frames1 = frames; while (frames1-- > 0) { - goto *get; -#define CONV24_END after -#include "plugin_ops.h" -#undef CONV24_END - after: + sample = get32(src, get_idx); + put32(dst, sample, put_idx); src += src_step; dst += dst_step; } diff --git a/src/pcm/pcm_mulaw.c b/src/pcm/pcm_mulaw.c index 587fa54e..97dae154 100644 --- a/src/pcm/pcm_mulaw.c +++ b/src/pcm/pcm_mulaw.c @@ -164,10 +164,6 @@ void snd_pcm_mulaw_decode(const snd_pcm_channel_area_t *dst_areas, unsigned int channels, snd_pcm_uframes_t frames, unsigned int putidx) { -#define PUT16_LABELS -#include "plugin_ops.h" -#undef PUT16_LABELS - void *put = put16_labels[putidx]; unsigned int channel; for (channel = 0; channel < channels; ++channel) { const unsigned char *src; @@ -183,11 +179,7 @@ void snd_pcm_mulaw_decode(const snd_pcm_channel_area_t *dst_areas, frames1 = frames; while (frames1-- > 0) { int16_t sample = ulaw_to_s16(*src); - goto *put; -#define PUT16_END after -#include "plugin_ops.h" -#undef PUT16_END - after: + put16(dst, sample, putidx); src += src_step; dst += dst_step; } @@ -201,10 +193,6 @@ void snd_pcm_mulaw_encode(const snd_pcm_channel_area_t *dst_areas, unsigned int channels, snd_pcm_uframes_t frames, unsigned int getidx) { -#define GET16_LABELS -#include "plugin_ops.h" -#undef GET16_LABELS - void *get = get16_labels[getidx]; unsigned int channel; int16_t sample = 0; for (channel = 0; channel < channels; ++channel) { @@ -220,11 +208,7 @@ void snd_pcm_mulaw_encode(const snd_pcm_channel_area_t *dst_areas, dst_step = snd_pcm_channel_area_step(dst_area); frames1 = frames; while (frames1-- > 0) { - goto *get; -#define GET16_END after -#include "plugin_ops.h" -#undef GET16_END - after: + sample = get16(src, getidx); *dst = s16_to_ulaw(sample); src += src_step; dst += dst_step; diff --git a/src/pcm/pcm_rate_linear.c b/src/pcm/pcm_rate_linear.c index 35a4d8ea..366fdad7 100644 --- a/src/pcm/pcm_rate_linear.c +++ b/src/pcm/pcm_rate_linear.c @@ -70,19 +70,13 @@ static void linear_expand(struct rate_linear *rate, const snd_pcm_channel_area_t *src_areas, snd_pcm_uframes_t src_offset, unsigned int src_frames) { -#define GET16_LABELS -#define PUT16_LABELS -#include "plugin_ops.h" -#undef GET16_LABELS -#undef PUT16_LABELS - void *get = get16_labels[rate->get_idx]; - void *put = put16_labels[rate->put_idx]; unsigned int get_threshold = rate->pitch; unsigned int channel; unsigned int src_frames1; unsigned int dst_frames1; int16_t sample = 0; unsigned int pos; + unsigned int get_idx = rate->get_idx, put_idx = rate->get_idx; for (channel = 0; channel < rate->channels; ++channel) { const snd_pcm_channel_area_t *src_area = &src_areas[channel]; @@ -106,22 +100,14 @@ static void linear_expand(struct rate_linear *rate, pos -= get_threshold; old_sample = new_sample; if (src_frames1 < src_frames) { - goto *get; -#define GET16_END after_get -#include "plugin_ops.h" -#undef GET16_END - after_get: + sample = get16(src, get_idx); new_sample = sample; } } new_weight = (pos << (16 - rate->pitch_shift)) / (get_threshold >> rate->pitch_shift); old_weight = 0x10000 - new_weight; sample = (old_sample * old_weight + new_sample * new_weight) >> 16; - goto *put; -#define PUT16_END after_put -#include "plugin_ops.h" -#undef PUT16_END - after_put: + put16(dst, sample, put_idx); dst += dst_step; dst_frames1++; pos += LINEAR_DIV; @@ -192,19 +178,13 @@ static void linear_shrink(struct rate_linear *rate, const snd_pcm_channel_area_t *src_areas, snd_pcm_uframes_t src_offset, unsigned int src_frames) { -#define GET16_LABELS -#define PUT16_LABELS -#include "plugin_ops.h" -#undef GET16_LABELS -#undef PUT16_LABELS - void *get = get16_labels[rate->get_idx]; - void *put = put16_labels[rate->put_idx]; unsigned int get_increment = rate->pitch; unsigned int channel; unsigned int src_frames1; unsigned int dst_frames1; int16_t sample = 0; unsigned int pos; + unsigned int get_idx = rate->get_idx, put_idx = rate->get_idx; for (channel = 0; channel < rate->channels; ++channel) { const snd_pcm_channel_area_t *src_area = &src_areas[channel]; @@ -223,13 +203,7 @@ static void linear_shrink(struct rate_linear *rate, src_frames1 = 0; dst_frames1 = 0; while (src_frames1 < src_frames) { - - goto *get; -#define GET16_END after_get -#include "plugin_ops.h" -#undef GET16_END - after_get: - new_sample = sample; + new_sample = get16(src, get_idx); src += src_step; src_frames1++; pos += get_increment; @@ -238,11 +212,7 @@ static void linear_shrink(struct rate_linear *rate, old_weight = (pos << (32 - LINEAR_DIV_SHIFT)) / (get_increment >> (LINEAR_DIV_SHIFT - 16)); new_weight = 0x10000 - old_weight; sample = (old_sample * old_weight + new_sample * new_weight) >> 16; - goto *put; -#define PUT16_END after_put -#include "plugin_ops.h" -#undef PUT16_END - after_put: + put16(dst, sample, put_idx); dst += dst_step; dst_frames1++; if (CHECK_SANITY(dst_frames1 > dst_frames)) { diff --git a/src/pcm/pcm_route.c b/src/pcm/pcm_route.c index 737c8fa4..f9ba16a1 100644 --- a/src/pcm/pcm_route.c +++ b/src/pcm/pcm_route.c @@ -131,10 +131,6 @@ static void snd_pcm_route_convert1_one(const snd_pcm_channel_area_t *dst_area, const snd_pcm_route_ttable_dst_t* ttable, const snd_pcm_route_params_t *params) { -#define CONV_LABELS -#include "plugin_ops.h" -#undef CONV_LABELS - void *conv; const snd_pcm_channel_area_t *src_area = 0; unsigned int srcidx; const char *src; @@ -156,17 +152,12 @@ static void snd_pcm_route_convert1_one(const snd_pcm_channel_area_t *dst_area, return; } - conv = conv_labels[params->conv_idx]; src = snd_pcm_channel_area_addr(src_area, src_offset); dst = snd_pcm_channel_area_addr(dst_area, dst_offset); src_step = snd_pcm_channel_area_step(src_area); dst_step = snd_pcm_channel_area_step(dst_area); while (frames-- > 0) { - goto *conv; -#define CONV_END after -#include "plugin_ops.h" -#undef CONV_END - after: + conv(dst, src, params->conv_idx); src += src_step; dst += dst_step; } @@ -181,16 +172,13 @@ static void snd_pcm_route_convert1_one_getput(const snd_pcm_channel_area_t *dst_ const snd_pcm_route_ttable_dst_t* ttable, const snd_pcm_route_params_t *params) { -#define CONV24_LABELS -#include "plugin_ops.h" -#undef CONV24_LABELS - void *get, *put; const snd_pcm_channel_area_t *src_area = 0; unsigned int srcidx; const char *src; char *dst; int src_step, dst_step; uint32_t sample = 0; + unsigned int get_idx = params->get_idx, put_idx = params->put_idx; for (srcidx = 0; srcidx < ttable->nsrcs && srcidx < src_channels; ++srcidx) { unsigned int channel = ttable->srcs[srcidx].channel; if (channel >= src_channels) @@ -207,18 +195,13 @@ static void snd_pcm_route_convert1_one_getput(const snd_pcm_channel_area_t *dst_ return; } - get = get32_labels[params->get_idx]; - put = put32_labels[params->put_idx]; src = snd_pcm_channel_area_addr(src_area, src_offset); dst = snd_pcm_channel_area_addr(dst_area, dst_offset); src_step = snd_pcm_channel_area_step(src_area); dst_step = snd_pcm_channel_area_step(dst_area); while (frames-- > 0) { - goto *get; -#define CONV24_END after -#include "plugin_ops.h" -#undef CONV24_END - after: + sample = get32(src, get_idx); + put32(dst, sample, put_idx); src += src_step; dst += dst_step; } @@ -233,34 +216,6 @@ static void snd_pcm_route_convert1_many(const snd_pcm_channel_area_t *dst_area, const snd_pcm_route_ttable_dst_t* ttable, const snd_pcm_route_params_t *params) { -#define GET32_LABELS -#define PUT32_LABELS -#include "plugin_ops.h" -#undef GET32_LABELS -#undef PUT32_LABELS - static void *const zero_labels[2] = { - &&zero_int64, -#if SND_PCM_PLUGIN_ROUTE_FLOAT - &&zero_float -#endif - }; - /* sum_type att */ - static void *const add_labels[2 * 2] = { - &&add_int64_noatt, &&add_int64_att, -#if SND_PCM_PLUGIN_ROUTE_FLOAT - &&add_float_noatt, &&add_float_att -#endif - }; - /* sum_type att */ - static void *const norm_labels[2 * 2] = { - &&norm_int64_noatt, - &&norm_int64_att, -#if SND_PCM_PLUGIN_ROUTE_FLOAT - &&norm_float, - &&norm_float, -#endif - }; - void *zero, *get32, *add, *norm, *put32; int nsrcs = ttable->nsrcs; char *dst; int dst_step; @@ -269,6 +224,7 @@ static void snd_pcm_route_convert1_many(const snd_pcm_channel_area_t *dst_area, snd_pcm_route_ttable_src_t src_tt[nsrcs]; int32_t sample = 0; int srcidx, srcidx1 = 0; + unsigned get_idx = params->get_idx, put_idx = params->put_idx; for (srcidx = 0; srcidx < nsrcs && (unsigned)srcidx < src_channels; ++srcidx) { const snd_pcm_channel_area_t *src_area; unsigned int channel = ttable->srcs[srcidx].channel; @@ -301,11 +257,6 @@ static void snd_pcm_route_convert1_many(const snd_pcm_channel_area_t *dst_area, return; } - zero = zero_labels[params->sum_idx]; - get32 = get32_labels[params->get_idx]; - add = add_labels[params->sum_idx * 2 + ttable->att]; - norm = norm_labels[params->sum_idx * 2 + ttable->att]; - put32 = put32_labels[params->put_idx]; dst = snd_pcm_channel_area_addr(dst_area, dst_offset); dst_step = snd_pcm_channel_area_step(dst_area); @@ -314,83 +265,71 @@ static void snd_pcm_route_convert1_many(const snd_pcm_channel_area_t *dst_area, sum_t sum; /* Zero sum */ - goto *zero; - zero_int64: - sum.as_sint64 = 0; - goto zero_end; + switch (params->sum_idx) { + case 0: sum.as_sint64 = 0; break; #if SND_PCM_PLUGIN_ROUTE_FLOAT - zero_float: - sum.as_float = 0.0; - goto zero_end; + case 1: sum.as_float = 0.0; break; #endif - zero_end: + } for (srcidx = 0; srcidx < nsrcs; ++srcidx) { const char *src = srcs[srcidx]; /* Get sample */ - goto *get32; -#define GET32_END after_get -#include "plugin_ops.h" -#undef GET32_END - after_get: + sample = get32(src, get_idx); /* Sum */ - goto *add; - add_int64_att: - sum.as_sint64 += (int64_t) sample * ttp->as_int; - goto after_sum; - add_int64_noatt: - if (ttp->as_int) - sum.as_sint64 += sample; - goto after_sum; + switch (params->sum_idx * 2 + ttable->att) { + case 0: + if (ttp->as_int) + sum.as_sint64 += sample; + break; + case 1: + sum.as_sint64 += (int64_t) sample * ttp->as_int; + break; #if SND_PCM_PLUGIN_ROUTE_FLOAT - add_float_att: - sum.as_float += sample * ttp->as_float; - goto after_sum; - add_float_noatt: - if (ttp->as_int) - sum.as_float += sample; - goto after_sum; + case 2: + if (ttp->as_int) + sum.as_float += sample; + break; + case 3: + sum.as_float += sample * ttp->as_float; + break; #endif - after_sum: + } srcs[srcidx] += src_steps[srcidx]; ttp++; } /* Normalization */ - goto *norm; - norm_int64_att: - div(sum.as_sint64); - /* fallthru */ - norm_int64_noatt: - if (sum.as_sint64 > (int64_t)0x7fffffff) - sample = 0x7fffffff; /* maximum positive value */ - else if (sum.as_sint64 < -(int64_t)0x80000000) - sample = 0x80000000; /* maximum negative value */ - else - sample = sum.as_sint64; - goto after_norm; - + switch (params->sum_idx * 2 + ttable->att) { + case 1: + div(sum.as_sint64); + /* fallthru */ + case 0: + if (sum.as_sint64 > (int64_t)0x7fffffff) + sample = 0x7fffffff; /* maximum positive value */ + else if (sum.as_sint64 < -(int64_t)0x80000000) + sample = 0x80000000; /* maximum negative value */ + else + sample = sum.as_sint64; + break; #if SND_PCM_PLUGIN_ROUTE_FLOAT - norm_float: - sum.as_float = rint(sum.as_float); - if (sum.as_float > (int64_t)0x7fffffff) - sample = 0x7fffffff; /* maximum positive value */ - else if (sum.as_float < -(int64_t)0x80000000) - sample = 0x80000000; /* maximum negative value */ - else - sample = sum.as_float; - goto after_norm; + case 2: + case 3: + sum.as_float = rint(sum.as_float); + if (sum.as_float > (int64_t)0x7fffffff) + sample = 0x7fffffff; /* maximum positive value */ + else if (sum.as_float < -(int64_t)0x80000000) + sample = 0x80000000; /* maximum negative value */ + else + sample = sum.as_float; + break; #endif - after_norm: + } /* Put sample */ - goto *put32; -#define PUT32_END after_put32 -#include "plugin_ops.h" -#undef PUT32_END - after_put32: - + put32(dst, sample, put_idx); + dst += dst_step; } } diff --git a/src/pcm/plugin_ops.h b/src/pcm/plugin_ops.h index 6392073c..5c89a24f 100644 --- a/src/pcm/plugin_ops.h +++ b/src/pcm/plugin_ops.h @@ -19,6 +19,11 @@ * */ +#include +#include +#include +#include + #ifndef SX_INLINES #define SX_INLINES static inline uint32_t sx20(uint32_t x) @@ -92,626 +97,360 @@ static inline uint32_t sx24s(uint32_t x) #define _put_triple_s(ptr,val) _put_triple_le(ptr,val) #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) = (uint16_t)as_u8c(src) << 8; goto CONV_END; -conv_xxx1_xx01: as_u16(dst) = (uint16_t)as_u8c(src); goto CONV_END; -conv_xxx1_x100: as_u32(dst) = sx24((uint32_t)as_u8c(src) << 16); goto CONV_END; -conv_xxx1_001x: as_u32(dst) = sx24s((uint32_t)as_u8c(src) << 8); goto CONV_END; -conv_xxx1_1000: as_u32(dst) = (uint32_t)as_u8c(src) << 24; goto CONV_END; -conv_xxx1_0001: as_u32(dst) = (uint32_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) = (uint16_t)(as_u8c(src) ^ 0x80) << 8; goto CONV_END; -conv_xxx1_xx09: as_u16(dst) = (uint16_t)(as_u8c(src) ^ 0x80); goto CONV_END; -conv_xxx1_x900: as_u32(dst) = sx24((uint32_t)(as_u8c(src) ^ 0x80) << 16); goto CONV_END; -conv_xxx1_009x: as_u32(dst) = sx24s((uint32_t)(as_u8c(src) ^ 0x80) << 8); goto CONV_END; -conv_xxx1_9000: as_u32(dst) = (uint32_t)(as_u8c(src) ^ 0x80) << 24; goto CONV_END; -conv_xxx1_0009: as_u32(dst) = (uint32_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((uint32_t)as_u16c(src) << 8); goto CONV_END; -conv_xx12_021x: as_u32(dst) = sx24s((uint32_t)bswap_16(as_u16c(src)) << 8); goto CONV_END; -conv_xx12_1200: as_u32(dst) = (uint32_t)as_u16c(src) << 16; goto CONV_END; -conv_xx12_0021: as_u32(dst) = (uint32_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((uint32_t)(as_u16c(src) ^ 0x8000) << 8); goto CONV_END; -conv_xx12_029x: as_u32(dst) = sx24s((uint32_t)(bswap_16(as_u16c(src)) ^ 0x80) << 8); goto CONV_END; -conv_xx12_9200: as_u32(dst) = (uint32_t)(as_u16c(src) ^ 0x8000) << 16; goto CONV_END; -conv_xx12_0029: as_u32(dst) = (uint32_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((uint32_t)bswap_16(as_u16c(src)) << 8); goto CONV_END; -conv_xx12_012x: as_u32(dst) = sx24s((uint32_t)as_u16c(src) << 8); goto CONV_END; -conv_xx12_2100: as_u32(dst) = (uint32_t)bswap_16(as_u16c(src)) << 16; goto CONV_END; -conv_xx12_0012: as_u32(dst) = (uint32_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((uint32_t)bswap_16(as_u16c(src) ^ 0x80) << 8); goto CONV_END; -conv_xx12_01Ax: as_u32(dst) = sx24s((uint32_t)(as_u16c(src) ^ 0x80) << 8); goto CONV_END; -conv_xx12_A100: as_u32(dst) = (uint32_t)bswap_16(as_u16c(src) ^ 0x80) << 16; goto CONV_END; -conv_xx12_001A: as_u32(dst) = (uint32_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; +static inline void conv(char *dst, const char *src, unsigned int idx) { + switch (idx) { + case 0: /* 8h -> 8h */ + case 1: /* 8h -> 8s */ + case 16: /* 8s -> 8h */ + case 17: /* 8s -> 8s */ as_u8(dst) = as_u8c(src); break; + case 2: /* 8h -> 16h */ + case 18: /* 8s -> 16h */ as_u16(dst) = (uint16_t)as_u8c(src) << 8; break; + case 3: /* 8h -> 16s */ + case 19: /* 8s -> 16s */ as_u16(dst) = (uint16_t)as_u8c(src); break; + case 4: /* 8h -> 24h */ + case 20: /* 8s -> 24h */ as_u32(dst) = sx24((uint32_t)as_u8c(src) << 16); break; + case 5: /* 8h -> 24s */ + case 21: /* 8s -> 24s */ as_u32(dst) = sx24s((uint32_t)as_u8c(src) << 8); break; + case 6: /* 8h -> 32h */ + case 22: /* 8s -> 32h */ as_u32(dst) = (uint32_t)as_u8c(src) << 24; break; + case 7: /* 8h -> 32s */ + case 23: /* 8s -> 32s */ as_u32(dst) = (uint32_t)as_u8c(src); break; + case 8: /* 8h ^> 8h */ + case 9: /* 8h ^> 8s */ + case 24: /* 8s ^> 8h */ + case 25: /* 8s ^> 8s */ as_u8(dst) = as_u8c(src) ^ 0x80; break; + case 10: /* 8h ^> 16h */ + case 26: /* 8s ^> 16h */ as_u16(dst) = (uint16_t)(as_u8c(src) ^ 0x80) << 8; break; + case 11: /* 8h ^> 16s */ + case 27: /* 8s ^> 16s */ as_u16(dst) = (uint16_t)(as_u8c(src) ^ 0x80); break; + case 12: /* 8h ^> 24h */ + case 28: /* 8s ^> 24h */ as_u32(dst) = sx24((uint32_t)(as_u8c(src) ^ 0x80) << 16); break; + case 13: /* 8h ^> 24s */ + case 29: /* 8s ^> 24s */ as_u32(dst) = sx24s((uint32_t)(as_u8c(src) ^ 0x80) << 8); break; + case 14: /* 8h ^> 32h */ + case 30: /* 8s ^> 32h */ as_u32(dst) = (uint32_t)(as_u8c(src) ^ 0x80) << 24; break; + case 15: /* 8h ^> 32s */ + case 31: /* 8s ^> 32s */ as_u32(dst) = (uint32_t)(as_u8c(src) ^ 0x80); break; + case 32: /* 16h -> 8h */ + case 33: /* 16h -> 8s */ as_u8(dst) = as_u16c(src) >> 8; break; + case 34: /* 16h -> 16h */ as_u16(dst) = as_u16c(src); break; + case 35: /* 16h -> 16s */ as_u16(dst) = bswap_16(as_u16c(src)); break; + case 36: /* 16h -> 24h */ as_u32(dst) = sx24((uint32_t)as_u16c(src) << 8); break; + case 37: /* 16h -> 24s */ as_u32(dst) = sx24s((uint32_t)bswap_16(as_u16c(src)) << 8); break; + case 38: /* 16h -> 32h */ as_u32(dst) = (uint32_t)as_u16c(src) << 16; break; + case 39: /* 16h -> 32s */ as_u32(dst) = (uint32_t)bswap_16(as_u16c(src)); break; + case 40: /* 16h ^> 8h */ + case 41: /* 16h ^> 8s */ as_u8(dst) = (as_u16c(src) >> 8) ^ 0x80; break; + case 42: /* 16h ^> 16h */ + case 51: /* 16s -> 16s */ as_u16(dst) = as_u16c(src) ^ 0x8000; break; + case 43: /* 16h ^> 16s */ + case 50: /* 16s -> 16h */ as_u16(dst) = bswap_16(as_u16c(src)) ^ 0x80; break; + case 44: /* 16h ^> 24h */ as_u32(dst) = sx24((uint32_t)(as_u16c(src) ^ 0x8000) << 8); break; + case 45: /* 16h ^> 24s */ as_u32(dst) = sx24s((uint32_t)(bswap_16(as_u16c(src)) ^ 0x80) << 8); break; + case 46: /* 16h ^> 32h */ as_u32(dst) = (uint32_t)(as_u16c(src) ^ 0x8000) << 16; break; + case 47: /* 16h ^> 32s */ as_u32(dst) = (uint32_t)(bswap_16(as_u16c(src)) ^ 0x80); break; + case 48: /* 16s -> 8h */ + case 49: /* 16s -> 8s */ as_u8(dst) = as_u16c(src) & 0xff; break; + case 52: /* 16s -> 24h */ as_u32(dst) = sx24((uint32_t)bswap_16(as_u16c(src)) << 8); break; + case 53: /* 16s -> 24s */ as_u32(dst) = sx24s((uint32_t)as_u16c(src) << 8); break; + case 54: /* 16s -> 32h */ as_u32(dst) = (uint32_t)bswap_16(as_u16c(src)) << 16; break; + case 55: /* 16s -> 32s */ as_u32(dst) = (uint32_t)as_u16c(src); break; + case 56: /* 16s ^> 8h */ + case 57: /* 16s ^> 8s */ as_u8(dst) = (as_u16c(src) ^ 0x80) & 0xff; break; + case 58: /* 16s ^> 16h */ as_u16(dst) = bswap_16(as_u16c(src) ^ 0x80); break; + case 59: /* 16s ^> 16s */ as_u16(dst) = as_u16c(src) ^ 0x80; break; + case 60: /* 16s ^> 24h */ as_u32(dst) = sx24((uint32_t)bswap_16(as_u16c(src) ^ 0x80) << 8); break; + case 61: /* 16s ^> 24s */ as_u32(dst) = sx24s((uint32_t)(as_u16c(src) ^ 0x80) << 8); break; + case 62: /* 16s ^> 32h */ as_u32(dst) = (uint32_t)bswap_16(as_u16c(src) ^ 0x80) << 16; break; + case 63: /* 16s ^> 32s */ as_u32(dst) = (uint32_t)(as_u16c(src) ^ 0x80); break; + case 64: /* 24h -> 8h */ + case 65: /* 24h -> 8s */ as_u8(dst) = as_u32c(src) >> 16; break; + case 66: /* 24h -> 16h */ as_u16(dst) = as_u32c(src) >> 8; break; + case 67: /* 24h -> 16s */ as_u16(dst) = bswap_16(as_u32c(src) >> 8); break; + case 68: /* 24h -> 24h */ as_u32(dst) = sx24(as_u32c(src)); break; + case 69: /* 24h -> 24s */ as_u32(dst) = sx24s(bswap_32(as_u32c(src))); break; + case 70: /* 24h -> 32h */ as_u32(dst) = as_u32c(src) << 8; break; + case 71: /* 24h -> 32s */ as_u32(dst) = bswap_32(as_u32c(src)) >> 8; break; + case 72: /* 24h ^> 8h */ + case 73: /* 24h ^> 8s */ as_u8(dst) = (as_u32c(src) >> 16) ^ 0x80; break; + case 74: /* 24h ^> 16h */ as_u16(dst) = (as_u32c(src) >> 8) ^ 0x8000; break; + case 75: /* 24h ^> 16s */ as_u16(dst) = bswap_16(as_u32c(src) >> 8) ^ 0x80; break; + case 76: /* 24h ^> 24h */ as_u32(dst) = sx24(as_u32c(src) ^ 0x800000); break; + case 77: /* 24h ^> 24s */ as_u32(dst) = sx24s(bswap_32(as_u32c(src)) ^ 0x8000); break; + case 78: /* 24h ^> 32h */ as_u32(dst) = (as_u32c(src) ^ 0x800000) << 8; break; + case 79: /* 24h ^> 32s */ as_u32(dst) = (bswap_32(as_u32c(src)) >> 8) ^ 0x80; break; + case 80: /* 24s -> 8h */ + case 81: /* 24s -> 8s */ as_u8(dst) = (as_u32c(src) >> 8) & 0xff; break; + case 82: /* 24s -> 16h */ as_u16(dst) = bswap_16(as_u32c(src) >> 8); break; + case 83: /* 24s -> 16s */ as_u16(dst) = (as_u32c(src) >> 8) & 0xffff; break; + case 84: /* 24s -> 24h */ as_u32(dst) = sx24(bswap_32(as_u32c(src))); break; + case 85: /* 24s -> 24s */ as_u32(dst) = sx24s(as_u32c(src)); break; + case 86: /* 24s -> 32h */ as_u32(dst) = bswap_32(as_u32c(src)) << 8; break; + case 87: /* 24s -> 32s */ as_u32(dst) = as_u32c(src) >> 8; break; + case 88: /* 24s ^> 8h */ + case 89: /* 24s ^> 8s */ as_u8(dst) = ((as_u32c(src) >> 8) & 0xff) ^ 0x80; break; + case 90: /* 24s ^> 16h */ as_u16(dst) = bswap_16((as_u32c(src) >> 8) ^ 0x80); break; + case 91: /* 24s ^> 16s */ as_u16(dst) = ((as_u32c(src) >> 8) & 0xffff) ^ 0x80; break; + case 92: /* 24s ^> 24h */ as_u32(dst) = sx24(bswap_32(as_u32c(src)) ^ 0x800000); break; + case 93: /* 24s ^> 24s */ as_u32(dst) = sx24s(as_u32c(src) ^ 0x8000); break; + case 94: /* 24s ^> 32h */ as_u32(dst) = bswap_32(as_u32c(src) ^ 0x8000) << 8; break; + case 95: /* 24s ^> 32s */ as_u32(dst) = (as_u32c(src) >> 8) ^ 0x80; break; + case 96: /* 32h -> 8h */ + case 97: /* 32h -> 8s */ as_u8(dst) = as_u32c(src) >> 24; break; + case 98: /* 32h -> 16h */ as_u16(dst) = as_u32c(src) >> 16; break; + case 99: /* 32h -> 16s */ as_u16(dst) = bswap_16(as_u32c(src) >> 16); break; + case 100: /* 32h -> 24h */ as_u32(dst) = sx24(as_u32c(src) >> 8); break; + case 101: /* 32h -> 24s */ as_u32(dst) = sx24s(bswap_32(as_u32c(src)) << 8); break; + case 102: /* 32h -> 32h */ + case 119: /* 32s -> 32s */ as_u32(dst) = as_u32c(src); break; + case 103: /* 32h -> 32s */ + case 118: /* 32s -> 32h */ as_u32(dst) = bswap_32(as_u32c(src)); break; + case 104: /* 32h ^> 8h */ + case 105: /* 32h ^> 8s */ as_u8(dst) = (as_u32c(src) >> 24) ^ 0x80; break; + case 106: /* 32h ^> 16h */ as_u16(dst) = (as_u32c(src) >> 16) ^ 0x8000; break; + case 107: /* 32h ^> 16s */ as_u16(dst) = bswap_16(as_u32c(src) >> 16) ^ 0x80; break; + case 108: /* 32h ^> 24h */ as_u32(dst) = sx24((as_u32c(src) >> 8) ^ 0x800000); break; + case 109: /* 32h ^> 24s */ as_u32(dst) = sx24s((bswap_32(as_u32c(src)) ^ 0x80) << 8); break; + case 110: /* 32h ^> 32h */ as_u32(dst) = as_u32c(src) ^ 0x80000000; break; + case 111: /* 32h ^> 32s */ as_u32(dst) = bswap_32(as_u32c(src)) ^ 0x80; break; + case 112: /* 32s -> 8h */ + case 113: /* 32s -> 8s */ as_u8(dst) = as_u32c(src) & 0xff; break; + case 114: /* 32s -> 16h */ as_u16(dst) = bswap_16(as_u32c(src)); break; + case 115: /* 32s -> 16s */ as_u16(dst) = as_u32c(src) & 0xffff; break; + case 116: /* 32s -> 24h */ as_u32(dst) = sx24(bswap_32(as_u32c(src)) >> 8); break; + case 117: /* 32s -> 24s */ as_u32(dst) = sx24s(as_u32c(src) << 8); break; + case 120: /* 32s ^> 8h */ + case 121: /* 32s ^> 8s */ as_u8(dst) = (as_u32c(src) & 0xff) ^ 0x80; break; + case 122: /* 32s ^> 16h */ as_u16(dst) = bswap_16(as_u32c(src) ^ 0x80); break; + case 123: /* 32s ^> 16s */ as_u16(dst) = (as_u32c(src) & 0xffff) ^ 0x80; break; + case 124: /* 32s ^> 24h */ as_u32(dst) = sx24((bswap_32(as_u32c(src)) >> 8) ^ 0x800000); break; + case 125: /* 32s ^> 24s */ as_u32(dst) = sx24s((as_u32c(src) ^ 0x80) << 8); break; + case 126: /* 32s ^> 32h */ as_u32(dst) = bswap_32(as_u32c(src) ^ 0x80); break; + case 127: /* 32s ^> 32s */ as_u32(dst) = as_u32c(src) ^ 0x80; break; + default: assert(0); + } } -#endif -#ifdef GET16_LABELS -/* src_wid src_endswap sign_toggle */ -static void *const get16_labels[5 * 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 */ +static inline uint16_t get16(const char *src, unsigned int idx) { + switch(idx) { + case 0: /* 8h -> 16h */ + case 2: /* 8s -> 16h */ return (uint16_t)as_u8c(src) << 8; + case 1: /* 8h ^> 16h */ + case 3: /* 8s ^> 16h */ return (uint16_t)(as_u8c(src) ^ 0x80) << 8; + case 4: /* 16h -> 16h */ return as_u16c(src); + case 5: /* 16h ^> 16h */ return as_u16c(src) ^ 0x8000; + case 6: /* 16s -> 16h */ return bswap_16(as_u16c(src)); + case 7: /* 16s ^> 16h */ return bswap_16(as_u16c(src) ^ 0x80); /* 4 byte formats */ - &&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 */ - &&get16_0123_12_20, /* 20h -> 16h */ - &&get16_0123_92_20, /* 20h ^> 16h */ - &&get16_1230_32_20, /* 20s -> 16h */ - &&get16_1230_B2_20, /* 20s ^> 16h */ + case 8: /* 24h -> 16h */ return as_u32c(src) >> 8; + case 9: /* 24h ^> 16h */ return (as_u32c(src) >> 8) ^ 0x8000; + case 10: /* 24s -> 16h */ return bswap_16(as_u32c(src) >> 8); + case 11: /* 24s ^> 16h */ return bswap_16((as_u32c(src) >> 8) ^ 0x80); + case 12: /* 32h -> 16h */ return as_u32c(src) >> 16; + case 13: /* 32h ^> 16h */ return (as_u32c(src) >> 16) ^ 0x8000; + case 14: /* 32s -> 16h */ return bswap_16(as_u32c(src)); + case 15: /* 32s ^> 16h */ return bswap_16(as_u32c(src) ^ 0x80); + case 16: /* 20h -> 16h */ return as_u32c(src) >> 4; + case 17: /* 20h ^> 16h */ return (as_u32c(src) >> 4) ^ 0x8000; + case 18: /* 20s -> 16h */ return bswap_32(as_u32c(src)) >> 4; + case 19: /* 20s ^> 16h */ return (bswap_32(as_u32c(src)) >> 4) ^ 0x8000; /* 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 = (uint16_t)as_u8c(src) << 8; goto GET16_END; -get16_1_90: sample = (uint16_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_0123_12_20: sample = as_u32c(src) >> 4; goto GET16_END; -get16_0123_92_20: sample = (as_u32c(src) >> 4) ^ 0x8000; goto GET16_END; -get16_1230_32_20: sample = bswap_32(as_u32c(src)) >> 4; goto GET16_END; -get16_1230_B2_20: sample = (bswap_32(as_u32c(src)) >> 4) ^ 0x8000; 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; + case 20: /* 24h -> 16h */ return _get_triple(src) >> 8; + case 21: /* 24h ^> 16h */ return (_get_triple(src) >> 8) ^ 0x8000; + case 22: /* 24s -> 16h */ return _get_triple_s(src) >> 8; + case 23: /* 24s ^> 16h */ return (_get_triple_s(src) >> 8) ^ 0x8000; + case 24: /* 20h -> 16h */ return _get_triple(src) >> 4; + case 25: /* 20h ^> 16h */ return (_get_triple(src) >> 4) ^ 0x8000; + case 26: /* 20s -> 16h */ return _get_triple_s(src) >> 4; + case 27: /* 20s ^> 16h */ return (_get_triple_s(src) >> 4) ^ 0x8000; + case 28: /* 18h -> 16h */ return _get_triple(src) >> 2; + case 29: /* 18h ^> 16h */ return (_get_triple(src) >> 2) ^ 0x8000; + case 30: /* 18s -> 16h */ return _get_triple_s(src) >> 2; + case 31: /* 18s ^> 16h */ return (_get_triple_s(src) >> 2) ^ 0x8000; + default: assert(0); + } } -#endif -#ifdef PUT16_LABELS -/* dst_wid dst_endswap sign_toggle */ -static void *const put16_labels[5 * 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 */ +static inline void put16(char *dst, int16_t sample, unsigned int idx) +{ + switch (idx) { + case 0: /* 16h -> 8h */ + case 2: /* 16h -> 8s */ as_u8(dst) = sample >> 8; break; + case 1: /* 16h ^> 8h */ + case 3: /* 16h ^> 8s */ as_u8(dst) = (sample >> 8) ^ 0x80; break; + case 4: /* 16h -> 16h */ as_u16(dst) = sample; break; + case 5: /* 16h ^> 16h */ as_u16(dst) = sample ^ 0x8000; break; + case 6: /* 16h -> 16s */ as_u16(dst) = bswap_16(sample); break; + case 7: /* 16h ^> 16s */ as_u16(dst) = bswap_16(sample) ^ 0x80; break; /* 4 byte formats */ - &&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 */ - &&put16_12_0120_20, /* 16h -> 20h */ - &&put16_12_0920_20, /* 16h ^> 20h */ - &&put16_12_0210_20, /* 16h -> 20s */ - &&put16_12_0290_20, /* 16h ^> 20s */ + case 8: /* 16h -> 24h */ as_u32(dst) = sx24((uint32_t)sample << 8); break; + case 9: /* 16h ^> 24h */ as_u32(dst) = sx24((uint32_t)(sample ^ 0x8000) << 8); break; + case 10: /* 16h -> 24s */ as_u32(dst) = sx24s((uint32_t)bswap_16(sample) << 8); break; + case 11: /* 16h ^> 24s */ as_u32(dst) = sx24s((uint32_t)(bswap_16(sample) ^ 0x80) << 8); break; + case 12: /* 16h -> 32h */ as_u32(dst) = (uint32_t)sample << 16; break; + case 13: /* 16h ^> 32h */ as_u32(dst) = (uint32_t)(sample ^ 0x8000) << 16; break; + case 14: /* 16h -> 32s */ as_u32(dst) = (uint32_t)bswap_16(sample); break; + case 15: /* 16h ^> 32s */ as_u32(dst) = (uint32_t)bswap_16(sample) ^ 0x80; break; + case 16: /* 16h -> 20h */ as_u32(dst) = sx20((uint32_t)sample << 4); break; + case 17: /* 16h ^> 20h */ as_u32(dst) = sx20((uint32_t)(sample ^ 0x8000) << 4); break; + case 18: /* 16h -> 20s */ as_u32(dst) = bswap_32(sx20((uint32_t)sample << 4)); break; + case 19: /* 16h ^> 20s */ as_u32(dst) = bswap_32(sx20((uint32_t)(sample ^ 0x8000) << 4)); break; /* 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((uint32_t)sample << 8); goto PUT16_END; -put16_12_0920: as_u32(dst) = sx24((uint32_t)(sample ^ 0x8000) << 8); goto PUT16_END; -put16_12_0210: as_u32(dst) = sx24s((uint32_t)bswap_16(sample) << 8); goto PUT16_END; -put16_12_0290: as_u32(dst) = sx24s((uint32_t)(bswap_16(sample) ^ 0x80) << 8); goto PUT16_END; -put16_12_1200: as_u32(dst) = (uint32_t)sample << 16; goto PUT16_END; -put16_12_9200: as_u32(dst) = (uint32_t)(sample ^ 0x8000) << 16; goto PUT16_END; -put16_12_0021: as_u32(dst) = (uint32_t)bswap_16(sample); goto PUT16_END; -put16_12_0029: as_u32(dst) = (uint32_t)bswap_16(sample) ^ 0x80; goto PUT16_END; -put16_12_0120_20: as_u32(dst) = sx20((uint32_t)sample << 4); goto PUT16_END; -put16_12_0920_20: as_u32(dst) = sx20((uint32_t)(sample ^ 0x8000) << 4); goto PUT16_END; -put16_12_0210_20: as_u32(dst) = bswap_32(sx20((uint32_t)sample << 4)); goto PUT16_END; -put16_12_0290_20: as_u32(dst) = bswap_32(sx20((uint32_t)(sample ^ 0x8000) << 4)); goto PUT16_END; -put16_12_120: _put_triple(dst, (uint32_t)sample << 8); goto PUT16_END; -put16_12_920: _put_triple(dst, (uint32_t)(sample ^ 0x8000) << 8); goto PUT16_END; -put16_12_021: _put_triple_s(dst, (uint32_t)sample << 8); goto PUT16_END; -put16_12_029: _put_triple_s(dst, (uint32_t)(sample ^ 0x8000) << 8); goto PUT16_END; -put16_12_120_20: _put_triple(dst, (uint32_t)sample << 4); goto PUT16_END; -put16_12_920_20: _put_triple(dst, (uint32_t)(sample ^ 0x8000) << 4); goto PUT16_END; -put16_12_021_20: _put_triple_s(dst, (uint32_t)sample << 4); goto PUT16_END; -put16_12_029_20: _put_triple_s(dst, (uint32_t)(sample ^ 0x8000) << 4); goto PUT16_END; -put16_12_120_18: _put_triple(dst, (uint32_t)sample << 2); goto PUT16_END; -put16_12_920_18: _put_triple(dst, (uint32_t)(sample ^ 0x8000) << 2); goto PUT16_END; -put16_12_021_18: _put_triple_s(dst, (uint32_t)sample << 2); goto PUT16_END; -put16_12_029_18: _put_triple_s(dst, (uint32_t)(sample ^ 0x8000) << 2); goto PUT16_END; + case 20: /* 16h -> 24h */ _put_triple(dst, (uint32_t)sample << 8); break; + case 21: /* 16h ^> 24h */ _put_triple(dst, (uint32_t)(sample ^ 0x8000) << 8); break; + case 22: /* 16h -> 24s */ _put_triple_s(dst, (uint32_t)sample << 8); break; + case 23: /* 16h ^> 24s */ _put_triple_s(dst, (uint32_t)(sample ^ 0x8000) << 8); break; + case 24: /* 16h -> 20h */ _put_triple(dst, (uint32_t)sample << 4); break; + case 25: /* 16h ^> 20h */ _put_triple(dst, (uint32_t)(sample ^ 0x8000) << 4); break; + case 26: /* 16h -> 20s */ _put_triple_s(dst, (uint32_t)sample << 4); break; + case 27: /* 16h ^> 20s */ _put_triple_s(dst, (uint32_t)(sample ^ 0x8000) << 4); break; + case 28: /* 16h -> 18h */ _put_triple(dst, (uint32_t)sample << 2); break; + case 29: /* 16h ^> 18h */ _put_triple(dst, (uint32_t)(sample ^ 0x8000) << 2); break; + case 30: /* 16h -> 18s */ _put_triple_s(dst, (uint32_t)sample << 2); break; + case 31: /* 16h ^> 18s */ _put_triple_s(dst, (uint32_t)(sample ^ 0x8000) << 2); break; + default: assert(0); + } } -#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[5 * 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 */ +static inline int32_t get32(const char *src, unsigned int idx) +{ + switch (idx) { + case 0: /* 8h -> 32h */ + case 2: /* 8s -> 32h */ return (uint32_t)as_u8c(src) << 24; + case 1: /* 8h ^> 32h */ + case 3: /* 8s ^> 32h */ return (uint32_t)(as_u8c(src) ^ 0x80) << 24; + case 4: /* 16h -> 32h */ return (uint32_t)as_u16c(src) << 16; + case 5: /* 16h ^> 32h */ return (uint32_t)(as_u16c(src) ^ 0x8000) << 16; + case 6: /* 16s -> 32h */ return (uint32_t)bswap_16(as_u16c(src)) << 16; + case 7: /* 16s ^> 32h */ return (uint32_t)bswap_16(as_u16c(src) ^ 0x80) << 16; /* 4 byte formats */ - &&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 */ - &&get32_0123_1230_20, /* 20h -> 32h */ - &&get32_0123_9230_20, /* 20h ^> 32h */ - &&get32_1230_3210_20, /* 20s -> 32h */ - &&get32_1230_B210_20, /* 20s ^> 32h */ + case 8: /* 24h -> 32h */ return as_u32c(src) << 8; + case 9: /* 24h ^> 32h */ return (as_u32c(src) << 8) ^ 0x80000000; + case 10: /* 24s -> 32h */ return bswap_32(as_u32c(src) >> 8); + case 11: /* 24s ^> 32h */ return bswap_32((as_u32c(src) >> 8) ^ 0x80); + case 12: /* 32h -> 32h */ return as_u32c(src); + case 13: /* 32h ^> 32h */ return as_u32c(src) ^ 0x80000000; + case 14: /* 32s -> 32h */ return bswap_32(as_u32c(src)); + case 15: /* 32s ^> 32h */ return bswap_32(as_u32c(src) ^ 0x80); + case 16: /* 20h -> 32h */ return as_u32c(src) << 12; + case 17: /* 20h ^> 32h */ return (as_u32c(src) << 12) ^ 0x80000000; + case 18: /* 20s -> 32h */ return bswap_32(as_u32c(src)) << 12; + case 19: /* 20s ^> 32h */ return (bswap_32(as_u32c(src)) << 12) ^ 0x80000000; /* 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 = (uint32_t)as_u8c(src) << 24; goto GET32_END; -get32_1_9000: sample = (uint32_t)(as_u8c(src) ^ 0x80) << 24; goto GET32_END; -get32_12_1200: sample = (uint32_t)as_u16c(src) << 16; goto GET32_END; -get32_12_9200: sample = (uint32_t)(as_u16c(src) ^ 0x8000) << 16; goto GET32_END; -get32_12_2100: sample = (uint32_t)bswap_16(as_u16c(src)) << 16; goto GET32_END; -get32_12_A100: sample = (uint32_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_0123_1230_20: sample = as_u32c(src) << 12; goto GET32_END; -get32_0123_9230_20: sample = (as_u32c(src) << 12) ^ 0x80000000; goto GET32_END; -get32_1230_3210_20: sample = bswap_32(as_u32c(src)) << 12; goto GET32_END; -get32_1230_B210_20: sample = (bswap_32(as_u32c(src)) << 12) ^ 0x80000000; 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; + case 20: /* 24h -> 32h */ return _get_triple(src) << 8; + case 21: /* 24h ^> 32h */ return (_get_triple(src) << 8) ^ 0x80000000; + case 22: /* 24s -> 32h */ return _get_triple_s(src) << 8; + case 23: /* 24s ^> 32h */ return (_get_triple_s(src) << 8) ^ 0x80000000; + case 24: /* 20h -> 32h */ return _get_triple(src) << 12; + case 25: /* 20h ^> 32h */ return (_get_triple(src) << 12) ^ 0x80000000; + case 26: /* 20s -> 32h */ return _get_triple_s(src) << 12; + case 27: /* 20s ^> 32h */ return (_get_triple_s(src) << 12) ^ 0x80000000; + case 28: /* 18h -> 32h */ return _get_triple(src) << 14; + case 29: /* 18h ^> 32h */ return (_get_triple(src) << 14) ^ 0x80000000; + case 30: /* 18s -> 32h */ return _get_triple_s(src) << 14; + case 31: /* 18s ^> 32h */ return (_get_triple_s(src) << 14) ^ 0x80000000; + default: assert(0); + } } -#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[5 * 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 */ +static inline void put32(char *dst, int32_t sample, unsigned int idx) +{ + switch (idx) { + case 0: /* 32h -> 8h */ + case 2: /* 32h -> 8s */ as_u8(dst) = sample >> 24; break; + case 1: /* 32h ^> 8h */ + case 3: /* 32h ^> 8s */ as_u8(dst) = (sample >> 24) ^ 0x80; break; + case 4: /* 32h -> 16h */ as_u16(dst) = sample >> 16; break; + case 5: /* 32h ^> 16h */ as_u16(dst) = (sample >> 16) ^ 0x8000; break; + case 6: /* 32h -> 16s */ as_u16(dst) = bswap_16(sample >> 16); break; + case 7: /* 32h ^> 16s */ as_u16(dst) = bswap_16(sample >> 16) ^ 0x80; break; /* 4 byte formats */ - &&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 */ - &&put32_1234_0123_20, /* 32h -> 20h */ - &&put32_1234_0923_20, /* 32h ^> 20h */ - &&put32_1234_3210_20, /* 32h -> 20s */ - &&put32_1234_3290_20, /* 32h ^> 20s */ + case 8: /* 32h -> 24h */ as_u32(dst) = sx24(sample >> 8); break; + case 9: /* 32h ^> 24h */ as_u32(dst) = sx24((sample >> 8) ^ 0x800000); break; + case 10: /* 32h -> 24s */ as_u32(dst) = sx24s(bswap_32(sample) << 8); break; + case 11: /* 32h ^> 24s */ as_u32(dst) = sx24s((bswap_32(sample) ^ 0x80) << 8); break; + case 12: /* 32h -> 32h */ as_u32(dst) = sample; break; + case 13: /* 32h ^> 32h */ as_u32(dst) = sample ^ 0x80000000; break; + case 14: /* 32h -> 32s */ as_u32(dst) = bswap_32(sample); break; + case 15: /* 32h ^> 32s */ as_u32(dst) = bswap_32(sample) ^ 0x80; break; + case 16: /* 32h -> 20h */ as_u32(dst) = sx20(sample >> 12); break; + case 17: /* 32h ^> 20h */ as_u32(dst) = sx20((sample ^ 0x80000000) >> 12); break; + case 18: /* 32h -> 20s */ as_u32(dst) = bswap_32(sx20(sample >> 12)); break; + case 19: /* 32h ^> 20s */ as_u32(dst) = bswap_32(sx20((sample ^ 0x80000000) >> 12)); break; /* 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 -> 20h */ - &&put32_1234_923_20, /* 32h ^> 20h */ - &&put32_1234_321_20, /* 32h -> 20s */ - &&put32_1234_329_20, /* 32h ^> 20s */ - &&put32_1234_123_18, /* 32h -> 18h */ - &&put32_1234_923_18, /* 32h ^> 18h */ - &&put32_1234_321_18, /* 32h -> 18s */ - &&put32_1234_329_18, /* 32h ^> 18s */ -}; -#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_0123_20: as_u32(dst) = sx20(sample >> 12); goto PUT32_END; -put32_1234_0923_20: as_u32(dst) = sx20((sample ^ 0x80000000) >> 12); goto PUT32_END; -put32_1234_3210_20: as_u32(dst) = bswap_32(sx20(sample >> 12)); goto PUT32_END; -put32_1234_3290_20: as_u32(dst) = bswap_32(sx20((sample ^ 0x80000000) >> 12)); 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; + case 20: /* 32h -> 24h */ _put_triple(dst, sample >> 8); break; + case 21: /* 32h ^> 24h */ _put_triple(dst, (sample ^ 0x80000000) >> 8); break; + case 22: /* 32h -> 24s */ _put_triple_s(dst, sample >> 8); break; + case 23: /* 32h ^> 24s */ _put_triple_s(dst, (sample ^ 0x80000000) >> 8); break; + case 24: /* 32h -> 20h */ _put_triple(dst, sample >> 12); break; + case 25: /* 32h ^> 20h */ _put_triple(dst, (sample ^ 0x80000000) >> 12); break; + case 26: /* 32h -> 20s */ _put_triple_s(dst, sample >> 12); break; + case 27: /* 32h ^> 20s */ _put_triple_s(dst, (sample ^ 0x80000000) >> 12); break; + case 28: /* 32h -> 18h */ _put_triple(dst, sample >> 14); break; + case 29: /* 32h ^> 18h */ _put_triple(dst, (sample ^ 0x80000000) >> 14); break; + case 30: /* 32h -> 18s */ _put_triple_s(dst, sample >> 14); break; + case 31: /* 32h ^> 18s */ _put_triple_s(dst, (sample ^ 0x80000000) >> 14); break; + default: assert(0); + } } -#endif - -#ifdef CONV24_END -#undef GET32_END -#undef PUT32_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 +static inline void put32float(char *dst, int32_t sample, unsigned int idx) +{ + snd_tmp_float_t tmp_float; + snd_tmp_double_t tmp_double; -#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 + switch (idx) { + case 0: /* 32h -> (float)h */ + as_float(dst) = (float_t)((int32_t)sample) / (float_t)0x80000000UL; break; + case 1: /* 32h -> (float)s */ + tmp_float.f = (float_t)((int32_t)sample) / (float_t)0x80000000UL; + as_u32(dst) = bswap_32(tmp_float.i); break; + case 2: /* 32h -> (float64)h */ + as_double(dst) = (double_t)((int32_t)sample) / (double_t)0x80000000UL; break; + case 3: /* 32h -> (float64)s */ + tmp_double.d = (double_t)((int32_t)sample) / (double_t)0x80000000UL; + as_u64(dst) = bswap_64(tmp_double.l); break; + default: assert(0); + } +} -#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 +static inline int32_t get32float(const char *src, unsigned int idx) +{ + snd_tmp_float_t tmp_float; + snd_tmp_double_t tmp_double; -#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 + switch (idx) { + case 0: /* (float)h -> 32h */ + tmp_float.f = as_floatc(src); + if (tmp_float.f >= 1.0) + return 0x7fffffff; + if (tmp_float.f <= -1.0) + return 0x80000000; + return (int32_t)(tmp_float.f * (float_t)0x80000000UL); + case 1: /* (float)s -> 32h */ + tmp_float.i = bswap_32(as_u32c(src)); + if (tmp_float.f >= 1.0) + return 0x7fffffff; + if (tmp_float.f <= -1.0) + return 0x80000000; + return (int32_t)(tmp_float.f * (float_t)0x80000000UL); + case 2: /* (float64)h -> 32h */ + tmp_double.d = as_doublec(src); + if (tmp_double.d >= 1.0) + return 0x7fffffff; + if (tmp_double.d <= -1.0) + return 0x80000000; + return (int32_t)(tmp_double.d * (double_t)0x80000000UL); + case 3: /* (float64)s -> 32h */ + tmp_double.l = bswap_64(as_u64c(src)); + if (tmp_double.d >= 1.0) + return 0x7fffffff; + if (tmp_double.d <= -1.0) + return 0x80000000; + return (int32_t)(tmp_double.d * (double_t)0x80000000UL); + default: assert(0); + } +} #undef as_u8 #undef as_u16 -- 2.44.0