2005-04-17 02:20:36 +04:00
|
| res_ f u n c . s a 3 . 9 7 / 2 9 / 9 1
|
| Normalizes d e n o r m a l i z e d n u m b e r s i f n e c e s s a r y a n d u p d a t e s t h e
| stack f r a m e . T h e f u n c t i o n i s t h e n r e s t o r e d b a c k i n t o t h e
| machine a n d t h e 0 4 0 c o m p l e t e s t h e o p e r a t i o n . T h i s r o u t i n e
| is o n l y u s e d b y t h e u n s u p p o r t e d d a t a t y p e / f o r m a t h a n d l e r .
| ( Exception v e c t o r 5 5 ) .
|
| For p a c k e d m o v e o u t ( f m o v e . p f p m ,< e a > ) t h e o p e r a t i o n i s
| completed h e r e ; data is packed and moved to user memory.
| The s t a c k i s r e s t o r e d t o t h e 0 4 0 o n l y i n t h e c a s e o f a
| reportable e x c e p t i o n i n t h e c o n v e r s 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
RES_FUNC : | 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 "
sp_bnds : .short 0x3f81 , 0 x4 0 7 e
.short 0 x3 f6 a ,0 x00 0 0
dp_bnds : .short 0x3c01 , 0 x4 3 f e
.short 0 x3 b c d ,0 x00 0 0
| xref m e m _ w r i t e
| xref b i n d e c
| xref g e t _ f l i n e
| xref r o u n d
| xref d e n o r m
| xref d e s t _ e x t
| xref d e s t _ d b l
| xref d e s t _ s g l
| xref u n f _ s u b
| xref n r m _ s e t
| xref d n r m _ l p
| xref o v f _ r e s
| xref r e g _ d e s t
| xref t _ o v f l
| xref t _ u n f l
.global res_func
.global p_move
res_func :
clrb D N R M _ F L G ( % a6 )
clrb R E S _ F L G ( % a6 )
clrb C U _ O N L Y ( % a6 )
tstb D Y _ M O _ F L G ( % a6 )
beqs m o n a d i c
dyadic :
btstb #7 ,D T A G ( % a6 ) | i f d o p = n o r m =000 , z e r o =001 ,
| ;inf=010 or nan=011
beqs m o n a d i c | t h e n b r a n c h
| ;else denorm
| HANDLE D E S T I N A T I O N D E N O R M H E R E
| ;set dtag to norm
| ;write the tag & fpte15 to the fstack
leal F P T E M P ( % a6 ) ,% a0
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 )
bsr n r m _ s e t | n o r m a l i z e n u m b e r ( e x p w i l l g o n e g a t i v e )
bclrb #s i g n _ b i t , L O C A L _ E X ( % a 0 ) | g e t r i d o f f a l s e s i g n
bfclr L O C A L _ S G N ( % a0 ) { #0 : #8 } | c h a n g e b a c k t o I E E E e x t f o r m a t
beqs d p o s
bsetb #s i g n _ b i t , L O C A L _ E X ( % a 0 )
dpos :
bfclr D T A G ( % a6 ) { #0 : #4 } | s e t t a g t o n o r m a l i z e d , F P T E 1 5 = 0
bsetb #4 ,D T A G ( % a6 ) | s e t F P T E 1 5
orb #0x0f ,D N R M _ F L G ( % a6 )
monadic :
leal E T E M P ( % a6 ) ,% a0
btstb #d i r e c t i o n _ b i t , C M D R E G 1 B ( % a6 ) | c h e c k d i r e c t i o n
bne o p c l a s s3 | i t i s a m v o u t
|
| At t h i s p o i n t , o n l y o p c l a s s 0 a n d 2 p o s s i b l e
|
btstb #7 ,S T A G ( % a6 ) | i f s o p = n o r m =000 , z e r o =001 ,
| ;inf=010 or nan=011
bne m o n _ d n r m | e l s e d e n o r m
tstb D Y _ M O _ F L G ( % a6 ) | a l l c a s e s o f d y a d i c i n s t r u c t i o n s w o u l d
bne n o r m a l | r e q u i r e n o r m a l i z a t i o n o f d e n o r m
| At t h i s p o i n t :
| monadic i n s t r u c t i o n s : f a b s = $ 1 8 f n e g = $ 1 a f t s t = $ 3 a
| fmove = $ 0 0 f s m o v e = $ 4 0 f d m o v e = $ 4 4
| fsqrt = $ 0 5 * f s s q r t = $ 4 1 f d s q r t = $ 4 5
| ( * fsqrt r e e n c o d e d t o $ 0 5 )
|
movew C M D R E G 1 B ( % a6 ) ,% d0 | g e t c o m m a n d r e g i s t e r
andil #0x7f ,% d0 | s t r i p t o o n l y c o m m a n d w o r d
|
| At t h i s p o i n t , f a b s , f n e g , f s m o v e , f d m o v e , f t s t , f s q r t , f s s q r t , a n d
| fdsqrt a r e p o s s i b l e .
| For c a s e s f a b s , f n e g , f s m o v e , a n d f d m o v e g o t o s p o s ( d o n o t n o r m a l i z e )
| For c a s e s f s q r t , f s s q r t , a n d f d s q r t g o t o n r m _ s r c ( d o n o r m a l i z e )
|
btstl #0 ,% d0
bne n o r m a l | w e e d o u t f s q r t i n s t r u c t i o n s
|
| cu_ n o r m h a n d l e s f m o v e i n i n s t r u c t i o n s w i t h n o r m a l i z e d i n p u t s .
| The r o u t i n e r o u n d i s u s e d t o c o r r e c t l y r o u n d t h e i n p u t f o r t h e
| destination p r e c i s i o n a n d m o d e .
|
cu_norm :
st C U _ O N L Y ( % a6 ) | s e t c u - o n l y i n s t f l a g
movew C M D R E G 1 B ( % a6 ) ,% d0
andib #0x3b ,% d0 | i s o l a t e b i t s t o s e l e c t i n s t
tstb % d0
beql c u _ n m o v e | i f z e r o , i t i s a n f m o v e
cmpib #0x18 ,% d0
beql c u _ n a b s | i f $ 1 8 , i t i s f a b s
cmpib #0x1a ,% d0
beql c u _ n n e g | i f $ 1 a , i t i s f n e g
|
| Inst i s f t s t . C h e c k t h e s o u r c e o p e r a n d a n d s e t t h e c c ' s a c c o r d i n g l y .
| No w r i t e i s d o n e , s o s i m p l y r t s .
|
cu_ntst :
movew L O C A L _ E X ( % a0 ) ,% d0
bclrl #15 ,% d0
sne L O C A L _ S G N ( % a0 )
beqs c u _ n t p o
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t N
cu_ntpo :
cmpiw #0x7fff ,% d0 | t e s t f o r i n f / n a n
bnes c u _ n t c z
tstl L O C A L _ H I ( % a0 )
bnes c u _ n t n
tstl L O C A L _ L O ( % a0 )
bnes c u _ n t n
orl #i n f _ m a s k , U S E R _ F P S R ( % a 6 )
rts
cu_ntn :
orl #n a n _ m a s k , U S E R _ F P S R ( % a 6 )
movel E T E M P _ E X ( % a6 ) ,F P T E M P _ E X ( % a6 ) | s e t u p f p t e m p s i g n f o r
| ;snan handler
rts
cu_ntcz :
tstl L O C A L _ H I ( % a0 )
bnel c u _ n t s x
tstl L O C A L _ L O ( % a0 )
bnel c u _ n t s x
orl #z _ m a s k , U S E R _ F P S R ( % a 6 )
cu_ntsx :
rts
|
| Inst i s f a b s . E x e c u t e t h e a b s o l u t e v a l u e f u n c t i o n o n t h e i n p u t .
| Branch t o t h e f m o v e c o d e . I f t h e o p e r a n d i s N a N , d o n o t h i n g .
|
cu_nabs :
moveb S T A G ( % a6 ) ,% d0
btstl #5 ,% d0 | t e s t f o r N a N o r z e r o
bne w r _ e t e m p | i f e i t h e r , s i m p l y w r i t e i t
bclrb #7 ,L O C A L _ E X ( % a0 ) | d o a b s
bras c u _ n m o v e | f m o v e c o d e w i l l f i n i s h
|
| Inst i s f n e g . E x e c u t e t h e n e g a t e v a l u e f u n c t i o n o n t h e i n p u t .
| Fall t h o u g h t o t h e f m o v e c o d e . I f t h e o p e r a n d i s N a N , d o n o t h i n g .
|
cu_nneg :
moveb S T A G ( % a6 ) ,% d0
btstl #5 ,% d0 | t e s t f o r N a N o r z e r o
bne w r _ e t e m p | i f e i t h e r , s i m p l y w r i t e i t
bchgb #7 ,L O C A L _ E X ( % a0 ) | d o n e g
|
| Inst i s f m o v e . T h i s c o d e a l s o h a n d l e s a l l r e s u l t w r i t e s .
| If b i t 2 i s s e t , r o u n d i s f o r c e d t o d o u b l e . I f i t i s c l e a r ,
| and b i t 6 i s s e t , r o u n d i s f o r c e d t o s i n g l e . I f b o t h a r e c l e a r ,
| the r o u n d p r e c i s i o n i s f o u n d i n t h e f p c r . I f t h e r o u n d i n g p r e c i s i o n
| is d o u b l e o r s i n g l e , r o u n d t h e r e s u l t b e f o r e t h e w r i t e .
|
cu_nmove :
moveb S T A G ( % a6 ) ,% d0
andib #0xe0 ,% d0 | i s o l a t e s t a g b i t s
bne w r _ e t e m p | i f n o t n o r m , s i m p l y w r i t e i t
btstb #2 ,C M D R E G 1 B + 1 ( % a6 ) | c h e c k f o r r d
bne c u _ n m r d
btstb #6 ,C M D R E G 1 B + 1 ( % a6 ) | c h e c k f o r r s
bne c u _ n m r s
|
| The m o v e o r o p e r a t i o n i s n o t w i t h f o r c e d p r e c i s i o n . T e s t f o r
| nan o r i n f a s t h e i n p u t ; if so, simply write it to FPn. Use the
| FPCR_ M O D E b y t e t o g e t r o u n d i n g o n n o r m s a n d z e r o s .
|
cu_nmnr :
bfextu F P C R _ M O D E ( % a6 ) { #0 : #2 } ,% d0
tstb % d0 | c h e c k f o r e x t e n d e d
beq c u _ w r e x n | i f s o , j u s t w r i t e r e s u l t
cmpib #1 ,% d0 | c h e c k f o r s i n g l e
beq c u _ n m r s | f a l l t h r o u g h t o d o u b l e
|
| The m o v e i s f d m o v e o r r o u n d p r e c i s i o n i s d o u b l e .
|
cu_nmrd :
movel #2 ,% d0 | s e t u p t h e s i z e f o r d e n o r m
movew L O C A L _ E X ( % a0 ) ,% d1 | c o m p a r e e x p o n e n t t o d o u b l e t h r e s h o l d
andw #0x7fff ,% d1
cmpw #0x3c01 ,% d1
bls c u _ n u n f l
bfextu F P C R _ M O D E ( % a6 ) { #2 : #2 } ,% d1 | g e t r m o d e
orl #0x00020000 ,% d1 | o r i n r p r e c ( d o u b l e )
clrl % d0 | c l e a r g ,r ,s f o r r o u n d
bclrb #s i g n _ b i t , L O C A L _ E X ( % a 0 ) | c o n v e r t t o i n t e r n a l f o r m a t
sne L O C A L _ S G N ( % a0 )
bsrl r o u n d
bfclr L O C A L _ S G N ( % a0 ) { #0 : #8 }
beqs c u _ n m r d c
bsetb #s i g n _ b i t , L O C A L _ E X ( % a 0 )
cu_nmrdc :
movew L O C A L _ E X ( % a0 ) ,% d1 | c h e c k f o r o v e r f l o w
andw #0x7fff ,% d1
cmpw #0x43ff ,% d1
bge c u _ n o v f l | t a k e c a r e o f o v e r f l o w c a s e
bra c u _ w r e x n
|
| The m o v e i s f s m o v e o r r o u n d p r e c i s i o n i s s i n g l e .
|
cu_nmrs :
movel #1 ,% d0
movew L O C A L _ E X ( % a0 ) ,% d1
andw #0x7fff ,% d1
cmpw #0x3f81 ,% d1
bls c u _ n u n f l
bfextu F P C R _ M O D E ( % a6 ) { #2 : #2 } ,% d1
orl #0x00010000 ,% d1
clrl % d0
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 r o u n d
bfclr L O C A L _ S G N ( % a0 ) { #0 : #8 }
beqs c u _ n m r s c
bsetb #s i g n _ b i t , L O C A L _ E X ( % a 0 )
cu_nmrsc :
movew L O C A L _ E X ( % a0 ) ,% d1
andw #0x7FFF ,% d1
cmpw #0x407f ,% d1
blt c u _ w r e x n
|
| The o p e r a n d i s a b o v e p r e c i s i o n b o u n d a r i e s . U s e t _ o v f l t o
| generate t h e c o r r e c t v a l u e .
|
cu_novfl :
bsr t _ o v f l
bra c u _ w r e x n
|
| The o p e r a n d i s b e l o w p r e c i s i o n b o u n d a r i e s . U s e d e n o r m t o
| generate t h e c o r r e c t v a l u e .
|
cu_nunfl :
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 )
bsr d e n o r m
bfclr L O C A L _ S G N ( % a0 ) { #0 : #8 } | c h a n g e b a c k t o I E E E e x t f o r m a t
beqs c u _ n u c o n t
bsetb #s i g n _ b i t , L O C A L _ E X ( % a 0 )
cu_nucont :
bfextu F P C R _ M O D E ( % a6 ) { #2 : #2 } ,% d1
btstb #2 ,C M D R E G 1 B + 1 ( % a6 ) | c h e c k f o r r d
bne i n s t _ d
btstb #6 ,C M D R E G 1 B + 1 ( % a6 ) | c h e c k f o r r s
bne i n s t _ s
swap % d1
moveb F P C R _ M O D E ( % a6 ) ,% d1
lsrb #6 ,% d1
swap % d1
bra i n s t _ s d
inst_d :
orl #0x00020000 ,% d1
bra i n s t _ s d
inst_s :
orl #0x00010000 ,% d1
inst_sd :
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 r o u n d
bfclr L O C A L _ S G N ( % a0 ) { #0 : #8 }
beqs c u _ n u f l p
bsetb #s i g n _ b i t , L O C A L _ E X ( % a 0 )
cu_nuflp :
btstb #i n e x 2 _ b i t ,F P S R _ E X C E P T ( % a6 )
beqs c u _ n u n i n x
orl #a u n f l _ m a s k , U S E R _ F P S R ( % a 6 ) | i f t h e r o u n d w a s i n e x , s e t A U N F L
cu_nuninx :
tstl L O C A L _ H I ( % a0 ) | t e s t f o r z e r o
bnes c u _ n u n z r o
tstl L O C A L _ L O ( % a0 )
bnes c u _ n u n z r o
|
| The m a n t i s s a i s z e r o f r o m t h e d e n o r m l o o p . C h e c k s i g n a n d r m o d e
| to s e e i f r o u n d i n g s h o u l d h a v e o c c u r r e d w h i c h w o u l d l e a v e t h e l s b .
|
movel U S E R _ F P C R ( % a6 ) ,% d0
andil #0x30 ,% d0 | i s o l a t e r m o d e
cmpil #0x20 ,% d0
blts c u _ n z r o
bnes c u _ n r p
cu_nrm :
tstw L O C A L _ E X ( % a0 ) | i f p o s i t i v e , s e t l s b
bges c u _ n z r o
btstb #7 ,F P C R _ M O D E ( % a6 ) | c h e c k f o r d o u b l e
beqs c u _ n i n c s
bras c u _ n i n c d
cu_nrp :
tstw L O C A L _ E X ( % a0 ) | i f p o s i t i v e , s e t l s b
blts c u _ n z r o
btstb #7 ,F P C R _ M O D E ( % a6 ) | c h e c k f o r d o u b l e
beqs c u _ n i n c s
cu_nincd :
orl #0x800 ,L O C A L _ L O ( % a0 ) | i n c f o r d o u b l e
bra c u _ n u n z r o
cu_nincs :
orl #0x100 ,L O C A L _ H I ( % a0 ) | i n c f o r s i n g l e
bra c u _ n u n z r o
cu_nzro :
orl #z _ m a s k , U S E R _ F P S R ( % a 6 )
moveb S T A G ( % a6 ) ,% d0
andib #0xe0 ,% d0
cmpib #0x40 ,% d0 | c h e c k i f i n p u t w a s t a g g e d z e r o
beqs c u _ n u m v
cu_nunzro :
orl #u n f l _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t u n f l
cu_numv :
movel ( % a0 ) ,E T E M P ( % a6 )
movel 4 ( % a0 ) ,E T E M P _ H I ( % a6 )
movel 8 ( % a0 ) ,E T E M P _ L O ( % a6 )
|
| Write t h e r e s u l t t o m e m o r y , s e t t i n g t h e f p s r c c b i t s . N a N a n d I n f
| bypass c u _ w r e x n .
|
cu_wrexn :
tstw L O C A L _ E X ( % a0 ) | t e s t f o r z e r o
beqs c u _ w r z e r o
cmpw #0x8000 ,L O C A L _ E X ( % a0 ) | t e s t f o r z e r o
bnes c u _ w r e o n
cu_wrzero :
orl #z _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t Z b i t
cu_wreon :
tstw L O C A L _ E X ( % a0 )
bpl w r _ e t e m p
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 )
bra w r _ e t e m p
|
| HANDLE S O U R C E D E N O R M H E R E
|
| ;clear denorm stag to norm
| ;write the new tag & ete15 to the fstack
mon_dnrm :
|
| At t h i s p o i n t , c h e c k f o r t h e c a s e s i n w h i c h n o r m a l i z i n g t h e
| denorm p r o d u c e s i n c o r r e c t r e s u l t s .
|
tstb D Y _ M O _ F L G ( % a6 ) | a l l c a s e s o f d y a d i c i n s t r u c t i o n s w o u l d
bnes n r m _ s r c | r e q u i r e n o r m a l i z a t i o n o f d e n o r m
| At t h i s p o i n t :
| monadic i n s t r u c t i o n s : f a b s = $ 1 8 f n e g = $ 1 a f t s t = $ 3 a
| fmove = $ 0 0 f s m o v e = $ 4 0 f d m o v e = $ 4 4
| fsqrt = $ 0 5 * f s s q r t = $ 4 1 f d s q r t = $ 4 5
| ( * fsqrt r e e n c o d e d t o $ 0 5 )
|
movew C M D R E G 1 B ( % a6 ) ,% d0 | g e t c o m m a n d r e g i s t e r
andil #0x7f ,% d0 | s t r i p t o o n l y c o m m a n d w o r d
|
| At t h i s p o i n t , f a b s , f n e g , f s m o v e , f d m o v e , f t s t , f s q r t , f s s q r t , a n d
| fdsqrt a r e p o s s i b l e .
| For c a s e s f a b s , f n e g , f s m o v e , a n d f d m o v e g o t o s p o s ( d o n o t n o r m a l i z e )
| For c a s e s f s q r t , f s s q r t , a n d f d s q r t g o t o n r m _ s r c ( d o n o r m a l i z e )
|
btstl #0 ,% d0
bnes n r m _ s r c | w e e d o u t f s q r t i n s t r u c t i o n s
st C U _ O N L Y ( % a6 ) | s e t c u - o n l y i n s t f l a g
bra c u _ d n r m | f m o v e , f a b s , f n e g , f t s t
| ;cases go to cu_dnrm
nrm_src :
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 )
bsr n r m _ s e t | n o r m a l i z e n u m b e r ( e x p o n e n t w i l l g o
| ; negative)
bclrb #s i g n _ b i t , L O C A L _ E X ( % a 0 ) | g e t r i d o f f a l s e s i g n
bfclr L O C A L _ S G N ( % a0 ) { #0 : #8 } | c h a n g e b a c k t o I E E E e x t f o r m a t
beqs s p o s
bsetb #s i g n _ b i t , L O C A L _ E X ( % a 0 )
spos :
bfclr S T A G ( % a6 ) { #0 : #4 } | s e t t a g t o n o r m a l i z e d , F P T E 1 5 = 0
bsetb #4 ,S T A G ( % a6 ) | s e t E T E 1 5
orb #0xf0 ,D N R M _ F L G ( % a6 )
normal :
tstb D N R M _ F L G ( % a6 ) | c h e c k i f a n y o f t h e o p s w e r e d e n o r m s
bne c k _ w r a p | i f s o , c h e c k i f i t i s a p o t e n t i a l
| ;wrap-around case
fix_stk :
moveb #0xfe ,C U _ S A V E P C ( % a6 )
bclrb #E 1 ,E _ B Y T E ( % a6 )
clrw N M N E X C ( % a6 )
st R E S _ F L G ( % a6 ) | i n d i c a t e t h a t a r e s t o r e i s n e e d e d
rts
|
| cu_ d n r m h a n d l e s a l l c u - o n l y i n s t r u c t i o n s ( f m o v e , f a b s , f n e g , a n d
| ftst) c o m p l e t e l y i n s o f t w a r e w i t h o u t a n f r e s t o r e t o t h e 0 4 0 .
|
cu_dnrm :
st C U _ O N L Y ( % a6 )
movew C M D R E G 1 B ( % a6 ) ,% d0
andib #0x3b ,% d0 | i s o l a t e b i t s t o s e l e c t i n s t
tstb % d0
beql c u _ d m o v e | i f z e r o , i t i s a n f m o v e
cmpib #0x18 ,% d0
beql c u _ d a b s | i f $ 1 8 , i t i s f a b s
cmpib #0x1a ,% d0
beql c u _ d n e g | i f $ 1 a , i t i s f n e g
|
| Inst i s f t s t . C h e c k t h e s o u r c e o p e r a n d a n d s e t t h e c c ' s a c c o r d i n g l y .
| No w r i t e i s d o n e , s o s i m p l y r t s .
|
cu_dtst :
movew L O C A L _ E X ( % a0 ) ,% d0
bclrl #15 ,% d0
sne L O C A L _ S G N ( % a0 )
beqs c u _ d t p o
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t N
cu_dtpo :
cmpiw #0x7fff ,% d0 | t e s t f o r i n f / n a n
bnes c u _ d t c z
tstl L O C A L _ H I ( % a0 )
bnes c u _ d t n
tstl L O C A L _ L O ( % a0 )
bnes c u _ d t n
orl #i n f _ m a s k , U S E R _ F P S R ( % a 6 )
rts
cu_dtn :
orl #n a n _ m a s k , U S E R _ F P S R ( % a 6 )
movel E T E M P _ E X ( % a6 ) ,F P T E M P _ E X ( % a6 ) | s e t u p f p t e m p s i g n f o r
| ;snan handler
rts
cu_dtcz :
tstl L O C A L _ H I ( % a0 )
bnel c u _ d t s x
tstl L O C A L _ L O ( % a0 )
bnel c u _ d t s x
orl #z _ m a s k , U S E R _ F P S R ( % a 6 )
cu_dtsx :
rts
|
| Inst i s f a b s . E x e c u t e t h e a b s o l u t e v a l u e f u n c t i o n o n t h e i n p u t .
| Branch t o t h e f m o v e c o d e .
|
cu_dabs :
bclrb #7 ,L O C A L _ E X ( % a0 ) | d o a b s
bras c u _ d m o v e | f m o v e c o d e w i l l f i n i s h
|
| Inst i s f n e g . E x e c u t e t h e n e g a t e v a l u e f u n c t i o n o n t h e i n p u t .
| Fall t h o u g h t o t h e f m o v e c o d e .
|
cu_dneg :
bchgb #7 ,L O C A L _ E X ( % a0 ) | d o n e g
|
| Inst i s f m o v e . T h i s c o d e a l s o h a n d l e s a l l r e s u l t w r i t e s .
| If b i t 2 i s s e t , r o u n d i s f o r c e d t o d o u b l e . I f i t i s c l e a r ,
| and b i t 6 i s s e t , r o u n d i s f o r c e d t o s i n g l e . I f b o t h a r e c l e a r ,
| the r o u n d p r e c i s i o n i s f o u n d i n t h e f p c r . I f t h e r o u n d i n g p r e c i s i o n
| is d o u b l e o r s i n g l e , t h e r e s u l t i s z e r o , a n d t h e m o d e i s c h e c k e d
| to d e t e r m i n e i f t h e l s b o f t h e r e s u l t s h o u l d b e s e t .
|
cu_dmove :
btstb #2 ,C M D R E G 1 B + 1 ( % a6 ) | c h e c k f o r r d
bne c u _ d m r d
btstb #6 ,C M D R E G 1 B + 1 ( % a6 ) | c h e c k f o r r s
bne c u _ d m r s
|
| The m o v e o r o p e r a t i o n i s n o t w i t h f o r c e d p r e c i s i o n . U s e t h e
| FPCR_ M O D E b y t e t o g e t r o u n d i n g .
|
cu_dmnr :
bfextu F P C R _ M O D E ( % a6 ) { #0 : #2 } ,% d0
tstb % d0 | c h e c k f o r e x t e n d e d
beq c u _ w r e x d | i f s o , j u s t w r i t e r e s u l t
cmpib #1 ,% d0 | c h e c k f o r s i n g l e
beq c u _ d m r s | f a l l t h r o u g h t o d o u b l e
|
| The m o v e i s f d m o v e o r r o u n d p r e c i s i o n i s d o u b l e . R e s u l t i s z e r o .
| Check r m o d e f o r r p o r r m a n d s e t l s b a c c o r d i n g l y .
|
cu_dmrd :
bfextu F P C R _ M O D E ( % a6 ) { #2 : #2 } ,% d1 | g e t r m o d e
tstw L O C A L _ E X ( % a0 ) | c h e c k s i g n
blts c u _ d m d n
cmpib #3 ,% d1 | c h e c k f o r r p
bne c u _ d p d | l o a d d o u b l e p o s z e r o
bra c u _ d p d r | l o a d d o u b l e p o s z e r o w / l s b
cu_dmdn :
cmpib #2 ,% d1 | c h e c k f o r r m
bne c u _ d n d | l o a d d o u b l e n e g z e r o
bra c u _ d n d r | l o a d d o u b l e n e g z e r o w / l s b
|
| The m o v e i s f s m o v e o r r o u n d p r e c i s i o n i s s i n g l e . R e s u l t i s z e r o .
| Check f o r r p o r r m a n d s e t l s b a c c o r d i n g l y .
|
cu_dmrs :
bfextu F P C R _ M O D E ( % a6 ) { #2 : #2 } ,% d1 | g e t r m o d e
tstw L O C A L _ E X ( % a0 ) | c h e c k s i g n
blts c u _ d m s n
cmpib #3 ,% d1 | c h e c k f o r r p
bne c u _ s p d | l o a d s i n g l e p o s z e r o
bra c u _ s p d r | l o a d s i n g l e p o s z e r o w / l s b
cu_dmsn :
cmpib #2 ,% d1 | c h e c k f o r r m
bne c u _ s n d | l o a d s i n g l e n e g z e r o
bra c u _ s n d r | l o a d s i n g l e n e g z e r o w / l s b
|
| The p r e c i s i o n i s e x t e n d e d , s o t h e r e s u l t i n e t e m p i s c o r r e c t .
| Simply s e t u n f l ( n o t i n e x2 o r a u n f l ) a n d w r i t e t h e r e s u l t t o
| the c o r r e c t f p r e g i s t e r .
cu_wrexd :
orl #u n f l _ m a s k , U S E R _ F P S R ( % a 6 )
tstw L O C A L _ E X ( % a0 )
beq w r _ e t e m p
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 )
bra w r _ e t e m p
|
| These r o u t i n e s w r i t e + / - z e r o i n d o u b l e f o r m a t . T h e r o u t i n e s
| cu_ d p d r a n d c u _ d n d r s e t t h e d o u b l e l s b .
|
cu_dpd :
movel #0x3c010000 ,L O C A L _ E X ( % a0 ) | f o r c e p o s d o u b l e z e r o
clrl L O C A L _ H I ( % a0 )
clrl L O C A L _ L O ( % a0 )
orl #z _ m a s k , U S E R _ F P S R ( % a 6 )
orl #u n f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
bra w r _ e t e m p
cu_dpdr :
movel #0x3c010000 ,L O C A L _ E X ( % a0 ) | f o r c e p o s d o u b l e z e r o
clrl L O C A L _ H I ( % a0 )
movel #0x800 ,L O C A L _ L O ( % a0 ) | w i t h l s b s e t
orl #u n f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
bra w r _ e t e m p
cu_dnd :
movel #0xbc010000 ,L O C A L _ E X ( % a0 ) | f o r c e p o s d o u b l e z e r o
clrl L O C A L _ H I ( % a0 )
clrl L O C A L _ L O ( % a0 )
orl #z _ m a s k , U S E R _ F P S R ( % a 6 )
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 )
orl #u n f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
bra w r _ e t e m p
cu_dndr :
movel #0xbc010000 ,L O C A L _ E X ( % a0 ) | f o r c e p o s d o u b l e z e r o
clrl L O C A L _ H I ( % a0 )
movel #0x800 ,L O C A L _ L O ( % a0 ) | w i t h l s b s e t
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 )
orl #u n f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
bra w r _ e t e m p
|
| These r o u t i n e s w r i t e + / - z e r o i n s i n g l e f o r m a t . T h e r o u t i n e s
| cu_ d p d r a n d c u _ d n d r s e t t h e s i n g l e l s b .
|
cu_spd :
movel #0x3f810000 ,L O C A L _ E X ( % a0 ) | f o r c e p o s s i n g l e z e r o
clrl L O C A L _ H I ( % a0 )
clrl L O C A L _ L O ( % a0 )
orl #z _ m a s k , U S E R _ F P S R ( % a 6 )
orl #u n f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
bra w r _ e t e m p
cu_spdr :
movel #0x3f810000 ,L O C A L _ E X ( % a0 ) | f o r c e p o s s i n g l e z e r o
movel #0x100 ,L O C A L _ H I ( % a0 ) | w i t h l s b s e t
clrl L O C A L _ L O ( % a0 )
orl #u n f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
bra w r _ e t e m p
cu_snd :
movel #0xbf810000 ,L O C A L _ E X ( % a0 ) | f o r c e p o s s i n g l e z e r o
clrl L O C A L _ H I ( % a0 )
clrl L O C A L _ L O ( % a0 )
orl #z _ m a s k , U S E R _ F P S R ( % a 6 )
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 )
orl #u n f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
bra w r _ e t e m p
cu_sndr :
movel #0xbf810000 ,L O C A L _ E X ( % a0 ) | f o r c e p o s s i n g l e z e r o
movel #0x100 ,L O C A L _ H I ( % a0 ) | w i t h l s b s e t
clrl L O C A L _ L O ( % a0 )
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 )
orl #u n f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
bra w r _ e t e m p
|
| This c o d e c h e c k s f o r 1 6 - b i t o v e r f l o w c o n d i t i o n s o n d y a d i c
| operations w h i c h a r e n o t r e s t o r a b l e i n t o t h e f l o a t i n g - p o i n t
| unit a n d m u s t b e c o m p l e t e d i n s o f t w a r e . B a s i c a l l y , t h i s
| condition e x i s t s w i t h a v e r y l a r g e n o r m a n d a d e n o r m . O n e
| of t h e o p e r a n d s m u s t b e d e n o r m a l i z e d t o e n t e r t h i s c o d e .
|
| Flags u s e d :
| DY_ M O _ F L G c o n t a i n s 0 f o r m o n a d i c o p , $ f f f o r d y a d i c
| DNRM_ F L G c o n t a i n s $ 0 0 f o r n e i t h e r o p d e n o r m a l i z e d
| $ 0 f f o r t h e d e s t i n a t i o n o p d e n o r m a l i z e d
| $ f0 f o r t h e s o u r c e o p d e n o r m a l i z e d
| $ ff f o r b o t h o p s d e n o r m a l i z e d
|
| The w r a p - a r o u n d c o n d i t i o n o c c u r s f o r a d d , s u b , d i v , a n d c m p
| when
|
| abs( d e s t _ e x p - s r c _ e x p ) > = $ 8 0 0 0
|
| and f o r m u l w h e n
|
| ( dest_ e x p + s r c _ e x p ) < $ 0
|
| we m u s t p r o c e s s t h e o p e r a t i o n h e r e i f t h i s c a s e i s t r u e .
|
| The r t s f o l l o w i n g t h e f r c f p n r o u t i n e i s t h e e x i t f r o m r e s _ f u n c
| for t h i s c o n d i t i o n . T h e r e s t o r e f l a g ( R E S _ F L G ) i s l e f t c l e a r .
| No f r e s t o r e i s d o n e u n l e s s a n e x c e p t i o n i s t o b e r e p o r t e d .
|
| For f a d d :
| if( s i g n _ o f ( d e s t ) ! = s i g n _ o f ( s r c ) )
| replace e x p o n e n t o f s r c w i t h $ 3 f f f ( k e e p s i g n )
| use f p u t o p e r f o r m d e s t + n e w _ s r c ( u s e r ' s r m o d e a n d X )
| clr s t i c k y
| else
| set s t i c k y
| call r o u n d w i t h u s e r ' s p r e c i s i o n a n d m o d e
| move r e s u l t t o f p n a n d w b t e m p
|
| For f s u b :
| if( s i g n _ o f ( d e s t ) = = s i g n _ o f ( s r c ) )
| replace e x p o n e n t o f s r c w i t h $ 3 f f f ( k e e p s i g n )
| use f p u t o p e r f o r m d e s t + n e w _ s r c ( u s e r ' s r m o d e a n d X )
| clr s t i c k y
| else
| set s t i c k y
| call r o u n d w i t h u s e r ' s p r e c i s i o n a n d m o d e
| move r e s u l t t o f p n a n d w b t e m p
|
| For f d i v / f s g l d i v :
| if( b o t h o p e r a n d s a r e d e n o r m )
| restore_ t o _ f p u ;
| if( d e s t i s n o r m )
| force_ o v f ;
| else( d e s t i s d e n o r m )
| force_unf :
|
| For f c m p :
| if( d e s t i s n o r m )
| N = s i g n _ o f ( d e s t ) ;
| else( d e s t i s d e n o r m )
| N = s i g n _ o f ( s r c ) ;
|
| For f m u l :
| if( b o t h o p e r a n d s a r e d e n o r m )
| force_ u n f ;
| if( ( d e s t _ e x p + s r c _ e x p ) < 0 )
| force_unf :
| else
| restore_ t o _ f p u ;
|
| local e q u a t e s :
.set addcode,0 x22
.set subcode,0 x28
.set mulcode,0 x23
.set divcode,0 x20
.set cmpcode,0 x38
ck_wrap :
| tstb D Y _ M O _ F L G ( % a6 ) ;check for fsqrt
beq f i x _ s t k | i f z e r o , i t i s f s q r t
movew C M D R E G 1 B ( % a6 ) ,% d0
andiw #0x3b ,% d0 | s t r i p t o c o m m a n d b i t s
cmpiw #a d d c o d e , % d 0
beq w r a p _ a d d
cmpiw #s u b c o d e , % d 0
beq w r a p _ s u b
cmpiw #m u l c o d e , % d 0
beq w r a p _ m u l
cmpiw #c m p c o d e , % d 0
beq w r a p _ c m p
|
| Inst i s f d i v .
|
wrap_div :
cmpb #0xff ,D N R M _ F L G ( % a6 ) | i f b o t h o p s d e n o r m ,
beq f i x _ s t k | r e s t o r e t o f p u
|
| One o f t h e o p s i s d e n o r m a l i z e d . T e s t f o r w r a p c o n d i t i o n
| and f o r c e t h e r e s u l t .
|
cmpb #0x0f ,D N R M _ F L G ( % a6 ) | c h e c k f o r d e s t d e n o r m
bnes d i v _ s r c d
div_destd :
bsrl c k i n f _ n s
bne f i x _ s t k
bfextu E T E M P _ E X ( % a6 ) { #1 : #15 } ,% d0 | g e t s r c e x p ( a l w a y s p o s )
bfexts F P T E M P _ E X ( % a6 ) { #1 : #15 } ,% d1 | g e t d e s t e x p ( a l w a y s n e g )
subl % d1 ,% d0 | s u b t r a c t d e s t f r o m s r c
cmpl #0x7fff ,% d0
blt f i x _ s t k | i f l e s s , n o t w r a p c a s e
clrb W B T E M P _ S G N ( % a6 )
movew E T E M P _ E X ( % a6 ) ,% d0 | f i n d t h e s i g n o f t h e r e s u l t
movew F P T E M P _ E X ( % a6 ) ,% d1
eorw % d1 ,% d0
andiw #0x8000 ,% d0
beq f o r c e _ u n f
st W B T E M P _ S G N ( % a6 )
bra f o r c e _ u n f
ckinf_ns :
moveb S T A G ( % a6 ) ,% d0 | c h e c k s o u r c e t a g f o r i n f o r n a n
bra c k _ i n _ c o m
ckinf_nd :
moveb D T A G ( % a6 ) ,% d0 | c h e c k d e s t i n a t i o n t a g f o r i n f o r n a n
ck_in_com :
andib #0x60 ,% d0 | i s o l a t e t a g b i t s
cmpb #0x40 ,% d0 | i s i t i n f ?
beq n a n _ o r _ i n f | n o t w r a p c a s e
cmpb #0x60 ,% d0 | i s i t n a n ?
beq n a n _ o r _ i n f | y e s , n o t w r a p c a s e ?
cmpb #0x20 ,% d0 | i s i t a z e r o ?
beq n a n _ o r _ i n f | y e s
clrl % d0
rts | t h e n ; it is either a zero of norm,
| ;check wrap case
nan_or_inf :
moveql #- 1 ,% d0
rts
div_srcd :
bsrl c k i n f _ n d
bne f i x _ s t k
bfextu F P T E M P _ E X ( % a6 ) { #1 : #15 } ,% d0 | g e t d e s t e x p ( a l w a y s p o s )
bfexts E T E M P _ E X ( % a6 ) { #1 : #15 } ,% d1 | g e t s r c e x p ( a l w a y s n e g )
subl % d1 ,% d0 | s u b t r a c t s r c f r o m d e s t
cmpl #0x8000 ,% d0
blt f i x _ s t k | i f l e s s , n o t w r a p c a s e
clrb W B T E M P _ S G N ( % a6 )
movew E T E M P _ E X ( % a6 ) ,% d0 | f i n d t h e s i g n o f t h e r e s u l t
movew F P T E M P _ E X ( % a6 ) ,% d1
eorw % d1 ,% d0
andiw #0x8000 ,% d0
beqs f o r c e _ o v f
st W B T E M P _ S G N ( % a6 )
|
| This c o d e h a n d l e s t h e c a s e o f t h e i n s t r u c t i o n r e s u l t i n g i n
| an o v e r f l o w c o n d i t i o n .
|
force_ovf :
bclrb #E 1 ,E _ B Y T E ( % a6 )
orl #o v f l _ i n x _ m a s k , U S E R _ F P S R ( % a 6 )
clrw N M N E X C ( % a6 )
leal W B T E M P ( % a6 ) ,% a0 | p o i n t a0 t o m e m o r y l o c a t i o n
movew C M D R E G 1 B ( % a6 ) ,% d0
btstl #6 ,% d0 | t e s t f o r f o r c e d p r e c i s i o n
beqs f r c o v f _ f p c r
btstl #2 ,% d0 | c h e c k f o r d o u b l e
bnes f r c o v f _ d b l
movel #0x1 ,% d0 | i n s t i s f o r c e d s i n g l e
bras f r c o v f _ r n d
frcovf_dbl :
movel #0x2 ,% d0 | i n s t i s f o r c e d d o u b l e
bras f r c o v f _ r n d
frcovf_fpcr :
bfextu F P C R _ M O D E ( % a6 ) { #0 : #2 } ,% d0 | i n s t n o t f o r c e d - u s e f p c r p r e c
frcovf_rnd :
| The 8 8 1 / 8 8 2 d o e s n o t s e t i n e x2 f o r t h e f o l l o w i n g c a s e , s o t h e
| line i s c o m m e n t e d o u t t o b e c o m p a t i b l e w i t h 8 8 1 / 8 8 2
| tst. b % d0
| beq. b f r c o v f _ x
| or. l #i n e x 2 _ m a s k ,U S E R _ F P S R ( % a6 ) ;if prec is s or d, set inex2
| frcovf_x :
bsrl o v f _ r e s | g e t c o r r e c t r e s u l t b a s e d o n
| ;round precision/mode. This
| ;sets FPSR_CC correctly
| ;returns in external format
bfclr W B T E M P _ S G N ( % a6 ) { #0 : #8 }
beq f r c f p n
bsetb #s i g n _ b i t , W B T E M P _ E X ( % a 6 )
bra f r c f p n
|
| Inst i s f a d d .
|
wrap_add :
cmpb #0xff ,D N R M _ F L G ( % a6 ) | i f b o t h o p s d e n o r m ,
beq f i x _ s t k | r e s t o r e t o f p u
|
| One o f t h e o p s i s d e n o r m a l i z e d . T e s t f o r w r a p c o n d i t i o n
| and c o m p l e t e t h e i n s t r u c t i o n .
|
cmpb #0x0f ,D N R M _ F L G ( % a6 ) | c h e c k f o r d e s t d e n o r m
bnes a d d _ s r c d
add_destd :
bsrl c k i n f _ n s
bne f i x _ s t k
bfextu E T E M P _ E X ( % a6 ) { #1 : #15 } ,% d0 | g e t s r c e x p ( a l w a y s p o s )
bfexts F P T E M P _ E X ( % a6 ) { #1 : #15 } ,% d1 | g e t d e s t e x p ( a l w a y s n e g )
subl % d1 ,% d0 | s u b t r a c t d e s t f r o m s r c
cmpl #0x8000 ,% d0
blt f i x _ s t k | i f l e s s , n o t w r a p c a s e
bra a d d _ w r a p
add_srcd :
bsrl c k i n f _ n d
bne f i x _ s t k
bfextu F P T E M P _ E X ( % a6 ) { #1 : #15 } ,% d0 | g e t d e s t e x p ( a l w a y s p o s )
bfexts E T E M P _ E X ( % a6 ) { #1 : #15 } ,% d1 | g e t s r c e x p ( a l w a y s n e g )
subl % d1 ,% d0 | s u b t r a c t s r c f r o m d e s t
cmpl #0x8000 ,% d0
blt f i x _ s t k | i f l e s s , n o t w r a p c a s e
|
| Check t h e s i g n s o f t h e o p e r a n d s . I f t h e y a r e u n l i k e , t h e f p u
| can b e u s e d t o a d d t h e n o r m a n d 1 . 0 w i t h t h e s i g n o f t h e
| denorm a n d i t w i l l c o r r e c t l y g e n e r a t e t h e r e s u l t i n e x t e n d e d
| precision. W e c a n t h e n c a l l r o u n d w i t h n o s t i c k y a n d t h e r e s u l t
| will b e c o r r e c t f o r t h e u s e r ' s r o u n d i n g m o d e a n d p r e c i s i o n . I f
| the s i g n s a r e t h e s a m e , w e c a l l r o u n d w i t h t h e s t i c k y b i t s e t
| and t h e r e s u l t w i l l b e c o r r e c t f o r t h e u s e r ' s r o u n d i n g m o d e a n d
| precision.
|
add_wrap :
movew E T E M P _ E X ( % a6 ) ,% d0
movew F P T E M P _ E X ( % a6 ) ,% d1
eorw % d1 ,% d0
andiw #0x8000 ,% d0
beq a d d _ s a m e
|
| The s i g n s a r e u n l i k e .
|
cmpb #0x0f ,D N R M _ F L G ( % a6 ) | i s d e s t t h e d e n o r m ?
bnes a d d _ u _ s r c d
movew F P T E M P _ E X ( % a6 ) ,% d0
andiw #0x8000 ,% d0
orw #0x3fff ,% d0 | f o r c e t h e e x p o n e n t t o + / - 1
movew % d0 ,F P T E M P _ E X ( % a6 ) | i n t h e d e n o r m
movel U S E R _ F P C R ( % a6 ) ,% d0
andil #0x30 ,% d0
fmovel % d0 ,% f p c r | s e t u p u s e r s r m o d e a n d X
fmovex E T E M P ( % a6 ) ,% f p0
faddx F P T E M P ( % a6 ) ,% f p0
leal W B T E M P ( % a6 ) ,% a0 | p o i n t a0 t o w b t e m p i n f r a m e
fmovel % f p s r ,% d1
orl % d1 ,U S E R _ F P S R ( % a6 ) | c a p t u r e c c ' s a n d i n e x f r o m f a d d
fmovex % f p0 ,W B T E M P ( % a6 ) | w r i t e r e s u l t t o m e m o r y
lsrl #4 ,% d0 | p u t r m o d e i n l o w e r 2 b i t s
movel U S E R _ F P C R ( % a6 ) ,% d1
andil #0xc0 ,% d1
lsrl #6 ,% d1 | p u t p r e c i s i o n i n u p p e r w o r d
swap % d1
orl % d0 ,% d1 | s e t u p f o r r o u n d c a l l
clrl % d0 | f o r c e s t i c k y t o z e r o
bclrb #s i g n _ b i t , W B T E M P _ E X ( % a 6 )
sne W B T E M P _ S G N ( % a6 )
bsrl r o u n d | r o u n d r e s u l t t o u s e r s r m o d e & p r e c
bfclr W B T E M P _ S G N ( % a6 ) { #0 : #8 } | c o n v e r t b a c k t o I E E E e x t f o r m a t
beq f r c f p n r
bsetb #s i g n _ b i t , W B T E M P _ E X ( % a 6 )
bra f r c f p n r
add_u_srcd :
movew E T E M P _ E X ( % a6 ) ,% d0
andiw #0x8000 ,% d0
orw #0x3fff ,% d0 | f o r c e t h e e x p o n e n t t o + / - 1
movew % d0 ,E T E M P _ E X ( % a6 ) | i n t h e d e n o r m
movel U S E R _ F P C R ( % a6 ) ,% d0
andil #0x30 ,% d0
fmovel % d0 ,% f p c r | s e t u p u s e r s r m o d e a n d X
fmovex E T E M P ( % a6 ) ,% f p0
faddx F P T E M P ( % a6 ) ,% f p0
fmovel % f p s r ,% d1
orl % d1 ,U S E R _ F P S R ( % a6 ) | c a p t u r e c c ' s a n d i n e x f r o m f a d d
leal W B T E M P ( % a6 ) ,% a0 | p o i n t a0 t o w b t e m p i n f r a m e
fmovex % f p0 ,W B T E M P ( % a6 ) | w r i t e r e s u l t t o m e m o r y
lsrl #4 ,% d0 | p u t r m o d e i n l o w e r 2 b i t s
movel U S E R _ F P C R ( % a6 ) ,% d1
andil #0xc0 ,% d1
lsrl #6 ,% d1 | p u t p r e c i s i o n i n u p p e r w o r d
swap % d1
orl % d0 ,% d1 | s e t u p f o r r o u n d c a l l
clrl % d0 | f o r c e s t i c k y t o z e r o
bclrb #s i g n _ b i t , W B T E M P _ E X ( % a 6 )
sne W B T E M P _ S G N ( % a6 ) | u s e i n t e r n a l f o r m a t f o r r o u n d
bsrl r o u n d | r o u n d r e s u l t t o u s e r s r m o d e & p r e c
bfclr W B T E M P _ S G N ( % a6 ) { #0 : #8 } | c o n v e r t b a c k t o I E E E e x t f o r m a t
beq f r c f p n r
bsetb #s i g n _ b i t , W B T E M P _ E X ( % a 6 )
bra f r c f p n r
|
| Signs a r e a l i k e :
|
add_same :
cmpb #0x0f ,D N R M _ F L G ( % a6 ) | i s d e s t t h e d e n o r m ?
bnes a d d _ s _ s r c d
add_s_destd :
leal E T E M P ( % a6 ) ,% a0
movel U S E R _ F P C R ( % a6 ) ,% d0
andil #0x30 ,% d0
lsrl #4 ,% d0 | p u t r m o d e i n l o w e r 2 b i t s
movel U S E R _ F P C R ( % a6 ) ,% d1
andil #0xc0 ,% d1
lsrl #6 ,% d1 | p u t p r e c i s i o n i n u p p e r w o r d
swap % d1
orl % d0 ,% d1 | s e t u p f o r r o u n d c a l l
movel #0x20000000 ,% d0 | s e t s t i c k y f o r r o u n d
bclrb #s i g n _ b i t , E T E M P _ E X ( % a 6 )
sne E T E M P _ S G N ( % a6 )
bsrl r o u n d | r o u n d r e s u l t t o u s e r s r m o d e & p r e c
bfclr E T E M P _ S G N ( % a6 ) { #0 : #8 } | c o n v e r t b a c k t o I E E E e x t f o r m a t
beqs a d d _ s _ d c l r
bsetb #s i g n _ b i t , E T E M P _ E X ( % a 6 )
add_s_dclr :
leal W B T E M P ( % a6 ) ,% a0
movel E T E M P ( % a6 ) ,( % a0 ) | w r i t e r e s u l t t o w b t e m p
movel E T E M P _ H I ( % a6 ) ,4 ( % a0 )
movel E T E M P _ L O ( % a6 ) ,8 ( % a0 )
tstw E T E M P _ E X ( % a6 )
bgt a d d _ c k o v f
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 )
bra a d d _ c k o v f
add_s_srcd :
leal F P T E M P ( % a6 ) ,% a0
movel U S E R _ F P C R ( % a6 ) ,% d0
andil #0x30 ,% d0
lsrl #4 ,% d0 | p u t r m o d e i n l o w e r 2 b i t s
movel U S E R _ F P C R ( % a6 ) ,% d1
andil #0xc0 ,% d1
lsrl #6 ,% d1 | p u t p r e c i s i o n i n u p p e r w o r d
swap % d1
orl % d0 ,% d1 | s e t u p f o r r o u n d c a l l
movel #0x20000000 ,% d0 | s e t s t i c k y f o r r o u n d
bclrb #s i g n _ b i t , F P T E M P _ E X ( % a 6 )
sne F P T E M P _ S G N ( % a6 )
bsrl r o u n d | r o u n d r e s u l t t o u s e r s r m o d e & p r e c
bfclr F P T E M P _ S G N ( % a6 ) { #0 : #8 } | c o n v e r t b a c k t o I E E E e x t f o r m a t
beqs a d d _ s _ s c l r
bsetb #s i g n _ b i t , F P T E M P _ E X ( % a 6 )
add_s_sclr :
leal W B T E M P ( % a6 ) ,% a0
movel F P T E M P ( % a6 ) ,( % a0 ) | w r i t e r e s u l t t o w b t e m p
movel F P T E M P _ H I ( % a6 ) ,4 ( % a0 )
movel F P T E M P _ L O ( % a6 ) ,8 ( % a0 )
tstw F P T E M P _ E X ( % a6 )
bgt a d d _ c k o v f
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 )
add_ckovf :
movew W B T E M P _ E X ( % a6 ) ,% d0
andiw #0x7fff ,% d0
cmpiw #0x7fff ,% d0
bne f r c f p n r
|
| The r e s u l t h a s o v e r f l o w e d t o $ 7 f f f e x p o n e n t . S e t I , o v f l ,
| and a o v f l , a n d c l r t h e m a n t i s s a ( i n c o r r e c t l y s e t b y t h e
| round r o u t i n e . )
|
orl #i n f _ m a s k + o v f l _ i n x _ m a s k , U S E R _ F P S R ( % a 6 )
clrl 4 ( % a0 )
bra f r c f p n r
|
| Inst i s f s u b .
|
wrap_sub :
cmpb #0xff ,D N R M _ F L G ( % a6 ) | i f b o t h o p s d e n o r m ,
beq f i x _ s t k | r e s t o r e t o f p u
|
| One o f t h e o p s i s d e n o r m a l i z e d . T e s t f o r w r a p c o n d i t i o n
| and c o m p l e t e t h e i n s t r u c t i o n .
|
cmpb #0x0f ,D N R M _ F L G ( % a6 ) | c h e c k f o r d e s t d e n o r m
bnes s u b _ s r c d
sub_destd :
bsrl c k i n f _ n s
bne f i x _ s t k
bfextu E T E M P _ E X ( % a6 ) { #1 : #15 } ,% d0 | g e t s r c e x p ( a l w a y s p o s )
bfexts F P T E M P _ E X ( % a6 ) { #1 : #15 } ,% d1 | g e t d e s t e x p ( a l w a y s n e g )
subl % d1 ,% d0 | s u b t r a c t s r c f r o m d e s t
cmpl #0x8000 ,% d0
blt f i x _ s t k | i f l e s s , n o t w r a p c a s e
bra s u b _ w r a p
sub_srcd :
bsrl c k i n f _ n d
bne f i x _ s t k
bfextu F P T E M P _ E X ( % a6 ) { #1 : #15 } ,% d0 | g e t d e s t e x p ( a l w a y s p o s )
bfexts E T E M P _ E X ( % a6 ) { #1 : #15 } ,% d1 | g e t s r c e x p ( a l w a y s n e g )
subl % d1 ,% d0 | s u b t r a c t d e s t f r o m s r c
cmpl #0x8000 ,% d0
blt f i x _ s t k | i f l e s s , n o t w r a p c a s e
|
| Check t h e s i g n s o f t h e o p e r a n d s . I f t h e y a r e a l i k e , t h e f p u
| can b e u s e d t o s u b t r a c t f r o m t h e n o r m 1 . 0 w i t h t h e s i g n o f t h e
| denorm a n d i t w i l l c o r r e c t l y g e n e r a t e t h e r e s u l t i n e x t e n d e d
| precision. W e c a n t h e n c a l l r o u n d w i t h n o s t i c k y a n d t h e r e s u l t
| will b e c o r r e c t f o r t h e u s e r ' s r o u n d i n g m o d e a n d p r e c i s i o n . I f
| the s i g n s a r e u n l i k e , w e c a l l r o u n d w i t h t h e s t i c k y b i t s e t
| and t h e r e s u l t w i l l b e c o r r e c t f o r t h e u s e r ' s r o u n d i n g m o d e a n d
| precision.
|
sub_wrap :
movew E T E M P _ E X ( % a6 ) ,% d0
movew F P T E M P _ E X ( % a6 ) ,% d1
eorw % d1 ,% d0
andiw #0x8000 ,% d0
bne s u b _ d i f f
|
| The s i g n s a r e a l i k e .
|
cmpb #0x0f ,D N R M _ F L G ( % a6 ) | i s d e s t t h e d e n o r m ?
bnes s u b _ u _ s r c d
movew F P T E M P _ E X ( % a6 ) ,% d0
andiw #0x8000 ,% d0
orw #0x3fff ,% d0 | f o r c e t h e e x p o n e n t t o + / - 1
movew % d0 ,F P T E M P _ E X ( % a6 ) | i n t h e d e n o r m
movel U S E R _ F P C R ( % a6 ) ,% d0
andil #0x30 ,% d0
fmovel % d0 ,% f p c r | s e t u p u s e r s r m o d e a n d X
fmovex F P T E M P ( % a6 ) ,% f p0
fsubx E T E M P ( % a6 ) ,% f p0
fmovel % f p s r ,% d1
orl % d1 ,U S E R _ F P S R ( % a6 ) | c a p t u r e c c ' s a n d i n e x f r o m f a d d
leal W B T E M P ( % a6 ) ,% a0 | p o i n t a0 t o w b t e m p i n f r a m e
fmovex % f p0 ,W B T E M P ( % a6 ) | w r i t e r e s u l t t o m e m o r y
lsrl #4 ,% d0 | p u t r m o d e i n l o w e r 2 b i t s
movel U S E R _ F P C R ( % a6 ) ,% d1
andil #0xc0 ,% d1
lsrl #6 ,% d1 | p u t p r e c i s i o n i n u p p e r w o r d
swap % d1
orl % d0 ,% d1 | s e t u p f o r r o u n d c a l l
clrl % d0 | f o r c e s t i c k y t o z e r o
bclrb #s i g n _ b i t , W B T E M P _ E X ( % a 6 )
sne W B T E M P _ S G N ( % a6 )
bsrl r o u n d | r o u n d r e s u l t t o u s e r s r m o d e & p r e c
bfclr W B T E M P _ S G N ( % a6 ) { #0 : #8 } | c o n v e r t b a c k t o I E E E e x t f o r m a t
beq f r c f p n r
bsetb #s i g n _ b i t , W B T E M P _ E X ( % a 6 )
bra f r c f p n r
sub_u_srcd :
movew E T E M P _ E X ( % a6 ) ,% d0
andiw #0x8000 ,% d0
orw #0x3fff ,% d0 | f o r c e t h e e x p o n e n t t o + / - 1
movew % d0 ,E T E M P _ E X ( % a6 ) | i n t h e d e n o r m
movel U S E R _ F P C R ( % a6 ) ,% d0
andil #0x30 ,% d0
fmovel % d0 ,% f p c r | s e t u p u s e r s r m o d e a n d X
fmovex F P T E M P ( % a6 ) ,% f p0
fsubx E T E M P ( % a6 ) ,% f p0
fmovel % f p s r ,% d1
orl % d1 ,U S E R _ F P S R ( % a6 ) | c a p t u r e c c ' s a n d i n e x f r o m f a d d
leal W B T E M P ( % a6 ) ,% a0 | p o i n t a0 t o w b t e m p i n f r a m e
fmovex % f p0 ,W B T E M P ( % a6 ) | w r i t e r e s u l t t o m e m o r y
lsrl #4 ,% d0 | p u t r m o d e i n l o w e r 2 b i t s
movel U S E R _ F P C R ( % a6 ) ,% d1
andil #0xc0 ,% d1
lsrl #6 ,% d1 | p u t p r e c i s i o n i n u p p e r w o r d
swap % d1
orl % d0 ,% d1 | s e t u p f o r r o u n d c a l l
clrl % d0 | f o r c e s t i c k y t o z e r o
bclrb #s i g n _ b i t , W B T E M P _ E X ( % a 6 )
sne W B T E M P _ S G N ( % a6 )
bsrl r o u n d | r o u n d r e s u l t t o u s e r s r m o d e & p r e c
bfclr W B T E M P _ S G N ( % a6 ) { #0 : #8 } | c o n v e r t b a c k t o I E E E e x t f o r m a t
beq f r c f p n r
bsetb #s i g n _ b i t , W B T E M P _ E X ( % a 6 )
bra f r c f p n r
|
| Signs a r e u n l i k e :
|
sub_diff :
cmpb #0x0f ,D N R M _ F L G ( % a6 ) | i s d e s t t h e d e n o r m ?
bnes s u b _ s _ s r c d
sub_s_destd :
leal E T E M P ( % a6 ) ,% a0
movel U S E R _ F P C R ( % a6 ) ,% d0
andil #0x30 ,% d0
lsrl #4 ,% d0 | p u t r m o d e i n l o w e r 2 b i t s
movel U S E R _ F P C R ( % a6 ) ,% d1
andil #0xc0 ,% d1
lsrl #6 ,% d1 | p u t p r e c i s i o n i n u p p e r w o r d
swap % d1
orl % d0 ,% d1 | s e t u p f o r r o u n d c a l l
movel #0x20000000 ,% d0 | s e t s t i c k y f o r r o u n d
|
| Since t h e d e s t i s t h e d e n o r m , t h e s i g n i s t h e o p p o s i t e o f t h e
| norm s i g n .
|
eoriw #0x8000 ,E T E M P _ E X ( % a6 ) | f l i p s i g n o n r e s u l t
tstw E T E M P _ E X ( % a6 )
bgts s u b _ s _ d w r
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 )
sub_s_dwr :
bclrb #s i g n _ b i t , E T E M P _ E X ( % a 6 )
sne E T E M P _ S G N ( % a6 )
bsrl r o u n d | r o u n d r e s u l t t o u s e r s r m o d e & p r e c
bfclr E T E M P _ S G N ( % a6 ) { #0 : #8 } | c o n v e r t b a c k t o I E E E e x t f o r m a t
beqs s u b _ s _ d c l r
bsetb #s i g n _ b i t , E T E M P _ E X ( % a 6 )
sub_s_dclr :
leal W B T E M P ( % a6 ) ,% a0
movel E T E M P ( % a6 ) ,( % a0 ) | w r i t e r e s u l t t o w b t e m p
movel E T E M P _ H I ( % a6 ) ,4 ( % a0 )
movel E T E M P _ L O ( % a6 ) ,8 ( % a0 )
bra s u b _ c k o v f
sub_s_srcd :
leal F P T E M P ( % a6 ) ,% a0
movel U S E R _ F P C R ( % a6 ) ,% d0
andil #0x30 ,% d0
lsrl #4 ,% d0 | p u t r m o d e i n l o w e r 2 b i t s
movel U S E R _ F P C R ( % a6 ) ,% d1
andil #0xc0 ,% d1
lsrl #6 ,% d1 | p u t p r e c i s i o n i n u p p e r w o r d
swap % d1
orl % d0 ,% d1 | s e t u p f o r r o u n d c a l l
movel #0x20000000 ,% d0 | s e t s t i c k y f o r r o u n d
bclrb #s i g n _ b i t , F P T E M P _ E X ( % a 6 )
sne F P T E M P _ S G N ( % a6 )
bsrl r o u n d | r o u n d r e s u l t t o u s e r s r m o d e & p r e c
bfclr F P T E M P _ S G N ( % a6 ) { #0 : #8 } | c o n v e r t b a c k t o I E E E e x t f o r m a t
beqs s u b _ s _ s c l r
bsetb #s i g n _ b i t , F P T E M P _ E X ( % a 6 )
sub_s_sclr :
leal W B T E M P ( % a6 ) ,% a0
movel F P T E M P ( % a6 ) ,( % a0 ) | w r i t e r e s u l t t o w b t e m p
movel F P T E M P _ H I ( % a6 ) ,4 ( % a0 )
movel F P T E M P _ L O ( % a6 ) ,8 ( % a0 )
tstw F P T E M P _ E X ( % a6 )
bgt s u b _ c k o v f
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 )
sub_ckovf :
movew W B T E M P _ E X ( % a6 ) ,% d0
andiw #0x7fff ,% d0
cmpiw #0x7fff ,% d0
bne f r c f p n r
|
| The r e s u l t h a s o v e r f l o w e d t o $ 7 f f f e x p o n e n t . S e t I , o v f l ,
| and a o v f l , a n d c l r t h e m a n t i s s a ( i n c o r r e c t l y s e t b y t h e
| round r o u t i n e . )
|
orl #i n f _ m a s k + o v f l _ i n x _ m a s k , U S E R _ F P S R ( % a 6 )
clrl 4 ( % a0 )
bra f r c f p n r
|
| Inst i s f c m p .
|
wrap_cmp :
cmpb #0xff ,D N R M _ F L G ( % a6 ) | i f b o t h o p s d e n o r m ,
beq f i x _ s t k | r e s t o r e t o f p u
|
| One o f t h e o p s i s d e n o r m a l i z e d . T e s t f o r w r a p c o n d i t i o n
| and c o m p l e t e t h e i n s t r u c t i o n .
|
cmpb #0x0f ,D N R M _ F L G ( % a6 ) | c h e c k f o r d e s t d e n o r m
bnes c m p _ s r c d
cmp_destd :
bsrl c k i n f _ n s
bne f i x _ s t k
bfextu E T E M P _ E X ( % a6 ) { #1 : #15 } ,% d0 | g e t s r c e x p ( a l w a y s p o s )
bfexts F P T E M P _ E X ( % a6 ) { #1 : #15 } ,% d1 | g e t d e s t e x p ( a l w a y s n e g )
subl % d1 ,% d0 | s u b t r a c t d e s t f r o m s r c
cmpl #0x8000 ,% d0
blt f i x _ s t k | i f l e s s , n o t w r a p c a s e
tstw E T E M P _ E X ( % a6 ) | s e t N t o ~ s i g n _ o f ( s r c )
bge c m p _ s e t n
rts
cmp_srcd :
bsrl c k i n f _ n d
bne f i x _ s t k
bfextu F P T E M P _ E X ( % a6 ) { #1 : #15 } ,% d0 | g e t d e s t e x p ( a l w a y s p o s )
bfexts E T E M P _ E X ( % a6 ) { #1 : #15 } ,% d1 | g e t s r c e x p ( a l w a y s n e g )
subl % d1 ,% d0 | s u b t r a c t s r c f r o m d e s t
cmpl #0x8000 ,% d0
blt f i x _ s t k | i f l e s s , n o t w r a p c a s e
tstw F P T E M P _ E X ( % a6 ) | s e t N t o s i g n _ o f ( d e s t )
blt c m p _ s e t n
rts
cmp_setn :
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 )
rts
|
| Inst i s f m u l .
|
wrap_mul :
cmpb #0xff ,D N R M _ F L G ( % a6 ) | i f b o t h o p s d e n o r m ,
beq f o r c e _ u n f | f o r c e a n u n d e r f l o w ( r e a l l y ! )
|
| One o f t h e o p s i s d e n o r m a l i z e d . T e s t f o r w r a p c o n d i t i o n
| and c o m p l e t e t h e i n s t r u c t i o n .
|
cmpb #0x0f ,D N R M _ F L G ( % a6 ) | c h e c k f o r d e s t d e n o r m
bnes m u l _ s r c d
mul_destd :
bsrl c k i n f _ n s
bne f i x _ s t k
bfextu E T E M P _ E X ( % a6 ) { #1 : #15 } ,% d0 | g e t s r c e x p ( a l w a y s p o s )
bfexts F P T E M P _ E X ( % a6 ) { #1 : #15 } ,% d1 | g e t d e s t e x p ( a l w a y s n e g )
addl % d1 ,% d0 | s u b t r a c t d e s t f r o m s r c
bgt f i x _ s t k
bra f o r c e _ u n f
mul_srcd :
bsrl c k i n f _ n d
bne f i x _ s t k
bfextu F P T E M P _ E X ( % a6 ) { #1 : #15 } ,% d0 | g e t d e s t e x p ( a l w a y s p o s )
bfexts E T E M P _ E X ( % a6 ) { #1 : #15 } ,% d1 | g e t s r c e x p ( a l w a y s n e g )
addl % d1 ,% d0 | s u b t r a c t s r c f r o m d e s t
bgt f i x _ s t k
|
| This c o d e h a n d l e s t h e c a s e o f t h e i n s t r u c t i o n r e s u l t i n g i n
| an u n d e r f l o w c o n d i t i o n .
|
force_unf :
bclrb #E 1 ,E _ B Y T E ( % a6 )
orl #u n f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
clrw N M N E X C ( % a6 )
clrb W B T E M P _ S G N ( % a6 )
movew E T E M P _ E X ( % a6 ) ,% d0 | f i n d t h e s i g n o f t h e r e s u l t
movew F P T E M P _ E X ( % a6 ) ,% d1
eorw % d1 ,% d0
andiw #0x8000 ,% d0
beqs f r c u n f c o n t
st W B T E M P _ S G N ( % a6 )
frcunfcont :
lea W B T E M P ( % a6 ) ,% a0 | p o i n t a0 t o m e m o r y l o c a t i o n
movew C M D R E G 1 B ( % a6 ) ,% d0
btstl #6 ,% d0 | t e s t f o r f o r c e d p r e c i s i o n
beqs f r c u n f _ f p c r
btstl #2 ,% d0 | c h e c k f o r d o u b l e
bnes f r c u n f _ d b l
movel #0x1 ,% d0 | i n s t i s f o r c e d s i n g l e
bras f r c u n f _ r n d
frcunf_dbl :
movel #0x2 ,% d0 | i n s t i s f o r c e d d o u b l e
bras f r c u n f _ r n d
frcunf_fpcr :
bfextu F P C R _ M O D E ( % a6 ) { #0 : #2 } ,% d0 | i n s t n o t f o r c e d - u s e f p c r p r e c
frcunf_rnd :
bsrl u n f _ s u b | g e t c o r r e c t r e s u l t b a s e d o n
| ;round precision/mode. This
| ;sets FPSR_CC correctly
bfclr W B T E M P _ S G N ( % a6 ) { #0 : #8 } | c o n v e r t b a c k t o I E E E e x t f o r m a t
beqs f r c f p n
bsetb #s i g n _ b i t , W B T E M P _ E X ( % a 6 )
bra f r c f p n
|
| Write t h e r e s u l t t o t h e u s e r ' s f p n . A l l r e s u l t s m u s t b e H U G E t o b e
| written; otherwise the results would have overflowed or underflowed.
| If t h e r o u n d i n g p r e c i s i o n i s s i n g l e o r d o u b l e , t h e o v f _ r e s r o u t i n e
| is n e e d e d t o c o r r e c t l y s u p p l y t h e m a x v a l u e .
|
frcfpnr :
movew C M D R E G 1 B ( % a6 ) ,% d0
btstl #6 ,% d0 | t e s t f o r f o r c e d p r e c i s i o n
beqs f r c f p n _ f p c r
btstl #2 ,% d0 | c h e c k f o r d o u b l e
bnes f r c f p n _ d b l
movel #0x1 ,% d0 | i n s t i s f o r c e d s i n g l e
bras f r c f p n _ r n d
frcfpn_dbl :
movel #0x2 ,% d0 | i n s t i s f o r c e d d o u b l e
bras f r c f p n _ r n d
frcfpn_fpcr :
bfextu F P C R _ M O D E ( % a6 ) { #0 : #2 } ,% d0 | i n s t n o t f o r c e d - u s e f p c r p r e c
tstb % d0
beqs f r c f p n | i f e x t e n d e d , w r i t e w h a t y o u g o t
frcfpn_rnd :
bclrb #s i g n _ b i t , W B T E M P _ E X ( % a 6 )
sne W B T E M P _ S G N ( % a6 )
bsrl o v f _ r e s | g e t c o r r e c t r e s u l t b a s e d o n
| ;round precision/mode. This
| ;sets FPSR_CC correctly
bfclr W B T E M P _ S G N ( % a6 ) { #0 : #8 } | c o n v e r t b a c k t o I E E E e x t f o r m a t
beqs f r c f p n _ c l r
bsetb #s i g n _ b i t , W B T E M P _ E X ( % a 6 )
frcfpn_clr :
orl #o v f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
|
| Perform t h e w r i t e .
|
frcfpn :
bfextu C M D R E G 1 B ( % a6 ) { #6 : #3 } ,% d0 | e x t r a c t f p d e s t i n a t i o n r e g i s t e r
cmpib #3 ,% d0
bles f r c01 2 3 | c h e c k i f d e s t i s f p0 - f p3
movel #7 ,% d1
subl % d0 ,% d1
clrl % d0
bsetl % d1 ,% d0
fmovemx W B T E M P ( % a6 ) ,% d0
rts
frc0123 :
cmpib #0 ,% d0
beqs f r c0 _ d s t
cmpib #1 ,% d0
beqs f r c1 _ d s t
cmpib #2 ,% d0
beqs f r c2 _ d s t
frc3_dst :
movel W B T E M P _ E X ( % a6 ) ,U S E R _ F P 3 ( % a6 )
movel W B T E M P _ H I ( % a6 ) ,U S E R _ F P 3 + 4 ( % a6 )
movel W B T E M P _ L O ( % a6 ) ,U S E R _ F P 3 + 8 ( % a6 )
rts
frc2_dst :
movel W B T E M P _ E X ( % a6 ) ,U S E R _ F P 2 ( % a6 )
movel W B T E M P _ H I ( % a6 ) ,U S E R _ F P 2 + 4 ( % a6 )
movel W B T E M P _ L O ( % a6 ) ,U S E R _ F P 2 + 8 ( % a6 )
rts
frc1_dst :
movel W B T E M P _ E X ( % a6 ) ,U S E R _ F P 1 ( % a6 )
movel W B T E M P _ H I ( % a6 ) ,U S E R _ F P 1 + 4 ( % a6 )
movel W B T E M P _ L O ( % a6 ) ,U S E R _ F P 1 + 8 ( % a6 )
rts
frc0_dst :
movel W B T E M P _ E X ( % a6 ) ,U S E R _ F P 0 ( % a6 )
movel W B T E M P _ H I ( % a6 ) ,U S E R _ F P 0 + 4 ( % a6 )
movel W B T E M P _ L O ( % a6 ) ,U S E R _ F P 0 + 8 ( % a6 )
rts
|
| Write e t e m p t o f p n .
| A c h e c k i s m a d e o n e n a b l e d a n d s i g n a l l e d s n a n e x c e p t i o n s ,
| and t h e d e s t i n a t i o n i s n o t o v e r w r i t t e n i f t h i s c o n d i t i o n e x i s t s .
| This c o d e i s d e s i g n e d t o m a k e f m o v e i n s o f u n s u p p o r t e d d a t a t y p e s
| faster.
|
wr_etemp :
btstb #s n a n _ b i t , F P S R _ E X C E P T ( % a 6 ) | i f s n a n i s s e t , a n d
beqs f m o v e i n c | e n a b l e d , f o r c e r e s t o r e
btstb #s n a n _ b i t , F P C R _ E N A B L E ( % a 6 ) | a n d d o n ' t o v e r w r i t e
beqs f m o v e i n c | t h e d e s t
movel E T E M P _ E X ( % a6 ) ,F P T E M P _ E X ( % a6 ) | s e t u p f p t e m p s i g n f o r
| ;snan handler
tstb E T E M P ( % a6 ) | c h e c k f o r n e g a t i v e
blts s n a n _ n e g
rts
snan_neg :
orl #n e g _ b i t , U S E R _ F P S R ( % a 6 ) | s n a n i s n e g a t i v e ; set N
rts
fmoveinc :
clrw N M N E X C ( % a6 )
bclrb #E 1 ,E _ B Y T E ( % a6 )
moveb S T A G ( % a6 ) ,% d0 | c h e c k i f s t a g i s i n f
andib #0xe0 ,% d0
cmpib #0x40 ,% d0
bnes f m i n c _ c n a n
orl #i n f _ m a s k , U S E R _ F P S R ( % a 6 ) | i f i n f , n o t h i n g y e t h a s s e t I
tstw L O C A L _ E X ( % a0 ) | c h e c k s i g n
bges f m i n c _ c o n
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 )
bra f m i n c _ c o n
fminc_cnan :
cmpib #0x60 ,% d0 | c h e c k i f s t a g i s N a N
bnes f m i n c _ c z e r o
orl #n a n _ m a s k , U S E R _ F P S R ( % a 6 ) | i f n a n , n o t h i n g y e t h a s s e t N a N
movel E T E M P _ E X ( % a6 ) ,F P T E M P _ E X ( % a6 ) | s e t u p f p t e m p s i g n f o r
| ;snan handler
tstw L O C A L _ E X ( % a0 ) | c h e c k s i g n
bges f m i n c _ c o n
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 )
bra f m i n c _ c o n
fminc_czero :
cmpib #0x20 ,% d0 | c h e c k i f z e r o
bnes f m i n c _ c o n
orl #z _ m a s k , U S E R _ F P S R ( % a 6 ) | i f z e r o , s e t Z
tstw L O C A L _ E X ( % a0 ) | c h e c k s i g n
bges f m i n c _ c o n
orl #n e g _ m a s k , U S E R _ F P S R ( % a 6 )
fminc_con :
bfextu C M D R E G 1 B ( % a6 ) { #6 : #3 } ,% d0 | e x t r a c t f p d e s t i n a t i o n r e g i s t e r
cmpib #3 ,% d0
bles f p01 2 3 | c h e c k i f d e s t i s f p0 - f p3
movel #7 ,% d1
subl % d0 ,% d1
clrl % d0
bsetl % d1 ,% d0
fmovemx E T E M P ( % a6 ) ,% d0
rts
fp0123 :
cmpib #0 ,% d0
beqs f p0 _ d s t
cmpib #1 ,% d0
beqs f p1 _ d s t
cmpib #2 ,% d0
beqs f p2 _ d s t
fp3_dst :
movel E T E M P _ E X ( % a6 ) ,U S E R _ F P 3 ( % a6 )
movel E T E M P _ H I ( % a6 ) ,U S E R _ F P 3 + 4 ( % a6 )
movel E T E M P _ L O ( % a6 ) ,U S E R _ F P 3 + 8 ( % a6 )
rts
fp2_dst :
movel E T E M P _ E X ( % a6 ) ,U S E R _ F P 2 ( % a6 )
movel E T E M P _ H I ( % a6 ) ,U S E R _ F P 2 + 4 ( % a6 )
movel E T E M P _ L O ( % a6 ) ,U S E R _ F P 2 + 8 ( % a6 )
rts
fp1_dst :
movel E T E M P _ E X ( % a6 ) ,U S E R _ F P 1 ( % a6 )
movel E T E M P _ H I ( % a6 ) ,U S E R _ F P 1 + 4 ( % a6 )
movel E T E M P _ L O ( % a6 ) ,U S E R _ F P 1 + 8 ( % a6 )
rts
fp0_dst :
movel E T E M P _ E X ( % a6 ) ,U S E R _ F P 0 ( % a6 )
movel E T E M P _ H I ( % a6 ) ,U S E R _ F P 0 + 4 ( % a6 )
movel E T E M P _ L O ( % a6 ) ,U S E R _ F P 0 + 8 ( % a6 )
rts
opclass3 :
st C U _ O N L Y ( % a6 )
movew C M D R E G 1 B ( % a6 ) ,% d0 | c h e c k i f p a c k e d m o v e o u t
andiw #0x0c00 ,% d0 | i s o l a t e l a s t 2 b i t s o f s i z e f i e l d
cmpiw #0x0c00 ,% d0 | i f s i z e i s 0 1 1 o r 1 1 1 , i t i s p a c k e d
beq p a c k _ o u t | e l s e i t i s n o r m o r d e n o r m
bra m v _ o u t
|
| MOVE O U T
|
mv_tbl :
.long li
.long sgp
.long xp
.long mvout_end | should n e v e r b e t a k e n
.long wi
.long dp
.long bi
.long mvout_end | should n e v e r b e t a k e n
mv_out :
bfextu C M D R E G 1 B ( % a6 ) { #3 : #3 } ,% d1 | p u t s o u r c e s p e c i f i e r i n d1
leal m v _ t b l ,% a0
movel % a0 @(%d1:l:4),%a0
jmp ( % a0 )
|
| This e x i t i s f o r m o v e - o u t t o m e m o r y . T h e a u n f l b i t i s
| set i f t h e r e s u l t i s i n e x a n d u n f l i s s i g n a l l e d .
|
mvout_end :
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 f l
btstb #u n f l _ b i t , F P S R _ E X C E P T ( % a 6 )
beqs n o _ a u 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_aufl :
clrw N M N E X C ( % a6 )
bclrb #E 1 ,E _ B Y T E ( % a6 )
fmovel #0 ,% F P S R | c l e a r a n y c c b i t s f r o m r e s _ f u n c
|
| Return E T E M P t o e x t e n d e d f o r m a t f r o m i n t e r n a l e x t e n d e d f o r m a t s o
| that g e n _ e x c e p t w i l l h a v e a c o r r e c t l y s i g n e d v a l u e f o r o v f l / u n f l
| handlers.
|
bfclr E T E M P _ S G N ( % a6 ) { #0 : #8 }
beqs m v o u t _ c o n
bsetb #s i g n _ b i t , E T E M P _ E X ( % a 6 )
mvout_con :
rts
|
| This e x i t i s f o r m o v e - o u t t o i n t r e g i s t e r . T h e a u n f l b i t i s
| not s e t i n a n y c a s e f o r t h i s m o v e .
|
mvouti_end :
clrw N M N E X C ( % a6 )
bclrb #E 1 ,E _ B Y T E ( % a6 )
fmovel #0 ,% F P S R | c l e a r a n y c c b i t s f r o m r e s _ f u n c
|
| Return E T E M P t o e x t e n d e d f o r m a t f r o m i n t e r n a l e x t e n d e d f o r m a t s o
| that g e n _ e x c e p t w i l l h a v e a c o r r e c t l y s i g n e d v a l u e f o r o v f l / u n f l
| handlers.
|
bfclr E T E M P _ S G N ( % a6 ) { #0 : #8 }
beqs m v o u t i _ c o n
bsetb #s i g n _ b i t , E T E M P _ E X ( % a 6 )
mvouti_con :
rts
|
| li i s u s e d t o h a n d l e a l o n g i n t e g e r s o u r c e s p e c i f i e r
|
li :
moveql #4 ,% d0 | s e t b y t e c o u n t
btstb #7 ,S T A G ( % a6 ) | c h e c k f o r e x t e n d e d d e n o r m
bne i n t _ d n r m | i f s o , b r a n c h
fmovemx E T E M P ( % a6 ) ,% f p0 - % f p0
fcmpd #0x41dfffff f f c00 0 0 0 ,% f p0
| 4 1 dfffffffc0 0 0 0 0 i n d b l p r e c = 4 0 1 d00 0 0 f f f f f f f e 0 0 0 0 0 0 0 0 i n e x t p r e c
fbge l o _ p l r g
fcmpd #0xc1e00000 0 0 0 0 0 0 0 0 ,% f p0
| c1 e 0 0 0 0 0 0 0 0 0 0 0 0 0 i n d b l p r e c = c01 e 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 i n e x t p r e c
fble l o _ n l r g
|
| at t h i s p o i n t , t h e a n s w e r i s b e t w e e n t h e l a r g e s t p o s a n d n e g v a l u e s
|
movel U S E R _ F P C R ( % a6 ) ,% d1 | u s e u s e r ' s r o u n d i n g m o d e
andil #0x30 ,% d1
fmovel % d1 ,% f p c r
fmovel % f p0 ,L _ S C R 1 ( % a6 ) | l e t t h e 0 4 0 p e r f o r m c o n v e r s i o n
fmovel % f p s r ,% d1
orl % d1 ,U S E R _ F P S R ( % a6 ) | c a p t u r e i n e x2 / a i n e x i f s e t
bra i n t _ w r t
lo_plrg :
movel #0x7fffffff ,L _ S C R 1 ( % a6 ) | a n s w e r i s l a r g e s t p o s i t i v e i n t
fbeq i n t _ w r t | e x a c t a n s w e r
fcmpd #0x41dfffff f f e 0 0 0 0 0 ,% f p0
| 4 1 dfffffffe0 0 0 0 0 i n d b l p r e c = 4 0 1 d00 0 0 f f f f f f f f00 0 0 0 0 0 0 i n e x t p r e c
fbge i n t _ o p e r r | s e t o p e r r
bra i n t _ i n x | s e t i n e x a c t
lo_nlrg :
movel #0x80000000 ,L _ S C R 1 ( % a6 )
fbeq i n t _ w r t | e x a c t a n s w e r
fcmpd #0xc1e00000 0 0 1 0 0 0 0 0 ,% f p0
| c1 e 0 0 0 0 0 0 0 1 0 0 0 0 0 i n d b l p r e c = c01 e 0 0 0 0 8 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 i n e x t p r e c
fblt i n t _ o p e r r | s e t o p e r r
bra i n t _ i n x | s e t i n e x a c t
|
| wi i s u s e d t o h a n d l e a w o r d i n t e g e r s o u r c e s p e c i f i e r
|
wi :
moveql #2 ,% d0 | s e t b y t e c o u n t
btstb #7 ,S T A G ( % a6 ) | c h e c k f o r e x t e n d e d d e n o r m
bne i n t _ d n r m | b r a n c h i f s o
fmovemx E T E M P ( % a6 ) ,% f p0 - % f p0
fcmps #0x46fffe00 ,% f p0
| 4 6 fffe0 0 i n s g l p r e c = 4 0 0 d00 0 0 f f f e 0 0 0 0 0 0 0 0 0 0 0 0 i n e x t p r e c
fbge w o _ p l r g
fcmps #0xc7000000 ,% f p0
| c7 0 0 0 0 0 0 i n s g l p r e c = c00 e 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 i n e x t p r e c
fble w o _ n l r g
|
| at t h i s p o i n t , t h e a n s w e r i s b e t w e e n t h e l a r g e s t p o s a n d n e g v a l u e s
|
movel U S E R _ F P C R ( % a6 ) ,% d1 | u s e u s e r ' s r o u n d i n g m o d e
andil #0x30 ,% d1
fmovel % d1 ,% f p c r
fmovew % f p0 ,L _ S C R 1 ( % a6 ) | l e t t h e 0 4 0 p e r f o r m c o n v e r s i o n
fmovel % f p s r ,% d1
orl % d1 ,U S E R _ F P S R ( % a6 ) | c a p t u r e i n e x2 / a i n e x i f s e t
bra i n t _ w r t
wo_plrg :
movew #0x7fff ,L _ S C R 1 ( % a6 ) | a n s w e r i s l a r g e s t p o s i t i v e i n t
fbeq i n t _ w r t | e x a c t a n s w e r
fcmps #0x46ffff00 ,% f p0
| 4 6 ffff0 0 i n s g l p r e c = 4 0 0 d00 0 0 f f f f00 0 0 0 0 0 0 0 0 0 0 i n e x t p r e c
fbge i n t _ o p e r r | s e t o p e r r
bra i n t _ i n x | s e t i n e x a c t
wo_nlrg :
movew #0x8000 ,L _ S C R 1 ( % a6 )
fbeq i n t _ w r t | e x a c t a n s w e r
fcmps #0xc7000080 ,% f p0
| c7 0 0 0 0 8 0 i n s g l p r e c = c00 e 0 0 0 0 8 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 i n e x t p r e c
fblt i n t _ o p e r r | s e t o p e r r
bra i n t _ i n x | s e t i n e x a c t
|
| bi i s u s e d t o h a n d l e a b y t e i n t e g e r s o u r c e s p e c i f i e r
|
bi :
moveql #1 ,% d0 | s e t b y t e c o u n t
btstb #7 ,S T A G ( % a6 ) | c h e c k f o r e x t e n d e d d e n o r m
bne i n t _ d n r m | b r a n c h i f s o
fmovemx E T E M P ( % a6 ) ,% f p0 - % f p0
fcmps #0x42fe0000 ,% f p0
| 4 2 fe0 0 0 0 i n s g l p r e c = 4 0 0 5 0 0 0 0 f e 0 0 0 0 0 0 0 0 0 0 0 0 0 0 i n e x t p r e c
fbge b y _ p l r g
fcmps #0xc3000000 ,% f p0
| c3 0 0 0 0 0 0 i n s g l p r e c = c00 6 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 i n e x t p r e c
fble b y _ n l r g
|
| at t h i s p o i n t , t h e a n s w e r i s b e t w e e n t h e l a r g e s t p o s a n d n e g v a l u e s
|
movel U S E R _ F P C R ( % a6 ) ,% d1 | u s e u s e r ' s r o u n d i n g m o d e
andil #0x30 ,% d1
fmovel % d1 ,% f p c r
fmoveb % f p0 ,L _ S C R 1 ( % a6 ) | l e t t h e 0 4 0 p e r f o r m c o n v e r s i o n
fmovel % f p s r ,% d1
orl % d1 ,U S E R _ F P S R ( % a6 ) | c a p t u r e i n e x2 / a i n e x i f s e t
bra i n t _ w r t
by_plrg :
moveb #0x7f ,L _ S C R 1 ( % a6 ) | a n s w e r i s l a r g e s t p o s i t i v e i n t
fbeq i n t _ w r t | e x a c t a n s w e r
fcmps #0x42ff0000 ,% f p0
| 4 2 ff0 0 0 0 i n s g l p r e c = 4 0 0 5 0 0 0 0 f f00 0 0 0 0 0 0 0 0 0 0 0 0 i n e x t p r e c
fbge i n t _ o p e r r | s e t o p e r r
bra i n t _ i n x | s e t i n e x a c t
by_nlrg :
moveb #0x80 ,L _ S C R 1 ( % a6 )
fbeq i n t _ w r t | e x a c t a n s w e r
fcmps #0xc3008000 ,% f p0
| c3 0 0 8 0 0 0 i n s g l p r e c = c00 6 0 0 0 0 8 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 i n e x t p r e c
fblt i n t _ o p e r r | s e t o p e r r
bra i n t _ i n x | s e t i n e x a c t
|
| Common i n t e g e r r o u t i n e s
|
| int_ d r n r m - - - a c c o u n t f o r p o s s i b l e n o n z e r o r e s u l t f o r r o u n d u p w i t h p o s i t i v e
| operand a n d r o u n d d o w n f o r n e g a t i v e a n s w e r . I n t h e f i r s t c a s e ( r e s u l t = 1 )
| byte- w i d t h ( s t o r e i n d0 ) o f r e s u l t m u s t b e h o n o r e d . I n t h e s e c o n d c a s e ,
| - 1 in L _ S C R 1 ( a6 ) w i l l c o v e r a l l c o n t i n g e n c i e s ( F M O V E . B / W / L o u t ) .
int_dnrm :
movel #0 ,L _ S C R 1 ( % a6 ) | i n i t i a l i z e r e s u l t t o 0
bfextu F P C R _ M O D E ( % a6 ) { #2 : #2 } ,% d1 | d1 i s t h e r o u n d i n g m o d e
cmpb #2 ,% d1
bmis i n t _ i n x | i f R N o r R Z , d o n e
bnes i n t _ r p | i f R P , c o n t i n u e b e l o w
tstw E T E M P ( % a6 ) | R M : s t o r e - 1 i n L _ S C R 1 i f s r c i s n e g a t i v e
bpls i n t _ i n x | o t h e r w i s e r e s u l t i s 0
movel #- 1 ,L _ S C R 1 ( % a6 )
bras i n t _ i n x
int_rp :
tstw E T E M P ( % a6 ) | R P : s t o r e + 1 o f p r o p e r w i d t h i n L _ S C R 1 i f
| ; source is greater than 0
bmis i n t _ i n x | o t h e r w i s e , r e s u l t i s 0
lea L _ S C R 1 ( % a6 ) ,% a1 | a1 i s a d d r e s s o f L _ S C R 1
addal % d0 ,% a1 | o f f s e t b y d e s t i n a t i o n w i d t h - 1
subal #1 ,% a1
bsetb #0 ,( % a1 ) | s e t l o w b i t a t a1 a d d r e s s
int_inx :
oril #i n x 2 a _ m a s k ,U S E R _ F P S R ( % a6 )
bras i n t _ w r t
int_operr :
fmovemx % f p0 - % f p0 ,F P T E M P ( % a6 ) | F P T E M P m u s t c o n t a i n t h e e x t e n d e d
| ;precision source that needs to be
| ;converted to integer this is required
| ;if the operr exception is enabled.
| ;set operr/aiop (no inex2 on int ovfl)
oril #o p a o p _ m a s k , U S E R _ F P S R ( % a 6 )
| ;fall through to perform int_wrt
int_wrt :
movel E X C _ E A ( % a6 ) ,% a1 | l o a d d e s t i n a t i o n a d d r e s s
tstl % a1 | c h e c k t o s e e i f i t i s a d e s t r e g i s t e r
beqs w r t _ d n | w r i t e d a t a r e g i s t e r
lea L _ S C R 1 ( % a6 ) ,% a0 | p o i n t t o s u p e r v i s o r s o u r c e a d d r e s s
bsrl m e m _ w r i t e
bra m v o u t i _ e n d
wrt_dn :
movel % d0 ,- ( % s p ) | d0 c u r r e n t l y c o n t a i n s t h e s i z e t o w r i t e
bsrl g e t _ f l i n e | g e t _ f l i n e r e t u r n s D n i n d0
andiw #0x7 ,% d0 | i s o l a t e r e g i s t e r
movel ( % s p ) + ,% d1 | g e t s i z e
cmpil #4 ,% d1 | m o s t f r e q u e n t c a s e
beqs s z _ l o n g
cmpil #2 ,% d1
bnes s z _ c o n
orl #8 ,% d0 | a d d ' w o r d ' s i z e t o r e g i s t e r #
bras s z _ c o n
sz_long :
orl #0x10 ,% d0 | a d d ' l o n g ' s i z e t o r e g i s t e r #
sz_con :
movel % d0 ,% d1 | r e g _ d e s t e x p e c t s s i z e : r e g i n d1
bsrl r e g _ d e s t | l o a d p r o p e r d a t a r e g i s t e r
bra m v o u t i _ e n d
xp :
lea E T E M P ( % a6 ) ,% a0
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 )
btstb #7 ,S T A G ( % a6 ) | c h e c k f o r e x t e n d e d d e n o r m
bne x d n r m
clrl % d0
bras d o _ f p | d o n o r m a l c a s e
sgp :
lea E T E M P ( % a6 ) ,% a0
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 )
btstb #7 ,S T A G ( % a6 ) | c h e c k f o r e x t e n d e d d e n o r m
bne s p _ c a t a s | b r a n c h i f s o
movew L O C A L _ E X ( % a0 ) ,% d0
lea s p _ b n d s ,% a1
cmpw ( % a1 ) ,% d0
blt s p _ u n d e r
cmpw 2 ( % a1 ) ,% d0
bgt s p _ o v e r
movel #1 ,% d0 | s e t d e s t i n a t i o n f o r m a t t o s i n g l e
bras d o _ f p | d o n o r m a l c a s e
dp :
lea E T E M P ( % a6 ) ,% a0
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 )
btstb #7 ,S T A G ( % a6 ) | c h e c k f o r e x t e n d e d d e n o r m
bne d p _ c a t a s | b r a n c h i f s o
movew L O C A L _ E X ( % a0 ) ,% d0
lea d p _ b n d s ,% a1
cmpw ( % a1 ) ,% d0
blt d p _ u n d e r
cmpw 2 ( % a1 ) ,% d0
bgt d p _ o v e r
movel #2 ,% d0 | s e t d e s t i n a t i o n f o r m a t t o d o u b l e
| ;fall through to do_fp
|
do_fp :
bfextu F P C R _ M O D E ( % a6 ) { #2 : #2 } ,% d1 | r n d m o d e i n d1
swap % d0 | r n d p r e c i n u p p e r w o r d
addl % d0 ,% d1 | d1 h a s P R E C / M O D E i n f o
clrl % d0 | c l e a r g ,r ,s
bsrl r o u n d | r o u n d
movel % a0 ,% a1
movel E X C _ E A ( % a6 ) ,% a0
bfextu C M D R E G 1 B ( % a6 ) { #3 : #3 } ,% d1 | e x t r a c t d e s t i n a t i o n f o r m a t
| ;at this point only the dest
| ;formats sgl, dbl, ext are
| ;possible
cmpb #2 ,% d1
bgts d d b l | d o u b l e =5 , e x t e n d e d =2 , s i n g l e =1
bnes d s g l
| ;fall through to dext
dext :
bsrl d e s t _ e x t
bra m v o u t _ e n d
dsgl :
bsrl d e s t _ s g l
bra m v o u t _ e n d
ddbl :
bsrl d e s t _ d b l
bra m v o u t _ e n d
|
| Handle p o s s i b l e d e n o r m o r c a t a s t r o p h i c u n d e r f l o w c a s e s h e r e
|
xdnrm :
bsr s e t _ x o p | i n i t i a l i z e W B T E M P
bsetb #w b t e m p 15 _ b i t ,W B _ B Y T E ( % a6 ) | s e t w b t e m p15
movel % a0 ,% a1
movel E X C _ E A ( % a6 ) ,% a0 | a0 h a s t h e d e s t i n a t i o n p o i n t e r
bsrl d e s t _ e x t | s t o r e t o m e m o r y
bsetb #u n f l _ b i t , F P S R _ E X C E P T ( % a 6 )
bra m v o u t _ e n d
sp_under :
bsetb #e t e m p 15 _ b i t ,S T A G ( % a6 )
cmpw 4 ( % a1 ) ,% d0
blts s p _ c a t a s | c a t a s t r o p h i c u n d e r f l o w c a s e
movel #1 ,% d0 | l o a d i n r o u n d p r e c i s i o n
movel #s g l _ t h r e s h , % d 1 | l o a d i n s i n g l e d e n o r m t h r e s h o l d
bsrl d p s p d n r m | e x p e c t s d1 t o h a v e t h e p r o p e r
| ;denorm threshold
bsrl d e s t _ s g l | s t o r e s v a l u e t o d e s t i n a t i o n
bsetb #u n f l _ b i t , F P S R _ E X C E P T ( % a 6 )
bra m v o u t _ e n d | e x i t
dp_under :
bsetb #e t e m p 15 _ b i t ,S T A G ( % a6 )
cmpw 4 ( % a1 ) ,% d0
blts d p _ c a t a s | c a t a s t r o p h i c u n d e r f l o w c a s e
movel #d b l _ t h r e s h , % d 1 | l o a d i n d o u b l e p r e c i s i o n t h r e s h o l d
movel #2 ,% d0
bsrl d p s p d n r m | e x p e c t s d1 t o h a v e p r o p e r
| ;denorm threshold
| ;expects d0 to have round precision
bsrl d e s t _ d b l | s t o r e v a l u e t o d e s t i n a t i o n
bsetb #u n f l _ b i t , F P S R _ E X C E P T ( % a 6 )
bra m v o u t _ e n d | e x i t
|
| Handle c a t a s t r o p h i c u n d e r f l o w c a s e s h e r e
|
sp_catas :
| Temp f i x f o r z b i t s e t i n u n f _ s u b
movel U S E R _ F P S R ( % a6 ) ,- ( % a7 )
movel #1 ,% d0 | s e t r o u n d p r e c i s i o n t o s g l
bsrl u n f _ s u b | a0 p o i n t s t o r e s u l t
movel ( % a7 ) + ,U S E R _ F P S R ( % a6 )
movel #1 ,% d0
subw % d0 ,L O C A L _ E X ( % a0 ) | a c c o u n t f o r d i f f e r e n c e b e t w e e n
| ;denorm/norm bias
movel % a0 ,% a1 | a1 h a s t h e o p e r a n d i n p u t
movel E X C _ E A ( % a6 ) ,% a0 | a0 h a s t h e d e s t i n a t i o n p o i n t e r
bsrl d e s t _ s g l | s t o r e t h e r e s u l t
oril #u n f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
bra m v o u t _ e n d
dp_catas :
| Temp f i x f o r z b i t s e t i n u n f _ s u b
movel U S E R _ F P S R ( % a6 ) ,- ( % a7 )
movel #2 ,% d0 | s e t r o u n d p r e c i s i o n t o d b l
bsrl u n f _ s u b | a0 p o i n t s t o r e s u l t
movel ( % a7 ) + ,U S E R _ F P S R ( % a6 )
movel #1 ,% d0
subw % d0 ,L O C A L _ E X ( % a0 ) | a c c o u n t f o r d i f f e r e n c e b e t w e e n
| ;denorm/norm bias
movel % a0 ,% a1 | a1 h a s t h e o p e r a n d i n p u t
movel E X C _ E A ( % a6 ) ,% a0 | a0 h a s t h e d e s t i n a t i o n p o i n t e r
bsrl d e s t _ d b l | s t o r e t h e r e s u l t
oril #u n f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
bra m v o u t _ e n d
|
| Handle c a t a s t r o p h i c o v e r f l o w c a s e s h e r e
|
sp_over :
| Temp f i x f o r z b i t s e t i n u n f _ s u b
movel U S E R _ F P S R ( % a6 ) ,- ( % a7 )
movel #1 ,% d0
leal F P _ S C R 1 ( % a6 ) ,% a0 | u s e F P _ S C R 1 f o r c r e a t i n g r e s u l t
movel E T E M P _ E X ( % a6 ) ,( % a0 )
movel E T E M P _ H I ( % a6 ) ,4 ( % a0 )
movel E T E M P _ L O ( % a6 ) ,8 ( % a0 )
bsrl o v f _ r e s
movel ( % a7 ) + ,U S E R _ F P S R ( % a6 )
movel % a0 ,% a1
movel E X C _ E A ( % a6 ) ,% a0
bsrl d e s t _ s g l
orl #o v f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
bra m v o u t _ e n d
dp_over :
| Temp f i x f o r z b i t s e t i n o v f _ r e s
movel U S E R _ F P S R ( % a6 ) ,- ( % a7 )
movel #2 ,% d0
leal F P _ S C R 1 ( % a6 ) ,% a0 | u s e F P _ S C R 1 f o r c r e a t i n g r e s u l t
movel E T E M P _ E X ( % a6 ) ,( % a0 )
movel E T E M P _ H I ( % a6 ) ,4 ( % a0 )
movel E T E M P _ L O ( % a6 ) ,8 ( % a0 )
bsrl o v f _ r e s
movel ( % a7 ) + ,U S E R _ F P S R ( % a6 )
movel % a0 ,% a1
movel E X C _ E A ( % a6 ) ,% a0
bsrl d e s t _ d b l
orl #o v f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
bra m v o u t _ e n d
|
| DPSPDNRM
|
| This s u b r o u t i n e t a k e s a n e x t e n d e d n o r m a l i z e d n u m b e r a n d d e n o r m a l i z e s
| it t o t h e g i v e n r o u n d p r e c i s i o n . T h i s s u b r o u t i n e a l s o d e c r e m e n t s
| the i n p u t o p e r a n d ' s e x p o n e n t b y 1 t o a c c o u n t f o r t h e f a c t t h a t
| dest_ s g l o r d e s t _ d b l e x p e c t s a n o r m a l i z e d n u m b e r ' s b i a s .
|
| Input : a0 p o i n t s t o a n o r m a l i z e d n u m b e r i n i n t e r n a l e x t e n d e d f o r m a t
| d0 i s t h e r o u n d p r e c i s i o n ( =1 f o r s g l ; =2 for dbl)
| d1 i s t h e s i n g l e p r e c i s i o n o r d o u b l e p r e c i s i o n
| denorm t h r e s h o l d
|
| Output : ( In t h e f o r m a t f o r d e s t _ s g l o r d e s t _ d b l )
| a0 p o i n t s t o t h e d e s t i n a t i o n
| a1 p o i n t s t o t h e o p e r a n d
|
| Exceptions : Reports i n e x a c t 2 e x c e p t i o n b y s e t t i n g U S E R _ F P S R b i t s
|
dpspdnrm :
movel % d0 ,- ( % a7 ) | s a v e r o u n d p r e c i s i o n
clrl % d0 | c l e a r i n i t i a l g ,r ,s
bsrl d n r m _ l p | c a r e f u l w i t h d0 , i t ' s n e e d e d b y r o u n d
bfextu F P C R _ M O D E ( % a6 ) { #2 : #2 } ,% d1 | g e t r o u n d i n g m o d e
swap % d1
movew 2 ( % a7 ) ,% d1 | s e t r o u n d i n g p r e c i s i o n
swap % d1 | a t t h i s p o i n t d1 h a s P R E C / M O D E i n f o
bsrl r o u n d | r o u n d r e s u l t , s e t s t h e i n e x b i t i n
| ;USER_FPSR if needed
movew #1 ,% d0
subw % d0 ,L O C A L _ E X ( % a0 ) | a c c o u n t f o r d i f f e r e n c e i n d e n o r m
| ;vs norm bias
movel % a0 ,% a1 | a1 h a s t h e o p e r a n d i n p u t
movel E X C _ E A ( % a6 ) ,% a0 | a0 h a s t h e d e s t i n a t i o n p o i n t e r
addw #4 ,% a7 | p o p s t a c k
rts
|
| SET_ X O P i n i t i a l i z e d W B T E M P w i t h t h e v a l u e p o i n t e d t o b y a0
| input : a0 p o i n t s t o i n p u t o p e r a n d i n t h e i n t e r n a l e x t e n d e d f o r m a t
|
set_xop :
movel L O C A L _ E X ( % a0 ) ,W B T E M P _ E X ( % a6 )
movel L O C A L _ H I ( % a0 ) ,W B T E M P _ H I ( % a6 )
movel L O C A L _ L O ( % a0 ) ,W B T E M P _ L O ( % a6 )
bfclr W B T E M P _ S G N ( % a6 ) { #0 : #8 }
beqs s x o p
bsetb #s i g n _ b i t , W B T E M P _ E X ( % a 6 )
sxop :
bfclr S T A G ( % a6 ) { #5 : #4 } | c l e a r w b t m 6 6 ,w b t m 1 ,w b t m 0 ,s b i t
rts
|
| P_ M O V E
|
p_movet :
.long p_move
.long p_movez
.long p_movei
.long p_moven
.long p_move
p_regd :
.long p_dyd0
.long p_dyd1
.long p_dyd2
.long p_dyd3
.long p_dyd4
.long p_dyd5
.long p_dyd6
.long p_dyd7
pack_out :
leal p _ m o v e t ,% a0 | l o a d j m p t a b l e a d d r e s s
movew S T A G ( % a6 ) ,% d0 | g e t s o u r c e t a g
bfextu % d0 { #16 : #3 } ,% d0 | i s o l a t e s o u r c e b i t s
movel ( % a0 ,% d0 . w * 4 ) ,% a0 | l o a d a0 w i t h r o u t i n e l a b e l f o r t a g
jmp ( % a0 ) | g o t o t h e r o u t i n e
p_write :
movel #0x0c ,% d0 | g e t b y t e c o u n t
movel E X C _ E A ( % a6 ) ,% a1 | g e t t h e d e s t i n a t i o n a d d r e s s
bsr m e m _ w r i t e | w r i t e t h e u s e r ' s d e s t i n a t i o n
moveb #0 ,C U _ S A V E P C ( % a6 ) | s e t t h e c u s a v e p c t o a l l 0 ' s
|
| Also n o t e t h a t t h e d t a g m u s t b e s e t t o n o r m h e r e - t h i s i s b e c a u s e
| the 0 4 0 u s e s t h e d t a g t o e x e c u t e t h e c o r r e c t m i c r o c o d e .
|
bfclr D T A G ( % a6 ) { #0 : #3 } | s e t d t a g t o n o r m
rts
| Notes o n h a n d l i n g o f s p e c i a l c a s e ( z e r o , i n f , a n d n a n ) i n p u t s :
| 1 . Operr i s n o t s i g n a l l e d i f t h e k - f a c t o r i s g r e a t e r t h a n 1 8 .
| 2 . Per t h e m a n u a l , s t a t u s b i t s a r e n o t s e t .
|
p_move :
movew C M D R E G 1 B ( % a6 ) ,% d0
btstl #k f a c t _ b i t , % d 0 | t e s t f o r d y n a m i c k - f a c t o r
beqs s t a t i c k | i f c l e a r , k - f a c t o r i s s t a t i c
dynamick :
bfextu % d0 { #25 : #3 } ,% d0 | i s o l a t e r e g i s t e r f o r d y n a m i c k - f a c t o r
lea p _ r e g d ,% a0
movel % a0 @(%d0:l:4),%a0
jmp ( % a0 )
statick :
andiw #0x007f ,% d0 | g e t k - f a c t o r
bfexts % d0 { #25 : #7 } ,% d0 | s i g n e x t e n d d0 f o r b i n d e c
leal E T E M P ( % a6 ) ,% a0 | a0 w i l l p o i n t t o t h e p a c k e d d e c i m a l
bsrl b i n d e c | p e r f o r m t h e c o n v e r t ; data at a6
leal F P _ S C R 1 ( % a6 ) ,% a0 | l o a d a0 w i t h r e s u l t a d d r e s s
bral p _ w r i t e
p_movez :
leal E T E M P ( % a6 ) ,% a0 | a0 w i l l p o i n t t o t h e p a c k e d d e c i m a l
clrw 2 ( % a0 ) | c l e a r l o w e r w o r d o f e x p
clrl 4 ( % a0 ) | l o a d s e c o n d l w o r d o f Z E R O
clrl 8 ( % a0 ) | l o a d t h i r d l w o r d o f Z E R O
bra p _ w r i t e | g o w r i t e r e s u l t s
p_movei :
fmovel #0 ,% F P S R | c l e a r a i o p
leal E T E M P ( % a6 ) ,% a0 | a0 w i l l p o i n t t o t h e p a c k e d d e c i m a l
clrw 2 ( % a0 ) | c l e a r l o w e r w o r d o f e x p
bra p _ w r i t e | g o w r i t e t h e r e s u l t
p_moven :
leal E T E M P ( % a6 ) ,% a0 | a0 w i l l p o i n t t o t h e p a c k e d d e c i m a l
clrw 2 ( % a0 ) | c l e a r l o w e r w o r d o f e x p
bra p _ w r i t e | g o w r i t e t h e r e s u l t
|
| Routines t o r e a d t h e d y n a m i c k - f a c t o r f r o m D n .
|
p_dyd0 :
movel U S E R _ D 0 ( % a6 ) ,% d0
bras s t a t i c k
p_dyd1 :
movel U S E R _ D 1 ( % a6 ) ,% d0
bras s t a t i c k
p_dyd2 :
movel % d2 ,% d0
bras s t a t i c k
p_dyd3 :
movel % d3 ,% d0
bras s t a t i c k
p_dyd4 :
movel % d4 ,% d0
bras s t a t i c k
p_dyd5 :
movel % d5 ,% d0
bras s t a t i c k
p_dyd6 :
movel % d6 ,% d0
bra s t a t i c k
p_dyd7 :
movel % d7 ,% d0
bra s t a t i c k
| end