blob: e9c9eb7de7dfe422ad3465d140899ca3f981567c [file] [log] [blame]
Andrew Geissler87f5cff2022-09-30 13:13:31 -05001From: James Cowgill <jcowgill@debian.org>
2Date: Sun, 11 Aug 2019 16:50:56 +0100
3Subject: avcodec/arm/sbcenc: avoid callee preserved vfp registers
4
5When compiling FFmpeg with GCC-9, some very random segfaults were
6observed in code which had previously called down into the SBC encoder
7NEON assembly routines. This was caused by these functions clobbering
8some of the vfp callee saved registers (d8 - d15 aka q4 - q7). GCC was
9using these registers to save local variables, but after these
10functions returned, they would contain garbage.
11
12Fix by reallocating the registers in the two affected functions in
13the following way:
14 ff_sbc_analyze_4_neon: q2-q5 => q8-q11, then q1-q4 => q8-q11
15 ff_sbc_analyze_8_neon: q2-q9 => q8-q15
16
17The reason for using these replacements is to keep closely related
18sets of registers consecutively numbered which hopefully makes the
19code more easy to follow. Since this commit only reallocates
20registers, it should have no performance impact.
21
22Upstream-status: Pending
23
24Signed-off-by: James Cowgill <jcowgill@debian.org>
25---
26 libavcodec/arm/sbcdsp_neon.S | 220 +++++++++++++++++++++----------------------
27 1 file changed, 110 insertions(+), 110 deletions(-)
28
29diff --git a/libavcodec/arm/sbcdsp_neon.S b/libavcodec/arm/sbcdsp_neon.S
30index d83d21d..914abfb 100644
31--- a/libavcodec/arm/sbcdsp_neon.S
32+++ b/libavcodec/arm/sbcdsp_neon.S
33@@ -38,49 +38,49 @@ function ff_sbc_analyze_4_neon, export=1
34 /* TODO: merge even and odd cases (or even merge all four calls to this
35 * function) in order to have only aligned reads from 'in' array
36 * and reduce number of load instructions */
37- vld1.16 {d4, d5}, [r0, :64]!
38- vld1.16 {d8, d9}, [r2, :128]!
39+ vld1.16 {d16, d17}, [r0, :64]!
40+ vld1.16 {d20, d21}, [r2, :128]!
41
42- vmull.s16 q0, d4, d8
43- vld1.16 {d6, d7}, [r0, :64]!
44- vmull.s16 q1, d5, d9
45- vld1.16 {d10, d11}, [r2, :128]!
46+ vmull.s16 q0, d16, d20
47+ vld1.16 {d18, d19}, [r0, :64]!
48+ vmull.s16 q1, d17, d21
49+ vld1.16 {d22, d23}, [r2, :128]!
50
51- vmlal.s16 q0, d6, d10
52- vld1.16 {d4, d5}, [r0, :64]!
53- vmlal.s16 q1, d7, d11
54- vld1.16 {d8, d9}, [r2, :128]!
55+ vmlal.s16 q0, d18, d22
56+ vld1.16 {d16, d17}, [r0, :64]!
57+ vmlal.s16 q1, d19, d23
58+ vld1.16 {d20, d21}, [r2, :128]!
59
60- vmlal.s16 q0, d4, d8
61- vld1.16 {d6, d7}, [r0, :64]!
62- vmlal.s16 q1, d5, d9
63- vld1.16 {d10, d11}, [r2, :128]!
64+ vmlal.s16 q0, d16, d20
65+ vld1.16 {d18, d19}, [r0, :64]!
66+ vmlal.s16 q1, d17, d21
67+ vld1.16 {d22, d23}, [r2, :128]!
68
69- vmlal.s16 q0, d6, d10
70- vld1.16 {d4, d5}, [r0, :64]!
71- vmlal.s16 q1, d7, d11
72- vld1.16 {d8, d9}, [r2, :128]!
73+ vmlal.s16 q0, d18, d22
74+ vld1.16 {d16, d17}, [r0, :64]!
75+ vmlal.s16 q1, d19, d23
76+ vld1.16 {d20, d21}, [r2, :128]!
77
78- vmlal.s16 q0, d4, d8
79- vmlal.s16 q1, d5, d9
80+ vmlal.s16 q0, d16, d20
81+ vmlal.s16 q1, d17, d21
82
83 vpadd.s32 d0, d0, d1
84 vpadd.s32 d1, d2, d3
85
86 vrshrn.s32 d0, q0, SBC_PROTO_FIXED_SCALE
87
88- vld1.16 {d2, d3, d4, d5}, [r2, :128]!
89+ vld1.16 {d16, d17, d18, d19}, [r2, :128]!
90
91 vdup.i32 d1, d0[1] /* TODO: can be eliminated */
92 vdup.i32 d0, d0[0] /* TODO: can be eliminated */
93
94- vmull.s16 q3, d2, d0
95- vmull.s16 q4, d3, d0
96- vmlal.s16 q3, d4, d1
97- vmlal.s16 q4, d5, d1
98+ vmull.s16 q10, d16, d0
99+ vmull.s16 q11, d17, d0
100+ vmlal.s16 q10, d18, d1
101+ vmlal.s16 q11, d19, d1
102
103- vpadd.s32 d0, d6, d7 /* TODO: can be eliminated */
104- vpadd.s32 d1, d8, d9 /* TODO: can be eliminated */
105+ vpadd.s32 d0, d20, d21 /* TODO: can be eliminated */
106+ vpadd.s32 d1, d22, d23 /* TODO: can be eliminated */
107
108 vst1.32 {d0, d1}, [r1, :128]
109
110@@ -91,57 +91,57 @@ function ff_sbc_analyze_8_neon, export=1
111 /* TODO: merge even and odd cases (or even merge all four calls to this
112 * function) in order to have only aligned reads from 'in' array
113 * and reduce number of load instructions */
114- vld1.16 {d4, d5}, [r0, :64]!
115- vld1.16 {d8, d9}, [r2, :128]!
116-
117- vmull.s16 q6, d4, d8
118- vld1.16 {d6, d7}, [r0, :64]!
119- vmull.s16 q7, d5, d9
120- vld1.16 {d10, d11}, [r2, :128]!
121- vmull.s16 q8, d6, d10
122- vld1.16 {d4, d5}, [r0, :64]!
123- vmull.s16 q9, d7, d11
124- vld1.16 {d8, d9}, [r2, :128]!
125-
126- vmlal.s16 q6, d4, d8
127- vld1.16 {d6, d7}, [r0, :64]!
128- vmlal.s16 q7, d5, d9
129- vld1.16 {d10, d11}, [r2, :128]!
130- vmlal.s16 q8, d6, d10
131- vld1.16 {d4, d5}, [r0, :64]!
132- vmlal.s16 q9, d7, d11
133- vld1.16 {d8, d9}, [r2, :128]!
134-
135- vmlal.s16 q6, d4, d8
136- vld1.16 {d6, d7}, [r0, :64]!
137- vmlal.s16 q7, d5, d9
138- vld1.16 {d10, d11}, [r2, :128]!
139- vmlal.s16 q8, d6, d10
140- vld1.16 {d4, d5}, [r0, :64]!
141- vmlal.s16 q9, d7, d11
142- vld1.16 {d8, d9}, [r2, :128]!
143-
144- vmlal.s16 q6, d4, d8
145- vld1.16 {d6, d7}, [r0, :64]!
146- vmlal.s16 q7, d5, d9
147- vld1.16 {d10, d11}, [r2, :128]!
148- vmlal.s16 q8, d6, d10
149- vld1.16 {d4, d5}, [r0, :64]!
150- vmlal.s16 q9, d7, d11
151- vld1.16 {d8, d9}, [r2, :128]!
152-
153- vmlal.s16 q6, d4, d8
154- vld1.16 {d6, d7}, [r0, :64]!
155- vmlal.s16 q7, d5, d9
156- vld1.16 {d10, d11}, [r2, :128]!
157-
158- vmlal.s16 q8, d6, d10
159- vmlal.s16 q9, d7, d11
160-
161- vpadd.s32 d0, d12, d13
162- vpadd.s32 d1, d14, d15
163- vpadd.s32 d2, d16, d17
164- vpadd.s32 d3, d18, d19
165+ vld1.16 {d16, d17}, [r0, :64]!
166+ vld1.16 {d20, d21}, [r2, :128]!
167+
168+ vmull.s16 q12, d16, d20
169+ vld1.16 {d18, d19}, [r0, :64]!
170+ vmull.s16 q13, d17, d21
171+ vld1.16 {d22, d23}, [r2, :128]!
172+ vmull.s16 q14, d18, d22
173+ vld1.16 {d16, d17}, [r0, :64]!
174+ vmull.s16 q15, d19, d23
175+ vld1.16 {d20, d21}, [r2, :128]!
176+
177+ vmlal.s16 q12, d16, d20
178+ vld1.16 {d18, d19}, [r0, :64]!
179+ vmlal.s16 q13, d17, d21
180+ vld1.16 {d22, d23}, [r2, :128]!
181+ vmlal.s16 q14, d18, d22
182+ vld1.16 {d16, d17}, [r0, :64]!
183+ vmlal.s16 q15, d19, d23
184+ vld1.16 {d20, d21}, [r2, :128]!
185+
186+ vmlal.s16 q12, d16, d20
187+ vld1.16 {d18, d19}, [r0, :64]!
188+ vmlal.s16 q13, d17, d21
189+ vld1.16 {d22, d23}, [r2, :128]!
190+ vmlal.s16 q14, d18, d22
191+ vld1.16 {d16, d17}, [r0, :64]!
192+ vmlal.s16 q15, d19, d23
193+ vld1.16 {d20, d21}, [r2, :128]!
194+
195+ vmlal.s16 q12, d16, d20
196+ vld1.16 {d18, d19}, [r0, :64]!
197+ vmlal.s16 q13, d17, d21
198+ vld1.16 {d22, d23}, [r2, :128]!
199+ vmlal.s16 q14, d18, d22
200+ vld1.16 {d16, d17}, [r0, :64]!
201+ vmlal.s16 q15, d19, d23
202+ vld1.16 {d20, d21}, [r2, :128]!
203+
204+ vmlal.s16 q12, d16, d20
205+ vld1.16 {d18, d19}, [r0, :64]!
206+ vmlal.s16 q13, d17, d21
207+ vld1.16 {d22, d23}, [r2, :128]!
208+
209+ vmlal.s16 q14, d18, d22
210+ vmlal.s16 q15, d19, d23
211+
212+ vpadd.s32 d0, d24, d25
213+ vpadd.s32 d1, d26, d27
214+ vpadd.s32 d2, d28, d29
215+ vpadd.s32 d3, d30, d31
216
217 vrshr.s32 q0, q0, SBC_PROTO_FIXED_SCALE
218 vrshr.s32 q1, q1, SBC_PROTO_FIXED_SCALE
219@@ -153,38 +153,38 @@ function ff_sbc_analyze_8_neon, export=1
220 vdup.i32 d1, d0[1] /* TODO: can be eliminated */
221 vdup.i32 d0, d0[0] /* TODO: can be eliminated */
222
223- vld1.16 {d4, d5}, [r2, :128]!
224- vmull.s16 q6, d4, d0
225- vld1.16 {d6, d7}, [r2, :128]!
226- vmull.s16 q7, d5, d0
227- vmull.s16 q8, d6, d0
228- vmull.s16 q9, d7, d0
229-
230- vld1.16 {d4, d5}, [r2, :128]!
231- vmlal.s16 q6, d4, d1
232- vld1.16 {d6, d7}, [r2, :128]!
233- vmlal.s16 q7, d5, d1
234- vmlal.s16 q8, d6, d1
235- vmlal.s16 q9, d7, d1
236-
237- vld1.16 {d4, d5}, [r2, :128]!
238- vmlal.s16 q6, d4, d2
239- vld1.16 {d6, d7}, [r2, :128]!
240- vmlal.s16 q7, d5, d2
241- vmlal.s16 q8, d6, d2
242- vmlal.s16 q9, d7, d2
243-
244- vld1.16 {d4, d5}, [r2, :128]!
245- vmlal.s16 q6, d4, d3
246- vld1.16 {d6, d7}, [r2, :128]!
247- vmlal.s16 q7, d5, d3
248- vmlal.s16 q8, d6, d3
249- vmlal.s16 q9, d7, d3
250-
251- vpadd.s32 d0, d12, d13 /* TODO: can be eliminated */
252- vpadd.s32 d1, d14, d15 /* TODO: can be eliminated */
253- vpadd.s32 d2, d16, d17 /* TODO: can be eliminated */
254- vpadd.s32 d3, d18, d19 /* TODO: can be eliminated */
255+ vld1.16 {d16, d17}, [r2, :128]!
256+ vmull.s16 q12, d16, d0
257+ vld1.16 {d18, d19}, [r2, :128]!
258+ vmull.s16 q13, d17, d0
259+ vmull.s16 q14, d18, d0
260+ vmull.s16 q15, d19, d0
261+
262+ vld1.16 {d16, d17}, [r2, :128]!
263+ vmlal.s16 q12, d16, d1
264+ vld1.16 {d18, d19}, [r2, :128]!
265+ vmlal.s16 q13, d17, d1
266+ vmlal.s16 q14, d18, d1
267+ vmlal.s16 q15, d19, d1
268+
269+ vld1.16 {d16, d17}, [r2, :128]!
270+ vmlal.s16 q12, d16, d2
271+ vld1.16 {d18, d19}, [r2, :128]!
272+ vmlal.s16 q13, d17, d2
273+ vmlal.s16 q14, d18, d2
274+ vmlal.s16 q15, d19, d2
275+
276+ vld1.16 {d16, d17}, [r2, :128]!
277+ vmlal.s16 q12, d16, d3
278+ vld1.16 {d18, d19}, [r2, :128]!
279+ vmlal.s16 q13, d17, d3
280+ vmlal.s16 q14, d18, d3
281+ vmlal.s16 q15, d19, d3
282+
283+ vpadd.s32 d0, d24, d25 /* TODO: can be eliminated */
284+ vpadd.s32 d1, d26, d27 /* TODO: can be eliminated */
285+ vpadd.s32 d2, d28, d29 /* TODO: can be eliminated */
286+ vpadd.s32 d3, d30, d31 /* TODO: can be eliminated */
287
288 vst1.32 {d0, d1, d2, d3}, [r1, :128]