target-i386: fix helper_fxtract() wrt softfloat

With softfloat it's not possible to play with the overflow of an
unsigned value to get the 0 case partially correct. Use a special case
for that. Using a division to generate an infinity is the easiest way
that works for both softfloat and softfloat-native.

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
Aurelien Jarno 2011-04-20 13:04:23 +02:00
parent 788e733664
commit c9ad19c57b
1 changed files with 16 additions and 7 deletions

View File

@ -4005,15 +4005,24 @@ void helper_fpatan(void)
void helper_fxtract(void)
{
CPU86_LDoubleU temp;
unsigned int expdif;
temp.d = ST0;
expdif = EXPD(temp) - EXPBIAS;
/*DP exponent bias*/
ST0 = expdif;
fpush();
BIASEXPONENT(temp);
ST0 = temp.d;
if (floatx_is_zero(ST0)) {
/* Easy way to generate -inf and raising division by 0 exception */
ST0 = floatx_div(floatx_chs(floatx_one), floatx_zero, &env->fp_status);
fpush();
ST0 = temp.d;
} else {
int expdif;
expdif = EXPD(temp) - EXPBIAS;
/*DP exponent bias*/
ST0 = int32_to_floatx(expdif, &env->fp_status);
fpush();
BIASEXPONENT(temp);
ST0 = temp.d;
}
}
void helper_fprem1(void)