diff --git a/vp9/common/arm/neon/vp9_reconintra_neon.asm b/vp9/common/arm/neon/vp9_reconintra_neon.asm index baa943b9c96226eb266faea155f6055d24cb1edf..279f678b15ce06dafdcfe8cdb7369581a558d964 100644 --- a/vp9/common/arm/neon/vp9_reconintra_neon.asm +++ b/vp9/common/arm/neon/vp9_reconintra_neon.asm @@ -19,6 +19,7 @@ EXPORT |vp9_tm_predictor_4x4_neon| EXPORT |vp9_tm_predictor_8x8_neon| EXPORT |vp9_tm_predictor_16x16_neon| + EXPORT |vp9_tm_predictor_32x32_neon| ARM REQUIRE8 PRESERVE8 @@ -502,4 +503,134 @@ loop_16x16_neon bx lr ENDP ; |vp9_tm_predictor_16x16_neon| +;void vp9_tm_predictor_32x32_neon (uint8_t *dst, ptrdiff_t y_stride, +; const uint8_t *above, +; const uint8_t *left) +; r0 uint8_t *dst +; r1 ptrdiff_t y_stride +; r2 const uint8_t *above +; r3 const uint8_t *left + +|vp9_tm_predictor_32x32_neon| PROC + ; Load ytop_left = above[-1]; + sub r12, r2, #1 + ldrb r12, [r12] + vdup.u8 q0, r12 + + ; Load above 32 pixels + vld1.8 q1, [r2]! + vld1.8 q2, [r2] + + ; preload 8 left pixels + vld1.8 d26, [r3]! + + ; Compute above - ytop_left + vsubl.u8 q8, d2, d0 + vsubl.u8 q9, d3, d1 + vsubl.u8 q10, d4, d0 + vsubl.u8 q11, d5, d1 + + vmovl.u8 q3, d26 + + ; Load left row by row and compute left + (above - ytop_left) + ; Process 8 rows in each single loop and loop 4 times to process 32 rows. + mov r2, #4 + +loop_32x32_neon + ; Process two rows. + vdup.16 q0, d6[0] + vdup.16 q2, d6[1] + vadd.s16 q12, q0, q8 + vadd.s16 q13, q0, q9 + vadd.s16 q14, q0, q10 + vadd.s16 q15, q0, q11 + vqshrun.s16 d0, q12, #0 + vqshrun.s16 d1, q13, #0 + vadd.s16 q12, q2, q8 + vadd.s16 q13, q2, q9 + vqshrun.s16 d2, q14, #0 + vqshrun.s16 d3, q15, #0 + vadd.s16 q14, q2, q10 + vadd.s16 q15, q2, q11 + vst1.64 {d0-d3}, [r0], r1 + vqshrun.s16 d24, q12, #0 + vqshrun.s16 d25, q13, #0 + vqshrun.s16 d26, q14, #0 + vqshrun.s16 d27, q15, #0 + vdup.16 q1, d6[2] + vdup.16 q2, d6[3] + vst1.64 {d24-d27}, [r0], r1 + + ; Process two rows. + vadd.s16 q12, q1, q8 + vadd.s16 q13, q1, q9 + vadd.s16 q14, q1, q10 + vadd.s16 q15, q1, q11 + vqshrun.s16 d0, q12, #0 + vqshrun.s16 d1, q13, #0 + vadd.s16 q12, q2, q8 + vadd.s16 q13, q2, q9 + vqshrun.s16 d2, q14, #0 + vqshrun.s16 d3, q15, #0 + vadd.s16 q14, q2, q10 + vadd.s16 q15, q2, q11 + vst1.64 {d0-d3}, [r0], r1 + vqshrun.s16 d24, q12, #0 + vqshrun.s16 d25, q13, #0 + vqshrun.s16 d26, q14, #0 + vqshrun.s16 d27, q15, #0 + vdup.16 q0, d7[0] + vdup.16 q2, d7[1] + vst1.64 {d24-d27}, [r0], r1 + + ; Process two rows. + vadd.s16 q12, q0, q8 + vadd.s16 q13, q0, q9 + vadd.s16 q14, q0, q10 + vadd.s16 q15, q0, q11 + vqshrun.s16 d0, q12, #0 + vqshrun.s16 d1, q13, #0 + vadd.s16 q12, q2, q8 + vadd.s16 q13, q2, q9 + vqshrun.s16 d2, q14, #0 + vqshrun.s16 d3, q15, #0 + vadd.s16 q14, q2, q10 + vadd.s16 q15, q2, q11 + vst1.64 {d0-d3}, [r0], r1 + vqshrun.s16 d24, q12, #0 + vqshrun.s16 d25, q13, #0 + vqshrun.s16 d26, q14, #0 + vqshrun.s16 d27, q15, #0 + vdup.16 q0, d7[2] + vdup.16 q2, d7[3] + vst1.64 {d24-d27}, [r0], r1 + + ; Process two rows. + vadd.s16 q12, q0, q8 + vadd.s16 q13, q0, q9 + vadd.s16 q14, q0, q10 + vadd.s16 q15, q0, q11 + vqshrun.s16 d0, q12, #0 + vqshrun.s16 d1, q13, #0 + vadd.s16 q12, q2, q8 + vadd.s16 q13, q2, q9 + vqshrun.s16 d2, q14, #0 + vqshrun.s16 d3, q15, #0 + vadd.s16 q14, q2, q10 + vadd.s16 q15, q2, q11 + vst1.64 {d0-d3}, [r0], r1 + vqshrun.s16 d24, q12, #0 + vqshrun.s16 d25, q13, #0 + vld1.8 d0, [r3]! ; preload 8 left pixels + vqshrun.s16 d26, q14, #0 + vqshrun.s16 d27, q15, #0 + vmovl.u8 q3, d0 + vst1.64 {d24-d27}, [r0], r1 + + subs r2, r2, #1 + bgt loop_32x32_neon + + bx lr + ENDP ; |vp9_tm_predictor_32x32_neon| + END diff --git a/vp9/common/vp9_rtcd_defs.sh b/vp9/common/vp9_rtcd_defs.sh index 8fd6db8e9e2c13347553736b4da643c02e20fcb6..66defb9155ad09e64f2fec1d012491d2ee8d16cc 100644 --- a/vp9/common/vp9_rtcd_defs.sh +++ b/vp9/common/vp9_rtcd_defs.sh @@ -174,7 +174,7 @@ prototype void vp9_v_predictor_32x32 "uint8_t *dst, ptrdiff_t y_stride, const ui specialize vp9_v_predictor_32x32 $sse2_x86inc neon prototype void vp9_tm_predictor_32x32 "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left" -specialize vp9_tm_predictor_32x32 $sse2_x86_64 +specialize vp9_tm_predictor_32x32 $sse2_x86_64 neon prototype void vp9_dc_predictor_32x32 "uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left" specialize vp9_dc_predictor_32x32 $sse2_x86inc