2007-02-05 21:18:31 +01:00
# S/ 3 9 0 _ _ u d i v _ q r n n d
2011-07-24 10:48:19 +02:00
# include < l i n u x / l i n k a g e . h >
2007-02-05 21:18:31 +01:00
# r2 : & _ _ r
# r3 : u p p e r h a l f o f 6 4 b i t w o r d n
# r4 : l o w e r h a l f o f 6 4 b i t w o r d n
# r5 : d i v i s o r d
# the r e m i n d e r r o f t h e d i v i s i o n i s t o b e s t o r e d t o & _ _ r a n d
# the q u o t i e n t q i s t o b e r e t u r n e d
.text
2011-07-24 10:48:19 +02:00
ENTRY( _ _ u d i v _ q r n n d )
2007-02-05 21:18:31 +01:00
st % r2 ,2 4 ( % r15 ) # s t o r e p o i n t e r t o r e m i n d e r f o r l a t e r
lr % r0 ,% r3 # r e l o a d n
lr % r1 ,% r4
ltr % r2 ,% r5 # r e l o a d a n d t e s t d i v i s o r
jp 5 f
# divisor > = 0 x80 0 0 0 0 0 0
srdl % r0 ,2 # n / 4
srl % r2 ,1 # d / 2
slr % r1 ,% r2 # s p e c i a l c a s e i f l a s t b i t o f d i s s e t
brc 3 ,0 f # ( n / 4 ) d i v ( n / 2 ) c a n o v e r f l o w b y 1
ahi % r0 ,- 1 # t r i c k : s u b t r a c t n / 2 , t h e n d i v i d e
0 : dr % r0 ,% r2 # s i g n e d d i v i s i o n
ahi % r1 ,1 # t r i c k p a r t 2 : a d d 1 t o t h e q u o t i e n t
# now ( n > > 2 ) = ( d > > 1 ) * % r1 + % r0
lhi % r3 ,1
nr % r3 ,% r1 # t e s t l a s t b i t o f q
jz 1 f
alr % r0 ,% r2 # a d d ( d > > 1 ) t o r
1 : srl % r1 ,1 # q > > = 1
# now ( n > > 2 ) = ( d & - 2 ) * % r1 + % r0
lhi % r3 ,1
nr % r3 ,% r5 # t e s t l a s t b i t o f d
jz 2 f
slr % r0 ,% r1 # r - = q
brc 3 ,2 f # b o r r o w ?
alr % r0 ,% r5 # r + = d
ahi % r1 ,- 1
2 : # now ( n > > 2 ) = d * % r1 + % r0
alr % r1 ,% r1 # q < < = 1
alr % r0 ,% r0 # r < < = 1
brc 1 2 ,3 f # o v e r f l o w o n r ?
slr % r0 ,% r5 # r - = d
ahi % r1 ,1 # q + = 1
3 : lhi % r3 ,2
nr % r3 ,% r4 # t e s t n e x t t o l a s t b i t o f n
jz 4 f
ahi % r0 ,1 # r + = 1
4 : clr % r0 ,% r5 # r > = d ?
jl 6 f
slr % r0 ,% r5 # r - = d
ahi % r1 ,1 # q + = 1
# now ( n > > 1 ) = d * % r1 + % r0
j 6 f
5 : # divisor < 0 x80 0 0 0 0 0 0
srdl % r0 ,1
dr % r0 ,% r2 # s i g n e d d i v i s i o n
# now ( n > > 1 ) = d * % r1 + % r0
6 : alr % r1 ,% r1 # q < < = 1
alr % r0 ,% r0 # r < < = 1
brc 1 2 ,7 f # o v e r f l o w o n r ?
slr % r0 ,% r5 # r - = d
ahi % r1 ,1 # q + = 1
7 : lhi % r3 ,1
nr % r3 ,% r4 # i s o l a t e l a s t b i t o f n
alr % r0 ,% r3 # r + = ( n & 1 )
clr % r0 ,% r5 # r > = d ?
jl 8 f
slr % r0 ,% r5 # r - = d
ahi % r1 ,1 # q + = 1
8 : # now n = d * % r1 + % r0
l % r2 ,2 4 ( % r15 )
st % r0 ,0 ( % r2 )
lr % r2 ,% r1
br % r14
.end __udiv_qrnnd