2006-02-21 14:29:42 -08:00
/ * NGbzero. S : N i a g a r a o p t i m i z e d m e m s e t / c l e a r _ u s e r .
*
* Copyright ( C ) 2 0 0 6 D a v i d S . M i l l e r ( d a v e m @davemloft.net)
* /
# include < a s m / a s i . h >
# define E X _ S T ( x ,y ) \
98 : x,y ; \
2008-01-31 16:48:49 -08:00
.section _ _ ex_ t a b l e ," a " ;\
2006-02-21 14:29:42 -08:00
.align 4 ; \
2009-02-08 22:00:55 -08:00
.word 9 8 b, _ _ r e t l _ o 1 ; \
2006-02-21 14:29:42 -08:00
.text ; \
.align 4 ;
.text
.globl NGmemset
.type NGmemset, #f u n c t i o n
NGmemset : /* %o0=buf, %o1=pat, %o2=len */
and % o 1 , 0 x f f , % o 3
mov % o 2 , % o 1
sllx % o 3 , 8 , % g 1
or % g 1 , % o 3 , % o 2
sllx % o 2 , 1 6 , % g 1
or % g 1 , % o 2 , % o 2
sllx % o 2 , 3 2 , % g 1
ba,p t % x c c , 1 f
or % g 1 , % o 2 , % o 2
.globl NGbzero
.type NGbzero, #f u n c t i o n
NGbzero :
clr % o 2
1 : brz,p n % o 1 , N G b z e r o _ r e t u r n
mov % o 0 , % o 3
/ * % o5 : saved % a s i , r e s t o r e d a t N G b z e r o _ d o n e
* % g7 : store- i n i t % a s i t o u s e
* % o4 : non- s t o r e - i n i t % a s i t o u s e
* /
rd % a s i , % o 5
mov A S I _ B L K _ I N I T _ Q U A D _ L D D _ P , % g 7
mov A S I _ P , % o 4
wr % o 4 , 0 x0 , % a s i
NGbzero_from_clear_user :
cmp % o 1 , 1 5
bl,p n % i c c , N G b z e r o _ t i n y
andcc % o 0 , 0 x7 , % g 1
be,p t % x c c , 2 f
mov 8 , % g 2
sub % g 2 , % g 1 , % g 1
sub % o 1 , % g 1 , % o 1
1 : EX_ S T ( s t b a % o 2 , [ % o 0 + 0 x00 ] % a s i )
subcc % g 1 , 1 , % g 1
bne,p t % x c c , 1 b
add % o 0 , 1 , % o 0
2 : cmp % o 1 , 1 2 8
bl,p n % i c c , N G b z e r o _ m e d i u m
andcc % o 0 , ( 6 4 - 1 ) , % g 1
be,p t % x c c , N G b z e r o _ p r e _ l o o p
mov 6 4 , % g 2
sub % g 2 , % g 1 , % g 1
sub % o 1 , % g 1 , % o 1
1 : EX_ S T ( s t x a % o 2 , [ % o 0 + 0 x00 ] % a s i )
subcc % g 1 , 8 , % g 1
bne,p t % x c c , 1 b
add % o 0 , 8 , % o 0
NGbzero_pre_loop :
wr % g 7 , 0 x0 , % a s i
andn % o 1 , ( 6 4 - 1 ) , % g 1
sub % o 1 , % g 1 , % o 1
NGbzero_loop :
EX_ S T ( s t x a % o 2 , [ % o 0 + 0 x00 ] % a s i )
EX_ S T ( s t x a % o 2 , [ % o 0 + 0 x08 ] % a s i )
EX_ S T ( s t x a % o 2 , [ % o 0 + 0 x10 ] % a s i )
EX_ S T ( s t x a % o 2 , [ % o 0 + 0 x18 ] % a s i )
EX_ S T ( s t x a % o 2 , [ % o 0 + 0 x20 ] % a s i )
EX_ S T ( s t x a % o 2 , [ % o 0 + 0 x28 ] % a s i )
EX_ S T ( s t x a % o 2 , [ % o 0 + 0 x30 ] % a s i )
EX_ S T ( s t x a % o 2 , [ % o 0 + 0 x38 ] % a s i )
subcc % g 1 , 6 4 , % g 1
bne,p t % x c c , N G b z e r o _ l o o p
add % o 0 , 6 4 , % o 0
2007-03-19 13:27:33 -07:00
membar #S y n c
2006-02-21 14:29:42 -08:00
wr % o 4 , 0 x0 , % a s i
brz,p n % o 1 , N G b z e r o _ d o n e
NGbzero_medium :
andncc % o 1 , 0 x7 , % g 1
be,p n % x c c , 2 f
sub % o 1 , % g 1 , % o 1
1 : EX_ S T ( s t x a % o 2 , [ % o 0 + 0 x00 ] % a s i )
subcc % g 1 , 8 , % g 1
bne,p t % x c c , 1 b
add % o 0 , 8 , % o 0
2 : brz,p t % o 1 , N G b z e r o _ d o n e
nop
NGbzero_tiny :
1 : EX_ S T ( s t b a % o 2 , [ % o 0 + 0 x00 ] % a s i )
subcc % o 1 , 1 , % o 1
bne,p t % i c c , 1 b
add % o 0 , 1 , % o 0
/* fallthrough */
NGbzero_done :
wr % o 5 , 0 x0 , % a s i
NGbzero_return :
retl
mov % o 3 , % o 0
.size NGbzero, . - N G b z e r o
.size NGmemset, . - N G m e m s e t
.globl NGclear_user
.type NGclear_ u s e r , #f u n c t i o n
NGclear_user : /* %o0=buf, %o1=len */
rd % a s i , % o 5
brz,p n % o 1 , N G b z e r o _ d o n e
clr % o 3
cmp % o 5 , A S I _ A I U S
bne,p n % i c c , N G b z e r o
clr % o 2
mov A S I _ B L K _ I N I T _ Q U A D _ L D D _ A I U S , % g 7
ba,p t % x c c , N G b z e r o _ f r o m _ c l e a r _ u s e r
mov A S I _ A I U S , % o 4
.size NGclear_ u s e r , . - N G c l e a r _ u s e r
# define B R A N C H _ A L W A Y S 0 x10 6 8 0 0 0 0
# define N O P 0 x01 0 0 0 0 0 0
# define N G _ D O _ P A T C H ( O L D , N E W ) \
sethi % h i ( N E W ) , % g 1 ; \
or % g 1 , % l o ( N E W ) , % g 1 ; \
sethi % h i ( O L D ) , % g 2 ; \
or % g 2 , % l o ( O L D ) , % g 2 ; \
sub % g 1 , % g 2 , % g 1 ; \
sethi % h i ( B R A N C H _ A L W A Y S ) , % g 3 ; \
sll % g 1 , 1 1 , % g 1 ; \
srl % g 1 , 1 1 + 2 , % g 1 ; \
or % g 3 , % l o ( B R A N C H _ A L W A Y S ) , % g 3 ; \
or % g 3 , % g 1 , % g 3 ; \
stw % g 3 , [ % g 2 ] ; \
sethi % h i ( N O P ) , % g 3 ; \
or % g 3 , % l o ( N O P ) , % g 3 ; \
stw % g 3 , [ % g 2 + 0 x4 ] ; \
flush % g 2 ;
.globl niagara_patch_bzero
.type niagara_ p a t c h _ b z e r o ,#f u n c t i o n
niagara_patch_bzero :
NG_ D O _ P A T C H ( m e m s e t , N G m e m s e t )
NG_ D O _ P A T C H ( _ _ b z e r o , N G b z e r o )
NG_ D O _ P A T C H ( _ _ c l e a r _ u s e r , N G c l e a r _ u s e r )
2006-03-18 23:55:11 -08:00
NG_ D O _ P A T C H ( t s b _ i n i t , N G t s b _ i n i t )
2006-02-21 14:29:42 -08:00
retl
nop
.size niagara_ p a t c h _ b z e r o ,. - n i a g a r a _ p a t c h _ b z e r o