All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [Bug 1728325] [NEW] POWER8: Wrong behaviour with float-to-int punning
@ 2017-10-29  1:10 Iain Buclaw
  2017-10-29  1:15 ` [Qemu-devel] [Bug 1728325] " Iain Buclaw
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Iain Buclaw @ 2017-10-29  1:10 UTC (permalink / raw)
  To: qemu-devel

Public bug reported:

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

** 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/1728325

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

Status in QEMU:
  New

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

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-01-09  4:30 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-29  1:10 [Qemu-devel] [Bug 1728325] [NEW] POWER8: Wrong behaviour with float-to-int punning Iain Buclaw
2017-10-29  1:15 ` [Qemu-devel] [Bug 1728325] " Iain Buclaw
2017-10-31  9:35 ` Richard Henderson
2017-10-31 10:38 ` Iain Buclaw
2020-11-10  3:11 ` Thomas Huth
2021-01-09  4:17 ` Launchpad Bug Tracker

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.