1 /*****************************************************************************
2 * pixel.S: arm pixel metrics
3 *****************************************************************************
4 * Copyright (C) 2009-2014 x264 project
6 * Authors: David Conrad <lessen42@gmail.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
22 * This program is also available under a commercial proprietary license.
23 * For more information, contact us at licensing@x264.com.
24 *****************************************************************************/
39 .short 0, -1, -1, -1, 0, -1, -1, -1
41 .short 0, -1, -1, -1, -1, -1, -1, -1
46 function x264_pixel_sad_4x\h\()_armv6
70 .macro SAD_START_4 align:vararg
71 vld1.32 {d1[]}, [r2\align], r3
72 vld1.32 {d0[]}, [r0,:32], r1
76 .macro SAD_4 align:vararg
77 vld1.32 {d1[]}, [r2\align], r3
78 vld1.32 {d0[]}, [r0,:32], r1
82 .macro SAD_START_8 align:vararg
83 vld1.64 {d1}, [r2\align], r3
84 vld1.64 {d0}, [r0,:64], r1
88 .macro SAD_8 align:vararg
89 vld1.64 {d1}, [r2\align], r3
90 vld1.64 {d0}, [r0,:64], r1
94 .macro SAD_START_16 align:vararg
95 vld1.64 {d2-d3}, [r2\align], r3
96 vld1.64 {d0-d1}, [r0,:128], r1
98 vld1.64 {d6-d7}, [r2\align], r3
100 vld1.64 {d4-d5}, [r0,:128], r1
103 .macro SAD_16 align:vararg
105 vld1.64 {d2-d3}, [r2\align], r3
107 vld1.64 {d0-d1}, [r0,:128], r1
109 vld1.64 {d6-d7}, [r2\align], r3
111 vld1.64 {d4-d5}, [r0,:128], r1
114 .macro SAD_FUNC w, h, name, align:vararg
115 function x264_pixel_sad\name\()_\w\()x\h\()_neon
134 vadd.u16 d16, d16, d17
136 vpadd.u16 d0, d16, d16
151 SAD_FUNC 4, 4, _aligned, ,:32
152 SAD_FUNC 4, 8, _aligned, ,:32
153 SAD_FUNC 8, 4, _aligned, ,:64
154 SAD_FUNC 8, 8, _aligned, ,:64
155 SAD_FUNC 8, 16, _aligned, ,:64
156 SAD_FUNC 16, 8, _aligned, ,:128
157 SAD_FUNC 16, 16, _aligned, ,:128
159 // If dual issue is possible, use additional accumulators to avoid
160 // stalls from vadal's latency. This only matters for aligned.
161 .macro SAD_DUAL_START_8
163 vld1.64 {d3}, [r2,:64], r3
164 vld1.64 {d2}, [r0,:64], r1
168 .macro SAD_DUAL_8 align:vararg
169 vld1.64 {d1}, [r2,:64], r3
170 vld1.64 {d0}, [r0,:64], r1
172 vld1.64 {d3}, [r2,:64], r3
173 vld1.64 {d2}, [r0,:64], r1
177 .macro SAD_DUAL_START_16
180 vld1.64 {d2-d3}, [r2,:128], r3
182 vld1.64 {d0-d1}, [r0,:128], r1
187 vld1.64 {d6-d7}, [r2,:128], r3
189 vld1.64 {d4-d5}, [r0,:128], r1
191 vld1.64 {d2-d3}, [r2,:128], r3
193 vld1.64 {d0-d1}, [r0,:128], r1
196 .macro SAD_DUAL_END_16
198 vld1.64 {d6-d7}, [r2,:128], r3
200 vld1.64 {d4-d5}, [r0,:128], r1
205 .macro SAD_FUNC_DUAL w, h
206 function x264_pixel_sad_aligned_\w\()x\h\()_neon_dual
208 .rept \h / 2 - \w / 8
215 vadd.u16 q9, q10, q11
219 vadd.u16 d16, d16, d17
221 vpadd.u16 d0, d16, d16
235 .macro SAD_X_START_4 x
236 vld1.32 {d0[]}, [r0,:32], lr
237 vld1.32 {d1[]}, [r1], r6
239 vld1.32 {d2[]}, [r2], r6
241 vld1.32 {d3[]}, [r3], r6
244 vld1.32 {d4[]}, [r12], r6
250 vld1.32 {d0[]}, [r0,:32], lr
251 vld1.32 {d1[]}, [r1], r6
253 vld1.32 {d2[]}, [r2], r6
255 vld1.32 {d3[]}, [r3], r6
258 vld1.32 {d4[]}, [r12], r6
263 .macro SAD_X_START_8 x
264 vld1.64 {d0}, [r0,:64], lr
265 vld1.64 {d1}, [r1], r6
267 vld1.64 {d2}, [r2], r6
269 vld1.64 {d3}, [r3], r6
272 vld1.64 {d4}, [r12], r6
278 vld1.64 {d0}, [r0,:64], lr
279 vld1.64 {d1}, [r1], r6
281 vld1.64 {d2}, [r2], r6
283 vld1.64 {d3}, [r3], r6
286 vld1.64 {d4}, [r12], r6
291 .macro SAD_X_START_16 x
292 vld1.64 {d0-d1}, [r0,:128], lr
293 vld1.64 {d2-d3}, [r1], r6
296 vld1.64 {d4-d5}, [r2], r6
299 vld1.64 {d6-d7}, [r3], r6
303 vld1.64 {d2-d3}, [r12], r6
310 vld1.64 {d0-d1}, [r0,:128], lr
311 vld1.64 {d2-d3}, [r1], r6
314 vld1.64 {d4-d5}, [r2], r6
317 vld1.64 {d6-d7}, [r3], r6
321 vld1.64 {d2-d3}, [r12], r6
327 .macro SAD_X_FUNC x, w, h
328 function x264_pixel_sad_x\x\()_\w\()x\h\()_neon
331 ldrd r6, r7, [sp, #12]
333 ldrd r6, r7, [sp, #16]
347 vadd.u16 q10, q10, q14
349 vadd.u16 q11, q11, q15
353 vadd.u16 d16, d16, d17
354 vadd.u16 d18, d18, d19
355 vadd.u16 d20, d20, d21
357 vadd.u16 d22, d22, d23
360 vpadd.u16 d0, d16, d18
361 vpadd.u16 d1, d20, d22
366 vst1.32 {d1[0]}, [r7,:32]
368 vst1.32 {d0-d1}, [r7]
392 vld1.32 {d16[]}, [r0,:32], r1
393 vld1.32 {d17[]}, [r2,:32], r3
394 vsubl.u8 q2, d16, d17
395 vld1.32 {d16[]}, [r0,:32], r1
397 vld1.32 {d17[]}, [r2,:32], r3
401 vsubl.u8 q2, d16, d17
402 vld1.32 {d16[]}, [r0,:32], r1
404 vld1.32 {d17[]}, [r2,:32], r3
408 vsubl.u8 q2, d16, d17
413 vld1.64 {d16}, [r0,:64], r1
414 vld1.64 {d17}, [r2,:64], r3
415 vsubl.u8 q2, d16, d17
416 vld1.64 {d16}, [r0,:64], r1
419 vld1.64 {d17}, [r2,:64], r3
423 vsubl.u8 q2, d16, d17
424 vld1.64 {d16}, [r0,:64], r1
427 vld1.64 {d17}, [r2,:64], r3
431 vsubl.u8 q2, d16, d17
437 vld1.64 {d16-d17}, [r0,:128], r1
438 vld1.64 {d18-d19}, [r2,:128], r3
439 vsubl.u8 q2, d16, d18
440 vsubl.u8 q3, d17, d19
441 vld1.64 {d16-d17}, [r0,:128], r1
444 vld1.64 {d18-d19}, [r2,:128], r3
450 vsubl.u8 q2, d16, d18
451 vsubl.u8 q3, d17, d19
452 vld1.64 {d16-d17}, [r0,:128], r1
455 vld1.64 {d18-d19}, [r2,:128], r3
461 vsubl.u8 q2, d16, d18
462 vsubl.u8 q3, d17, d19
470 function x264_pixel_ssd_\w\()x\h\()_neon
492 .macro VAR_SQR_SUM qsqr_sum qsqr_last qsqr dsrc vpadal=vpadal.u16
493 vmull.u8 \qsqr, \dsrc, \dsrc
494 vaddw.u8 q0, q0, \dsrc
495 \vpadal \qsqr_sum, \qsqr_last
498 function x264_pixel_var_8x8_neon
499 vld1.64 {d16}, [r0,:64], r1
500 vmull.u8 q1, d16, d16
502 vld1.64 {d18}, [r0,:64], r1
503 vmull.u8 q2, d18, d18
506 vld1.64 {d20}, [r0,:64], r1
507 VAR_SQR_SUM q1, q1, q3, d20, vpaddl.u16
508 vld1.64 {d22}, [r0,:64], r1
509 VAR_SQR_SUM q2, q2, q8, d22, vpaddl.u16
511 vld1.64 {d24}, [r0,:64], r1
512 VAR_SQR_SUM q1, q3, q9, d24
513 vld1.64 {d26}, [r0,:64], r1
514 VAR_SQR_SUM q2, q8, q10, d26
515 vld1.64 {d24}, [r0,:64], r1
516 VAR_SQR_SUM q1, q9, q14, d24
517 vld1.64 {d26}, [r0,:64], r1
518 VAR_SQR_SUM q2, q10, q15, d26
522 function x264_pixel_var_8x16_neon
523 vld1.64 {d16}, [r0,:64], r1
524 vld1.64 {d18}, [r0,:64], r1
525 vmull.u8 q1, d16, d16
527 vld1.64 {d20}, [r0,:64], r1
528 vmull.u8 q2, d18, d18
533 vld1.64 {d22}, [r0,:64], r1
534 VAR_SQR_SUM q1, q1, q14, d20, vpaddl.u16
535 vld1.64 {d16}, [r0,:64], r1
536 VAR_SQR_SUM q2, q2, q15, d22, vpaddl.u16
539 vld1.64 {d18}, [r0,:64], r1
540 VAR_SQR_SUM q1, q14, q12, d16
541 vld1.64 {d20}, [r0,:64], r1
542 VAR_SQR_SUM q2, q15, q13, d18
543 vld1.64 {d22}, [r0,:64], r1
544 VAR_SQR_SUM q1, q12, q14, d20
546 vld1.64 {d16}, [r0,:64], r1
547 VAR_SQR_SUM q2, q13, q15, d22
550 VAR_SQR_SUM q2, q13, q15, d22
554 function x264_pixel_var_16x16_neon
555 vld1.64 {d16-d17}, [r0,:128], r1
556 vmull.u8 q12, d16, d16
558 vmull.u8 q13, d17, d17
561 vld1.64 {d18-d19}, [r0,:128], r1
562 VAR_SQR_SUM q1, q12, q14, d18, vpaddl.u16
563 VAR_SQR_SUM q2, q13, q15, d19, vpaddl.u16
568 vld1.64 {d16-d17}, [r0,:128], r1
569 VAR_SQR_SUM q1, q14, q12, d16
570 VAR_SQR_SUM q2, q15, q13, d17
572 vld1.64 {d18-d19}, [r0,:128], r1
573 VAR_SQR_SUM q1, q12, q14, d18
574 VAR_SQR_SUM q2, q13, q15, d19
578 function x264_var_end
593 .macro DIFF_SUM diff da db lastdiff
594 vld1.64 {\da}, [r0,:64], r1
595 vld1.64 {\db}, [r2,:64], r3
597 vadd.s16 q0, q0, \lastdiff
599 vsubl.u8 \diff, \da, \db
602 .macro SQR_ACC acc d0 d1 vmlal=vmlal.s16
603 \vmlal \acc, \d0, \d0
604 vmlal.s16 \acc, \d1, \d1
607 function x264_pixel_var2_8x8_neon
609 DIFF_SUM q8, d16, d17
610 SQR_ACC q1, d0, d1, vmull.s16
611 DIFF_SUM q9, d18, d19, q8
612 SQR_ACC q2, d16, d17, vmull.s16
614 DIFF_SUM q8, d16, d17, q9
616 DIFF_SUM q9, d18, d19, q8
619 DIFF_SUM q8, d16, d17, q9
632 vst1.32 {d0[1]}, [ip,:32]
634 sub r0, r1, r0, lsr #6
639 .macro LOAD_DIFF_8x4 q0 q1 q2 q3
640 vld1.32 {d1}, [r2], r3
641 vld1.32 {d0}, [r0,:64], r1
643 vld1.32 {d3}, [r2], r3
644 vld1.32 {d2}, [r0,:64], r1
646 vld1.32 {d5}, [r2], r3
647 vld1.32 {d4}, [r0,:64], r1
649 vld1.32 {d7}, [r2], r3
650 vld1.32 {d6}, [r0,:64], r1
654 function x264_pixel_satd_4x4_neon
655 vld1.32 {d1[]}, [r2], r3
656 vld1.32 {d0[]}, [r0,:32], r1
657 vld1.32 {d3[]}, [r2], r3
658 vld1.32 {d2[]}, [r0,:32], r1
659 vld1.32 {d1[1]}, [r2], r3
660 vld1.32 {d0[1]}, [r0,:32], r1
661 vld1.32 {d3[1]}, [r2], r3
662 vld1.32 {d2[1]}, [r0,:32], r1
666 SUMSUB_AB q2, q3, q0, q1
667 SUMSUB_ABCD d0, d2, d1, d3, d4, d5, d6, d7
668 HADAMARD 1, sumsub, q2, q3, q0, q1
669 HADAMARD 2, amax, q0,, q2, q3
676 function x264_pixel_satd_4x8_neon
677 vld1.32 {d1[]}, [r2], r3
678 vld1.32 {d0[]}, [r0,:32], r1
679 vld1.32 {d3[]}, [r2], r3
680 vld1.32 {d2[]}, [r0,:32], r1
681 vld1.32 {d5[]}, [r2], r3
682 vld1.32 {d4[]}, [r0,:32], r1
683 vld1.32 {d7[]}, [r2], r3
684 vld1.32 {d6[]}, [r0,:32], r1
686 vld1.32 {d1[1]}, [r2], r3
687 vld1.32 {d0[1]}, [r0,:32], r1
689 vld1.32 {d3[1]}, [r2], r3
690 vld1.32 {d2[1]}, [r0,:32], r1
692 vld1.32 {d5[1]}, [r2], r3
693 vld1.32 {d4[1]}, [r0,:32], r1
695 vld1.32 {d7[1]}, [r2], r3
696 SUMSUB_AB q8, q9, q0, q1
697 vld1.32 {d6[1]}, [r0,:32], r1
699 SUMSUB_AB q10, q11, q2, q3
700 b x264_satd_4x8_8x4_end_neon
703 function x264_pixel_satd_8x4_neon
704 vld1.64 {d1}, [r2], r3
705 vld1.64 {d0}, [r0,:64], r1
707 vld1.64 {d3}, [r2], r3
708 vld1.64 {d2}, [r0,:64], r1
710 vld1.64 {d5}, [r2], r3
711 vld1.64 {d4}, [r0,:64], r1
713 vld1.64 {d7}, [r2], r3
714 SUMSUB_AB q8, q9, q0, q1
715 vld1.64 {d6}, [r0,:64], r1
717 SUMSUB_AB q10, q11, q2, q3
720 function x264_satd_4x8_8x4_end_neon
747 function x264_pixel_satd_8x8_neon
750 bl x264_satd_8x8_neon
751 vadd.u16 q0, q12, q13
752 vadd.u16 q1, q14, q15
761 function x264_pixel_satd_8x16_neon
765 bl x264_satd_8x8_neon
766 vadd.u16 q4, q12, q13
767 vadd.u16 q5, q14, q15
769 bl x264_satd_8x8_neon
783 function x264_satd_8x8_neon
784 LOAD_DIFF_8x4 q8, q9, q10, q11
785 vld1.64 {d7}, [r2], r3
786 SUMSUB_AB q0, q1, q8, q9
787 vld1.64 {d6}, [r0,:64], r1
789 vld1.64 {d17}, [r2], r3
790 SUMSUB_AB q2, q3, q10, q11
791 vld1.64 {d16}, [r0,:64], r1
792 vsubl.u8 q13, d16, d17
793 vld1.64 {d19}, [r2], r3
794 SUMSUB_AB q8, q10, q0, q2
795 vld1.64 {d18}, [r0,:64], r1
796 vsubl.u8 q14, d18, d19
797 vld1.64 {d1}, [r2], r3
798 SUMSUB_AB q9, q11, q1, q3
799 vld1.64 {d0}, [r0,:64], r1
803 // one vertical hadamard pass and two horizontal
804 function x264_satd_8x4v_8x8h_neon
805 SUMSUB_ABCD q0, q1, q2, q3, q12, q13, q14, q15
807 SUMSUB_AB q12, q14, q0, q2
809 SUMSUB_AB q13, q15, q1, q3
810 SUMSUB_AB q0, q1, q8, q9
812 SUMSUB_AB q2, q3, q10, q11
814 SUMSUB_AB q8, q9, q12, q13
816 SUMSUB_AB q10, q11, q14, q15
827 vmax.s16 q14, q8, q10
828 vmax.s16 q15, q9, q11
832 function x264_pixel_satd_16x8_neon
836 bl x264_satd_16x4_neon
837 vadd.u16 q4, q12, q13
838 vadd.u16 q5, q14, q15
840 bl x264_satd_16x4_neon
854 function x264_pixel_satd_16x16_neon
858 bl x264_satd_16x4_neon
859 vadd.u16 q4, q12, q13
860 vadd.u16 q5, q14, q15
862 bl x264_satd_16x4_neon
868 bl x264_satd_16x4_neon
874 bl x264_satd_16x4_neon
888 function x264_satd_16x4_neon
889 vld1.64 {d2-d3}, [r2], r3
890 vld1.64 {d0-d1}, [r0,:128], r1
892 vld1.64 {d6-d7}, [r2], r3
894 vld1.64 {d4-d5}, [r0,:128], r1
896 vld1.64 {d2-d3}, [r2], r3
898 vld1.64 {d0-d1}, [r0,:128], r1
900 vld1.64 {d6-d7}, [r2], r3
903 vld1.64 {d4-d5}, [r0,:128], r1
907 SUMSUB_AB q2, q3, q10, q11
908 SUMSUB_ABCD q8, q10, q9, q11, q0, q2, q1, q3
909 b x264_satd_8x4v_8x8h_neon
913 function x264_pixel_sa8d_8x8_neon
915 bl x264_sa8d_8x8_neon
925 function x264_pixel_sa8d_16x16_neon
928 bl x264_sa8d_8x8_neon
931 bl x264_sa8d_8x8_neon
934 sub r0, r0, r1, lsl #4
935 sub r2, r2, r3, lsl #4
938 bl x264_sa8d_8x8_neon
941 bl x264_sa8d_8x8_neon
957 .macro HADAMARD4_V r1, r2, r3, r4, t1, t2, t3, t4
958 SUMSUB_ABCD \t1, \t2, \t3, \t4, \r1, \r2, \r3, \r4
959 SUMSUB_ABCD \r1, \r3, \r2, \r4, \t1, \t3, \t2, \t4
962 function x264_sa8d_8x8_neon
963 LOAD_DIFF_8x4 q8, q9, q10, q11
964 vld1.64 {d7}, [r2], r3
965 SUMSUB_AB q0, q1, q8, q9
966 vld1.64 {d6}, [r0,:64], r1
968 vld1.64 {d17}, [r2], r3
969 SUMSUB_AB q2, q3, q10, q11
970 vld1.64 {d16}, [r0,:64], r1
971 vsubl.u8 q13, d16, d17
972 vld1.64 {d19}, [r2], r3
973 SUMSUB_AB q8, q10, q0, q2
974 vld1.64 {d18}, [r0,:64], r1
975 vsubl.u8 q14, d18, d19
976 vld1.64 {d1}, [r2], r3
977 SUMSUB_AB q9, q11, q1, q3
978 vld1.64 {d0}, [r0,:64], r1
981 HADAMARD4_V q12, q13, q14, q15, q0, q1, q2, q3
982 SUMSUB_ABCD q0, q8, q1, q9, q8, q12, q9, q13
983 SUMSUB_AB q2, q10, q10, q14
985 SUMSUB_AB q3, q11, q11, q15
987 SUMSUB_AB q12, q13, q8, q9
989 SUMSUB_AB q8, q9, q0, q1
991 SUMSUB_AB q14, q15, q10, q11
996 SUMSUB_AB q0, q2, q12, q14
998 SUMSUB_AB q1, q3, q13, q15
1000 SUMSUB_AB q12, q14, q8, q10
1001 SUMSUB_AB q13, q15, q9, q11
1011 vmax.s16 q8, q0, q12
1012 vmax.s16 q9, q1, q13
1013 vmax.s16 q10, q2, q14
1014 vmax.s16 q11, q3, q15
1016 vadd.i16 q9, q10, q11
1021 .macro HADAMARD_AC w h
1022 function x264_pixel_hadamard_ac_\w\()x\h\()_neon
1026 // note: this assumes mask_ac8 is after mask_ac4 (so don't move it)
1027 vld1.64 {d12-d15}, [ip,:128]
1031 bl x264_hadamard_ac_8x8_neon
1033 bl x264_hadamard_ac_8x8_neon
1036 sub r0, r0, r1, lsl #3
1038 bl x264_hadamard_ac_8x8_neon
1041 sub r0, r0, r1, lsl #4
1042 bl x264_hadamard_ac_8x8_neon
1046 vadd.s32 d10, d10, d11
1047 vpadd.s32 d0, d8, d10
1062 // q4: satd q5: sa8d q6: mask_ac4 q7: mask_ac8
1063 function x264_hadamard_ac_8x8_neon
1064 vld1.64 {d2}, [r0,:64], r1
1065 vld1.64 {d3}, [r0,:64], r1
1067 vld1.64 {d6}, [r0,:64], r1
1069 vld1.64 {d7}, [r0,:64], r1
1071 vld1.64 {d18}, [r0,:64], r1
1073 vld1.64 {d19}, [r0,:64], r1
1074 vaddl.u8 q8, d18, d19
1075 vld1.64 {d22}, [r0,:64], r1
1076 vsubl.u8 q9, d18, d19
1077 vld1.64 {d23}, [r0,:64], r1
1079 SUMSUB_ABCD q12, q14, q13, q15, q0, q2, q1, q3
1080 vaddl.u8 q10, d22, d23
1081 vsubl.u8 q11, d22, d23
1083 SUMSUB_ABCD q0, q2, q1, q3, q8, q10, q9, q11
1086 SUMSUB_AB q8, q9, q12, q13
1088 SUMSUB_AB q10, q11, q14, q15
1090 SUMSUB_AB q12, q13, q0, q1
1092 SUMSUB_AB q14, q15, q2, q3
1094 SUMSUB_AB q0, q2, q8, q10
1096 SUMSUB_AB q1, q3, q9, q11
1098 SUMSUB_ABCD q8, q10, q9, q11, q12, q14, q13, q15
1103 vadd.s16 q12, q12, q13
1105 vand.s16 q12, q12, q6
1107 vadd.s16 q12, q12, q15
1109 vadd.s16 q12, q12, q14
1111 vadd.s16 q12, q12, q13
1113 vadd.s16 q12, q12, q15
1114 vsub.s16 q15, q11, q3
1115 vadd.s16 q12, q12, q14
1116 vadd.s16 q14, q11, q3
1117 vadd.s16 q12, q12, q13
1118 vsub.s16 q13, q10, q2
1119 vadd.s16 q2, q10, q2
1122 SUMSUB_AB q10, q11, q9, q1
1123 SUMSUB_AB q9, q8, q0, q8
1133 vmax.s16 q3, q14, q15
1134 vmax.s16 q2, q2, q13
1135 vmax.s16 q1, q10, q11
1137 SUMSUB_AB q14, q15, q9, q8
1145 vadd.s16 q2, q2, q15
1146 vadd.s16 q2, q2, q14
1152 .macro SSIM_ITER n ssa s12 ssb lastssa lasts12 lastssb da db dnext
1153 vld1.64 {\db}, [r2], r3
1154 vmull.u8 \ssa, \da, \da
1155 vmull.u8 \s12, \da, \db
1157 vpaddl.u16 q2, \lastssa
1158 vpaddl.u16 q3, \lasts12
1159 vaddl.u8 q0, d0, \da
1161 vpadal.u16 q2, \lastssa
1162 vpadal.u16 q3, \lasts12
1163 vaddw.u8 q0, q0, \da
1165 vpadal.u16 q2, \lastssb
1167 vld1.64 {\dnext}, [r0], r1
1170 vaddl.u8 q1, d2, \db
1172 vaddw.u8 q1, q1, \db
1174 vmull.u8 \ssb, \db, \db
1177 function x264_pixel_ssim_4x4x2_core_neon
1179 vld1.64 {d0}, [r0], r1
1180 vld1.64 {d2}, [r2], r3
1183 vld1.64 {d28}, [r0], r1
1184 vmull.u8 q15, d2, d2
1186 SSIM_ITER 1, q8, q9, q14, q2, q3, q15, d28, d29, d26
1187 SSIM_ITER 2, q10,q11,q13, q8, q9, q14, d26, d27, d28
1188 SSIM_ITER 3, q8, q9, q15, q10,q11,q13, d28, d29
1196 vpadd.u32 d0, d0, d1
1197 vpadd.u32 d1, d2, d3
1198 vpadd.u32 d2, d4, d5
1199 vpadd.u32 d3, d6, d7
1201 vst4.32 {d0-d3}, [ip]
1205 // FIXME: see about doing 16x16 -> 32 bit multiplies for s1/s2
1206 function x264_pixel_ssim_end4_neon
1207 vld1.32 {d16-d19}, [r0,:128]!
1208 vld1.32 {d20-d23}, [r1,:128]!
1209 vadd.s32 q0, q8, q10
1210 vadd.s32 q1, q9, q11
1211 vld1.32 {d24-d27}, [r0,:128]!
1213 vld1.32 {d28-d31}, [r1,:128]!
1214 vadd.s32 q2, q12, q14
1215 vadd.s32 q3, q13, q15
1216 vld1.32 {d16-d17}, [r0,:128]
1218 vld1.32 {d18-d19}, [r1,:128]
1228 // s1=q0, s2=q1, ss=q2, s12=q3
1229 vmul.s32 q8, q0, q1 // s1*s2
1231 vmla.s32 q0, q1, q1 // s1*s1 + s2*s2
1237 mov r3, #416 // ssim_c1 = .01*.01*255*255*64
1238 movconst ip, 235963 // ssim_c2 = .03*.03*255*255*64*63
1242 vsub.s32 q2, q2, q0 // vars
1243 vsub.s32 q3, q3, q1 // covar*2
1244 vadd.s32 q0, q0, q14
1245 vadd.s32 q2, q2, q15
1246 vadd.s32 q1, q1, q14
1247 vadd.s32 q3, q3, q15
1266 sub r3, r3, r2, lsl #2
1267 vld1.64 {d6-d7}, [r3]
1271 vpadd.f32 d0, d0, d0