2005-04-17 02:20:36 +04:00
/ * $ Id : udiv. S ,v 1 . 4 1 9 9 6 / 0 9 / 3 0 0 2 : 2 2 : 3 8 d a v e m E x p $
* udiv. S : T h i s r o u t i n e w a s t a k e n f r o m g l i b c - 1 . 0 9 a n d i s c o v e r e d
* by t h e G N U L i b r a r y G e n e r a l P u b l i c L i c e n s e V e r s i o n 2 .
* /
/* This file is generated from divrem.m4; DO NOT EDIT! */
/ *
* Division a n d r e m a i n d e r , f r o m A p p e n d i x E o f t h e S p a r c V e r s i o n 8
* Architecture M a n u a l , w i t h f i x e s f r o m G o r d o n I r l a m .
* /
/ *
* Input : dividend a n d d i v i s o r i n % o 0 a n d % o 1 r e s p e c t i v e l y .
*
* m4 p a r a m e t e r s :
* .udiv name of f u n c t i o n t o g e n e r a t e
* div d i v =div = > % o 0 / % o 1 ; div=rem => %o0 % %o1
* false f a l s e =true = > s i g n e d ; false=false => unsigned
*
* Algorithm p a r a m e t e r s :
* N h o w m a n y b i t s p e r i t e r a t i o n w e t r y t o g e t ( 4 )
* WORDSIZE t o t a l n u m b e r o f b i t s ( 3 2 )
*
* Derived c o n s t a n t s :
* TOPBITS n u m b e r o f b i t s i n t h e t o p d e c a d e o f a n u m b e r
*
* Important v a r i a b l e s :
* Q t h e p a r t i a l q u o t i e n t u n d e r d e v e l o p m e n t ( i n i t i a l l y 0 )
* R t h e r e m a i n d e r s o f a r , i n i t i a l l y t h e d i v i d e n d
* ITER n u m b e r o f m a i n d i v i s i o n l o o p i t e r a t i o n s r e q u i r e d ;
* equal t o c e i l ( l o g 2 ( q u o t i e n t ) / N ) . N o t e t h a t t h i s
* is t h e l o g b a s e ( 2 ^ N ) o f t h e q u o t i e n t .
* V t h e c u r r e n t c o m p a r a n d , i n i t i a l l y d i v i s o r * 2 ^ ( I T E R * N - 1 )
*
* Cost :
* Current e s t i m a t e f o r n o n - l a r g e d i v i d e n d i s
* ceil( l o g 2 ( q u o t i e n t ) / N ) * ( 1 0 + 7 N / 2 ) + C
* A l a r g e d i v i d e n d i s o n e g r e a t e r t h a n 2 ^ ( 3 1 - T O P B I T S ) a n d t a k e s a
* different p a t h , a s t h e u p p e r b i t s o f t h e q u o t i e n t m u s t b e d e v e l o p e d
* one b i t a t a t i m e .
* /
.globl .udiv
2005-09-12 07:14:07 +04:00
.globl _Udiv
2005-04-17 02:20:36 +04:00
.udiv :
2005-09-12 07:14:07 +04:00
_Udiv : /* needed for export */
2005-04-17 02:20:36 +04:00
! Ready t o d i v i d e . C o m p u t e s i z e o f q u o t i e n t ; scale comparand.
orcc % o 1 , % g 0 , % o 5
bne 1 f
mov % o 0 , % o 3
! Divide b y z e r o t r a p . I f i t r e t u r n s , r e t u r n 0 ( a b o u t a s
! wrong a s p o s s i b l e , b u t t h a t i s w h a t S u n O S d o e s . . . ) .
ta S T _ D I V 0
retl
clr % o 0
1 :
cmp % o 3 , % o 5 ! i f % o 1 e x c e e d s % o 0 , d o n e
blu L g o t _ r e s u l t ! ( a n d a l g o r i t h m f a i l s o t h e r w i s e )
clr % o 2
sethi % h i ( 1 < < ( 3 2 - 4 - 1 ) ) , % g 1
cmp % o 3 , % g 1
blu L n o t _ r e a l l y _ b i g
clr % o 4
! Here t h e d i v i d e n d i s > = 2 * * ( 3 1 - N ) o r s o . W e m u s t b e c a r e f u l h e r e ,
! as o u r u s u a l N - a t - a - s h o t d i v i d e s t e p w i l l c a u s e o v e r f l o w a n d h a v o c .
! The n u m b e r o f b i t s i n t h e r e s u l t h e r e i s N * I T E R + S C , w h e r e S C < = N .
! Compute I T E R i n a n u n o r t h o d o x m a n n e r : k n o w w e n e e d t o s h i f t V i n t o
! the t o p d e c a d e : s o d o n o t e v e n b o t h e r t o c o m p a r e t o R .
1 :
cmp % o 5 , % g 1
bgeu 3 f
mov 1 , % g 7
sll % o 5 , 4 , % o 5
b 1 b
add % o 4 , 1 , % o 4
! Now c o m p u t e % g 7 .
2 :
addcc % o 5 , % o 5 , % o 5
bcc L n o t _ t o o _ b i g
add % g 7 , 1 , % g 7
! We g e t h e r e i f t h e % o 1 o v e r f l o w e d w h i l e s h i f t i n g .
! This m e a n s t h a t % o 3 h a s t h e h i g h - o r d e r b i t s e t .
! Restore % o 5 a n d s u b t r a c t f r o m % o 3 .
sll % g 1 , 4 , % g 1 ! h i g h o r d e r b i t
srl % o 5 , 1 , % o 5 ! r e s t o f % o 5
add % o 5 , % g 1 , % o 5
b L d o _ s i n g l e _ d i v
sub % g 7 , 1 , % g 7
Lnot_too_big :
3 :
cmp % o 5 , % o 3
blu 2 b
nop
be L d o _ s i n g l e _ d i v
nop
/* NB: these are commented out in the V8-Sparc manual as well */
/* (I do not understand this) */
! % o5 > % o 3 : w e n t t o o f a r : b a c k u p 1 s t e p
! srl % o 5 , 1 , % o 5
! dec % g 7
! do s i n g l e - b i t d i v i d e s t e p s
!
! We h a v e t o b e c a r e f u l h e r e . W e k n o w t h a t % o 3 > = % o 5 , s o w e c a n d o t h e
! first d i v i d e s t e p w i t h o u t t h i n k i n g . B U T , t h e o t h e r s a r e c o n d i t i o n a l ,
! and a r e o n l y d o n e i f % o 3 > = 0 . B e c a u s e b o t h % o 3 a n d % o 5 m a y h a v e t h e h i g h -
! order b i t s e t i n t h e f i r s t s t e p , j u s t f a l l i n g i n t o t h e r e g u l a r
! division l o o p w i l l m e s s u p t h e f i r s t t i m e a r o u n d .
! So w e u n r o l l s l i g h t l y . . .
Ldo_single_div :
subcc % g 7 , 1 , % g 7
bl L e n d _ r e g u l a r _ d i v i d e
nop
sub % o 3 , % o 5 , % o 3
mov 1 , % o 2
b L e n d _ s i n g l e _ d i v l o o p
nop
Lsingle_divloop :
sll % o 2 , 1 , % o 2
bl 1 f
srl % o 5 , 1 , % o 5
! % o3 > = 0
sub % o 3 , % o 5 , % o 3
b 2 f
add % o 2 , 1 , % o 2
1 : ! % o3 < 0
add % o 3 , % o 5 , % o 3
sub % o 2 , 1 , % o 2
2 :
Lend_single_divloop :
subcc % g 7 , 1 , % g 7
bge L s i n g l e _ d i v l o o p
tst % o 3
b,a L e n d _ r e g u l a r _ d i v i d e
Lnot_really_big :
1 :
sll % o 5 , 4 , % o 5
cmp % o 5 , % o 3
bleu 1 b
addcc % o 4 , 1 , % o 4
be L g o t _ r e s u l t
sub % o 4 , 1 , % o 4
tst % o 3 ! s e t u p f o r i n i t i a l i t e r a t i o n
Ldivloop :
sll % o 2 , 4 , % o 2
! depth 1 , a c c u m u l a t e d b i t s 0
bl L . 1 . 1 6
srl % o 5 ,1 ,% o 5
! remainder i s p o s i t i v e
subcc % o 3 ,% o 5 ,% o 3
! depth 2 , a c c u m u l a t e d b i t s 1
bl L . 2 . 1 7
srl % o 5 ,1 ,% o 5
! remainder i s p o s i t i v e
subcc % o 3 ,% o 5 ,% o 3
! depth 3 , a c c u m u l a t e d b i t s 3
bl L . 3 . 1 9
srl % o 5 ,1 ,% o 5
! remainder i s p o s i t i v e
subcc % o 3 ,% o 5 ,% o 3
! depth 4 , a c c u m u l a t e d b i t s 7
bl L . 4 . 2 3
srl % o 5 ,1 ,% o 5
! remainder i s p o s i t i v e
subcc % o 3 ,% o 5 ,% o 3
b 9 f
add % o 2 , ( 7 * 2 + 1 ) , % o 2
L. 4 . 2 3 :
! remainder i s n e g a t i v e
addcc % o 3 ,% o 5 ,% o 3
b 9 f
add % o 2 , ( 7 * 2 - 1 ) , % o 2
L. 3 . 1 9 :
! remainder i s n e g a t i v e
addcc % o 3 ,% o 5 ,% o 3
! depth 4 , a c c u m u l a t e d b i t s 5
bl L . 4 . 2 1
srl % o 5 ,1 ,% o 5
! remainder i s p o s i t i v e
subcc % o 3 ,% o 5 ,% o 3
b 9 f
add % o 2 , ( 5 * 2 + 1 ) , % o 2
L. 4 . 2 1 :
! remainder i s n e g a t i v e
addcc % o 3 ,% o 5 ,% o 3
b 9 f
add % o 2 , ( 5 * 2 - 1 ) , % o 2
L. 2 . 1 7 :
! remainder i s n e g a t i v e
addcc % o 3 ,% o 5 ,% o 3
! depth 3 , a c c u m u l a t e d b i t s 1
bl L . 3 . 1 7
srl % o 5 ,1 ,% o 5
! remainder i s p o s i t i v e
subcc % o 3 ,% o 5 ,% o 3
! depth 4 , a c c u m u l a t e d b i t s 3
bl L . 4 . 1 9
srl % o 5 ,1 ,% o 5
! remainder i s p o s i t i v e
subcc % o 3 ,% o 5 ,% o 3
b 9 f
add % o 2 , ( 3 * 2 + 1 ) , % o 2
L. 4 . 1 9 :
! remainder i s n e g a t i v e
addcc % o 3 ,% o 5 ,% o 3
b 9 f
add % o 2 , ( 3 * 2 - 1 ) , % o 2
L. 3 . 1 7 :
! remainder i s n e g a t i v e
addcc % o 3 ,% o 5 ,% o 3
! depth 4 , a c c u m u l a t e d b i t s 1
bl L . 4 . 1 7
srl % o 5 ,1 ,% o 5
! remainder i s p o s i t i v e
subcc % o 3 ,% o 5 ,% o 3
b 9 f
add % o 2 , ( 1 * 2 + 1 ) , % o 2
L. 4 . 1 7 :
! remainder i s n e g a t i v e
addcc % o 3 ,% o 5 ,% o 3
b 9 f
add % o 2 , ( 1 * 2 - 1 ) , % o 2
L. 1 . 1 6 :
! remainder i s n e g a t i v e
addcc % o 3 ,% o 5 ,% o 3
! depth 2 , a c c u m u l a t e d b i t s - 1
bl L . 2 . 1 5
srl % o 5 ,1 ,% o 5
! remainder i s p o s i t i v e
subcc % o 3 ,% o 5 ,% o 3
! depth 3 , a c c u m u l a t e d b i t s - 1
bl L . 3 . 1 5
srl % o 5 ,1 ,% o 5
! remainder i s p o s i t i v e
subcc % o 3 ,% o 5 ,% o 3
! depth 4 , a c c u m u l a t e d b i t s - 1
bl L . 4 . 1 5
srl % o 5 ,1 ,% o 5
! remainder i s p o s i t i v e
subcc % o 3 ,% o 5 ,% o 3
b 9 f
add % o 2 , ( - 1 * 2 + 1 ) , % o 2
L. 4 . 1 5 :
! remainder i s n e g a t i v e
addcc % o 3 ,% o 5 ,% o 3
b 9 f
add % o 2 , ( - 1 * 2 - 1 ) , % o 2
L. 3 . 1 5 :
! remainder i s n e g a t i v e
addcc % o 3 ,% o 5 ,% o 3
! depth 4 , a c c u m u l a t e d b i t s - 3
bl L . 4 . 1 3
srl % o 5 ,1 ,% o 5
! remainder i s p o s i t i v e
subcc % o 3 ,% o 5 ,% o 3
b 9 f
add % o 2 , ( - 3 * 2 + 1 ) , % o 2
L. 4 . 1 3 :
! remainder i s n e g a t i v e
addcc % o 3 ,% o 5 ,% o 3
b 9 f
add % o 2 , ( - 3 * 2 - 1 ) , % o 2
L. 2 . 1 5 :
! remainder i s n e g a t i v e
addcc % o 3 ,% o 5 ,% o 3
! depth 3 , a c c u m u l a t e d b i t s - 3
bl L . 3 . 1 3
srl % o 5 ,1 ,% o 5
! remainder i s p o s i t i v e
subcc % o 3 ,% o 5 ,% o 3
! depth 4 , a c c u m u l a t e d b i t s - 5
bl L . 4 . 1 1
srl % o 5 ,1 ,% o 5
! remainder i s p o s i t i v e
subcc % o 3 ,% o 5 ,% o 3
b 9 f
add % o 2 , ( - 5 * 2 + 1 ) , % o 2
L. 4 . 1 1 :
! remainder i s n e g a t i v e
addcc % o 3 ,% o 5 ,% o 3
b 9 f
add % o 2 , ( - 5 * 2 - 1 ) , % o 2
L. 3 . 1 3 :
! remainder i s n e g a t i v e
addcc % o 3 ,% o 5 ,% o 3
! depth 4 , a c c u m u l a t e d b i t s - 7
bl L . 4 . 9
srl % o 5 ,1 ,% o 5
! remainder i s p o s i t i v e
subcc % o 3 ,% o 5 ,% o 3
b 9 f
add % o 2 , ( - 7 * 2 + 1 ) , % o 2
L. 4 . 9 :
! remainder i s n e g a t i v e
addcc % o 3 ,% o 5 ,% o 3
b 9 f
add % o 2 , ( - 7 * 2 - 1 ) , % o 2
9 :
Lend_regular_divide :
subcc % o 4 , 1 , % o 4
bge L d i v l o o p
tst % o 3
bl,a L g o t _ r e s u l t
! non- r e s t o r i n g f i x u p h e r e ( o n e i n s t r u c t i o n o n l y ! )
sub % o 2 , 1 , % o 2
Lgot_result :
retl
mov % o 2 , % o 0
.globl .udiv_patch
.udiv_patch :
wr % g 0 , 0 x0 , % y
nop
nop
retl
udiv % o 0 , % o 1 , % o 0
nop