summary refs log tree commit diff stats
path: root/results/scraper/launchpad-without-comments/1728325
diff options
context:
space:
mode:
Diffstat (limited to 'results/scraper/launchpad-without-comments/1728325')
-rw-r--r--results/scraper/launchpad-without-comments/172832560
1 files changed, 60 insertions, 0 deletions
diff --git a/results/scraper/launchpad-without-comments/1728325 b/results/scraper/launchpad-without-comments/1728325
new file mode 100644
index 000000000..8f48af6c7
--- /dev/null
+++ b/results/scraper/launchpad-without-comments/1728325
@@ -0,0 +1,60 @@
+POWER8: Wrong behaviour with float-to-int punning
+
+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
\ No newline at end of file