2005-04-17 02:20:36 +04:00
/ * checksum. S : S p a r c 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 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
* /
# include < a s m / e r r n o . h >
# define C S U M _ B I G C H U N K ( b u f , o f f s e t , s u m , t 0 , t 1 , t 2 , t 3 , t 4 , t 5 ) \
ldd [ b u f + o f f s e t + 0 x00 ] , t 0 ; \
ldd [ b u f + o f f s e t + 0 x08 ] , t 2 ; \
addxcc t 0 , s u m , s u m ; \
addxcc t 1 , s u m , s u m ; \
ldd [ b u f + o f f s e t + 0 x10 ] , t 4 ; \
addxcc t 2 , s u m , s u m ; \
addxcc t 3 , s u m , s u m ; \
ldd [ b u f + o f f s e t + 0 x18 ] , t 0 ; \
addxcc t 4 , s u m , s u m ; \
addxcc t 5 , s u m , s u m ; \
addxcc t 0 , s u m , s u m ; \
addxcc t 1 , s u m , s u m ;
# define C S U M _ L A S T C H U N K ( b u f , o f f s e t , s u m , t 0 , t 1 , t 2 , t 3 ) \
ldd [ b u f - o f f s e t - 0 x08 ] , t 0 ; \
ldd [ b u f - o f f s e t - 0 x00 ] , t 2 ; \
addxcc t 0 , s u m , s u m ; \
addxcc t 1 , s u m , s u m ; \
addxcc t 2 , s u m , s u m ; \
addxcc t 3 , s u m , s u m ;
/* Do end cruft out of band to get better cache patterns. */
csum_partial_end_cruft :
be 1 f ! c a l l e r a s k s % o 1 & 0 x8
andcc % o 1 , 4 , % g 0 ! n o p e , c h e c k f o r w o r d r e m a i n i n g
ldd [ % o 0 ] , % g 2 ! l o a d t w o
addcc % g 2 , % o 2 , % o 2 ! a d d f i r s t w o r d t o s u m
addxcc % g 3 , % o 2 , % o 2 ! a d d s e c o n d w o r d a s w e l l
add % o 0 , 8 , % o 0 ! a d v a n c e b u f p t r
addx % g 0 , % o 2 , % o 2 ! a d d i n f i n a l c a r r y
andcc % o 1 , 4 , % g 0 ! c h e c k a g a i n f o r w o r d r e m a i n i n g
1 : be 1 f ! n o p e , s k i p t h i s c o d e
andcc % o 1 , 3 , % o 1 ! c h e c k f o r t r a i l i n g b y t e s
ld [ % o 0 ] , % g 2 ! l o a d i t
addcc % g 2 , % o 2 , % o 2 ! a d d t o s u m
add % o 0 , 4 , % o 0 ! a d v a n c e b u f p t r
addx % g 0 , % o 2 , % o 2 ! a d d i n f i n a l c a r r y
andcc % o 1 , 3 , % g 0 ! c h e c k a g a i n f o r t r a i l i n g b y t e s
1 : be 1 f ! n o t r a i l i n g b y t e s , r e t u r n
addcc % o 1 , - 1 , % g 0 ! o n l y o n e b y t e r e m a i n s ?
bne 2 f ! a t l e a s t t w o b y t e s m o r e
subcc % o 1 , 2 , % o 1 ! o n l y t w o b y t e s m o r e ?
b 4 f ! o n l y o n e b y t e r e m a i n s
or % g 0 , % g 0 , % o 4 ! c l e a r f a k e h w o r d v a l u e
2 : lduh [ % o 0 ] , % o 4 ! g e t h w o r d
be 6 f ! j m p i f o n l y h w o r d r e m a i n s
add % o 0 , 2 , % o 0 ! a d v a n c e b u f p t r e i t h e r w a y
sll % o 4 , 1 6 , % o 4 ! c r e a t e u p p e r h w o r d
4 : ldub [ % o 0 ] , % o 5 ! g e t f i n a l b y t e
sll % o 5 , 8 , % o 5 ! p u t i n t o p l a c e
or % o 5 , % o 4 , % o 4 ! c o a l e s e w i t h h w o r d ( i f a n y )
6 : addcc % o 4 , % o 2 , % o 2 ! a d d t o s u m
1 : retl ! g e t o u t t a h e r e
addx % g 0 , % o 2 , % o 0 ! a d d f i n a l c a r r y i n t o r e t v a l
/* Also do alignment out of band to get better cache patterns. */
csum_partial_fix_alignment :
cmp % o 1 , 6
bl c p t e - 0 x4
andcc % o 0 , 0 x2 , % g 0
be 1 f
andcc % o 0 , 0 x4 , % g 0
lduh [ % o 0 + 0 x00 ] , % g 2
sub % o 1 , 2 , % o 1
add % o 0 , 2 , % o 0
sll % g 2 , 1 6 , % g 2
addcc % g 2 , % o 2 , % o 2
srl % o 2 , 1 6 , % g 3
addx % g 0 , % g 3 , % g 2
sll % o 2 , 1 6 , % o 2
sll % g 2 , 1 6 , % g 3
srl % o 2 , 1 6 , % o 2
andcc % o 0 , 0 x4 , % g 0
or % g 3 , % o 2 , % o 2
1 : be c p a
andcc % o 1 , 0 x f f f f f f80 , % o 3
ld [ % o 0 + 0 x00 ] , % g 2
sub % o 1 , 4 , % o 1
addcc % g 2 , % o 2 , % o 2
add % o 0 , 4 , % o 0
addx % g 0 , % o 2 , % o 2
b c p a
andcc % o 1 , 0 x f f f f f f80 , % o 3
/ * The c o m m o n c a s e i s t o g e t c a l l e d w i t h a n i c e l y a l i g n e d
* buffer o f s i z e 0 x20 . F o l l o w t h e c o d e p a t h f o r t h a t c a s e .
* /
.globl csum_partial
csum_partial : /* %o0=buf, %o1=len, %o2=sum */
andcc % o 0 , 0 x7 , % g 0 ! a l i g n m e n t p r o b l e m s ?
bne c s u m _ p a r t i a l _ f i x _ a l i g n m e n t ! y e p , h a n d l e i t
sethi % h i ( c p t e - 8 ) , % g 7 ! p r e p a r e t a b l e j m p p t r
andcc % o 1 , 0 x f f f f f f80 , % o 3 ! n u m l o o p i t e r a t i o n s
cpa : be 3 f ! n o n e t o d o
andcc % o 1 , 0 x70 , % g 1 ! c l e a r s c a r r y f l a g t o o
5 : CSUM_ B I G C H U N K ( % o 0 , 0 x00 , % o 2 , % o 4 , % o 5 , % g 2 , % g 3 , % g 4 , % g 5 )
CSUM_ B I G C H U N K ( % o 0 , 0 x20 , % o 2 , % o 4 , % o 5 , % g 2 , % g 3 , % g 4 , % g 5 )
CSUM_ B I G C H U N K ( % o 0 , 0 x40 , % o 2 , % o 4 , % o 5 , % g 2 , % g 3 , % g 4 , % g 5 )
CSUM_ B I G C H U N K ( % o 0 , 0 x60 , % o 2 , % o 4 , % o 5 , % g 2 , % g 3 , % g 4 , % g 5 )
addx % g 0 , % o 2 , % o 2 ! s i n k i n f i n a l c a r r y
subcc % o 3 , 1 2 8 , % o 3 ! d e t r a c t f r o m l o o p i t e r s
bne 5 b ! m o r e t o d o
add % o 0 , 1 2 8 , % o 0 ! a d v a n c e b u f p t r
andcc % o 1 , 0 x70 , % g 1 ! c l e a r s c a r r y f l a g t o o
3 : be c p t e ! n o p e
andcc % o 1 , 0 x f , % g 0 ! a n y t h i n g l e f t a t a l l ?
srl % g 1 , 1 , % o 4 ! c o m p u t e o f f s e t
sub % g 7 , % g 1 , % g 7 ! a d j u s t j m p p t r
sub % g 7 , % o 4 , % g 7 ! f i n a l j m p p t r a d j u s t
jmp % g 7 + % l o ( c p t e - 8 ) ! e n t e r t h e t a b l e
add % o 0 , % g 1 , % o 0 ! a d v a n c e b u f p t r
cptbl : CSUM_ L A S T C H U N K ( % o 0 , 0 x68 , % o 2 , % g 2 , % g 3 , % g 4 , % g 5 )
CSUM_ L A S T C H U N K ( % o 0 , 0 x58 , % o 2 , % g 2 , % g 3 , % g 4 , % g 5 )
CSUM_ L A S T C H U N K ( % o 0 , 0 x48 , % o 2 , % g 2 , % g 3 , % g 4 , % g 5 )
CSUM_ L A S T C H U N K ( % o 0 , 0 x38 , % o 2 , % g 2 , % g 3 , % g 4 , % g 5 )
CSUM_ L A S T C H U N K ( % o 0 , 0 x28 , % o 2 , % g 2 , % g 3 , % g 4 , % g 5 )
CSUM_ L A S T C H U N K ( % o 0 , 0 x18 , % o 2 , % g 2 , % g 3 , % g 4 , % g 5 )
CSUM_ L A S T C H U N K ( % o 0 , 0 x08 , % o 2 , % g 2 , % g 3 , % g 4 , % g 5 )
addx % g 0 , % o 2 , % o 2 ! f e t c h f i n a l c a r r y
andcc % o 1 , 0 x f , % g 0 ! a n y t h i n g l e f t a t a l l ?
cpte : bne c s u m _ p a r t i a l _ e n d _ c r u f t ! y e p , h a n d l e i t
andcc % o 1 , 8 , % g 0 ! c h e c k h o w m u c h
cpout : retl ! g e t o u t t a h e r e
mov % o 2 , % o 0 ! r e t u r n c o m p u t e d c s u m
.globl _ _ csum_ p a r t i a l _ c o p y _ s t a r t , _ _ c s u m _ p a r t i a l _ c o p y _ e n d
__csum_partial_copy_start :
/* Work around cpp -rob */
# define A L L O C #a l l o c
# define E X E C I N S T R #e x e c i n s t r
# define E X ( x ,y ,a ,b ) \
98 : x,y ; \
.section .fixup , ALLOC,E X E C I N S T R ; \
.align 4 ; \
99 : ba 3 0 f ; \
a, b , % o 3 ; \
.section _ _ ex_ t a b l e ,A L L O C ; \
.align 4 ; \
.word 9 8 b, 9 9 b ; \
.text ; \
.align 4
# define E X 2 ( x ,y ) \
98 : x,y ; \
.section _ _ ex_ t a b l e ,A L L O C ; \
.align 4 ; \
.word 9 8 b, 3 0 f ; \
.text ; \
.align 4
# define E X 3 ( x ,y ) \
98 : x,y ; \
.section _ _ ex_ t a b l e ,A L L O C ; \
.align 4 ; \
.word 9 8 b, 9 6 f ; \
.text ; \
.align 4
# define E X T ( s t a r t ,e n d ,h a n d l e r ) \
.section _ _ ex_ t a b l e ,A L L O C ; \
.align 4 ; \
.word start, 0 , e n d , h a n d l e r ; \
.text ; \
.align 4
/ * This a l i g n e d v e r s i o n e x e c u t e s t y p i c a l l y i n 8 . 5 s u p e r s c a l a r c y c l e s , t h i s
* is t h e b e s t I c a n d o . I s a y 8 . 5 b e c a u s e t h e f i n a l a d d w i l l p a i r w i t h
* the n e x t l d d i n t h e m a i n u n r o l l e d l o o p . T h u s t h e p i p e i s a l w a y s f u l l .
* If y o u c h a n g e t h e s e m a c r o s ( i n c l u d i n g o r d e r o f i n s t r u c t i o n s ) ,
* please c h e c k t h e f i x u p c o d e b e l o w a s w e l l .
* /
# define C S U M C O P Y _ B I G C H U N K _ A L I G N E D ( s r c , d s t , s u m , o f f , t 0 , t 1 , t 2 , t 3 , t 4 , t 5 , t 6 , t 7 ) \
ldd [ s r c + o f f + 0 x00 ] , t 0 ; \
ldd [ s r c + o f f + 0 x08 ] , t 2 ; \
addxcc t 0 , s u m , s u m ; \
ldd [ s r c + o f f + 0 x10 ] , t 4 ; \
addxcc t 1 , s u m , s u m ; \
ldd [ s r c + o f f + 0 x18 ] , t 6 ; \
addxcc t 2 , s u m , s u m ; \
std t 0 , [ d s t + o f f + 0 x00 ] ; \
addxcc t 3 , s u m , s u m ; \
std t 2 , [ d s t + o f f + 0 x08 ] ; \
addxcc t 4 , s u m , s u m ; \
std t 4 , [ d s t + o f f + 0 x10 ] ; \
addxcc t 5 , s u m , s u m ; \
std t 6 , [ d s t + o f f + 0 x18 ] ; \
addxcc t 6 , s u m , s u m ; \
addxcc t 7 , s u m , s u m ;
/ * 1 2 superscalar c y c l e s s e e m s t o b e t h e l i m i t f o r t h i s c a s e ,
* because o f t h i s w e t h u s d o a l l t h e l d d ' s t o g e t h e r t o g e t
* Viking M X C C i n t o s t r e a m i n g m o d e . H o h u m . . .
* /
# define C S U M C O P Y _ B I G C H U N K ( s r c , d s t , s u m , o f f , t 0 , t 1 , t 2 , t 3 , t 4 , t 5 , t 6 , t 7 ) \
ldd [ s r c + o f f + 0 x00 ] , t 0 ; \
ldd [ s r c + o f f + 0 x08 ] , t 2 ; \
ldd [ s r c + o f f + 0 x10 ] , t 4 ; \
ldd [ s r c + o f f + 0 x18 ] , t 6 ; \
st t 0 , [ d s t + o f f + 0 x00 ] ; \
addxcc t 0 , s u m , s u m ; \
st t 1 , [ d s t + o f f + 0 x04 ] ; \
addxcc t 1 , s u m , s u m ; \
st t 2 , [ d s t + o f f + 0 x08 ] ; \
addxcc t 2 , s u m , s u m ; \
st t 3 , [ d s t + o f f + 0 x0 c ] ; \
addxcc t 3 , s u m , s u m ; \
st t 4 , [ d s t + o f f + 0 x10 ] ; \
addxcc t 4 , s u m , s u m ; \
st t 5 , [ d s t + o f f + 0 x14 ] ; \
addxcc t 5 , s u m , s u m ; \
st t 6 , [ d s t + o f f + 0 x18 ] ; \
addxcc t 6 , s u m , s u m ; \
st t 7 , [ d s t + o f f + 0 x1 c ] ; \
addxcc t 7 , s u m , s u m ;
/* Yuck, 6 superscalar cycles... */
# define C S U M C O P Y _ L A S T C H U N K ( s r c , d s t , s u m , o f f , t 0 , t 1 , t 2 , t 3 ) \
ldd [ s r c - o f f - 0 x08 ] , t 0 ; \
ldd [ s r c - o f f - 0 x00 ] , t 2 ; \
addxcc t 0 , s u m , s u m ; \
st t 0 , [ d s t - o f f - 0 x08 ] ; \
addxcc t 1 , s u m , s u m ; \
st t 1 , [ d s t - o f f - 0 x04 ] ; \
addxcc t 2 , s u m , s u m ; \
st t 2 , [ d s t - o f f - 0 x00 ] ; \
addxcc t 3 , s u m , s u m ; \
st t 3 , [ d s t - o f f + 0 x04 ] ;
/* Handle the end cruft code out of band for better cache patterns. */
cc_end_cruft :
be 1 f
andcc % o 3 , 4 , % g 0
EX( l d d [ % o 0 + 0 x00 ] , % g 2 , a n d % o 3 , 0 x f )
add % o 1 , 8 , % o 1
addcc % g 2 , % g 7 , % g 7
add % o 0 , 8 , % o 0
addxcc % g 3 , % g 7 , % g 7
EX2 ( s t % g 2 , [ % o 1 - 0 x08 ] )
addx % g 0 , % g 7 , % g 7
andcc % o 3 , 4 , % g 0
EX2 ( s t % g 3 , [ % o 1 - 0 x04 ] )
1 : be 1 f
andcc % o 3 , 3 , % o 3
EX( l d [ % o 0 + 0 x00 ] , % g 2 , a d d % o 3 , 4 )
add % o 1 , 4 , % o 1
addcc % g 2 , % g 7 , % g 7
EX2 ( s t % g 2 , [ % o 1 - 0 x04 ] )
addx % g 0 , % g 7 , % g 7
andcc % o 3 , 3 , % g 0
add % o 0 , 4 , % o 0
1 : be 1 f
addcc % o 3 , - 1 , % g 0
bne 2 f
subcc % o 3 , 2 , % o 3
b 4 f
or % g 0 , % g 0 , % o 4
2 : EX( l d u h [ % o 0 + 0 x00 ] , % o 4 , a d d % o 3 , 2 )
add % o 0 , 2 , % o 0
EX2 ( s t h % o 4 , [ % o 1 + 0 x00 ] )
be 6 f
add % o 1 , 2 , % o 1
sll % o 4 , 1 6 , % o 4
4 : EX( l d u b [ % o 0 + 0 x00 ] , % o 5 , a d d % g 0 , 1 )
EX2 ( s t b % o 5 , [ % o 1 + 0 x00 ] )
sll % o 5 , 8 , % o 5
or % o 5 , % o 4 , % o 4
6 : addcc % o 4 , % g 7 , % g 7
1 : retl
addx % g 0 , % g 7 , % o 0
/* Also, handle the alignment code out of band. */
cc_dword_align :
2011-05-10 06:31:41 +04:00
cmp % g 1 , 1 6
bge 1 f
srl % g 1 , 1 , % o 3
2 : cmp % o 3 , 0
be,a c c t e
2005-04-17 02:20:36 +04:00
andcc % g 1 , 0 x f , % o 3
2011-05-10 06:31:41 +04:00
andcc % o 3 , % o 0 , % g 0 ! C h e c k % o 0 o n l y ( % o 1 h a s t h e s a m e l a s t 2 b i t s )
be,a 2 b
srl % o 3 , 1 , % o 3
1 : andcc % o 0 , 0 x1 , % g 0
2005-04-17 02:20:36 +04:00
bne c c s l o w
andcc % o 0 , 0 x2 , % g 0
be 1 f
andcc % o 0 , 0 x4 , % g 0
EX( l d u h [ % o 0 + 0 x00 ] , % g 4 , a d d % g 1 , 0 )
sub % g 1 , 2 , % g 1
EX2 ( s t h % g 4 , [ % o 1 + 0 x00 ] )
add % o 0 , 2 , % o 0
sll % g 4 , 1 6 , % g 4
addcc % g 4 , % g 7 , % g 7
add % o 1 , 2 , % o 1
srl % g 7 , 1 6 , % g 3
addx % g 0 , % g 3 , % g 4
sll % g 7 , 1 6 , % g 7
sll % g 4 , 1 6 , % g 3
srl % g 7 , 1 6 , % g 7
andcc % o 0 , 0 x4 , % g 0
or % g 3 , % g 7 , % g 7
1 : be 3 f
andcc % g 1 , 0 x f f f f f f80 , % g 0
EX( l d [ % o 0 + 0 x00 ] , % g 4 , a d d % g 1 , 0 )
sub % g 1 , 4 , % g 1
EX2 ( s t % g 4 , [ % o 1 + 0 x00 ] )
add % o 0 , 4 , % o 0
addcc % g 4 , % g 7 , % g 7
add % o 1 , 4 , % o 1
addx % g 0 , % g 7 , % g 7
b 3 f
andcc % g 1 , 0 x f f f f f f80 , % g 0
/ * Sun, y o u j u s t c a n ' t b e a t m e , y o u j u s t c a n ' t . S t o p t r y i n g ,
* give u p . I ' m s e r i o u s , I a m g o i n g t o k i c k t h e l i v i n g s h i t
* out o f y o u , g a m e o v e r , l i g h t s o u t .
* /
.align 8
.globl __csum_partial_copy_sparc_generic
__csum_partial_copy_sparc_generic :
/* %o0=src, %o1=dest, %g1=len, %g7=sum */
xor % o 0 , % o 1 , % o 4 ! g e t c h a n g i n g b i t s
andcc % o 4 , 3 , % g 0 ! c h e c k f o r m i s m a t c h e d a l i g n m e n t
bne c c s l o w ! b e t t e r t h i s t h a n u n a l i g n e d / f i x u p s
andcc % o 0 , 7 , % g 0 ! n e e d t o a l i g n t h i n g s ?
bne c c _ d w o r d _ a l i g n ! y e s , w e c h e c k f o r s h o r t l e n g t h s t h e r e
andcc % g 1 , 0 x f f f f f f80 , % g 0 ! c a n w e u s e u n r o l l e d l o o p ?
3 : be 3 f ! n o p e , l e s s t h a n o n e l o o p r e m a i n s
andcc % o 1 , 4 , % g 0 ! d e s t a l i g n e d o n 4 o r 8 b y t e b o u n d a r y ?
be c c d b l + 4 ! 8 b y t e a l i g n e d , k i c k a s s
5 : CSUMCOPY_ B I G C H U N K ( % o 0 ,% o 1 ,% g 7 ,0 x00 ,% o 4 ,% o 5 ,% g 2 ,% g 3 ,% g 4 ,% g 5 ,% o 2 ,% o 3 )
CSUMCOPY_ B I G C H U N K ( % o 0 ,% o 1 ,% g 7 ,0 x20 ,% o 4 ,% o 5 ,% g 2 ,% g 3 ,% g 4 ,% g 5 ,% o 2 ,% o 3 )
CSUMCOPY_ B I G C H U N K ( % o 0 ,% o 1 ,% g 7 ,0 x40 ,% o 4 ,% o 5 ,% g 2 ,% g 3 ,% g 4 ,% g 5 ,% o 2 ,% o 3 )
CSUMCOPY_ B I G C H U N K ( % o 0 ,% o 1 ,% g 7 ,0 x60 ,% o 4 ,% o 5 ,% g 2 ,% g 3 ,% g 4 ,% g 5 ,% o 2 ,% o 3 )
10 : EXT( 5 b , 1 0 b , 2 0 f ) ! n o t e f o r e x c e p t i o n h a n d l i n g
sub % g 1 , 1 2 8 , % g 1 ! d e t r a c t f r o m l e n g t h
addx % g 0 , % g 7 , % g 7 ! a d d i n l a s t c a r r y b i t
andcc % g 1 , 0 x f f f f f f80 , % g 0 ! m o r e t o c s u m ?
add % o 0 , 1 2 8 , % o 0 ! a d v a n c e s r c p t r
bne 5 b ! w e d i d n o t g o n e g a t i v e , c o n t i n u e l o o p i n g
add % o 1 , 1 2 8 , % o 1 ! a d v a n c e d e s t p t r
3 : andcc % g 1 , 0 x70 , % o 2 ! c a n u s e t a b l e ?
ccmerge : be c c t e ! n o p e , g o a n d c h e c k f o r e n d c r u f t
andcc % g 1 , 0 x f , % o 3 ! g e t l o w b i t s o f l e n g t h ( c l e a r s c a r r y b t w )
srl % o 2 , 1 , % o 4 ! b e g i n n e g a t i v e o f f s e t c o m p u t a t i o n
sethi % h i ( 1 2 f ) , % o 5 ! s e t u p t a b l e p t r e n d
add % o 0 , % o 2 , % o 0 ! a d v a n c e s r c p t r
sub % o 5 , % o 4 , % o 5 ! c o n t i n u e t a b l e c a l c u l a t i o n
sll % o 2 , 1 , % g 2 ! c o n s t a n t m u l t i p l i e s a r e f u n . . .
sub % o 5 , % g 2 , % o 5 ! s o m e m o r e a d j u s t m e n t s
jmp % o 5 + % l o ( 1 2 f ) ! j u m p i n t o i t , d u f f s t y l e , w h e e e . . .
add % o 1 , % o 2 , % o 1 ! a d v a n c e d e s t p t r ( c a r r y i s c l e a r b t w )
cctbl : CSUMCOPY_ L A S T C H U N K ( % o 0 ,% o 1 ,% g 7 ,0 x68 ,% g 2 ,% g 3 ,% g 4 ,% g 5 )
CSUMCOPY_ L A S T C H U N K ( % o 0 ,% o 1 ,% g 7 ,0 x58 ,% g 2 ,% g 3 ,% g 4 ,% g 5 )
CSUMCOPY_ L A S T C H U N K ( % o 0 ,% o 1 ,% g 7 ,0 x48 ,% g 2 ,% g 3 ,% g 4 ,% g 5 )
CSUMCOPY_ L A S T C H U N K ( % o 0 ,% o 1 ,% g 7 ,0 x38 ,% g 2 ,% g 3 ,% g 4 ,% g 5 )
CSUMCOPY_ L A S T C H U N K ( % o 0 ,% o 1 ,% g 7 ,0 x28 ,% g 2 ,% g 3 ,% g 4 ,% g 5 )
CSUMCOPY_ L A S T C H U N K ( % o 0 ,% o 1 ,% g 7 ,0 x18 ,% g 2 ,% g 3 ,% g 4 ,% g 5 )
CSUMCOPY_ L A S T C H U N K ( % o 0 ,% o 1 ,% g 7 ,0 x08 ,% g 2 ,% g 3 ,% g 4 ,% g 5 )
12 : EXT( c c t b l , 1 2 b , 2 2 f ) ! n o t e f o r e x c e p t i o n t a b l e h a n d l i n g
addx % g 0 , % g 7 , % g 7
andcc % o 3 , 0 x f , % g 0 ! c h e c k f o r l o w b i t s s e t
ccte : bne c c _ e n d _ c r u f t ! s o m e t h i n g l e f t , h a n d l e i t o u t o f b a n d
andcc % o 3 , 8 , % g 0 ! b e g i n c h e c k s f o r t h a t c o d e
retl ! r e t u r n
mov % g 7 , % o 0 ! g i v e e m t h e c o m p u t e d c h e c k s u m
ccdbl : CSUMCOPY_ B I G C H U N K _ A L I G N E D ( % o 0 ,% o 1 ,% g 7 ,0 x00 ,% o 4 ,% o 5 ,% g 2 ,% g 3 ,% g 4 ,% g 5 ,% o 2 ,% o 3 )
CSUMCOPY_ B I G C H U N K _ A L I G N E D ( % o 0 ,% o 1 ,% g 7 ,0 x20 ,% o 4 ,% o 5 ,% g 2 ,% g 3 ,% g 4 ,% g 5 ,% o 2 ,% o 3 )
CSUMCOPY_ B I G C H U N K _ A L I G N E D ( % o 0 ,% o 1 ,% g 7 ,0 x40 ,% o 4 ,% o 5 ,% g 2 ,% g 3 ,% g 4 ,% g 5 ,% o 2 ,% o 3 )
CSUMCOPY_ B I G C H U N K _ A L I G N E D ( % o 0 ,% o 1 ,% g 7 ,0 x60 ,% o 4 ,% o 5 ,% g 2 ,% g 3 ,% g 4 ,% g 5 ,% o 2 ,% o 3 )
11 : EXT( c c d b l , 1 1 b , 2 1 f ) ! n o t e f o r e x c e p t i o n t a b l e h a n d l i n g
sub % g 1 , 1 2 8 , % g 1 ! d e t r a c t f r o m l e n g t h
addx % g 0 , % g 7 , % g 7 ! a d d i n l a s t c a r r y b i t
andcc % g 1 , 0 x f f f f f f80 , % g 0 ! m o r e t o c s u m ?
add % o 0 , 1 2 8 , % o 0 ! a d v a n c e s r c p t r
bne c c d b l ! w e d i d n o t g o n e g a t i v e , c o n t i n u e l o o p i n g
add % o 1 , 1 2 8 , % o 1 ! a d v a n c e d e s t p t r
b c c m e r g e ! f i n i s h i t o f f , a b o v e
andcc % g 1 , 0 x70 , % o 2 ! c a n u s e t a b l e ? ( c l e a r s c a r r y b t w )
ccslow : cmp % g 1 , 0
mov 0 , % g 5
bleu 4 f
andcc % o 0 , 1 , % o 5
be,a 1 f
srl % g 1 , 1 , % g 4
sub % g 1 , 1 , % g 1
EX( l d u b [ % o 0 ] , % g 5 , a d d % g 1 , 1 )
add % o 0 , 1 , % o 0
EX2 ( s t b % g 5 , [ % o 1 ] )
srl % g 1 , 1 , % g 4
add % o 1 , 1 , % o 1
1 : cmp % g 4 , 0
be,a 3 f
andcc % g 1 , 1 , % g 0
andcc % o 0 , 2 , % g 0
be,a 1 f
srl % g 4 , 1 , % g 4
EX( l d u h [ % o 0 ] , % o 4 , a d d % g 1 , 0 )
sub % g 1 , 2 , % g 1
srl % o 4 , 8 , % g 2
sub % g 4 , 1 , % g 4
EX2 ( s t b % g 2 , [ % o 1 ] )
add % o 4 , % g 5 , % g 5
EX2 ( s t b % o 4 , [ % o 1 + 1 ] )
add % o 0 , 2 , % o 0
srl % g 4 , 1 , % g 4
add % o 1 , 2 , % o 1
1 : cmp % g 4 , 0
be,a 2 f
andcc % g 1 , 2 , % g 0
EX3 ( l d [ % o 0 ] , % o 4 )
5 : srl % o 4 , 2 4 , % g 2
srl % o 4 , 1 6 , % g 3
EX2 ( s t b % g 2 , [ % o 1 ] )
srl % o 4 , 8 , % g 2
EX2 ( s t b % g 3 , [ % o 1 + 1 ] )
add % o 0 , 4 , % o 0
EX2 ( s t b % g 2 , [ % o 1 + 2 ] )
addcc % o 4 , % g 5 , % g 5
EX2 ( s t b % o 4 , [ % o 1 + 3 ] )
addx % g 5 , % g 0 , % g 5 ! I a m n o w t o l a z y t o o p t i m i z e t h i s ( q u e s t i o n i t
add % o 1 , 4 , % o 1 ! i s w o r t h y ) . M a y b e s o m e d a y - w i t h t h e s l l / s r l
subcc % g 4 , 1 , % g 4 ! t r i c k s
bne,a 5 b
EX3 ( l d [ % o 0 ] , % o 4 )
sll % g 5 , 1 6 , % g 2
srl % g 5 , 1 6 , % g 5
srl % g 2 , 1 6 , % g 2
andcc % g 1 , 2 , % g 0
add % g 2 , % g 5 , % g 5
2 : be,a 3 f
andcc % g 1 , 1 , % g 0
EX( l d u h [ % o 0 ] , % o 4 , a n d % g 1 , 3 )
andcc % g 1 , 1 , % g 0
srl % o 4 , 8 , % g 2
add % o 0 , 2 , % o 0
EX2 ( s t b % g 2 , [ % o 1 ] )
add % g 5 , % o 4 , % g 5
EX2 ( s t b % o 4 , [ % o 1 + 1 ] )
add % o 1 , 2 , % o 1
3 : be,a 1 f
sll % g 5 , 1 6 , % o 4
EX( l d u b [ % o 0 ] , % g 2 , a d d % g 0 , 1 )
sll % g 2 , 8 , % o 4
EX2 ( s t b % g 2 , [ % o 1 ] )
add % g 5 , % o 4 , % g 5
sll % g 5 , 1 6 , % o 4
1 : addcc % o 4 , % g 5 , % g 5
srl % g 5 , 1 6 , % o 4
addx % g 0 , % o 4 , % g 5
orcc % o 5 , % g 0 , % g 0
be 4 f
srl % g 5 , 8 , % o 4
and % g 5 , 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 5
4 : addcc % g 7 , % g 5 , % g 7
retl
addx % g 0 , % g 7 , % o 0
__csum_partial_copy_end :
/ * We d o t h e s e s t r a n g e c a l c u l a t i o n s f o r t h e c s u m _ * _ f r o m _ u s e r c a s e o n l y , i e .
* we o n l y b o t h e r w i t h f a u l t s o n l o a d s . . . * /
/ * o2 = ( ( g 2 % 2 0 ) & 3 ) * 8
* o3 = g 1 - ( g 2 / 2 0 ) * 3 2 - o 2 * /
20 :
cmp % g 2 , 2 0
blu,a 1 f
and % g 2 , 3 , % o 2
sub % g 1 , 3 2 , % g 1
b 2 0 b
sub % g 2 , 2 0 , % g 2
1 :
sll % o 2 , 3 , % o 2
b 3 1 f
sub % g 1 , % o 2 , % o 3
/ * o2 = ( ! ( g 2 & 1 5 ) ? 0 : ( ( ( g 2 & 1 5 ) + 1 ) & ~ 1 ) * 8 )
* o3 = g 1 - ( g 2 / 1 6 ) * 3 2 - o 2 * /
21 :
andcc % g 2 , 1 5 , % o 3
srl % g 2 , 4 , % g 2
be,a 1 f
clr % o 2
add % o 3 , 1 , % o 3
and % o 3 , 1 4 , % o 3
sll % o 3 , 3 , % o 2
1 :
sll % g 2 , 5 , % g 2
sub % g 1 , % g 2 , % o 3
b 3 1 f
sub % o 3 , % o 2 , % o 3
/ * o0 + = ( g 2 / 1 0 ) * 1 6 - 0 x70
* 0 1 + = ( g2 / 1 0 ) * 1 6 - 0 x70
* o2 = ( g 2 % 1 0 ) ? 8 : 0
* o3 + = 0 x70 - ( g 2 / 1 0 ) * 1 6 - o 2 * /
22 :
cmp % g 2 , 1 0
blu,a 1 f
sub % o 0 , 0 x70 , % o 0
add % o 0 , 1 6 , % o 0
add % o 1 , 1 6 , % o 1
sub % o 3 , 1 6 , % o 3
b 2 2 b
sub % g 2 , 1 0 , % g 2
1 :
sub % o 1 , 0 x70 , % o 1
add % o 3 , 0 x70 , % o 3
clr % o 2
tst % g 2
bne,a 1 f
mov 8 , % o 2
1 :
b 3 1 f
sub % o 3 , % o 2 , % o 3
96 :
and % g 1 , 3 , % g 1
sll % g 4 , 2 , % g 4
add % g 1 , % g 4 , % o 3
30 :
/ * % o1 i s d s t
* % o3 i s # b y t e s t o z e r o o u t
* % o4 i s f a u l t i n g a d d r e s s
* % o5 i s % p c w h e r e f a u l t o c c u r r e d * /
clr % o 2
31 :
/ * % o0 i s s r c
* % o1 i s d s t
* % o2 i s # o f b y t e s t o c o p y f r o m s r c t o d s t
* % o3 i s # b y t e s t o z e r o o u t
* % o4 i s f a u l t i n g a d d r e s s
* % o5 i s % p c w h e r e f a u l t o c c u r r e d * /
save % s p , - 1 0 4 , % s p
mov % i 5 , % o 0
mov % i 7 , % o 1
mov % i 4 , % o 2
call l o o k u p _ f a u l t
mov % g 7 , % i 4
cmp % o 0 , 2
bne 1 f
add % g 0 , - E F A U L T , % i 5
tst % i 2
be 2 f
mov % i 0 , % o 1
mov % i 1 , % o 0
5 :
2009-12-11 10:32:10 +03:00
call m e m c p y
2005-04-17 02:20:36 +04:00
mov % i 2 , % o 2
tst % o 0
bne,a 2 f
add % i 3 , % i 2 , % i 3
add % i 1 , % i 2 , % i 1
2 :
mov % i 1 , % o 0
6 :
call _ _ b z e r o
mov % i 3 , % o 1
1 :
ld [ % s p + 1 6 8 ] , % o 2 ! s t r u c t _ p t r o f p a r e n t
st % i 5 , [ % o 2 ]
ret
restore
.section _ _ ex_ t a b l e ,#a l l o c
.align 4
.word 5 b,2
.word 6 b,2