2 * ARM NEON optimised DSP functions
3 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
5 * This file is part of FFmpeg.
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.
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.
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
28 function ff_clear_block_neon, export=1
31 vst1.16 {q0}, [r0,:128]!
36 function ff_clear_blocks_neon, export=1
39 vst1.16 {q0}, [r0,:128]!
48 1: vld1.64 {d0, d1}, [r1], r2
49 vld1.64 {d2, d3}, [r1], r2
50 vld1.64 {d4, d5}, [r1], r2
52 vld1.64 {d6, d7}, [r1], r2
57 vld1.64 {d16,d17}, [ip,:128], r2
59 vld1.64 {d18,d19}, [ip,:128], r2
61 vld1.64 {d20,d21}, [ip,:128], r2
63 vld1.64 {d22,d23}, [ip,:128], r2
67 vst1.64 {d0, d1}, [r0,:128], r2
68 vst1.64 {d2, d3}, [r0,:128], r2
69 vst1.64 {d4, d5}, [r0,:128], r2
70 vst1.64 {d6, d7}, [r0,:128], r2
75 .macro pixels16_x2 vhadd=vrhadd.u8
76 1: vld1.64 {d0-d2}, [r1], r2
77 vld1.64 {d4-d6}, [r1], r2
85 vst1.64 {d0, d1}, [r0,:128], r2
86 vst1.64 {d4, d5}, [r0,:128], r2
91 .macro pixels16_y2 vhadd=vrhadd.u8
92 vld1.64 {d0, d1}, [r1], r2
93 vld1.64 {d2, d3}, [r1], r2
96 vld1.64 {d0, d1}, [r1], r2
98 vld1.64 {d2, d3}, [r1], r2
101 vst1.64 {d4, d5}, [r0,:128], r2
102 vst1.64 {d6, d7}, [r0,:128], r2
107 .macro pixels16_xy2 vshrn=vrshrn.u16 no_rnd=0
108 vld1.64 {d0-d2}, [r1], r2
109 vld1.64 {d4-d6}, [r1], r2
115 vext.8 q1, q0, q1, #1
116 vext.8 q3, q2, q3, #1
122 vld1.64 {d0-d2}, [r1], r2
126 vadd.u16 q12, q12, q13
128 vext.8 q15, q0, q1, #1
129 vadd.u16 q1 , q10, q11
136 vld1.64 {d2-d4}, [r1], r2
137 vaddl.u8 q10, d1, d31
138 vst1.64 {d28,d29}, [r0,:128], r2
142 vadd.u16 q12, q12, q13
144 vext.8 q2, q1, q2, #1
145 vadd.u16 q0, q10, q11
153 vst1.64 {d30,d31}, [r0,:128], r2
159 1: vld1.64 {d0}, [r1], r2
160 vld1.64 {d1}, [r1], r2
161 vld1.64 {d2}, [r1], r2
163 vld1.64 {d3}, [r1], r2
168 vld1.64 {d4}, [r0,:64], r2
170 vld1.64 {d5}, [r0,:64], r2
172 vld1.64 {d6}, [r0,:64], r2
174 vld1.64 {d7}, [r0,:64], r2
176 sub r0, r0, r2, lsl #2
179 vst1.64 {d0}, [r0,:64], r2
180 vst1.64 {d1}, [r0,:64], r2
181 vst1.64 {d2}, [r0,:64], r2
182 vst1.64 {d3}, [r0,:64], r2
187 .macro pixels8_x2 vhadd=vrhadd.u8
188 1: vld1.64 {d0, d1}, [r1], r2
189 vext.8 d1, d0, d1, #1
190 vld1.64 {d2, d3}, [r1], r2
191 vext.8 d3, d2, d3, #1
197 vst1.64 {d0}, [r0,:64], r2
198 vst1.64 {d1}, [r0,:64], r2
203 .macro pixels8_y2 vhadd=vrhadd.u8
204 vld1.64 {d0}, [r1], r2
205 vld1.64 {d1}, [r1], r2
208 vld1.64 {d0}, [r1], r2
210 vld1.64 {d1}, [r1], r2
213 vst1.64 {d4}, [r0,:64], r2
214 vst1.64 {d5}, [r0,:64], r2
219 .macro pixels8_xy2 vshrn=vrshrn.u16 no_rnd=0
220 vld1.64 {d0, d1}, [r1], r2
221 vld1.64 {d2, d3}, [r1], r2
227 vext.8 d4, d0, d1, #1
228 vext.8 d6, d2, d3, #1
232 vld1.64 {d0, d1}, [r1], r2
235 vext.8 d4, d0, d1, #1
237 vadd.u16 q10, q10, q11
241 vld1.64 {d2, d3}, [r1], r2
245 vadd.u16 q10, q10, q11
247 vst1.64 {d5}, [r0,:64], r2
249 vext.8 d6, d2, d3, #1
251 vst1.64 {d7}, [r0,:64], r2
256 .macro pixfunc pfx name suf rnd_op args:vararg
257 function ff_\pfx\name\suf\()_neon, export=1
262 .macro pixfunc2 pfx name args:vararg
264 pixfunc \pfx \name \args
267 function ff_put_h264_qpel16_mc00_neon, export=1
271 pixfunc put_ pixels16
272 pixfunc2 put_ pixels16_x2, _no_rnd, vhadd.u8
273 pixfunc2 put_ pixels16_y2, _no_rnd, vhadd.u8
274 pixfunc2 put_ pixels16_xy2, _no_rnd, vshrn.u16, 1
276 function ff_avg_h264_qpel16_mc00_neon, export=1
280 pixfunc avg_ pixels16,, 1
282 function ff_put_h264_qpel8_mc00_neon, export=1
287 pixfunc2 put_ pixels8_x2, _no_rnd, vhadd.u8
288 pixfunc2 put_ pixels8_y2, _no_rnd, vhadd.u8
289 pixfunc2 put_ pixels8_xy2, _no_rnd, vshrn.u16, 1
291 function ff_avg_h264_qpel8_mc00_neon, export=1
295 pixfunc avg_ pixels8,, 1
297 function ff_put_pixels_clamped_neon, export=1
298 vld1.64 {d16-d19}, [r0,:128]!
300 vld1.64 {d20-d23}, [r0,:128]!
302 vld1.64 {d24-d27}, [r0,:128]!
304 vld1.64 {d28-d31}, [r0,:128]!
306 vst1.64 {d0}, [r1,:64], r2
308 vst1.64 {d1}, [r1,:64], r2
310 vst1.64 {d2}, [r1,:64], r2
312 vst1.64 {d3}, [r1,:64], r2
314 vst1.64 {d4}, [r1,:64], r2
315 vst1.64 {d5}, [r1,:64], r2
316 vst1.64 {d6}, [r1,:64], r2
317 vst1.64 {d7}, [r1,:64], r2
321 function ff_put_signed_pixels_clamped_neon, export=1
323 vld1.64 {d16-d17}, [r0,:128]!
325 vld1.64 {d18-d19}, [r0,:128]!
327 vld1.64 {d16-d17}, [r0,:128]!
329 vld1.64 {d18-d19}, [r0,:128]!
331 vld1.64 {d20-d21}, [r0,:128]!
333 vld1.64 {d22-d23}, [r0,:128]!
335 vst1.64 {d0}, [r1,:64], r2
337 vst1.64 {d1}, [r1,:64], r2
339 vst1.64 {d2}, [r1,:64], r2
341 vld1.64 {d24-d25}, [r0,:128]!
343 vld1.64 {d26-d27}, [r0,:128]!
346 vst1.64 {d3}, [r1,:64], r2
348 vst1.64 {d4}, [r1,:64], r2
350 vst1.64 {d5}, [r1,:64], r2
353 vst1.64 {d6}, [r1,:64], r2
354 vst1.64 {d7}, [r1,:64], r2
358 function ff_add_pixels_clamped_neon, export=1
360 vld1.64 {d16}, [r1,:64], r2
361 vld1.64 {d0-d1}, [r0,:128]!
363 vld1.64 {d17}, [r1,:64], r2
364 vld1.64 {d2-d3}, [r0,:128]!
366 vld1.64 {d18}, [r1,:64], r2
368 vld1.64 {d4-d5}, [r0,:128]!
370 vst1.64 {d0}, [r3,:64], r2
372 vld1.64 {d19}, [r1,:64], r2
373 vld1.64 {d6-d7}, [r0,:128]!
376 vst1.64 {d2}, [r3,:64], r2
377 vld1.64 {d16}, [r1,:64], r2
379 vld1.64 {d0-d1}, [r0,:128]!
381 vst1.64 {d4}, [r3,:64], r2
382 vld1.64 {d17}, [r1,:64], r2
383 vld1.64 {d2-d3}, [r0,:128]!
385 vst1.64 {d6}, [r3,:64], r2
387 vld1.64 {d18}, [r1,:64], r2
388 vld1.64 {d4-d5}, [r0,:128]!
390 vst1.64 {d0}, [r3,:64], r2
392 vld1.64 {d19}, [r1,:64], r2
394 vld1.64 {d6-d7}, [r0,:128]!
396 vst1.64 {d2}, [r3,:64], r2
398 vst1.64 {d4}, [r3,:64], r2
399 vst1.64 {d6}, [r3,:64], r2
403 function ff_float_to_int16_neon, export=1
405 vld1.64 {d0-d1}, [r1,:128]!
406 vcvt.s32.f32 q8, q0, #16
407 vld1.64 {d2-d3}, [r1,:128]!
408 vcvt.s32.f32 q9, q1, #16
413 vshrn.s32 d4, q8, #16
414 vld1.64 {d0-d1}, [r1,:128]!
415 vcvt.s32.f32 q0, q0, #16
416 vshrn.s32 d5, q9, #16
417 vld1.64 {d2-d3}, [r1,:128]!
418 vcvt.s32.f32 q1, q1, #16
419 vshrn.s32 d6, q0, #16
420 vst1.64 {d4-d5}, [r0,:128]!
421 vshrn.s32 d7, q1, #16
422 vld1.64 {d16-d17},[r1,:128]!
423 vcvt.s32.f32 q8, q8, #16
424 vld1.64 {d18-d19},[r1,:128]!
425 vcvt.s32.f32 q9, q9, #16
426 vst1.64 {d6-d7}, [r0,:128]!
430 2: vld1.64 {d0-d1}, [r1,:128]!
431 vshrn.s32 d4, q8, #16
432 vcvt.s32.f32 q0, q0, #16
433 vld1.64 {d2-d3}, [r1,:128]!
434 vshrn.s32 d5, q9, #16
435 vcvt.s32.f32 q1, q1, #16
436 vshrn.s32 d6, q0, #16
437 vst1.64 {d4-d5}, [r0,:128]!
438 vshrn.s32 d7, q1, #16
439 vst1.64 {d6-d7}, [r0,:128]!
441 3: vshrn.s32 d4, q8, #16
442 vshrn.s32 d5, q9, #16
443 vst1.64 {d4-d5}, [r0,:128]!
447 function ff_float_to_int16_interleave_neon, export=1
450 blt ff_float_to_int16_neon
457 vld1.64 {d0-d1}, [r3,:128]!
458 vcvt.s32.f32 q8, q0, #16
459 vld1.64 {d2-d3}, [r3,:128]!
460 vcvt.s32.f32 q9, q1, #16
461 vld1.64 {d20-d21},[r1,:128]!
462 vcvt.s32.f32 q10, q10, #16
463 vld1.64 {d22-d23},[r1,:128]!
464 vcvt.s32.f32 q11, q11, #16
469 vld1.64 {d0-d1}, [r3,:128]!
470 vcvt.s32.f32 q0, q0, #16
472 vld1.64 {d2-d3}, [r3,:128]!
473 vcvt.s32.f32 q1, q1, #16
474 vld1.64 {d24-d25},[r1,:128]!
475 vcvt.s32.f32 q12, q12, #16
476 vld1.64 {d26-d27},[r1,:128]!
478 vst1.64 {d20-d21},[r0,:128]!
479 vcvt.s32.f32 q13, q13, #16
480 vst1.64 {d22-d23},[r0,:128]!
482 vld1.64 {d16-d17},[r3,:128]!
484 vst1.64 {d24-d25},[r0,:128]!
485 vcvt.s32.f32 q8, q8, #16
486 vld1.64 {d18-d19},[r3,:128]!
487 vcvt.s32.f32 q9, q9, #16
488 vld1.64 {d20-d21},[r1,:128]!
489 vcvt.s32.f32 q10, q10, #16
490 vld1.64 {d22-d23},[r1,:128]!
491 vcvt.s32.f32 q11, q11, #16
492 vst1.64 {d26-d27},[r0,:128]!
496 2: vsri.32 q10, q8, #16
497 vld1.64 {d0-d1}, [r3,:128]!
498 vcvt.s32.f32 q0, q0, #16
499 vld1.64 {d2-d3}, [r3,:128]!
500 vcvt.s32.f32 q1, q1, #16
501 vld1.64 {d24-d25},[r1,:128]!
502 vcvt.s32.f32 q12, q12, #16
504 vld1.64 {d26-d27},[r1,:128]!
505 vcvt.s32.f32 q13, q13, #16
506 vst1.64 {d20-d21},[r0,:128]!
508 vst1.64 {d22-d23},[r0,:128]!
510 vst1.64 {d24-d27},[r0,:128]!
512 3: vsri.32 q10, q8, #16
514 vst1.64 {d20-d23},[r0,:128]!
523 5: ldmia r1!, {r4-r7}
526 vld1.64 {d16-d17},[r4,:128]!
527 vcvt.s32.f32 q8, q8, #16
528 vld1.64 {d18-d19},[r5,:128]!
529 vcvt.s32.f32 q9, q9, #16
530 vld1.64 {d20-d21},[r6,:128]!
531 vcvt.s32.f32 q10, q10, #16
532 vld1.64 {d22-d23},[r7,:128]!
533 vcvt.s32.f32 q11, q11, #16
535 vld1.64 {d0-d1}, [r4,:128]!
536 vcvt.s32.f32 q0, q0, #16
538 vld1.64 {d2-d3}, [r5,:128]!
539 vcvt.s32.f32 q1, q1, #16
540 vsri.32 q11, q10, #16
541 vld1.64 {d4-d5}, [r6,:128]!
542 vcvt.s32.f32 q2, q2, #16
544 vld1.64 {d6-d7}, [r7,:128]!
545 vcvt.s32.f32 q3, q3, #16
547 vst1.64 {d18}, [r8], ip
549 vst1.64 {d22}, [r8], ip
551 vst1.64 {d19}, [r8], ip
553 vst1.64 {d23}, [r8], ip
556 vld1.64 {d16-d17},[r4,:128]!
557 vcvt.s32.f32 q8, q8, #16
558 vst1.64 {d2}, [r8], ip
559 vld1.64 {d18-d19},[r5,:128]!
560 vcvt.s32.f32 q9, q9, #16
561 vst1.64 {d6}, [r8], ip
562 vld1.64 {d20-d21},[r6,:128]!
563 vcvt.s32.f32 q10, q10, #16
564 vst1.64 {d3}, [r8], ip
565 vld1.64 {d22-d23},[r7,:128]!
566 vcvt.s32.f32 q11, q11, #16
567 vst1.64 {d7}, [r8], ip
569 7: vst1.64 {d2}, [r8], ip
570 vst1.64 {d6}, [r8], ip
571 vst1.64 {d3}, [r8], ip
572 vst1.64 {d7}, [r8], ip
586 vld1.64 {d16-d17},[r4,:128]!
587 vcvt.s32.f32 q8, q8, #16
588 vld1.64 {d18-d19},[r5,:128]!
589 vcvt.s32.f32 q9, q9, #16
590 vld1.64 {d20-d21},[r4,:128]!
591 vcvt.s32.f32 q10, q10, #16
592 vld1.64 {d22-d23},[r5,:128]!
593 vcvt.s32.f32 q11, q11, #16
597 vsri.32 d18, d16, #16
598 vsri.32 d19, d17, #16
599 vld1.64 {d16-d17},[r4,:128]!
600 vcvt.s32.f32 q8, q8, #16
601 vst1.32 {d18[0]}, [r8], ip
602 vsri.32 d22, d20, #16
603 vst1.32 {d18[1]}, [r8], ip
604 vsri.32 d23, d21, #16
605 vst1.32 {d19[0]}, [r8], ip
606 vst1.32 {d19[1]}, [r8], ip
607 vld1.64 {d18-d19},[r5,:128]!
608 vcvt.s32.f32 q9, q9, #16
609 vst1.32 {d22[0]}, [r8], ip
610 vst1.32 {d22[1]}, [r8], ip
611 vld1.64 {d20-d21},[r4,:128]!
612 vcvt.s32.f32 q10, q10, #16
613 vst1.32 {d23[0]}, [r8], ip
614 vst1.32 {d23[1]}, [r8], ip
615 vld1.64 {d22-d23},[r5,:128]!
616 vcvt.s32.f32 q11, q11, #16
618 vld1.64 {d0-d1}, [r4,:128]!
619 vcvt.s32.f32 q0, q0, #16
620 vsri.32 d18, d16, #16
621 vld1.64 {d2-d3}, [r5,:128]!
622 vcvt.s32.f32 q1, q1, #16
623 vsri.32 d19, d17, #16
624 vld1.64 {d4-d5}, [r4,:128]!
625 vcvt.s32.f32 q2, q2, #16
626 vld1.64 {d6-d7}, [r5,:128]!
627 vcvt.s32.f32 q3, q3, #16
628 vst1.32 {d18[0]}, [r8], ip
629 vsri.32 d22, d20, #16
630 vst1.32 {d18[1]}, [r8], ip
631 vsri.32 d23, d21, #16
632 vst1.32 {d19[0]}, [r8], ip
634 vst1.32 {d19[1]}, [r8], ip
636 vst1.32 {d22[0]}, [r8], ip
638 vst1.32 {d22[1]}, [r8], ip
640 vst1.32 {d23[0]}, [r8], ip
641 vst1.32 {d23[1]}, [r8], ip
643 vld1.64 {d16-d17},[r4,:128]!
644 vcvt.s32.f32 q8, q8, #16
645 vst1.32 {d2[0]}, [r8], ip
646 vst1.32 {d2[1]}, [r8], ip
647 vld1.64 {d18-d19},[r5,:128]!
648 vcvt.s32.f32 q9, q9, #16
649 vst1.32 {d3[0]}, [r8], ip
650 vst1.32 {d3[1]}, [r8], ip
651 vld1.64 {d20-d21},[r4,:128]!
652 vcvt.s32.f32 q10, q10, #16
653 vst1.32 {d6[0]}, [r8], ip
654 vst1.32 {d6[1]}, [r8], ip
655 vld1.64 {d22-d23},[r5,:128]!
656 vcvt.s32.f32 q11, q11, #16
657 vst1.32 {d7[0]}, [r8], ip
658 vst1.32 {d7[1]}, [r8], ip
660 6: vst1.32 {d2[0]}, [r8], ip
661 vst1.32 {d2[1]}, [r8], ip
662 vst1.32 {d3[0]}, [r8], ip
663 vst1.32 {d3[1]}, [r8], ip
664 vst1.32 {d6[0]}, [r8], ip
665 vst1.32 {d6[1]}, [r8], ip
666 vst1.32 {d7[0]}, [r8], ip
667 vst1.32 {d7[1]}, [r8], ip
669 7: vsri.32 d18, d16, #16
670 vsri.32 d19, d17, #16
671 vst1.32 {d18[0]}, [r8], ip
672 vsri.32 d22, d20, #16
673 vst1.32 {d18[1]}, [r8], ip
674 vsri.32 d23, d21, #16
675 vst1.32 {d19[0]}, [r8], ip
676 vst1.32 {d19[1]}, [r8], ip
677 vst1.32 {d22[0]}, [r8], ip
678 vst1.32 {d22[1]}, [r8], ip
679 vst1.32 {d23[0]}, [r8], ip
680 vst1.32 {d23[1]}, [r8], ip
690 vld1.64 {d0-d1}, [r4,:128]!
691 vcvt.s32.f32 q0, q0, #16
692 vld1.64 {d2-d3}, [r4,:128]!
693 vcvt.s32.f32 q1, q1, #16
696 vld1.64 {d4-d5}, [r4,:128]!
697 vcvt.s32.f32 q2, q2, #16
698 vld1.64 {d6-d7}, [r4,:128]!
699 vcvt.s32.f32 q3, q3, #16
700 vst1.16 {d0[1]}, [r5,:16], ip
701 vst1.16 {d0[3]}, [r5,:16], ip
702 vst1.16 {d1[1]}, [r5,:16], ip
703 vst1.16 {d1[3]}, [r5,:16], ip
704 vst1.16 {d2[1]}, [r5,:16], ip
705 vst1.16 {d2[3]}, [r5,:16], ip
706 vst1.16 {d3[1]}, [r5,:16], ip
707 vst1.16 {d3[3]}, [r5,:16], ip
709 vld1.64 {d0-d1}, [r4,:128]!
710 vcvt.s32.f32 q0, q0, #16
711 vld1.64 {d2-d3}, [r4,:128]!
712 vcvt.s32.f32 q1, q1, #16
713 7: vst1.16 {d4[1]}, [r5,:16], ip
714 vst1.16 {d4[3]}, [r5,:16], ip
715 vst1.16 {d5[1]}, [r5,:16], ip
716 vst1.16 {d5[3]}, [r5,:16], ip
717 vst1.16 {d6[1]}, [r5,:16], ip
718 vst1.16 {d6[3]}, [r5,:16], ip
719 vst1.16 {d7[1]}, [r5,:16], ip
720 vst1.16 {d7[3]}, [r5,:16], ip
724 vst1.16 {d0[1]}, [r5,:16], ip
725 vst1.16 {d0[3]}, [r5,:16], ip
726 vst1.16 {d1[1]}, [r5,:16], ip
727 vst1.16 {d1[3]}, [r5,:16], ip
728 vst1.16 {d2[1]}, [r5,:16], ip
729 vst1.16 {d2[3]}, [r5,:16], ip
730 vst1.16 {d3[1]}, [r5,:16], ip
731 vst1.16 {d3[3]}, [r5,:16], ip
733 vld1.64 {d0-d1}, [r4,:128]!
734 vcvt.s32.f32 q0, q0, #16
735 vld1.64 {d2-d3}, [r4,:128]!
736 vcvt.s32.f32 q1, q1, #16
740 function ff_vector_fmul_neon, export=1
743 vld1.64 {d0-d3}, [r0,:128]!
744 vld1.64 {d4-d7}, [r1,:128]!
751 vld1.64 {d0-d1}, [r0,:128]!
752 vld1.64 {d4-d5}, [r1,:128]!
754 vld1.64 {d2-d3}, [r0,:128]!
755 vld1.64 {d6-d7}, [r1,:128]!
757 vst1.64 {d16-d19},[r3,:128]!
758 vld1.64 {d0-d1}, [r0,:128]!
759 vld1.64 {d4-d5}, [r1,:128]!
761 vld1.64 {d2-d3}, [r0,:128]!
762 vld1.64 {d6-d7}, [r1,:128]!
764 vst1.64 {d20-d23},[r3,:128]!
768 2: vld1.64 {d0-d1}, [r0,:128]!
769 vld1.64 {d4-d5}, [r1,:128]!
770 vst1.64 {d16-d17},[r3,:128]!
772 vld1.64 {d2-d3}, [r0,:128]!
773 vld1.64 {d6-d7}, [r1,:128]!
774 vst1.64 {d18-d19},[r3,:128]!
776 3: vst1.64 {d16-d19},[r3,:128]!
780 function ff_vector_fmul_window_neon, export=1
781 VFP vdup.32 q8, d0[0]
782 NOVFP vld1.32 {d16[],d17[]}, [sp,:32]
784 VFP ldr lr, [sp, #12]
785 NOVFP ldr lr, [sp, #16]
788 add r2, r2, r5, lsl #2
789 add r4, r3, r5, lsl #3
790 add ip, r0, r5, lsl #3
792 vld1.64 {d0,d1}, [r1,:128]!
793 vld1.64 {d2,d3}, [r2,:128], r5
794 vld1.64 {d4,d5}, [r3,:128]!
795 vld1.64 {d6,d7}, [r4,:128], r5
807 vld1.64 {d0,d1}, [r1,:128]!
809 vld1.64 {d18,d19},[r2,:128], r5
811 vld1.64 {d24,d25},[r3,:128]!
813 vld1.64 {d6,d7}, [r4,:128], r5
818 vst1.64 {d20,d21},[r0,:128]!
819 vst1.64 {d22,d23},[ip,:128], r5
821 2: vmla.f32 d22, d3, d7
827 vst1.64 {d20,d21},[r0,:128]!
828 vst1.64 {d22,d23},[ip,:128], r5
832 #if CONFIG_VORBIS_DECODER
833 function ff_vorbis_inverse_coupling_neon, export=1
840 vld1.32 {d24-d25},[r1,:128]!
841 vld1.32 {d22-d23},[r0,:128]!
847 vadd.f32 q12, q11, q2
848 vsub.f32 q11, q11, q3
849 1: vld1.32 {d2-d3}, [r1,:128]!
850 vld1.32 {d0-d1}, [r0,:128]!
854 vst1.32 {d24-d25},[r3, :128]!
855 vst1.32 {d22-d23},[r12,:128]!
862 vld1.32 {d24-d25},[r1,:128]!
863 vld1.32 {d22-d23},[r0,:128]!
867 vst1.32 {d2-d3}, [r3, :128]!
868 vst1.32 {d0-d1}, [r12,:128]!
871 vadd.f32 q12, q11, q2
872 vsub.f32 q11, q11, q3
875 2: vst1.32 {d2-d3}, [r3, :128]!
876 vst1.32 {d0-d1}, [r12,:128]!
879 3: vld1.32 {d2-d3}, [r1,:128]
880 vld1.32 {d0-d1}, [r0,:128]
888 vst1.32 {d2-d3}, [r0,:128]!
889 vst1.32 {d0-d1}, [r1,:128]!
894 function ff_vector_fmul_scalar_neon, export=1
897 VFP vdup.32 q8, d0[0]
901 vld1.32 {q0},[r1,:128]!
902 vld1.32 {q1},[r1,:128]!
903 1: vmul.f32 q0, q0, q8
904 vld1.32 {q2},[r1,:128]!
906 vld1.32 {q3},[r1,:128]!
908 vst1.32 {q0},[r0,:128]!
910 vst1.32 {q1},[r0,:128]!
913 vld1.32 {q0},[r1,:128]!
914 vst1.32 {q2},[r0,:128]!
915 vld1.32 {q1},[r1,:128]!
916 vst1.32 {q3},[r0,:128]!
918 2: vst1.32 {q2},[r0,:128]!
919 vst1.32 {q3},[r0,:128]!
922 3: vld1.32 {q0},[r1,:128]!
924 vst1.32 {q0},[r0,:128]!
931 function ff_vector_fmul_sv_scalar_2_neon, export=1
932 VFP vdup.32 d16, d0[0]
933 NOVFP vdup.32 d16, r3
935 vld1.32 {d0},[r1,:64]!
936 vld1.32 {d1},[r1,:64]!
941 vld1.32 {d2},[r12,:64]
943 vld1.32 {d3},[r12,:64]
947 vld1.32 {d0},[r1,:64]!
948 vld1.32 {d1},[r1,:64]!
949 vst1.32 {d4},[r0,:64]!
950 vst1.32 {d5},[r0,:64]!
952 2: vst1.32 {d4},[r0,:64]!
953 vst1.32 {d5},[r0,:64]!
957 function ff_vector_fmul_sv_scalar_4_neon, export=1
958 VFP vdup.32 q10, d0[0]
959 NOVFP vdup.32 q10, r3
964 vld1.32 {q0},[r1,:128]!
965 vld1.32 {q2},[r1,:128]!
967 vld1.32 {q1},[r12,:128]
969 vld1.32 {q3},[r12,:128]
976 vld1.32 {q0},[r1,:128]!
977 vld1.32 {q2},[r1,:128]!
978 vst1.32 {q8},[r0,:128]!
979 vst1.32 {q9},[r0,:128]!
981 2: vst1.32 {q8},[r0,:128]!
982 vst1.32 {q9},[r0,:128]!
985 3: vld1.32 {q0},[r1,:128]!
987 vld1.32 {q1},[r12,:128]
990 vst1.32 {q0},[r0,:128]!
996 function ff_sv_fmul_scalar_2_neon, export=1
999 VFP vdup.32 q8, d0[0]
1000 NOVFP vdup.32 q8, r2
1002 vld1.32 {d0},[r12,:64]
1004 vld1.32 {d1},[r12,:64]
1005 1: vmul.f32 q1, q0, q8
1009 vld1.32 {d0},[r12,:64]
1011 vld1.32 {d1},[r12,:64]
1012 vst1.32 {q1},[r0,:128]!
1014 2: vst1.32 {q1},[r0,:128]!
1019 function ff_sv_fmul_scalar_4_neon, export=1
1022 VFP vdup.32 q8, d0[0]
1023 NOVFP vdup.32 q8, r2
1024 1: ldr r12, [r1], #4
1025 vld1.32 {q0},[r12,:128]
1027 vst1.32 {q0},[r0,:128]!
1034 function ff_butterflies_float_neon, export=1
1035 1: vld1.32 {q0},[r0,:128]
1036 vld1.32 {q1},[r1,:128]
1039 vst1.32 {q2},[r1,:128]!
1040 vst1.32 {q1},[r0,:128]!
1046 function ff_scalarproduct_float_neon, export=1
1048 1: vld1.32 {q0},[r0,:128]!
1049 vld1.32 {q1},[r1,:128]!
1054 vpadd.f32 d0, d0, d0
1055 NOVFP vmov.32 r0, d0[0]
1059 function ff_int32_to_float_fmul_scalar_neon, export=1
1060 VFP vdup.32 q0, d0[0]
1062 NOVFP vdup.32 q0, r2
1065 vld1.32 {q1},[r1,:128]!
1067 vld1.32 {q2},[r1,:128]!
1069 1: subs len, len, #8
1072 vmul.f32 q10, q8, q0
1074 vld1.32 {q1},[r1,:128]!
1076 vld1.32 {q2},[r1,:128]!
1078 vst1.32 {q9}, [r0,:128]!
1079 vst1.32 {q10},[r0,:128]!
1081 2: vst1.32 {q9}, [r0,:128]!
1082 vst1.32 {q10},[r0,:128]!
1087 function ff_vector_fmul_reverse_neon, export=1
1088 add r2, r2, r3, lsl #2
1091 vld1.32 {q0-q1}, [r1,:128]!
1092 vld1.32 {q2-q3}, [r2,:128], r12
1095 vmul.f32 d16, d0, d7
1096 vmul.f32 d17, d1, d6
1099 vmul.f32 d18, d2, d5
1100 vmul.f32 d19, d3, d4
1103 vld1.32 {q0-q1}, [r1,:128]!
1104 vld1.32 {q2-q3}, [r2,:128], r12
1105 vst1.32 {q8-q9}, [r0,:128]!
1107 2: vst1.32 {q8-q9}, [r0,:128]!
1111 function ff_vector_fmul_add_neon, export=1
1113 vld1.32 {q0-q1}, [r1,:128]!
1114 vld1.32 {q8-q9}, [r2,:128]!
1115 vld1.32 {q2-q3}, [r3,:128]!
1116 vmul.f32 q10, q0, q8
1117 vmul.f32 q11, q1, q9
1118 1: vadd.f32 q12, q2, q10
1119 vadd.f32 q13, q3, q11
1125 vld1.32 {q0}, [r1,:128]!
1126 vld1.32 {q8}, [r2,:128]!
1127 vmul.f32 q10, q0, q8
1128 vld1.32 {q1}, [r1,:128]!
1129 vld1.32 {q9}, [r2,:128]!
1130 vmul.f32 q11, q1, q9
1131 vld1.32 {q2-q3}, [r3,:128]!
1132 vst1.32 {q12-q13},[r0,:128]!
1134 2: vst1.32 {q12-q13},[r0,:128]!
1138 function ff_vector_clipf_neon, export=1
1139 VFP vdup.32 q1, d0[1]
1140 VFP vdup.32 q0, d0[0]
1141 NOVFP vdup.32 q0, r2
1142 NOVFP vdup.32 q1, r3
1144 vld1.f32 {q2},[r1,:128]!
1145 vmin.f32 q10, q2, q1
1146 vld1.f32 {q3},[r1,:128]!
1147 vmin.f32 q11, q3, q1
1148 1: vmax.f32 q8, q10, q0
1149 vmax.f32 q9, q11, q0
1152 vld1.f32 {q2},[r1,:128]!
1153 vmin.f32 q10, q2, q1
1154 vld1.f32 {q3},[r1,:128]!
1155 vmin.f32 q11, q3, q1
1156 vst1.f32 {q8},[r0,:128]!
1157 vst1.f32 {q9},[r0,:128]!
1159 2: vst1.f32 {q8},[r0,:128]!
1160 vst1.f32 {q9},[r0,:128]!