2005-04-17 02:20:36 +04:00
/ * csum_ c o p y . S : C h e c k s u m + c o p y c o d e f o r s p a r c64
*
* 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>
* /
# ifdef _ _ K E R N E L _ _
# define G L O B A L _ S P A R E % g 7
# else
# define G L O B A L _ S P A R E % g 5
# endif
# ifndef E X _ L D
# define E X _ L D ( x ) x
# endif
# ifndef E X _ S T
# define E X _ S T ( x ) x
# endif
# ifndef E X _ R E T V A L
# define E X _ R E T V A L ( x ) x
# endif
# ifndef L O A D
# define L O A D ( t y p e ,a d d r ,d e s t ) t y p e [ a d d r ] , d e s t
# endif
# ifndef S T O R E
# define S T O R E ( t y p e ,s r c ,a d d r ) t y p e s r c , [ a d d r ]
# endif
# ifndef F U N C _ N A M E
# define F U N C _ N A M E c s u m _ p a r t i a l _ c o p y _ n o c h e c k
# endif
.register % g2 , #s c r a t c h
.register % g3 , #s c r a t c h
.text
90 :
/ * We c h e c k e d f o r z e r o l e n g t h a l r e a d y , s o t h e r e m u s t b e
* at l e a s t o n e b y t e .
* /
be,p t % i c c , 1 f
nop
EX_ L D ( L O A D ( l d u b , % o 0 + 0 x00 , % o 4 ) )
add % o 0 , 1 , % o 0
sub % o 2 , 1 , % o 2
EX_ S T ( S T O R E ( s t b , % o 4 , % o 1 + 0 x00 ) )
add % o 1 , 1 , % o 1
1 : andcc % o 0 , 0 x2 , % g 0
be,p n % i c c , 8 0 f
cmp % o 2 , 2
blu,p n % i c c , 6 0 f
nop
EX_ L D ( L O A D ( l d u h , % o 0 + 0 x00 , % o 5 ) )
add % o 0 , 2 , % o 0
sub % o 2 , 2 , % o 2
EX_ S T ( S T O R E ( s t h , % o 5 , % o 1 + 0 x00 ) )
add % o 1 , 2 , % o 1
ba,p t % x c c , 8 0 f
add % o 5 , % o 4 , % o 4
.globl FUNC_NAME
FUNC_NAME : /* %o0=src, %o1=dst, %o2=len, %o3=sum */
LOAD( p r e f e t c h , % o 0 + 0 x00 0 , #n _ r e a d s )
xor % o 0 , % o 1 , % g 1
clr % o 4
andcc % g 1 , 0 x3 , % g 0
bne,p n % i c c , 9 5 f
LOAD( p r e f e t c h , % o 0 + 0 x04 0 , #n _ r e a d s )
brz,p n % o 2 , 7 0 f
andcc % o 0 , 0 x3 , % g 0
/ * We " r e m e m b e r " w h e t h e r t h e l o w e s t b i t i n t h e a d d r e s s
* was s e t i n G L O B A L _ S P A R E . B e c a u s e i f i t i s , w e h a v e t o s w a p
* upper a n d l o w e r 8 b i t f i e l d s o f t h e s u m w e c a l c u l a t e .
* /
bne,p n % i c c , 9 0 b
andcc % o 0 , 0 x1 , G L O B A L _ S P A R E
80 :
LOAD( p r e f e t c h , % o 0 + 0 x08 0 , #n _ r e a d s )
andncc % o 2 , 0 x3 f , % g 3
LOAD( p r e f e t c h , % o 0 + 0 x0 c0 , #n _ r e a d s )
sub % o 2 , % g 3 , % o 2
brz,p n % g 3 , 2 f
LOAD( p r e f e t c h , % o 0 + 0 x10 0 , #n _ r e a d s )
/ * So t h a t w e d o n ' t n e e d t o u s e t h e n o n - p a i r i n g
* add- w i t h - c a r r y i n s t r u c t i o n s w e a c c u m u l a t e 3 2 - b i t
* values i n t o a 6 4 - b i t r e g i s t e r . A t t h e e n d o f t h e
* loop w e f o l d i t d o w n t o 3 2 - b i t s a n d s o o n .
* /
ba,p t % x c c , 1 f
LOAD( p r e f e t c h , % o 0 + 0 x14 0 , #n _ r e a d s )
.align 32
1 : EX_ L D ( L O A D ( l d u w , % o 0 + 0 x00 , % o 5 ) )
EX_ L D ( L O A D ( l d u w , % o 0 + 0 x04 , % g 1 ) )
EX_ L D ( L O A D ( l d u w , % o 0 + 0 x08 , % g 2 ) )
add % o 4 , % o 5 , % o 4
EX_ S T ( S T O R E ( s t w , % o 5 , % o 1 + 0 x00 ) )
EX_ L D ( L O A D ( l d u w , % o 0 + 0 x0 c , % o 5 ) )
add % o 4 , % g 1 , % o 4
EX_ S T ( S T O R E ( s t w , % g 1 , % o 1 + 0 x04 ) )
EX_ L D ( L O A D ( l d u w , % o 0 + 0 x10 , % g 1 ) )
add % o 4 , % g 2 , % o 4
EX_ S T ( S T O R E ( s t w , % g 2 , % o 1 + 0 x08 ) )
EX_ L D ( L O A D ( l d u w , % o 0 + 0 x14 , % g 2 ) )
add % o 4 , % o 5 , % o 4
EX_ S T ( S T O R E ( s t w , % o 5 , % o 1 + 0 x0 c ) )
EX_ L D ( L O A D ( l d u w , % o 0 + 0 x18 , % o 5 ) )
add % o 4 , % g 1 , % o 4
EX_ S T ( S T O R E ( s t w , % g 1 , % o 1 + 0 x10 ) )
EX_ L D ( L O A D ( l d u w , % o 0 + 0 x1 c , % g 1 ) )
add % o 4 , % g 2 , % o 4
EX_ S T ( S T O R E ( s t w , % g 2 , % o 1 + 0 x14 ) )
EX_ L D ( L O A D ( l d u w , % o 0 + 0 x20 , % g 2 ) )
add % o 4 , % o 5 , % o 4
EX_ S T ( S T O R E ( s t w , % o 5 , % o 1 + 0 x18 ) )
EX_ L D ( L O A D ( l d u w , % o 0 + 0 x24 , % o 5 ) )
add % o 4 , % g 1 , % o 4
EX_ S T ( S T O R E ( s t w , % g 1 , % o 1 + 0 x1 c ) )
EX_ L D ( L O A D ( l d u w , % o 0 + 0 x28 , % g 1 ) )
add % o 4 , % g 2 , % o 4
EX_ S T ( S T O R E ( s t w , % g 2 , % o 1 + 0 x20 ) )
EX_ L D ( L O A D ( l d u w , % o 0 + 0 x2 c , % g 2 ) )
add % o 4 , % o 5 , % o 4
EX_ S T ( S T O R E ( s t w , % o 5 , % o 1 + 0 x24 ) )
EX_ L D ( L O A D ( l d u w , % o 0 + 0 x30 , % o 5 ) )
add % o 4 , % g 1 , % o 4
EX_ S T ( S T O R E ( s t w , % g 1 , % o 1 + 0 x28 ) )
EX_ L D ( L O A D ( l d u w , % o 0 + 0 x34 , % g 1 ) )
add % o 4 , % g 2 , % o 4
EX_ S T ( S T O R E ( s t w , % g 2 , % o 1 + 0 x2 c ) )
EX_ L D ( L O A D ( l d u w , % o 0 + 0 x38 , % g 2 ) )
add % o 4 , % o 5 , % o 4
EX_ S T ( S T O R E ( s t w , % o 5 , % o 1 + 0 x30 ) )
EX_ L D ( L O A D ( l d u w , % o 0 + 0 x3 c , % o 5 ) )
add % o 4 , % g 1 , % o 4
EX_ S T ( S T O R E ( s t w , % g 1 , % o 1 + 0 x34 ) )
LOAD( p r e f e t c h , % o 0 + 0 x18 0 , #n _ r e a d s )
add % o 4 , % g 2 , % o 4
EX_ S T ( S T O R E ( s t w , % g 2 , % o 1 + 0 x38 ) )
subcc % g 3 , 0 x40 , % g 3
add % o 0 , 0 x40 , % o 0
add % o 4 , % o 5 , % o 4
EX_ S T ( S T O R E ( s t w , % o 5 , % o 1 + 0 x3 c ) )
bne,p t % i c c , 1 b
add % o 1 , 0 x40 , % o 1
2 : and % o 2 , 0 x3 c , % g 3
brz,p n % g 3 , 2 f
sub % o 2 , % g 3 , % o 2
1 : EX_ L D ( L O A D ( l d u w , % o 0 + 0 x00 , % o 5 ) )
subcc % g 3 , 0 x4 , % g 3
add % o 0 , 0 x4 , % o 0
add % o 4 , % o 5 , % o 4
EX_ S T ( S T O R E ( s t w , % o 5 , % o 1 + 0 x00 ) )
bne,p t % i c c , 1 b
add % o 1 , 0 x4 , % o 1
2 :
/* fold 64-->32 */
srlx % o 4 , 3 2 , % o 5
srl % o 4 , 0 , % o 4
add % o 4 , % o 5 , % o 4
srlx % o 4 , 3 2 , % o 5
srl % o 4 , 0 , % o 4
add % o 4 , % o 5 , % o 4
/* fold 32-->16 */
sethi % h i ( 0 x f f f f00 0 0 ) , % g 1
srl % o 4 , 1 6 , % o 5
andn % o 4 , % g 1 , % g 2
add % o 5 , % g 2 , % o 4
srl % o 4 , 1 6 , % o 5
andn % o 4 , % g 1 , % g 2
add % o 5 , % g 2 , % o 4
60 :
/* %o4 has the 16-bit sum we have calculated so-far. */
cmp % o 2 , 2
blu,p t % i c c , 1 f
nop
EX_ L D ( L O A D ( l d u h , % o 0 + 0 x00 , % o 5 ) )
sub % o 2 , 2 , % o 2
add % o 0 , 2 , % o 0
add % o 4 , % o 5 , % o 4
EX_ S T ( S T O R E ( s t h , % o 5 , % o 1 + 0 x00 ) )
add % o 1 , 0 x2 , % o 1
1 : brz,p t % o 2 , 1 f
nop
EX_ L D ( L O A D ( l d u b , % o 0 + 0 x00 , % o 5 ) )
sub % o 2 , 1 , % o 2
add % o 0 , 1 , % o 0
EX_ S T ( S T O R E ( s t b , % o 5 , % o 1 + 0 x00 ) )
sllx % o 5 , 8 , % o 5
add % o 1 , 1 , % o 1
add % o 4 , % o 5 , % o 4
1 :
/* fold 32-->16 */
sethi % h i ( 0 x f f f f00 0 0 ) , % g 1
srl % o 4 , 1 6 , % o 5
andn % o 4 , % g 1 , % g 2
add % o 5 , % g 2 , % o 4
srl % o 4 , 1 6 , % o 5
andn % o 4 , % g 1 , % g 2
add % o 5 , % g 2 , % o 4
1 : brz,p t G L O B A L _ S P A R E , 1 f
nop
/* We started with an odd byte, byte-swap the result. */
srl % o 4 , 8 , % o 5
and % o 4 , 0 x f f , % g 1
sll % g 1 , 8 , % g 1
or % o 5 , % g 1 , % o 4
2006-06-05 08:32:01 +04:00
1 : addcc % o 3 , % o 4 , % o 3
addc % g 0 , % o 3 , % o 3
2005-04-17 02:20:36 +04:00
70 :
retl
2006-06-05 08:32:01 +04:00
srl % o 3 , 0 , % o 0
2005-04-17 02:20:36 +04:00
95 : mov 0 , G L O B A L _ S P A R E
brlez,p n % o 2 , 4 f
andcc % o 0 , 1 , % o 5
be,a ,p t % i c c , 1 f
srl % o 2 , 1 , % g 1
sub % o 2 , 1 , % o 2
EX_ L D ( L O A D ( l d u b , % o 0 , G L O B A L _ S P A R E ) )
add % o 0 , 1 , % o 0
EX_ S T ( S T O R E ( s t b , G L O B A L _ S P A R E , % o 1 ) )
srl % o 2 , 1 , % g 1
add % o 1 , 1 , % o 1
1 : brz,a ,p n % g 1 , 3 f
andcc % o 2 , 1 , % g 0
andcc % o 0 , 2 , % g 0
be,a ,p t % i c c , 1 f
srl % g 1 , 1 , % g 1
EX_ L D ( L O A D ( l d u h , % o 0 , % o 4 ) )
sub % o 2 , 2 , % o 2
srl % o 4 , 8 , % g 2
sub % g 1 , 1 , % g 1
EX_ S T ( S T O R E ( s t b , % g 2 , % o 1 ) )
add % o 4 , G L O B A L _ S P A R E , G L O B A L _ S P A R E
EX_ S T ( S T O R E ( s t b , % o 4 , % o 1 + 1 ) )
add % o 0 , 2 , % o 0
srl % g 1 , 1 , % g 1
add % o 1 , 2 , % o 1
1 : brz,a ,p n % g 1 , 2 f
andcc % o 2 , 2 , % g 0
EX_ L D ( L O A D ( l d u w , % o 0 , % o 4 ) )
5 : srl % o 4 , 2 4 , % g 2
srl % o 4 , 1 6 , % g 3
EX_ S T ( S T O R E ( s t b , % g 2 , % o 1 ) )
srl % o 4 , 8 , % g 2
EX_ S T ( S T O R E ( s t b , % g 3 , % o 1 + 1 ) )
add % o 0 , 4 , % o 0
EX_ S T ( S T O R E ( s t b , % g 2 , % o 1 + 2 ) )
addcc % o 4 , G L O B A L _ S P A R E , G L O B A L _ S P A R E
EX_ S T ( S T O R E ( s t b , % o 4 , % o 1 + 3 ) )
addc G L O B A L _ S P A R E , % g 0 , G L O B A L _ S P A R E
add % o 1 , 4 , % o 1
subcc % g 1 , 1 , % g 1
bne,a ,p t % i c c , 5 b
EX_ L D ( L O A D ( l d u w , % o 0 , % o 4 ) )
sll G L O B A L _ S P A R E , 1 6 , % g 2
srl G L O B A L _ S P A R E , 1 6 , G L O B A L _ S P A R E
srl % g 2 , 1 6 , % g 2
andcc % o 2 , 2 , % g 0
add % g 2 , G L O B A L _ S P A R E , G L O B A L _ S P A R E
2 : be,a ,p t % i c c , 3 f
andcc % o 2 , 1 , % g 0
EX_ L D ( L O A D ( l d u h , % o 0 , % o 4 ) )
andcc % o 2 , 1 , % g 0
srl % o 4 , 8 , % g 2
add % o 0 , 2 , % o 0
EX_ S T ( S T O R E ( s t b , % g 2 , % o 1 ) )
add G L O B A L _ S P A R E , % o 4 , G L O B A L _ S P A R E
EX_ S T ( S T O R E ( s t b , % o 4 , % o 1 + 1 ) )
add % o 1 , 2 , % o 1
3 : be,a ,p t % i c c , 1 f
sll G L O B A L _ S P A R E , 1 6 , % o 4
EX_ L D ( L O A D ( l d u b , % o 0 , % g 2 ) )
sll % g 2 , 8 , % o 4
EX_ S T ( S T O R E ( s t b , % g 2 , % o 1 ) )
add G L O B A L _ S P A R E , % o 4 , G L O B A L _ S P A R E
sll G L O B A L _ S P A R E , 1 6 , % o 4
1 : addcc % o 4 , G L O B A L _ S P A R E , G L O B A L _ S P A R E
srl G L O B A L _ S P A R E , 1 6 , % o 4
addc % g 0 , % o 4 , G L O B A L _ S P A R E
brz,p t % o 5 , 4 f
srl G L O B A L _ S P A R E , 8 , % o 4
and G L O B A L _ S P A R E , 0 x f f , % g 2
and % o 4 , 0 x f f , % o 4
sll % g 2 , 8 , % g 2
or % g 2 , % o 4 , G L O B A L _ S P A R E
4 : addcc % o 3 , G L O B A L _ S P A R E , % o 3
addc % g 0 , % o 3 , % o 0
retl
srl % o 0 , 0 , % o 0
.size FUNC_ N A M E , . - F U N C _ N A M E