summary refs log tree commit diff stats
path: root/results/scraper/launchpad/1841442
blob: 656b255c610c1c9c9edd430fef8709cf8d9c3df5 (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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
floating point emulation can fail to set FE_INEXACT

Floating point emulation can fail to set FE_INEXACT in some circumstances. This shows up quite often in glibc's "math" tests.  A similar test is attached.

On ppc64le native:
--
$ gcc nextafter.c -o nextafter -lm
$ ./nextafter $(./nextafter)
0x0000000000000001 0.000000
0x0

0xa000000
FE_INEXACT FE_UNDERFLOW
0x0000000000000000 0.000000
--

On x86_64:
--
$ gcc nextafter.c -o nextafter -lm
$ ./nextafter $(./nextafter)
0x0000000000000001 0.000000
0x0

0x30
FE_INEXACT FE_UNDERFLOW 
0x0000000000000000 0.000000
--

Using qemu-system-ppc64
--
$ ./nextafter $(./nextafter)
0x0000000000000001 0.000000
0x0

0x8000000
FE_UNDERFLOW 
0x0000000000000000 0.000000
--

Using qemu-x86_64:
--
$ ./nextafter $(./nextafter)
0x0000000000000001 0.000000
0x0

0x0

0x0000000000000000 0.000000
--

QEMU versions vary, but not too much, and are pretty close to git HEAD:
- 586f3dced9 (HEAD -> master, origin/master, origin/HEAD) Merge remote-tracking branch 'remotes/cohuck/tags/s390x-20190822' into staging
- 864ab31 Update version for v4.1.0-rc4 release

Since the issue happens nearly identically on different targets, I suspect the issue lies somewhere in fpu/softfloat.c.



Well, maybe yes and maybe no.  What you've done is choose two targets
whose floating point emulation have not been well maintained.

If I try this same test on aarch64, it passes:

$ ~/a.out 0x0000000000000001
0x0000000000000001 0.000000
0x0

0x18
FE_INEXACT FE_UNDERFLOW 
0x0000000000000000 0.000000

$ ./aarch64-linux-user/qemu-aarch64 ~/a.out 0x0000000000000001
0x0000000000000001 0.000000
0x0

0x18
FE_INEXACT FE_UNDERFLOW 
0x0000000000000000 0.000000


Interesting. Did you run qemu-aarch64 on aarch64? If so, it may have been using "hardfloat".  I ran "qemu-system-ppc64" on x86_64 and "qemu-x86_64" on ppc64le to ensure I was using "softfloat".


Richard Henderson <email address hidden> writes:

> Well, maybe yes and maybe no.  What you've done is choose two targets
> whose floating point emulation have not been well maintained.

So this is a failure on the x86_64 and ppc64 frontends to correctly set
the softfloat modes when their appropriate registers are set?

>
> If I try this same test on aarch64, it passes:
>
> $ ~/a.out 0x0000000000000001
> 0x0000000000000001 0.000000
> 0x0
>
> 0x18
> FE_INEXACT FE_UNDERFLOW
> 0x0000000000000000 0.000000
>
> $ ./aarch64-linux-user/qemu-aarch64 ~/a.out 0x0000000000000001
> 0x0000000000000001 0.000000
> 0x0
>
> 0x18
> FE_INEXACT FE_UNDERFLOW
> 0x0000000000000000 0.000000


--
Alex Bennée


> Interesting. Did you run qemu-aarch64 on aarch64? If so, it may have been
> using "hardfloat". I ran "qemu-system-ppc64" on x86_64 and "qemu-x86_64"
> on ppc64le to ensure I was using "softfloat".

That's not how that works.  Indeed, the point of the hardfloat path is to
accelerate fpu emulation for a non-native guest.

That said, qemu-system-ppc64 will *never* use hardfloat, because ppc always
need the current and correct result of inexact for emulation of the FI bit,
which requires that we use the softfloat path.

Also, use of the hardfloat path requires normal inputs.  For this test case
we're passing the minimum denormal input: 0x0000_0000_0000_0001.  So we will
always use the softfloat path for this.


Patch for ppc:
https://lists.gnu.org/archive/html/qemu-devel/2019-08/msg05532.html

Fixing x86_64 is significantly harder, as support for fp exceptions
is completely lacking in the code currently.

Fixed by 16ce2fffa660 ("target/ppc: Fix do_float_check_status vs inexact")