2 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
4 * This file is part of libswresample.
6 * libswresample is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * libswresample is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with libswresample; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "libavutil/arm/asm.S"
24 function swri_oldapi_conv_flt_to_s16_neon, export=1
25 _swri_oldapi_conv_flt_to_s16_neon:
27 vld1.32 {q0}, [r1,:128]!
28 vcvt.s32.f32 q8, q0, #31
29 vld1.32 {q1}, [r1,:128]!
30 vcvt.s32.f32 q9, q1, #31
35 vqrshrn.s32 d4, q8, #16
36 vld1.32 {q0}, [r1,:128]!
37 vcvt.s32.f32 q0, q0, #31
38 vqrshrn.s32 d5, q9, #16
39 vld1.32 {q1}, [r1,:128]!
40 vcvt.s32.f32 q1, q1, #31
41 vqrshrn.s32 d6, q0, #16
42 vst1.16 {q2}, [r0,:128]!
43 vqrshrn.s32 d7, q1, #16
44 vld1.32 {q8}, [r1,:128]!
45 vcvt.s32.f32 q8, q8, #31
46 vld1.32 {q9}, [r1,:128]!
47 vcvt.s32.f32 q9, q9, #31
48 vst1.16 {q3}, [r0,:128]!
52 2: vld1.32 {q0}, [r1,:128]!
53 vqrshrn.s32 d4, q8, #16
54 vcvt.s32.f32 q0, q0, #31
55 vld1.32 {q1}, [r1,:128]!
56 vqrshrn.s32 d5, q9, #16
57 vcvt.s32.f32 q1, q1, #31
58 vqrshrn.s32 d6, q0, #16
59 vst1.16 {q2}, [r0,:128]!
60 vqrshrn.s32 d7, q1, #16
61 vst1.16 {q3}, [r0,:128]!
63 3: vqrshrn.s32 d4, q8, #16
64 vqrshrn.s32 d5, q9, #16
65 vst1.16 {q2}, [r0,:128]!
69 function swri_oldapi_conv_fltp_to_s16_2ch_neon, export=1
70 _swri_oldapi_conv_fltp_to_s16_2ch_neon:
73 vld1.32 {q0}, [r1,:128]!
74 vcvt.s32.f32 q8, q0, #31
75 vld1.32 {q1}, [r1,:128]!
76 vcvt.s32.f32 q9, q1, #31
77 vld1.32 {q10}, [r3,:128]!
78 vcvt.s32.f32 q10, q10, #31
79 vld1.32 {q11}, [r3,:128]!
80 vcvt.s32.f32 q11, q11, #31
85 vld1.32 {q0}, [r1,:128]!
86 vcvt.s32.f32 q0, q0, #31
88 vld1.32 {q1}, [r1,:128]!
89 vcvt.s32.f32 q1, q1, #31
90 vld1.32 {q12}, [r3,:128]!
91 vcvt.s32.f32 q12, q12, #31
92 vld1.32 {q13}, [r3,:128]!
94 vst1.16 {q10}, [r0,:128]!
95 vcvt.s32.f32 q13, q13, #31
96 vst1.16 {q11}, [r0,:128]!
98 vld1.32 {q8}, [r1,:128]!
100 vst1.16 {q12}, [r0,:128]!
101 vcvt.s32.f32 q8, q8, #31
102 vld1.32 {q9}, [r1,:128]!
103 vcvt.s32.f32 q9, q9, #31
104 vld1.32 {q10}, [r3,:128]!
105 vcvt.s32.f32 q10, q10, #31
106 vld1.32 {q11}, [r3,:128]!
107 vcvt.s32.f32 q11, q11, #31
108 vst1.16 {q13}, [r0,:128]!
112 2: vsri.32 q10, q8, #16
113 vld1.32 {q0}, [r1,:128]!
114 vcvt.s32.f32 q0, q0, #31
115 vld1.32 {q1}, [r1,:128]!
116 vcvt.s32.f32 q1, q1, #31
117 vld1.32 {q12}, [r3,:128]!
118 vcvt.s32.f32 q12, q12, #31
120 vld1.32 {q13}, [r3,:128]!
121 vcvt.s32.f32 q13, q13, #31
122 vst1.16 {q10}, [r0,:128]!
124 vst1.16 {q11}, [r0,:128]!
126 vst1.16 {q12-q13},[r0,:128]!
128 3: vsri.32 q10, q8, #16
130 vst1.16 {q10-q11},[r0,:128]!
134 function swri_oldapi_conv_fltp_to_s16_nch_neon, export=1
138 blt _swri_oldapi_conv_flt_to_s16_neon
139 beq _swri_oldapi_conv_fltp_to_s16_2ch_neon
150 vld1.32 {q8}, [r4,:128]!
151 vcvt.s32.f32 q8, q8, #31
152 vld1.32 {q9}, [r5,:128]!
153 vcvt.s32.f32 q9, q9, #31
154 vld1.32 {q10}, [r6,:128]!
155 vcvt.s32.f32 q10, q10, #31
156 vld1.32 {q11}, [r7,:128]!
157 vcvt.s32.f32 q11, q11, #31
159 vld1.32 {q0}, [r4,:128]!
160 vcvt.s32.f32 q0, q0, #31
162 vld1.32 {q1}, [r5,:128]!
163 vcvt.s32.f32 q1, q1, #31
164 vsri.32 q11, q10, #16
165 vld1.32 {q2}, [r6,:128]!
166 vcvt.s32.f32 q2, q2, #31
168 vld1.32 {q3}, [r7,:128]!
169 vcvt.s32.f32 q3, q3, #31
171 vst1.16 {d18}, [r8], r12
173 vst1.16 {d22}, [r8], r12
175 vst1.16 {d19}, [r8], r12
177 vst1.16 {d23}, [r8], r12
180 vld1.32 {q8}, [r4,:128]!
181 vcvt.s32.f32 q8, q8, #31
182 vst1.16 {d2}, [r8], r12
183 vld1.32 {q9}, [r5,:128]!
184 vcvt.s32.f32 q9, q9, #31
185 vst1.16 {d6}, [r8], r12
186 vld1.32 {q10}, [r6,:128]!
187 vcvt.s32.f32 q10, q10, #31
188 vst1.16 {d3}, [r8], r12
189 vld1.32 {q11}, [r7,:128]!
190 vcvt.s32.f32 q11, q11, #31
191 vst1.16 {d7}, [r8], r12
193 7: vst1.16 {d2}, [r8], r12
194 vst1.16 {d6}, [r8], r12
195 vst1.16 {d3}, [r8], r12
196 vst1.16 {d7}, [r8], r12
211 vld1.32 {q8}, [r4,:128]!
212 vcvt.s32.f32 q8, q8, #31
213 vld1.32 {q9}, [r5,:128]!
214 vcvt.s32.f32 q9, q9, #31
215 vld1.32 {q10}, [r4,:128]!
216 vcvt.s32.f32 q10, q10, #31
217 vld1.32 {q11}, [r5,:128]!
218 vcvt.s32.f32 q11, q11, #31
222 vsri.32 d18, d16, #16
223 vsri.32 d19, d17, #16
224 vld1.32 {q8}, [r4,:128]!
225 vcvt.s32.f32 q8, q8, #31
226 vst1.32 {d18[0]}, [r8], r12
227 vsri.32 d22, d20, #16
228 vst1.32 {d18[1]}, [r8], r12
229 vsri.32 d23, d21, #16
230 vst1.32 {d19[0]}, [r8], r12
231 vst1.32 {d19[1]}, [r8], r12
232 vld1.32 {q9}, [r5,:128]!
233 vcvt.s32.f32 q9, q9, #31
234 vst1.32 {d22[0]}, [r8], r12
235 vst1.32 {d22[1]}, [r8], r12
236 vld1.32 {q10}, [r4,:128]!
237 vcvt.s32.f32 q10, q10, #31
238 vst1.32 {d23[0]}, [r8], r12
239 vst1.32 {d23[1]}, [r8], r12
240 vld1.32 {q11}, [r5,:128]!
241 vcvt.s32.f32 q11, q11, #31
243 vld1.32 {q0}, [r4,:128]!
244 vcvt.s32.f32 q0, q0, #31
245 vsri.32 d18, d16, #16
246 vld1.32 {q1}, [r5,:128]!
247 vcvt.s32.f32 q1, q1, #31
248 vsri.32 d19, d17, #16
249 vld1.32 {q2}, [r4,:128]!
250 vcvt.s32.f32 q2, q2, #31
251 vld1.32 {q3}, [r5,:128]!
252 vcvt.s32.f32 q3, q3, #31
253 vst1.32 {d18[0]}, [r8], r12
254 vsri.32 d22, d20, #16
255 vst1.32 {d18[1]}, [r8], r12
256 vsri.32 d23, d21, #16
257 vst1.32 {d19[0]}, [r8], r12
259 vst1.32 {d19[1]}, [r8], r12
261 vst1.32 {d22[0]}, [r8], r12
263 vst1.32 {d22[1]}, [r8], r12
265 vst1.32 {d23[0]}, [r8], r12
266 vst1.32 {d23[1]}, [r8], r12
268 vld1.32 {q8}, [r4,:128]!
269 vcvt.s32.f32 q8, q8, #31
270 vst1.32 {d2[0]}, [r8], r12
271 vst1.32 {d2[1]}, [r8], r12
272 vld1.32 {q9}, [r5,:128]!
273 vcvt.s32.f32 q9, q9, #31
274 vst1.32 {d3[0]}, [r8], r12
275 vst1.32 {d3[1]}, [r8], r12
276 vld1.32 {q10}, [r4,:128]!
277 vcvt.s32.f32 q10, q10, #31
278 vst1.32 {d6[0]}, [r8], r12
279 vst1.32 {d6[1]}, [r8], r12
280 vld1.32 {q11}, [r5,:128]!
281 vcvt.s32.f32 q11, q11, #31
282 vst1.32 {d7[0]}, [r8], r12
283 vst1.32 {d7[1]}, [r8], r12
285 6: vst1.32 {d2[0]}, [r8], r12
286 vst1.32 {d2[1]}, [r8], r12
287 vst1.32 {d3[0]}, [r8], r12
288 vst1.32 {d3[1]}, [r8], r12
289 vst1.32 {d6[0]}, [r8], r12
290 vst1.32 {d6[1]}, [r8], r12
291 vst1.32 {d7[0]}, [r8], r12
292 vst1.32 {d7[1]}, [r8], r12
294 7: vsri.32 d18, d16, #16
295 vsri.32 d19, d17, #16
296 vst1.32 {d18[0]}, [r8], r12
297 vsri.32 d22, d20, #16
298 vst1.32 {d18[1]}, [r8], r12
299 vsri.32 d23, d21, #16
300 vst1.32 {d19[0]}, [r8], r12
301 vst1.32 {d19[1]}, [r8], r12
302 vst1.32 {d22[0]}, [r8], r12
303 vst1.32 {d22[1]}, [r8], r12
304 vst1.32 {d23[0]}, [r8], r12
305 vst1.32 {d23[1]}, [r8], r12
316 vld1.32 {q0}, [r4,:128]!
317 vcvt.s32.f32 q0, q0, #31
318 vld1.32 {q1}, [r4,:128]!
319 vcvt.s32.f32 q1, q1, #31
322 vld1.32 {q2}, [r4,:128]!
323 vcvt.s32.f32 q2, q2, #31
324 vld1.32 {q3}, [r4,:128]!
325 vcvt.s32.f32 q3, q3, #31
326 vst1.16 {d0[1]}, [r5,:16], r12
327 vst1.16 {d0[3]}, [r5,:16], r12
328 vst1.16 {d1[1]}, [r5,:16], r12
329 vst1.16 {d1[3]}, [r5,:16], r12
330 vst1.16 {d2[1]}, [r5,:16], r12
331 vst1.16 {d2[3]}, [r5,:16], r12
332 vst1.16 {d3[1]}, [r5,:16], r12
333 vst1.16 {d3[3]}, [r5,:16], r12
335 vld1.32 {q0}, [r4,:128]!
336 vcvt.s32.f32 q0, q0, #31
337 vld1.32 {q1}, [r4,:128]!
338 vcvt.s32.f32 q1, q1, #31
339 7: vst1.16 {d4[1]}, [r5,:16], r12
340 vst1.16 {d4[3]}, [r5,:16], r12
341 vst1.16 {d5[1]}, [r5,:16], r12
342 vst1.16 {d5[3]}, [r5,:16], r12
343 vst1.16 {d6[1]}, [r5,:16], r12
344 vst1.16 {d6[3]}, [r5,:16], r12
345 vst1.16 {d7[1]}, [r5,:16], r12
346 vst1.16 {d7[3]}, [r5,:16], r12
350 vst1.16 {d0[1]}, [r5,:16], r12
351 vst1.16 {d0[3]}, [r5,:16], r12
352 vst1.16 {d1[1]}, [r5,:16], r12
353 vst1.16 {d1[3]}, [r5,:16], r12
354 vst1.16 {d2[1]}, [r5,:16], r12
355 vst1.16 {d2[3]}, [r5,:16], r12
356 vst1.16 {d3[1]}, [r5,:16], r12
357 vst1.16 {d3[3]}, [r5,:16], r12
360 vld1.32 {q0}, [r4,:128]!
361 vcvt.s32.f32 q0, q0, #31
362 vld1.32 {q1}, [r4,:128]!
363 vcvt.s32.f32 q1, q1, #31