linux-user: Fix incorrect NaN detection in ARM nwfpe emulation

The code in the linux-user ARM nwfpe emulation was incorrectly
checking only for quiet NaNs when it should have been checking
for any kind of NaN. This is probably because the code in
question was taken from the Linux kernel, whose copy of the
softfloat library had been modified so that float*_is_nan()
returned true for all NaNs, not just quiet ones. The qemu
equivalent function is float*_is_any_nan(), so use that.
NB that this code is really obsolete since nobody uses FPE
for actual arithmetic now; this is just cleanup following
the recent renaming of the NaN related functions.

Acked-by: Aurelien Jarno <aurelien@aurel32.net>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Riku Voipio <riku.voipio@iki.fi>
This commit is contained in:
Peter Maydell 2011-01-06 18:34:44 +00:00 committed by Riku Voipio
parent 2bed652fc5
commit 3ebe80c299

View File

@ -199,21 +199,21 @@ static unsigned int PerformComparison(const unsigned int opcode)
{ {
case typeSingle: case typeSingle:
//printk("single.\n"); //printk("single.\n");
if (float32_is_quiet_nan(fpa11->fpreg[Fn].fSingle)) if (float32_is_any_nan(fpa11->fpreg[Fn].fSingle))
goto unordered; goto unordered;
rFn = float32_to_floatx80(fpa11->fpreg[Fn].fSingle, &fpa11->fp_status); rFn = float32_to_floatx80(fpa11->fpreg[Fn].fSingle, &fpa11->fp_status);
break; break;
case typeDouble: case typeDouble:
//printk("double.\n"); //printk("double.\n");
if (float64_is_quiet_nan(fpa11->fpreg[Fn].fDouble)) if (float64_is_any_nan(fpa11->fpreg[Fn].fDouble))
goto unordered; goto unordered;
rFn = float64_to_floatx80(fpa11->fpreg[Fn].fDouble, &fpa11->fp_status); rFn = float64_to_floatx80(fpa11->fpreg[Fn].fDouble, &fpa11->fp_status);
break; break;
case typeExtended: case typeExtended:
//printk("extended.\n"); //printk("extended.\n");
if (floatx80_is_quiet_nan(fpa11->fpreg[Fn].fExtended)) if (floatx80_is_any_nan(fpa11->fpreg[Fn].fExtended))
goto unordered; goto unordered;
rFn = fpa11->fpreg[Fn].fExtended; rFn = fpa11->fpreg[Fn].fExtended;
break; break;
@ -225,7 +225,7 @@ static unsigned int PerformComparison(const unsigned int opcode)
{ {
//printk("Fm is a constant: #%d.\n",Fm); //printk("Fm is a constant: #%d.\n",Fm);
rFm = getExtendedConstant(Fm); rFm = getExtendedConstant(Fm);
if (floatx80_is_quiet_nan(rFm)) if (floatx80_is_any_nan(rFm))
goto unordered; goto unordered;
} }
else else
@ -235,21 +235,21 @@ static unsigned int PerformComparison(const unsigned int opcode)
{ {
case typeSingle: case typeSingle:
//printk("single.\n"); //printk("single.\n");
if (float32_is_quiet_nan(fpa11->fpreg[Fm].fSingle)) if (float32_is_any_nan(fpa11->fpreg[Fm].fSingle))
goto unordered; goto unordered;
rFm = float32_to_floatx80(fpa11->fpreg[Fm].fSingle, &fpa11->fp_status); rFm = float32_to_floatx80(fpa11->fpreg[Fm].fSingle, &fpa11->fp_status);
break; break;
case typeDouble: case typeDouble:
//printk("double.\n"); //printk("double.\n");
if (float64_is_quiet_nan(fpa11->fpreg[Fm].fDouble)) if (float64_is_any_nan(fpa11->fpreg[Fm].fDouble))
goto unordered; goto unordered;
rFm = float64_to_floatx80(fpa11->fpreg[Fm].fDouble, &fpa11->fp_status); rFm = float64_to_floatx80(fpa11->fpreg[Fm].fDouble, &fpa11->fp_status);
break; break;
case typeExtended: case typeExtended:
//printk("extended.\n"); //printk("extended.\n");
if (floatx80_is_quiet_nan(fpa11->fpreg[Fm].fExtended)) if (floatx80_is_any_nan(fpa11->fpreg[Fm].fExtended))
goto unordered; goto unordered;
rFm = fpa11->fpreg[Fm].fExtended; rFm = fpa11->fpreg[Fm].fExtended;
break; break;