2005-04-17 02:20:36 +04:00
|
| x_ f l i n e . s a 3 . 3 1 / 1 0 / 9 1
|
| fpsp_ f l i n e - - - F P S P h a n d l e r f o r f l i n e e x c e p t i o n
|
| First d e t e r m i n e i f t h e e x c e p t i o n i s o n e o f t h e u n i m p l e m e n t e d
| floating p o i n t i n s t r u c t i o n s . I f s o , l e t f p s p _ u n i m p h a n d l e i t .
| Next, d e t e r m i n e i f t h e i n s t r u c t i o n i s a n f m o v e c r w i t h a n o n - z e r o
| < ea> f i e l d . I f s o , h a n d l e h e r e a n d r e t u r n . O t h e r w i s e , i t
| must b e a r e a l F - l i n e e x c e p t i o n .
|
| 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_FLINE : | 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 r e a l _ f l i n e
| xref f p s p _ u n i m p
| xref u n i _ 2
| xref m e m _ r e a d
| xref f p s p _ f m t _ e r r o r
.global fpsp_fline
fpsp_fline :
|
| check f o r u n i m p l e m e n t e d v e c t o r f i r s t . U s e E X C _ V E C - 4 b e c a u s e
| the e q u a t e i s v a l i d o n l y a f t e r a ' l i n k a6 ' h a s p u s h e d o n e m o r e
| long o n t o t h e s t a c k .
|
cmpw #U N I M P _ V E C , E X C _ V E C - 4 ( % a7 )
beql f p s p _ u n i m p
|
| fmovecr w i t h n o n - z e r o < e a > h a n d l i n g h e r e
|
subl #4 ,% a7 | 4 a c c o u n t s f o r 2 - w o r d d i f f e r e n c e
| ;between six word frame (unimp) and
| ;four word frame
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 )
moveal E X C _ P C + 4 ( % a6 ) ,% a0 | g e t a d d r e s s o f f l i n e i n s t r u c t i o n
leal L _ S C R 1 ( % a6 ) ,% a1 | u s e L _ S C R 1 a s s c r a t c h
movel #4 ,% d0
addl #4 ,% a6 | t o o f f s e t t h e s u b . l #4 ,a7 a b o v e s o t h a t
| ;a6 can point correctly to the stack frame
| ;before branching to mem_read
bsrl m e m _ r e a d
subl #4 ,% a6
movel L _ S C R 1 ( % a6 ) ,% d0 | d0 c o n t a i n s t h e f l i n e a n d c o m m a n d w o r d
bfextu % d0 { #4 : #3 } ,% d1 | e x t r a c t c o p r o c e s s o r i d
cmpib #1 ,% d1 | c h e c k i f c p i d =1
bne n o t _ m v c r | e x i t i f n o t
bfextu % d0 { #16 : #6 } ,% d1
cmpib #0x17 ,% d1 | c h e c k i f i t i s a n F M O V E C R e n c o d i n g
bne n o t _ m v c r
| ;if an FMOVECR instruction, fix stack
| ;and go to FPSP_UNIMP
fix_stack :
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
subl #U N I M P _ 40 _ S I Z E - 4 ,% a7 | e m u l a t e a n o r i g f s a v e
moveb #V E R _ 40 ,( % a7 )
moveb #U N I M P _ 40 _ S I Z E - 4 ,1 ( % a7 )
clrw 2 ( % a7 )
bras f i x _ c o n
ck_rev :
cmpib #V E R _ 41 ,( % a7 ) | t e s t f o r r e v u n i m p f r a m e
bnel f p s p _ f m t _ e r r o r | i f n o t $ 4 0 o r $ 4 1 , e x i t w i t h e r r o r
subl #U N I M P _ 41 _ S I Z E - 4 ,% a7 | e m u l a t e a r e v f s a v e
moveb #V E R _ 41 ,( % a7 )
moveb #U N I M P _ 41 _ S I Z E - 4 ,1 ( % a7 )
clrw 2 ( % a7 )
fix_con :
movew E X C _ S R + 4 ( % a6 ) ,E X C _ S R ( % a6 ) | m o v e s t a c k e d s r t o n e w p o s i t i o n
movel E X C _ P C + 4 ( % a6 ) ,E X C _ P C ( % a6 ) | m o v e s t a c k e d p c t o n e w p o s i t i o n
fmovel E X C _ P C ( % a6 ) ,% F P I A R | p o i n t F P I A R t o f l i n e i n s t
movel #4 ,% d1
addl % d1 ,E X C _ P C ( % a6 ) | i n c r e m e n t s t a c k e d p c v a l u e t o n e x t i n s t
movew #0x202c ,E X C _ V E C ( % a6 ) | r e f o r m a t v e c t o r t o u n i m p
clrl E X C _ E A ( % a6 ) | c l e a r t h e E X C _ E A f i e l d
movew % d0 ,C M D R E G 1 B ( % a6 ) | m o v e t h e l o w e r w o r d i n t o C M D R E G 1 B
clrl E _ B Y T E ( % a6 )
bsetb #U F L A G , T _ B Y T E ( % a 6 )
moveml U S E R _ D A ( % a6 ) ,% d0 - % d1 / % a0 - % a1 | r e s t o r e d a t a r e g i s t e r s
bral u n i _ 2
not_mvcr :
moveml U S E R _ D A ( % a6 ) ,% d0 - % d1 / % a0 - % a1 | r e s t o r e d a t a r e g i s t e r s
frestore ( % a7 ) +
unlk % a6
addl #4 ,% a7
bral r e a l _ f l i n e
| end