summaryrefslogtreecommitdiff
path: root/thirdparty/minimp3/patches/msvc-arm-fix.patch
blob: bca915acebf12626cb58be0ea05fb288cdf55bbf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
diff --git a/thirdparty/minimp3/minimp3.h b/thirdparty/minimp3/minimp3.h
index 3220ae1a85..2a9975cc86 100644
--- a/thirdparty/minimp3/minimp3.h
+++ b/thirdparty/minimp3/minimp3.h
@@ -1566,7 +1566,18 @@ static void mp3d_synth(float *xl, mp3d_sample_t *dstl, int nch, float *lins)
 
 #else /* MINIMP3_FLOAT_OUTPUT */
 
+// -- GODOT start --
+#if defined(_MSC_VER) && (defined(_M_ARM64) || defined(_M_ARM64EC) || defined(_M_ARM))
+            static f4 g_scale;
+            g_scale = vsetq_lane_f32(1.0f/32768.0f, g_scale, 0);
+            g_scale = vsetq_lane_f32(1.0f/32768.0f, g_scale, 1);
+            g_scale = vsetq_lane_f32(1.0f/32768.0f, g_scale, 2);
+            g_scale = vsetq_lane_f32(1.0f/32768.0f, g_scale, 3);
+#else
             static const f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f };
+#endif
+// -- GODOT end --
+
             a = VMUL(a, g_scale);
             b = VMUL(b, g_scale);
 #if HAVE_SSE
@@ -1813,7 +1824,19 @@ void mp3dec_f32_to_s16(const float *in, int16_t *out, int num_samples)
     int aligned_count = num_samples & ~7;
     for(; i < aligned_count; i += 8)
     {
+
+// -- GODOT start --
+#if defined(_MSC_VER) && (defined(_M_ARM64) || defined(_M_ARM64EC) || defined(_M_ARM))
+            static f4 g_scale;
+            g_scale = vsetq_lane_f32(32768.0f, g_scale, 0);
+            g_scale = vsetq_lane_f32(32768.0f, g_scale, 1);
+            g_scale = vsetq_lane_f32(32768.0f, g_scale, 2);
+            g_scale = vsetq_lane_f32(32768.0f, g_scale, 3);
+#else
         static const f4 g_scale = { 32768.0f, 32768.0f, 32768.0f, 32768.0f };
+#endif
+// -- GODOT end --
+
         f4 a = VMUL(VLD(&in[i  ]), g_scale);
         f4 b = VMUL(VLD(&in[i+4]), g_scale);
 #if HAVE_SSE