* [Qemu-devel] [Bug 1843205] [NEW] Inaccurate Fmod on i386
@ 2019-09-09 0:51 Alexander Huszagh
2019-09-09 2:57 ` [Qemu-devel] [Bug 1843205] " Alexander Huszagh
2020-11-21 23:05 ` Peter Maydell
0 siblings, 2 replies; 3+ messages in thread
From: Alexander Huszagh @ 2019-09-09 0:51 UTC (permalink / raw)
To: qemu-devel
Public bug reported:
# Qemu Version
```bash
$ qemu-i386 --version
qemu-i386 version 3.0.1 (qemu-3.0.1-4.fc29)
Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers
```
# Failing Source Code (C)
```c
#include <math.h>
#include <stdio.h>
int main()
{
double x = 29860476080414620.0;
double y = 17.0;
double z = fmod(x, y);
printf("%f\n", z);
return 0;
}
```
The code was compiled with GCC (8.3.1) on x86-64 with the flags `-O3
-m32 -lm -static`.
# Emitted (Annotated) Assembly
In order to facilitate debugging the issue, the following assembly was
generated to show nothing unusual occurred during compilation. The
assembly was generated with flags `-S -O3 -m32 -lm`, and then annotated
to show the operands to fmod.
```asm
.file "a.c"
.text
.section .rodata.str1.1,"aMS",@progbits,1
.LC2:
.string "%f\n"
.section .text.startup,"ax",@progbits
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB16:
.cfi_startproc
leal 4(%esp), %ecx
.cfi_def_cfa 1, 0
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
.cfi_escape 0x10,0x5,0x2,0x75,0
movl %esp, %ebp
pushl %ecx
.cfi_escape 0xf,0x3,0x75,0x7c,0x6
subl $4, %esp
pushl $1076953088 ; high 32-bits of double for y
pushl $0 ; low 32-bits of double for y
pushl $1130005884 ; high 32-bits of double for x
pushl $2003187687 ; low 32-bits of double for x
call fmod
movl $.LC2, (%esp)
fstpl 4(%esp)
call printf
movl -4(%ebp), %ecx
.cfi_def_cfa 1, 0
addl $16, %esp
xorl %eax, %eax
leave
.cfi_restore 5
leal -4(%ecx), %esp
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE16:
.size main, .-main
.ident "GCC: (GNU) 8.3.1 20190223 (Red Hat 8.3.1-2)"
.section .note.GNU-stack,"",@progbits
```
# Result
Running the compiled binary on x86_64 produces the expected value of
`15.000000`, while using `qemu-i386 <binary>` produces the unexpected
result of `-4.000000`.
This was tested against:
1. Qemu 3.0.1 for Fedora 29.
2. Qemu 4.1.0 built from source, downloaded from https://download.qemu.org/qemu-4.1.0.tar.xz
3. Qemu built-from-source against commit 90b1e3afd33226b6078fec6d77a18373712a975c.
# Building Qemu
Qemu built-from-source was compiled as follows:
```bash
mkdir build && cd build
../configure --disable-kvm --target-list="i386-linux-user"
make -j 5
```
# Results
All built versions of Qemu running the 32-bit failed to produce the
accurate result. Using qemu-x86_64 against an x86_64 binary built from
the same C source code produces correct results. Running the 32-bit
binary natively produces the correct result.
** Affects: qemu
Importance: Undecided
Status: New
** Tags: fmod
--
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/1843205
Title:
Inaccurate Fmod on i386
Status in QEMU:
New
Bug description:
# Qemu Version
```bash
$ qemu-i386 --version
qemu-i386 version 3.0.1 (qemu-3.0.1-4.fc29)
Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers
```
# Failing Source Code (C)
```c
#include <math.h>
#include <stdio.h>
int main()
{
double x = 29860476080414620.0;
double y = 17.0;
double z = fmod(x, y);
printf("%f\n", z);
return 0;
}
```
The code was compiled with GCC (8.3.1) on x86-64 with the flags `-O3
-m32 -lm -static`.
# Emitted (Annotated) Assembly
In order to facilitate debugging the issue, the following assembly was
generated to show nothing unusual occurred during compilation. The
assembly was generated with flags `-S -O3 -m32 -lm`, and then
annotated to show the operands to fmod.
```asm
.file "a.c"
.text
.section .rodata.str1.1,"aMS",@progbits,1
.LC2:
.string "%f\n"
.section .text.startup,"ax",@progbits
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB16:
.cfi_startproc
leal 4(%esp), %ecx
.cfi_def_cfa 1, 0
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
.cfi_escape 0x10,0x5,0x2,0x75,0
movl %esp, %ebp
pushl %ecx
.cfi_escape 0xf,0x3,0x75,0x7c,0x6
subl $4, %esp
pushl $1076953088 ; high 32-bits of double for y
pushl $0 ; low 32-bits of double for y
pushl $1130005884 ; high 32-bits of double for x
pushl $2003187687 ; low 32-bits of double for x
call fmod
movl $.LC2, (%esp)
fstpl 4(%esp)
call printf
movl -4(%ebp), %ecx
.cfi_def_cfa 1, 0
addl $16, %esp
xorl %eax, %eax
leave
.cfi_restore 5
leal -4(%ecx), %esp
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE16:
.size main, .-main
.ident "GCC: (GNU) 8.3.1 20190223 (Red Hat 8.3.1-2)"
.section .note.GNU-stack,"",@progbits
```
# Result
Running the compiled binary on x86_64 produces the expected value of
`15.000000`, while using `qemu-i386 <binary>` produces the unexpected
result of `-4.000000`.
This was tested against:
1. Qemu 3.0.1 for Fedora 29.
2. Qemu 4.1.0 built from source, downloaded from https://download.qemu.org/qemu-4.1.0.tar.xz
3. Qemu built-from-source against commit 90b1e3afd33226b6078fec6d77a18373712a975c.
# Building Qemu
Qemu built-from-source was compiled as follows:
```bash
mkdir build && cd build
../configure --disable-kvm --target-list="i386-linux-user"
make -j 5
```
# Results
All built versions of Qemu running the 32-bit failed to produce the
accurate result. Using qemu-x86_64 against an x86_64 binary built from
the same C source code produces correct results. Running the 32-bit
binary natively produces the correct result.
To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/1843205/+subscriptions
^ permalink raw reply [flat|nested] 3+ messages in thread
* [Qemu-devel] [Bug 1843205] Re: Inaccurate Fmod on i386
2019-09-09 0:51 [Qemu-devel] [Bug 1843205] [NEW] Inaccurate Fmod on i386 Alexander Huszagh
@ 2019-09-09 2:57 ` Alexander Huszagh
2020-11-21 23:05 ` Peter Maydell
1 sibling, 0 replies; 3+ messages in thread
From: Alexander Huszagh @ 2019-09-09 2:57 UTC (permalink / raw)
To: qemu-devel
** Tags removed: fmod
** Tags added: float libm
--
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/1843205
Title:
Inaccurate Fmod on i386
Status in QEMU:
New
Bug description:
# Qemu Version
```bash
$ qemu-i386 --version
qemu-i386 version 3.0.1 (qemu-3.0.1-4.fc29)
Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers
```
# Failing Source Code (C)
```c
#include <math.h>
#include <stdio.h>
int main()
{
double x = 29860476080414620.0;
double y = 17.0;
double z = fmod(x, y);
printf("%f\n", z);
return 0;
}
```
The code was compiled with GCC (8.3.1) on x86-64 with the flags `-O3
-m32 -lm -static`.
# Emitted (Annotated) Assembly
In order to facilitate debugging the issue, the following assembly was
generated to show nothing unusual occurred during compilation. The
assembly was generated with flags `-S -O3 -m32 -lm`, and then
annotated to show the operands to fmod.
```asm
.file "a.c"
.text
.section .rodata.str1.1,"aMS",@progbits,1
.LC2:
.string "%f\n"
.section .text.startup,"ax",@progbits
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB16:
.cfi_startproc
leal 4(%esp), %ecx
.cfi_def_cfa 1, 0
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
.cfi_escape 0x10,0x5,0x2,0x75,0
movl %esp, %ebp
pushl %ecx
.cfi_escape 0xf,0x3,0x75,0x7c,0x6
subl $4, %esp
pushl $1076953088 ; high 32-bits of double for y
pushl $0 ; low 32-bits of double for y
pushl $1130005884 ; high 32-bits of double for x
pushl $2003187687 ; low 32-bits of double for x
call fmod
movl $.LC2, (%esp)
fstpl 4(%esp)
call printf
movl -4(%ebp), %ecx
.cfi_def_cfa 1, 0
addl $16, %esp
xorl %eax, %eax
leave
.cfi_restore 5
leal -4(%ecx), %esp
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE16:
.size main, .-main
.ident "GCC: (GNU) 8.3.1 20190223 (Red Hat 8.3.1-2)"
.section .note.GNU-stack,"",@progbits
```
# Result
Running the compiled binary on x86_64 produces the expected value of
`15.000000`, while using `qemu-i386 <binary>` produces the unexpected
result of `-4.000000`.
This was tested against:
1. Qemu 3.0.1 for Fedora 29.
2. Qemu 4.1.0 built from source, downloaded from https://download.qemu.org/qemu-4.1.0.tar.xz
3. Qemu built-from-source against commit 90b1e3afd33226b6078fec6d77a18373712a975c.
# Building Qemu
Qemu built-from-source was compiled as follows:
```bash
mkdir build && cd build
../configure --disable-kvm --target-list="i386-linux-user"
make -j 5
```
# Results
All built versions of Qemu running the 32-bit failed to produce the
accurate result. Using qemu-x86_64 against an x86_64 binary built from
the same C source code produces correct results. Running the 32-bit
binary natively produces the correct result.
To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/1843205/+subscriptions
^ permalink raw reply [flat|nested] 3+ messages in thread
* [Bug 1843205] Re: Inaccurate Fmod on i386
2019-09-09 0:51 [Qemu-devel] [Bug 1843205] [NEW] Inaccurate Fmod on i386 Alexander Huszagh
2019-09-09 2:57 ` [Qemu-devel] [Bug 1843205] " Alexander Huszagh
@ 2020-11-21 23:05 ` Peter Maydell
1 sibling, 0 replies; 3+ messages in thread
From: Peter Maydell @ 2020-11-21 23:05 UTC (permalink / raw)
To: qemu-devel
On current head-of-git QEMU I get the correct answer. I think this was
probably fixed by the reimplementation of the 'fprem' emulation in
commit 5ef396e2ba86, which was in the 5.1.0 release.
** Changed in: qemu
Status: New => Fix Released
--
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/1843205
Title:
Inaccurate Fmod on i386
Status in QEMU:
Fix Released
Bug description:
# Qemu Version
```bash
$ qemu-i386 --version
qemu-i386 version 3.0.1 (qemu-3.0.1-4.fc29)
Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers
```
# Failing Source Code (C)
```c
#include <math.h>
#include <stdio.h>
int main()
{
double x = 29860476080414620.0;
double y = 17.0;
double z = fmod(x, y);
printf("%f\n", z);
return 0;
}
```
The code was compiled with GCC (8.3.1) on x86-64 with the flags `-O3
-m32 -lm -static`.
# Emitted (Annotated) Assembly
In order to facilitate debugging the issue, the following assembly was
generated to show nothing unusual occurred during compilation. The
assembly was generated with flags `-S -O3 -m32 -lm`, and then
annotated to show the operands to fmod.
```asm
.file "a.c"
.text
.section .rodata.str1.1,"aMS",@progbits,1
.LC2:
.string "%f\n"
.section .text.startup,"ax",@progbits
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB16:
.cfi_startproc
leal 4(%esp), %ecx
.cfi_def_cfa 1, 0
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
.cfi_escape 0x10,0x5,0x2,0x75,0
movl %esp, %ebp
pushl %ecx
.cfi_escape 0xf,0x3,0x75,0x7c,0x6
subl $4, %esp
pushl $1076953088 ; high 32-bits of double for y
pushl $0 ; low 32-bits of double for y
pushl $1130005884 ; high 32-bits of double for x
pushl $2003187687 ; low 32-bits of double for x
call fmod
movl $.LC2, (%esp)
fstpl 4(%esp)
call printf
movl -4(%ebp), %ecx
.cfi_def_cfa 1, 0
addl $16, %esp
xorl %eax, %eax
leave
.cfi_restore 5
leal -4(%ecx), %esp
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE16:
.size main, .-main
.ident "GCC: (GNU) 8.3.1 20190223 (Red Hat 8.3.1-2)"
.section .note.GNU-stack,"",@progbits
```
# Result
Running the compiled binary on x86_64 produces the expected value of
`15.000000`, while using `qemu-i386 <binary>` produces the unexpected
result of `-4.000000`.
This was tested against:
1. Qemu 3.0.1 for Fedora 29.
2. Qemu 4.1.0 built from source, downloaded from https://download.qemu.org/qemu-4.1.0.tar.xz
3. Qemu built-from-source against commit 90b1e3afd33226b6078fec6d77a18373712a975c.
# Building Qemu
Qemu built-from-source was compiled as follows:
```bash
mkdir build && cd build
../configure --disable-kvm --target-list="i386-linux-user"
make -j 5
```
# Results
All built versions of Qemu running the 32-bit failed to produce the
accurate result. Using qemu-x86_64 against an x86_64 binary built from
the same C source code produces correct results. Running the 32-bit
binary natively produces the correct result.
To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/1843205/+subscriptions
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2020-11-21 23:11 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-09-09 0:51 [Qemu-devel] [Bug 1843205] [NEW] Inaccurate Fmod on i386 Alexander Huszagh
2019-09-09 2:57 ` [Qemu-devel] [Bug 1843205] " Alexander Huszagh
2020-11-21 23:05 ` Peter Maydell
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.