2005-04-17 02:20:36 +04:00
|
| x_ o v f l . s a 3 . 5 7 / 1 / 9 1
|
| fpsp_ o v f l - - - F P S P h a n d l e r f o r o v e r f l o w e x c e p t i o n
|
| Overflow o c c u r s w h e n a f l o a t i n g - p o i n t i n t e r m e d i a t e r e s u l t i s
| too l a r g e t o b e r e p r e s e n t e d i n a f l o a t i n g - p o i n t d a t a r e g i s t e r ,
| or w h e n s t o r i n g t o m e m o r y , t h e c o n t e n t s o f a f l o a t i n g - p o i n t
| data r e g i s t e r a r e t o o l a r g e t o b e r e p r e s e n t e d i n t h e
| destination f o r m a t .
|
| Trap d i s a b l e d r e s u l t s
|
| If t h e i n s t r u c t i o n i s m o v e _ o u t , t h e n g a r b a g e i s s t o r e d i n t h e
| destination. I f t h e i n s t r u c t i o n i s n o t m o v e _ o u t , t h e n t h e
| destination i s n o t a f f e c t e d . F o r 6 8 8 8 1 c o m p a t i b i l i t y , t h e
| following v a l u e s s h o u l d b e s t o r e d a t t h e d e s t i n a t i o n , b a s e d
| on t h e c u r r e n t r o u n d i n g m o d e :
|
| RN I n f i n i t y w i t h t h e s i g n o f t h e i n t e r m e d i a t e r e s u l t .
| RZ L a r g e s t m a g n i t u d e n u m b e r , w i t h t h e s i g n o f t h e
| intermediate r e s u l t .
| RM F o r p o s o v e r f l o w , t h e l a r g e s t p o s n u m b e r . F o r n e g o v e r f l o w ,
| - infinity
| RP F o r p o s o v e r f l o w , + i n f i n i t y . F o r n e g o v e r f l o w , t h e l a r g e s t
| neg n u m b e r
|
| 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 b e m a d e a v a i l a b l e t o t h e u s e r s e x c e p t i o n h a n d l e r
| with a b i a s o f $ 6 0 0 0 s u b t r a c t e d f r o m 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_OVFL : | 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 o v f _ r _ x2
| xref o v f _ r _ x3
| xref s t o r e
| xref r e a l _ o v f l
| xref r e a l _ i n e x
| xref f p s p _ d o n e
| xref g _ o p c l s
| xref b12 3 8 _ f i x
.global fpsp_ovfl
fpsp_ovfl :
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 )
|
| The 0 4 0 d o e s n ' t s e t t h e A I N E X b i t i n t h e F P S R , t h e f o l l o w i n g
| line t e m p o r a r i l y r e c t i f i e s t h i s e r r o r .
|
bsetb #a i n e x _ b i t , F P S R _ A E X C E P T ( % a 6 )
|
bsrl o v f _ a d j | 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 o v e r f l o w t r a p s 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 e x c e p t i o n
|
btstb #o v 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
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
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 _ o v 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
| ovfl. 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 :
| move. b F P C R _ E N A B L E ( % a6 ) ,% d0
| and. b F P S R _ E X C E P T ( % a6 ) ,% d0
| andi. b #$ 3 ,% d0
btstb #i n e x 2 _ b i t ,F P C R _ E N A B L E ( % a6 )
beqs o v f l _ e x i t
|
| 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
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
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
ovfl_exit :
bclrb #E 3 ,E _ B Y T E ( % a6 ) | t e s t a n d c l e a r E 3 b i t
beqs e 1 _ s e t
|
| 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
|
| ovf_ a d j
|
ovf_adj :
|
| Have a0 p o i n t t o t h e c o r r e c t o p e r a n d .
|
btstb #E 3 ,E _ B Y T E ( % a6 ) | t e s t E 3 b i t
beqs o v f _ e 1
lea W B T E M P ( % a6 ) ,% a0
bras o v f _ c o m
ovf_e1 :
lea E T E M P ( % a6 ) ,% a0
ovf_com :
bclrb #s i g n _ b i t , L O C A L _ E X ( % a 0 )
sne L O C A L _ S G N ( % a0 )
bsrl g _ o p c l s | r e t u r n s o p c l a s s i n d0
cmpiw #3 ,% d0 | c h e c k f o r o p c l a s s3
bnes n o t _ o p c01 1
|
| FPSR_ C C i s s a v e d a n d r e s t o r e d b e c a u s e o v f _ r _ x3 a f f e c t s i t . T h e
| CCs a r e d e f i n e d t o b e ' n o t a f f e c t e d ' f o r t h e o p c l a s s3 i n s t r u c t i o n .
|
moveb F P S R _ C C ( % a6 ) ,L _ S C R 1 ( % a6 )
bsrl o v f _ r _ x3 | r e t u r n s a0 p o i n t i n g t o r e s u l t
moveb L _ S C R 1 ( % a6 ) ,F P S R _ C C ( % a6 )
bral s t o r e | s t o r e s t o m e m o r y o r r e g i s t e r
not_opc011 :
bsrl o v f _ r _ x2 | r e t u r n s a0 p o i n t i n g t o r e s u l t
bral s t o r e | s t o r e s t o m e m o r y o r r e g i s t e r
| end