From 16b182d1232d017039575e91dc3dea8e5828297b Mon Sep 17 00:00:00 2001 From: Janis Johnson Date: Mon, 3 Aug 2009 21:49:12 +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. * gcc.target/powerpc/pr39902-2.c: New test. From-SVN: r150386 --- gcc/ChangeLog | 4 +++ gcc/simplify-rtx.c | 1 + gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.target/powerpc/pr39902-2.c | 28 ++++++++++++++++++++ 4 files changed, 36 insertions(+) create mode 100644 gcc/testsuite/gcc.target/powerpc/pr39902-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 359211c77e5d..7f318c4d8c0b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2009-08-03 Janis Johnson + PR c/39902 + * simplify-rtx.c (simplify_binary_operation_1): Disable + simplifications for decimal float operations. + PR c/39902 * tree.c (real_zerop, real_onep, real_twop, real_minus_onep): Special-case decimal float constants. diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index f8756040ce0f..9ff5f296b8ec 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -2004,6 +2004,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 7e55fb99d7a4..d5f0a0280f27 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2009-08-03 Janis Johnson + PR c/39902 + * gcc.target/powerpc/pr39902-2.c: New test. + PR c/39902 * gcc.dg/dfp/pr39902.c: New test. 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 000000000000..463a36c1beed --- /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; +} -- 2.47.2