2005-04-16 15:20:36 -07:00
|
| x_ s t o r e . s a 3 . 2 1 / 2 4 / 9 1
|
| store - - - s t o r e o p e r a n d t o m e m o r y o r r e g i s t e r
|
| Used b y u n d e r f l o w a n d o v e r f l o w h a n d l e r s .
|
| a6 = p o i n t s t o f p v a l u e t o b e s t o r 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-11 17:55:48 -08: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-16 15:20:36 -07:00
X_STORE : | 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
fpreg_mask :
.byte 0 x8 0 ,0 x40 ,0 x20 ,0 x10 ,0 x08 ,0 x04 ,0 x02 ,0 x01
# include " f p s p . h "
| xref m e m _ w r i t e
| xref g e t _ f l i n e
| xref g _ o p c l s
| xref g _ d f m t o u
| xref r e g _ d e s t
.global dest_ext
.global dest_dbl
.global dest_sgl
.global store
store :
btstb #E 3 ,E _ B Y T E ( % a6 )
beqs E 1 _ s t o
E3_sto :
movel C M D R E G 3 B ( % a6 ) ,% d0
bfextu % d0 { #6 : #3 } ,% d0 | i s o l a t e d e s t . r e g f r o m c m d r e g 3 b
sto_fp :
lea f p r e g _ m a s k ,% a1
moveb ( % a1 ,% d0 . w ) ,% d0 | c o n v e r t r e g # t o d y n a m i c r e g i s t e r m a s k
tstb L O C A L _ S G N ( % a0 )
beqs i s _ p o s
bsetb #s i g n _ b i t , L O C A L _ E X ( % a 0 )
is_pos :
fmovemx ( % a0 ) ,% d0 | m o v e t o c o r r e c t r e g i s t e r
|
| if f p0 - f p3 i s b e i n g m o d i f i e d , w e m u s t p u t a c o p y
| in t h e U S E R _ F P n v a r i a b l e o n t h e s t a c k b e c a u s e a l l e x c e p t i o n
| handlers r e s t o r e f p0 - f p3 f r o m t h e r e .
|
cmpb #0x80 ,% d0
bnes n o t _ f p0
fmovemx % f p0 - % f p0 ,U S E R _ F P 0 ( % a6 )
rts
not_fp0 :
cmpb #0x40 ,% d0
bnes n o t _ f p1
fmovemx % f p1 - % f p1 ,U S E R _ F P 1 ( % a6 )
rts
not_fp1 :
cmpb #0x20 ,% d0
bnes n o t _ f p2
fmovemx % f p2 - % f p2 ,U S E R _ F P 2 ( % a6 )
rts
not_fp2 :
cmpb #0x10 ,% d0
bnes n o t _ f p3
fmovemx % f p3 - % f p3 ,U S E R _ F P 3 ( % a6 )
rts
not_fp3 :
rts
E1_sto :
bsrl g _ o p c l s | r e t u r n s o p c l a s s i n d0
cmpib #3 ,% d0
beq o p c01 1 | b r a n c h i f o p c l a s s 3
movel C M D R E G 1 B ( % a6 ) ,% d0
bfextu % d0 { #6 : #3 } ,% d0 | e x t r a c t d e s t i n a t i o n r e g i s t e r
bras s t o _ f p
opc011 :
bsrl g _ d f m t o u | r e t u r n s d e s t f o r m a t i n d0
| ;ext=00, sgl=01, dbl=10
movel % a0 ,% a1 | s a v e s o u r c e a d d r i n a1
movel E X C _ E A ( % a6 ) ,% a0 | g e t t h e a d d r e s s
cmpil #0 ,% d0 | i f d e s t f o r m a t i s e x t e n d e d
beq d e s t _ e x t | t h e n b r a n c h
cmpil #1 ,% d0 | i f d e s t f o r m a t i s s i n g l e
beq d e s t _ s g l | t h e n b r a n c h
|
| fall t h r o u g h t o d e s t _ d b l
|
|
| dest_ d b l - - - w r i t e d o u b l e p r e c i s i o n v a l u e t o u s e r s p a c e
|
| Input
| a0 - > d e s t i n a t i o n a d d r e s s
| a1 - > s o u r c e i n e x t e n d e d p r e c i s i o n
| Output
| a0 - > d e s t r o y e d
| a1 - > d e s t r o y e d
| d0 - > 0
|
| Changes e x t e n d e d p r e c i s i o n t o d o u b l e p r e c i s i o n .
| Note : no a t t e m p t i s m a d e t o r o u n d t h e e x t e n d e d v a l u e t o d o u b l e .
| dbl_ s i g n = e x t _ s i g n
| dbl_ e x p = e x t _ e x p - $ 3 f f f ( e x t b i a s ) + $ 7 f f ( d b l b i a s )
| get r i d o f e x t i n t e g e r b i t
| dbl_ m a n t = e x t _ m a n t { 6 2 : 1 2 }
|
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| extended - > | s | e x p | | 1 | m s m a n t | | l s m a n t |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 9 5 6 4 6 3 6 2 3 2 3 1 1 1 0
| | |
| | |
| | |
| v v
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| double - > | s | e x p | m a n t | | m a n t |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 6 3 5 1 3 2 3 1 0
|
dest_dbl :
clrl % d0 | c l e a r d0
movew L O C A L _ E X ( % a1 ) ,% d0 | g e t e x p o n e n t
subw #0x3fff ,% d0 | s u b t r a c t e x t e n d e d p r e c i s i o n b i a s
cmpw #0x4000 ,% d0 | c h e c k i f i n f
beqs i n f | i f s o , s p e c i a l c a s e
addw #0x3ff ,% d0 | a d d d o u b l e p r e c i s i o n b i a s
swap % d0 | d0 n o w i n u p p e r w o r d
lsll #4 ,% d0 | d0 n o w i n p r o p e r p l a c e f o r d b l p r e c e x p
tstb L O C A L _ S G N ( % a1 )
beqs g e t _ m a n t | i f p o s i t i v e , g o p r o c e s s m a n t i s s a
bsetl #31 ,% d0 | i f n e g a t i v e , p u t i n s i g n i n f o r m a t i o n
| ; before continuing
bras g e t _ m a n t | g o p r o c e s s m a n t i s s a
inf :
movel #0x7ff00000 ,% d0 | l o a d d b l i n f e x p o n e n t
clrl L O C A L _ H I ( % a1 ) | c l e a r m s b
tstb L O C A L _ S G N ( % a1 )
beqs d b l _ i n f | i f p o s i t i v e , g o a h e a d a n d w r i t e i t
bsetl #31 ,% d0 | i f n e g a t i v e p u t i n s i g n i n f o r m a t i o n
dbl_inf :
movel % d0 ,L O C A L _ E X ( % a1 ) | p u t t h e n e w e x p b a c k o n t h e s t a c k
bras d b l _ w r t
get_mant :
movel L O C A L _ H I ( % a1 ) ,% d1 | g e t m s m a n t i s s a
bfextu % d1 { #1 : #20 } ,% d1 | g e t u p p e r 2 0 b i t s o f m s
orl % d1 ,% d0 | p u t t h e s e b i t s i n m s w o r d o f d o u b l e
movel % d0 ,L O C A L _ E X ( % a1 ) | p u t t h e n e w e x p b a c k o n t h e s t a c k
movel L O C A L _ H I ( % a1 ) ,% d1 | g e t m s m a n t i s s a
movel #21 ,% d0 | l o a d s h i f t c o u n t
lsll % d0 ,% d1 | p u t l o w e r 1 1 b i t s i n u p p e r b i t s
movel % d1 ,L O C A L _ H I ( % a1 ) | b u i l d l o w e r l w o r d i n m e m o r y
movel L O C A L _ L O ( % a1 ) ,% d1 | g e t l s m a n t i s s a
bfextu % d1 { #0 : #21 } ,% d0 | g e t l s 2 1 b i t s o f d o u b l e
orl % d0 ,L O C A L _ H I ( % a1 ) | p u t t h e m i n d o u b l e r e s u l t
dbl_wrt :
movel #0x8 ,% d0 | b y t e c o u n t f o r d o u b l e p r e c i s i o n n u m b e r
exg % a0 ,% a1 | a0 =supervisor s o u r c e , a1 =user d e s t
bsrl m e m _ w r i t e | m o v e t h e n u m b e r t o t h e u s e r ' s m e m o r y
rts
|
| dest_ s g l - - - w r i t e s i n g l e p r e c i s i o n v a l u e t o u s e r s p a c e
|
| Input
| a0 - > d e s t i n a t i o n a d d r e s s
| a1 - > s o u r c e i n e x t e n d e d p r e c i s i o n
|
| Output
| a0 - > d e s t r o y e d
| a1 - > d e s t r o y e d
| d0 - > 0
|
| Changes e x t e n d e d p r e c i s i o n t o s i n g l e p r e c i s i o n .
| sgl_ s i g n = e x t _ s i g n
| sgl_ e x p = e x t _ e x p - $ 3 f f f ( e x t b i a s ) + $ 7 f ( s g l b i a s )
| get r i d o f e x t i n t e g e r b i t
| sgl_ m a n t = e x t _ m a n t { 6 2 : 1 2 }
|
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| extended - > | s | e x p | | 1 | m s m a n t | | l s m a n t |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 9 5 6 4 6 3 6 2 4 0 3 2 3 1 1 2 0
| | |
| | |
| | |
| v v
| - - - - - - - - - - - - - - -
| single - > | s | e x p | m a n t |
| - - - - - - - - - - - - - - -
| 3 1 2 2 0
|
dest_sgl :
clrl % d0
movew L O C A L _ E X ( % a1 ) ,% d0 | g e t e x p o n e n t
subw #0x3fff ,% d0 | s u b t r a c t e x t e n d e d p r e c i s i o n b i a s
cmpw #0x4000 ,% d0 | c h e c k i f i n f
beqs s i n f | i f s o , s p e c i a l c a s e
addw #0x7f ,% d0 | a d d s i n g l e p r e c i s i o n b i a s
swap % d0 | p u t e x p i n u p p e r w o r d o f d0
lsll #7 ,% d0 | s h i f t i t i n t o s i n g l e e x p b i t s
tstb L O C A L _ S G N ( % a1 )
beqs g e t _ s m a n | i f p o s i t i v e , c o n t i n u e
bsetl #31 ,% d0 | i f n e g a t i v e , p u t i n s i g n f i r s t
bras g e t _ s m a n | g e t m a n t i s s a
sinf :
movel #0x7f800000 ,% d0 | l o a d s i n g l e i n f e x p t o d0
tstb L O C A L _ S G N ( % a1 )
beqs s g l _ w r t | i f p o s i t i v e , c o n t i n u e
bsetl #31 ,% d0 | i f n e g a t i v e , p u t i n s i g n i n f o
bras s g l _ w r t
get_sman :
movel L O C A L _ H I ( % a1 ) ,% d1 | g e t m s m a n t i s s a
bfextu % d1 { #1 : #23 } ,% d1 | g e t u p p e r 2 3 b i t s o f m s
orl % d1 ,% d0 | p u t t h e s e b i t s i n m s w o r d o f s i n g l e
sgl_wrt :
movel % d0 ,L _ S C R 1 ( % a6 ) | p u t t h e n e w e x p b a c k o n t h e s t a c k
movel #0x4 ,% d0 | b y t e c o u n t f o r s i n g l e p r e c i s i o n n u m b e r
tstl % a0 | u s e r s d e s t i n a t i o n a d d r e s s
beqs s g l _ 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
exg % a0 ,% a1 | a0 =supervisor s o u r c e , a1 =user d e s t
leal L _ S C R 1 ( % a6 ) ,% a0 | p o i n t a0 t o d a t a
bsrl m e m _ w r i t e | m o v e t h e n u m b e r t o t h e u s e r ' s m e m o r y
rts
sgl_Dn :
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
andw #0x7 ,% d0 | i s o l a t e r e g i s t e r n u m b e r
movel % d0 ,% d1 | d1 h a s s i z e : r e g f o r m a t t e d f o r r e g _ d e s t
orl #0x10 ,% d1 | r e g _ d e s t w a n t s s i z e a d d e d t o r e g #
bral r e g _ d e s t | s i z e i s X , r t s i n r e g _ d e s t w i l l
| ;return to caller of dest_sgl
dest_ext :
tstb L O C A L _ S G N ( % a1 ) | p u t b a c k s i g n i n t o e x p o n e n t w o r d
beqs d s t x _ c o n t
bsetb #s i g n _ b i t , L O C A L _ E X ( % a 1 )
dstx_cont :
clrb L O C A L _ S G N ( % a1 ) | c l e a r o u t t h e s i g n b y t e
movel #0x0c ,% d0 | b y t e c o u n t f o r e x t e n d e d n u m b e r
exg % a0 ,% a1 | a0 =supervisor s o u r c e , a1 =user d e s t
bsrl m e m _ w r i t e | m o v e t h e n u m b e r t o t h e u s e r ' s m e m o r y
rts
| end