2 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
4 * This file is part of FFmpeg.
6 * FFmpeg 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 * FFmpeg 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 FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 .macro transpose_8x8 r0 r1 r2 r3 r4 r5 r6 r7
40 .macro swap4 r0 r1 r2 r3 r4 r5 r6 r7
47 .macro transpose16_4x4 r0 r1 r2 r3 r4 r5 r6 r7
58 /* chroma_mc8(uint8_t *dst, uint8_t *src, int stride, int h, int x, int y) */
59 .macro h264_chroma_mc8 avg=0
69 rsb r6, r7, r5, lsl #3
70 rsb ip, r7, r4, lsl #3
71 sub r4, r7, r4, lsl #3
72 sub r4, r4, r5, lsl #3
82 vld1.64 {d4, d5}, [r1], r4
84 vld1.64 {d6, d7}, [r5], r4
93 vld1.64 {d4, d5}, [r1], r4
102 vrshrn.u16 d16, q8, #6
103 vld1.64 {d6, d7}, [r5], r4
105 vrshrn.u16 d17, q9, #6
107 vld1.64 {d20}, [lr,:64], r2
108 vld1.64 {d21}, [lr,:64], r2
109 vrhadd.u8 q8, q8, q10
111 vext.8 d7, d6, d7, #1
112 vst1.64 {d16}, [r0,:64], r2
113 vst1.64 {d17}, [r0,:64], r2
127 vld1.64 {d4}, [r1], r4
128 vld1.64 {d6}, [r5], r4
133 vld1.64 {d4}, [r1], r4
136 vld1.64 {d6}, [r5], r4
137 vrshrn.u16 d16, q8, #6
138 vrshrn.u16 d17, q9, #6
140 vld1.64 {d20}, [lr,:64], r2
141 vld1.64 {d21}, [lr,:64], r2
142 vrhadd.u8 q8, q8, q10
146 vst1.64 {d16}, [r0,:64], r2
147 vst1.64 {d17}, [r0,:64], r2
152 4: vld1.64 {d4, d5}, [r1], r2
153 vld1.64 {d6, d7}, [r1], r2
154 vext.8 d5, d4, d5, #1
155 vext.8 d7, d6, d7, #1
161 vld1.64 {d4, d5}, [r1], r2
165 vext.8 d5, d4, d5, #1
166 vrshrn.u16 d16, q8, #6
167 vrshrn.u16 d17, q9, #6
169 vld1.64 {d20}, [lr,:64], r2
170 vld1.64 {d21}, [lr,:64], r2
171 vrhadd.u8 q8, q8, q10
173 vld1.64 {d6, d7}, [r1], r2
174 vext.8 d7, d6, d7, #1
175 vst1.64 {d16}, [r0,:64], r2
176 vst1.64 {d17}, [r0,:64], r2
182 /* chroma_mc4(uint8_t *dst, uint8_t *src, int stride, int h, int x, int y) */
183 .macro h264_chroma_mc4 avg=0
193 rsb r6, r7, r5, lsl #3
194 rsb ip, r7, r4, lsl #3
195 sub r4, r7, r4, lsl #3
196 sub r4, r4, r5, lsl #3
206 vld1.64 {d4}, [r1], r4
208 vld1.64 {d6}, [r5], r4
211 vext.8 d5, d4, d5, #1
212 vext.8 d7, d6, d7, #1
222 vld1.64 {d4}, [r1], r4
223 vext.8 d5, d4, d5, #1
227 vld1.64 {d6}, [r5], r4
228 vadd.i16 d16, d16, d17
229 vadd.i16 d17, d18, d19
230 vrshrn.u16 d16, q8, #6
234 vld1.32 {d20[0]}, [lr,:32], r2
235 vld1.32 {d20[1]}, [lr,:32], r2
236 vrhadd.u8 d16, d16, d20
238 vext.8 d7, d6, d7, #1
240 vst1.32 {d16[0]}, [r0,:32], r2
241 vst1.32 {d16[1]}, [r0,:32], r2
254 vext.32 d1, d0, d1, #1
257 vld1.32 {d4[0]}, [r1], r4
258 vld1.32 {d4[1]}, [r5], r4
262 vld1.32 {d4[0]}, [r1], r4
264 vld1.32 {d4[1]}, [r5], r4
265 vadd.i16 d16, d16, d17
266 vadd.i16 d17, d18, d19
267 vrshrn.u16 d16, q8, #6
269 vld1.32 {d20[0]}, [lr,:32], r2
270 vld1.32 {d20[1]}, [lr,:32], r2
271 vrhadd.u8 d16, d16, d20
275 vst1.32 {d16[0]}, [r0,:32], r2
276 vst1.32 {d16[1]}, [r0,:32], r2
281 4: vld1.64 {d4}, [r1], r2
282 vld1.64 {d6}, [r1], r2
283 vext.8 d5, d4, d5, #1
284 vext.8 d7, d6, d7, #1
288 5: vmull.u8 q8, d4, d0
291 vld1.64 {d4}, [r1], r2
292 vext.8 d5, d4, d5, #1
294 vadd.i16 d16, d16, d17
295 vadd.i16 d17, d18, d19
297 vrshrn.u16 d16, q8, #6
299 vld1.32 {d20[0]}, [lr,:32], r2
300 vld1.32 {d20[1]}, [lr,:32], r2
301 vrhadd.u8 d16, d16, d20
303 vld1.64 {d6}, [r1], r2
304 vext.8 d7, d6, d7, #1
307 vst1.32 {d16[0]}, [r0,:32], r2
308 vst1.32 {d16[1]}, [r0,:32], r2
317 function ff_put_h264_chroma_mc8_neon, export=1
321 function ff_avg_h264_chroma_mc8_neon, export=1
322 h264_chroma_mc8 avg=1
325 function ff_put_h264_chroma_mc4_neon, export=1
329 function ff_avg_h264_chroma_mc4_neon, export=1
330 h264_chroma_mc4 avg=1
333 /* H.264 loop filter */
335 .macro h264_loop_filter_start
341 and ip, ip, ip, lsl #16
343 ands ip, ip, ip, lsl #8
347 .macro align_push_regs
351 vst1.64 {d12-d15}, [sp,:128]
353 vst1.64 {d8-d11}, [sp,:128]
356 .macro align_pop_regs
357 vld1.64 {d8-d11}, [sp,:128]!
358 vld1.64 {d12-d15}, [sp,:128], ip
361 .macro h264_loop_filter_luma
362 vdup.8 q11, r2 @ alpha
364 vabd.u8 q6, q8, q0 @ abs(p0 - q0)
366 vabd.u8 q14, q9, q8 @ abs(p1 - p0)
368 vabd.u8 q15, q1, q0 @ abs(q1 - q0)
369 vsli.32 q12, q12, #16
370 vclt.u8 q6, q6, q11 @ < alpha
371 vdup.8 q11, r3 @ beta
373 vclt.u8 q14, q14, q11 @ < beta
374 vclt.u8 q15, q15, q11 @ < beta
376 vabd.u8 q4, q10, q8 @ abs(p2 - p0)
378 vabd.u8 q5, q2, q0 @ abs(q2 - q0)
379 vclt.u8 q4, q4, q11 @ < beta
381 vclt.u8 q5, q5, q11 @ < beta
385 vrhadd.u8 q14, q8, q0
388 vhadd.u8 q10, q10, q14
390 vhadd.u8 q14, q2, q14
392 vqsub.u8 q11, q9, q12
395 vqsub.u8 q11, q1, q12
398 vmax.u8 q14, q14, q11
401 vsubw.u8 q10, q10, d17
403 vshl.i16 q10, q10, #2
405 vaddw.u8 q10, q10, d19
407 vsubw.u8 q10, q10, d3
408 vrshrn.i16 d4, q2, #3
409 vrshrn.i16 d5, q10, #3
419 vaddw.s8 q14, q14, d4
421 vsubw.s8 q11, q11, d4
422 vsubw.s8 q12, q12, d5
429 function ff_h264_v_loop_filter_luma_neon, export=1
430 h264_loop_filter_start
432 vld1.64 {d0, d1}, [r0,:128], r1
433 vld1.64 {d2, d3}, [r0,:128], r1
434 vld1.64 {d4, d5}, [r0,:128], r1
435 sub r0, r0, r1, lsl #2
436 sub r0, r0, r1, lsl #1
437 vld1.64 {d20,d21}, [r0,:128], r1
438 vld1.64 {d18,d19}, [r0,:128], r1
439 vld1.64 {d16,d17}, [r0,:128], r1
443 h264_loop_filter_luma
445 sub r0, r0, r1, lsl #1
446 vst1.64 {d8, d9}, [r0,:128], r1
447 vst1.64 {d16,d17}, [r0,:128], r1
448 vst1.64 {d0, d1}, [r0,:128], r1
449 vst1.64 {d10,d11}, [r0,:128]
455 function ff_h264_h_loop_filter_luma_neon, export=1
456 h264_loop_filter_start
459 vld1.64 {d6}, [r0], r1
460 vld1.64 {d20}, [r0], r1
461 vld1.64 {d18}, [r0], r1
462 vld1.64 {d16}, [r0], r1
463 vld1.64 {d0}, [r0], r1
464 vld1.64 {d2}, [r0], r1
465 vld1.64 {d4}, [r0], r1
466 vld1.64 {d26}, [r0], r1
467 vld1.64 {d7}, [r0], r1
468 vld1.64 {d21}, [r0], r1
469 vld1.64 {d19}, [r0], r1
470 vld1.64 {d17}, [r0], r1
471 vld1.64 {d1}, [r0], r1
472 vld1.64 {d3}, [r0], r1
473 vld1.64 {d5}, [r0], r1
474 vld1.64 {d27}, [r0], r1
476 transpose_8x8 q3, q10, q9, q8, q0, q1, q2, q13
480 vst1.64 {d4, d5}, [sp,:128]
482 vst1.64 {d20,d21}, [sp,:128]
484 h264_loop_filter_luma
486 vld1.64 {d20,d21}, [sp,:128]!
487 vld1.64 {d4, d5}, [sp,:128]!
489 transpose_8x8 q3, q10, q4, q8, q0, q5, q2, q13
491 sub r0, r0, r1, lsl #4
492 vst1.64 {d6}, [r0], r1
493 vst1.64 {d20}, [r0], r1
494 vst1.64 {d8}, [r0], r1
495 vst1.64 {d16}, [r0], r1
496 vst1.64 {d0}, [r0], r1
497 vst1.64 {d10}, [r0], r1
498 vst1.64 {d4}, [r0], r1
499 vst1.64 {d26}, [r0], r1
500 vst1.64 {d7}, [r0], r1
501 vst1.64 {d21}, [r0], r1
502 vst1.64 {d9}, [r0], r1
503 vst1.64 {d17}, [r0], r1
504 vst1.64 {d1}, [r0], r1
505 vst1.64 {d11}, [r0], r1
506 vst1.64 {d5}, [r0], r1
507 vst1.64 {d27}, [r0], r1
513 .macro h264_loop_filter_chroma
514 vdup.8 d22, r2 @ alpha
516 vabd.u8 d26, d16, d0 @ abs(p0 - q0)
518 vabd.u8 d28, d18, d16 @ abs(p1 - p0)
522 vabd.u8 d30, d2, d0 @ abs(q1 - q0)
524 vclt.u8 d26, d26, d22 @ < alpha
526 vdup.8 d22, r3 @ beta
528 vrshrn.i16 d4, q2, #3
529 vclt.u8 d28, d28, d22 @ < beta
531 vclt.u8 d30, d30, d22 @ < beta
540 vaddw.s8 q14, q14, d4
541 vsubw.s8 q11, q11, d4
546 function ff_h264_v_loop_filter_chroma_neon, export=1
547 h264_loop_filter_start
549 sub r0, r0, r1, lsl #1
550 vld1.64 {d18}, [r0,:64], r1
551 vld1.64 {d16}, [r0,:64], r1
552 vld1.64 {d0}, [r0,:64], r1
553 vld1.64 {d2}, [r0,:64]
555 h264_loop_filter_chroma
557 sub r0, r0, r1, lsl #1
558 vst1.64 {d16}, [r0,:64], r1
559 vst1.64 {d0}, [r0,:64], r1
564 function ff_h264_h_loop_filter_chroma_neon, export=1
565 h264_loop_filter_start
568 vld1.32 {d18[0]}, [r0], r1
569 vld1.32 {d16[0]}, [r0], r1
570 vld1.32 {d0[0]}, [r0], r1
571 vld1.32 {d2[0]}, [r0], r1
572 vld1.32 {d18[1]}, [r0], r1
573 vld1.32 {d16[1]}, [r0], r1
574 vld1.32 {d0[1]}, [r0], r1
575 vld1.32 {d2[1]}, [r0], r1
582 h264_loop_filter_chroma
589 sub r0, r0, r1, lsl #3
590 vst1.32 {d18[0]}, [r0], r1
591 vst1.32 {d16[0]}, [r0], r1
592 vst1.32 {d0[0]}, [r0], r1
593 vst1.32 {d2[0]}, [r0], r1
594 vst1.32 {d18[1]}, [r0], r1
595 vst1.32 {d16[1]}, [r0], r1
596 vst1.32 {d0[1]}, [r0], r1
597 vst1.32 {d2[1]}, [r0], r1
604 .macro lowpass_const r
610 .macro lowpass_8 r0, r1, r2, r3, d0, d1, narrow=1
618 vext.8 d2, \r0, \r1, #2
619 vext.8 d3, \r0, \r1, #3
621 vext.8 d4, \r0, \r1, #1
622 vext.8 d5, \r0, \r1, #4
624 vext.8 d30, \r0, \r1, #5
625 vaddl.u8 t0, \r0, d30
626 vext.8 d18, \r2, \r3, #2
627 vmla.i16 t0, q1, d6[1]
628 vext.8 d19, \r2, \r3, #3
629 vaddl.u8 q9, d18, d19
630 vext.8 d20, \r2, \r3, #1
631 vmls.i16 t0, q2, d6[0]
632 vext.8 d21, \r2, \r3, #4
633 vaddl.u8 q10, d20, d21
634 vext.8 d31, \r2, \r3, #5
635 vaddl.u8 t1, \r2, d31
636 vmla.i16 t1, q9, d6[1]
637 vmls.i16 t1, q10, d6[0]
639 vqrshrun.s16 \d0, t0, #5
640 vqrshrun.s16 \d1, t1, #5
646 .macro lowpass_8_1 r0, r1, d0, narrow=1
652 vext.8 d2, \r0, \r1, #2
653 vext.8 d3, \r0, \r1, #3
655 vext.8 d4, \r0, \r1, #1
656 vext.8 d5, \r0, \r1, #4
658 vext.8 d30, \r0, \r1, #5
659 vaddl.u8 t0, \r0, d30
660 vmla.i16 t0, q1, d6[1]
661 vmls.i16 t0, q2, d6[0]
663 vqrshrun.s16 \d0, t0, #5
668 .macro lowpass_8.16 r0, r1, l0, h0, l1, h1, d
669 vext.16 q1, \r0, \r1, #2
670 vext.16 q0, \r0, \r1, #3
672 vext.16 q2, \r0, \r1, #1
674 vext.16 q3, \r0, \r1, #4
675 vaddl.s16 q10, d4, d6
676 vext.16 \r1, \r0, \r1, #5
678 vaddl.s16 q0, \h0, \h1
679 vaddl.s16 q8, \l0, \l1
683 vshl.i32 q15, q10, #2
685 vadd.i32 q10, q10, q15
699 vrshrn.s32 d18, q9, #10
700 vrshrn.s32 d19, q1, #10
705 function put_h264_qpel16_h_lowpass_neon_packed
709 bl put_h264_qpel8_h_lowpass_neon
710 sub r1, r1, r2, lsl #4
714 b put_h264_qpel8_h_lowpass_neon
717 function put_h264_qpel16_h_lowpass_neon
720 bl put_h264_qpel8_h_lowpass_neon
721 sub r0, r0, r3, lsl #4
722 sub r1, r1, r2, lsl #4
729 function put_h264_qpel8_h_lowpass_neon
730 1: vld1.64 {d0, d1}, [r1], r2
731 vld1.64 {d16,d17}, [r1], r2
733 lowpass_8 d0, d1, d16, d17, d0, d16
734 vst1.64 {d0}, [r0,:64], r3
735 vst1.64 {d16}, [r0,:64], r3
740 function put_h264_qpel16_h_lowpass_l2_neon
743 bl put_h264_qpel8_h_lowpass_l2_neon
744 sub r0, r0, r2, lsl #4
745 sub r1, r1, r2, lsl #4
746 sub r3, r3, r2, lsl #4
754 function put_h264_qpel8_h_lowpass_l2_neon
755 1: vld1.64 {d0, d1}, [r1], r2
756 vld1.64 {d16,d17}, [r1], r2
757 vld1.64 {d28}, [r3], r2
758 vld1.64 {d29}, [r3], r2
760 lowpass_8 d0, d1, d16, d17, d0, d1
761 vrhadd.u8 q0, q0, q14
762 vst1.64 {d0}, [r0,:64], r2
763 vst1.64 {d1}, [r0,:64], r2
768 function put_h264_qpel16_v_lowpass_neon_packed
771 bl put_h264_qpel8_v_lowpass_neon
772 sub r1, r1, r3, lsl #2
773 bl put_h264_qpel8_v_lowpass_neon
774 sub r1, r1, r3, lsl #4
775 sub r1, r1, r3, lsl #2
777 bl put_h264_qpel8_v_lowpass_neon
778 sub r1, r1, r3, lsl #2
780 b put_h264_qpel8_v_lowpass_neon
783 function put_h264_qpel16_v_lowpass_neon
785 bl put_h264_qpel8_v_lowpass_neon
786 sub r1, r1, r3, lsl #2
787 bl put_h264_qpel8_v_lowpass_neon
788 sub r0, r0, r2, lsl #4
790 sub r1, r1, r3, lsl #4
791 sub r1, r1, r3, lsl #2
793 bl put_h264_qpel8_v_lowpass_neon
794 sub r1, r1, r3, lsl #2
798 function put_h264_qpel8_v_lowpass_neon
799 vld1.64 {d8}, [r1], r3
800 vld1.64 {d10}, [r1], r3
801 vld1.64 {d12}, [r1], r3
802 vld1.64 {d14}, [r1], r3
803 vld1.64 {d22}, [r1], r3
804 vld1.64 {d24}, [r1], r3
805 vld1.64 {d26}, [r1], r3
806 vld1.64 {d28}, [r1], r3
807 vld1.64 {d9}, [r1], r3
808 vld1.64 {d11}, [r1], r3
809 vld1.64 {d13}, [r1], r3
810 vld1.64 {d15}, [r1], r3
813 transpose_8x8 q4, q5, q6, q7, q11, q12, q13, q14
814 lowpass_8 d8, d9, d10, d11, d8, d10
815 lowpass_8 d12, d13, d14, d15, d12, d14
816 lowpass_8 d22, d23, d24, d25, d22, d24
817 lowpass_8 d26, d27, d28, d29, d26, d28
818 transpose_8x8 d8, d10, d12, d14, d22, d24, d26, d28
820 vst1.64 {d8}, [r0,:64], r2
821 vst1.64 {d10}, [r0,:64], r2
822 vst1.64 {d12}, [r0,:64], r2
823 vst1.64 {d14}, [r0,:64], r2
824 vst1.64 {d22}, [r0,:64], r2
825 vst1.64 {d24}, [r0,:64], r2
826 vst1.64 {d26}, [r0,:64], r2
827 vst1.64 {d28}, [r0,:64], r2
832 function put_h264_qpel16_v_lowpass_l2_neon
834 bl put_h264_qpel8_v_lowpass_l2_neon
835 sub r1, r1, r3, lsl #2
836 bl put_h264_qpel8_v_lowpass_l2_neon
837 sub r0, r0, r3, lsl #4
838 sub ip, ip, r2, lsl #4
841 sub r1, r1, r3, lsl #4
842 sub r1, r1, r3, lsl #2
844 bl put_h264_qpel8_v_lowpass_l2_neon
845 sub r1, r1, r3, lsl #2
849 function put_h264_qpel8_v_lowpass_l2_neon
850 vld1.64 {d8}, [r1], r3
851 vld1.64 {d10}, [r1], r3
852 vld1.64 {d12}, [r1], r3
853 vld1.64 {d14}, [r1], r3
854 vld1.64 {d22}, [r1], r3
855 vld1.64 {d24}, [r1], r3
856 vld1.64 {d26}, [r1], r3
857 vld1.64 {d28}, [r1], r3
858 vld1.64 {d9}, [r1], r3
859 vld1.64 {d11}, [r1], r3
860 vld1.64 {d13}, [r1], r3
861 vld1.64 {d15}, [r1], r3
864 transpose_8x8 q4, q5, q6, q7, q11, q12, q13, q14
865 lowpass_8 d8, d9, d10, d11, d8, d9
866 lowpass_8 d12, d13, d14, d15, d12, d13
867 lowpass_8 d22, d23, d24, d25, d22, d23
868 lowpass_8 d26, d27, d28, d29, d26, d27
869 transpose_8x8 d8, d9, d12, d13, d22, d23, d26, d27
871 vld1.64 {d0}, [ip], r2
872 vld1.64 {d1}, [ip], r2
873 vld1.64 {d2}, [ip], r2
874 vld1.64 {d3}, [ip], r2
875 vld1.64 {d4}, [ip], r2
877 vld1.64 {d5}, [ip], r2
879 vld1.64 {d10}, [ip], r2
880 vrhadd.u8 q2, q2, q11
881 vld1.64 {d11}, [ip], r2
883 vst1.64 {d0}, [r0,:64], r3
884 vst1.64 {d1}, [r0,:64], r3
885 vrhadd.u8 q5, q5, q13
886 vst1.64 {d2}, [r0,:64], r3
887 vst1.64 {d3}, [r0,:64], r3
888 vst1.64 {d4}, [r0,:64], r3
889 vst1.64 {d5}, [r0,:64], r3
890 vst1.64 {d10}, [r0,:64], r3
891 vst1.64 {d11}, [r0,:64], r3
896 function put_h264_qpel8_hv_lowpass_neon_top
899 1: vld1.64 {d0, d1}, [r1], r3
900 vld1.64 {d16,d17}, [r1], r3
902 lowpass_8 d0, d1, d16, d17, q11, q12, narrow=0
903 vst1.64 {d22-d25}, [r4,:128]!
906 vld1.64 {d0, d1}, [r1]
907 lowpass_8_1 d0, d1, q12, narrow=0
911 vld1.64 {d30,d31}, [r4,:128], ip
912 vld1.64 {d20,d21}, [r4,:128], ip
913 vld1.64 {d18,d19}, [r4,:128], ip
914 vld1.64 {d16,d17}, [r4,:128], ip
915 vld1.64 {d14,d15}, [r4,:128], ip
916 vld1.64 {d12,d13}, [r4,:128], ip
917 vld1.64 {d10,d11}, [r4,:128], ip
918 vld1.64 {d8, d9}, [r4,:128], ip
919 vld1.64 {d6, d7}, [r4,:128], ip
920 vld1.64 {d4, d5}, [r4,:128], ip
921 vld1.64 {d2, d3}, [r4,:128], ip
922 vld1.64 {d0, d1}, [r4,:128]
924 swap4 d1, d3, d5, d7, d8, d10, d12, d14
925 transpose16_4x4 q0, q1, q2, q3, q4, q5, q6, q7
927 swap4 d17, d19, d21, d31, d24, d26, d28, d22
928 transpose16_4x4 q8, q9, q10, q15, q12, q13, q14, q11
930 vst1.64 {d30,d31}, [r4,:128]!
931 vst1.64 {d6, d7}, [r4,:128]!
932 vst1.64 {d20,d21}, [r4,:128]!
933 vst1.64 {d4, d5}, [r4,:128]!
934 vst1.64 {d18,d19}, [r4,:128]!
935 vst1.64 {d2, d3}, [r4,:128]!
936 vst1.64 {d16,d17}, [r4,:128]!
937 vst1.64 {d0, d1}, [r4,:128]
939 lowpass_8.16 q4, q12, d8, d9, d24, d25, d8
940 lowpass_8.16 q5, q13, d10, d11, d26, d27, d9
941 lowpass_8.16 q6, q14, d12, d13, d28, d29, d10
942 lowpass_8.16 q7, q11, d14, d15, d22, d23, d11
944 vld1.64 {d16,d17}, [r4,:128], ip
945 vld1.64 {d30,d31}, [r4,:128], ip
946 lowpass_8.16 q8, q15, d16, d17, d30, d31, d12
947 vld1.64 {d16,d17}, [r4,:128], ip
948 vld1.64 {d30,d31}, [r4,:128], ip
949 lowpass_8.16 q8, q15, d16, d17, d30, d31, d13
950 vld1.64 {d16,d17}, [r4,:128], ip
951 vld1.64 {d30,d31}, [r4,:128], ip
952 lowpass_8.16 q8, q15, d16, d17, d30, d31, d14
953 vld1.64 {d16,d17}, [r4,:128], ip
954 vld1.64 {d30,d31}, [r4,:128]
955 lowpass_8.16 q8, q15, d16, d17, d30, d31, d15
957 transpose_8x8 d12, d13, d14, d15, d8, d9, d10, d11
962 function put_h264_qpel8_hv_lowpass_neon
964 bl put_h264_qpel8_hv_lowpass_neon_top
965 vst1.64 {d12}, [r0,:64], r2
966 vst1.64 {d13}, [r0,:64], r2
967 vst1.64 {d14}, [r0,:64], r2
968 vst1.64 {d15}, [r0,:64], r2
969 vst1.64 {d8}, [r0,:64], r2
970 vst1.64 {d9}, [r0,:64], r2
971 vst1.64 {d10}, [r0,:64], r2
972 vst1.64 {d11}, [r0,:64], r2
978 function put_h264_qpel8_hv_lowpass_l2_neon
980 bl put_h264_qpel8_hv_lowpass_neon_top
982 vld1.64 {d0, d1}, [r2,:128]!
983 vld1.64 {d2, d3}, [r2,:128]!
985 vld1.64 {d4, d5}, [r2,:128]!
987 vld1.64 {d6, d7}, [r2,:128]!
990 vst1.64 {d0}, [r0,:64], r3
992 vst1.64 {d1}, [r0,:64], r3
993 vst1.64 {d2}, [r0,:64], r3
994 vst1.64 {d3}, [r0,:64], r3
995 vst1.64 {d4}, [r0,:64], r3
996 vst1.64 {d5}, [r0,:64], r3
997 vst1.64 {d6}, [r0,:64], r3
998 vst1.64 {d7}, [r0,:64], r3
1004 function put_h264_qpel16_hv_lowpass_neon
1006 bl put_h264_qpel8_hv_lowpass_neon
1007 sub r1, r1, r3, lsl #2
1008 bl put_h264_qpel8_hv_lowpass_neon
1009 sub r1, r1, r3, lsl #4
1010 sub r1, r1, r3, lsl #2
1012 sub r0, r0, r2, lsl #4
1014 bl put_h264_qpel8_hv_lowpass_neon
1015 sub r1, r1, r3, lsl #2
1017 b put_h264_qpel8_hv_lowpass_neon
1020 function put_h264_qpel16_hv_lowpass_l2_neon
1023 bl put_h264_qpel8_hv_lowpass_l2_neon
1024 sub r1, r1, r3, lsl #2
1025 bl put_h264_qpel8_hv_lowpass_l2_neon
1026 sub r1, r1, r3, lsl #4
1027 sub r1, r1, r3, lsl #2
1029 sub r0, r0, r3, lsl #4
1031 bl put_h264_qpel8_hv_lowpass_l2_neon
1032 sub r1, r1, r3, lsl #2
1034 b put_h264_qpel8_hv_lowpass_l2_neon
1037 function ff_put_h264_qpel8_mc10_neon, export=1
1042 b put_h264_qpel8_h_lowpass_l2_neon
1045 function ff_put_h264_qpel8_mc20_neon, export=1
1050 b put_h264_qpel8_h_lowpass_neon
1053 function ff_put_h264_qpel8_mc30_neon, export=1
1058 b put_h264_qpel8_h_lowpass_l2_neon
1061 function ff_put_h264_qpel8_mc01_neon, export=1
1064 put_h264_qpel8_mc01:
1067 sub r1, r1, r2, lsl #1
1069 bl put_h264_qpel8_v_lowpass_l2_neon
1074 function ff_put_h264_qpel8_mc11_neon, export=1
1075 push {r0, r1, r2, lr}
1076 put_h264_qpel8_mc11:
1084 bl put_h264_qpel8_h_lowpass_neon
1088 sub r1, r1, r2, lsl #1
1090 bl put_h264_qpel8_v_lowpass_l2_neon
1096 function ff_put_h264_qpel8_mc21_neon, export=1
1097 push {r0, r1, r4, r10, r11, lr}
1098 put_h264_qpel8_mc21:
1102 sub sp, sp, #(8*8+16*12)
1108 bl put_h264_qpel8_h_lowpass_neon
1111 sub r1, r1, r2, lsl #1
1115 bl put_h264_qpel8_hv_lowpass_l2_neon
1118 pop {r4, r10, r11, pc}
1121 function ff_put_h264_qpel8_mc31_neon, export=1
1123 push {r0, r1, r2, lr}
1125 b put_h264_qpel8_mc11
1128 function ff_put_h264_qpel8_mc02_neon, export=1
1131 sub r1, r1, r2, lsl #1
1134 bl put_h264_qpel8_v_lowpass_neon
1139 function ff_put_h264_qpel8_mc12_neon, export=1
1140 push {r0, r1, r4, r10, r11, lr}
1141 put_h264_qpel8_mc12:
1145 sub sp, sp, #(8*8+16*12)
1146 sub r1, r1, r2, lsl #1
1151 bl put_h264_qpel8_v_lowpass_neon
1154 sub r1, r1, r3, lsl #1
1157 bl put_h264_qpel8_hv_lowpass_l2_neon
1160 pop {r4, r10, r11, pc}
1163 function ff_put_h264_qpel8_mc22_neon, export=1
1164 push {r4, r10, r11, lr}
1167 sub r1, r1, r2, lsl #1
1170 sub sp, sp, #(16*12)
1173 bl put_h264_qpel8_hv_lowpass_neon
1176 pop {r4, r10, r11, pc}
1179 function ff_put_h264_qpel8_mc32_neon, export=1
1180 push {r0, r1, r4, r10, r11, lr}
1182 b put_h264_qpel8_mc12
1185 function ff_put_h264_qpel8_mc03_neon, export=1
1188 b put_h264_qpel8_mc01
1191 function ff_put_h264_qpel8_mc13_neon, export=1
1192 push {r0, r1, r2, lr}
1194 b put_h264_qpel8_mc11
1197 function ff_put_h264_qpel8_mc23_neon, export=1
1198 push {r0, r1, r4, r10, r11, lr}
1200 b put_h264_qpel8_mc21
1203 function ff_put_h264_qpel8_mc33_neon, export=1
1205 push {r0, r1, r2, lr}
1208 b put_h264_qpel8_mc11
1211 function ff_put_h264_qpel16_mc10_neon, export=1
1215 b put_h264_qpel16_h_lowpass_l2_neon
1218 function ff_put_h264_qpel16_mc20_neon, export=1
1222 b put_h264_qpel16_h_lowpass_neon
1225 function ff_put_h264_qpel16_mc30_neon, export=1
1229 b put_h264_qpel16_h_lowpass_l2_neon
1232 function ff_put_h264_qpel16_mc01_neon, export=1
1235 put_h264_qpel16_mc01:
1238 sub r1, r1, r2, lsl #1
1240 bl put_h264_qpel16_v_lowpass_l2_neon
1245 function ff_put_h264_qpel16_mc11_neon, export=1
1246 push {r0, r1, r4, lr}
1247 put_h264_qpel16_mc11:
1254 bl put_h264_qpel16_h_lowpass_neon
1259 sub r1, r1, r2, lsl #1
1261 bl put_h264_qpel16_v_lowpass_l2_neon
1263 add sp, sp, #(256+8)
1267 function ff_put_h264_qpel16_mc21_neon, export=1
1268 push {r0, r1, r4-r5, r9-r11, lr}
1269 put_h264_qpel16_mc21:
1273 sub sp, sp, #(16*16+16*12)
1277 bl put_h264_qpel16_h_lowpass_neon_packed
1280 sub r1, r1, r2, lsl #1
1283 bl put_h264_qpel16_hv_lowpass_l2_neon
1286 pop {r4-r5, r9-r11, pc}
1289 function ff_put_h264_qpel16_mc31_neon, export=1
1291 push {r0, r1, r4, lr}
1293 b put_h264_qpel16_mc11
1296 function ff_put_h264_qpel16_mc02_neon, export=1
1299 sub r1, r1, r2, lsl #1
1302 bl put_h264_qpel16_v_lowpass_neon
1307 function ff_put_h264_qpel16_mc12_neon, export=1
1308 push {r0, r1, r4-r5, r9-r11, lr}
1309 put_h264_qpel16_mc12:
1313 sub sp, sp, #(16*16+16*12)
1314 sub r1, r1, r2, lsl #1
1318 bl put_h264_qpel16_v_lowpass_neon_packed
1321 sub r1, r1, r3, lsl #1
1324 bl put_h264_qpel16_hv_lowpass_l2_neon
1327 pop {r4-r5, r9-r11, pc}
1330 function ff_put_h264_qpel16_mc22_neon, export=1
1331 push {r4, r9-r11, lr}
1335 sub r1, r1, r2, lsl #1
1338 sub sp, sp, #(16*12)
1341 bl put_h264_qpel16_hv_lowpass_neon
1344 pop {r4, r9-r11, pc}
1347 function ff_put_h264_qpel16_mc32_neon, export=1
1348 push {r0, r1, r4-r5, r9-r11, lr}
1350 b put_h264_qpel16_mc12
1353 function ff_put_h264_qpel16_mc03_neon, export=1
1356 b put_h264_qpel16_mc01
1359 function ff_put_h264_qpel16_mc13_neon, export=1
1360 push {r0, r1, r4, lr}
1362 b put_h264_qpel16_mc11
1365 function ff_put_h264_qpel16_mc23_neon, export=1
1366 push {r0, r1, r4-r5, r9-r11, lr}
1368 b put_h264_qpel16_mc21
1371 function ff_put_h264_qpel16_mc33_neon, export=1
1373 push {r0, r1, r4, lr}
1376 b put_h264_qpel16_mc11