• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
3 *
4 * This file is part of libswresample.
5 *
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.
10 *
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.
15 *
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
19 */
20
21#include "config.h"
22#include "libavutil/arm/asm.S"
23
24function swri_oldapi_conv_flt_to_s16_neon, export=1
25.L_swri_oldapi_conv_flt_to_s16_neon:
26        subs            r2,  r2,  #8
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
31        beq             3f
32        bics            r12, r2,  #15
33        beq             2f
341:      subs            r12, r12, #16
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]!
49        bne             1b
50        ands            r2,  r2,  #15
51        beq             3f
522:      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]!
62        bx              lr
633:      vqrshrn.s32     d4,  q8,  #16
64        vqrshrn.s32     d5,  q9,  #16
65        vst1.16         {q2},     [r0,:128]!
66        bx              lr
67endfunc
68
69function swri_oldapi_conv_fltp_to_s16_2ch_neon, export=1
70.L_swri_oldapi_conv_fltp_to_s16_2ch_neon:
71        ldm             r1,  {r1, r3}
72        subs            r2,  r2,  #8
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
81        beq             3f
82        bics            r12, r2,  #15
83        beq             2f
841:      subs            r12, r12, #16
85        vld1.32         {q0},     [r1,:128]!
86        vcvt.s32.f32    q0,  q0,  #31
87        vsri.32         q10, q8,  #16
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]!
93        vsri.32         q11, q9,  #16
94        vst1.16         {q10},    [r0,:128]!
95        vcvt.s32.f32    q13, q13, #31
96        vst1.16         {q11},    [r0,:128]!
97        vsri.32         q12, q0,  #16
98        vld1.32         {q8},     [r1,:128]!
99        vsri.32         q13, q1,  #16
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]!
109        bne             1b
110        ands            r2,  r2,  #15
111        beq             3f
1122:      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
119        vsri.32         q11, q9,  #16
120        vld1.32         {q13},    [r3,:128]!
121        vcvt.s32.f32    q13, q13, #31
122        vst1.16         {q10},    [r0,:128]!
123        vsri.32         q12, q0,  #16
124        vst1.16         {q11},    [r0,:128]!
125        vsri.32         q13, q1,  #16
126        vst1.16         {q12-q13},[r0,:128]!
127        bx              lr
1283:      vsri.32         q10, q8,  #16
129        vsri.32         q11, q9,  #16
130        vst1.16         {q10-q11},[r0,:128]!
131        bx              lr
132endfunc
133
134function swri_oldapi_conv_fltp_to_s16_nch_neon, export=1
135        cmp             r3,  #2
136        itt             lt
137        ldrlt           r1,  [r1]
138        blt             .L_swri_oldapi_conv_flt_to_s16_neon
139        beq             .L_swri_oldapi_conv_fltp_to_s16_2ch_neon
140
141        push            {r4-r8, lr}
142        cmp             r3,  #4
143        lsl             r12, r3,  #1
144        blt             4f
145
146        @ 4 channels
1475:      ldm             r1!, {r4-r7}
148        mov             lr,  r2
149        mov             r8,  r0
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
1586:      subs            lr,  lr,  #8
159        vld1.32         {q0},     [r4,:128]!
160        vcvt.s32.f32    q0,  q0,  #31
161        vsri.32         q9,  q8,  #16
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
167        vzip.32         d18, d22
168        vld1.32         {q3},     [r7,:128]!
169        vcvt.s32.f32    q3,  q3,  #31
170        vzip.32         d19, d23
171        vst1.16         {d18},    [r8], r12
172        vsri.32         q1,  q0,  #16
173        vst1.16         {d22},    [r8], r12
174        vsri.32         q3,  q2,  #16
175        vst1.16         {d19},    [r8], r12
176        vzip.32         d2,  d6
177        vst1.16         {d23},    [r8], r12
178        vzip.32         d3,  d7
179        beq             7f
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
192        b               6b
1937:      vst1.16         {d2},     [r8], r12
194        vst1.16         {d6},     [r8], r12
195        vst1.16         {d3},     [r8], r12
196        vst1.16         {d7},     [r8], r12
197        subs            r3,  r3,  #4
198        it              eq
199        popeq           {r4-r8, pc}
200        cmp             r3,  #4
201        add             r0,  r0,  #8
202        bge             5b
203
204        @ 2 channels
2054:      cmp             r3,  #2
206        blt             4f
207        ldm             r1!, {r4-r5}
208        mov             lr,  r2
209        mov             r8,  r0
210        tst             lr,  #8
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
219        beq             6f
220        subs            lr,  lr,  #8
221        beq             7f
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
2426:      subs            lr,  lr,  #16
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
258        vsri.32         d2,  d0,  #16
259        vst1.32         {d19[1]}, [r8], r12
260        vsri.32         d3,  d1,  #16
261        vst1.32         {d22[0]}, [r8], r12
262        vsri.32         d6,  d4,  #16
263        vst1.32         {d22[1]}, [r8], r12
264        vsri.32         d7,  d5,  #16
265        vst1.32         {d23[0]}, [r8], r12
266        vst1.32         {d23[1]}, [r8], r12
267        beq             6f
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
284        bgt             6b
2856:      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
293        b               8f
2947:      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
3068:      subs            r3,  r3,  #2
307        add             r0,  r0,  #4
308        it              eq
309        popeq           {r4-r8, pc}
310
311        @ 1 channel
3124:      ldr             r4,  [r1]
313        tst             r2,  #8
314        mov             lr,  r2
315        mov             r5,  r0
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
320        bne             8f
3216:      subs            lr,  lr,  #16
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
334        beq             7f
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
3397:      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
347        bgt             6b
348        pop             {r4-r8, pc}
3498:      subs            lr,  lr,  #8
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
358        it              eq
359        popeq           {r4-r8, pc}
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
364        b               6b
365endfunc
366