@ -431,3 +431,225 @@ endfunc
.unreq ST3
.unreq I
.unreq PSAMP
/********************************************************************/
PSA . r e q a1 / / s a m p l e s
PCO . r e q a2 / / c o e f f s
PBL . r e q a3 / / b y p a s s e d _ l s b s
INDEX . r e q a4
CO0 . r e q v1
CO1 . r e q v2
CO2 . r e q v3
CO3 . r e q v4
SA0 . r e q v5
SA1 . r e q v6
SA2 . r e q s l
SA3 . r e q f p
AC0 . r e q i p
AC1 . r e q l r
NOISE . r e q S A 0
LSB . r e q S A 1
DCH . r e q S A 2 / / d e s t _ c h
MASK . r e q S A 3
/ / INDEX i s u s e d a s f o l l o w s :
/ / bits 0 . . 6 i n d e x2 ( v a l u e s u p t o 1 7 , b u t w i d e r s o t h a t w e c a n
/ / add t o i n d e x f i e l d w i t h o u t n e e d i n g t o m a s k )
/ / bits 7 . . 1 4 i ( v a l u e s u p t o 1 6 0 )
/ / bit 1 5 u n d e r f l o w d e t e c t f o r i
/ / bits 2 5 . . 3 1 ( i f a c c e s s _ u n i t _ s i z e _ p o w2 = = 1 2 8 ) \ i n d e x
/ / bits 2 6 . . 3 1 ( i f a c c e s s _ u n i t _ s i z e _ p o w2 = = 6 4 ) /
.macro implement_rematrix shift, i n d e x _ m a s k , m a s k _ m i n u s1 , m a x c h a n
.if \ maxchan = = 1
/ / We c a n j u s t l e a v e t h e c o e f f i c i e n t s i n r e g i s t e r s i n t h i s c a s e
ldrd C O 0 , C O 1 , [ P C O ]
.endif
1 :
.if \ maxchan = = 1
ldrd S A 0 , S A 1 , [ P S A ]
smull A C 0 , A C 1 , C O 0 , S A 0
.elseif \ maxchan = = 5
ldr C O 0 , [ P C O , #0 ]
ldr S A 0 , [ P S A , #0 ]
ldr C O 1 , [ P C O , #4 ]
ldr S A 1 , [ P S A , #4 ]
ldrd C O 2 , C O 3 , [ P C O , #8 ]
smull A C 0 , A C 1 , C O 0 , S A 0
ldrd S A 2 , S A 3 , [ P S A , #8 ]
smlal A C 0 , A C 1 , C O 1 , S A 1
ldrd C O 0 , C O 1 , [ P C O , #16 ]
smlal A C 0 , A C 1 , C O 2 , S A 2
ldrd S A 0 , S A 1 , [ P S A , #16 ]
smlal A C 0 , A C 1 , C O 3 , S A 3
smlal A C 0 , A C 1 , C O 0 , S A 0
.else / / \ maxchan = = 7
ldr C O 2 , [ P C O , #0 ]
ldr S A 2 , [ P S A , #0 ]
ldr C O 3 , [ P C O , #4 ]
ldr S A 3 , [ P S A , #4 ]
ldrd C O 0 , C O 1 , [ P C O , #8 ]
smull A C 0 , A C 1 , C O 2 , S A 2
ldrd S A 0 , S A 1 , [ P S A , #8 ]
smlal A C 0 , A C 1 , C O 3 , S A 3
ldrd C O 2 , C O 3 , [ P C O , #16 ]
smlal A C 0 , A C 1 , C O 0 , S A 0
ldrd S A 2 , S A 3 , [ P S A , #16 ]
smlal A C 0 , A C 1 , C O 1 , S A 1
ldrd C O 0 , C O 1 , [ P C O , #24 ]
smlal A C 0 , A C 1 , C O 2 , S A 2
ldrd S A 0 , S A 1 , [ P S A , #24 ]
smlal A C 0 , A C 1 , C O 3 , S A 3
smlal A C 0 , A C 1 , C O 0 , S A 0
.endif
ldm s p , { N O I S E , D C H , M A S K }
smlal A C 0 , A C 1 , C O 1 , S A 1
.if \ shift ! = 0
.if \ index_ m a s k = = 6 3
add N O I S E , N O I S E , I N D E X , l s r #32 - 6
ldrb L S B , [ P B L ] , #M A X _ C H A N N E L S
ldrsb N O I S E , [ N O I S E ]
add I N D E X , I N D E X , I N D E X , l s l #32 - 6
.else / / \ index_ m a s k = = 1 2 7
add N O I S E , N O I S E , I N D E X , l s r #32 - 7
ldrb L S B , [ P B L ] , #M A X _ C H A N N E L S
ldrsb N O I S E , [ N O I S E ]
add I N D E X , I N D E X , I N D E X , l s l #32 - 7
.endif
sub I N D E X , I N D E X , #1 < < 7
adds A C 0 , A C 0 , N O I S E , l s l #\ s h i f t + 7
adc A C 1 , A C 1 , N O I S E , a s r #31
.else
ldrb L S B , [ P B L ] , #M A X _ C H A N N E L S
sub I N D E X , I N D E X , #1 < < 7
.endif
add P S A , P S A , #M A X _ C H A N N E L S * 4
mov A C 0 , A C 0 , l s r #14
orr A C 0 , A C 0 , A C 1 , l s l #18
.if ! \ mask_ m i n u s1
and A C 0 , A C 0 , M A S K
.endif
add A C 0 , A C 0 , L S B
tst I N D E X , #1 < < 1 5
str A C 0 , [ P S A , D C H , l s l #2 ] / / D C H i s p r e c o m p e n s a t e d f o r t h e e a r l y i n c r e m e n t o f P S A
beq 1 b
b 9 8 f
.endm
.macro switch_on_maxchan shift, i n d e x _ m a s k , m a s k _ m i n u s1
cmp v4 , #5
blo 5 1 f
beq 5 0 f
implement_ r e m a t r i x \ s h i f t , \ i n d e x _ m a s k , \ m a s k _ m i n u s1 , 7
50 : implement_ r e m a t r i x \ s h i f t , \ i n d e x _ m a s k , \ m a s k _ m i n u s1 , 5
51 : implement_ r e m a t r i x \ s h i f t , \ i n d e x _ m a s k , \ m a s k _ m i n u s1 , 1
.endm
.macro switch_on_mask shift, i n d e x _ m a s k
cmp s l , #- 1
bne 4 0 f
switch_ o n _ m a x c h a n \ s h i f t , \ i n d e x _ m a s k , 1
40 : switch_ o n _ m a x c h a n \ s h i f t , \ i n d e x _ m a s k , 0
.endm
.macro switch_on_au_size shift
.if \ shift = = 0
switch_ o n _ m a s k \ s h i f t , u n d e f i n e d
.else
teq v6 , #64
bne 3 0 f
orr I N D E X , I N D E X , v1 , l s l #32 - 6
switch_ o n _ m a s k \ s h i f t , 6 3
30 : orr I N D E X , I N D E X , v1 , l s l #32 - 7
switch_ o n _ m a s k \ s h i f t , 1 2 7
.endif
.endm
/ * void f f _ m l p _ r e m a t r i x _ c h a n n e l _ a r m ( i n t 3 2 _ t * s a m p l e s ,
* const i n t 3 2 _ t * c o e f f s ,
* const u i n t 8 _ t * b y p a s s e d _ l s b s ,
* const i n t 8 _ t * n o i s e _ b u f f e r ,
* int i n d e x ,
* unsigned i n t d e s t _ c h ,
* uint1 6 _ t b l o c k p o s ,
* unsigned i n t m a x c h a n ,
* int m a t r i x _ n o i s e _ s h i f t ,
* int a c c e s s _ u n i t _ s i z e _ p o w2 ,
* int3 2 _ t m a s k ) ;
* /
function f f _ m l p _ r e m a t r i x _ c h a n n e l _ a r m , e x p o r t =1
push { v1 - f p ,l r }
add v1 , s p , #9 * 4 / / p o i n t a t a r g u m e n t s o n s t a c k
ldm v1 , { v1 - s l }
teq v4 , #1
itt n e
teqne v4 , #5
teqne v4 , #7
bne 9 9 f
teq v6 , #64
it n e
teqne v6 , #128
bne 9 9 f
sub v2 , v2 , #M A X _ C H A N N E L S
push { a4 ,v2 ,s l } / / i n i t i a l i s e N O I S E ,D C H ,M A S K ; make sp dword-aligned
movs I N D E X , v3 , l s l #7
beq 9 8 f / / j u s t i n c a s e , d o n o t h i n g i f b l o c k p o s = 0
subs I N D E X , I N D E X , #1 < < 7 / / o f f s e t b y 1 s o w e b o r r o w a t t h e r i g h t t i m e
adc l r , v1 , v1 / / c a l c u l a t e i n d e x2 ( C w a s s e t b y p r e c e d i n g s u b s )
orr I N D E X , I N D E X , l r
/ / Switch o n m a t r i x _ n o i s e _ s h i f t : v a l u e s 0 a n d 1 a r e
/ / disproportionately c o m m o n s o d o t h o s e i n a f o r m t h e b r a n c h
/ / predictor c a n a c c e l e r a t e . V a l u e s c a n o n l y g o u p t o 1 5 .
cmp v5 , #1
beq 1 1 f
blo 1 0 f
A l d r p c , [ p c , v5 , l s l #2 ]
T t b h [ p c , v5 , l s l #1 ]
0 :
A . w o r d 0 , 0 , 0 , 1 2 f , 1 3 f , 1 4 f , 1 5 f , 1 6 f , 1 7 f , 1 8 f , 1 9 f , 2 0 f , 2 1 f , 2 2 f , 2 3 f , 2 4 f , 2 5 f
T . h w o r d 0 , 0 , ( 1 2 f - 0 b ) / 2 , ( 1 3 f - 0 b ) / 2 , ( 1 4 f - 0 b ) / 2 , ( 1 5 f - 0 b ) / 2
T . h w o r d ( 1 6 f - 0 b ) / 2 , ( 1 7 f - 0 b ) / 2 , ( 1 8 f - 0 b ) / 2 , ( 1 9 f - 0 b ) / 2
T . h w o r d ( 2 0 f - 0 b ) / 2 , ( 2 1 f - 0 b ) / 2 , ( 2 2 f - 0 b ) / 2 , ( 2 3 f - 0 b ) / 2 , ( 2 4 f - 0 b ) / 2 , ( 2 5 f - 0 b ) / 2
10 : switch_ o n _ a u _ s i z e 0
11 : switch_ o n _ a u _ s i z e 1
12 : switch_ o n _ a u _ s i z e 2
13 : switch_ o n _ a u _ s i z e 3
14 : switch_ o n _ a u _ s i z e 4
15 : switch_ o n _ a u _ s i z e 5
16 : switch_ o n _ a u _ s i z e 6
17 : switch_ o n _ a u _ s i z e 7
18 : switch_ o n _ a u _ s i z e 8
19 : switch_ o n _ a u _ s i z e 9
20 : switch_ o n _ a u _ s i z e 1 0
21 : switch_ o n _ a u _ s i z e 1 1
22 : switch_ o n _ a u _ s i z e 1 2
23 : switch_ o n _ a u _ s i z e 1 3
24 : switch_ o n _ a u _ s i z e 1 4
25 : switch_ o n _ a u _ s i z e 1 5
98 : add s p , s p , #3 * 4
pop { v1 - f p ,p c }
99 : / / Can' t h a n d l e t h e s e p a r a m e t e r s , d r o p b a c k t o C
pop { v1 - f p ,l r }
b X ( f f _ m l p _ r e m a t r i x _ c h a n n e l )
endfunc
.unreq PSA
.unreq PCO
.unreq PBL
.unreq INDEX
.unreq CO0
.unreq CO1
.unreq CO2
.unreq CO3
.unreq SA0
.unreq SA1
.unreq SA2
.unreq SA3
.unreq AC0
.unreq AC1
.unreq NOISE
.unreq LSB
.unreq DCH
.unreq MASK