qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [Bug 1843651] Re: m68k fpu bug


From: Alex Bennée
Subject: [Qemu-devel] [Bug 1843651] Re: m68k fpu bug
Date: Thu, 12 Sep 2019 18:32:41 -0000

** Tags added: fpu m68k

-- 
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

[Prev in Thread] Current Thread [Next in Thread]