]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c/39902 (x * 1.0DF gets wrong value)
authorJanis Johnson <janis187@us.ibm.com>
Mon, 3 Aug 2009 21:38:53 +0000 (21:38 +0000)
committerJanis Johnson <janis@gcc.gnu.org>
Mon, 3 Aug 2009 21:38:53 +0000 (21:38 +0000)
PR c/39902
* simplify-rtx.c (simplify_binary_operation_1): Disable
simplifications for decimal float operations.

PR c/39902
* gcc.target/powerpc/pr39902-2.c: New test.

From-SVN: r150383

gcc/ChangeLog
gcc/simplify-rtx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/pr39902-2.c [new file with mode: 0644]

index 4d9d516f3edaefde3048296a07e27c5d7fdf1fd3..a888baf4235a73efeafd5d62a25cf35dce6b6c86 100644 (file)
@@ -1,3 +1,9 @@
+2009-08-03  Janis Johnson  <janis187@us.ibm.com>
+
+       PR c/39902
+       * simplify-rtx.c (simplify_binary_operation_1): Disable
+       simplifications for decimal float operations.
+
 2009-08-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/40943
index ff690684ee68cf31519eb6c713dcec6ac0143269..e3809a8500002316139cb25d2f0a944b343baeba 100644 (file)
@@ -1997,6 +1997,7 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
       /* x*2 is x+x and x*(-1) is -x */
       if (GET_CODE (trueop1) == CONST_DOUBLE
          && SCALAR_FLOAT_MODE_P (GET_MODE (trueop1))
+         && !DECIMAL_FLOAT_MODE_P (GET_MODE (trueop1))
          && GET_MODE (op0) == mode)
        {
          REAL_VALUE_TYPE d;
index e2b141cfd30d6ee77407ae1ffb2175ee48d0d456..86a991e2600a49dc26e6c783a984a0cc32af72bf 100644 (file)
@@ -1,3 +1,8 @@
+2009-08-03  Janis Johnson  <janis187@us.ibm.com>
+
+       PR c/39902
+       * gcc.target/powerpc/pr39902-2.c: New test.
+
 2009-08-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/40943
diff --git a/gcc/testsuite/gcc.target/powerpc/pr39902-2.c b/gcc/testsuite/gcc.target/powerpc/pr39902-2.c
new file mode 100644 (file)
index 0000000..463a36c
--- /dev/null
@@ -0,0 +1,28 @@
+/* Check that simplification "x*(-1)" -> "-x" is not performed for decimal
+   float types.  */
+
+/* { dg-do compile { target { powerpc*-*-linux* && powerpc_fprs } } } */
+/* { dg-options "-std=gnu99 -O -mcpu=power6" } */
+/* { dg-final { scan-assembler-not "fneg" } } */
+
+extern _Decimal32 a32, b32;
+extern _Decimal64 a64, b64;
+extern _Decimal128 a128, b128;
+
+void
+foo32 (void)
+{
+  b32 = a32 * -1.0DF;
+}
+
+void
+foo64 (void)
+{
+  b64 = a64 * -1.0DD;
+}
+
+void
+foo128 (void)
+{
+  b128 = a128 * -1.0DL;
+}