@ -19,9 +19,10 @@
* /
* /
# include " a s m . S "
# include " a s m . S "
# include " n e o n . S "
.macro rv34_inv_transform
.macro rv34_inv_transform r0
vld1 . 1 6 { q14 - q15 } , [ r0 ,: 1 2 8 ]
vld1 . 1 6 { q14 - q15 } , [ \ r0 ,: 1 2 8 ]
vmov. s16 d0 , #13
vmov. s16 d0 , #13
vshll. s16 q12 , d29 , #3
vshll. s16 q12 , d29 , #3
vshll. s16 q13 , d29 , #4
vshll. s16 q13 , d29 , #4
@ -66,9 +67,39 @@
vsub. s32 q15 , q14 , q9 @ z0 - z3
vsub. s32 q15 , q14 , q9 @ z0 - z3
.endm
.endm
/* void rv34_idct_add_c(uint8_t *dst, int stride, DCTELEM *block) */
function f f _ r v34 _ i d c t _ a d d _ n e o n , e x p o r t =1
mov r3 , r0
rv3 4 _ i n v _ t r a n s f o r m r2
vmov. i 1 6 q12 , #0
vrshrn. s32 d16 , q1 , #10 @ (z0 + z3) >> 10
vrshrn. s32 d17 , q2 , #10 @ (z1 + z2) >> 10
vrshrn. s32 d18 , q3 , #10 @ (z1 - z2) >> 10
vrshrn. s32 d19 , q15 , #10 @ (z0 - z3) >> 10
vld1 . 3 2 { d28 [ ] } , [ r0 ,: 3 2 ] , r1
vld1 . 3 2 { d29 [ ] } , [ r0 ,: 3 2 ] , r1
vtrn. 3 2 q8 , q9
vld1 . 3 2 { d28 [ 1 ] } , [ r0 ,: 3 2 ] , r1
vld1 . 3 2 { d29 [ 1 ] } , [ r0 ,: 3 2 ] , r1
vst1 . 1 6 { q12 } , [ r2 ,: 1 2 8 ] ! @ memset(block, 0, 16)
vst1 . 1 6 { q12 } , [ r2 ,: 1 2 8 ] @ memset(block+16, 0, 16)
vtrn. 1 6 d16 , d17
vtrn. 3 2 d28 , d29
vtrn. 1 6 d18 , d19
vaddw. u 8 q0 , q8 , d28
vaddw. u 8 q1 , q9 , d29
vqmovun. s16 d28 , q0
vqmovun. s16 d29 , q1
vst1 . 3 2 { d28 [ 0 ] } , [ r3 ,: 3 2 ] , r1
vst1 . 3 2 { d28 [ 1 ] } , [ r3 ,: 3 2 ] , r1
vst1 . 3 2 { d29 [ 0 ] } , [ r3 ,: 3 2 ] , r1
vst1 . 3 2 { d29 [ 1 ] } , [ r3 ,: 3 2 ] , r1
bx l r
endfunc
/* void rv34_inv_transform_noround_neon(DCTELEM *block); */
/* void rv34_inv_transform_noround_neon(DCTELEM *block); */
function f f _ r v34 _ i n v _ t r a n s f o r m _ n o r o u n d _ n e o n , e x p o r t =1
function f f _ r v34 _ i n v _ t r a n s f o r m _ n o r o u n d _ n e o n , e x p o r t =1
rv3 4 _ i n v _ t r a n s f o r m
rv3 4 _ i n v _ t r a n s f o r m r0
vshl. s32 q11 , q2 , #1
vshl. s32 q11 , q2 , #1
vshl. s32 q10 , q1 , #1
vshl. s32 q10 , q1 , #1
vshl. s32 q12 , q3 , #1
vshl. s32 q12 , q3 , #1
@ -88,6 +119,28 @@ function ff_rv34_inv_transform_noround_neon, export=1
bx l r
bx l r
endfunc
endfunc
/* void ff_rv34_idct_dc_add_neon(uint8_t *dst, int stride, int dc) */
function f f _ r v34 _ i d c t _ d c _ a d d _ n e o n , e x p o r t =1
mov r3 , r0
vld1 . 3 2 { d28 [ ] } , [ r0 ,: 3 2 ] , r1
vld1 . 3 2 { d29 [ ] } , [ r0 ,: 3 2 ] , r1
vdup. 1 6 d0 , r2
vmov. s16 d1 , #169
vld1 . 3 2 { d28 [ 1 ] } , [ r0 ,: 3 2 ] , r1
vmull. s16 q1 , d0 , d1 @ dc * 13 * 13
vld1 . 3 2 { d29 [ 1 ] } , [ r0 ,: 3 2 ] , r1
vrshrn. s32 d0 , q1 , #10 @ (dc * 13 * 13 + 0x200) >> 10
vmov d1 , d0
vaddw. u 8 q2 , q0 , d28
vaddw. u 8 q3 , q0 , d29
vqmovun. s16 d28 , q2
vqmovun. s16 d29 , q3
vst1 . 3 2 { d28 [ 0 ] } , [ r3 ,: 3 2 ] , r1
vst1 . 3 2 { d29 [ 0 ] } , [ r3 ,: 3 2 ] , r1
vst1 . 3 2 { d28 [ 1 ] } , [ r3 ,: 3 2 ] , r1
vst1 . 3 2 { d29 [ 1 ] } , [ r3 ,: 3 2 ] , r1
bx l r
endfunc
/* void rv34_inv_transform_dc_noround_c(DCTELEM *block) */
/* void rv34_inv_transform_dc_noround_c(DCTELEM *block) */
function f f _ r v34 _ i n v _ t r a n s f o r m _ n o r o u n d _ d c _ n e o n , e x p o r t =1
function f f _ r v34 _ i n v _ t r a n s f o r m _ n o r o u n d _ d c _ n e o n , e x p o r t =1