From b1b0ea7eaed20ef563337573189044b761ace546 Mon Sep 17 00:00:00 2001 From: Christian Borntraeger Date: Thu, 9 Jul 2015 19:21:42 +0000 Subject: [PATCH] Fix from Andreas Arnez for bug 342841 s390x unrecognized instruction fiebra git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15406 --- NEWS | 1 + none/tests/s390x/rounding-6.c | 39 ++++++++++++++ none/tests/s390x/rounding-6.stdout.exp | 72 ++++++++++++++++++++++++++ 3 files changed, 112 insertions(+) diff --git a/NEWS b/NEWS index 296654bb6d..ee636a3b74 100644 --- 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. diff --git a/none/tests/s390x/rounding-6.c b/none/tests/s390x/rounding-6.c index 999aacdbe2..ae0aa1b999 100644 --- a/none/tests/s390x/rounding-6.c +++ b/none/tests/s390x/rounding-6.c @@ -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; } diff --git a/none/tests/s390x/rounding-6.stdout.exp b/none/tests/s390x/rounding-6.stdout.exp index f83455c279..f01a22973c 100644 --- a/none/tests/s390x/rounding-6.stdout.exp +++ b/none/tests/s390x/rounding-6.stdout.exp @@ -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] -- 2.47.2