S/390: Use proper rounding mode for DFP to BFD conversions
authorAndreas Krebbel <krebbel@linux.ibm.com>
Wed, 12 Sep 2018 10:58:42 +0000 (10:58 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Wed, 12 Sep 2018 10:58:42 +0000 (10:58 +0000)
According to IEEE 754 2008 4.3 'Rounding-direction attributes' the
rounding mode of the target format needs to be used. By not setting
the value so far we have always used the DFP rounding mode.

gcc/ChangeLog:

2018-09-12  Andreas Krebbel  <krebbel@linux.ibm.com>

* config/s390/s390.md (PFPO_RND_MODE_DFP, PFPO_RND_MODE_BFP): New
constants.
("trunc<BFP:mode><DFP_ALL:mode>2")
("trunc<DFP_ALL:mode><BFP:mode>2")
("extend<BFP:mode><DFP_ALL:mode>2")
("extend<DFP_ALL:mode><BFP:mode>2"): Set proper rounding mode
according to the target operand type.

gcc/testsuite/ChangeLog:

2018-09-12  Andreas Krebbel  <krebbel@linux.ibm.com>

* gcc.target/s390/dfp_to_bfp_rounding.c: New test.

From-SVN: r264234

gcc/ChangeLog
gcc/config/s390/s390.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/dfp_to_bfp_rounding.c [new file with mode: 0644]

index bd0d8668bd5d897bf8cb5fb52ebb0f560bc37caf..77ef4bb08cc7392fb10f69c2bd7f37b3c7906ed1 100644 (file)
@@ -1,3 +1,13 @@
+2018-09-12  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       * config/s390/s390.md (PFPO_RND_MODE_DFP, PFPO_RND_MODE_BFP): New
+       constants.
+       ("trunc<BFP:mode><DFP_ALL:mode>2")
+       ("trunc<DFP_ALL:mode><BFP:mode>2")
+       ("extend<BFP:mode><DFP_ALL:mode>2")
+       ("extend<DFP_ALL:mode><BFP:mode>2"): Set proper rounding mode
+       according to the target operand type.
+
 2018-09-12  Jakub Jelinek  <jakub@redhat.com>
            Andreas Krebbel  <krebbel@linux.ibm.com>
 
index ddf8608b2a2e6b2dce93feb341288f9ed1cf7dcf..537ed35af184b1cf6490e44b7434d409e8f7b0b8 100644 (file)
    ; Bitposition of operand types
    (PFPO_OP0_TYPE_SHIFT          16)
    (PFPO_OP1_TYPE_SHIFT           8)
+   ; Decide whether current DFP or BFD rounding mode should be used
+   ; for the conversion.
+   (PFPO_RND_MODE_DFP             0)
+   (PFPO_RND_MODE_BFP             1)
   ])
 
 ; Immediate operands for tbegin and tbeginc
 {
   HOST_WIDE_INT flags;
 
+  /* According to IEEE 754 2008 4.3 'Rounding-direction attributes' the
+     rounding mode of the target format needs to be used.  */
+
   flags = (PFPO_CONVERT |
            PFPO_OP_TYPE_<DFP_ALL:MODE> << PFPO_OP0_TYPE_SHIFT |
-           PFPO_OP_TYPE_<BFP:MODE> << PFPO_OP1_TYPE_SHIFT);
+           PFPO_OP_TYPE_<BFP:MODE> << PFPO_OP1_TYPE_SHIFT |
+          PFPO_RND_MODE_DFP);
 
   operands[2] = GEN_INT (flags);
 })
 {
   HOST_WIDE_INT flags;
 
+  /* According to IEEE 754 2008 4.3 'Rounding-direction attributes' the
+     rounding mode of the target format needs to be used.  */
+
   flags = (PFPO_CONVERT |
            PFPO_OP_TYPE_<BFP:MODE> << PFPO_OP0_TYPE_SHIFT |
-           PFPO_OP_TYPE_<DFP_ALL:MODE> << PFPO_OP1_TYPE_SHIFT);
+           PFPO_OP_TYPE_<DFP_ALL:MODE> << PFPO_OP1_TYPE_SHIFT |
+          PFPO_RND_MODE_BFP);
 
   operands[2] = GEN_INT (flags);
 })
 {
   HOST_WIDE_INT flags;
 
+  /* According to IEEE 754 2008 4.3 'Rounding-direction attributes' the
+     rounding mode of the target format needs to be used.  */
+
   flags = (PFPO_CONVERT |
            PFPO_OP_TYPE_<DFP_ALL:MODE> << PFPO_OP0_TYPE_SHIFT |
-           PFPO_OP_TYPE_<BFP:MODE> << PFPO_OP1_TYPE_SHIFT);
+           PFPO_OP_TYPE_<BFP:MODE> << PFPO_OP1_TYPE_SHIFT |
+          PFPO_RND_MODE_DFP);
 
   operands[2] = GEN_INT (flags);
 })
 {
   HOST_WIDE_INT flags;
 
+  /* According to IEEE 754 2008 4.3 'Rounding-direction attributes' the
+     rounding mode of the target format needs to be used.  */
+
   flags = (PFPO_CONVERT |
            PFPO_OP_TYPE_<BFP:MODE> << PFPO_OP0_TYPE_SHIFT |
-           PFPO_OP_TYPE_<DFP_ALL:MODE> << PFPO_OP1_TYPE_SHIFT);
+           PFPO_OP_TYPE_<DFP_ALL:MODE> << PFPO_OP1_TYPE_SHIFT |
+          PFPO_RND_MODE_BFP);
 
   operands[2] = GEN_INT (flags);
 })
index 1d38a8efb703a563d8077f56042699fd8e8cfec9..a29d014e64bdd230e6fd6dfae6181be75839b17b 100644 (file)
@@ -1,3 +1,7 @@
+2018-09-12  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       * gcc.target/s390/dfp_to_bfp_rounding.c: New test.
+
 2018-09-12  Jakub Jelinek  <jakub@redhat.com>
            Andreas Krebbel  <krebbel@linux.ibm.com>
 
diff --git a/gcc/testsuite/gcc.target/s390/dfp_to_bfp_rounding.c b/gcc/testsuite/gcc.target/s390/dfp_to_bfp_rounding.c
new file mode 100644 (file)
index 0000000..9a32abf
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -mzarch -march=z10" } */
+
+/* According to IEEE 754 2008 4.3 Conversion operations between
+   different radixes must use the rounding mode of the target radix.
+   On S/390 this means passing the right value in GPR0 to PFPO
+   instruction.  */
+
+#include <fenv.h>
+
+double __attribute__((noclone,noinline))
+convert (_Decimal64 in)
+{
+  return (double)in;
+}
+
+int
+main ()
+{
+  fesetround (FE_UPWARD);
+
+  if (convert (1e-325DD) != __DBL_DENORM_MIN__)
+    __builtin_abort ();
+
+  fesetround (FE_DOWNWARD);
+
+  if (convert (-1e-325DD) != -__DBL_DENORM_MIN__)
+    __builtin_abort ();
+}