]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fix from Andreas Arnez for bug 342841 s390x unrecognized instruction fiebra
authorChristian Borntraeger <borntraeger@de.ibm.com>
Thu, 9 Jul 2015 19:21:42 +0000 (19:21 +0000)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Thu, 9 Jul 2015 19:21:42 +0000 (19:21 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15406

NEWS
none/tests/s390x/rounding-6.c
none/tests/s390x/rounding-6.stdout.exp

diff --git a/NEWS b/NEWS
index 296654bb6dbfab982d5a8505001be7eeac509dbf..ee636a3b749de1862917922bdbfdb5786e7d49be 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -258,6 +258,7 @@ where XXXXXX is the bug number as listed below.
 349874  Fix typos in source code
 349828  memcpy intercepts memmove causing src/dst overlap error (ppc64 ld.so)
 349941  di_notify_mmap might create wrong start/size DebugInfoMapping
+342841  s390x unrecognized instruction fiebra
 n-i-bz  Provide implementations of certain compiler builtins to support
         compilers who may not provide those
 n-i-bz  Old STABS code is still being compiled, but never used. Remove it.
index 999aacdbe2c355e01fcc451c17028dbd824b486f..ae0aa1b999f71119319ebe0951e8c0d796afa18a 100644 (file)
@@ -44,6 +44,20 @@ do { \
           opcode, src, dst, cc, rtext(round));        \
 } while (0)
 
+#define round_to_int(opcode,type,round,value)                   \
+do {                                                            \
+   type src = value;                                            \
+   type dst;                                                    \
+                                                                \
+   __asm__ volatile (opcode " %[dst]," #round ",%[src]\n\t"     \
+                     : [dst] "=f"(dst)                          \
+                     : [src] "f"(src)                           \
+                     : );                                       \
+                                                                \
+   printf("%s %.5f\t-> %g  %s\n",                               \
+          opcode, src, dst, rtext(round));                      \
+} while (0)
+
 
 #define cfebr(value, round) \
         convert_to_int("cfebr",float,int32_t,PRId32,round,value)
@@ -54,6 +68,11 @@ do { \
 #define cgdbr(value, round) \
         convert_to_int("cgdbr",double,int64_t,PRId64,round,value)
 
+#define fiebr(value, round) \
+        round_to_int("fiebr",float,round,value)
+#define fidbr(value, round) \
+        round_to_int("fidbr",double,round,value)
+
 void
 set_rounding_mode(unsigned mode)
 {
@@ -117,5 +136,25 @@ int main(void)
       cgdbr(dval[j], M3_BFP_ROUND_NEGINF);
    }
 
+   /* f32 -> f32, round to int */
+   for (j = 0; j < sizeof dval / sizeof dval[0]; ++j) {
+      set_rounding_mode(FPC_BFP_ROUND_ZERO);
+      fiebr(dval[j], M3_BFP_ROUND_NEAREST_EVEN);
+      set_rounding_mode(FPC_BFP_ROUND_NEAREST_EVEN);
+      fiebr(dval[j], M3_BFP_ROUND_ZERO);
+      fiebr(dval[j], M3_BFP_ROUND_POSINF);
+      fiebr(dval[j], M3_BFP_ROUND_NEGINF);
+   }
+
+   /* f64 -> f64, round to int */
+   for (j = 0; j < sizeof dval / sizeof dval[0]; ++j) {
+      set_rounding_mode(FPC_BFP_ROUND_ZERO);
+      fidbr(dval[j], M3_BFP_ROUND_NEAREST_EVEN);
+      set_rounding_mode(FPC_BFP_ROUND_NEAREST_EVEN);
+      fidbr(dval[j], M3_BFP_ROUND_ZERO);
+      fidbr(dval[j], M3_BFP_ROUND_POSINF);
+      fidbr(dval[j], M3_BFP_ROUND_NEGINF);
+   }
+
    return 0;
 }
index f83455c2791d7a0be37bcd3da97dcc20b87e7686..f01a22973cc241e247fb46aeaf9ffec85a6a271b 100644 (file)
@@ -142,3 +142,75 @@ cgdbr 0.000000     -> 0    cc = 0  [-> nearest even]
 cgdbr 0.000000 -> 0    cc = 0  [-> 0]
 cgdbr 0.000000 -> 0    cc = 0  [-> +inf]
 cgdbr 0.000000 -> 0    cc = 0  [-> -inf]
+fiebr 1.25000  -> 1  [-> nearest even]
+fiebr 1.25000  -> 1  [-> 0]
+fiebr 1.25000  -> 2  [-> +inf]
+fiebr 1.25000  -> 1  [-> -inf]
+fiebr 1.50000  -> 2  [-> nearest even]
+fiebr 1.50000  -> 1  [-> 0]
+fiebr 1.50000  -> 2  [-> +inf]
+fiebr 1.50000  -> 1  [-> -inf]
+fiebr 2.50000  -> 2  [-> nearest even]
+fiebr 2.50000  -> 2  [-> 0]
+fiebr 2.50000  -> 3  [-> +inf]
+fiebr 2.50000  -> 2  [-> -inf]
+fiebr 1.75000  -> 2  [-> nearest even]
+fiebr 1.75000  -> 1  [-> 0]
+fiebr 1.75000  -> 2  [-> +inf]
+fiebr 1.75000  -> 1  [-> -inf]
+fiebr -1.25000 -> -1  [-> nearest even]
+fiebr -1.25000 -> -1  [-> 0]
+fiebr -1.25000 -> -1  [-> +inf]
+fiebr -1.25000 -> -2  [-> -inf]
+fiebr -1.50000 -> -2  [-> nearest even]
+fiebr -1.50000 -> -1  [-> 0]
+fiebr -1.50000 -> -1  [-> +inf]
+fiebr -1.50000 -> -2  [-> -inf]
+fiebr -2.50000 -> -2  [-> nearest even]
+fiebr -2.50000 -> -2  [-> 0]
+fiebr -2.50000 -> -2  [-> +inf]
+fiebr -2.50000 -> -3  [-> -inf]
+fiebr -1.75000 -> -2  [-> nearest even]
+fiebr -1.75000 -> -1  [-> 0]
+fiebr -1.75000 -> -1  [-> +inf]
+fiebr -1.75000 -> -2  [-> -inf]
+fiebr 0.00000  -> 0  [-> nearest even]
+fiebr 0.00000  -> 0  [-> 0]
+fiebr 0.00000  -> 0  [-> +inf]
+fiebr 0.00000  -> 0  [-> -inf]
+fidbr 1.25000  -> 1  [-> nearest even]
+fidbr 1.25000  -> 1  [-> 0]
+fidbr 1.25000  -> 2  [-> +inf]
+fidbr 1.25000  -> 1  [-> -inf]
+fidbr 1.50000  -> 2  [-> nearest even]
+fidbr 1.50000  -> 1  [-> 0]
+fidbr 1.50000  -> 2  [-> +inf]
+fidbr 1.50000  -> 1  [-> -inf]
+fidbr 2.50000  -> 2  [-> nearest even]
+fidbr 2.50000  -> 2  [-> 0]
+fidbr 2.50000  -> 3  [-> +inf]
+fidbr 2.50000  -> 2  [-> -inf]
+fidbr 1.75000  -> 2  [-> nearest even]
+fidbr 1.75000  -> 1  [-> 0]
+fidbr 1.75000  -> 2  [-> +inf]
+fidbr 1.75000  -> 1  [-> -inf]
+fidbr -1.25000 -> -1  [-> nearest even]
+fidbr -1.25000 -> -1  [-> 0]
+fidbr -1.25000 -> -1  [-> +inf]
+fidbr -1.25000 -> -2  [-> -inf]
+fidbr -1.50000 -> -2  [-> nearest even]
+fidbr -1.50000 -> -1  [-> 0]
+fidbr -1.50000 -> -1  [-> +inf]
+fidbr -1.50000 -> -2  [-> -inf]
+fidbr -2.50000 -> -2  [-> nearest even]
+fidbr -2.50000 -> -2  [-> 0]
+fidbr -2.50000 -> -2  [-> +inf]
+fidbr -2.50000 -> -3  [-> -inf]
+fidbr -1.75000 -> -2  [-> nearest even]
+fidbr -1.75000 -> -1  [-> 0]
+fidbr -1.75000 -> -1  [-> +inf]
+fidbr -1.75000 -> -2  [-> -inf]
+fidbr 0.00000  -> 0  [-> nearest even]
+fidbr 0.00000  -> 0  [-> 0]
+fidbr 0.00000  -> 0  [-> +inf]
+fidbr 0.00000  -> 0  [-> -inf]