2005-04-17 02:20:36 +04:00
|
| x_ u n f l . s a 3 . 4 7 / 1 / 9 1
|
| fpsp_ u n f l - - - F P S P h a n d l e r f o r u n d e r f l o w e x c e p t i o n
|
| Trap d i s a b l e d r e s u l t s
| For 8 8 1 / 2 c o m p a t i b i l i t y , s w m u s t d e n o r m a l i z e t h e i n t e r m e d i a t e
| result, t h e n s t o r e t h e r e s u l t . D e n o r m a l i z a t i o n i s a c c o m p l i s h e d
| by t a k i n g t h e i n t e r m e d i a t e r e s u l t ( w h i c h i s a l w a y s n o r m a l i z e d ) a n d
| shifting t h e m a n t i s s a r i g h t w h i l e i n c r e m e n t i n g t h e e x p o n e n t u n t i l
| it i s e q u a l t o t h e d e n o r m a l i z e d e x p o n e n t f o r t h e d e s t i n a t i o n
| format. A f t e r d e n o r m a l i z a t i o n , t h e r e s u l t i s r o u n d e d t o t h e
| destination f o r m a t .
|
| Trap e n a b l e d r e s u l t s
| All t r a p d i s a b l e d c o d e a p p l i e s . I n a d d i t i o n t h e e x c e p t i o n a l
| operand n e e d s t o m a d e a v a i l a b l e t o t h e u s e r w i t h a b i a s o f $ 6 0 0 0
| added t o t h e e x p o n e n t .
|
| 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
X_UNFL : | idnt 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 d e n o r m
| xref r o u n d
| xref s t o r e
| xref g _ r n d p r
| xref g _ o p c l s
| xref g _ d f m t o u
| xref r e a l _ u n f l
| xref r e a l _ i n e x
| xref f p s p _ d o n e
| xref b12 3 8 _ f i x
.global fpsp_unfl
fpsp_unfl :
link % a6 ,#- L O C A L _ S I Z E
fsave - ( % a7 )
moveml % d0 - % d1 / % a0 - % a1 ,U S E R _ D A ( % a6 )
fmovemx % f p0 - % f p3 ,U S E R _ F P 0 ( % a6 )
fmoveml % f p c r / % f p s r / % f p i a r ,U S E R _ F P C R ( % a6 )
|
bsrl u n f _ r e s | d e n o r m a l i z e , r o u n d & s t o r e i n t e r m o p
|
| If u n d e r f l o w e x c e p t i o n s a r e n o t e n a b l e d , c h e c k f o r i n e x a c t
| exception
|
btstb #u n f l _ b i t , F P C R _ E N A B L E ( % a 6 )
beqs c k _ i n e x
btstb #E 3 ,E _ B Y T E ( % a6 )
beqs n o _ e 3 _ 1
|
| Clear d i r t y b i t o n d e s t r e s i s t e r i n t h e f r a m e b e f o r e b r a n c h i n g
| to b12 3 8 _ f i x .
|
bfextu C M D R E G 3 B ( % a6 ) { #6 : #3 } ,% d0 | g e t d e s t r e g n o
bclrb % d0 ,F P R _ D I R T Y _ B I T S ( % a6 ) | c l r d e s t d i r t y b i t
bsrl b12 3 8 _ f i x | t e s t f o r b u g 1 2 3 8 c a s e
movel U S E R _ F P S R ( % a6 ) ,F P S R _ S H A D O W ( % a6 )
orl #s x _ m a s k , E _ B Y T E ( % a 6 )
no_e3_1 :
moveml U S E R _ D A ( % a6 ) ,% d0 - % d1 / % a0 - % a1
fmovemx U S E R _ F P 0 ( % a6 ) ,% f p0 - % f p3
fmoveml U S E R _ F P C R ( % a6 ) ,% f p c r / % f p s r / % f p i a r
frestore ( % a7 ) +
unlk % a6
bral r e a l _ u n f l
|
| It i s p o s s i b l e t o h a v e e i t h e r i n e x2 o r i n e x1 e x c e p t i o n s w i t h t h e
| unfl. I f t h e i n e x e n a b l e b i t i s s e t i n t h e F P C R , a n d e i t h e r
| inex2 o r i n e x1 o c c u r r e d , w e m u s t c l e a n u p a n d b r a n c h t o t h e
| real i n e x h a n d l e r .
|
ck_inex :
moveb F P C R _ E N A B L E ( % a6 ) ,% d0
andb F P S R _ E X C E P T ( % a6 ) ,% d0
andib #0x3 ,% d0
beqs u n f l _ d o n e
|
| Inexact e n a b l e d a n d r e p o r t e d , a n d w e m u s t t a k e a n i n e x a c t e x c e p t i o n
|
take_inex :
btstb #E 3 ,E _ B Y T E ( % a6 )
beqs n o _ e 3 _ 2
|
| Clear d i r t y b i t o n d e s t r e s i s t e r i n t h e f r a m e b e f o r e b r a n c h i n g
| to b12 3 8 _ f i x .
|
bfextu C M D R E G 3 B ( % a6 ) { #6 : #3 } ,% d0 | g e t d e s t r e g n o
bclrb % d0 ,F P R _ D I R T Y _ B I T S ( % a6 ) | c l r d e s t d i r t y b i t
bsrl b12 3 8 _ f i x | t e s t f o r b u g 1 2 3 8 c a s e
movel U S E R _ F P S R ( % a6 ) ,F P S R _ S H A D O W ( % a6 )
orl #s x _ m a s k , E _ B Y T E ( % a 6 )
no_e3_2 :
moveb #I N E X _ V E C , E X C _ V E C + 1 ( % a6 )
moveml U S E R _ D A ( % a6 ) ,% d0 - % d1 / % a0 - % a1
fmovemx U S E R _ F P 0 ( % a6 ) ,% f p0 - % f p3
fmoveml U S E R _ F P C R ( % a6 ) ,% f p c r / % f p s r / % f p i a r
frestore ( % a7 ) +
unlk % a6
bral r e a l _ i n e x
unfl_done :
bclrb #E 3 ,E _ B Y T E ( % a6 )
beqs e 1 _ s e t | i f s e t t h e n b r a n c h
|
| Clear d i r t y b i t o n d e s t r e s i s t e r i n t h e f r a m e b e f o r e b r a n c h i n g
| to b12 3 8 _ f i x .
|
bfextu C M D R E G 3 B ( % a6 ) { #6 : #3 } ,% d0 | g e t d e s t r e g n o
bclrb % d0 ,F P R _ D I R T Y _ B I T S ( % a6 ) | c l r d e s t d i r t y b i t
bsrl b12 3 8 _ f i x | t e s t f o r b u g 1 2 3 8 c a s e
movel U S E R _ F P S R ( % a6 ) ,F P S R _ S H A D O W ( % a6 )
orl #s x _ m a s k , E _ B Y T E ( % a 6 )
moveml U S E R _ D A ( % a6 ) ,% d0 - % d1 / % a0 - % a1
fmovemx U S E R _ F P 0 ( % a6 ) ,% f p0 - % f p3
fmoveml U S E R _ F P C R ( % a6 ) ,% f p c r / % f p s r / % f p i a r
frestore ( % a7 ) +
unlk % a6
bral f p s p _ d o n e
e1_set :
moveml U S E R _ D A ( % a6 ) ,% d0 - % d1 / % a0 - % a1
fmovemx U S E R _ F P 0 ( % a6 ) ,% f p0 - % f p3
fmoveml U S E R _ F P C R ( % a6 ) ,% f p c r / % f p s r / % f p i a r
unlk % a6
bral f p s p _ d o n e
|
| unf_ r e s - - - u n d e r f l o w r e s u l t c a l c u l a t i o n
|
unf_res :
bsrl g _ r n d p r | r e t u r n s R N D _ P R E C i n d0 0 =ext ,
| ;1=sgl, 2=dbl
| ;we need the RND_PREC in the
| ;upper word for round
movew #0 ,- ( % a7 )
movew % d0 ,- ( % a7 ) | c o p y R N D _ P R E C t o s t a c k
|
|
| If t h e e x c e p t i o n b i t s e t i s E 3 , t h e e x c e p t i o n a l o p e r a n d f r o m t h e
| fpu i s i n W B T E M P ; else it is in FPTEMP.
|
btstb #E 3 ,E _ B Y T E ( % a6 )
beqs u n f _ E 1
unf_E3 :
lea W B T E M P ( % a6 ) ,% a0 | a0 n o w p o i n t s t o o p e r a n d
|
| Test f o r f s g l d i v a n d f s g l m u l . I f t h e i n s t w a s o n e o f t h e s e , t h e n
| force t h e p r e c i s i o n t o e x t e n d e d f o r t h e d e n o r m r o u t i n e . U s e
| the u s e r ' s p r e c i s i o n f o r t h e r o u n d r o u t i n e .
|
movew C M D R E G 3 B ( % a6 ) ,% d1 | c h e c k f o r f s g l d i v o r f s g l m u l
andiw #0x7f ,% d1
cmpiw #0x30 ,% d1 | c h e c k f o r s g l d i v
beqs u n f _ s g l
cmpiw #0x33 ,% d1 | c h e c k f o r s g l m u l
bnes u n f _ c o n t | i f n o t , u s e f p c r p r e c i n r o u n d
unf_sgl :
clrl % d0
movew #0x1 ,( % a7 ) | o v e r r i d e g _ r n d p r p r e c i s i o n
| ;force single
bras u n f _ c o n t
unf_E1 :
lea F P T E M P ( % a6 ) ,% a0 | a0 n o w p o i n t s t o o p e r a n d
unf_cont :
bclrb #s i g n _ b i t , L O C A L _ E X ( % a 0 ) | c l e a r s i g n b i t
sne L O C A L _ S G N ( % a0 ) | s t o r e s i g n
bsrl d e n o r m | r e t u r n s d e n o r m , a0 p o i n t s t o i t
|
| WARNING :
| ;d0 has guard,round sticky bit
| ;make sure that it is not corrupted
| ;before it reaches the round subroutine
| ;also ensure that a0 isn't corrupted
|
| Set u p d1 f o r r o u n d s u b r o u t i n e d1 c o n t a i n s t h e P R E C / M O D E
| information r e s p e c t i v e l y o n u p p e r / l o w e r r e g i s t e r h a l v e s .
|
bfextu F P C R _ M O D E ( % a6 ) { #2 : #2 } ,% d1 | g e t m o d e f r o m F P C R
| ;mode in lower d1
addl ( % a7 ) + ,% d1 | m e r g e P R E C / M O D E
|
| WARNING : a0 a n d d0 a r e a s s u m e d t o b e i n t a c t b e t w e e n t h e d e n o r m a n d
| round s u b r o u t i n e s . A l l c o d e b e t w e e n t h e s e t w o s u b r o u t i n e s
| must n o t c o r r u p t a0 a n d d0 .
|
|
| Perform R o u n d
| Input : a0 p o i n t s t o i n p u t o p e r a n d
| d0 { 3 1 : 2 9 } h a s g u a r d , r o u n d , s t i c k y
| d1 { 0 1 : 0 0 } h a s r o u n d i n g m o d e
| d1 { 1 7 : 1 6 } h a s r o u n d i n g p r e c i s i o n
| Output : a0 p o i n t s t o r o u n d e d o p e r a n d
|
bsrl r o u n d | r e t u r n s r o u n d e d d e n o r m a t ( a0 )
|
| Differentiate b e t w e e n s t o r e t o m e m o r y v s . s t o r e t o r e g i s t e r
|
unf_store :
bsrl g _ o p c l s | r e t u r n s o p c l a s s i n d0 { 2 : 0 }
cmpib #0x3 ,% d0
bnes n o t _ o p c01 1
|
| At t h i s p o i n t , a s t o r e t o m e m o r y i s p e n d i n g
|
opc011 :
bsrl g _ d f m t o u
tstb % d0
beqs e x t _ o p c01 1 | I f e x t e n d e d , d o n o t s u b t r a c t
| ;If destination format is sgl/dbl,
tstb L O C A L _ H I ( % a0 ) | I f r o u n d e d r e s u l t i s n o r m a l ,d o n ' t
| ;subtract
bmis e x t _ o p c01 1
subqw #1 ,L O C A L _ E X ( % a0 ) | a c c o u n t f o r d e n o r m b i a s v s .
| ;normalized bias
| ; normalized denormalized
| ;single $7f $7e
| ;double $3ff $3fe
|
ext_opc011 :
bsrl s t o r e | s t o r e s t o m e m o r y
bras u n f _ d o n e | f i n i s h u p
|
| At t h i s p o i n t , a s t o r e t o a f l o a t r e g i s t e r i s p e n d i n g
|
not_opc011 :
bsrl s t o r e | s t o r e s t o f l o a t r e g i s t e r
| ;a0 is not corrupted on a store to a
| ;float register.
|
| Set t h e c o n d i t i o n c o d e s a c c o r d i n g t o r e s u l t
|
tstl L O C A L _ H I ( % a0 ) | c h e c k u p p e r m a n t i s s a
bnes c k _ s g n
tstl L O C A L _ L O ( % a0 ) | c h e c k l o w e r m a n t i s s a
bnes c k _ s g n
bsetb #z _ b i t , F P S R _ C C ( % a 6 ) | s e t c o n d i t i o n c o d e s i f z e r o
ck_sgn :
btstb #s i g n _ b i t , L O C A L _ E X ( % a 0 ) | c h e c k t h e s i g n b i t
beqs u n f _ d o n e
bsetb #n e g _ b i t , F P S R _ C C ( % a 6 )
|
| Finish.
|
unf_done :
btstb #i n e x 2 _ b i t ,F P S R _ E X C E P T ( % a6 )
beqs n o _ a u n f l
bsetb #a u n f l _ b i t , F P S R _ A E X C E P T ( % a 6 )
no_aunfl :
rts
| end