2005-04-17 02:20:36 +04:00
/ *
* arch/ a l p h a / l i b / e v6 - c s u m _ i p v6 _ m a g i c . S
* 2 1 2 6 4 version c o n t r i b u t e d b y R i c k G o r t o n < r i c k . g o r t o n @alpha-processor.com>
*
* unsigned s h o r t c s u m _ i p v6 _ m a g i c ( s t r u c t i n 6 _ a d d r * s a d d r ,
* struct i n 6 _ a d d r * d a d d r ,
* _ _ u3 2 l e n ,
* unsigned s h o r t p r o t o ,
* unsigned i n t c s u m ) ;
*
* Much o f t h e i n f o r m a t i o n a b o u t 2 1 2 6 4 s c h e d u l i n g / c o d i n g c o m e s f r o m :
* Compiler W r i t e r ' s G u i d e f o r t h e A l p h a 2 1 2 6 4
* abbreviated a s ' C W G ' i n o t h e r c o m m e n t s h e r e
* ftp. d i g i t a l . c o m / p u b / D i g i t a l / i n f o / s e m i c o n d u c t o r / l i t e r a t u r e / d s c - l i b r a r y . h t m l
* Scheduling n o t a t i o n :
* E - e i t h e r c l u s t e r
* U - u p p e r s u b c l u s t e r ; U0 - subcluster U0; U1 - subcluster U1
* L - l o w e r s u b c l u s t e r ; L0 - subcluster L0; L1 - subcluster L1
* Try n o t t o c h a n g e t h e a c t u a l a l g o r i t h m i f p o s s i b l e f o r c o n s i s t e n c y .
* Determining a c t u a l s t a l l s ( o t h e r t h a n s l o t t i n g ) d o e s n ' t a p p e a r t o b e e a s y t o d o .
*
* unsigned s h o r t c s u m _ i p v6 _ m a g i c ( s t r u c t i n 6 _ a d d r * s a d d r ,
* struct i n 6 _ a d d r * d a d d r ,
* _ _ u3 2 l e n ,
* unsigned s h o r t p r o t o ,
* unsigned i n t c s u m ) ;
*
* Swap < p r o t o > ( t a k e s f o r m 0 x a a b b )
* Then s h i f t i t l e f t b y 4 8 , s o r e s u l t i s :
* 0 xbbaa0 0 0 0 0 0 0 0 0 0 0 0
* Then t u r n i t b a c k i n t o a s i g n e x t e n d e d 3 2 - b i t i t e m
* 0 xbbaa0 0 0 0
*
* Swap < l e n > ( a n u n s i g n e d i n t ) u s i n g M i k e B u r r o w s ' 7 - i n s t r u c t i o n s e q u e n c e
* ( we c a n ' t h i d e t h e 3 - c y c l e l a t e n c y o f t h e u n p k b w i n t h e 6 - i n s t r u c t i o n s e q u e n c e )
* Assume i n p u t t a k e s f o r m 0 x A A B B C C D D
*
* Finally, o r i g i n a l ' f o l d i n g ' a p p r o a c h i s t o s p l i t t h e l o n g i n t o 4 u n s i g n e d s h o r t s
* add 4 u s h o r t s , r e s u l t i n g i n u s h o r t / c a r r y
* add c a r r y b i t s + u s h o r t - - > u s h o r t
* add c a r r y b i t s + u s h o r t - - > u s h o r t ( i n c a s e t h e c a r r y r e s u l t s i n a n o v e r f l o w )
* Truncate t o a u s h o r t . ( t o o k 1 3 i n s t r u c t i o n s )
* From d o i n g s o m e t e s t i n g , u s i n g t h e a p p r o a c h i n c h e c k s u m . c : f r o m 6 4 t o 1 6 ( )
* results i n t h e s a m e o u t c o m e :
* split i n t o 2 u i n t s , a d d t h o s e , g e n e r a t i n g a u l o n g
* add t h e 3 l o w u s h o r t s t o g e t h e r , g e n e r a t i n g a u i n t
* a f i n a l a d d o f t h e 2 l o w e r u s h o r t s
* truncating t h e r e s u l t .
2007-06-24 04:16:35 +04:00
*
* Misalignment h a n d l i n g a d d e d b y I v a n K o k s h a y s k y < i n k @jurassic.park.msu.ru>
* The c o s t i s 1 6 i n s t r u c t i o n s ( ~ 8 c y c l e s ) , i n c l u d i n g t w o e x t r a l o a d s w h i c h
* may c a u s e a d d i t i o n a l d e l a y i n r a r e c a s e s ( l o a d - l o a d r e p l a y t r a p s ) .
2005-04-17 02:20:36 +04:00
* /
2016-01-11 17:51:29 +03:00
# include < a s m / e x p o r t . h >
2005-04-17 02:20:36 +04:00
.globl csum_ipv6_magic
.align 4
.ent csum_ipv6_magic
.frame $ 3 0 , 0 , $ 2 6 , 0
csum_ipv6_magic :
.prologue 0
2007-06-24 04:16:35 +04:00
ldq_ u $ 0 ,0 ( $ 1 6 ) # L : L a t e n c y : 3
2005-04-17 02:20:36 +04:00
inslh $ 1 8 ,7 ,$ 4 # U : 0000000000 A A B B C C
2007-06-24 04:16:35 +04:00
ldq_ u $ 1 ,8 ( $ 1 6 ) # L : L a t e n c y : 3
2005-04-17 02:20:36 +04:00
sll $ 1 9 ,8 ,$ 7 # U : U L U L : 0x00000000 0 0 a a b b00
2007-06-24 04:16:35 +04:00
and $ 1 6 ,7 ,$ 6 # E : s r c m i s a l i g n m e n t
ldq_ u $ 5 ,1 5 ( $ 1 6 ) # L : L a t e n c y : 3
2005-04-17 02:20:36 +04:00
zapnot $ 2 0 ,1 5 ,$ 2 0 # U : z e r o e x t e n d i n c o m i n g c s u m
2007-06-24 04:16:35 +04:00
ldq_ u $ 2 ,0 ( $ 1 7 ) # L : U L U L : L a t e n c y : 3
extql $ 0 ,$ 6 ,$ 0 # U :
extqh $ 1 ,$ 6 ,$ 2 2 # U :
ldq_ u $ 3 ,8 ( $ 1 7 ) # L : L a t e n c y : 3
sll $ 1 9 ,2 4 ,$ 1 9 # U : U U L U : 0x000000aa b b00 0 0 0 0
cmoveq $ 6 ,$ 3 1 ,$ 2 2 # E : s r c a l i g n e d ?
ldq_ u $ 2 3 ,1 5 ( $ 1 7 ) # L : L a t e n c y : 3
2005-04-17 02:20:36 +04:00
inswl $ 1 8 ,3 ,$ 1 8 # U : 000000 C C D D 0 0 0 0 0 0
2007-06-24 04:16:35 +04:00
addl $ 1 9 ,$ 7 ,$ 1 9 # E : U L U L : < s i g n b i t s > b b a a b b 00
2005-04-17 02:20:36 +04:00
2007-06-24 04:16:35 +04:00
or $ 0 ,$ 2 2 ,$ 0 # E : 1 s t s r c w o r d c o m p l e t e
extql $ 1 ,$ 6 ,$ 1 # U :
or $ 1 8 ,$ 4 ,$ 1 8 # E : 000000 C C D D A A B B C C
extqh $ 5 ,$ 6 ,$ 5 # U : L U L U
2005-04-17 02:20:36 +04:00
2007-06-24 04:16:35 +04:00
and $ 1 7 ,7 ,$ 6 # E : d s t m i s a l i g n m e n t
extql $ 2 ,$ 6 ,$ 2 # U :
or $ 1 ,$ 5 ,$ 1 # E : 2 n d s r c w o r d c o m p l e t e
extqh $ 3 ,$ 6 ,$ 2 2 # U : L U L U :
cmoveq $ 6 ,$ 3 1 ,$ 2 2 # E : d s t a l i g n e d ?
extql $ 3 ,$ 6 ,$ 3 # U :
2005-04-17 02:20:36 +04:00
addq $ 2 0 ,$ 0 ,$ 2 0 # E : b e g i n s u m m i n g t h e w o r d s
2007-06-24 04:16:35 +04:00
extqh $ 2 3 ,$ 6 ,$ 2 3 # U : L U L U :
2005-04-17 02:20:36 +04:00
srl $ 1 8 ,1 6 ,$ 4 # U : 0000000000 C C D D A A
2007-06-24 04:16:35 +04:00
or $ 2 ,$ 2 2 ,$ 2 # E : 1 s t d s t w o r d c o m p l e t e
2005-04-17 02:20:36 +04:00
zap $ 1 9 ,0 x3 ,$ 1 9 # U : < s i g n b i t s > b b a a 0000
2007-06-24 04:16:35 +04:00
or $ 3 ,$ 2 3 ,$ 3 # E : U L U L : 2 n d d s t w o r d c o m p l e t e
2005-04-17 02:20:36 +04:00
cmpult $ 2 0 ,$ 0 ,$ 0 # E :
addq $ 2 0 ,$ 1 ,$ 2 0 # E :
zapnot $ 1 8 ,0 x a ,$ 1 8 # U : 00000000 D D 0 0 B B 0 0
zap $ 4 ,0 x a ,$ 4 # U : U U L L : 0000000000 C C 0 0 A A
or $ 1 8 ,$ 4 ,$ 1 8 # E : 00000000 D D C C B B A A
nop # E :
cmpult $ 2 0 ,$ 1 ,$ 1 # E :
addq $ 2 0 ,$ 2 ,$ 2 0 # E : U L U L
cmpult $ 2 0 ,$ 2 ,$ 2 # E :
addq $ 2 0 ,$ 3 ,$ 2 0 # E :
cmpult $ 2 0 ,$ 3 ,$ 3 # E : ( 1 c y c l e s t a l l o n $ 2 0 )
addq $ 2 0 ,$ 1 8 ,$ 2 0 # E : U L U L ( 1 c y c l e s t a l l o n $ 2 0 )
cmpult $ 2 0 ,$ 1 8 ,$ 1 8 # E :
addq $ 2 0 ,$ 1 9 ,$ 2 0 # E : ( 1 c y c l e s t a l l o n $ 2 0 )
addq $ 0 ,$ 1 ,$ 0 # E : m e r g e t h e c a r r i e s b a c k i n t o t h e c s u m
addq $ 2 ,$ 3 ,$ 2 # E :
cmpult $ 2 0 ,$ 1 9 ,$ 1 9 # E :
addq $ 1 8 ,$ 1 9 ,$ 1 8 # E : ( 1 c y c l e s t a l l o n $ 1 9 )
addq $ 0 ,$ 2 ,$ 0 # E :
addq $ 2 0 ,$ 1 8 ,$ 2 0 # E : U L U L :
/* (1 cycle stall on $18, 2 cycles on $20) */
addq $ 0 ,$ 2 0 ,$ 0 # E :
zapnot $ 0 ,1 5 ,$ 1 # U : S t a r t f o l d i n g o u t p u t ( 1 c y c l e s t a l l o n $ 0 )
nop # E :
srl $ 0 ,3 2 ,$ 0 # U : U L U L : ( 1 c y c l e s t a l l o n $ 0 )
addq $ 1 ,$ 0 ,$ 1 # E : F i n i s h e d g e n e r a t i n g u l o n g
extwl $ 1 ,2 ,$ 2 # U : u s h o r t [ 1 ] ( 1 c y c l e s t a l l o n $ 1 )
zapnot $ 1 ,3 ,$ 0 # U : u s h o r t [ 0 ] ( 1 c y c l e s t a l l o n $ 1 )
extwl $ 1 ,4 ,$ 1 # U : u s h o r t [ 2 ] ( 1 c y c l e s t a l l o n $ 1 )
addq $ 0 ,$ 2 ,$ 0 # E
addq $ 0 ,$ 1 ,$ 3 # E : F i n i s h e d g e n e r a t i n g u i n t
/* (1 cycle stall on $0) */
extwl $ 3 ,2 ,$ 1 # U : u s h o r t [ 1 ] ( 1 c y c l e s t a l l o n $ 3 )
nop # E : L U L U
addq $ 1 ,$ 3 ,$ 0 # E : F i n a l c a r r y
not $ 0 ,$ 4 # E : c o m p l e m e n t ( 1 c y c l e s t a l l o n $ 0 )
zapnot $ 4 ,3 ,$ 0 # U : c l e a r u p p e r g a r b a g e b i t s
/* (1 cycle stall on $4) */
ret # L 0 : L U L U
.end csum_ipv6_magic
2016-01-11 17:51:29 +03:00
EXPORT_ S Y M B O L ( c s u m _ i p v6 _ m a g i c )