2008-05-19 16:53:02 -07:00
/ *
2005-04-16 15:20:36 -07:00
* memscan. S : O p t i m i z e d m e m s c a n f o r t h e S p a r c .
*
* Copyright ( C ) 1 9 9 6 D a v i d S . M i l l e r ( d a v e m @caip.rutgers.edu)
* /
/* In essence, this is just a fancy strlen. */
# define L O _ M A G I C 0 x01 0 1 0 1 0 1
# define H I _ M A G I C 0 x80 8 0 8 0 8 0
.text
.align 4
.globl _ _ memscan_ z e r o , _ _ m e m s c a n _ g e n e r i c
.globl memscan
__memscan_zero :
/* %o0 = addr, %o1 = size */
cmp % o 1 , 0
bne,a 1 f
andcc % o 0 , 3 , % g 0
retl
nop
1 :
be m z e r o _ s c a n _ w o r d
sethi % h i ( H I _ M A G I C ) , % g 2
ldsb [ % o 0 ] , % g 3
mzero_still_not_word_aligned :
cmp % g 3 , 0
bne 1 f
add % o 0 , 1 , % o 0
retl
sub % o 0 , 1 , % o 0
1 :
subcc % o 1 , 1 , % o 1
bne,a 1 f
andcc % o 0 , 3 , % g 0
retl
nop
1 :
bne,a m z e r o _ s t i l l _ n o t _ w o r d _ a l i g n e d
ldsb [ % o 0 ] , % g 3
sethi % h i ( H I _ M A G I C ) , % g 2
mzero_scan_word :
or % g 2 , % l o ( H I _ M A G I C ) , % o 3
sethi % h i ( L O _ M A G I C ) , % g 3
or % g 3 , % l o ( L O _ M A G I C ) , % o 2
mzero_next_word :
ld [ % o 0 ] , % g 2
mzero_next_word_preloaded :
sub % g 2 , % o 2 , % g 2
mzero_next_word_preloaded_next :
andcc % g 2 , % o 3 , % g 0
bne m z e r o _ b y t e _ z e r o
add % o 0 , 4 , % o 0
mzero_check_out_of_fuel :
subcc % o 1 , 4 , % o 1
bg,a 1 f
ld [ % o 0 ] , % g 2
retl
nop
1 :
b m z e r o _ n e x t _ w o r d _ p r e l o a d e d _ n e x t
sub % g 2 , % o 2 , % g 2
/* Check every byte. */
mzero_byte_zero :
ldsb [ % o 0 - 4 ] , % g 2
cmp % g 2 , 0
bne m z e r o _ b y t e _ o n e
sub % o 0 , 4 , % g 3
retl
mov % g 3 , % o 0
mzero_byte_one :
ldsb [ % o 0 - 3 ] , % g 2
cmp % g 2 , 0
bne,a m z e r o _ b y t e _ t w o _ a n d _ t h r e e
ldsb [ % o 0 - 2 ] , % g 2
retl
sub % o 0 , 3 , % o 0
mzero_byte_two_and_three :
cmp % g 2 , 0
bne,a 1 f
ldsb [ % o 0 - 1 ] , % g 2
retl
sub % o 0 , 2 , % o 0
1 :
cmp % g 2 , 0
bne,a m z e r o _ n e x t _ w o r d _ p r e l o a d e d
ld [ % o 0 ] , % g 2
retl
sub % o 0 , 1 , % o 0
mzero_found_it :
retl
sub % o 0 , 2 , % o 0
memscan :
__memscan_generic :
/* %o0 = addr, %o1 = c, %o2 = size */
cmp % o 2 , 0
bne,a 0 f
ldub [ % o 0 ] , % g 2
b,a 2 f
1 :
ldub [ % o 0 ] , % g 2
0 :
cmp % g 2 , % o 1
be 2 f
addcc % o 2 , - 1 , % o 2
bne 1 b
add % o 0 , 1 , % o 0
2 :
retl
nop