summaryrefslogtreecommitdiff
path: root/gcc/simplify-rtx.c
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2001-12-13 01:21:52 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2001-12-13 01:21:52 +0000
commit7d6080d60a13e6133cfa079ec46ec2c21ffb11d2 (patch)
treedd23b0e7682191ced0f522cfb780043faa7ea52e /gcc/simplify-rtx.c
parent6f428e8ba056d4e204ce41d5899948abac35d591 (diff)
downloadgcc-7d6080d60a13e6133cfa079ec46ec2c21ffb11d2.tar.gz
* recog.c (validate_replace_rtx_1): Use simplify_gen_binary
instead of plus_constant. * simplify-rtx.c (neg_const_int): New. (simplify_gen_binary, simplify_plus_minus): Use it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@47961 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/simplify-rtx.c')
-rw-r--r--gcc/simplify-rtx.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 0f11556251d..122768e4122 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -95,6 +95,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#define HWI_SIGN_EXTEND(low) \
((((HOST_WIDE_INT) low) < 0) ? ((HOST_WIDE_INT) -1) : ((HOST_WIDE_INT) 0))
+static rtx neg_const_int PARAMS ((enum machine_mode, rtx));
static int simplify_plus_minus_op_data_cmp PARAMS ((const void *,
const void *));
static rtx simplify_plus_minus PARAMS ((enum rtx_code,
@@ -107,6 +108,17 @@ static void simplify_binary_real PARAMS ((PTR));
static void simplify_binary_is2orm1 PARAMS ((PTR));
+/* Negate a CONST_INT rtx, truncating (because a conversion from a
+ maximally negative number can overflow). */
+static rtx
+neg_const_int (mode, i)
+ enum machine_mode mode;
+ rtx i;
+{
+ return GEN_INT (trunc_int_for_mode (- INTVAL (i), mode));
+}
+
+
/* Make a binary operation by properly ordering the operands and
seeing if the expression folds. */
@@ -136,10 +148,9 @@ simplify_gen_binary (code, mode, op0, op1)
&& GET_MODE (op0) != VOIDmode
&& (code == PLUS || code == MINUS))
{
- HOST_WIDE_INT value = INTVAL (op1);
if (code == MINUS)
- value = -value;
- return plus_constant (op0, value);
+ op1 = neg_const_int (mode, op1);
+ return plus_constant (op0, INTVAL (op1));
}
else
return gen_rtx_fmt_ee (code, mode, op0, op1);
@@ -1276,7 +1287,9 @@ simplify_binary_operation (code, mode, op0, op1)
/* Don't let a relocatable value get a negative coeff. */
if (GET_CODE (op1) == CONST_INT && GET_MODE (op0) != VOIDmode)
- return plus_constant (op0, - INTVAL (op1));
+ return simplify_gen_binary (PLUS, mode,
+ op0,
+ neg_const_int (mode, op1));
/* (x - (x & y)) -> (x & ~y) */
if (GET_CODE (op1) == AND)
@@ -1787,7 +1800,7 @@ simplify_plus_minus (code, mode, op0, op1)
case CONST_INT:
if (this_neg)
{
- ops[i].op = GEN_INT (- INTVAL (this_op));
+ ops[i].op = neg_const_int (mode, this_op);
ops[i].neg = 0;
changed = 1;
}
@@ -1848,7 +1861,7 @@ simplify_plus_minus (code, mode, op0, op1)
if (GET_CODE (tem) == NEG)
tem = XEXP (tem, 0), lneg = !lneg;
if (GET_CODE (tem) == CONST_INT && lneg)
- tem = GEN_INT (- INTVAL (tem)), lneg = 0;
+ tem = neg_const_int (mode, tem), lneg = 0;
ops[i].op = tem;
ops[i].neg = lneg;
@@ -1881,10 +1894,10 @@ simplify_plus_minus (code, mode, op0, op1)
&& GET_CODE (ops[n_ops - 1].op) == CONST_INT
&& CONSTANT_P (ops[n_ops - 2].op))
{
- HOST_WIDE_INT value = INTVAL (ops[n_ops - 1].op);
+ rtx value = ops[n_ops - 1].op;
if (ops[n_ops - 1].neg ^ ops[n_ops - 2].neg)
- value = -value;
- ops[n_ops - 2].op = plus_constant (ops[n_ops - 2].op, value);
+ value = neg_const_int (mode, value);
+ ops[n_ops - 2].op = plus_constant (ops[n_ops - 2].op, INTVAL (value));
n_ops--;
}