Public bug reported: On gcc123 cfarm machine, I was testing m68k executables generated by Free Pascal Compiler.
muller@gcc123:~/pas/check$ cat inf.pp function get_double(x : double):double; begin get_double:=x; end; var y : double; py : pbyte; i : byte; begin y:=1.0/0.0; py:=@y; {$ifdef ENDIAN_LITTLE} write('little endian y='); for i:=7 downto 0 do {$else not ENDIAN_LITTLE} write('big endian y='); for i:=0 to 7 do {$endif} write(hexstr(py[i],2)); writeln; y:=get_double(y)+1; {$ifdef ENDIAN_LITTLE} write('little endian y='); for i:=7 downto 0 do {$else not ENDIAN_LITTLE} write('big endian y='); for i:=0 to 7 do {$endif} write(hexstr(py[i],2)); writeln; end. muller@gcc123:~/pas/check$ ppc68k inf Free Pascal Compiler version 3.3.1-r20:42973M [2019/09/11] for m68k Copyright (c) 1993-2019 by Florian Klaempfl and others Target OS: Linux for m68k Compiling inf.pp Assembling program Linking inf 33 lines compiled, 0.1 sec muller@gcc123:~/pas/check$ ./inf big endian y=7FF0000000000000 big endian y=7FFFFFFFFFFFFFFF muller@gcc123:~/pas/check$ qemu-m68k ./inf big endian y=7FF0000000000000 big endian y=7FFFFFFFFFFFFFFF muller@gcc123:~/pas/check$ ~/sys-root/bin/qemu-m68k ./inf qemu-m68k qemu-m68k-fixed muller@gcc123:~/pas/check$ ~/sys-root/bin/qemu-m68k-fixed ./inf big endian y=7FF0000000000000 big endian y=7FF0000000000000 ~/sys-root/bin/qemu-m68k is 4.1.0 release, ~/sys-root/bin/qemu-m68k-fixed is the same source with a unique change: gnu/qemu/qemu-4.1.0/fpu/softfloat-specialize.h:214:#if defined(TARGET_M68K) gnu/qemu/qemu-4.1.0/fpu/softfloat-specialize.h-215-#define floatx80_infinity_low LIT64(0x0000000000000000) gnu/qemu/qemu-4.1.0/fpu/softfloat-specialize.h-216-#else gnu/qemu/qemu-4.1.0/fpu/softfloat-specialize.h-217-#define floatx80_infinity_low LIT64(0x8000000000000000) gnu/qemu/qemu-4.1.0/fpu/softfloat-specialize.h-218-#endif the M68K branch value is set to the same value as the other branch. The problem of the M68K specific floatx86_infinity_low values is that is enters in conflict with muller@gcc123:~/pas/check$ grep -nA6 invalid_enc /home/muller/gnu/qemu/qemu-4.1.0/include/fpu/softfloat.h 752:static inline bool floatx80_invalid_encoding(floatx80 a) 753-{ 754- return (a.low & (1ULL << 63)) == 0 && (a.high & 0x7FFF) != 0; 755-} And thus the m68k variant of floatx80 representing +Infinity is considered as an invalid encoding, and thus converted into a NaN 7FFFFFFFFFFFFFFF ** Affects: qemu Importance: Undecided Status: New -- You received this bug notification because you are a member of qemu- devel-ml, which is subscribed to QEMU. https://bugs.launchpad.net/bugs/1843651 Title: m68k fpu bug Status in QEMU: New Bug description: On gcc123 cfarm machine, I was testing m68k executables generated by Free Pascal Compiler. muller@gcc123:~/pas/check$ cat inf.pp function get_double(x : double):double; begin get_double:=x; end; var y : double; py : pbyte; i : byte; begin y:=1.0/0.0; py:=@y; {$ifdef ENDIAN_LITTLE} write('little endian y='); for i:=7 downto 0 do {$else not ENDIAN_LITTLE} write('big endian y='); for i:=0 to 7 do {$endif} write(hexstr(py[i],2)); writeln; y:=get_double(y)+1; {$ifdef ENDIAN_LITTLE} write('little endian y='); for i:=7 downto 0 do {$else not ENDIAN_LITTLE} write('big endian y='); for i:=0 to 7 do {$endif} write(hexstr(py[i],2)); writeln; end. muller@gcc123:~/pas/check$ ppc68k inf Free Pascal Compiler version 3.3.1-r20:42973M [2019/09/11] for m68k Copyright (c) 1993-2019 by Florian Klaempfl and others Target OS: Linux for m68k Compiling inf.pp Assembling program Linking inf 33 lines compiled, 0.1 sec muller@gcc123:~/pas/check$ ./inf big endian y=7FF0000000000000 big endian y=7FFFFFFFFFFFFFFF muller@gcc123:~/pas/check$ qemu-m68k ./inf big endian y=7FF0000000000000 big endian y=7FFFFFFFFFFFFFFF muller@gcc123:~/pas/check$ ~/sys-root/bin/qemu-m68k ./inf qemu-m68k qemu-m68k-fixed muller@gcc123:~/pas/check$ ~/sys-root/bin/qemu-m68k-fixed ./inf big endian y=7FF0000000000000 big endian y=7FF0000000000000 ~/sys-root/bin/qemu-m68k is 4.1.0 release, ~/sys-root/bin/qemu-m68k-fixed is the same source with a unique change: gnu/qemu/qemu-4.1.0/fpu/softfloat-specialize.h:214:#if defined(TARGET_M68K) gnu/qemu/qemu-4.1.0/fpu/softfloat-specialize.h-215-#define floatx80_infinity_low LIT64(0x0000000000000000) gnu/qemu/qemu-4.1.0/fpu/softfloat-specialize.h-216-#else gnu/qemu/qemu-4.1.0/fpu/softfloat-specialize.h-217-#define floatx80_infinity_low LIT64(0x8000000000000000) gnu/qemu/qemu-4.1.0/fpu/softfloat-specialize.h-218-#endif the M68K branch value is set to the same value as the other branch. The problem of the M68K specific floatx86_infinity_low values is that is enters in conflict with muller@gcc123:~/pas/check$ grep -nA6 invalid_enc /home/muller/gnu/qemu/qemu-4.1.0/include/fpu/softfloat.h 752:static inline bool floatx80_invalid_encoding(floatx80 a) 753-{ 754- return (a.low & (1ULL << 63)) == 0 && (a.high & 0x7FFF) != 0; 755-} And thus the m68k variant of floatx80 representing +Infinity is considered as an invalid encoding, and thus converted into a NaN 7FFFFFFFFFFFFFFF To manage notifications about this bug go to: https://bugs.launchpad.net/qemu/+bug/1843651/+subscriptions