Skip to content

Commit 82e242b

Browse files
committed
gst1-plugins-base: re-enable the NEON audio resampler on 32-bit ARM
Since 1.28 the NEON resampler asm advances pointers with add.w, a Thumb-2 only mnemonic that gas rejects in ARM (A32) state, which is how OpenWrt builds ARM. The same add.w gates the HAVE_ARM_NEON meson probe, so on A32 the probe fails and the resampler is silently compiled out. Backport upstream af3ad8dc31da, which picks the operand form per ISA and drops add.w from the probe. It is on the 1.28 branch as 4f4fec2de8b8, so this patch can be dropped at 1.28.8. Signed-off-by: Alexandru Ardelean <alex@shruggie.ro>
1 parent b39204b commit 82e242b

1 file changed

Lines changed: 140 additions & 0 deletions

File tree

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
From af3ad8dc31da3072bd6b9ce3e44cd20e6253c50d Mon Sep 17 00:00:00 2001
2+
From: "L. E. Segovia" <amy@centricular.com>
3+
Date: Tue, 15 Sep 2026 17:50:56 -0300
4+
Subject: [PATCH] audio-resampler-neon: handle Thumb1-only builds correctly
5+
6+
Fixes #5280
7+
8+
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12490>
9+
10+
Signed-off-by: Alexandru Ardelean <alex@shruggie.ro>
11+
---
12+
.../gst-libs/gst/audio/audio-resampler-neon.h | 48 ++++++++++++-------
13+
meson.build | 3 +-
14+
2 files changed, 31 insertions(+), 20 deletions(-)
15+
16+
--- a/gst-libs/gst/audio/audio-resampler-neon.h
17+
+++ b/gst-libs/gst/audio/audio-resampler-neon.h
18+
@@ -20,6 +20,18 @@
19+
#include <gst/gstcpuid.h>
20+
#include <stdint.h>
21+
22+
+#if defined(__thumb2__)
23+
+/* Thumb-2: request the wide encoding explicitly. */
24+
+#define ADD_W(x, y) "add.w " #x ", " #x ", %[" #y "]\n"
25+
+#elif defined(__thumb__)
26+
+/* Thumb-1 has no 3-operand ADD for high registers and no wide encodings. */
27+
+#define ADD_W(x, y) "add " #x ", %[" #y "]\n"
28+
+#else
29+
+/* ARM (A32) has a single 32-bit ADD encoding and rejects the .w width
30+
+ * suffix as invalid syntax, so emit a plain 3-operand ADD. */
31+
+#define ADD_W(x, y) "add " #x ", " #x ", %[" #y "]\n"
32+
+#endif
33+
+
34+
static inline void
35+
inner_product_gint16_full_1_neon (gint16 * o, const gint16 * a,
36+
const gint16 * b, gint len, const gint16 * icoeff, gint bstride)
37+
@@ -133,11 +145,11 @@ inner_product_gint16_cubic_1_neon (gint1
38+
"1:"
39+
" mov r8, %[b]\n"
40+
" vld1.16 {d16, d17}, [%[b]]!\n"
41+
- " add.w r8, r8, %[bstride]\n"
42+
+ ADD_W(r8, bstride)
43+
" vld1.16 {d18, d19}, [r8]\n"
44+
- " add.w r8, r8, %[bstride]\n"
45+
+ ADD_W(r8, bstride)
46+
" vld1.16 {d20, d21}, [r8]\n"
47+
- " add.w r8, r8, %[bstride]\n"
48+
+ ADD_W(r8, bstride)
49+
" vld1.16 {d22, d23}, [r8]\n"
50+
" vld1.16 {d24, d25}, [%[a]]!\n"
51+
" subs %[len], %[len], #8\n"
52+
@@ -214,11 +226,11 @@ interpolate_gint16_cubic_neon (gpointer
53+
"1:"
54+
" mov r8, %[a]\n"
55+
" vld1.16 {d16, d17}, [%[a]]!\n"
56+
- " add.w r8, r8, %[astride]\n"
57+
+ ADD_W(r8, astride)
58+
" vld1.16 {d18, d19}, [r8]\n"
59+
- " add.w r8, r8, %[astride]\n"
60+
+ ADD_W(r8, astride)
61+
" vld1.16 {d20, d21}, [r8]\n"
62+
- " add.w r8, r8, %[astride]\n"
63+
+ ADD_W(r8, astride)
64+
" vld1.16 {d22, d23}, [r8]\n"
65+
" subs %[len], %[len], #8\n"
66+
" vmull.s16 q0, d16, d24\n"
67+
@@ -340,11 +352,11 @@ inner_product_gint32_cubic_1_neon (gint3
68+
"1:"
69+
" mov r8, %[b]\n"
70+
" vld1.32 {d16, d17}, [%[b]]!\n"
71+
- " add.w r8, r8, %[bstride]\n"
72+
+ ADD_W(r8, bstride)
73+
" vld1.32 {d18, d19}, [r8]\n"
74+
- " add.w r8, r8, %[bstride]\n"
75+
+ ADD_W(r8, bstride)
76+
" vld1.32 {d20, d21}, [r8]\n"
77+
- " add.w r8, r8, %[bstride]\n"
78+
+ ADD_W(r8, bstride)
79+
" vld1.32 {d22, d23}, [r8]\n"
80+
" vld1.32 {d24, d25}, [%[a]]!\n"
81+
" subs %[len], %[len], #4\n"
82+
@@ -426,11 +438,11 @@ interpolate_gint32_cubic_neon (gpointer
83+
"1:"
84+
" mov r8, %[a]\n"
85+
" vld1.32 {d16, d17}, [%[a]]!\n"
86+
- " add.w r8, r8, %[astride]\n"
87+
+ ADD_W(r8, astride)
88+
" vld1.32 {d18, d19}, [r8]\n"
89+
- " add.w r8, r8, %[astride]\n"
90+
+ ADD_W(r8, astride)
91+
" vld1.32 {d20, d21}, [r8]\n"
92+
- " add.w r8, r8, %[astride]\n"
93+
+ ADD_W(r8, astride)
94+
" vld1.32 {d22, d23}, [r8]\n"
95+
" subs %[len], %[len], #4\n"
96+
" vmull.s32 q0, d16, d24\n"
97+
@@ -545,11 +557,11 @@ inner_product_gfloat_cubic_1_neon (gfloa
98+
"1:"
99+
" mov r8, %[b]\n"
100+
" vld1.32 {q8}, [%[b]]!\n"
101+
- " add.w r8, r8, %[bstride]\n"
102+
+ ADD_W(r8, bstride)
103+
" vld1.32 {q9}, [r8]\n"
104+
- " add.w r8, r8, %[bstride]\n"
105+
+ ADD_W(r8, bstride)
106+
" vld1.32 {q10}, [r8]\n"
107+
- " add.w r8, r8, %[bstride]\n"
108+
+ ADD_W(r8, bstride)
109+
" vld1.32 {q11}, [r8]\n"
110+
" vld1.32 {q12}, [%[a]]!\n"
111+
" subs %[len], %[len], #4\n"
112+
@@ -623,11 +635,11 @@ interpolate_gfloat_cubic_neon (gpointer
113+
"1:"
114+
" mov r8, %[a]\n"
115+
" vld1.32 {q8}, [%[a]]!\n"
116+
- " add.w r8, r8, %[astride]\n"
117+
+ ADD_W(r8, astride)
118+
" vld1.32 {q9}, [r8]\n"
119+
- " add.w r8, r8, %[astride]\n"
120+
+ ADD_W(r8, astride)
121+
" vld1.32 {q10}, [r8]\n"
122+
- " add.w r8, r8, %[astride]\n"
123+
+ ADD_W(r8, astride)
124+
" vld1.32 {q11}, [r8]\n"
125+
" subs %[len], %[len], #4\n"
126+
" vmul.f32 q0, q8, q12\n"
127+
--- a/meson.build
128+
+++ b/meson.build
129+
@@ -457,10 +457,9 @@ if host_machine.cpu_family() == 'arm'
130+
#include <arm_neon.h>
131+
int32x4_t testfunc(int16_t *a, int16_t *b) {
132+
asm volatile ("vmull.s16 q0, d0, d0" : : : "q0");
133+
- asm volatile ("add.w r1, r0, r0" : : : "r0", "r1");
134+
return vmull_s16(vld1_s16(a), vld1_s16(b));
135+
}
136+
-''', name : 'NEON with 32-bit wide Thumb support')
137+
+''', name : 'NEON support')
138+
core_conf.set('HAVE_ARM_NEON', true)
139+
endif
140+
endif

0 commit comments

Comments
 (0)