Browse Source

Avoid using hex-floats

Brick 1 year ago
parent
commit
e44f54ec54
1 changed files with 8 additions and 6 deletions
  1. 8 6
      src/audio/SDL_audiotypecvt.c

+ 8 - 6
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)
 {