summaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2003-09-07 20:32:16 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2003-09-07 20:32:16 +0000
commit4f61b3b722d34b8cd37376bc1e21879c01296c1b (patch)
treeeda3ed2ec8998024e527bb4875d8fb1ded6f44d7 /gcc/combine.c
parentae53e5bcea6c060488d48f3ab6f9df544fb9a4b6 (diff)
downloadgcc-4f61b3b722d34b8cd37376bc1e21879c01296c1b.tar.gz
combine.c (combine_simplify_rtx): Don't convert -(A*B) into (-A)*B if we care about sign-dependent rounding.
* combine.c (combine_simplify_rtx): Don't convert -(A*B) into (-A)*B if we care about sign-dependent rounding. From-SVN: r71178
Diffstat (limited to 'gcc/combine.c')
-rw-r--r--gcc/combine.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index 26cdf49dc78..0853a2cc5f9 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -3970,14 +3970,16 @@ combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int last,
/* (neg (mult A B)) becomes (mult (neg A) B).
This works even for floating-point values. */
- if (GET_CODE (XEXP (x, 0)) == MULT)
+ if (GET_CODE (XEXP (x, 0)) == MULT
+ && !HONOR_SIGN_DEPENDENT_ROUNDING (mode))
{
temp = simplify_gen_unary (NEG, mode, XEXP (XEXP (x, 0), 0), mode);
return gen_binary (MULT, mode, temp, XEXP (XEXP (x, 0), 1));
}
/* (neg (xor A 1)) is (plus A -1) if A is known to be either 0 or 1. */
- if (GET_CODE (XEXP (x, 0)) == XOR && XEXP (XEXP (x, 0), 1) == const1_rtx
+ if (GET_CODE (XEXP (x, 0)) == XOR
+ && XEXP (XEXP (x, 0), 1) == const1_rtx
&& nonzero_bits (XEXP (XEXP (x, 0), 0), mode) == 1)
return gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0), constm1_rtx);