qemu-ppc (user) incorrectly converts float(nan)->double(non-nan)
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
QEMU |
New
|
Undecided
|
Unassigned |
Bug Description
Noticed on qemu-3.1.0 on GHC test suite where float32 comparisons didn't work on NaNs.
Here is the minimal reproducer:
```c
// cat a.c
#include <stdio.h>
#include <math.h>
#include <stdint.h>
int main() {
volatile float f1 = NAN;
volatile float f2 = NAN;
printf ("f1 (%e, %#x) >= f2 (%e, %#x): %s\n",
f1, *(volatile uint32_t*)&f1,
f2, *(volatile uint32_t*)&f2,
(f1 >= f2) ? "True"
volatile double d = f1;
printf ("d (%e, %#llx)\n",
d, *(volatile uint64_t*)&d);
}
```
```
# incorrect execution:
$ powerpc-
f1 (5.104236e+38, 0x7fc00000) >= f2 (5.104236e+38, 0x7fc00000): True
d (5.104236e+38, 0x47f8000000000000)
# correct execution
$ scp a timberdoodle.
f1 (nan, 0x7fc00000) >= f2 (nan, 0x7fc00000): False
d (nan, 0x7ff8000000000000)
```
Note: qemu-ppc handled float32 extension as it was not a NaN (exp=111..1111) but a normalized number.
The bug is in the same area as https:/ /bugs.launchpad .net/qemu/ +bug/1821444 but in another branch of 'uint64_t helper_ todouble( uint32_ t arg=0x1)'.