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

Reply via email to