2007-08-09 04:11:39 +04:00
/ * GENbzero. S : G e n e r i c s p a r c64 m e m s e t / c l e a r _ u s e r .
*
* Copyright ( C ) 2 0 0 7 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-02-01 03:48:49 +03:00
.section _ _ ex_ t a b l e ," a " ;\
2007-08-09 04:11:39 +04:00
.align 4 ; \
2009-02-09 09:00:55 +03:00
.word 9 8 b, _ _ r e t l _ o 1 ; \
2007-08-09 04:11:39 +04:00
.text ; \
.align 4 ;
.align 32
.text
.globl GENmemset
.type GENmemset, #f u n c t i o n
GENmemset : /* %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 GENbzero
.type GENbzero, #f u n c t i o n
GENbzero :
clr % o 2
1 : brz,p n % o 1 , G E N 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 G E N b z e r o _ d o n e
* % o4 : store % a s i t o u s e
* /
rd % a s i , % o 5
mov A S I _ P , % o 4
wr % o 4 , 0 x0 , % a s i
GENbzero_from_clear_user :
cmp % o 1 , 1 5
bl,p n % i c c , G E N 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 , G E N 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 , G E N 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
GENbzero_pre_loop :
andn % o 1 , ( 6 4 - 1 ) , % g 1
sub % o 1 , % g 1 , % o 1
GENbzero_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 , G E N b z e r o _ l o o p
add % o 0 , 6 4 , % o 0
membar #S y n c
wr % o 4 , 0 x0 , % a s i
brz,p n % o 1 , G E N b z e r o _ d o n e
GENbzero_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 , G E N b z e r o _ d o n e
nop
GENbzero_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 */
GENbzero_done :
wr % o 5 , 0 x0 , % a s i
GENbzero_return :
retl
mov % o 3 , % o 0
.size GENbzero, . - G E N b z e r o
.size GENmemset, . - G E N m e m s e t
.globl GENclear_user
.type GENclear_ u s e r , #f u n c t i o n
GENclear_user : /* %o0=buf, %o1=len */
rd % a s i , % o 5
brz,p n % o 1 , G E N 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 , G E N b z e r o
clr % o 2
ba,p t % x c c , G E N 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 GENclear_ u s e r , . - G E N 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 G E N _ 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 generic_patch_bzero
.type generic_ p a t c h _ b z e r o ,#f u n c t i o n
generic_patch_bzero :
GEN_ D O _ P A T C H ( m e m s e t , G E N m e m s e t )
GEN_ D O _ P A T C H ( _ _ b z e r o , G E N b z e r o )
GEN_ D O _ P A T C H ( _ _ c l e a r _ u s e r , G E N c l e a r _ u s e r )
retl
nop
.size generic_ p a t c h _ b z e r o ,. - g e n e r i c _ p a t c h _ b z e r o