2005-04-17 02:20:36 +04:00
/ *
* arch/ a l p h a / l i b / c s u m _ i p v6 _ m a g i c . S
* Contributed b y R i c h a r d H e n d e r s o n < r t h @tamu.edu>
*
* 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 ) ;
2007-06-24 04:16:35 +04:00
*
* Misalignment h a n d l i n g ( w h i c h c o s t s 1 6 i n s t r u c t i o n s / 8 c y c l e s )
* added b y I v a n K o k s h a y s k y < i n k @jurassic.park.msu.ru>
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 ) # e 0 : l o a d s r c & d s t a d d r w o r d s
2005-04-17 02:20:36 +04:00
zapnot $ 2 0 ,1 5 ,$ 2 0 # . . e 1 : z e r o e x t e n d i n c o m i n g c s u m
extqh $ 1 8 ,1 ,$ 4 # e 0 : b y t e s w a p l e n & p r o t o w h i l e w e w a i t
2007-06-24 04:16:35 +04:00
ldq_ u $ 2 1 ,7 ( $ 1 6 ) # . . e 1 : h a n d l e m i s a l i g n m e n t
2005-04-17 02:20:36 +04:00
extbl $ 1 8 ,1 ,$ 5 # e 0 :
2007-06-24 04:16:35 +04:00
ldq_ u $ 1 ,8 ( $ 1 6 ) # . . e 1 :
2005-04-17 02:20:36 +04:00
extbl $ 1 8 ,2 ,$ 6 # e 0 :
2007-06-24 04:16:35 +04:00
ldq_ u $ 2 2 ,1 5 ( $ 1 6 ) # . . e 1 :
2005-04-17 02:20:36 +04:00
extbl $ 1 8 ,3 ,$ 1 8 # e 0 :
2007-06-24 04:16:35 +04:00
ldq_ u $ 2 ,0 ( $ 1 7 ) # . . e 1 :
2005-04-17 02:20:36 +04:00
sra $ 4 ,3 2 ,$ 4 # e 0 :
2007-06-24 04:16:35 +04:00
ldq_ u $ 2 3 ,7 ( $ 1 7 ) # . . e 1 :
extql $ 0 ,$ 1 6 ,$ 0 # e 0 :
ldq_ u $ 3 ,8 ( $ 1 7 ) # . . e 1 :
extqh $ 2 1 ,$ 1 6 ,$ 2 1 # e 0 :
ldq_ u $ 2 4 ,1 5 ( $ 1 7 ) # . . e 1 :
2005-04-17 02:20:36 +04:00
sll $ 5 ,1 6 ,$ 5 # e 0 :
2007-06-24 04:16:35 +04:00
or $ 0 ,$ 2 1 ,$ 0 # . . e 1 : 1 s t s r c w o r d c o m p l e t e
extql $ 1 ,$ 1 6 ,$ 1 # e 0 :
2005-04-17 02:20:36 +04:00
addq $ 2 0 ,$ 0 ,$ 2 0 # . . e 1 : 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 2 ,$ 1 6 ,$ 2 2 # e 0 :
2005-04-17 02:20:36 +04:00
cmpult $ 2 0 ,$ 0 ,$ 0 # . . e 1 :
2007-06-24 04:16:35 +04:00
sll $ 6 ,8 ,$ 6 # e 0 :
or $ 1 ,$ 2 2 ,$ 1 # . . e 1 : 2 n d s r c w o r d c o m p l e t e
2005-04-17 02:20:36 +04:00
2007-06-24 04:16:35 +04:00
extql $ 2 ,$ 1 7 ,$ 2 # e 0 :
or $ 4 ,$ 1 8 ,$ 1 8 # . . e 1 :
extqh $ 2 3 ,$ 1 7 ,$ 2 3 # e 0 :
2005-04-17 02:20:36 +04:00
or $ 5 ,$ 6 ,$ 5 # . . e 1 :
2007-06-24 04:16:35 +04:00
extql $ 3 ,$ 1 7 ,$ 3 # e 0 :
or $ 2 ,$ 2 3 ,$ 2 # . . e 1 : 1 s t d s t w o r d c o m p l e t e
extqh $ 2 4 ,$ 1 7 ,$ 2 4 # e 0 :
or $ 1 8 ,$ 5 ,$ 1 8 # . . e 1 : l e n c o m p l e t e
extwh $ 1 9 ,7 ,$ 7 # e 0 :
or $ 3 ,$ 2 4 ,$ 3 # . . e 1 : 2 n d d s t w o r d c o m p l e t e
extbl $ 1 9 ,1 ,$ 1 9 # e 0 :
2005-04-17 02:20:36 +04:00
addq $ 2 0 ,$ 1 ,$ 2 0 # . . e 1 :
2007-06-24 04:16:35 +04:00
or $ 1 9 ,$ 7 ,$ 1 9 # e 0 :
2005-04-17 02:20:36 +04:00
cmpult $ 2 0 ,$ 1 ,$ 1 # . . e 1 :
2007-06-24 04:16:35 +04:00
sll $ 1 9 ,4 8 ,$ 1 9 # e 0 :
nop # . . e 0 :
2005-04-17 02:20:36 +04:00
2007-06-24 04:16:35 +04:00
sra $ 1 9 ,3 2 ,$ 1 9 # e 0 : p r o t o c o m p l e t e
2005-04-17 02:20:36 +04:00
addq $ 2 0 ,$ 2 ,$ 2 0 # . . e 1 :
cmpult $ 2 0 ,$ 2 ,$ 2 # e 0 :
addq $ 2 0 ,$ 3 ,$ 2 0 # . . e 1 :
cmpult $ 2 0 ,$ 3 ,$ 3 # e 0 :
addq $ 2 0 ,$ 1 8 ,$ 2 0 # . . e 1 :
cmpult $ 2 0 ,$ 1 8 ,$ 1 8 # e 0 :
addq $ 2 0 ,$ 1 9 ,$ 2 0 # . . e 1 :
cmpult $ 2 0 ,$ 1 9 ,$ 1 9 # e 0 :
addq $ 0 ,$ 1 ,$ 0 # . . e 1 : 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 0 :
addq $ 1 8 ,$ 1 9 ,$ 1 8 # . . e 1 :
addq $ 0 ,$ 2 ,$ 0 # e 0 :
addq $ 2 0 ,$ 1 8 ,$ 2 0 # . . e 1 :
addq $ 0 ,$ 2 0 ,$ 0 # e 0 :
unop # :
extwl $ 0 ,2 ,$ 2 # e 0 : b e g i n f o l d i n g t h e 6 4 - b i t v a l u e
zapnot $ 0 ,3 ,$ 3 # . . e 1 :
extwl $ 0 ,4 ,$ 1 # e 0 :
addq $ 2 ,$ 3 ,$ 3 # . . e 1 :
extwl $ 0 ,6 ,$ 0 # e 0 :
addq $ 3 ,$ 1 ,$ 3 # . . e 1 :
addq $ 0 ,$ 3 ,$ 0 # e 0 :
unop # :
extwl $ 0 ,2 ,$ 1 # e 0 : f o l d 1 8 - b i t v a l u e
zapnot $ 0 ,3 ,$ 0 # . . e 1 :
addq $ 0 ,$ 1 ,$ 0 # e 0 :
unop # :
extwl $ 0 ,2 ,$ 1 # e 0 : f o l d 1 7 - b i t v a l u e
zapnot $ 0 ,3 ,$ 0 # . . e 1 :
addq $ 0 ,$ 1 ,$ 0 # e 0 :
2007-06-24 04:16:35 +04:00
not $ 0 ,$ 0 # . . e 1 : a n d c o m p l e m e n t .
2005-04-17 02:20:36 +04:00
zapnot $ 0 ,3 ,$ 0 # e 0 :
ret # . . e 1 :
.end csum_ipv6_magic