2005-04-16 15:20:36 -07:00
/ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| reg_ n o r m . S |
| |
| Copyright ( C ) 1 9 9 2 ,1 9 9 3 ,1 9 9 4 ,1 9 9 5 ,1 9 9 7 |
| W. M e t z e n t h e n , 2 2 P a r k e r S t , O r m o n d , V i c 3 1 6 3 , |
| Australia. E - m a i l b i l l m @suburbia.net |
| |
| Normalize t h e v a l u e i n a F P U _ R E G . |
| |
| Call f r o m C a s : |
| int F P U _ n o r m a l i z e ( F P U _ R E G * n ) |
| |
| int F P U _ n o r m a l i z e _ n u o ( F P U _ R E G * n ) |
| |
| Return v a l u e i s t h e t a g o f t h e a n s w e r , o r - e d w i t h F P U _ E x c e p t i o n i f |
| one w a s r a i s e d , o r - 1 o n i n t e r n a l e r r o r . |
| |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * /
# include " f p u _ e m u . h "
.text
ENTRY( F P U _ n o r m a l i z e )
pushl % e b p
movl % e s p ,% e b p
pushl % e b x
movl P A R A M 1 ,% e b x
movl S I G H ( % e b x ) ,% e d x
movl S I G L ( % e b x ) ,% e a x
orl % e d x ,% e d x / * m s b i t s * /
js L _ d o n e / * A l r e a d y n o r m a l i z e d * /
jnz L _ s h i f t _ 1 / * S h i f t l e f t 1 - 3 1 b i t s * /
orl % e a x ,% e a x
jz L _ z e r o / * T h e c o n t e n t s a r e z e r o * /
movl % e a x ,% e d x
xorl % e a x ,% e a x
subw $ 3 2 ,E X P ( % e b x ) / * T h i s c a n c a u s e a n u n d e r f l o w * /
/* We need to shift left by 1 - 31 bits */
L_shift_1 :
bsrl % e d x ,% e c x / * g e t t h e r e q u i r e d s h i f t i n % e c x * /
subl $ 3 1 ,% e c x
negl % e c x
shld % c l ,% e a x ,% e d x
shl % c l ,% e a x
subw % c x ,E X P ( % e b x ) / * T h i s c a n c a u s e a n u n d e r f l o w * /
movl % e d x ,S I G H ( % e b x )
movl % e a x ,S I G L ( % e b x )
L_done :
cmpw E X P _ O V E R ,E X P ( % e b x )
jge L _ o v e r f l o w
cmpw E X P _ U N D E R ,E X P ( % e b x )
jle L _ u n d e r f l o w
L_exit_valid :
movl T A G _ V a l i d ,% e a x
/* Convert the exponent to 80x87 form. */
addw E X T E N D E D _ E b i a s ,E X P ( % e b x )
andw $ 0 x7 f f f ,E X P ( % e b x )
L_exit :
popl % e b x
leave
ret
L_zero :
movw $ 0 ,E X P ( % e b x )
movl T A G _ Z e r o ,% e a x
jmp L _ e x i t
L_underflow :
/* Convert the exponent to 80x87 form. */
addw E X T E N D E D _ E b i a s ,E X P ( % e b x )
push % e b x
call a r i t h _ u n d e r f l o w
pop % e b x
jmp L _ e x i t
L_overflow :
/* Convert the exponent to 80x87 form. */
addw E X T E N D E D _ E b i a s ,E X P ( % e b x )
push % e b x
call a r i t h _ o v e r f l o w
pop % e b x
jmp L _ e x i t
2017-08-24 10:06:23 +02:00
ENDPROC( F P U _ n o r m a l i z e )
2005-04-16 15:20:36 -07:00
/* Normalise without reporting underflow or overflow */
ENTRY( F P U _ n o r m a l i z e _ n u o )
pushl % e b p
movl % e s p ,% e b p
pushl % e b x
movl P A R A M 1 ,% e b x
movl S I G H ( % e b x ) ,% e d x
movl S I G L ( % e b x ) ,% e a x
orl % e d x ,% e d x / * m s b i t s * /
js L _ e x i t _ n u o _ v a l i d / * A l r e a d y n o r m a l i z e d * /
jnz L _ n u o _ s h i f t _ 1 / * S h i f t l e f t 1 - 3 1 b i t s * /
orl % e a x ,% e a x
jz L _ e x i t _ n u o _ z e r o / * T h e c o n t e n t s a r e z e r o * /
movl % e a x ,% e d x
xorl % e a x ,% e a x
subw $ 3 2 ,E X P ( % e b x ) / * T h i s c a n c a u s e a n u n d e r f l o w * /
/* We need to shift left by 1 - 31 bits */
L_nuo_shift_1 :
bsrl % e d x ,% e c x / * g e t t h e r e q u i r e d s h i f t i n % e c x * /
subl $ 3 1 ,% e c x
negl % e c x
shld % c l ,% e a x ,% e d x
shl % c l ,% e a x
subw % c x ,E X P ( % e b x ) / * T h i s c a n c a u s e a n u n d e r f l o w * /
movl % e d x ,S I G H ( % e b x )
movl % e a x ,S I G L ( % e b x )
L_exit_nuo_valid :
movl T A G _ V a l i d ,% e a x
popl % e b x
leave
ret
L_exit_nuo_zero :
movl T A G _ Z e r o ,% e a x
movw E X P _ U N D E R ,E X P ( % e b x )
popl % e b x
leave
ret
2017-08-24 10:06:23 +02:00
ENDPROC( F P U _ n o r m a l i z e _ n u o )