Commit aff8a8d5 by Corey Minyard Committed by Richard Henderson

recog.c (validate_replace_rtx_1): Use simplify_gen_binary instead of plus_constant.

        * 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.

From-SVN: r47961
parent c2bd38e8
2001-11-29 Corey Minyard <minyard@acm.org>
* 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.
2001-12-12 Roger Sayle <roger@eyesopen.com>
* builtins.c (expand_builtin_memset, expand_builtin_memcpy,
......
......@@ -512,7 +512,8 @@ validate_replace_rtx_1 (loc, from, to, object)
separated from this function. */
if (GET_CODE (XEXP (x, 1)) == CONST_INT)
validate_change (object, loc,
plus_constant (XEXP (x, 0), INTVAL (XEXP (x, 1))), 1);
simplify_gen_binary
(PLUS, GET_MODE (x), XEXP (x, 0), XEXP (x, 1)), 1);
break;
case MINUS:
if (GET_CODE (XEXP (x, 1)) == CONST_INT
......
......@@ -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--;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment