From 50cd60be11a52f6ee997d331f83c5b62ee59f448 Mon Sep 17 00:00:00 2001 From: Janis Johnson Date: Mon, 3 Aug 2009 21:38:53 +0000 Subject: [PATCH] re PR c/39902 (x * 1.0DF gets wrong value) 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 | 6 +++++ gcc/simplify-rtx.c | 1 + gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.target/powerpc/pr39902-2.c | 28 ++++++++++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 gcc/testsuite/gcc.target/powerpc/pr39902-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4d9d516f3ed..a888baf4235 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-08-03 Janis Johnson + + PR c/39902 + * simplify-rtx.c (simplify_binary_operation_1): Disable + simplifications for decimal float operations. + 2009-08-03 Jakub Jelinek PR middle-end/40943 diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index ff690684ee6..e3809a85000 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e2b141cfd30..86a991e2600 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-08-03 Janis Johnson + + PR c/39902 + * gcc.target/powerpc/pr39902-2.c: New test. + 2009-08-03 Jakub Jelinek 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 index 00000000000..463a36c1bee --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr39902-2.c @@ -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; +}