summary refs log tree commit diff stats
path: root/results/classifier/zero-shot-user-mode/instruction/1821515
blob: 1edfedbfabaf43519627673c269bf99fac0d7e7f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
instruction: 0.496
runtime: 0.302
syscall: 0.202



qemu-ppc (user) incorrectly converts float(nan)->double(non-nan)

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"
                   : "False");
    volatile double d = f1;
    printf ("d (%e, %#llx)\n",
        d, *(volatile uint64_t*)&d);
}
```

```
# incorrect execution:
$ powerpc-unknown-linux-gnu-gcc -O2 a.c -o a -static && qemu-ppc ./a 
f1 (5.104236e+38, 0x7fc00000) >= f2 (5.104236e+38, 0x7fc00000): True
d (5.104236e+38, 0x47f8000000000000)

# correct execution
$ scp a timberdoodle.ppc64.dev.gentoo.org:~/;  ssh timberdoodle.ppc64.dev.gentoo.org ./a
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.