qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [Bug 1728325] Re: POWER8: Wrong behaviour with float-to-int


From: Richard Henderson
Subject: [Qemu-devel] [Bug 1728325] Re: POWER8: Wrong behaviour with float-to-int punning
Date: Tue, 31 Oct 2017 09:35:55 -0000

This is buggy C.

https://gcc.gnu.org/bugs/#nonbugs_c

** Changed in: qemu
       Status: New => Invalid

-- 
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/1728325

Title:
  POWER8: Wrong behaviour with float-to-int punning

Status in QEMU:
  Invalid

Bug description:
  Building a reduced test program with 'gcc -O2 -fno-inline
  -mcpu=power8' produces wrong results at runtime. I don't think gcc is
  at fault here.

  ---
  #include <stdio.h>

  int getWord(const float x)
  {
    return *(int*)&x;
  }

  void main()
  {
      int foo = getWord(+123.456f);
      int bar = getWord(-123.456f);

      printf("%d\n", foo);
      printf("%d\n", bar);
      return;
  }
  ---

  This prints:
  ---
  0
  0
  ---

  Compiling with 'gcc -O2 -fno-inline -mcpu=power7' and you instead get the 
expected result:
  ---
  1123477881
  -1024005767
  ---

  
  The different between the two programs is:

  --- power7.s
  +++ power8.s
  @@ -6,9 +6,9 @@
        .globl getWord
        .type   getWord, @function
   getWord:
  -     stfs 1,-16(1)
  -     ori 2,2,0
  -     lwa 3,-16(1)
  +     xscvdpspn 0,1
  +     mfvsrwz 3,0
  +     extsw 3,3
        blr
        .long 0
        .byte 0,0,0,0,0,0,0,0
          .size   getWord,.-getWord

  
  Seems like qemu doesn't handle xscvdpspn/mfvsrwz correctly.

  https://github.com/qemu/qemu/commit/7ee19fb9d682689d36c849576c808cf92e3bae40
  https://github.com/qemu/qemu/commit/f5c0f7f981333da59cc35c3210d05ec1775c97c1

To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/1728325/+subscriptions



reply via email to

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