1/*
2 * ARM NEON optimised DSP functions
3 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#include "config.h"
23#include "asm.S"
24
25        preserve8
26        .text
27
28        .macro pixels16 avg=0
29.if \avg
30        mov             ip,  r0
31.endif
321:      vld1.64         {d0, d1},  [r1], r2
33        vld1.64         {d2, d3},  [r1], r2
34        vld1.64         {d4, d5},  [r1], r2
35        pld             [r1, r2, lsl #2]
36        vld1.64         {d6, d7},  [r1], r2
37        pld             [r1]
38        pld             [r1, r2]
39        pld             [r1, r2, lsl #1]
40.if \avg
41        vld1.64         {d16,d17}, [ip,:128], r2
42        vrhadd.u8       q0,  q0,  q8
43        vld1.64         {d18,d19}, [ip,:128], r2
44        vrhadd.u8       q1,  q1,  q9
45        vld1.64         {d20,d21}, [ip,:128], r2
46        vrhadd.u8       q2,  q2,  q10
47        vld1.64         {d22,d23}, [ip,:128], r2
48        vrhadd.u8       q3,  q3,  q11
49.endif
50        subs            r3,  r3,  #4
51        vst1.64         {d0, d1},  [r0,:128], r2
52        vst1.64         {d2, d3},  [r0,:128], r2
53        vst1.64         {d4, d5},  [r0,:128], r2
54        vst1.64         {d6, d7},  [r0,:128], r2
55        bne             1b
56        bx              lr
57        .endm
58
59        .macro pixels16_x2 vhadd=vrhadd.u8
601:      vld1.64         {d0-d2},   [r1], r2
61        vld1.64         {d4-d6},   [r1], r2
62        pld             [r1]
63        pld             [r1, r2]
64        subs            r3,  r3,  #2
65        vext.8          q1,  q0,  q1,  #1
66        \vhadd          q0,  q0,  q1
67        vext.8          q3,  q2,  q3,  #1
68        \vhadd          q2,  q2,  q3
69        vst1.64         {d0, d1},  [r0,:128], r2
70        vst1.64         {d4, d5},  [r0,:128], r2
71        bne             1b
72        bx              lr
73        .endm
74
75        .macro pixels16_y2 vhadd=vrhadd.u8
76        vld1.64         {d0, d1},  [r1], r2
77        vld1.64         {d2, d3},  [r1], r2
781:      subs            r3,  r3,  #2
79        \vhadd          q2,  q0,  q1
80        vld1.64         {d0, d1},  [r1], r2
81        \vhadd          q3,  q0,  q1
82        vld1.64         {d2, d3},  [r1], r2
83        pld             [r1]
84        pld             [r1, r2]
85        vst1.64         {d4, d5},  [r0,:128], r2
86        vst1.64         {d6, d7},  [r0,:128], r2
87        bne             1b
88        bx              lr
89        .endm
90
91        .macro pixels16_xy2 vshrn=vrshrn.u16 no_rnd=0
92        vld1.64         {d0-d2},   [r1], r2
93        vld1.64         {d4-d6},   [r1], r2
94.if \no_rnd
95        vmov.i16        q13, #1
96.endif
97        pld             [r1]
98        pld             [r1, r2]
99        vext.8          q1,  q0,  q1,  #1
100        vext.8          q3,  q2,  q3,  #1
101        vaddl.u8        q8,  d0,  d2
102        vaddl.u8        q10, d1,  d3
103        vaddl.u8        q9,  d4,  d6
104        vaddl.u8        q11, d5,  d7
1051:      subs            r3,  r3,  #2
106        vld1.64         {d0-d2},   [r1], r2
107        vadd.u16        q12, q8,  q9
108        pld             [r1]
109.if \no_rnd
110        vadd.u16        q12, q12, q13
111.endif
112        vext.8          q15, q0,  q1,  #1
113        vadd.u16        q1 , q10, q11
114        \vshrn          d28, q12, #2
115.if \no_rnd
116        vadd.u16        q1,  q1,  q13
117.endif
118        \vshrn          d29, q1,  #2
119        vaddl.u8        q8,  d0,  d30
120        vld1.64         {d2-d4},   [r1], r2
121        vaddl.u8        q10, d1,  d31
122        vst1.64         {d28,d29}, [r0,:128], r2
123        vadd.u16        q12, q8,  q9
124        pld             [r1, r2]
125.if \no_rnd
126        vadd.u16        q12, q12, q13
127.endif
128        vext.8          q2,  q1,  q2,  #1
129        vadd.u16        q0,  q10, q11
130        \vshrn          d30, q12, #2
131.if \no_rnd
132        vadd.u16        q0,  q0,  q13
133.endif
134        \vshrn          d31, q0,  #2
135        vaddl.u8        q9,  d2,  d4
136        vaddl.u8        q11, d3,  d5
137        vst1.64         {d30,d31}, [r0,:128], r2
138        bgt             1b
139        bx              lr
140        .endm
141
142        .macro pixels8 avg=0
1431:      vld1.64         {d0}, [r1], r2
144        vld1.64         {d1}, [r1], r2
145        vld1.64         {d2}, [r1], r2
146        pld             [r1, r2, lsl #2]
147        vld1.64         {d3}, [r1], r2
148        pld             [r1]
149        pld             [r1, r2]
150        pld             [r1, r2, lsl #1]
151.if \avg
152        vld1.64         {d4}, [r0,:64], r2
153        vrhadd.u8       d0,  d0,  d4
154        vld1.64         {d5}, [r0,:64], r2
155        vrhadd.u8       d1,  d1,  d5
156        vld1.64         {d6}, [r0,:64], r2
157        vrhadd.u8       d2,  d2,  d6
158        vld1.64         {d7}, [r0,:64], r2
159        vrhadd.u8       d3,  d3,  d7
160        sub             r0,  r0,  r2,  lsl #2
161.endif
162        subs            r3,  r3,  #4
163        vst1.64         {d0}, [r0,:64], r2
164        vst1.64         {d1}, [r0,:64], r2
165        vst1.64         {d2}, [r0,:64], r2
166        vst1.64         {d3}, [r0,:64], r2
167        bne             1b
168        bx              lr
169        .endm
170
171        .macro pixels8_x2 vhadd=vrhadd.u8
1721:      vld1.64         {d0, d1},  [r1], r2
173        vext.8          d1,  d0,  d1,  #1
174        vld1.64         {d2, d3},  [r1], r2
175        vext.8          d3,  d2,  d3,  #1
176        pld             [r1]
177        pld             [r1, r2]
178        subs            r3,  r3,  #2
179        vswp            d1,  d2
180        \vhadd          q0,  q0,  q1
181        vst1.64         {d0},      [r0,:64], r2
182        vst1.64         {d1},      [r0,:64], r2
183        bne             1b
184        bx              lr
185        .endm
186
187        .macro pixels8_y2 vhadd=vrhadd.u8
188        vld1.64         {d0},      [r1], r2
189        vld1.64         {d1},      [r1], r2
1901:      subs            r3,  r3,  #2
191        \vhadd          d4,  d0,  d1
192        vld1.64         {d0},      [r1], r2
193        \vhadd          d5,  d0,  d1
194        vld1.64         {d1},      [r1], r2
195        pld             [r1]
196        pld             [r1, r2]
197        vst1.64         {d4},      [r0,:64], r2
198        vst1.64         {d5},      [r0,:64], r2
199        bne             1b
200        bx              lr
201        .endm
202
203        .macro pixels8_xy2 vshrn=vrshrn.u16 no_rnd=0
204        vld1.64         {d0, d1},  [r1], r2
205        vld1.64         {d2, d3},  [r1], r2
206.if \no_rnd
207        vmov.i16        q11, #1
208.endif
209        pld             [r1]
210        pld             [r1, r2]
211        vext.8          d4,  d0,  d1,  #1
212        vext.8          d6,  d2,  d3,  #1
213        vaddl.u8        q8,  d0,  d4
214        vaddl.u8        q9,  d2,  d6
2151:      subs            r3,  r3,  #2
216        vld1.64         {d0, d1},  [r1], r2
217        pld             [r1]
218        vadd.u16        q10, q8,  q9
219        vext.8          d4,  d0,  d1,  #1
220.if \no_rnd
221        vadd.u16        q10, q10, q11
222.endif
223        vaddl.u8        q8,  d0,  d4
224        \vshrn          d5,  q10, #2
225        vld1.64         {d2, d3},  [r1], r2
226        vadd.u16        q10, q8,  q9
227        pld             [r1, r2]
228.if \no_rnd
229        vadd.u16        q10, q10, q11
230.endif
231        vst1.64         {d5},      [r0,:64], r2
232        \vshrn          d7,  q10, #2
233        vext.8          d6,  d2,  d3,  #1
234        vaddl.u8        q9,  d2,  d6
235        vst1.64         {d7},      [r0,:64], r2
236        bgt             1b
237        bx              lr
238        .endm
239
240        .macro pixfunc pfx name suf rnd_op args:vararg
241function ff_\pfx\name\suf\()_neon, export=1
242        \name \rnd_op \args
243endfunc
244        .endm
245
246        .macro pixfunc2 pfx name args:vararg
247        pixfunc \pfx \name
248        pixfunc \pfx \name \args
249        .endm
250
251function ff_put_h264_qpel16_mc00_neon, export=1
252        mov             r3,  #16
253endfunc
254
255        pixfunc  put_ pixels16
256        pixfunc2 put_ pixels16_x2,  _no_rnd, vhadd.u8
257        pixfunc2 put_ pixels16_y2,  _no_rnd, vhadd.u8
258        pixfunc2 put_ pixels16_xy2, _no_rnd, vshrn.u16, 1
259
260function ff_avg_h264_qpel16_mc00_neon, export=1
261        mov             r3,  #16
262endfunc
263
264        pixfunc  avg_ pixels16,, 1
265
266function ff_put_h264_qpel8_mc00_neon, export=1
267        mov             r3,  #8
268endfunc
269
270        pixfunc  put_ pixels8
271        pixfunc2 put_ pixels8_x2,   _no_rnd, vhadd.u8
272        pixfunc2 put_ pixels8_y2,   _no_rnd, vhadd.u8
273        pixfunc2 put_ pixels8_xy2,  _no_rnd, vshrn.u16, 1
274
275function ff_avg_h264_qpel8_mc00_neon, export=1
276        mov             r3,  #8
277endfunc
278
279        pixfunc  avg_ pixels8,, 1
280
281function ff_put_pixels_clamped_neon, export=1
282        vld1.64         {d16-d19}, [r0,:128]!
283        vqmovun.s16     d0, q8
284        vld1.64         {d20-d23}, [r0,:128]!
285        vqmovun.s16     d1, q9
286        vld1.64         {d24-d27}, [r0,:128]!
287        vqmovun.s16     d2, q10
288        vld1.64         {d28-d31}, [r0,:128]!
289        vqmovun.s16     d3, q11
290        vst1.64         {d0},      [r1,:64], r2
291        vqmovun.s16     d4, q12
292        vst1.64         {d1},      [r1,:64], r2
293        vqmovun.s16     d5, q13
294        vst1.64         {d2},      [r1,:64], r2
295        vqmovun.s16     d6, q14
296        vst1.64         {d3},      [r1,:64], r2
297        vqmovun.s16     d7, q15
298        vst1.64         {d4},      [r1,:64], r2
299        vst1.64         {d5},      [r1,:64], r2
300        vst1.64         {d6},      [r1,:64], r2
301        vst1.64         {d7},      [r1,:64], r2
302        bx              lr
303endfunc
304
305function ff_put_signed_pixels_clamped_neon, export=1
306        vmov.u8         d31, #128
307        vld1.64         {d16-d17}, [r0,:128]!
308        vqmovn.s16      d0, q8
309        vld1.64         {d18-d19}, [r0,:128]!
310        vqmovn.s16      d1, q9
311        vld1.64         {d16-d17}, [r0,:128]!
312        vqmovn.s16      d2, q8
313        vld1.64         {d18-d19}, [r0,:128]!
314        vadd.u8         d0, d0, d31
315        vld1.64         {d20-d21}, [r0,:128]!
316        vadd.u8         d1, d1, d31
317        vld1.64         {d22-d23}, [r0,:128]!
318        vadd.u8         d2, d2, d31
319        vst1.64         {d0},      [r1,:64], r2
320        vqmovn.s16      d3, q9
321        vst1.64         {d1},      [r1,:64], r2
322        vqmovn.s16      d4, q10
323        vst1.64         {d2},      [r1,:64], r2
324        vqmovn.s16      d5, q11
325        vld1.64         {d24-d25}, [r0,:128]!
326        vadd.u8         d3, d3, d31
327        vld1.64         {d26-d27}, [r0,:128]!
328        vadd.u8         d4, d4, d31
329        vadd.u8         d5, d5, d31
330        vst1.64         {d3},      [r1,:64], r2
331        vqmovn.s16      d6, q12
332        vst1.64         {d4},      [r1,:64], r2
333        vqmovn.s16      d7, q13
334        vst1.64         {d5},      [r1,:64], r2
335        vadd.u8         d6, d6, d31
336        vadd.u8         d7, d7, d31
337        vst1.64         {d6},      [r1,:64], r2
338        vst1.64         {d7},      [r1,:64], r2
339        bx              lr
340endfunc
341
342function ff_add_pixels_clamped_neon, export=1
343        mov             r3, r1
344        vld1.64         {d16},   [r1,:64], r2
345        vld1.64         {d0-d1}, [r0,:128]!
346        vaddw.u8        q0, q0, d16
347        vld1.64         {d17},   [r1,:64], r2
348        vld1.64         {d2-d3}, [r0,:128]!
349        vqmovun.s16     d0, q0
350        vld1.64         {d18},   [r1,:64], r2
351        vaddw.u8        q1, q1, d17
352        vld1.64         {d4-d5}, [r0,:128]!
353        vaddw.u8        q2, q2, d18
354        vst1.64         {d0},    [r3,:64], r2
355        vqmovun.s16     d2, q1
356        vld1.64         {d19},   [r1,:64], r2
357        vld1.64         {d6-d7}, [r0,:128]!
358        vaddw.u8        q3, q3, d19
359        vqmovun.s16     d4, q2
360        vst1.64         {d2},    [r3,:64], r2
361        vld1.64         {d16},   [r1,:64], r2
362        vqmovun.s16     d6, q3
363        vld1.64         {d0-d1}, [r0,:128]!
364        vaddw.u8        q0, q0, d16
365        vst1.64         {d4},    [r3,:64], r2
366        vld1.64         {d17},   [r1,:64], r2
367        vld1.64         {d2-d3}, [r0,:128]!
368        vaddw.u8        q1, q1, d17
369        vst1.64         {d6},    [r3,:64], r2
370        vqmovun.s16     d0, q0
371        vld1.64         {d18},   [r1,:64], r2
372        vld1.64         {d4-d5}, [r0,:128]!
373        vaddw.u8        q2, q2, d18
374        vst1.64         {d0},    [r3,:64], r2
375        vqmovun.s16     d2, q1
376        vld1.64         {d19},   [r1,:64], r2
377        vqmovun.s16     d4, q2
378        vld1.64         {d6-d7}, [r0,:128]!
379        vaddw.u8        q3, q3, d19
380        vst1.64         {d2},    [r3,:64], r2
381        vqmovun.s16     d6, q3
382        vst1.64         {d4},    [r3,:64], r2
383        vst1.64         {d6},    [r3,:64], r2
384        bx              lr
385endfunc
386
387function ff_float_to_int16_neon, export=1
388        subs            r2,  r2,  #8
389        vld1.64         {d0-d1},  [r1,:128]!
390        vcvt.s32.f32    q8,  q0,  #16
391        vld1.64         {d2-d3},  [r1,:128]!
392        vcvt.s32.f32    q9,  q1,  #16
393        beq             3f
394        bics            ip,  r2,  #15
395        beq             2f
3961:      subs            ip,  ip,  #16
397        vshrn.s32       d4,  q8,  #16
398        vld1.64         {d0-d1},  [r1,:128]!
399        vcvt.s32.f32    q0,  q0,  #16
400        vshrn.s32       d5,  q9,  #16
401        vld1.64         {d2-d3},  [r1,:128]!
402        vcvt.s32.f32    q1,  q1,  #16
403        vshrn.s32       d6,  q0,  #16
404        vst1.64         {d4-d5},  [r0,:128]!
405        vshrn.s32       d7,  q1,  #16
406        vld1.64         {d16-d17},[r1,:128]!
407        vcvt.s32.f32    q8,  q8,  #16
408        vld1.64         {d18-d19},[r1,:128]!
409        vcvt.s32.f32    q9,  q9,  #16
410        vst1.64         {d6-d7},  [r0,:128]!
411        bne             1b
412        ands            r2,  r2,  #15
413        beq             3f
4142:      vld1.64         {d0-d1},  [r1,:128]!
415        vshrn.s32       d4,  q8,  #16
416        vcvt.s32.f32    q0,  q0,  #16
417        vld1.64         {d2-d3},  [r1,:128]!
418        vshrn.s32       d5,  q9,  #16
419        vcvt.s32.f32    q1,  q1,  #16
420        vshrn.s32       d6,  q0,  #16
421        vst1.64         {d4-d5},  [r0,:128]!
422        vshrn.s32       d7,  q1,  #16
423        vst1.64         {d6-d7},  [r0,:128]!
424        bx              lr
4253:      vshrn.s32       d4,  q8,  #16
426        vshrn.s32       d5,  q9,  #16
427        vst1.64         {d4-d5},  [r0,:128]!
428        bx              lr
429endfunc
430
431function ff_float_to_int16_interleave_neon, export=1
432        cmp             r3, #2
433        ldrlt           r1, [r1]
434        blt             ff_float_to_int16_neon
435        bne             4f
436
437        ldr             r3, [r1]
438        ldr             r1, [r1, #4]
439
440        subs            r2,  r2,  #8
441        vld1.64         {d0-d1},  [r3,:128]!
442        vcvt.s32.f32    q8,  q0,  #16
443        vld1.64         {d2-d3},  [r3,:128]!
444        vcvt.s32.f32    q9,  q1,  #16
445        vld1.64         {d20-d21},[r1,:128]!
446        vcvt.s32.f32    q10, q10, #16
447        vld1.64         {d22-d23},[r1,:128]!
448        vcvt.s32.f32    q11, q11, #16
449        beq             3f
450        bics            ip,  r2,  #15
451        beq             2f
4521:      subs            ip,  ip,  #16
453        vld1.64         {d0-d1},  [r3,:128]!
454        vcvt.s32.f32    q0,  q0,  #16
455        vsri.32         q10, q8,  #16
456        vld1.64         {d2-d3},  [r3,:128]!
457        vcvt.s32.f32    q1,  q1,  #16
458        vld1.64         {d24-d25},[r1,:128]!
459        vcvt.s32.f32    q12, q12, #16
460        vld1.64         {d26-d27},[r1,:128]!
461        vsri.32         q11, q9,  #16
462        vst1.64         {d20-d21},[r0,:128]!
463        vcvt.s32.f32    q13, q13, #16
464        vst1.64         {d22-d23},[r0,:128]!
465        vsri.32         q12, q0,  #16
466        vld1.64         {d16-d17},[r3,:128]!
467        vsri.32         q13, q1,  #16
468        vst1.64         {d24-d25},[r0,:128]!
469        vcvt.s32.f32    q8,  q8,  #16
470        vld1.64         {d18-d19},[r3,:128]!
471        vcvt.s32.f32    q9,  q9,  #16
472        vld1.64         {d20-d21},[r1,:128]!
473        vcvt.s32.f32    q10, q10, #16
474        vld1.64         {d22-d23},[r1,:128]!
475        vcvt.s32.f32    q11, q11, #16
476        vst1.64         {d26-d27},[r0,:128]!
477        bne             1b
478        ands            r2,  r2,  #15
479        beq             3f
4802:      vsri.32         q10, q8,  #16
481        vld1.64         {d0-d1},  [r3,:128]!
482        vcvt.s32.f32    q0,  q0,  #16
483        vld1.64         {d2-d3},  [r3,:128]!
484        vcvt.s32.f32    q1,  q1,  #16
485        vld1.64         {d24-d25},[r1,:128]!
486        vcvt.s32.f32    q12, q12, #16
487        vsri.32         q11, q9,  #16
488        vld1.64         {d26-d27},[r1,:128]!
489        vcvt.s32.f32    q13, q13, #16
490        vst1.64         {d20-d21},[r0,:128]!
491        vsri.32         q12, q0,  #16
492        vst1.64         {d22-d23},[r0,:128]!
493        vsri.32         q13, q1,  #16
494        vst1.64         {d24-d27},[r0,:128]!
495        bx              lr
4963:      vsri.32         q10, q8,  #16
497        vsri.32         q11, q9,  #16
498        vst1.64         {d20-d23},[r0,:128]!
499        bx              lr
500
5014:      push            {r4-r8,lr}
502        cmp             r3,  #4
503        lsl             ip,  r3,  #1
504        blt             4f
505
506        @ 4 channels
5075:      ldmia           r1!, {r4-r7}
508        mov             lr,  r2
509        mov             r8,  r0
510        vld1.64         {d16-d17},[r4,:128]!
511        vcvt.s32.f32    q8,  q8,  #16
512        vld1.64         {d18-d19},[r5,:128]!
513        vcvt.s32.f32    q9,  q9,  #16
514        vld1.64         {d20-d21},[r6,:128]!
515        vcvt.s32.f32    q10, q10, #16
516        vld1.64         {d22-d23},[r7,:128]!
517        vcvt.s32.f32    q11, q11, #16
5186:      subs            lr,  lr,  #8
519        vld1.64         {d0-d1},  [r4,:128]!
520        vcvt.s32.f32    q0,  q0,  #16
521        vsri.32         q9,  q8,  #16
522        vld1.64         {d2-d3},  [r5,:128]!
523        vcvt.s32.f32    q1,  q1,  #16
524        vsri.32         q11, q10, #16
525        vld1.64         {d4-d5},  [r6,:128]!
526        vcvt.s32.f32    q2,  q2,  #16
527        vzip.32         d18, d22
528        vld1.64         {d6-d7},  [r7,:128]!
529        vcvt.s32.f32    q3,  q3,  #16
530        vzip.32         d19, d23
531        vst1.64         {d18},    [r8], ip
532        vsri.32         q1,  q0,  #16
533        vst1.64         {d22},    [r8], ip
534        vsri.32         q3,  q2,  #16
535        vst1.64         {d19},    [r8], ip
536        vzip.32         d2,  d6
537        vst1.64         {d23},    [r8], ip
538        vzip.32         d3,  d7
539        beq             7f
540        vld1.64         {d16-d17},[r4,:128]!
541        vcvt.s32.f32    q8,  q8,  #16
542        vst1.64         {d2},     [r8], ip
543        vld1.64         {d18-d19},[r5,:128]!
544        vcvt.s32.f32    q9,  q9,  #16
545        vst1.64         {d6},     [r8], ip
546        vld1.64         {d20-d21},[r6,:128]!
547        vcvt.s32.f32    q10, q10, #16
548        vst1.64         {d3},     [r8], ip
549        vld1.64         {d22-d23},[r7,:128]!
550        vcvt.s32.f32    q11, q11, #16
551        vst1.64         {d7},     [r8], ip
552        b               6b
5537:      vst1.64         {d2},     [r8], ip
554        vst1.64         {d6},     [r8], ip
555        vst1.64         {d3},     [r8], ip
556        vst1.64         {d7},     [r8], ip
557        subs            r3,  r3,  #4
558        popeq           {r4-r8,pc}
559        cmp             r3,  #4
560        add             r0,  r0,  #8
561        bge             5b
562
563        @ 2 channels
5644:      cmp             r3,  #2
565        blt             4f
566        ldmia           r1!, {r4-r5}
567        mov             lr,  r2
568        mov             r8,  r0
569        tst             lr,  #8
570        vld1.64         {d16-d17},[r4,:128]!
571        vcvt.s32.f32    q8,  q8,  #16
572        vld1.64         {d18-d19},[r5,:128]!
573        vcvt.s32.f32    q9,  q9,  #16
574        vld1.64         {d20-d21},[r4,:128]!
575        vcvt.s32.f32    q10, q10, #16
576        vld1.64         {d22-d23},[r5,:128]!
577        vcvt.s32.f32    q11, q11, #16
578        beq             6f
579        subs            lr,  lr,  #8
580        beq             7f
581        vsri.32         d18, d16, #16
582        vsri.32         d19, d17, #16
583        vld1.64         {d16-d17},[r4,:128]!
584        vcvt.s32.f32    q8,  q8,  #16
585        vst1.32         {d18[0]}, [r8], ip
586        vsri.32         d22, d20, #16
587        vst1.32         {d18[1]}, [r8], ip
588        vsri.32         d23, d21, #16
589        vst1.32         {d19[0]}, [r8], ip
590        vst1.32         {d19[1]}, [r8], ip
591        vld1.64         {d18-d19},[r5,:128]!
592        vcvt.s32.f32    q9,  q9,  #16
593        vst1.32         {d22[0]}, [r8], ip
594        vst1.32         {d22[1]}, [r8], ip
595        vld1.64         {d20-d21},[r4,:128]!
596        vcvt.s32.f32    q10, q10, #16
597        vst1.32         {d23[0]}, [r8], ip
598        vst1.32         {d23[1]}, [r8], ip
599        vld1.64         {d22-d23},[r5,:128]!
600        vcvt.s32.f32    q11, q11, #16
6016:      subs            lr,  lr,  #16
602        vld1.64         {d0-d1},  [r4,:128]!
603        vcvt.s32.f32    q0,  q0,  #16
604        vsri.32         d18, d16, #16
605        vld1.64         {d2-d3},  [r5,:128]!
606        vcvt.s32.f32    q1,  q1,  #16
607        vsri.32         d19, d17, #16
608        vld1.64         {d4-d5},  [r4,:128]!
609        vcvt.s32.f32    q2,  q2,  #16
610        vld1.64         {d6-d7},  [r5,:128]!
611        vcvt.s32.f32    q3,  q3,  #16
612        vst1.32         {d18[0]}, [r8], ip
613        vsri.32         d22, d20, #16
614        vst1.32         {d18[1]}, [r8], ip
615        vsri.32         d23, d21, #16
616        vst1.32         {d19[0]}, [r8], ip
617        vsri.32         d2,  d0,  #16
618        vst1.32         {d19[1]}, [r8], ip
619        vsri.32         d3,  d1,  #16
620        vst1.32         {d22[0]}, [r8], ip
621        vsri.32         d6,  d4,  #16
622        vst1.32         {d22[1]}, [r8], ip
623        vsri.32         d7,  d5,  #16
624        vst1.32         {d23[0]}, [r8], ip
625        vst1.32         {d23[1]}, [r8], ip
626        beq             6f
627        vld1.64         {d16-d17},[r4,:128]!
628        vcvt.s32.f32    q8,  q8,  #16
629        vst1.32         {d2[0]},  [r8], ip
630        vst1.32         {d2[1]},  [r8], ip
631        vld1.64         {d18-d19},[r5,:128]!
632        vcvt.s32.f32    q9,  q9,  #16
633        vst1.32         {d3[0]},  [r8], ip
634        vst1.32         {d3[1]},  [r8], ip
635        vld1.64         {d20-d21},[r4,:128]!
636        vcvt.s32.f32    q10, q10, #16
637        vst1.32         {d6[0]},  [r8], ip
638        vst1.32         {d6[1]},  [r8], ip
639        vld1.64         {d22-d23},[r5,:128]!
640        vcvt.s32.f32    q11, q11, #16
641        vst1.32         {d7[0]},  [r8], ip
642        vst1.32         {d7[1]},  [r8], ip
643        bgt             6b
6446:      vst1.32         {d2[0]},  [r8], ip
645        vst1.32         {d2[1]},  [r8], ip
646        vst1.32         {d3[0]},  [r8], ip
647        vst1.32         {d3[1]},  [r8], ip
648        vst1.32         {d6[0]},  [r8], ip
649        vst1.32         {d6[1]},  [r8], ip
650        vst1.32         {d7[0]},  [r8], ip
651        vst1.32         {d7[1]},  [r8], ip
652        b               8f
6537:      vsri.32         d18, d16, #16
654        vsri.32         d19, d17, #16
655        vst1.32         {d18[0]}, [r8], ip
656        vsri.32         d22, d20, #16
657        vst1.32         {d18[1]}, [r8], ip
658        vsri.32         d23, d21, #16
659        vst1.32         {d19[0]}, [r8], ip
660        vst1.32         {d19[1]}, [r8], ip
661        vst1.32         {d22[0]}, [r8], ip
662        vst1.32         {d22[1]}, [r8], ip
663        vst1.32         {d23[0]}, [r8], ip
664        vst1.32         {d23[1]}, [r8], ip
6658:      subs            r3,  r3,  #2
666        add             r0,  r0,  #4
667        popeq           {r4-r8,pc}
668
669        @ 1 channel
6704:      ldr             r4,  [r1],#4
671        tst             r2,  #8
672        mov             lr,  r2
673        mov             r5,  r0
674        vld1.64         {d0-d1},  [r4,:128]!
675        vcvt.s32.f32    q0,  q0,  #16
676        vld1.64         {d2-d3},  [r4,:128]!
677        vcvt.s32.f32    q1,  q1,  #16
678        bne             8f
6796:      subs            lr,  lr,  #16
680        vld1.64         {d4-d5},  [r4,:128]!
681        vcvt.s32.f32    q2,  q2,  #16
682        vld1.64         {d6-d7},  [r4,:128]!
683        vcvt.s32.f32    q3,  q3,  #16
684        vst1.16         {d0[1]},  [r5,:16], ip
685        vst1.16         {d0[3]},  [r5,:16], ip
686        vst1.16         {d1[1]},  [r5,:16], ip
687        vst1.16         {d1[3]},  [r5,:16], ip
688        vst1.16         {d2[1]},  [r5,:16], ip
689        vst1.16         {d2[3]},  [r5,:16], ip
690        vst1.16         {d3[1]},  [r5,:16], ip
691        vst1.16         {d3[3]},  [r5,:16], ip
692        beq             7f
693        vld1.64         {d0-d1},  [r4,:128]!
694        vcvt.s32.f32    q0,  q0,  #16
695        vld1.64         {d2-d3},  [r4,:128]!
696        vcvt.s32.f32    q1,  q1,  #16
6977:      vst1.16         {d4[1]},  [r5,:16], ip
698        vst1.16         {d4[3]},  [r5,:16], ip
699        vst1.16         {d5[1]},  [r5,:16], ip
700        vst1.16         {d5[3]},  [r5,:16], ip
701        vst1.16         {d6[1]},  [r5,:16], ip
702        vst1.16         {d6[3]},  [r5,:16], ip
703        vst1.16         {d7[1]},  [r5,:16], ip
704        vst1.16         {d7[3]},  [r5,:16], ip
705        bgt             6b
706        pop             {r4-r8,pc}
7078:      subs            lr,  lr,  #8
708        vst1.16         {d0[1]},  [r5,:16], ip
709        vst1.16         {d0[3]},  [r5,:16], ip
710        vst1.16         {d1[1]},  [r5,:16], ip
711        vst1.16         {d1[3]},  [r5,:16], ip
712        vst1.16         {d2[1]},  [r5,:16], ip
713        vst1.16         {d2[3]},  [r5,:16], ip
714        vst1.16         {d3[1]},  [r5,:16], ip
715        vst1.16         {d3[3]},  [r5,:16], ip
716        popeq           {r4-r8,pc}
717        vld1.64         {d0-d1},  [r4,:128]!
718        vcvt.s32.f32    q0,  q0,  #16
719        vld1.64         {d2-d3},  [r4,:128]!
720        vcvt.s32.f32    q1,  q1,  #16
721        b               6b
722endfunc
723
724function ff_vector_fmul_neon, export=1
725        mov             r3,  r0
726        subs            r2,  r2,  #8
727        vld1.64         {d0-d3},  [r0,:128]!
728        vld1.64         {d4-d7},  [r1,:128]!
729        vmul.f32        q8,  q0,  q2
730        vmul.f32        q9,  q1,  q3
731        beq             3f
732        bics            ip,  r2,  #15
733        beq             2f
7341:      subs            ip,  ip,  #16
735        vld1.64         {d0-d1},  [r0,:128]!
736        vld1.64         {d4-d5},  [r1,:128]!
737        vmul.f32        q10, q0,  q2
738        vld1.64         {d2-d3},  [r0,:128]!
739        vld1.64         {d6-d7},  [r1,:128]!
740        vmul.f32        q11, q1,  q3
741        vst1.64         {d16-d19},[r3,:128]!
742        vld1.64         {d0-d1},  [r0,:128]!
743        vld1.64         {d4-d5},  [r1,:128]!
744        vmul.f32        q8,  q0,  q2
745        vld1.64         {d2-d3},  [r0,:128]!
746        vld1.64         {d6-d7},  [r1,:128]!
747        vmul.f32        q9,  q1,  q3
748        vst1.64         {d20-d23},[r3,:128]!
749        bne             1b
750        ands            r2,  r2,  #15
751        beq             3f
7522:      vld1.64         {d0-d1},  [r0,:128]!
753        vld1.64         {d4-d5},  [r1,:128]!
754        vst1.64         {d16-d17},[r3,:128]!
755        vmul.f32        q8,  q0,  q2
756        vld1.64         {d2-d3},  [r0,:128]!
757        vld1.64         {d6-d7},  [r1,:128]!
758        vst1.64         {d18-d19},[r3,:128]!
759        vmul.f32        q9,  q1,  q3
7603:      vst1.64         {d16-d19},[r3,:128]!
761        bx              lr
762endfunc
763
764function ff_vector_fmul_window_neon, export=1
765VFP     vdup.32         q8,  d0[0]
766NOVFP   vld1.32         {d16[],d17[]}, [sp,:32]
767        push            {r4,r5,lr}
768VFP     ldr             lr,  [sp, #12]
769NOVFP   ldr             lr,  [sp, #16]
770        sub             r2,  r2,  #8
771        sub             r5,  lr,  #2
772        add             r2,  r2,  r5, lsl #2
773        add             r4,  r3,  r5, lsl #3
774        add             ip,  r0,  r5, lsl #3
775        mov             r5,  #-16
776        vld1.64         {d0,d1},  [r1,:128]!
777        vld1.64         {d2,d3},  [r2,:128], r5
778        vld1.64         {d4,d5},  [r3,:128]!
779        vld1.64         {d6,d7},  [r4,:128], r5
7801:      subs            lr,  lr,  #4
781        vmov            q11, q8
782        vmla.f32        d22, d0,  d4
783        vmov            q10, q8
784        vmla.f32        d23, d1,  d5
785        vrev64.32       q3,  q3
786        vmla.f32        d20, d0,  d7
787        vrev64.32       q1,  q1
788        vmla.f32        d21, d1,  d6
789        beq             2f
790        vmla.f32        d22, d3,  d7
791        vld1.64         {d0,d1},  [r1,:128]!
792        vmla.f32        d23, d2,  d6
793        vld1.64         {d18,d19},[r2,:128], r5
794        vmls.f32        d20, d3,  d4
795        vld1.64         {d24,d25},[r3,:128]!
796        vmls.f32        d21, d2,  d5
797        vld1.64         {d6,d7},  [r4,:128], r5
798        vmov            q1,  q9
799        vrev64.32       q11, q11
800        vmov            q2,  q12
801        vswp            d22, d23
802        vst1.64         {d20,d21},[r0,:128]!
803        vst1.64         {d22,d23},[ip,:128], r5
804        b               1b
8052:      vmla.f32        d22, d3,  d7
806        vmla.f32        d23, d2,  d6
807        vmls.f32        d20, d3,  d4
808        vmls.f32        d21, d2,  d5
809        vrev64.32       q11, q11
810        vswp            d22, d23
811        vst1.64         {d20,d21},[r0,:128]!
812        vst1.64         {d22,d23},[ip,:128], r5
813        pop             {r4,r5,pc}
814endfunc
815
816#if CONFIG_VORBIS_DECODER
817function ff_vorbis_inverse_coupling_neon, export=1
818        vmov.i32        q10, #1<<31
819        subs            r2,  r2,  #4
820        mov             r3,  r0
821        mov             r12, r1
822        beq             3f
823
824        vld1.32         {d24-d25},[r1,:128]!
825        vld1.32         {d22-d23},[r0,:128]!
826        vcle.s32        q8,  q12, #0
827        vand            q9,  q11, q10
828        veor            q12, q12, q9
829        vand            q2,  q12, q8
830        vbic            q3,  q12, q8
831        vadd.f32        q12, q11, q2
832        vsub.f32        q11, q11, q3
8331:      vld1.32         {d2-d3},  [r1,:128]!
834        vld1.32         {d0-d1},  [r0,:128]!
835        vcle.s32        q8,  q1,  #0
836        vand            q9,  q0,  q10
837        veor            q1,  q1,  q9
838        vst1.32         {d24-d25},[r3, :128]!
839        vst1.32         {d22-d23},[r12,:128]!
840        vand            q2,  q1,  q8
841        vbic            q3,  q1,  q8
842        vadd.f32        q1,  q0,  q2
843        vsub.f32        q0,  q0,  q3
844        subs            r2,  r2,  #8
845        ble             2f
846        vld1.32         {d24-d25},[r1,:128]!
847        vld1.32         {d22-d23},[r0,:128]!
848        vcle.s32        q8,  q12, #0
849        vand            q9,  q11, q10
850        veor            q12, q12, q9
851        vst1.32         {d2-d3},  [r3, :128]!
852        vst1.32         {d0-d1},  [r12,:128]!
853        vand            q2,  q12, q8
854        vbic            q3,  q12, q8
855        vadd.f32        q12, q11, q2
856        vsub.f32        q11, q11, q3
857        b               1b
858
8592:      vst1.32         {d2-d3},  [r3, :128]!
860        vst1.32         {d0-d1},  [r12,:128]!
861        bxlt            lr
862
8633:      vld1.32         {d2-d3},  [r1,:128]
864        vld1.32         {d0-d1},  [r0,:128]
865        vcle.s32        q8,  q1,  #0
866        vand            q9,  q0,  q10
867        veor            q1,  q1,  q9
868        vand            q2,  q1,  q8
869        vbic            q3,  q1,  q8
870        vadd.f32        q1,  q0,  q2
871        vsub.f32        q0,  q0,  q3
872        vst1.32         {d2-d3},  [r0,:128]!
873        vst1.32         {d0-d1},  [r1,:128]!
874        bx              lr
875endfunc
876#endif
877
878function ff_vector_fmul_scalar_neon, export=1
879VFP     len .req r2
880NOVFP   len .req r3
881VFP     vdup.32         q8,  d0[0]
882NOVFP   vdup.32         q8,  r2
883        bics            r12, len, #15
884        beq             3f
885        vld1.32         {q0},[r1,:128]!
886        vld1.32         {q1},[r1,:128]!
8871:      vmul.f32        q0,  q0,  q8
888        vld1.32         {q2},[r1,:128]!
889        vmul.f32        q1,  q1,  q8
890        vld1.32         {q3},[r1,:128]!
891        vmul.f32        q2,  q2,  q8
892        vst1.32         {q0},[r0,:128]!
893        vmul.f32        q3,  q3,  q8
894        vst1.32         {q1},[r0,:128]!
895        subs            r12, r12, #16
896        beq             2f
897        vld1.32         {q0},[r1,:128]!
898        vst1.32         {q2},[r0,:128]!
899        vld1.32         {q1},[r1,:128]!
900        vst1.32         {q3},[r0,:128]!
901        b               1b
9022:      vst1.32         {q2},[r0,:128]!
903        vst1.32         {q3},[r0,:128]!
904        ands            len, len, #15
905        bxeq            lr
9063:      vld1.32         {q0},[r1,:128]!
907        vmul.f32        q0,  q0,  q8
908        vst1.32         {q0},[r0,:128]!
909        subs            len, len, #4
910        bgt             3b
911        bx              lr
912        .unreq          len
913endfunc
914
915function ff_vector_fmul_sv_scalar_2_neon, export=1
916VFP     vdup.32         d16, d0[0]
917NOVFP   vdup.32         d16, r3
918NOVFP   ldr             r3,  [sp]
919        vld1.32         {d0},[r1,:64]!
920        vld1.32         {d1},[r1,:64]!
9211:      subs            r3,  r3,  #4
922        vmul.f32        d4,  d0,  d16
923        vmul.f32        d5,  d1,  d16
924        ldr             r12, [r2], #4
925        vld1.32         {d2},[r12,:64]
926        ldr             r12, [r2], #4
927        vld1.32         {d3},[r12,:64]
928        vmul.f32        d4,  d4,  d2
929        vmul.f32        d5,  d5,  d3
930        beq             2f
931        vld1.32         {d0},[r1,:64]!
932        vld1.32         {d1},[r1,:64]!
933        vst1.32         {d4},[r0,:64]!
934        vst1.32         {d5},[r0,:64]!
935        b               1b
9362:      vst1.32         {d4},[r0,:64]!
937        vst1.32         {d5},[r0,:64]!
938        bx              lr
939endfunc
940
941function ff_vector_fmul_sv_scalar_4_neon, export=1
942VFP     vdup.32         q10, d0[0]
943NOVFP   vdup.32         q10, r3
944NOVFP   ldr             r3,  [sp]
945        push            {lr}
946        bics            lr,  r3,  #7
947        beq             3f
948        vld1.32         {q0},[r1,:128]!
949        vld1.32         {q2},[r1,:128]!
9501:      ldr             r12, [r2], #4
951        vld1.32         {q1},[r12,:128]
952        ldr             r12, [r2], #4
953        vld1.32         {q3},[r12,:128]
954        vmul.f32        q8,  q0,  q10
955        vmul.f32        q8,  q8,  q1
956        vmul.f32        q9,  q2,  q10
957        vmul.f32        q9,  q9,  q3
958        subs            lr,  lr,  #8
959        beq             2f
960        vld1.32         {q0},[r1,:128]!
961        vld1.32         {q2},[r1,:128]!
962        vst1.32         {q8},[r0,:128]!
963        vst1.32         {q9},[r0,:128]!
964        b               1b
9652:      vst1.32         {q8},[r0,:128]!
966        vst1.32         {q9},[r0,:128]!
967        ands            r3,  r3,  #7
968        popeq           {pc}
9693:      vld1.32         {q0},[r1,:128]!
970        ldr             r12, [r2], #4
971        vld1.32         {q1},[r12,:128]
972        vmul.f32        q0,  q0,  q10
973        vmul.f32        q0,  q0,  q1
974        vst1.32         {q0},[r0,:128]!
975        subs            r3,  r3,  #4
976        bgt             3b
977        pop             {pc}
978endfunc
979
980function ff_sv_fmul_scalar_2_neon, export=1
981VFP     len .req r2
982NOVFP   len .req r3
983VFP     vdup.32         q8,  d0[0]
984NOVFP   vdup.32         q8,  r2
985        ldr             r12, [r1], #4
986        vld1.32         {d0},[r12,:64]
987        ldr             r12, [r1], #4
988        vld1.32         {d1},[r12,:64]
9891:      vmul.f32        q1,  q0,  q8
990        subs            len, len, #4
991        beq             2f
992        ldr             r12, [r1], #4
993        vld1.32         {d0},[r12,:64]
994        ldr             r12, [r1], #4
995        vld1.32         {d1},[r12,:64]
996        vst1.32         {q1},[r0,:128]!
997        b               1b
9982:      vst1.32         {q1},[r0,:128]!
999        bx              lr
1000        .unreq          len
1001endfunc
1002
1003function ff_sv_fmul_scalar_4_neon, export=1
1004VFP     len .req r2
1005NOVFP   len .req r3
1006VFP     vdup.32         q8,  d0[0]
1007NOVFP   vdup.32         q8,  r2
10081:      ldr             r12, [r1], #4
1009        vld1.32         {q0},[r12,:128]
1010        vmul.f32        q0,  q0,  q8
1011        vst1.32         {q0},[r0,:128]!
1012        subs            len, len, #4
1013        bgt             1b
1014        bx              lr
1015        .unreq          len
1016endfunc
1017
1018function ff_butterflies_float_neon, export=1
10191:      vld1.32         {q0},[r0,:128]
1020        vld1.32         {q1},[r1,:128]
1021        vsub.f32        q2,  q0,  q1
1022        vadd.f32        q1,  q0,  q1
1023        vst1.32         {q2},[r1,:128]!
1024        vst1.32         {q1},[r0,:128]!
1025        subs            r2,  r2,  #4
1026        bgt             1b
1027        bx              lr
1028endfunc
1029
1030function ff_scalarproduct_float_neon, export=1
1031        vmov.f32        q2,  #0.0
10321:      vld1.32         {q0},[r0,:128]!
1033        vld1.32         {q1},[r1,:128]!
1034        vmla.f32        q2,  q0,  q1
1035        subs            r2,  r2,  #4
1036        bgt             1b
1037        vadd.f32        d0,  d4,  d5
1038        vpadd.f32       d0,  d0,  d0
1039NOVFP   vmov.32         r0,  d0[0]
1040        bx              lr
1041endfunc
1042
1043function ff_int32_to_float_fmul_scalar_neon, export=1
1044VFP     vdup.32         q0,  d0[0]
1045VFP     len     .req    r2
1046NOVFP   vdup.32         q0,  r2
1047NOVFP   len     .req    r3
1048
1049        vld1.32         {q1},[r1,:128]!
1050        vcvt.f32.s32    q3,  q1
1051        vld1.32         {q2},[r1,:128]!
1052        vcvt.f32.s32    q8,  q2
10531:      subs            len, len, #8
1054        pld             [r1, #16]
1055        vmul.f32        q9,  q3,  q0
1056        vmul.f32        q10, q8,  q0
1057        beq             2f
1058        vld1.32         {q1},[r1,:128]!
1059        vcvt.f32.s32    q3,  q1
1060        vld1.32         {q2},[r1,:128]!
1061        vcvt.f32.s32    q8,  q2
1062        vst1.32         {q9}, [r0,:128]!
1063        vst1.32         {q10},[r0,:128]!
1064        b               1b
10652:      vst1.32         {q9}, [r0,:128]!
1066        vst1.32         {q10},[r0,:128]!
1067        bx              lr
1068        .unreq  len
1069endfunc
1070
1071function ff_vector_fmul_reverse_neon, export=1
1072        add             r2,  r2,  r3,  lsl #2
1073        sub             r2,  r2,  #32
1074        mov             r12, #-32
1075        vld1.32         {q0-q1},  [r1,:128]!
1076        vld1.32         {q2-q3},  [r2,:128], r12
10771:      pld             [r1, #32]
1078        vrev64.32       q3,  q3
1079        vmul.f32        d16, d0,  d7
1080        vmul.f32        d17, d1,  d6
1081        pld             [r2, #-32]
1082        vrev64.32       q2,  q2
1083        vmul.f32        d18, d2,  d5
1084        vmul.f32        d19, d3,  d4
1085        subs            r3,  r3,  #8
1086        beq             2f
1087        vld1.32         {q0-q1},  [r1,:128]!
1088        vld1.32         {q2-q3},  [r2,:128], r12
1089        vst1.32         {q8-q9},  [r0,:128]!
1090        b               1b
10912:      vst1.32         {q8-q9},  [r0,:128]!
1092        bx              lr
1093endfunc
1094
1095function ff_vector_fmul_add_neon, export=1
1096        ldr             r12, [sp]
1097        vld1.32         {q0-q1},  [r1,:128]!
1098        vld1.32         {q8-q9},  [r2,:128]!
1099        vld1.32         {q2-q3},  [r3,:128]!
1100        vmul.f32        q10, q0,  q8
1101        vmul.f32        q11, q1,  q9
11021:      vadd.f32        q12, q2,  q10
1103        vadd.f32        q13, q3,  q11
1104        pld             [r1, #16]
1105        pld             [r2, #16]
1106        pld             [r3, #16]
1107        subs            r12, r12, #8
1108        beq             2f
1109        vld1.32         {q0},     [r1,:128]!
1110        vld1.32         {q8},     [r2,:128]!
1111        vmul.f32        q10, q0,  q8
1112        vld1.32         {q1},     [r1,:128]!
1113        vld1.32         {q9},     [r2,:128]!
1114        vmul.f32        q11, q1,  q9
1115        vld1.32         {q2-q3},  [r3,:128]!
1116        vst1.32         {q12-q13},[r0,:128]!
1117        b               1b
11182:      vst1.32         {q12-q13},[r0,:128]!
1119        bx              lr
1120endfunc
1121
1122function ff_vector_clipf_neon, export=1
1123VFP     vdup.32         q1,  d0[1]
1124VFP     vdup.32         q0,  d0[0]
1125NOVFP   vdup.32         q0,  r2
1126NOVFP   vdup.32         q1,  r3
1127NOVFP   ldr             r2,  [sp]
1128        vld1.f32        {q2},[r1,:128]!
1129        vmin.f32        q10, q2,  q1
1130        vld1.f32        {q3},[r1,:128]!
1131        vmin.f32        q11, q3,  q1
11321:      vmax.f32        q8,  q10, q0
1133        vmax.f32        q9,  q11, q0
1134        subs            r2,  r2,  #8
1135        beq             2f
1136        vld1.f32        {q2},[r1,:128]!
1137        vmin.f32        q10, q2,  q1
1138        vld1.f32        {q3},[r1,:128]!
1139        vmin.f32        q11, q3,  q1
1140        vst1.f32        {q8},[r0,:128]!
1141        vst1.f32        {q9},[r0,:128]!
1142        b               1b
11432:      vst1.f32        {q8},[r0,:128]!
1144        vst1.f32        {q9},[r0,:128]!
1145        bx              lr
1146endfunc
1147