2008-05-20 03:52:27 +04:00
/ *
2005-04-17 02:20:36 +04:00
* memscan. S : O p t i m i z e d m e m s c a n f o r S p a r c64 .
*
* Copyright ( C ) 1 9 9 7 ,1 9 9 8 J a k u b J e l i n e k ( j j @ultra.linux.cz)
* Copyright ( C ) 1 9 9 8 D a v i d S . M i l l e r ( d a v e m @redhat.com)
* /
# define H I _ M A G I C 0 x80 8 0 8 0 8 0 8 0 8 0 8 0 8 0
# define L O _ M A G I C 0 x01 0 1 0 1 0 1 0 1 0 1 0 1 0 1
# define A S I _ P L 0 x88
.text
.align 32
.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 = bufp, %o1 = size */
brlez,p n % o 1 , s z z e r o
andcc % o 0 , 7 , % g 0
be,p t % i c c , w e _ a r e _ a l i g n e d
sethi % h i ( H I _ M A G I C ) , % o 4
ldub [ % o 0 ] , % o 5
1 : subcc % o 1 , 1 , % o 1
brz,p n % o 5 , 1 0 f
add % o 0 , 1 , % o 0
be,p n % x c c , s z z e r o
andcc % o 0 , 7 , % g 0
bne,a ,p n % i c c , 1 b
ldub [ % o 0 ] , % o 5
we_are_aligned :
ldxa [ % o 0 ] A S I _ P L , % o 5
or % o 4 , % l o ( H I _ M A G I C ) , % o 3
sllx % o 3 , 3 2 , % o 4
or % o 4 , % o 3 , % o 3
srlx % o 3 , 7 , % o 2
msloop :
sub % o 1 , 8 , % o 1
add % o 0 , 8 , % o 0
sub % o 5 , % o 2 , % o 4
xor % o 4 , % o 5 , % o 4
andcc % o 4 , % o 3 , % g 3
bne,p n % x c c , c h e c k _ b y t e s
srlx % o 4 , 3 2 , % g 3
brgz,a ,p t % o 1 , m s l o o p
ldxa [ % o 0 ] A S I _ P L , % o 5
check_bytes :
bne,a ,p n % i c c , 2 f
andcc % o 5 , 0 x f f , % g 0
add % o 0 , - 5 , % g 2
ba,p t % x c c , 3 f
srlx % o 5 , 3 2 , % g 7
2 : srlx % o 5 , 8 , % g 7
be,p n % i c c , 1 f
add % o 0 , - 8 , % g 2
andcc % g 7 , 0 x f f , % g 0
srlx % g 7 , 8 , % g 7
be,p n % i c c , 1 f
inc % g 2
andcc % g 7 , 0 x f f , % g 0
srlx % g 7 , 8 , % g 7
be,p n % i c c , 1 f
inc % g 2
andcc % g 7 , 0 x f f , % g 0
srlx % g 7 , 8 , % g 7
be,p n % i c c , 1 f
inc % g 2
andcc % g 3 , % o 3 , % g 0
be,a ,p n % i c c , 2 f
mov % o 0 , % g 2
3 : andcc % g 7 , 0 x f f , % g 0
srlx % g 7 , 8 , % g 7
be,p n % i c c , 1 f
inc % g 2
andcc % g 7 , 0 x f f , % g 0
srlx % g 7 , 8 , % g 7
be,p n % i c c , 1 f
inc % g 2
andcc % g 7 , 0 x f f , % g 0
srlx % g 7 , 8 , % g 7
be,p n % i c c , 1 f
inc % g 2
andcc % g 7 , 0 x f f , % g 0
srlx % g 7 , 8 , % g 7
be,p n % i c c , 1 f
inc % g 2
2 : brgz,a ,p t % o 1 , m s l o o p
ldxa [ % o 0 ] A S I _ P L , % o 5
inc % g 2
1 : add % o 0 , % o 1 , % o 0
cmp % g 2 , % o 0
retl
movle % x c c , % g 2 , % o 0
10 : retl
sub % o 0 , 1 , % o 0
szzero : retl
nop
memscan :
__memscan_generic :
/* %o0 = addr, %o1 = c, %o2 = size */
brz,p n % o 2 , 3 f
add % o 0 , % o 2 , % o 3
ldub [ % o 0 ] , % o 5
sub % g 0 , % o 2 , % o 4
1 :
cmp % o 5 , % o 1
be,p n % i c c , 2 f
addcc % o 4 , 1 , % o 4
bne,a ,p t % x c c , 1 b
ldub [ % o 3 + % o 4 ] , % o 5
retl
/* The delay slot is the same as the next insn, this is just to make it look more awful */
2 :
add % o 3 , % o 4 , % o 0
retl
sub % o 0 , 1 , % o 0
3 :
retl
nop