Skip to content

Commit

Permalink
linux-user: Fix incorrect NaN detection in ARM nwfpe emulation
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Peter Maydell <[email protected]>
Signed-off-by: Riku Voipio <[email protected]>
  • Loading branch information
pm215 authored and suihkulokki committed Jan 7, 2011
1 parent 2bed652 commit 3ebe80c
Showing 1 changed file with 7 additions and 7 deletions.
14 changes: 7 additions & 7 deletions linux-user/arm/nwfpe/fpa11_cprt.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,21 +199,21 @@ static unsigned int PerformComparison(const unsigned int opcode)
{
case typeSingle:
//printk("single.\n");
if (float32_is_quiet_nan(fpa11->fpreg[Fn].fSingle))
if (float32_is_any_nan(fpa11->fpreg[Fn].fSingle))
goto unordered;
rFn = float32_to_floatx80(fpa11->fpreg[Fn].fSingle, &fpa11->fp_status);
break;

case typeDouble:
//printk("double.\n");
if (float64_is_quiet_nan(fpa11->fpreg[Fn].fDouble))
if (float64_is_any_nan(fpa11->fpreg[Fn].fDouble))
goto unordered;
rFn = float64_to_floatx80(fpa11->fpreg[Fn].fDouble, &fpa11->fp_status);
break;

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

case typeDouble:
//printk("double.\n");
if (float64_is_quiet_nan(fpa11->fpreg[Fm].fDouble))
if (float64_is_any_nan(fpa11->fpreg[Fm].fDouble))
goto unordered;
rFm = float64_to_floatx80(fpa11->fpreg[Fm].fDouble, &fpa11->fp_status);
break;

case typeExtended:
//printk("extended.\n");
if (floatx80_is_quiet_nan(fpa11->fpreg[Fm].fExtended))
if (floatx80_is_any_nan(fpa11->fpreg[Fm].fExtended))
goto unordered;
rFm = fpa11->fpreg[Fm].fExtended;
break;
Expand Down

0 comments on commit 3ebe80c

Please sign in to comment.