Commit 770454f3 authored by hkuang's avatar hkuang
Browse files

Add vp9_tm_predictor_32x32 neon implementation

which is 7.8 times faster than C.

Change-Id: I858ef4ec09202a07d445da8db702783d6d9d7321
parent 11786b04
......@@ -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
......@@ -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
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment