2005-04-17 02:20:36 +04:00
/ * bzero. S : S i m p l e p r e f e t c h i n g m e m s e t , b z e r o , a n d c l e a r _ u s e r
* implementations.
*
* Copyright ( C ) 2 0 0 5 D a v i d S . M i l l e r < d a v e m @davemloft.net>
* /
.text
.globl memset
.type memset, #f u n c t i o n
memset : /* %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 __bzero
.type _ _ bzero, #f u n c t i o n
__bzero : /* %o0=buf, %o1=len */
clr % o 2
1 : mov % o 0 , % o 3
brz,p n % o 1 , _ _ b z e r o _ d o n e
cmp % o 1 , 1 6
bl,p n % i c c , _ _ b z e r o _ t i n y
prefetch [ % o 0 + 0 x00 0 ] , #n _ w r i t e s
andcc % o 0 , 0 x3 , % g 0
be,p t % i c c , 2 f
1 : stb % o 2 , [ % o 0 + 0 x00 ]
add % o 0 , 1 , % o 0
andcc % o 0 , 0 x3 , % g 0
bne,p n % i c c , 1 b
sub % o 1 , 1 , % o 1
2 : andcc % o 0 , 0 x7 , % g 0
be,p t % i c c , 3 f
stw % o 2 , [ % o 0 + 0 x00 ]
sub % o 1 , 4 , % o 1
add % o 0 , 4 , % o 0
3 : and % o 1 , 0 x38 , % g 1
cmp % o 1 , 0 x40
andn % o 1 , 0 x3 f , % o 4
bl,p n % i c c , 5 f
and % o 1 , 0 x7 , % o 1
prefetch [ % o 0 + 0 x04 0 ] , #n _ w r i t e s
prefetch [ % o 0 + 0 x08 0 ] , #n _ w r i t e s
prefetch [ % o 0 + 0 x0 c0 ] , #n _ w r i t e s
prefetch [ % o 0 + 0 x10 0 ] , #n _ w r i t e s
prefetch [ % o 0 + 0 x14 0 ] , #n _ w r i t e s
4 : prefetch [ % o 0 + 0 x18 0 ] , #n _ w r i t e s
stx % o 2 , [ % o 0 + 0 x00 ]
stx % o 2 , [ % o 0 + 0 x08 ]
stx % o 2 , [ % o 0 + 0 x10 ]
stx % o 2 , [ % o 0 + 0 x18 ]
stx % o 2 , [ % o 0 + 0 x20 ]
stx % o 2 , [ % o 0 + 0 x28 ]
stx % o 2 , [ % o 0 + 0 x30 ]
stx % o 2 , [ % o 0 + 0 x38 ]
subcc % o 4 , 0 x40 , % o 4
bne,p t % i c c , 4 b
add % o 0 , 0 x40 , % o 0
brz,p n % g 1 , 6 f
nop
5 : stx % o 2 , [ % o 0 + 0 x00 ]
subcc % g 1 , 8 , % g 1
bne,p t % i c c , 5 b
add % o 0 , 0 x8 , % o 0
6 : brz,p t % o 1 , _ _ b z e r o _ d o n e
nop
__bzero_tiny :
1 : stb % o 2 , [ % o 0 + 0 x00 ]
subcc % o 1 , 1 , % o 1
bne,p t % i c c , 1 b
add % o 0 , 1 , % o 0
__bzero_done :
retl
mov % o 3 , % o 0
.size _ _ bzero, . - _ _ b z e r o
.size memset, . - m e m s e t
# define E X _ S T ( x ,y ) \
98 : x,y ; \
2006-03-05 10:23:56 +03:00
.section _ _ ex_ t a b l e ," a " ;\
2005-04-17 02:20:36 +04:00
.align 4 ; \
2009-02-09 09:00:55 +03:00
.word 9 8 b, _ _ r e t l _ o 1 ; \
2005-04-17 02:20:36 +04:00
.text ; \
.align 4 ;
2006-02-17 21:35:23 +03:00
.globl __clear_user
.type _ _ clear_ u s e r , #f u n c t i o n
__clear_user : /* %o0=buf, %o1=len */
brz,p n % o 1 , _ _ c l e a r _ u s e r _ d o n e
2005-04-17 02:20:36 +04:00
cmp % o 1 , 1 6
2006-02-17 21:35:23 +03:00
bl,p n % i c c , _ _ c l e a r _ u s e r _ t i n y
2005-04-17 02:20:36 +04:00
EX_ S T ( p r e f e t c h a [ % o 0 + 0 x00 ] % a s i , #n _ w r i t e s )
andcc % o 0 , 0 x3 , % g 0
be,p t % i c c , 2 f
1 : EX_ S T ( s t b a % g 0 , [ % o 0 + 0 x00 ] % a s i )
add % o 0 , 1 , % o 0
andcc % o 0 , 0 x3 , % g 0
bne,p n % i c c , 1 b
sub % o 1 , 1 , % o 1
2 : andcc % o 0 , 0 x7 , % g 0
be,p t % i c c , 3 f
EX_ S T ( s t w a % g 0 , [ % o 0 + 0 x00 ] % a s i )
sub % o 1 , 4 , % o 1
add % o 0 , 4 , % o 0
3 : and % o 1 , 0 x38 , % g 1
cmp % o 1 , 0 x40
andn % o 1 , 0 x3 f , % o 4
bl,p n % i c c , 5 f
and % o 1 , 0 x7 , % o 1
EX_ S T ( p r e f e t c h a [ % o 0 + 0 x04 0 ] % a s i , #n _ w r i t e s )
EX_ S T ( p r e f e t c h a [ % o 0 + 0 x08 0 ] % a s i , #n _ w r i t e s )
EX_ S T ( p r e f e t c h a [ % o 0 + 0 x0 c0 ] % a s i , #n _ w r i t e s )
EX_ S T ( p r e f e t c h a [ % o 0 + 0 x10 0 ] % a s i , #n _ w r i t e s )
EX_ S T ( p r e f e t c h a [ % o 0 + 0 x14 0 ] % a s i , #n _ w r i t e s )
4 : EX_ S T ( p r e f e t c h a [ % o 0 + 0 x18 0 ] % a s i , #n _ w r i t e s )
EX_ S T ( s t x a % g 0 , [ % o 0 + 0 x00 ] % a s i )
EX_ S T ( s t x a % g 0 , [ % o 0 + 0 x08 ] % a s i )
EX_ S T ( s t x a % g 0 , [ % o 0 + 0 x10 ] % a s i )
EX_ S T ( s t x a % g 0 , [ % o 0 + 0 x18 ] % a s i )
EX_ S T ( s t x a % g 0 , [ % o 0 + 0 x20 ] % a s i )
EX_ S T ( s t x a % g 0 , [ % o 0 + 0 x28 ] % a s i )
EX_ S T ( s t x a % g 0 , [ % o 0 + 0 x30 ] % a s i )
EX_ S T ( s t x a % g 0 , [ % o 0 + 0 x38 ] % a s i )
subcc % o 4 , 0 x40 , % o 4
bne,p t % i c c , 4 b
add % o 0 , 0 x40 , % o 0
brz,p n % g 1 , 6 f
nop
5 : EX_ S T ( s t x a % g 0 , [ % o 0 + 0 x00 ] % a s i )
subcc % g 1 , 8 , % g 1
bne,p t % i c c , 5 b
add % o 0 , 0 x8 , % o 0
2006-02-17 21:35:23 +03:00
6 : brz,p t % o 1 , _ _ c l e a r _ u s e r _ d o n e
2005-04-17 02:20:36 +04:00
nop
2006-02-17 21:35:23 +03:00
__clear_user_tiny :
2005-04-17 02:20:36 +04:00
1 : EX_ S T ( s t b a % g 0 , [ % 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
2006-02-17 21:35:23 +03:00
__clear_user_done :
2005-04-17 02:20:36 +04:00
retl
clr % o 0
2006-02-17 21:35:23 +03:00
.size _ _ clear_ u s e r , . - _ _ c l e a r _ u s e r