2005-04-17 02:20:36 +04:00
|
| scale. s a 3 . 3 7 / 3 0 / 9 1
|
| The e n t r y p o i n t s S C A L E c o m p u t e s t h e d e s t i n a t i o n o p e r a n d
| scaled b y t h e s o u r c e o p e r a n d . I f t h e a b s o l u t e v a l u e o f
| the s o u r c e o p e r a n d i s ( > = 2 ^ 1 4 ) a n o v e r f l o w o r u n d e r f l o w
| is r e t u r n e d .
|
| The e n t r y p o i n t s s c a l e i s c a l l e d f r o m d o _ f u n c t o e m u l a t e
| the f s c a l e u n i m p l e m e n t e d i n s t r u c t i o n .
|
| Input : Double- e x t e n d e d d e s t i n a t i o n o p e r a n d i n F P T E M P ,
| double- e x t e n d e d s o u r c e o p e r a n d i n E T E M P .
|
| Output : The f u n c t i o n r e t u r n s s c a l e ( X ,Y ) t o f p0 .
|
| Modifies : fp0 .
|
| Algorithm :
|
| 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-12 04:55:48 +03: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-17 02:20:36 +04:00
| SCALE 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 "
| xref t _ o v f l 2
| xref t _ u n f l
| xref r o u n d
| xref t _ r e s d n r m
SRC_BNDS : .short 0x3fff , 0 x4 0 0 c
|
| This e n t r y p o i n t i s u s e d b y t h e u n i m p l e m e n t e d i n s t r u c t i o n e x c e p t i o n
| handler.
|
|
|
| FSCALE
|
.global sscale
sscale :
fmovel #0 ,% f p c r | c l r u s e r e n a b l e d e x c
clrl % d1
movew F P T E M P ( % a6 ) ,% d1 | g e t d e s t e x p o n e n t
smi L _ S C R 1 ( % a6 ) | u s e L _ S C R 1 t o h o l d s i g n
andil #0x7fff ,% d1 | s t r i p s i g n
movew E T E M P ( % a6 ) ,% d0 | c h e c k s r c b o u n d s
andiw #0x7fff ,% d0 | c l r s i g n b i t
cmp2 w S R C _ B N D S ,% d0
bccs s r c _ i n
cmpiw #0x400c ,% d0 | t e s t f o r t o o l a r g e
bge s r c _ o u t
|
| The s o u r c e i n p u t i s b e l o w 1 , s o w e c h e c k f o r d e n o r m a l i z e d n u m b e r s
| and s e t u n f l .
|
src_small :
moveb D T A G ( % a6 ) ,% d0
andib #0xe0 ,% d0
tstb % d0
beqs n o _ d e n o r m
st S T O R E _ F L G ( % a6 ) | d e s t a l r e a d y c o n t a i n s r e s u l t
orl #u n f l _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t U N F L
den_done :
leal F P T E M P ( % a6 ) ,% a0
bra t _ r e s d n r m
no_denorm :
fmovel U S E R _ F P C R ( % a6 ) ,% F P C R
fmovex F P T E M P ( % a6 ) ,% f p0 | s i m p l y r e t u r n d e s t
rts
|
| Source i s w i t h i n 2 ^ 1 4 r a n g e . T o p e r f o r m t h e i n t o p e r a t i o n ,
| move i t t o d0 .
|
src_in :
fmovex E T E M P ( % a6 ) ,% f p0 | m o v e i n s r c f o r i n t
fmovel #r z _ m o d e , % f p c r | f o r c e r z f o r s r c c o n v e r s i o n
fmovel % f p0 ,% d0 | i n t s r c t o d0
fmovel #0 ,% F P S R | c l r s t a t u s f r o m a b o v e
tstw E T E M P ( % a6 ) | c h e c k s r c s i g n
blt s r c _ n e g
|
| Source i s p o s i t i v e . A d d t h e s r c t o t h e d e s t e x p o n e n t .
| The r e s u l t c a n b e d e n o r m a l i z e d , i f s r c = 0 , o r o v e r f l o w ,
| if t h e r e s u l t o f t h e a d d s e t s a b i t i n t h e u p p e r w o r d .
|
src_pos :
tstw % d1 | c h e c k f o r d e n o r m
beq d s t _ d n r m
addl % d0 ,% d1 | a d d s r c t o d e s t e x p
beqs d e n o r m | i f z e r o , r e s u l t i s d e n o r m
cmpil #0x7fff ,% d1 | t e s t f o r o v e r f l o w
bges o v f l
tstb L _ S C R 1 ( % a6 )
beqs s p o s _ p o s
orw #0x8000 ,% d1
spos_pos :
movew % d1 ,F P T E M P ( % a6 ) | r e s u l t i n F P T E M P
fmovel U S E R _ F P C R ( % a6 ) ,% F P C R
fmovex F P T E M P ( % a6 ) ,% f p0 | w r i t e r e s u l t t o f p0
rts
ovfl :
tstb L _ S C R 1 ( % a6 )
beqs s o v l _ p o s
orw #0x8000 ,% d1
sovl_pos :
movew F P T E M P ( % a6 ) ,E T E M P ( % a6 ) | r e s u l t i n E T E M P
movel F P T E M P _ H I ( % a6 ) ,E T E M P _ H I ( % a6 )
movel F P T E M P _ L O ( % a6 ) ,E T E M P _ L O ( % a6 )
bra t _ o v f l 2
denorm :
tstb L _ S C R 1 ( % a6 )
beqs d e n _ p o s
orw #0x8000 ,% d1
den_pos :
tstl F P T E M P _ H I ( % a6 ) | c h e c k j b i t
blts n d e n _ e x i t | i f s e t , n o t d e n o r m
movew % d1 ,E T E M P ( % a6 ) | i n p u t e x p e c t e d i n E T E M P
movel F P T E M P _ H I ( % a6 ) ,E T E M P _ H I ( % a6 )
movel F P T E M P _ L O ( % a6 ) ,E T E M P _ L O ( % a6 )
orl #u n f l _ b i t , U S E R _ F P S R ( % a 6 ) | s e t u n f l
leal E T E M P ( % a6 ) ,% a0
bra t _ r e s d n r m
nden_exit :
movew % d1 ,F P T E M P ( % a6 ) | r e s u l t i n F P T E M P
fmovel U S E R _ F P C R ( % a6 ) ,% F P C R
fmovex F P T E M P ( % a6 ) ,% f p0 | w r i t e r e s u l t t o f p0
rts
|
| Source i s n e g a t i v e . A d d t h e s r c t o t h e d e s t e x p o n e n t .
| ( The r e s u l t e x p o n e n t w i l l b e r e d u c e d ) . T h e r e s u l t c a n b e
| denormalized.
|
src_neg :
addl % d0 ,% d1 | a d d s r c t o d e s t
beqs d e n o r m | i f z e r o , r e s u l t i s d e n o r m
blts f i x _ d n r m | i f n e g a t i v e , r e s u l t i s
| ;needing denormalization
tstb L _ S C R 1 ( % a6 )
beqs s n e g _ p o s
orw #0x8000 ,% d1
sneg_pos :
movew % d1 ,F P T E M P ( % a6 ) | r e s u l t i n F P T E M P
fmovel U S E R _ F P C R ( % a6 ) ,% F P C R
fmovex F P T E M P ( % a6 ) ,% f p0 | w r i t e r e s u l t t o f p0
rts
|
| The r e s u l t e x p o n e n t i s b e l o w d e n o r m v a l u e . T e s t f o r c a t a s t r o p h i c
| underflow a n d f o r c e z e r o i f t r u e . I f n o t , t r y t o s h i f t t h e
| mantissa r i g h t u n t i l a z e r o e x p o n e n t e x i s t s .
|
fix_dnrm :
cmpiw #0xffc0 ,% d1 | l o w e r b o u n d f o r n o r m a l i z a t i o n
blt f i x _ u n f l | i f l o w e r , c a t a s t r o p h i c u n f l
movew % d1 ,% d0 | u s e d0 f o r e x p
movel % d2 ,- ( % a7 ) | f r e e d2 f o r n o r m
movel F P T E M P _ H I ( % a6 ) ,% d1
movel F P T E M P _ L O ( % a6 ) ,% d2
clrl L _ S C R 2 ( % a6 )
fix_loop :
addw #1 ,% d0 | d r i v e d0 t o 0
lsrl #1 ,% d1 | w h i l e s h i f t i n g t h e
roxrl #1 ,% d2 | m a n t i s s a t o t h e r i g h t
bccs n o _ c a r r y
st L _ S C R 2 ( % a6 ) | u s e L _ S C R 2 t o c a p t u r e i n e x
no_carry :
tstw % d0 | i t i s f i n i s h e d w h e n
blts f i x _ l o o p | d0 i s z e r o o r t h e m a n t i s s a
tstb L _ S C R 2 ( % a6 )
beqs t s t _ z e r o
orl #u n f l _ i n x _ m a s k , U S E R _ F P S R ( % a 6 )
| ;set unfl, aunfl, ainex
|
| Test f o r z e r o . I f z e r o , s i m p l y u s e f m o v e t o r e t u r n + / - z e r o
| to t h e f p u .
|
tst_zero :
clrw F P T E M P _ E X ( % a6 )
tstb L _ S C R 1 ( % a6 ) | t e s t f o r s i g n
beqs t s t _ c o n
orw #0x8000 ,F P T E M P _ E X ( % a6 ) | s e t s i g n b i t
tst_con :
movel % d1 ,F P T E M P _ H I ( % a6 )
movel % d2 ,F P T E M P _ L O ( % a6 )
movel ( % a7 ) + ,% d2
tstl % d1
bnes n o t _ z e r o
tstl F P T E M P _ L O ( % a6 )
bnes n o t _ z e r o
|
| Result i s z e r o . C h e c k f o r r o u n d i n g m o d e t o s e t l s b . I f t h e
| mode i s r p , a n d t h e z e r o i s p o s i t i v e , r e t u r n s m a l l e s t d e n o r m .
| If t h e m o d e i s r m , a n d t h e z e r o i s n e g a t i v e , r e t u r n s m a l l e s t
| negative d e n o r m .
|
btstb #5 ,F P C R _ M O D E ( % a6 ) | t e s t i f r m o r r p
beqs n o _ d i r
btstb #4 ,F P C R _ M O D E ( % a6 ) | c h e c k w h i c h o n e
beqs z e r _ r m
zer_rp :
tstb L _ S C R 1 ( % a6 ) | c h e c k s i g n
bnes n o _ d i r | i f s e t , n e g o p , n o i n c
movel #1 ,F P T E M P _ L O ( % a6 ) | s e t l s b
bras s m _ d n r m
zer_rm :
tstb L _ S C R 1 ( % a6 ) | c h e c k s i g n
beqs n o _ d i r | i f c l r , n e g o p , n o i n c
movel #1 ,F P T E M P _ L O ( % a6 ) | s e t l s b
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t N
bras s m _ d n r m
no_dir :
fmovel U S E R _ F P C R ( % a6 ) ,% F P C R
fmovex F P T E M P ( % a6 ) ,% f p0 | u s e f m o v e t o s e t c c ' s
rts
|
| The r o u n d i n g m o d e c h a n g e d t h e z e r o t o a s m a l l e s t d e n o r m . C a l l
| t_ r e s d n r m w i t h e x c e p t i o n a l o p e r a n d i n E T E M P .
|
sm_dnrm :
movel F P T E M P _ E X ( % a6 ) ,E T E M P _ E X ( % a6 )
movel F P T E M P _ H I ( % a6 ) ,E T E M P _ H I ( % a6 )
movel F P T E M P _ L O ( % a6 ) ,E T E M P _ L O ( % a6 )
leal E T E M P ( % a6 ) ,% a0
bra t _ r e s d n r m
|
| Result i s s t i l l d e n o r m a l i z e d .
|
not_zero :
orl #u n f l _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t u n f l
tstb L _ S C R 1 ( % a6 ) | c h e c k f o r s i g n
beqs f i x _ e x i t
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t N
fix_exit :
bras s m _ d n r m
|
| The r e s u l t h a s u n d e r f l o w e d t o z e r o . R e t u r n z e r o a n d s e t
| unfl, a u n f l , a n d a i n e x .
|
fix_unfl :
orl #u n f l _ i n x _ m a s k , U S E R _ F P S R ( % a 6 )
btstb #5 ,F P C R _ M O D E ( % a6 ) | t e s t i f r m o r r p
beqs n o _ d i r2
btstb #4 ,F P C R _ M O D E ( % a6 ) | c h e c k w h i c h o n e
beqs z e r _ r m 2
zer_rp2 :
tstb L _ S C R 1 ( % a6 ) | c h e c k s i g n
bnes n o _ d i r2 | i f s e t , n e g o p , n o i n c
clrl F P T E M P _ E X ( % a6 )
clrl F P T E M P _ H I ( % a6 )
movel #1 ,F P T E M P _ L O ( % a6 ) | s e t l s b
bras s m _ d n r m | r e t u r n s m a l l e s t d e n o r m
zer_rm2 :
tstb L _ S C R 1 ( % a6 ) | c h e c k s i g n
beqs n o _ d i r2 | i f c l r , n e g o p , n o i n c
movew #0x8000 ,F P T E M P _ E X ( % a6 )
clrl F P T E M P _ H I ( % a6 )
movel #1 ,F P T E M P _ L O ( % a6 ) | s e t l s b
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t N
bra s m _ d n r m | r e t u r n s m a l l e s t d e n o r m
no_dir2 :
tstb L _ S C R 1 ( % a6 )
bges p o s _ z e r o
neg_zero :
clrl F P _ S C R 1 ( % a6 ) | c l e a r t h e e x c e p t i o n a l o p e r a n d
clrl F P _ S C R 1 + 4 ( % a6 ) | f o r g e n _ e x c e p t .
clrl F P _ S C R 1 + 8 ( % a6 )
fmoves #0x80000000 ,% f p0
rts
pos_zero :
clrl F P _ S C R 1 ( % a6 ) | c l e a r t h e e x c e p t i o n a l o p e r a n d
clrl F P _ S C R 1 + 4 ( % a6 ) | f o r g e n _ e x c e p t .
clrl F P _ S C R 1 + 8 ( % a6 )
fmoves #0x00000000 ,% f p0
rts
|
| The d e s t i n a t i o n i s a d e n o r m a l i z e d n u m b e r . I t m u s t b e h a n d l e d
| by f i r s t s h i f t i n g t h e b i t s i n t h e m a n t i s s a u n t i l i t i s n o r m a l i z e d ,
| then a d d i n g t h e r e m a i n d e r o f t h e s o u r c e t o t h e e x p o n e n t .
|
dst_dnrm :
moveml % d2 / % d3 ,- ( % a7 )
movew F P T E M P _ E X ( % a6 ) ,% d1
movel F P T E M P _ H I ( % a6 ) ,% d2
movel F P T E M P _ L O ( % a6 ) ,% d3
dst_loop :
tstl % d2 | t e s t f o r n o r m a l i z e d r e s u l t
blts d s t _ n o r m | e x i t l o o p i f s o
tstl % d0 | o t h e r w i s e , t e s t s h i f t c o u n t
beqs d s t _ f i n | i f z e r o , s h i f t i n g i s d o n e
subil #1 ,% d0 | d e c s r c
lsll #1 ,% d3
roxll #1 ,% d2
bras d s t _ l o o p
|
| Destination b e c a m e n o r m a l i z e d . S i m p l y a d d t h e r e m a i n i n g
| portion o f t h e s r c t o t h e e x p o n e n t .
|
dst_norm :
addw % d0 ,% d1 | d s t i s n o r m a l i z e d ; add src
tstb L _ S C R 1 ( % a6 )
beqs d n r m _ p o s
orl #0x8000 ,% d1
dnrm_pos :
movemw % d1 ,F P T E M P _ E X ( % a6 )
moveml % d2 ,F P T E M P _ H I ( % a6 )
moveml % d3 ,F P T E M P _ L O ( % a6 )
fmovel U S E R _ F P C R ( % a6 ) ,% F P C R
fmovex F P T E M P ( % a6 ) ,% f p0
moveml ( % a7 ) + ,% d2 / % d3
rts
|
| Destination r e m a i n e d d e n o r m a l i z e d . C a l l t _ e x c d n r m w i t h
| exceptional o p e r a n d i n E T E M P .
|
dst_fin :
tstb L _ S C R 1 ( % a6 ) | c h e c k f o r s i g n
beqs d s t _ e x i t
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t N
orl #0x8000 ,% d1
dst_exit :
movemw % d1 ,E T E M P _ E X ( % a6 )
moveml % d2 ,E T E M P _ H I ( % a6 )
moveml % d3 ,E T E M P _ L O ( % a6 )
orl #u n f l _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t u n f l
moveml ( % a7 ) + ,% d2 / % d3
leal E T E M P ( % a6 ) ,% a0
bra t _ r e s d n r m
|
| Source i s o u t s i d e o f 2 ^ 1 4 r a n g e . T e s t t h e s i g n a n d b r a n c h
| to t h e a p p r o p r i a t e e x c e p t i o n h a n d l e r .
|
src_out :
tstb L _ S C R 1 ( % a6 )
beqs s c r o _ p o s
orl #0x8000 ,% d1
scro_pos :
movel F P T E M P _ H I ( % a6 ) ,E T E M P _ H I ( % a6 )
movel F P T E M P _ L O ( % a6 ) ,E T E M P _ L O ( % a6 )
tstw E T E M P ( % a6 )
blts r e s _ n e g
res_pos :
movew % d1 ,E T E M P ( % a6 ) | r e s u l t i n E T E M P
bra t _ o v f l 2
res_neg :
movew % d1 ,E T E M P ( % a6 ) | r e s u l t i n E T E M P
leal E T E M P ( % a6 ) ,% a0
bra t _ u n f l
| end