From e44f54ec541983794c00f471218676c009f2daef Mon Sep 17 00:00:00 2001 From: Brick <6098371+0x1F9F1@users.noreply.github.com> Date: Thu, 24 Aug 2023 19:49:25 +0100 Subject: [PATCH] Avoid using hex-floats --- src/audio/SDL_audiotypecvt.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/audio/SDL_audiotypecvt.c b/src/audio/SDL_audiotypecvt.c index 416e9ab914..1b45a0d98f 100644 --- a/src/audio/SDL_audiotypecvt.c +++ b/src/audio/SDL_audiotypecvt.c @@ -39,6 +39,8 @@ #define NEED_SCALAR_CONVERTER_FALLBACKS 1 #endif +#define DIVBY2147483648 0.0000000004656612873077392578125f /* 0x1p-31f */ + #if NEED_SCALAR_CONVERTER_FALLBACKS /* This code requires that floats are in the IEEE-754 binary32 format */ @@ -101,7 +103,7 @@ static void SDL_Convert_S32_to_F32_Scalar(float *dst, const Sint32 *src, int num LOG_DEBUG_AUDIO_CONVERT("S32", "F32"); for (i = num_samples - 1; i >= 0; --i) { - dst[i] = (float)src[i] * 0x1p-31f; + dst[i] = (float)src[i] * DIVBY2147483648; } } @@ -319,7 +321,7 @@ static void SDL_TARGETING("sse2") SDL_Convert_S32_to_F32_SSE2(float *dst, const int i = num_samples; /* dst[i] = f32(src[i]) / f32(0x80000000) */ - const __m128 scaler = _mm_set1_ps(0x1p-31f); + const __m128 scaler = _mm_set1_ps(DIVBY2147483648); LOG_DEBUG_AUDIO_CONVERT("S32", "F32 (using SSE2)"); @@ -493,7 +495,7 @@ static void SDL_TARGETING("sse2") SDL_Convert_F32_to_S32_SSE2(Sint32 *dst, const * 2) Convert to integer (values too small/large become 0x80000000 = -2147483648) * 3) Fixup values which were too large (0x80000000 ^ 0xFFFFFFFF = 2147483647) * dst[i] = i32(src[i] * 2147483648.0) ^ ((src[i] >= 2147483648.0) ? 0xFFFFFFFF : 0x00000000) */ - const __m128 limit = _mm_set1_ps(0x1p31f); + const __m128 limit = _mm_set1_ps(2147483648.0f); LOG_DEBUG_AUDIO_CONVERT("F32", "S32 (using SSE2)"); @@ -537,9 +539,9 @@ static void SDL_TARGETING("sse2") SDL_Convert_F32_to_S32_SSE2(Sint32 *dst, const #endif #ifdef SDL_NEON_INTRINSICS -#define DIVBY128 0x1p-7f -#define DIVBY32768 0x1p-15f -#define DIVBY8388607 0x1.000002p-23f +#define DIVBY128 0.0078125f /* 0x1p-7f */ +#define DIVBY32768 0.000030517578125f /* 0x1p-15f */ +#define DIVBY8388607 0.00000011920930376163766f /* 0x1.000002p-23f */ static void SDL_Convert_S8_to_F32_NEON(float *dst, const Sint8 *src, int num_samples) {