2005-04-16 15:20:36 -07:00
|
| kernel_ e x . s a 3 . 3 1 2 / 1 9 / 9 0
|
| This f i l e c o n t a i n s r o u t i n e s t o f o r c e e x c e p t i o n s t a t u s i n t h e
| fpu f o r e x c e p t i o n a l c a s e s d e t e c t e d o r r e p o r t e d w i t h i n t h e
| transcendental f u n c t i o n s . T y p i c a l l y , t h e t _ x x r o u t i n e w i l l
| set t h e a p p r o p r i a t e b i t s i n t h e U S E R _ F P S R w o r d o n t h e s t a c k .
| The b i t s a r e t e s t e d i n g e n _ e x c e p t . s a t o d e t e r m i n e i f a n e x c e p t i o n a l
| situation n e e d s t o b e c r e a t e d o n r e t u r n f r o m t h e F P S P .
|
| 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
KERNEL_EX : | 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 "
mns_inf : .long 0xffff0000 , 0 x0 0 0 0 0 0 0 0 ,0 x00 0 0 0 0 0 0
pls_inf : .long 0x7fff0000 , 0 x0 0 0 0 0 0 0 0 ,0 x00 0 0 0 0 0 0
nan : .long 0x7fff0000 , 0 xffffffff,0 x f f f f f f f f
huge : .long 0x7ffe0000 , 0 xffffffff,0 x f f f f f f f f
| xref o v f _ r _ k
| xref u n f _ s u b
| xref n r m _ s e t
.global t_dz
.global t_dz2
.global t_operr
.global t_unfl
.global t_ovfl
.global t_ovfl2
.global t_inx2
.global t_frcinx
.global t_extdnrm
.global t_resdnrm
.global dst_nan
.global src_nan
|
| DZ e x c e p t i o n
|
|
| if d z t r a p d i s a b l e d
| store p r o p e r l y s i g n e d i n f ( u s e s i g n o f e t e m p ) i n t o f p0
| set F P S R e x c e p t i o n s t a t u s d z b i t , c o n d i t i o n c o d e
| inf b i t , a n d a c c r u e d d z b i t
| return
| frestore t h e f r a m e i n t o t h e m a c h i n e ( d o n e b y u n i m p _ h d )
|
| else d z t r a p e n a b l e d
| set e x c e p t i o n s t a t u s b i t & a c c r u e d b i t s i n F P S R
| set f l a g t o d i s a b l e s t o _ r e s f r o m c o r r u p t i n g f p r e g i s t e r
| return
| frestore t h e f r a m e i n t o t h e m a c h i n e ( d o n e b y u n i m p _ h d )
|
| t_ d z 2 i s u s e d b y m o n a d i c f u n c t i o n s s u c h a s f l o g n ( f r o m d o _ f u n c ) .
| t_ d z i s u s e d b y m o n a d i c f u n c t i o n s s u c h a s s a t a n h ( f r o m t h e
| transcendental f u n c t i o n ) .
|
t_dz2 :
bsetb #n e g _ b i t , F P S R _ C C ( % a 6 ) | s e t n e g b i t i n F P S R
fmovel #0 ,% F P S R | c l r s t a t u s b i t s ( Z s e t )
btstb #d z _ b i t , F P C R _ E N A B L E ( % a 6 ) | t e s t F P C R f o r d z e x c e n a b l e d
bnes d z _ e n a _ e n d
bras m _ i n f | f l o g x a l w a y s r e t u r n s - i n f
t_dz :
fmovel #0 ,% F P S R | c l r s t a t u s b i t s ( Z s e t )
btstb #d z _ b i t , F P C R _ E N A B L E ( % a 6 ) | t e s t F P C R f o r d z e x c e n a b l e d
bnes d z _ e n a
|
| dz d i s a b l e d
|
btstb #s i g n _ b i t , E T E M P _ E X ( % a 6 ) | c h e c k s i g n f o r n e g o r p o s
beqs p _ i n f | b r a n c h i f p o s s i g n
m_inf :
fmovemx m n s _ i n f ,% f p0 - % f p0 | l o a d - i n f
bsetb #n e g _ b i t , F P S R _ C C ( % a 6 ) | s e t n e g b i t i n F P S R
bras s e t _ f p s r
p_inf :
fmovemx p l s _ i n f ,% f p0 - % f p0 | l o a d + i n f
set_fpsr :
orl #d z i n f _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t I ,D Z ,A D Z
rts
|
| dz e n a b l e d
|
dz_ena :
btstb #s i g n _ b i t , E T E M P _ E X ( % a 6 ) | c h e c k s i g n f o r n e g o r p o s
beqs d z _ e n a _ e n d
bsetb #n e g _ b i t , F P S R _ C C ( % a 6 ) | s e t n e g b i t i n F P S R
dz_ena_end :
orl #d z i n f _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t I ,D Z ,A D Z
st S T O R E _ F L G ( % a6 )
rts
|
| OPERR e x c e p t i o n
|
| if ( o p e r r t r a p d i s a b l e d )
| set F P S R e x c e p t i o n s t a t u s o p e r r b i t , c o n d i t i o n c o d e
| nan b i t ; Store default NAN into fp0
| frestore t h e f r a m e i n t o t h e m a c h i n e ( d o n e b y u n i m p _ h d )
|
| else ( o p e r r t r a p e n a b l e d )
| set F P S R e x c e p t i o n s t a t u s o p e r r b i t , a c c r u e d o p e r r b i t
| set f l a g t o d i s a b l e s t o _ r e s f r o m c o r r u p t i n g f p r e g i s t e r
| frestore t h e f r a m e i n t o t h e m a c h i n e ( d o n e b y u n i m p _ h d )
|
t_operr :
orl #o p n a n _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t N a N , O P E R R , A I O P
btstb #o p e r r _ b i t , F P C R _ E N A B L E ( % a 6 ) | t e s t F P C R f o r o p e r r e n a b l e d
bnes o p _ e n a
fmovemx n a n ,% f p0 - % f p0 | l o a d d e f a u l t n a n
rts
op_ena :
st S T O R E _ F L G ( % a6 ) | d o n o t c o r r u p t d e s t i n a t i o n
rts
|
| t_ u n f l - - - U N F L e x c e p t i o n
|
| This e n t r y p o i n t i s u s e d b y a l l r o u t i n e s r e q u i r i n g u n f l , i n e x2 ,
| aunfl, a n d a i n e x t o b e s e t o n e x i t .
|
| On e n t r y , a0 p o i n t s t o t h e e x c e p t i o n a l o p e r a n d . T h e f i n a l e x c e p t i o n a l
| operand i s b u i l t i n F P _ S C R 1 a n d o n l y t h e s i g n f r o m t h e o r i g i n a l o p e r a n d
| is u s e d .
|
t_unfl :
clrl F P _ S C R 1 ( % a6 ) | s e t e x c e p t i o n a l o p e r a n d t o z e r o
clrl F P _ S C R 1 + 4 ( % a6 )
clrl F P _ S C R 1 + 8 ( % a6 )
tstb ( % a0 ) | e x t r a c t s i g n f r o m c a l l e r ' s e x o p
bpls u n f l _ s i g n o k
bset #s i g n _ b i t , F P _ S C R 1 ( % a6 )
unfl_signok :
leal F P _ S C R 1 ( % a6 ) ,% a0
orl #u n f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
| ;set UNFL, INEX2, AUNFL, AINEX
unfl_con :
btstb #u n f l _ b i t , F P C R _ E N A B L E ( % a 6 )
beqs u n f l _ d i s
unfl_ena :
bfclr S T A G ( % a6 ) { #5 : #3 } | c l e a r w b t m 6 6 ,w b t m 1 ,w b t m 0
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
bsetb #s t i c k y _ b i t , S T I C K Y ( % a 6 ) | s e t s t i c k y b i t
bclrb #E 1 ,E _ B Y T E ( % a6 )
unfl_dis :
bfextu F P C R _ M O D E ( % a6 ) { #0 : #2 } ,% d0 | g e t r o u n d p r e c i s i o n
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 ) | c o n v e r t t o i n t e r n a l e x t f o r m a t
bsr u n f _ s u b | r e t u r n s I E E E r e s u l t a t a0
| ;and sets FPSR_CC accordingly
bfclr L O C A L _ S G N ( % a0 ) { #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 u n f l _ f i n
bsetb #s i g n _ b i t , L O C A L _ E X ( % a 0 )
bsetb #s i g n _ b i t , F P _ S C R 1 ( % a6 ) | s e t s i g n b i t o f e x c o p e r a n d
unfl_fin :
fmovemx ( % a0 ) ,% f p0 - % f p0 | s t o r e r e s u l t i n f p0
rts
|
| t_ o v f l 2 - - - O V F L e x c e p t i o n ( w i t h o u t i n e x2 r e t u r n e d )
|
| This e n t r y i s u s e d b y s c a l e t o f o r c e c a t a s t r o p h i c o v e r f l o w . T h e
| ovfl, a o v f l , a n d a i n e x b i t s a r e s e t , b u t n o t t h e i n e x2 b i t .
|
t_ovfl2 :
orl #o v f l _ i n x _ m a s k , U S E R _ F P S R ( % a 6 )
movel E T E M P ( % a6 ) ,F P _ S C R 1 ( % a6 )
movel E T E M P _ H I ( % a6 ) ,F P _ S C R 1 + 4 ( % a6 )
movel E T E M P _ L O ( % a6 ) ,F P _ S C R 1 + 8 ( % a6 )
|
| Check f o r s i n g l e o r d o u b l e r o u n d p r e c i s i o n . I f s i n g l e , c h e c k i f
| the l o w e r 4 0 b i t s o f E T E M P a r e z e r o ; if not, set inex2. If double,
| check i f t h e l o w e r 2 1 b i t s a r e z e r o ; if not, set inex2.
|
moveb F P C R _ M O D E ( % a6 ) ,% d0
andib #0xc0 ,% d0
beq t _ w o r k | i f e x t e n d e d , f i n i s h o v f l p r o c e s s i n g
cmpib #0x40 ,% d0 | t e s t f o r s i n g l e
bnes t _ d b l
t_sgl :
tstb E T E M P _ L O ( % a6 )
bnes t _ s e t i n x2
movel E T E M P _ H I ( % a6 ) ,% d0
andil #0xff ,% d0 | l o o k a t o n l y l o w e r 8 b i t s
bnes t _ s e t i n x2
bra t _ w o r k
t_dbl :
movel E T E M P _ L O ( % a6 ) ,% d0
andil #0x7ff ,% d0 | l o o k a t o n l y l o w e r 1 1 b i t s
beq t _ w o r k
t_setinx2 :
orl #i n e x 2 _ m a s k ,U S E R _ F P S R ( % a6 )
bras t _ w o r k
|
| t_ o v f l - - - O V F L e x c e p t i o n
|
| * * Note : the e x c o p e r a n d i s r e t u r n e d i n E T E M P .
|
t_ovfl :
orl #o v f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
t_work :
btstb #o v f l _ b i t , F P C R _ E N A B L E ( % a 6 ) | t e s t F P C R f o r o v f l e n a b l e d
beqs o v f _ d i s
ovf_ena :
clrl F P _ S C R 1 ( % a6 ) | s e t e x c e p t i o n a l o p e r a n d
clrl F P _ S C R 1 + 4 ( % a6 )
clrl F P _ S C R 1 + 8 ( % a6 )
bfclr S T A G ( % a6 ) { #5 : #3 } | c l e a r w b t m 6 6 ,w b t m 1 ,w b t m 0
bclrb #w b t e m p 15 _ b i t ,W B _ B Y T E ( % a6 ) | c l e a r w b t e m p15
bsetb #s t i c k y _ b i t , S T I C K Y ( % a 6 ) | s e t s t i c k y b i t
bclrb #E 1 ,E _ B Y T E ( % a6 )
| ;fall through to disabled case
| For d i s a b l e d o v e r f l o w c a l l ' o v f _ r _ k ' . T h i s r o u t i n e l o a d s t h e
| correct r e s u l t b a s e d o n t h e r o u n d i n g p r e c i s i o n , d e s t i n a t i o n
| format, r o u n d i n g m o d e a n d s i g n .
|
ovf_dis :
bsr o v f _ r _ k | r e t u r n s u n s i g n e d E T E M P _ E X
| ;and sets FPSR_CC accordingly.
bfclr E T E M P _ S G N ( % a6 ) { #0 : #8 } | f i x s i g n
beqs o v f _ p o s
bsetb #s i g n _ b i t , E T E M P _ E X ( % a 6 )
bsetb #s i g n _ b i t , F P _ S C R 1 ( % a6 ) | s e t e x c e p t i o n a l o p e r a n d s i g n
ovf_pos :
fmovemx E T E M P ( % a6 ) ,% f p0 - % f p0 | m o v e t h e r e s u l t t o f p0
rts
|
| INEX2 e x c e p t i o n
|
| The i n e x2 a n d a i n e x b i t s a r e s e t .
|
t_inx2 :
orl #i n x 2 a _ m a s k ,U S E R _ F P S R ( % a6 ) | s e t I N E X 2 , A I N E X
rts
|
| Force I n e x2
|
| This r o u t i n e i s c a l l e d b y t h e t r a n s c e n d e n t a l r o u t i n e s t o f o r c e
| the i n e x2 e x c e p t i o n b i t s s e t i n t h e F P S R . I f t h e u n d e r f l o w b i t
| is s e t , b u t t h e u n d e r f l o w t r a p w a s n o t t a k e n , t h e a u n f l b i t i n
| the F P S R m u s t b e s e t .
|
t_frcinx :
orl #i n x 2 a _ m a s k ,U S E R _ F P S R ( % a6 ) | s e t I N E X 2 , A I N E X
btstb #u n f l _ b i t , F P S R _ E X C E P T ( % a 6 ) | t e s t f o r u n f l b i t s e t
beqs n o _ u a c c1 | i f c l e a r , d o n o t s e t a u n 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_uacc1 :
rts
|
| DST_ N A N
|
| Determine i f t h e d e s t i n a t i o n n a n i s s i g n a l l i n g o r n o n - s i g n a l l i n g ,
| and s e t t h e F P S R b i t s a c c o r d i n g l y . S e e t h e M C 6 8 0 4 0 U s e r ' s M a n u a l
| section 3 . 2 . 2 . 5 N O T - A - N U M B E R S .
|
dst_nan :
btstb #s i g n _ b i t , F P T E M P _ E X ( % a 6 ) | t e s t s i g n o f n a n
beqs d s t _ p o s | i f c l r , i t w a s p o s i t i v e
bsetb #n e g _ b i t , F P S R _ C C ( % a 6 ) | s e t N b i t
dst_pos :
btstb #s i g n a n _ b i t , F P T E M P _ H I ( % a 6 ) | c h e c k i f s i g n a l l i n g
beqs d s t _ s n a n | b r a n c h i f s i g n a l l i n g
fmovel % d1 ,% f p c r | r e s t o r e u s e r ' s r m o d e / p r e c
fmovex F P T E M P ( % a6 ) ,% f p0 | r e t u r n t h e n o n - s i g n a l l i n g n a n
|
| Check t h e s o u r c e n a n . I f i t i s s i g n a l l i n g , s n a n w i l l b e r e p o r t e d .
|
moveb S T A G ( % a6 ) ,% d0
andib #0xe0 ,% d0
cmpib #0x60 ,% d0
bnes n o _ s n a n
btstb #s i g n a n _ b i t , E T E M P _ H I ( % a 6 ) | c h e c k i f s i g n a l l i n g
bnes n o _ s n a n
orl #s n a n i o p _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t N A N , S N A N , A I O P
no_snan :
rts
dst_snan :
btstb #s n a n _ b i t , F P C R _ E N A B L E ( % a 6 ) | c h e c k i f t r a p e n a b l e d
beqs d s t _ d i s | b r a n c h i f d i s a b l e d
orb #n a n _ t a g , D T A G ( % a 6 ) | s e t u p d t a g f o r n a n
st S T O R E _ F L G ( % a6 ) | d o n o t s t o r e a r e s u l t
orl #s n a n i o p _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t N A N , S N A N , A I O P
rts
dst_dis :
bsetb #s i g n a n _ b i t , F P T E M P _ H I ( % a 6 ) | s e t S N A N b i t i n s o p
fmovel % d1 ,% f p c r | r e s t o r e u s e r ' s r m o d e / p r e c
fmovex F P T E M P ( % a6 ) ,% f p0 | l o a d n o n - s i g n . n a n
orl #s n a n i o p _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t N A N , S N A N , A I O P
rts
|
| SRC_ N A N
|
| Determine i f t h e s o u r c e n a n i s s i g n a l l i n g o r n o n - s i g n a l l i n g ,
| and s e t t h e F P S R b i t s a c c o r d i n g l y . S e e t h e M C 6 8 0 4 0 U s e r ' s M a n u a l
| section 3 . 2 . 2 . 5 N O T - A - N U M B E R S .
|
src_nan :
btstb #s i g n _ b i t , E T E M P _ E X ( % a 6 ) | t e s t s i g n o f n a n
beqs s r c _ p o s | i f c l r , i t w a s p o s i t i v e
bsetb #n e g _ b i t , F P S R _ C C ( % a 6 ) | s e t N b i t
src_pos :
btstb #s i g n a n _ b i t , E T E M P _ H I ( % a 6 ) | c h e c k i f s i g n a l l i n g
beqs s r c _ s n a n | b r a n c h i f s i g n a l l i n g
fmovel % d1 ,% f p c r | r e s t o r e u s e r ' s r m o d e / p r e c
fmovex E T E M P ( % a6 ) ,% f p0 | r e t u r n t h e n o n - s i g n a l l i n g n a n
rts
src_snan :
btstb #s n a n _ b i t , F P C R _ E N A B L E ( % a 6 ) | c h e c k i f t r a p e n a b l e d
beqs s r c _ d i s | b r a n c h i f d i s a b l e d
bsetb #s i g n a n _ b i t , E T E M P _ H I ( % a 6 ) | s e t S N A N b i t i n s o p
orb #n o r m _ t a g , D T A G ( % a 6 ) | s e t u p d t a g f o r n o r m
orb #n a n _ t a g , S T A G ( % a 6 ) | s e t u p s t a g f o r n a n
st S T O R E _ F L G ( % a6 ) | d o n o t s t o r e a r e s u l t
orl #s n a n i o p _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t N A N , S N A N , A I O P
rts
src_dis :
bsetb #s i g n a n _ b i t , E T E M P _ H I ( % a 6 ) | s e t S N A N b i t i n s o p
fmovel % d1 ,% f p c r | r e s t o r e u s e r ' s r m o d e / p r e c
fmovex E T E M P ( % a6 ) ,% f p0 | l o a d n o n - s i g n . n a n
orl #s n a n i o p _ m a s k , U S E R _ F P S R ( % a 6 ) | s e t N A N , S N A N , A I O P
rts
|
| For a l l f u n c t i o n s t h a t h a v e a d e n o r m a l i z e d i n p u t a n d t h a t f ( x ) =x ,
| this i s t h e e n t r y p o i n t
|
t_extdnrm :
orl #u n f i n x _ m a s k , U S E R _ F P S R ( % a 6 )
| ;set UNFL, INEX2, AUNFL, AINEX
bras x d n r m _ c o n
|
| Entry p o i n t f o r s c a l e w i t h e x t e n d e d d e n o r m . T h e f u n c t i o n d o e s
| not s e t i n e x2 , a u n f l , o r a i n e x .
|
t_resdnrm :
orl #u n f l _ m a s k , U S E R _ F P S R ( % a 6 )
xdnrm_con :
btstb #u n f l _ b i t , F P C R _ E N A B L E ( % a 6 )
beqs x d n r m _ d i s
|
| If e x c e p t i o n s a r e e n a b l e d , t h e a d d i t i o n a l t a s k o f s e t t i n g u p W B T E M P
| is n e e d e d s o t h a t w h e n t h e u n d e r f l o w e x c e p t i o n h a n d l e r i s e n t e r e d ,
| the u s e r p e r c e i v e s n o d i f f e r e n c e b e t w e e n w h a t t h e 0 4 0 p r o v i d e s v s .
| what t h e F P S P p r o v i d e s .
|
xdnrm_ena :
movel % a0 ,- ( % a7 )
movel L O C A L _ E X ( % a0 ) ,F P _ S C R 1 ( % a6 )
movel L O C A L _ H I ( % a0 ) ,F P _ S C R 1 + 4 ( % a6 )
movel L O C A L _ L O ( % a0 ) ,F P _ S C R 1 + 8 ( % a6 )
lea F P _ S C R 1 ( % 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 ) | c o n v e r t t o i n t e r n a l e x t f o r m a t
tstw L O C A L _ E X ( % a0 ) | c h e c k i f i n p u t i s d e n o r m
beqs x d n r m _ d n | i f s o , s k i p n r m _ s e t
bsr n r m _ s e t | n o r m a l i z e t h e r e s u l t ( e x p o n e n t
| ;will be negative
xdnrm_dn :
bclrb #s i g n _ b i t , L O C A L _ E X ( % a 0 ) | t a k e o f 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 x d e p
bsetb #s i g n _ b i t , L O C A L _ E X ( % a 0 )
xdep :
bfclr S T A G ( % a6 ) { #5 : #3 } | c l e a r w b t m 6 6 ,w b t m 1 ,w b t m 0
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
bclrb #s t i c k y _ b i t , S T I C K Y ( % a 6 ) | c l e a r s t i c k y b i t
bclrb #E 1 ,E _ B Y T E ( % a6 )
movel ( % a7 ) + ,% a0
xdnrm_dis :
bfextu F P C R _ M O D E ( % a6 ) { #0 : #2 } ,% d0 | g e t r o u n d p r e c i s i o n
bnes n o t _ e x t | i f n o t r o u n d e x t e n d e d , s t o r e
| ;IEEE defaults
is_ext :
btstb #s i g n _ b i t , L O C A L _ E X ( % a 0 )
beqs x d n r m _ s t o r e
bsetb #n e g _ b i t , F P S R _ C C ( % a 6 ) | s e t N b i t i n F P S R _ C C
bras x d n r m _ s t o r e
not_ext :
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 ) | c o n v e r t t o i n t e r n a l e x t f o r m a t
bsr u n f _ s u b | r e t u r n s I E E E r e s u l t p o i n t e d b y
| ;a0; sets FPSR_CC accordingly
bfclr L O C A L _ S G N ( % a0 ) { #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 x d n r m _ s t o r e
bsetb #s i g n _ b i t , L O C A L _ E X ( % a 0 )
xdnrm_store :
fmovemx ( % a0 ) ,% f p0 - % f p0 | s t o r e r e s u l t i n f p0
rts
|
| This s u b r o u t i n e i s u s e d f o r d y a d i c o p e r a t i o n s t h a t u s e a n e x t e n d e d
| denorm w i t h i n t h e k e r n e l . T h e a p p r o a c h u s e d i s t o c a p t u r e t h e f r a m e ,
| fix/ r e s t o r e .
|
.global t_avoid_unsupp
t_avoid_unsupp :
link % a2 ,#- L O C A L _ S I Z E | s o t h a t a 2 f p s p . h n e g a t i v e
| ;offsets may be used
fsave - ( % a7 )
tstb 1 ( % a7 ) | c h e c k i f i d l e , e x i t i f s o
beq i d l e _ e n d
btstb #E 1 ,E _ B Y T E ( % a2 ) | c h e c k f o r a n E 1 e x c e p t i o n i f
| ;enabled, there is an unsupp
beq e n d _ a v u n | e l s e , e x i t
btstb #7 ,D T A G ( % a2 ) | c h e c k f o r d e n o r m d e s t i n a t i o n
beqs s r c _ d e n | e l s e , m u s t b e a s o u r c e d e n o r m
|
| handle d e s t i n a t i o n d e n o r m
|
lea F P T E M P ( % a2 ) ,% a0
btstb #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 ) | c o n v e r t t o i n t e r n a l e x t f o r m a t
bclrb #7 ,D T A G ( % a2 ) | s e t D T A G t o n o r m
bsr n r m _ s e t | n o r m a l i z e r e s u l t , e x p o n e n t
| ;will become 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 k e s i g n
bfclr L O C A L _ S G N ( % a0 ) { #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 c k _ s r c _ d e n | c h e c k i f s o u r c e i s a l s o d e n o r m
bsetb #s i g n _ b i t , L O C A L _ E X ( % a 0 )
ck_src_den :
btstb #7 ,S T A G ( % a2 )
beqs e n d _ a v u n
src_den :
lea E T E M P ( % a2 ) ,% a0
btstb #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 ) | c o n v e r t t o i n t e r n a l e x t f o r m a t
bclrb #7 ,S T A G ( % a2 ) | s e t S T A G t o n o r m
bsr n r m _ s e t | n o r m a l i z e r e s u l t , e x p o n e n t
| ;will become 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 k e s i g n
bfclr L O C A L _ S G N ( % a0 ) { #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 d e n _ c o m
bsetb #s i g n _ b i t , L O C A L _ E X ( % a 0 )
den_com :
moveb #0xfe ,C U _ S A V E P C ( % a2 ) | s e t c o n t i n u e f r a m e
clrw N M N E X C ( % a2 ) | c l e a r N M N E X C
bclrb #E 1 ,E _ B Y T E ( % a2 )
| fmove. l % F P S R ,F P S R _ S H A D O W ( % a2 )
| bset. b #S F L A G , E _ B Y T E ( % a 2 )
| bset. b #X F L A G , T _ B Y T E ( % a 2 )
end_avun :
frestore ( % a7 ) +
unlk % a2
rts
idle_end :
addl #4 ,% a7
unlk % a2
rts
| end