Skip to content

Commit 5371599

Browse files
committed
gst1-plugins-base: fix NEON resampler build in ARM A32 mode
The NEON audio-resampler asm rewritten in 1.28 computes strides with the UAL wide mnemonic add.w. OpenWrt builds ARM in A32 (non-Thumb) mode, where gas is in divided syntax and rejects it ("bad instruction `add.w'"), breaking the build on every NEON target (e.g. cortex-a15). Upstream only builds ARM in Thumb mode so never hits this; 1.28.6 and main are still affected. Add a patch dropping the .w suffix: plain add selects the identical 32-bit encoding in A32, and in Thumb-2 the high-register/shift operands force the wide encoding anyway, so the emitted code is unchanged on both. Signed-off-by: Alexandru Ardelean <alex@shruggie.ro>
1 parent 8572c3f commit 5371599

1 file changed

Lines changed: 112 additions & 0 deletions

File tree

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
From 3664d240c434969e6e460faa323704a4c579261e Mon Sep 17 00:00:00 2001
2+
From: Alexandru Ardelean <alex@shruggie.ro>
3+
Date: Mon, 6 Jul 2026 12:15:25 +0300
4+
Subject: [PATCH] audio-resampler: assemble NEON inner loops in ARM (A32) mode
5+
6+
The NEON resampler asm rewritten in 1.28 computes strides with the UAL wide
7+
mnemonic add.w. OpenWrt builds ARM in A32 (non-Thumb) mode, where gas is in
8+
divided syntax and rejects it ("bad instruction `add.w`"), breaking the
9+
gst1-plugins-base build on every NEON target (e.g. cortex-a15). Upstream only
10+
builds ARM in Thumb mode so never hits this; 1.28.6 and main are still affected.
11+
12+
Drop the .w suffix: plain add selects the identical 32-bit encoding in A32, and
13+
in Thumb-2 the high-register/shift operands force the wide encoding anyway, so
14+
the generated code is unchanged on both. Reported upstream.
15+
16+
Signed-off-by: Alexandru Ardelean <alex@shruggie.ro>
17+
---
18+
gst-libs/gst/audio/audio-resampler-neon.h | 36 +++++++++++------------
19+
1 file changed, 18 insertions(+), 18 deletions(-)
20+
21+
--- a/gst-libs/gst/audio/audio-resampler-neon.h
22+
+++ b/gst-libs/gst/audio/audio-resampler-neon.h
23+
@@ -133,11 +133,11 @@ inner_product_gint16_cubic_1_neon (gint1
24+
"1:"
25+
" mov r8, %[b]\n"
26+
" vld1.16 {d16, d17}, [%[b]]!\n"
27+
- " add.w r8, r8, %[bstride]\n"
28+
+ " add r8, r8, %[bstride]\n"
29+
" vld1.16 {d18, d19}, [r8]\n"
30+
- " add.w r8, r8, %[bstride]\n"
31+
+ " add r8, r8, %[bstride]\n"
32+
" vld1.16 {d20, d21}, [r8]\n"
33+
- " add.w r8, r8, %[bstride]\n"
34+
+ " add r8, r8, %[bstride]\n"
35+
" vld1.16 {d22, d23}, [r8]\n"
36+
" vld1.16 {d24, d25}, [%[a]]!\n"
37+
" subs %[len], %[len], #8\n"
38+
@@ -214,11 +214,11 @@ interpolate_gint16_cubic_neon (gpointer
39+
"1:"
40+
" mov r8, %[a]\n"
41+
" vld1.16 {d16, d17}, [%[a]]!\n"
42+
- " add.w r8, r8, %[astride]\n"
43+
+ " add r8, r8, %[astride]\n"
44+
" vld1.16 {d18, d19}, [r8]\n"
45+
- " add.w r8, r8, %[astride]\n"
46+
+ " add r8, r8, %[astride]\n"
47+
" vld1.16 {d20, d21}, [r8]\n"
48+
- " add.w r8, r8, %[astride]\n"
49+
+ " add r8, r8, %[astride]\n"
50+
" vld1.16 {d22, d23}, [r8]\n"
51+
" subs %[len], %[len], #8\n"
52+
" vmull.s16 q0, d16, d24\n"
53+
@@ -340,11 +340,11 @@ inner_product_gint32_cubic_1_neon (gint3
54+
"1:"
55+
" mov r8, %[b]\n"
56+
" vld1.32 {d16, d17}, [%[b]]!\n"
57+
- " add.w r8, r8, %[bstride]\n"
58+
+ " add r8, r8, %[bstride]\n"
59+
" vld1.32 {d18, d19}, [r8]\n"
60+
- " add.w r8, r8, %[bstride]\n"
61+
+ " add r8, r8, %[bstride]\n"
62+
" vld1.32 {d20, d21}, [r8]\n"
63+
- " add.w r8, r8, %[bstride]\n"
64+
+ " add r8, r8, %[bstride]\n"
65+
" vld1.32 {d22, d23}, [r8]\n"
66+
" vld1.32 {d24, d25}, [%[a]]!\n"
67+
" subs %[len], %[len], #4\n"
68+
@@ -426,11 +426,11 @@ interpolate_gint32_cubic_neon (gpointer
69+
"1:"
70+
" mov r8, %[a]\n"
71+
" vld1.32 {d16, d17}, [%[a]]!\n"
72+
- " add.w r8, r8, %[astride]\n"
73+
+ " add r8, r8, %[astride]\n"
74+
" vld1.32 {d18, d19}, [r8]\n"
75+
- " add.w r8, r8, %[astride]\n"
76+
+ " add r8, r8, %[astride]\n"
77+
" vld1.32 {d20, d21}, [r8]\n"
78+
- " add.w r8, r8, %[astride]\n"
79+
+ " add r8, r8, %[astride]\n"
80+
" vld1.32 {d22, d23}, [r8]\n"
81+
" subs %[len], %[len], #4\n"
82+
" vmull.s32 q0, d16, d24\n"
83+
@@ -545,11 +545,11 @@ inner_product_gfloat_cubic_1_neon (gfloa
84+
"1:"
85+
" mov r8, %[b]\n"
86+
" vld1.32 {q8}, [%[b]]!\n"
87+
- " add.w r8, r8, %[bstride]\n"
88+
+ " add r8, r8, %[bstride]\n"
89+
" vld1.32 {q9}, [r8]\n"
90+
- " add.w r8, r8, %[bstride]\n"
91+
+ " add r8, r8, %[bstride]\n"
92+
" vld1.32 {q10}, [r8]\n"
93+
- " add.w r8, r8, %[bstride]\n"
94+
+ " add r8, r8, %[bstride]\n"
95+
" vld1.32 {q11}, [r8]\n"
96+
" vld1.32 {q12}, [%[a]]!\n"
97+
" subs %[len], %[len], #4\n"
98+
@@ -623,11 +623,11 @@ interpolate_gfloat_cubic_neon (gpointer
99+
"1:"
100+
" mov r8, %[a]\n"
101+
" vld1.32 {q8}, [%[a]]!\n"
102+
- " add.w r8, r8, %[astride]\n"
103+
+ " add r8, r8, %[astride]\n"
104+
" vld1.32 {q9}, [r8]\n"
105+
- " add.w r8, r8, %[astride]\n"
106+
+ " add r8, r8, %[astride]\n"
107+
" vld1.32 {q10}, [r8]\n"
108+
- " add.w r8, r8, %[astride]\n"
109+
+ " add r8, r8, %[astride]\n"
110+
" vld1.32 {q11}, [r8]\n"
111+
" subs %[len], %[len], #4\n"
112+
" vmul.f32 q0, q8, q12\n"

0 commit comments

Comments
 (0)