@ -20,60 +20,6 @@
# include " l i b a v u t i l / a r m / a s m . S "
const r e g u l a r _ f i l t e r , a l i g n =4
.short 0 , 1 , - 5 , 1 2 6 , 8 , - 3 , 1 , 0
.short - 1 , 3 , - 1 0 , 1 2 2 , 1 8 , - 6 , 2 , 0
.short - 1 , 4 , - 1 3 , 1 1 8 , 2 7 , - 9 , 3 , - 1
.short - 1 , 4 , - 1 6 , 1 1 2 , 3 7 , - 1 1 , 4 , - 1
.short - 1 , 5 , - 1 8 , 1 0 5 , 4 8 , - 1 4 , 4 , - 1
.short - 1 , 5 , - 1 9 , 9 7 , 5 8 , - 1 6 , 5 , - 1
.short - 1 , 6 , - 1 9 , 8 8 , 6 8 , - 1 8 , 5 , - 1
.short - 1 , 6 , - 1 9 , 7 8 , 7 8 , - 1 9 , 6 , - 1
.short - 1 , 5 , - 1 8 , 6 8 , 8 8 , - 1 9 , 6 , - 1
.short - 1 , 5 , - 1 6 , 5 8 , 9 7 , - 1 9 , 5 , - 1
.short - 1 , 4 , - 1 4 , 4 8 , 1 0 5 , - 1 8 , 5 , - 1
.short - 1 , 4 , - 1 1 , 3 7 , 1 1 2 , - 1 6 , 4 , - 1
.short - 1 , 3 , - 9 , 2 7 , 1 1 8 , - 1 3 , 4 , - 1
.short 0 , 2 , - 6 , 1 8 , 1 2 2 , - 1 0 , 3 , - 1
.short 0 , 1 , - 3 , 8 , 1 2 6 , - 5 , 1 , 0
endconst
const s h a r p _ f i l t e r , a l i g n =4
.short - 1 , 3 , - 7 , 1 2 7 , 8 , - 3 , 1 , 0
.short - 2 , 5 , - 1 3 , 1 2 5 , 1 7 , - 6 , 3 , - 1
.short - 3 , 7 , - 1 7 , 1 2 1 , 2 7 , - 1 0 , 5 , - 2
.short - 4 , 9 , - 2 0 , 1 1 5 , 3 7 , - 1 3 , 6 , - 2
.short - 4 , 1 0 , - 2 3 , 1 0 8 , 4 8 , - 1 6 , 8 , - 3
.short - 4 , 1 0 , - 2 4 , 1 0 0 , 5 9 , - 1 9 , 9 , - 3
.short - 4 , 1 1 , - 2 4 , 9 0 , 7 0 , - 2 1 , 1 0 , - 4
.short - 4 , 1 1 , - 2 3 , 8 0 , 8 0 , - 2 3 , 1 1 , - 4
.short - 4 , 1 0 , - 2 1 , 7 0 , 9 0 , - 2 4 , 1 1 , - 4
.short - 3 , 9 , - 1 9 , 5 9 , 1 0 0 , - 2 4 , 1 0 , - 4
.short - 3 , 8 , - 1 6 , 4 8 , 1 0 8 , - 2 3 , 1 0 , - 4
.short - 2 , 6 , - 1 3 , 3 7 , 1 1 5 , - 2 0 , 9 , - 4
.short - 2 , 5 , - 1 0 , 2 7 , 1 2 1 , - 1 7 , 7 , - 3
.short - 1 , 3 , - 6 , 1 7 , 1 2 5 , - 1 3 , 5 , - 2
.short 0 , 1 , - 3 , 8 , 1 2 7 , - 7 , 3 , - 1
endconst
const s m o o t h _ f i l t e r , a l i g n =4
.short - 3 , - 1 , 3 2 , 6 4 , 3 8 , 1 , - 3 , 0
.short - 2 , - 2 , 2 9 , 6 3 , 4 1 , 2 , - 3 , 0
.short - 2 , - 2 , 2 6 , 6 3 , 4 3 , 4 , - 4 , 0
.short - 2 , - 3 , 2 4 , 6 2 , 4 6 , 5 , - 4 , 0
.short - 2 , - 3 , 2 1 , 6 0 , 4 9 , 7 , - 4 , 0
.short - 1 , - 4 , 1 8 , 5 9 , 5 1 , 9 , - 4 , 0
.short - 1 , - 4 , 1 6 , 5 7 , 5 3 , 1 2 , - 4 , - 1
.short - 1 , - 4 , 1 4 , 5 5 , 5 5 , 1 4 , - 4 , - 1
.short - 1 , - 4 , 1 2 , 5 3 , 5 7 , 1 6 , - 4 , - 1
.short 0 , - 4 , 9 , 5 1 , 5 9 , 1 8 , - 4 , - 1
.short 0 , - 4 , 7 , 4 9 , 6 0 , 2 1 , - 3 , - 2
.short 0 , - 4 , 5 , 4 6 , 6 2 , 2 4 , - 3 , - 2
.short 0 , - 4 , 4 , 4 3 , 6 3 , 2 6 , - 2 , - 2
.short 0 , - 3 , 2 , 4 1 , 6 3 , 2 9 , - 2 , - 2
.short 0 , - 3 , 1 , 3 8 , 6 4 , 3 2 , - 1 , - 3
endconst
@ All public functions in this file have the following signature:
@ typedef void (*vp9_mc_func)(uint8_t *dst, ptrdiff_t dst_stride,
@ const uint8_t *ref, ptrdiff_t ref_stride,
@ -156,20 +102,21 @@ function ff_vp9_copy16_neon, export=1
endfunc
function f f _ v p9 _ a v g 1 6 _ n e o n , e x p o r t =1
ldr r12 , [ s p ]
push { l r }
ldr r12 , [ s p , #4 ]
mov l r , r0
1 :
vld1 . 8 { q2 } , [ r2 ] , r3
vld1 . 8 { q0 } , [ r0 , : 1 2 8 ] , r1
vld1 . 8 { q3 } , [ r2 ] , r3
vrhadd. u 8 q0 , q0 , q2
vld1 . 8 { q1 } , [ r0 , : 1 2 8 ]
sub r0 , r0 , r1
vld1 . 8 { q1 } , [ r0 , : 1 2 8 ] , r1
vrhadd. u 8 q1 , q1 , q3
subs r12 , r12 , #2
vst1 . 8 { q0 } , [ r0 , : 1 2 8 ] , r1
vst1 . 8 { q1 } , [ r0 , : 1 2 8 ] , r1
vst1 . 8 { q0 } , [ l r , : 1 2 8 ] , r1
vst1 . 8 { q1 } , [ l r , : 1 2 8 ] , r1
bne 1 b
bx l r
pop { p c }
endfunc
function f f _ v p9 _ c o p y 8 _ n e o n , e x p o r t =1
@ -218,7 +165,9 @@ function ff_vp9_copy4_neon, export=1
endfunc
function f f _ v p9 _ a v g 4 _ n e o n , e x p o r t =1
ldr r12 , [ s p ]
push { l r }
ldr r12 , [ s p , #4 ]
mov l r , r0
1 :
vld1 . 3 2 { d4 [ ] } , [ r2 ] , r3
vld1 . 3 2 { d0 [ ] } , [ r0 , : 3 2 ] , r1
@ -231,15 +180,14 @@ function ff_vp9_avg4_neon, export=1
vld1 . 3 2 { d7 [ ] } , [ r2 ] , r3
vrhadd. u 8 d2 , d2 , d6
vld1 . 3 2 { d3 [ ] } , [ r0 , : 3 2 ] , r1
sub r0 , r0 , r1 , l s l #2
subs r12 , r12 , #4
vst1 . 3 2 { d0 [ 0 ] } , [ r0 , : 3 2 ] , r1
vst1 . 3 2 { d0 [ 0 ] } , [ l r , : 3 2 ] , r1
vrhadd. u 8 d3 , d3 , d7
vst1 . 3 2 { d1 [ 0 ] } , [ r0 , : 3 2 ] , r1
vst1 . 3 2 { d2 [ 0 ] } , [ r0 , : 3 2 ] , r1
vst1 . 3 2 { d3 [ 0 ] } , [ r0 , : 3 2 ] , r1
vst1 . 3 2 { d1 [ 0 ] } , [ l r , : 3 2 ] , r1
vst1 . 3 2 { d2 [ 0 ] } , [ l r , : 3 2 ] , r1
vst1 . 3 2 { d3 [ 0 ] } , [ l r , : 3 2 ] , r1
bne 1 b
bx l r
pop { p c }
endfunc
@ Helper macros for vmul/vmla with a constant from either d0 or d1 depending on index
@ -327,7 +275,8 @@ function \type\()_8tap_\size\()h_\idx1\idx2
sub r3 , r3 , #8
.endif
@ Load the filter vector
vld1 . 1 6 { q0 } , [ r12 ,: 1 2 8 ]
vld1 . 8 { d0 } , [ r12 ,: 6 4 ]
vmovl. s8 q0 , d0
1 :
.if \ size > = 1 6
mov r12 , r5
@ -397,12 +346,12 @@ function \type\()_8tap_\size\()h_\idx1\idx2
.endif
@ Store and loop horizontally (for size >= 16)
.if \ size > = 1 6
subs r12 , r12 , #16
vst1 . 8 { q1 } , [ r0 ,: 1 2 8 ] !
vst1 . 8 { q3 } , [ r6 ,: 1 2 8 ] !
beq 3 f
vmov q8 , q10
vmov q11 , q13
subs r12 , r12 , #16
beq 3 f
vld1 . 8 { q10 } , [ r2 ] !
vld1 . 8 { q13 } , [ r7 ] !
vmovl. u 8 q9 , d20
@ -444,7 +393,7 @@ do_8tap_h_size 4
do_ 8 t a p _ h _ s i z e 8
do_ 8 t a p _ h _ s i z e 1 6
.macro do_8tap_h_func type, f i l t e r , s i z e
.macro do_8tap_h_func type, f i l t e r , o f f s e t , s i z e
function f f _ v p9 _ \ t y p e \ ( ) _ \ f i l t e r \ ( ) \ s i z e \ ( ) _ h _ n e o n , e x p o r t =1
push { r4 - r7 }
.if \ size > = 1 6
@ -455,9 +404,10 @@ function ff_vp9_\type\()_\filter\()\size\()_h_neon, export=1
ldr r4 , [ s p , #16 ]
ldr r5 , [ s p , #20 ]
.endif
movrel r12 , \ f i l t e r \ ( ) _ f i l t e r - 1 6
movrelx r12 , X ( f f _ v p9 _ s u b p e l _ f i l t e r s )
add r12 , r12 , 1 2 0 * \ o f f s e t - 8
cmp r5 , #8
add r12 , r12 , r5 , l s l #4
add r12 , r12 , r5 , l s l #3
mov r5 , #\ s i z e
.if \ size > = 1 6
bge \ t y p e \ ( ) _ 8 t a p _ 1 6 h _ 3 4
@ -470,12 +420,12 @@ endfunc
.endm
.macro do_8tap_h_filters size
do_ 8 t a p _ h _ f u n c p u t , r e g u l a r , \ s i z e
do_ 8 t a p _ h _ f u n c a v g , r e g u l a r , \ s i z e
do_ 8 t a p _ h _ f u n c p u t , s h a r p , \ s i z e
do_ 8 t a p _ h _ f u n c a v g , s h a r p , \ s i z e
do_ 8 t a p _ h _ f u n c p u t , s m o o t h , \ s i z e
do_ 8 t a p _ h _ f u n c a v g , s m o o t h , \ s i z e
do_ 8 t a p _ h _ f u n c p u t , r e g u l a r , 1 , \ s i z e
do_ 8 t a p _ h _ f u n c a v g , r e g u l a r , 1 , \ s i z e
do_ 8 t a p _ h _ f u n c p u t , s h a r p , 2 , \ s i z e
do_ 8 t a p _ h _ f u n c a v g , s h a r p , 2 , \ s i z e
do_ 8 t a p _ h _ f u n c p u t , s m o o t h , 0 , \ s i z e
do_ 8 t a p _ h _ f u n c a v g , s m o o t h , 0 , \ s i z e
.endm
do_ 8 t a p _ h _ f i l t e r s 6 4
@ -590,7 +540,8 @@ do_8tap_h_filters 4
function \ t y p e \ ( ) _ 8 t a p _ 8 v _ \ i d x1 \ i d x2
sub r2 , r2 , r3 , l s l #1
sub r2 , r2 , r3
vld1 . 1 6 { q0 } , [ r12 , : 1 2 8 ]
vld1 . 8 { d0 } , [ r12 , : 6 4 ]
vmovl. s8 q0 , d0
1 :
mov r12 , r4
@ -660,7 +611,8 @@ do_8tap_8v avg, 4, 3
function \ t y p e \ ( ) _ 8 t a p _ 4 v _ \ i d x1 \ i d x2
sub r2 , r2 , r3 , l s l #1
sub r2 , r2 , r3
vld1 . 1 6 { q0 } , [ r12 , : 1 2 8 ]
vld1 . 8 { d0 } , [ r12 , : 6 4 ]
vmovl. s8 q0 , d0
vld1 . 3 2 { d2 [ ] } , [ r2 ] , r3
vld1 . 3 2 { d3 [ ] } , [ r2 ] , r3
@ -723,14 +675,15 @@ do_8tap_4v put, 4, 3
do_ 8 t a p _ 4 v a v g , 3 , 4
do_ 8 t a p _ 4 v a v g , 4 , 3
.macro do_8tap_v_func type, f i l t e r , s i z e
.macro do_8tap_v_func type, f i l t e r , o f f s e t , s i z e
function f f _ v p9 _ \ t y p e \ ( ) _ \ f i l t e r \ ( ) \ s i z e \ ( ) _ v _ n e o n , e x p o r t =1
push { r4 - r5 }
vpush { q4 - q7 }
ldr r4 , [ s p , #72 ]
ldr r5 , [ s p , #80 ]
movrel r12 , \ f i l t e r \ ( ) _ f i l t e r - 1 6
add r12 , r12 , r5 , l s l #4
movrelx r12 , X ( f f _ v p9 _ s u b p e l _ f i l t e r s )
add r12 , r12 , 1 2 0 * \ o f f s e t - 8
add r12 , r12 , r5 , l s l #3
cmp r5 , #8
mov r5 , #\ s i z e
.if \ size > = 8
@ -744,12 +697,12 @@ endfunc
.endm
.macro do_8tap_v_filters size
do_ 8 t a p _ v _ f u n c p u t , r e g u l a r , \ s i z e
do_ 8 t a p _ v _ f u n c a v g , r e g u l a r , \ s i z e
do_ 8 t a p _ v _ f u n c p u t , s h a r p , \ s i z e
do_ 8 t a p _ v _ f u n c a v g , s h a r p , \ s i z e
do_ 8 t a p _ v _ f u n c p u t , s m o o t h , \ s i z e
do_ 8 t a p _ v _ f u n c a v g , s m o o t h , \ s i z e
do_ 8 t a p _ v _ f u n c p u t , r e g u l a r , 1 , \ s i z e
do_ 8 t a p _ v _ f u n c a v g , r e g u l a r , 1 , \ s i z e
do_ 8 t a p _ v _ f u n c p u t , s h a r p , 2 , \ s i z e
do_ 8 t a p _ v _ f u n c a v g , s h a r p , 2 , \ s i z e
do_ 8 t a p _ v _ f u n c p u t , s m o o t h , 0 , \ s i z e
do_ 8 t a p _ v _ f u n c a v g , s m o o t h , 0 , \ s i z e
.endm
do_ 8 t a p _ v _ f i l t e r s 6 4