2005-04-16 15:20:36 -07:00
|
| decbin. s a 3 . 3 1 2 / 1 9 / 9 0
|
| Description : Converts n o r m a l i z e d p a c k e d b c d v a l u e p o i n t e d t o b y
| register A 6 t o e x t e n d e d - p r e c i s i o n v a l u e i n F P 0 .
|
| Input : Normalized p a c k e d b c d v a l u e i n E T E M P ( a6 ) .
|
| Output : Exact f l o a t i n g - p o i n t r e p r e s e n t a t i o n o f t h e p a c k e d b c d v a l u e .
|
| Saves a n d M o d i f i e s : D 2 - D 5
|
| Speed : The p r o g r a m d e c b i n t a k e s ? ? ? c y c l e s t o e x e c u t e .
|
| Object S i z e :
|
| External R e f e r e n c e ( s ) : N o n e .
|
| Algorithm :
| Expected i s a n o r m a l b c d ( i . e . n o n - e x c e p t i o n a l ; all inf, zero,
| and N a N o p e r a n d s a r e d i s p a t c h e d w i t h o u t e n t e r i n g t h i s r o u t i n e )
| value i n 6 8 8 8 1 / 8 8 2 f o r m a t a t l o c a t i o n E T E M P ( A 6 ) .
|
| A1 . C o n v e r t t h e b c d e x p o n e n t t o b i n a r y b y s u c c e s s i v e a d d s a n d m u l s .
| Set t h e s i g n a c c o r d i n g t o S E . S u b t r a c t 1 6 t o c o m p e n s a t e
| for t h e m a n t i s s a w h i c h i s t o b e i n t e r p r e t e d a s 1 7 i n t e g e r
| digits, r a t h e r t h a n 1 i n t e g e r a n d 1 6 f r a c t i o n d i g i t s .
| Note : this o p e r a t i o n c a n n e v e r o v e r f l o w .
|
| A2 . C o n v e r t t h e b c d m a n t i s s a t o b i n a r y b y s u c c e s s i v e
| adds a n d m u l s i n F P 0 . S e t t h e s i g n a c c o r d i n g t o S M .
| The m a n t i s s a d i g i t s w i l l b e c o n v e r t e d w i t h t h e d e c i m a l p o i n t
| assumed f o l l o w i n g t h e l e a s t - s i g n i f i c a n t d i g i t .
| Note : this o p e r a t i o n c a n n e v e r o v e r f l o w .
|
| A3 . C o u n t t h e n u m b e r o f l e a d i n g / t r a i l i n g z e r o s i n t h e
| bcd s t r i n g . I f S E i s p o s i t i v e , c o u n t t h e l e a d i n g z e r o s ;
| if n e g a t i v e , c o u n t t h e t r a i l i n g z e r o s . S e t t h e a d j u s t e d
| exponent e q u a l t o t h e e x p o n e n t f r o m A 1 a n d t h e z e r o c o u n t
| added i f S M = 1 a n d s u b t r a c t e d i f S M = 0 . S c a l e t h e
| mantissa t h e e q u i v a l e n t o f f o r c i n g i n t h e b c d v a l u e :
|
| SM = 0 a n o n - z e r o d i g i t i n t h e i n t e g e r p o s i t i o n
| SM = 1 a n o n - z e r o d i g i t i n M a n t 0 , l s d o f t h e f r a c t i o n
|
| this w i l l i n s u r e t h a t a n y v a l u e , r e g a r d l e s s o f i t s
| representation ( e x . 0 . 1 E 2 , 1 E 1 , 1 0 E 0 , 1 0 0 E - 1 ) , i s c o n v e r t e d
| consistently.
|
| A4 . C a l c u l a t e t h e f a c t o r 1 0 ^ e x p i n F P 1 u s i n g a t a b l e o f
| 1 0 ^ ( 2 ^ n) v a l u e s . T o r e d u c e t h e e r r o r i n f o r m i n g f a c t o r s
| greater t h a n 1 0 ^ 2 7 , a d i r e c t e d r o u n d i n g s c h e m e i s u s e d w i t h
| tables r o u n d e d t o R N , R M , a n d R P , a c c o r d i n g t o t h e t a b l e
| in t h e c o m m e n t s o f t h e p w r t e n s e c t i o n .
|
| A5 . F o r m t h e f i n a l b i n a r y n u m b e r b y s c a l i n g t h e m a n t i s s a b y
| the e x p o n e n t f a c t o r . T h i s i s d o n e b y m u l t i p l y i n g t h e
| mantissa i n F P 0 b y t h e f a c t o r i n F P 1 i f t h e a d j u s t e d
| exponent s i g n i s p o s i t i v e , a n d d i v i d i n g F P 0 b y F P 1 i f
| it i s n e g a t i v e .
|
| Clean u p a n d r e t u r n . C h e c k i f t h e f i n a l m u l o r d i v r e s u l t e d
| in a n i n e x2 e x c e p t i o n . I f s o , s e t i n e x1 i n t h e f p s r a n d
| check i f t h e i n e x1 e x c e p t i o n i s e n a b l e d . I f s o , s e t d7 u p p e r
| word t o $ 0 1 0 0 . T h i s w i l l s i g n a l u n i m p . s a t h a t a n e n a b l e d i n e x1
| exception o c c u r r e d . U n i m p w i l l f i x t h e s t a c k .
|
| Copyright ( C ) M o t o r o l a , I n c . 1 9 9 0
| All R i g h t s R e s e r v e d
|
2006-02-11 17:55:48 -08:00
| For d e t a i l s o n t h e l i c e n s e f o r t h i s f i l e , p l e a s e s e e t h e
| file, R E A D M E , i n t h i s s a m e d i r e c t o r y .
2005-04-16 15:20:36 -07:00
| DECBIN i d n t 2 ,1 | M o t o r o l a 0 4 0 F l o a t i n g P o i n t S o f t w a r e P a c k a g e
| section 8
# include " f p s p . h "
|
| PTENRN, P T E N R M , a n d P T E N R P a r e a r r a y s o f p o w e r s o f 1 0 r o u n d e d
| to n e a r e s t , m i n u s , a n d p l u s , r e s p e c t i v e l y . T h e t a b l e s i n c l u d e
| 1 0 * * { 1 , 2 , 4 , 8 , 1 6 , 3 2 , 6 4 , 1 2 8 , 2 5 6 , 5 1 2 , 1 0 2 4 , 2 0 4 8 , 4 0 9 6 } . No r o u n d i n g
| is r e q u i r e d u n t i l t h e p o w e r i s g r e a t e r t h a n 2 7 , h o w e v e r , a l l
| tables i n c l u d e t h e f i r s t 5 f o r e a s e o f i n d e x i n g .
|
| xref P T E N R N
| xref P T E N R M
| xref P T E N R P
RTABLE : .byte 0 , 0 , 0 , 0
.byte 2 , 3 , 2 , 3
.byte 2 , 3 , 3 , 2
.byte 3 , 2 , 2 , 3
.global decbin
.global calc_e
.global pwrten
.global calc_m
.global norm
.global ap_st_z
.global ap_st_n
|
.set FNIBS,7
.set FSTRT,0
|
.set ESTRT,4
.set EDIGITS,2 |
|
| Constants i n s i n g l e p r e c i s i o n
FZERO : .long 0x00000000
FONE : .long 0x3F800000
FTEN : .long 0x41200000
.set TEN,1 0
|
decbin :
| fmovel #0 ,F P C R ;clr real fpcr
moveml % d2 - % d5 ,- ( % a7 )
|
| Calculate e x p o n e n t :
| 1 . Copy b c d v a l u e i n m e m o r y f o r u s e a s a w o r k i n g c o p y .
| 2 . Calculate a b s o l u t e v a l u e o f e x p o n e n t i n d1 b y m u l a n d a d d .
| 3 . Correct f o r e x p o n e n t s i g n .
| 4 . Subtract 1 6 t o c o m p e n s a t e f o r i n t e r p r e t i n g t h e m a n t a s a l l i n t e g e r d i g i t s .
| ( i. e . , a l l d i g i t s a s s u m e d l e f t o f t h e d e c i m a l p o i n t . )
|
| Register u s a g e :
|
| calc_e :
| ( * ) d0 : temp d i g i t s t o r a g e
| ( * ) d1 : accumulator f o r b i n a r y e x p o n e n t
| ( * ) d2 : digit c o u n t
| ( * ) d3 : offset p o i n t e r
| ( ) d4 : first w o r d o f b c d
| ( ) a0 : pointer t o w o r k i n g b c d v a l u e
| ( ) a6 : pointer t o o r i g i n a l b c d v a l u e
| ( * ) FP_SCR1 : working c o p y o f o r i g i n a l b c d v a l u e
| ( * ) L_SCR1 : copy o f o r i g i n a l e x p o n e n t w o r d
|
calc_e :
movel #E D I G I T S , % d 2 | # o f n i b b l e s ( d i g i t s ) i n f r a c t i o n p a r t
moveql #E S T R T , % d 3 | c o u n t e r t o p i c k u p d i g i t s
leal F P _ S C R 1 ( % a6 ) ,% a0 | l o a d t m p b c d s t o r a g e a d d r e s s
movel E T E M P ( % a6 ) ,( % a0 ) | s a v e i n p u t b c d v a l u e
movel E T E M P _ H I ( % a6 ) ,4 ( % a0 ) | s a v e w o r d s 2 a n d 3
movel E T E M P _ L O ( % a6 ) ,8 ( % a0 ) | a n d w o r k w i t h t h e s e
movel ( % a0 ) ,% d4 | g e t f i r s t w o r d o f b c d
clrl % d1 | z e r o d1 f o r a c c u m u l a t o r
e_gd :
mulul #T E N , % d 1 | m u l p a r t i a l p r o d u c t b y o n e d i g i t p l a c e
bfextu % d4 { % d3 : #4 } ,% d0 | g e t t h e d i g i t a n d z e r o e x t e n d i n t o d0
addl % d0 ,% d1 | d1 = d1 + d0
addqb #4 ,% d3 | a d v a n c e d3 t o t h e n e x t d i g i t
dbf % d2 ,e _ g d | i f w e h a v e u s e d a l l 3 d i g i t s , e x i t l o o p
btst #30 ,% d4 | g e t S E
beqs e _ p o s | d o n ' t n e g a t e i f p o s
negl % d1 | n e g a t e b e f o r e s u b t r a c t i n g
e_pos :
subl #16 ,% d1 | s u b t o c o m p e n s a t e f o r s h i f t o f m a n t
bges e _ s a v e | i f s t i l l p o s , d o n o t n e g
negl % d1 | n o w n e g a t i v e , m a k e p o s a n d s e t S E
orl #0x40000000 ,% d4 | s e t S E i n d4 ,
orl #0x40000000 ,( % a0 ) | a n d i n w o r k i n g b c d
e_save :
movel % d1 ,L _ S C R 1 ( % a6 ) | s a v e e x p i n m e m o r y
|
|
| Calculate m a n t i s s a :
| 1 . Calculate a b s o l u t e v a l u e o f m a n t i s s a i n f p0 b y m u l a n d a d d .
| 2 . Correct f o r m a n t i s s a s i g n .
| ( i. e . , a l l d i g i t s a s s u m e d l e f t o f t h e d e c i m a l p o i n t . )
|
| Register u s a g e :
|
| calc_m :
| ( * ) d0 : temp d i g i t s t o r a g e
| ( * ) d1 : lword c o u n t e r
| ( * ) d2 : digit c o u n t
| ( * ) d3 : offset p o i n t e r
| ( ) d4 : words 2 a n d 3 o f b c d
| ( ) a0 : pointer t o w o r k i n g b c d v a l u e
| ( ) a6 : pointer t o o r i g i n a l b c d v a l u e
| ( * ) fp0 : mantissa a c c u m u l a t o r
| ( ) FP_SCR1 : working c o p y o f o r i g i n a l b c d v a l u e
| ( ) L_SCR1 : copy o f o r i g i n a l e x p o n e n t w o r d
|
calc_m :
moveql #1 ,% d1 | w o r d c o u n t e r , i n i t t o 1
fmoves F Z E R O ,% f p0 | a c c u m u l a t o r
|
|
| Since t h e p a c k e d n u m b e r h a s a l o n g w o r d b e t w e e n t h e f i r s t & s e c o n d p a r t s ,
| get t h e i n t e g e r d i g i t t h e n s k i p d o w n & g e t t h e r e s t o f t h e
| mantissa. W e w i l l u n r o l l t h e l o o p o n c e .
|
bfextu ( % a0 ) { #28 : #4 } ,% d0 | i n t e g e r p a r t i s l s d i g i t i n l o n g w o r d
faddb % d0 ,% f p0 | a d d d i g i t t o s u m i n f p0
|
|
| Get t h e r e s t o f t h e m a n t i s s a .
|
loadlw :
movel ( % a0 ,% d1 . L * 4 ) ,% d4 | l o a d m a n t i s s a l o n g w o r d i n t o d4
moveql #F S T R T , % d 3 | c o u n t e r t o p i c k u p d i g i t s
moveql #F N I B S , % d 2 | r e s e t n u m b e r o f d i g i t s p e r a0 p t r
md2b :
fmuls F T E N ,% f p0 | f p0 = f p0 * 1 0
bfextu % d4 { % d3 : #4 } ,% d0 | g e t t h e d i g i t a n d z e r o e x t e n d
faddb % d0 ,% f p0 | f p0 = f p0 + d i g i t
|
|
| If a l l t h e d i g i t s ( 8 ) i n t h a t l o n g w o r d h a v e b e e n c o n v e r t e d ( d2 =0 ) ,
| then i n c d1 ( =2 ) t o p o i n t t o t h e n e x t l o n g w o r d a n d r e s e t d3 t o 0
| to i n i t i a l i z e t h e d i g i t o f f s e t , a n d s e t d2 t o 7 f o r t h e d i g i t c o u n t ;
| else c o n t i n u e w i t h t h i s l o n g w o r d .
|
addqb #4 ,% d3 | a d v a n c e d3 t o t h e n e x t d i g i t
dbf % d2 ,m d2 b | c h e c k f o r l a s t d i g i t i n t h i s l w
nextlw :
addql #1 ,% d1 | i n c l w p o i n t e r i n m a n t i s s a
cmpl #2 ,% d1 | t e s t f o r l a s t l w
ble l o a d l w | i f n o t , g e t l a s t o n e
|
| Check t h e s i g n o f t h e m a n t a n d m a k e t h e v a l u e i n f p0 t h e s a m e s i g n .
|
m_sign :
btst #31 ,( % a0 ) | t e s t s i g n o f t h e m a n t i s s a
beq a p _ s t _ z | i f c l e a r , g o t o a p p e n d / s t r i p z e r o s
fnegx % f p0 | i f s e t , n e g a t e f p0
|
| Append/ s t r i p z e r o s :
|
| For a d j u s t e d e x p o n e n t s w h i c h h a v e a n a b s o l u t e v a l u e g r e a t e r t h a n 2 7 * ,
| this r o u t i n e c a l c u l a t e s t h e a m o u n t n e e d e d t o n o r m a l i z e t h e m a n t i s s a
| for t h e a d j u s t e d e x p o n e n t . T h a t n u m b e r i s s u b t r a c t e d f r o m t h e e x p
| if t h e e x p w a s p o s i t i v e , a n d a d d e d i f i t w a s n e g a t i v e . T h e p u r p o s e
| of t h i s i s t o r e d u c e t h e v a l u e o f t h e e x p o n e n t a n d t h e p o s s i b i l i t y
| of e r r o r i n c a l c u l a t i o n o f p w r t e n .
|
| 1 . Branch o n t h e s i g n o f t h e a d j u s t e d e x p o n e n t .
| 2 p. ( p o s i t i v e e x p )
| 2 . Check M 1 6 a n d t h e d i g i t s i n l w o r d s 2 a n d 3 i n d e s c e n d i n g o r d e r .
| 3 . Add o n e f o r e a c h z e r o e n c o u n t e r e d u n t i l a n o n - z e r o d i g i t .
| 4 . Subtract t h e c o u n t f r o m t h e e x p .
| 5 . Check i f t h e e x p h a s c r o s s e d z e r o i n #3 a b o v e ; make the exp abs
| and s e t S E .
| 6 . Multiply t h e m a n t i s s a b y 1 0 * * c o u n t .
| 2 n. ( n e g a t i v e e x p )
| 2 . Check t h e d i g i t s i n l w o r d s 3 a n d 2 i n d e s c e n d i n g o r d e r .
| 3 . Add o n e f o r e a c h z e r o e n c o u n t e r e d u n t i l a n o n - z e r o d i g i t .
| 4 . Add t h e c o u n t t o t h e e x p .
| 5 . Check i f t h e e x p h a s c r o s s e d z e r o i n #3 a b o v e ; clear SE.
| 6 . Divide t h e m a n t i s s a b y 1 0 * * c o u n t .
|
| * Why 2 7 ? I f t h e a d j u s t e d e x p o n e n t i s w i t h i n - 2 8 < e x p A < 2 8 , t h a n
| any a d j u s t m e n t d u e t o a p p e n d / s t r i p z e r o s w i l l d r i v e t h e r e s u l t a n t
| exponent t o w a r d s z e r o . S i n c e a l l p w r t e n c o n s t a n t s w i t h a p o w e r
| of 2 7 o r l e s s a r e e x a c t , t h e r e i s n o n e e d t o u s e t h i s r o u t i n e t o
| attempt t o l e s s e n t h e r e s u l t a n t e x p o n e n t .
|
| Register u s a g e :
|
| ap_st_z :
| ( * ) d0 : temp d i g i t s t o r a g e
| ( * ) d1 : zero c o u n t
| ( * ) d2 : digit c o u n t
| ( * ) d3 : offset p o i n t e r
| ( ) d4 : first w o r d o f b c d
| ( * ) d5 : lword c o u n t e r
| ( ) a0 : pointer t o w o r k i n g b c d v a l u e
| ( ) FP_SCR1 : working c o p y o f o r i g i n a l b c d v a l u e
| ( ) L_SCR1 : copy o f o r i g i n a l e x p o n e n t w o r d
|
|
| First c h e c k t h e a b s o l u t e v a l u e o f t h e e x p o n e n t t o s e e i f t h i s
| routine i s n e c e s s a r y . I f s o , t h e n c h e c k t h e s i g n o f t h e e x p o n e n t
| and d o a p p e n d ( + ) o r s t r i p ( - ) z e r o s a c c o r d i n g l y .
| This s e c t i o n h a n d l e s a p o s i t i v e a d j u s t e d e x p o n e n t .
|
ap_st_z :
movel L _ S C R 1 ( % a6 ) ,% d1 | l o a d e x p A f o r r a n g e t e s t
cmpl #27 ,% d1 | t e s t i s w i t h 2 7
ble p w r t e n | i f a b s ( e x p A ) < 2 8 , s k i p a p / s t z e r o s
btst #30 ,( % a0 ) | c h e c k s i g n o f e x p
bne a p _ s t _ n | i f n e g , g o t o n e g s i d e
clrl % d1 | z e r o c o u n t r e g
movel ( % a0 ) ,% d4 | l o a d l w o r d 1 t o d4
bfextu % d4 { #28 : #4 } ,% d0 | g e t M 1 6 i n d0
bnes a p _ p _ f x | i f M 1 6 i s n o n - z e r o , g o f i x e x p
addql #1 ,% d1 | i n c z e r o c o u n t
moveql #1 ,% d5 | i n i t l w o r d c o u n t e r
movel ( % a0 ,% d5 . L * 4 ) ,% d4 | g e t l w o r d 2 t o d4
bnes a p _ p _ c l | i f l w 2 i s z e r o , s k i p i t
addql #8 ,% d1 | a n d i n c c o u n t b y 8
addql #1 ,% d5 | i n c l w o r d c o u n t e r
movel ( % a0 ,% d5 . L * 4 ) ,% d4 | g e t l w o r d 3 t o d4
ap_p_cl :
clrl % d3 | i n i t o f f s e t r e g
moveql #7 ,% d2 | i n i t d i g i t c o u n t e r
ap_p_gd :
bfextu % d4 { % d3 : #4 } ,% d0 | g e t d i g i t
bnes a p _ p _ f x | i f n o n - z e r o , g o t o f i x e x p
addql #4 ,% d3 | p o i n t t o n e x t d i g i t
addql #1 ,% d1 | i n c d i g i t c o u n t e r
dbf % d2 ,a p _ p _ g d | g e t n e x t d i g i t
ap_p_fx :
movel % d1 ,% d0 | c o p y c o u n t e r t o d2
movel L _ S C R 1 ( % a6 ) ,% d1 | g e t a d j u s t e d e x p f r o m m e m o r y
subl % d0 ,% d1 | s u b t r a c t c o u n t f r o m e x p
bges a p _ p _ f m | i f s t i l l p o s , g o t o p w r t e n
negl % d1 | n o w i t s n e g ; get abs
movel ( % a0 ) ,% d4 | l o a d l w o r d 1 t o d4
orl #0x40000000 ,% d4 | a n d s e t S E i n d4
orl #0x40000000 ,( % a0 ) | a n d i n m e m o r y
|
| Calculate t h e m a n t i s s a m u l t i p l i e r t o c o m p e n s a t e f o r t h e s t r i p i n g o f
| zeros f r o m t h e m a n t i s s a .
|
ap_p_fm :
movel #P T E N R N , % a 1 | g e t a d d r e s s o f p o w e r - o f - t e n t a b l e
clrl % d3 | i n i t t a b l e i n d e x
fmoves F O N E ,% f p1 | i n i t f p1 t o 1
moveql #3 ,% d2 | i n i t d2 t o c o u n t b i t s i n c o u n t e r
ap_p_el :
asrl #1 ,% d0 | s h i f t l s b i n t o c a r r y
bccs a p _ p _ e n | i f 1 , m u l f p1 b y p w r t e n f a c t o r
fmulx ( % a1 ,% d3 ) ,% f p1 | m u l b y 1 0 * * ( d3 _ b i t _ n o )
ap_p_en :
addl #12 ,% d3 | i n c d3 t o n e x t r t a b l e e n t r y
tstl % d0 | c h e c k i f d0 i s z e r o
bnes a p _ p _ e l | i f n o t , g e t n e x t b i t
fmulx % f p1 ,% f p0 | m u l m a n t i s s a b y 1 0 * * ( n o _ b i t s _ s h i f t e d )
bra p w r t e n | g o c a l c p w r t e n
|
| This s e c t i o n h a n d l e s a n e g a t i v e a d j u s t e d e x p o n e n t .
|
ap_st_n :
clrl % d1 | c l r c o u n t e r
moveql #2 ,% d5 | s e t u p d5 t o p o i n t t o l w o r d 3
movel ( % a0 ,% d5 . L * 4 ) ,% d4 | g e t l w o r d 3
bnes a p _ n _ c l | i f n o t z e r o , c h e c k d i g i t s
subl #1 ,% d5 | d e c d5 t o p o i n t t o l w o r d 2
addql #8 ,% d1 | i n c c o u n t e r b y 8
movel ( % a0 ,% d5 . L * 4 ) ,% d4 | g e t l w o r d 2
ap_n_cl :
movel #28 ,% d3 | p o i n t t o l a s t d i g i t
moveql #7 ,% d2 | i n i t d i g i t c o u n t e r
ap_n_gd :
bfextu % d4 { % d3 : #4 } ,% d0 | g e t d i g i t
bnes a p _ n _ f x | i f n o n - z e r o , g o t o e x p f i x
subql #4 ,% d3 | p o i n t t o p r e v i o u s d i g i t
addql #1 ,% d1 | i n c d i g i t c o u n t e r
dbf % d2 ,a p _ n _ g d | g e t n e x t d i g i t
ap_n_fx :
movel % d1 ,% d0 | c o p y c o u n t e r t o d0
movel L _ S C R 1 ( % a6 ) ,% d1 | g e t a d j u s t e d e x p f r o m m e m o r y
subl % d0 ,% d1 | s u b t r a c t c o u n t f r o m e x p
bgts a p _ n _ f m | i f s t i l l p o s , g o f i x m a n t i s s a
negl % d1 | t a k e a b s o f e x p a n d c l r S E
movel ( % a0 ) ,% d4 | l o a d l w o r d 1 t o d4
andl #0xbfffffff ,% d4 | a n d c l r S E i n d4
andl #0xbfffffff ,( % a0 ) | a n d i n m e m o r y
|
| Calculate t h e m a n t i s s a m u l t i p l i e r t o c o m p e n s a t e f o r t h e a p p e n d i n g o f
| zeros t o t h e m a n t i s s a .
|
ap_n_fm :
movel #P T E N R N , % a 1 | g e t a d d r e s s o f p o w e r - o f - t e n t a b l e
clrl % d3 | i n i t t a b l e i n d e x
fmoves F O N E ,% f p1 | i n i t f p1 t o 1
moveql #3 ,% d2 | i n i t d2 t o c o u n t b i t s i n c o u n t e r
ap_n_el :
asrl #1 ,% d0 | s h i f t l s b i n t o c a r r y
bccs a p _ n _ e n | i f 1 , m u l f p1 b y p w r t e n f a c t o r
fmulx ( % a1 ,% d3 ) ,% f p1 | m u l b y 1 0 * * ( d3 _ b i t _ n o )
ap_n_en :
addl #12 ,% d3 | i n c d3 t o n e x t r t a b l e e n t r y
tstl % d0 | c h e c k i f d0 i s z e r o
bnes a p _ n _ e l | i f n o t , g e t n e x t b i t
fdivx % f p1 ,% f p0 | d i v m a n t i s s a b y 1 0 * * ( n o _ b i t s _ s h i f t e d )
|
|
| Calculate p o w e r - o f - t e n f a c t o r f r o m a d j u s t e d a n d s h i f t e d e x p o n e n t .
|
| Register u s a g e :
|
| pwrten :
| ( * ) d0 : temp
| ( ) d1 : exponent
| ( * ) d2 : { FPCR[ 6 : 5 ] ,S M ,S E } a s i n d e x i n R T A B L E ; temp
| ( * ) d3 : FPCR w o r k c o p y
| ( ) d4 : first w o r d o f b c d
| ( * ) a1 : RTABLE p o i n t e r
| calc_p :
| ( * ) d0 : temp
| ( ) d1 : exponent
| ( * ) d3 : PWRTxx t a b l e i n d e x
| ( ) a0 : pointer t o w o r k i n g c o p y o f b c d
| ( * ) a1 : PWRTxx p o i n t e r
| ( * ) fp1 : power- o f - t e n a c c u m u l a t o r
|
| Pwrten c a l c u l a t e s t h e e x p o n e n t f a c t o r i n t h e s e l e c t e d r o u n d i n g m o d e
| according t o t h e f o l l o w i n g t a b l e :
|
| Sign o f M a n t S i g n o f E x p R o u n d i n g M o d e P W R T E N R o u n d i n g M o d e
|
| ANY A N Y R N R N
|
| + + RP R P
| - + RP R M
| + - RP R M
| - - RP R P
|
| + + RM R M
| - + RM R P
| + - RM R P
| - - RM R M
|
| + + RZ R M
| - + RZ R M
| + - RZ R P
| - - RZ R P
|
|
pwrten :
movel U S E R _ F P C R ( % a6 ) ,% d3 | g e t u s e r ' s F P C R
bfextu % d3 { #26 : #2 } ,% d2 | i s o l a t e r o u n d i n g m o d e b i t s
movel ( % a0 ) ,% d4 | r e l o a d 1 s t b c d w o r d t o d4
asll #2 ,% d2 | f o r m a t d2 t o b e
bfextu % d4 { #0 : #2 } ,% d0 | { F P C R [ 6 ] ,F P C R [ 5 ] ,S M ,S E }
addl % d0 ,% d2 | i n d2 a s i n d e x i n t o R T A B L E
leal R T A B L E ,% a1 | l o a d r t a b l e b a s e
moveb ( % a1 ,% d2 ) ,% d0 | l o a d n e w r o u n d i n g b i t s f r o m t a b l e
clrl % d3 | c l e a r d3 t o f o r c e n o e x c a n d e x t e n d e d
bfins % d0 ,% d3 { #26 : #2 } | s t u f f n e w r o u n d i n g b i t s i n F P C R
fmovel % d3 ,% F P C R | w r i t e n e w F P C R
asrl #1 ,% d0 | w r i t e c o r r e c t P T E N x x t a b l e
bccs n o t _ r p | t o a1
leal P T E N R P ,% a1 | i t i s R P
bras c a l c _ p | g o t o i n i t s e c t i o n
not_rp :
asrl #1 ,% d0 | k e e p c h e c k i n g
bccs n o t _ r m
leal P T E N R M ,% a1 | i t i s R M
bras c a l c _ p | g o t o i n i t s e c t i o n
not_rm :
leal P T E N R N ,% a1 | i t i s R N
calc_p :
movel % d1 ,% d0 | c o p y e x p t o d0 ;use d0
bpls n o _ n e g | i f e x p i s n e g a t i v e ,
negl % d0 | i n v e r t i t
orl #0x40000000 ,( % a0 ) | a n d s e t S E b i t
no_neg :
clrl % d3 | t a b l e i n d e x
fmoves F O N E ,% f p1 | i n i t f p1 t o 1
e_loop :
asrl #1 ,% d0 | s h i f t n e x t b i t i n t o c a r r y
bccs e _ n e x t | i f z e r o , s k i p t h e m u l
fmulx ( % a1 ,% d3 ) ,% f p1 | m u l b y 1 0 * * ( d3 _ b i t _ n o )
e_next :
addl #12 ,% d3 | i n c d3 t o n e x t r t a b l e e n t r y
tstl % d0 | c h e c k i f d0 i s z e r o
bnes e _ l o o p | n o t z e r o , c o n t i n u e s h i f t i n g
|
|
| Check t h e s i g n o f t h e a d j u s t e d e x p a n d m a k e t h e v a l u e i n f p0 t h e
| same s i g n . I f t h e e x p w a s p o s t h e n m u l t i p l y f p1 * f p0 ;
| else d i v i d e f p0 / f p1 .
|
| Register U s a g e :
| norm :
| ( ) a0 : pointer t o w o r k i n g b c d v a l u e
| ( * ) fp0 : mantissa a c c u m u l a t o r
| ( ) fp1 : scaling f a c t o r - 1 0 * * ( a b s ( e x p ) )
|
norm :
btst #30 ,( % a0 ) | t e s t t h e s i g n o f t h e e x p o n e n t
beqs m u l | i f c l e a r , g o t o m u l t i p l y
div :
fdivx % f p1 ,% f p0 | e x p i s n e g a t i v e , s o d i v i d e m a n t b y e x p
bras e n d _ d e c
mul :
fmulx % f p1 ,% f p0 | e x p i s p o s i t i v e , s o m u l t i p l y b y e x p
|
|
| Clean u p a n d r e t u r n w i t h r e s u l t i n f p0 .
|
| If t h e f i n a l m u l / d i v i n d e c b i n i n c u r r e d a n i n e x e x c e p t i o n ,
| it w i l l b e i n e x2 , b u t w i l l b e r e p o r t e d a s i n e x1 b y g e t _ o p .
|
end_dec :
fmovel % F P S R ,% d0 | g e t s t a t u s r e g i s t e r
bclrl #i n e x 2 _ b i t + 8 ,% d0 | t e s t f o r i n e x2 a n d c l e a r i t
fmovel % d0 ,% F P S R | r e t u r n s t a t u s r e g w / o i n e x2
beqs n o _ e x c | s k i p t h i s i f n o e x c
orl #i n x 1 a _ m a s k ,U S E R _ F P S R ( % a6 ) | s e t i n e x1 / a i n e x
no_exc :
moveml ( % a7 ) + ,% d2 - % d5
rts
| end