2005-04-17 02:20:36 +04:00
|
| x_ s n a n . s a 3 . 3 7 / 1 / 9 1
|
| fpsp_ s n a n - - - F P S P h a n d l e r f o r s i g n a l l i n g N A N e x c e p t i o n
|
| SNAN f o r f l o a t - > i n t e g e r c o n v e r s i o n s ( i n t e g e r c o n v e r s i o n o f
| an S N A N ) i s a n o n - m a s k a b l e r u n - t i m e e x c e p t i o n .
|
| For t r a p d i s a b l e d t h e 0 4 0 d o e s t h e f o l l o w i n g :
| If t h e d e s t d a t a f o r m a t i s s , d , o r x , t h e n t h e S N A N b i t i n t h e N A N
| is s e t t o o n e a n d t h e r e s u l t i n g n o n - s i g n a l i n g N A N ( t r u n c a t e d i f
| necessary) i s t r a n s f e r r e d t o t h e d e s t . I f t h e d e s t f o r m a t i s b , w ,
| or l , t h e n g a r b a g e i s w r i t t e n t o t h e d e s t ( a c t u a l l y t h e u p p e r 3 2 b i t s
| of t h e m a n t i s s a a r e s e n t t o t h e i n t e g e r u n i t ) .
|
| For t r a p e n a b l e d t h e 0 4 0 d o e s t h e f o l l o w i n g :
| If t h e i n s t i s m o v e _ o u t , t h e n t h e r e s u l t s a r e t h e s a m e a s f o r t r a p
| disabled w i t h t h e e x c e p t i o n p o s t e d . 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 _
| out, t h e d e s t . i s n o t m o d i f i e d , a n d t h e e x c e p t i o n i s p o s t e d .
|
| 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_SNAN : | 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 g e t _ f l i n e
| xref m e m _ w r i t e
| xref r e a l _ s n a n
| xref r e a l _ i n e x
| xref f p s p _ d o n e
| xref r e g _ d e s t
.global fpsp_snan
fpsp_snan :
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 )
|
| Check i f t r a p e n a b l e d
|
btstb #s n a n _ b i t , F P C R _ E N A B L E ( % a 6 )
bnes e n a | I f e n a b l e d , t h e n b r a n c h
bsrl m o v e _ o u t | e l s e S N A N d i s a b l e d
|
| It i s p o s s i b l e t o h a v e a n i n e x1 e x c e p t i o n w i t h t h e
| snan. 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
beq e n d _ s n a n
|
| 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 :
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
|
| SNAN i s e n a b l e d . C h e c k i f i n s t i s m o v e _ o u t .
| Make a n y c o r r e c t i o n s t o t h e 0 4 0 o u t p u t a s n e c e s s a r y .
|
ena :
btstb #5 ,C M D R E G 1 B ( % a6 ) | i f s e t , i n s t i s m o v e o u t
beq n o t _ o u t
bsrl m o v e _ o u t
report_snan :
moveb ( % a7 ) ,V E R _ T M P ( % a6 )
cmpib #V E R _ 40 ,( % a7 ) | t e s t f o r o r i g u n i m p f r a m e
bnes c k _ r e v
moveql #13 ,% d0 | n e e d t o z e r o 1 4 l w o r d s
bras r e p _ c o n
ck_rev :
moveql #11 ,% d0 | n e e d t o z e r o 1 2 l w o r d s
rep_con :
clrl ( % a7 )
loop1 :
clrl - ( % a7 ) | c l e a r a n d d e c a7
dbra % d0 ,l o o p1
moveb V E R _ T M P ( % a6 ) ,( % a7 ) | f o r m a t a b u s y f r a m e
moveb #B U S Y _ S I Z E - 4 ,1 ( % a7 )
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 r e a l _ s n a n
|
| Exit s n a n h a n d l e r b y e x p a n d i n g t h e u n i m p f r a m e i n t o a b u s y f r a m e
|
end_snan :
bclrb #E 1 ,E _ B Y T E ( % a6 )
moveb ( % a7 ) ,V E R _ T M P ( % a6 )
cmpib #V E R _ 40 ,( % a7 ) | t e s t f o r o r i g u n i m p f r a m e
bnes c k _ r e v2
moveql #13 ,% d0 | n e e d t o z e r o 1 4 l w o r d s
bras r e p _ c o n 2
ck_rev2 :
moveql #11 ,% d0 | n e e d t o z e r o 1 2 l w o r d s
rep_con2 :
clrl ( % a7 )
loop2 :
clrl - ( % a7 ) | c l e a r a n d d e c a7
dbra % d0 ,l o o p2
moveb V E R _ T M P ( % a6 ) ,( % a7 ) | f o r m a t a b u s y f r a m e
moveb #B U S Y _ S I Z E - 4 ,1 ( % a7 ) | w r i t e b u s y s i z 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
|
| Move_ o u t
|
move_out :
movel E X C _ E A ( % a6 ) ,% a0 | g e t < e a > f r o m e x c f r a m e
bfextu C M D R E G 1 B ( % a6 ) { #3 : #3 } ,% d0 | m o v e r x f i e l d t o d0 { 2 : 0 }
cmpil #0 ,% d0 | c h e c k f o r l o n g
beqs s t o _ l o n g | b r a n c h i f m o v e _ o u t l o n g
cmpil #4 ,% d0 | c h e c k f o r w o r d
beqs s t o _ w o r d | b r a n c h i f m o v e _ o u t w o r d
cmpil #6 ,% d0 | c h e c k f o r b y t e
beqs s t o _ b y t e | b r a n c h i f m o v e _ o u t b y t e
|
| Not b y t e , w o r d o r l o n g
|
rts
|
| Get t h e 3 2 m o s t s i g n i f i c a n t b i t s o f e t e m p m a n t i s s a
|
sto_long :
movel E T E M P _ H I ( % a6 ) ,% d1
movel #4 ,% d0 | l o a d b y t e c o u n t
|
| Set s i g n a l l i n g n a n b i t
|
bsetl #30 ,% d1
|
| Store t o t h e u s e r s d e s t i n a t i o n a d d r e s s
|
tstl % a0 | c h e c k i f < e a > i s 0
beqs w r t _ d n | d e s t i n a t i o n i s a d a t a r e g i s t e r
movel % d1 ,- ( % a7 ) | m o v e t h e s n a n o n t o t h e s t a c k
movel % a0 ,% a1 | l o a d d e s t a d d r i n t o a1
movel % a7 ,% a0 | l o a d s r c a d d r o f s n a n i n t o a0
bsrl m e m _ w r i t e | w r i t e s n a n t o u s e r m e m o r y
movel ( % a7 ) + ,% d1 | c l e a r o f f s t a c k
rts
|
| Get t h e 1 6 m o s t s i g n i f i c a n t b i t s o f e t e m p m a n t i s s a
|
sto_word :
movel E T E M P _ H I ( % a6 ) ,% d1
movel #2 ,% d0 | l o a d b y t e c o u n t
|
| Set s i g n a l l i n g n a n b i t
|
bsetl #30 ,% d1
|
| Store t o t h e u s e r s d e s t i n a t i o n a d d r e s s
|
tstl % a0 | c h e c k i f < e a > i s 0
beqs w r t _ d n | d e s t i n a t i o n i s a d a t a r e g i s t e r
movel % d1 ,- ( % a7 ) | m o v e t h e s n a n o n t o t h e s t a c k
movel % a0 ,% a1 | l o a d d e s t a d d r i n t o a1
movel % a7 ,% a0 | p o i n t t o l o w w o r d
bsrl m e m _ w r i t e | w r i t e s n a n t o u s e r m e m o r y
movel ( % a7 ) + ,% d1 | c l e a r o f f s t a c k
rts
|
| Get t h e 8 m o s t s i g n i f i c a n t b i t s o f e t e m p m a n t i s s a
|
sto_byte :
movel E T E M P _ H I ( % a6 ) ,% d1
movel #1 ,% d0 | l o a d b y t e c o u n t
|
| Set s i g n a l l i n g n a n b i t
|
bsetl #30 ,% d1
|
| Store t o t h e u s e r s d e s t i n a t i o n a d d r e s s
|
tstl % a0 | c h e c k i f < e a > i s 0
beqs w r t _ d n | d e s t i n a t i o n i s a d a t a r e g i s t e r
movel % d1 ,- ( % a7 ) | m o v e t h e s n a n o n t o t h e s t a c k
movel % a0 ,% a1 | l o a d d e s t a d d r i n t o a1
movel % a7 ,% a0 | p o i n t t o s o u r c e b y t e
bsrl m e m _ w r i t e | w r i t e s n a n t o u s e r m e m o r y
movel ( % a7 ) + ,% d1 | c l e a r o f f s t a c k
rts
|
| wrt_ d n - - - w r i t e t o a d a t a r e g i s t e r
|
| We g e t h e r e w i t h D 1 c o n t a i n i n g t h e d a t a t o w r i t e a n d D 0 t h e
| number o f b y t e s t o w r i t e : 1 =byte ,2 =word ,4 =long .
|
wrt_dn :
movel % d1 ,L _ S C R 1 ( % a6 ) | d a t a
movel % d0 ,- ( % a7 ) | s i z e
bsrl g e t _ f l i n e | r e t u r n s f l i n e w o r d i n d0
movel % d0 ,% d1
andil #0x7 ,% d1 | d1 n o w h o l d s r e g i s t e r n u m b e r
movel ( % s p ) + ,% d0 | g e t o r i g i n a l s i z e
cmpil #4 ,% d0
beqs w r t _ l o n g
cmpil #2 ,% d0
bnes w r t _ b y t e
wrt_word :
orl #0x8 ,% d1
bral r e g _ d e s t
wrt_long :
orl #0x10 ,% d1
bral r e g _ d e s t
wrt_byte :
bral r e g _ d e s t
|
| Check i f i t i s a s r c n a n o r d s t n a n
|
not_out :
movel D T A G ( % a6 ) ,% d0
bfextu % d0 { #0 : #3 } ,% d0 | i s o l a t e d t a g i n l s b s
cmpib #3 ,% d0 | c h e c k f o r n a n i n d e s t i n a t i o n
bnes i s s r c | d e s t i n a t i o n n a n h a s p r i o r i t y
dst_nan :
btstb #6 ,F P T E M P _ H I ( % a6 ) | c h e c k i f d e s t n a n i s a n s n a n
bnes i s s r c | n o , s o c h e c k s o u r c e f o r s n a n
movew F P T E M P _ E X ( % a6 ) ,% d0
bras c o n t
issrc :
movew E T E M P _ E X ( % a6 ) ,% d0
cont :
btstl #15 ,% d0 | t e s t f o r s i g n o f s n a n
beqs c l r _ n e g
bsetb #n e g _ b i t , F P S R _ C C ( % a 6 )
bra r e p o r t _ s n a n
clr_neg :
bclrb #n e g _ b i t , F P S R _ C C ( % a 6 )
bra r e p o r t _ s n a n
| end