2005-04-17 02:20:36 +04:00
/ * checksum. S : S p a r c V 9 o p t i m i z e d c h e c k s u m c o d e .
*
* Copyright( C ) 1 9 9 5 L i n u s T o r v a l d s
* Copyright( C ) 1 9 9 5 M i g u e l d e I c a z a
* Copyright( C ) 1 9 9 6 , 2 0 0 0 D a v i d S . M i l l e r
* Copyright( C ) 1 9 9 7 J a k u b J e l i n e k
*
* derived f r o m :
* Linux/ A l p h a c h e c k s u m c - c o d e
* Linux/ i x86 i n l i n e c h e c k s u m a s s e m b l y
* RFC1 0 7 1 C o m p u t i n g t h e I n t e r n e t C h e c k s u m ( e s p . J a c o b s o n s m 6 8 k c o d e )
* David M o s b e r g e r - T a n g f o r o p t i m i z e d r e f e r e n c e c - c o d e
* BSD4 . 4 p o r t a b l e c h e c k s u m r o u t i n e
* /
.text
csum_partial_fix_alignment :
/ * 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
ldub [ % o 0 + 0 x00 ] , % o 4
add % o 0 , 1 , % o 0
sub % o 1 , 1 , % o 1
1 : andcc % o 0 , 0 x2 , % g 0
be,p n % i c c , c s u m _ p a r t i a l _ p o s t _ a l i g n
cmp % o 1 , 2
blu,p n % i c c , c s u m _ p a r t i a l _ e n d _ c r u f t
nop
lduh [ % o 0 + 0 x00 ] , % o 5
add % o 0 , 2 , % o 0
sub % o 1 , 2 , % o 1
ba,p t % x c c , c s u m _ p a r t i a l _ p o s t _ a l i g n
add % o 5 , % o 4 , % o 4
.align 32
.globl csum_partial
csum_partial : /* %o0=buff, %o1=len, %o2=sum */
prefetch [ % o 0 + 0 x00 0 ] , #n _ r e a d s
clr % o 4
prefetch [ % o 0 + 0 x04 0 ] , #n _ r e a d s
brz,p n % o 1 , c s u m _ p a r t i a l _ f i n i s h
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 7 . 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 , c s u m _ p a r t i a l _ f i x _ a l i g n m e n t
andcc % o 0 , 0 x1 , % g 7
csum_partial_post_align :
prefetch [ % o 0 + 0 x08 0 ] , #n _ r e a d s
andncc % o 1 , 0 x3 f , % o 3
prefetch [ % o 0 + 0 x0 c0 ] , #n _ r e a d s
sub % o 1 , % o 3 , % o 1
brz,p n % o 3 , 2 f
prefetch [ % 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 .
* /
prefetch [ % o 0 + 0 x14 0 ] , #n _ r e a d s
1 : lduw [ % o 0 + 0 x00 ] , % o 5
lduw [ % o 0 + 0 x04 ] , % g 1
lduw [ % o 0 + 0 x08 ] , % g 2
add % o 4 , % o 5 , % o 4
lduw [ % o 0 + 0 x0 c ] , % g 3
add % o 4 , % g 1 , % o 4
lduw [ % o 0 + 0 x10 ] , % o 5
add % o 4 , % g 2 , % o 4
lduw [ % o 0 + 0 x14 ] , % g 1
add % o 4 , % g 3 , % o 4
lduw [ % o 0 + 0 x18 ] , % g 2
add % o 4 , % o 5 , % o 4
lduw [ % o 0 + 0 x1 c ] , % g 3
add % o 4 , % g 1 , % o 4
lduw [ % o 0 + 0 x20 ] , % o 5
add % o 4 , % g 2 , % o 4
lduw [ % o 0 + 0 x24 ] , % g 1
add % o 4 , % g 3 , % o 4
lduw [ % o 0 + 0 x28 ] , % g 2
add % o 4 , % o 5 , % o 4
lduw [ % o 0 + 0 x2 c ] , % g 3
add % o 4 , % g 1 , % o 4
lduw [ % o 0 + 0 x30 ] , % o 5
add % o 4 , % g 2 , % o 4
lduw [ % o 0 + 0 x34 ] , % g 1
add % o 4 , % g 3 , % o 4
lduw [ % o 0 + 0 x38 ] , % g 2
add % o 4 , % o 5 , % o 4
lduw [ % o 0 + 0 x3 c ] , % g 3
add % o 4 , % g 1 , % o 4
prefetch [ % o 0 + 0 x18 0 ] , #n _ r e a d s
add % o 4 , % g 2 , % o 4
subcc % o 3 , 0 x40 , % o 3
add % o 0 , 0 x40 , % o 0
bne,p t % i c c , 1 b
add % o 4 , % g 3 , % o 4
2 : and % o 1 , 0 x3 c , % o 3
brz,p n % o 3 , 2 f
sub % o 1 , % o 3 , % o 1
1 : lduw [ % o 0 + 0 x00 ] , % o 5
subcc % o 3 , 0 x4 , % o 3
add % o 0 , 0 x4 , % o 0
bne,p t % i c c , 1 b
add % o 4 , % o 5 , % o 4
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
csum_partial_end_cruft :
/* %o4 has the 16-bit sum we have calculated so-far. */
cmp % o 1 , 2
blu,p t % i c c , 1 f
nop
lduh [ % o 0 + 0 x00 ] , % o 5
sub % o 1 , 2 , % o 1
add % o 0 , 2 , % o 0
add % o 4 , % o 5 , % o 4
1 : brz,p t % o 1 , 1 f
nop
ldub [ % o 0 + 0 x00 ] , % o 5
sub % o 1 , 1 , % o 1
add % o 0 , 1 , % o 0
sllx % o 5 , 8 , % o 5
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 7 , 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 2 , % o 4 , % o 2
addc % g 0 , % o 2 , % o 2
2005-04-17 02:20:36 +04:00
csum_partial_finish :
retl
2006-06-05 08:32:01 +04:00
srl % o 2 , 0 , % o 0