From: Paolo Bonzini <bonzini@gnu.org>
To: gcc-patches@gcc.gnu.org
Cc: GCC Patches <gcc-patches@gcc.gnu.org>
Subject: Re: RFT/RFA: Eliminate gen_binary, take 2
Date: Wed, 09 Jun 2004 09:21:00 -0000 [thread overview]
Message-ID: <40C6BAF5.6020201@gnu.org> (raw)
In-Reply-To: <200406082314.40908.ebotcazou@libertysurf.fr>
[-- Attachment #1: Type: text/plain, Size: 195 bytes --]
> Please provide a complete patch. And I'll try to find a version of GNU patch
> that can apply it this time. :-)
Here it is.
I can mail you privately a gzipped combine.c if you want.
Paolo
[-- Attachment #2: combine-kill-gen-binary-take-4.patch --]
[-- Type: text/plain, Size: 49569 bytes --]
Index: combine.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/combine.c,v
retrieving revision 1.432
diff -c -r1.432 combine.c
*** combine.c 5 Jun 2004 07:59:39 -0000 1.432
--- combine.c 9 Jun 2004 07:20:09 -0000
***************
*** 372,377 ****
--- 372,378 ----
static int rtx_equal_for_field_assignment_p (rtx, rtx);
static rtx make_field_assignment (rtx);
static rtx apply_distributive_law (rtx);
+ static rtx distribute_and_simplify_rtx (rtx);
static rtx simplify_and_const_int (rtx, enum machine_mode, rtx,
unsigned HOST_WIDE_INT);
static int merge_outer_ops (enum rtx_code *, HOST_WIDE_INT *, enum rtx_code,
***************
*** 380,386 ****
int);
static int recog_for_combine (rtx *, rtx, rtx *);
static rtx gen_lowpart_for_combine (enum machine_mode, rtx);
- static rtx gen_binary (enum rtx_code, enum machine_mode, rtx, rtx);
static enum rtx_code simplify_comparison (enum rtx_code, rtx *, rtx *);
static void update_table_tick (rtx);
static void record_value_for_reg (rtx, rtx, rtx);
--- 381,386 ----
***************
*** 3017,3030 ****
if (src == mask)
SUBST (SET_SRC (x),
! gen_binary (IOR, mode, dest, GEN_INT (src << pos)));
else
! SUBST (SET_SRC (x),
! gen_binary (IOR, mode,
! gen_binary (AND, mode, dest,
! gen_int_mode (~(mask << pos),
! mode)),
! GEN_INT (src << pos)));
SUBST (SET_DEST (x), dest);
--- 3017,3032 ----
if (src == mask)
SUBST (SET_SRC (x),
! simplify_gen_binary (IOR, mode, dest, GEN_INT (src << pos)));
else
! {
! rtx negmask = gen_int_mode (~(mask << pos), mode);
! SUBST (SET_SRC (x),
! simplify_gen_binary (IOR, mode,
! simplify_gen_binary (AND, mode,
! dest, negmask),
! GEN_INT (src << pos)));
! }
SUBST (SET_DEST (x), dest);
***************
*** 3599,3605 ****
new = simplify_shift_const (NULL_RTX, ASHIFTRT, mode, new,
INTVAL (XEXP (XEXP (x, 0), 1)));
! SUBST (XEXP (x, 0), gen_binary (PLUS, mode, new, temp));
}
/* If this is a simple operation applied to an IF_THEN_ELSE, try
--- 3601,3607 ----
new = simplify_shift_const (NULL_RTX, ASHIFTRT, mode, new,
INTVAL (XEXP (XEXP (x, 0), 1)));
! SUBST (XEXP (x, 0), simplify_gen_binary (PLUS, mode, new, temp));
}
/* If this is a simple operation applied to an IF_THEN_ELSE, try
***************
*** 3656,3667 ****
/* If the result values are STORE_FLAG_VALUE and zero, we can
just make the comparison operation. */
if (true_rtx == const_true_rtx && false_rtx == const0_rtx)
! x = gen_binary (cond_code, mode, cond, cop1);
else if (true_rtx == const0_rtx && false_rtx == const_true_rtx
&& ((reversed = reversed_comparison_code_parts
(cond_code, cond, cop1, NULL))
!= UNKNOWN))
! x = gen_binary (reversed, mode, cond, cop1);
/* Likewise, we can make the negate of a comparison operation
if the result values are - STORE_FLAG_VALUE and zero. */
--- 3658,3671 ----
/* If the result values are STORE_FLAG_VALUE and zero, we can
just make the comparison operation. */
if (true_rtx == const_true_rtx && false_rtx == const0_rtx)
! x = simplify_gen_relational (cond_code, mode, VOIDmode,
! cond, cop1);
else if (true_rtx == const0_rtx && false_rtx == const_true_rtx
&& ((reversed = reversed_comparison_code_parts
(cond_code, cond, cop1, NULL))
!= UNKNOWN))
! x = simplify_gen_relational (reversed, mode, VOIDmode,
! cond, cop1);
/* Likewise, we can make the negate of a comparison operation
if the result values are - STORE_FLAG_VALUE and zero. */
***************
*** 3669,3676 ****
&& INTVAL (true_rtx) == - STORE_FLAG_VALUE
&& false_rtx == const0_rtx)
x = simplify_gen_unary (NEG, mode,
! gen_binary (cond_code, mode, cond,
! cop1),
mode);
else if (GET_CODE (false_rtx) == CONST_INT
&& INTVAL (false_rtx) == - STORE_FLAG_VALUE
--- 3673,3681 ----
&& INTVAL (true_rtx) == - STORE_FLAG_VALUE
&& false_rtx == const0_rtx)
x = simplify_gen_unary (NEG, mode,
! simplify_gen_relational (cond_code,
! mode, VOIDmode,
! cond, cop1),
mode);
else if (GET_CODE (false_rtx) == CONST_INT
&& INTVAL (false_rtx) == - STORE_FLAG_VALUE
***************
*** 3679,3691 ****
(cond_code, cond, cop1, NULL))
!= UNKNOWN))
x = simplify_gen_unary (NEG, mode,
! gen_binary (reversed, mode,
! cond, cop1),
mode);
else
return gen_rtx_IF_THEN_ELSE (mode,
! gen_binary (cond_code, VOIDmode,
! cond, cop1),
true_rtx, false_rtx);
code = GET_CODE (x);
--- 3684,3700 ----
(cond_code, cond, cop1, NULL))
!= UNKNOWN))
x = simplify_gen_unary (NEG, mode,
! simplify_gen_relational (reversed,
! mode, VOIDmode,
! cond, cop1),
mode);
else
return gen_rtx_IF_THEN_ELSE (mode,
! simplify_gen_relational (cond_code,
! mode,
! VOIDmode,
! cond,
! cop1),
true_rtx, false_rtx);
code = GET_CODE (x);
***************
*** 3788,3794 ****
}
if (inner)
! return gen_binary (code, mode, other, inner);
}
}
--- 3797,3803 ----
}
if (inner)
! return simplify_gen_binary (code, mode, other, inner);
}
}
***************
*** 3890,3896 ****
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);
temp = expand_compound_operation (XEXP (x, 0));
--- 3899,3906 ----
if (GET_CODE (XEXP (x, 0)) == XOR
&& XEXP (XEXP (x, 0), 1) == const1_rtx
&& nonzero_bits (XEXP (XEXP (x, 0), 0), mode) == 1)
! return simplify_gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0),
! constm1_rtx);
temp = expand_compound_operation (XEXP (x, 0));
***************
*** 4118,4125 ****
in1 = XEXP (XEXP (XEXP (x, 0), 0), 0);
in2 = XEXP (XEXP (x, 0), 1);
! return gen_binary (MINUS, mode, XEXP (x, 1),
! gen_binary (MULT, mode, in1, in2));
}
/* If we have (plus (plus (A const) B)), associate it so that CONST is
--- 4128,4136 ----
in1 = XEXP (XEXP (XEXP (x, 0), 0), 0);
in2 = XEXP (XEXP (x, 0), 1);
! return simplify_gen_binary (MINUS, mode, XEXP (x, 1),
! simplify_gen_binary (MULT, mode,
! in1, in2));
}
/* If we have (plus (plus (A const) B)), associate it so that CONST is
***************
*** 4128,4137 ****
they are now checked elsewhere. */
if (GET_CODE (XEXP (x, 0)) == PLUS
&& CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1)))
! return gen_binary (PLUS, mode,
! gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0),
! XEXP (x, 1)),
! XEXP (XEXP (x, 0), 1));
/* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
when c is (const_int (pow2 + 1) / 2) is a sign extension of a
--- 4139,4149 ----
they are now checked elsewhere. */
if (GET_CODE (XEXP (x, 0)) == PLUS
&& CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1)))
! return simplify_gen_binary (PLUS, mode,
! simplify_gen_binary (PLUS, mode,
! XEXP (XEXP (x, 0), 0),
! XEXP (x, 1)),
! XEXP (XEXP (x, 0), 1));
/* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
when c is (const_int (pow2 + 1) / 2) is a sign extension of a
***************
*** 4197,4203 ****
& nonzero_bits (XEXP (x, 1), mode)) == 0)
{
/* Try to simplify the expression further. */
! rtx tor = gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
temp = combine_simplify_rtx (tor, mode, in_dest);
/* If we could, great. If not, do not go ahead with the IOR
--- 4209,4215 ----
& nonzero_bits (XEXP (x, 1), mode)) == 0)
{
/* Try to simplify the expression further. */
! rtx tor = simplify_gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
temp = combine_simplify_rtx (tor, mode, in_dest);
/* If we could, great. If not, do not go ahead with the IOR
***************
*** 4237,4244 ****
in1 = XEXP (XEXP (XEXP (x, 1), 0), 0);
in2 = XEXP (XEXP (x, 1), 1);
! return gen_binary (PLUS, mode, gen_binary (MULT, mode, in1, in2),
! XEXP (x, 0));
}
/* Canonicalize (minus (neg A) (mult B C)) to
--- 4249,4258 ----
in1 = XEXP (XEXP (XEXP (x, 1), 0), 0);
in2 = XEXP (XEXP (x, 1), 1);
! return simplify_gen_binary (PLUS, mode,
! simplify_gen_binary (MULT, mode,
! in1, in2),
! XEXP (x, 0));
}
/* Canonicalize (minus (neg A) (mult B C)) to
***************
*** 4250,4266 ****
in1 = simplify_gen_unary (NEG, mode, XEXP (XEXP (x, 1), 0), mode);
in2 = XEXP (XEXP (x, 1), 1);
! return gen_binary (MINUS, mode, gen_binary (MULT, mode, in1, in2),
! XEXP (XEXP (x, 0), 0));
}
/* Canonicalize (minus A (plus B C)) to (minus (minus A B) C) for
integers. */
if (GET_CODE (XEXP (x, 1)) == PLUS && INTEGRAL_MODE_P (mode))
! return gen_binary (MINUS, mode,
! gen_binary (MINUS, mode, XEXP (x, 0),
! XEXP (XEXP (x, 1), 0)),
! XEXP (XEXP (x, 1), 1));
break;
case MULT:
--- 4264,4283 ----
in1 = simplify_gen_unary (NEG, mode, XEXP (XEXP (x, 1), 0), mode);
in2 = XEXP (XEXP (x, 1), 1);
! return simplify_gen_binary (MINUS, mode,
! simplify_gen_binary (MULT, mode,
! in1, in2),
! XEXP (XEXP (x, 0), 0));
}
/* Canonicalize (minus A (plus B C)) to (minus (minus A B) C) for
integers. */
if (GET_CODE (XEXP (x, 1)) == PLUS && INTEGRAL_MODE_P (mode))
! return simplify_gen_binary (MINUS, mode,
! simplify_gen_binary (MINUS, mode,
! XEXP (x, 0),
! XEXP (XEXP (x, 1), 0)),
! XEXP (XEXP (x, 1), 1));
break;
case MULT:
***************
*** 4270,4286 ****
if (GET_CODE (XEXP (x, 0)) == PLUS)
{
! x = apply_distributive_law
! (gen_binary (PLUS, mode,
! gen_binary (MULT, mode,
! XEXP (XEXP (x, 0), 0), XEXP (x, 1)),
! gen_binary (MULT, mode,
! XEXP (XEXP (x, 0), 1),
! copy_rtx (XEXP (x, 1)))));
!
! if (GET_CODE (x) != MULT)
! return x;
}
/* Try simplify a*(b/c) as (a*b)/c. */
if (FLOAT_MODE_P (mode) && flag_unsafe_math_optimizations
&& GET_CODE (XEXP (x, 0)) == DIV)
--- 4287,4297 ----
if (GET_CODE (XEXP (x, 0)) == PLUS)
{
! rtx result = distribute_and_simplify_rtx (x);
! if (result)
! return result;
}
+
/* Try simplify a*(b/c) as (a*b)/c. */
if (FLOAT_MODE_P (mode) && flag_unsafe_math_optimizations
&& GET_CODE (XEXP (x, 0)) == DIV)
***************
*** 4289,4295 ****
XEXP (XEXP (x, 0), 0),
XEXP (x, 1));
if (tem)
! return gen_binary (DIV, mode, tem, XEXP (XEXP (x, 0), 1));
}
break;
--- 4300,4306 ----
XEXP (XEXP (x, 0), 0),
XEXP (x, 1));
if (tem)
! return simplify_gen_binary (DIV, mode, tem, XEXP (XEXP (x, 0), 1));
}
break;
***************
*** 4369,4377 ****
&& nonzero_bits (op0, mode) == 1)
{
op0 = expand_compound_operation (op0);
! return gen_binary (XOR, mode,
! gen_lowpart (mode, op0),
! const1_rtx);
}
else if (STORE_FLAG_VALUE == 1
--- 4380,4388 ----
&& nonzero_bits (op0, mode) == 1)
{
op0 = expand_compound_operation (op0);
! return simplify_gen_binary (XOR, mode,
! gen_lowpart (mode, op0),
! const1_rtx);
}
else if (STORE_FLAG_VALUE == 1
***************
*** 4614,4620 ****
/* Simplify storing of the truth value. */
if (comparison_p && true_rtx == const_true_rtx && false_rtx == const0_rtx)
! return gen_binary (true_code, mode, XEXP (cond, 0), XEXP (cond, 1));
/* Also when the truth value has to be reversed. */
if (comparison_p
--- 4625,4632 ----
/* Simplify storing of the truth value. */
if (comparison_p && true_rtx == const_true_rtx && false_rtx == const0_rtx)
! return simplify_gen_relational (true_code, mode, VOIDmode,
! XEXP (cond, 0), XEXP (cond, 1));
/* Also when the truth value has to be reversed. */
if (comparison_p
***************
*** 4764,4779 ****
{
case GE:
case GT:
! return gen_binary (SMAX, mode, true_rtx, false_rtx);
case LE:
case LT:
! return gen_binary (SMIN, mode, true_rtx, false_rtx);
case GEU:
case GTU:
! return gen_binary (UMAX, mode, true_rtx, false_rtx);
case LEU:
case LTU:
! return gen_binary (UMIN, mode, true_rtx, false_rtx);
default:
break;
}
--- 4776,4791 ----
{
case GE:
case GT:
! return simplify_gen_binary (SMAX, mode, true_rtx, false_rtx);
case LE:
case LT:
! return simplify_gen_binary (SMIN, mode, true_rtx, false_rtx);
case GEU:
case GTU:
! return simplify_gen_binary (UMAX, mode, true_rtx, false_rtx);
case LEU:
case LTU:
! return simplify_gen_binary (UMIN, mode, true_rtx, false_rtx);
default:
break;
}
***************
*** 4886,4897 ****
if (z)
{
! temp = subst (gen_binary (true_code, m, cond_op0, cond_op1),
pc_rtx, pc_rtx, 0, 0);
! temp = gen_binary (MULT, m, temp,
! gen_binary (MULT, m, c1, const_true_rtx));
temp = subst (temp, pc_rtx, pc_rtx, 0, 0);
! temp = gen_binary (op, m, gen_lowpart (m, z), temp);
if (extend_op != NIL)
temp = simplify_gen_unary (extend_op, mode, temp, m);
--- 4898,4911 ----
if (z)
{
! temp = subst (simplify_gen_relational (true_code, m, VOIDmode,
! cond_op0, cond_op1),
pc_rtx, pc_rtx, 0, 0);
! temp = simplify_gen_binary (MULT, m, temp,
! simplify_gen_binary (MULT, m, c1,
! const_true_rtx));
temp = subst (temp, pc_rtx, pc_rtx, 0, 0);
! temp = simplify_gen_binary (op, m, gen_lowpart (m, z), temp);
if (extend_op != NIL)
temp = simplify_gen_unary (extend_op, mode, temp, m);
***************
*** 5076,5082 ****
PUT_CODE (*cc_use, old_code);
other_changed = 0;
! op0 = gen_binary (XOR, GET_MODE (op0), op0, GEN_INT (mask));
}
}
}
--- 5090,5097 ----
PUT_CODE (*cc_use, old_code);
other_changed = 0;
! op0 = simplify_gen_binary (XOR, GET_MODE (op0),
! op0, GEN_INT (mask));
}
}
}
***************
*** 5240,5257 ****
&& rtx_equal_p (XEXP (false_rtx, 1), true_rtx))
term1 = true_rtx, false_rtx = XEXP (false_rtx, 0), true_rtx = const0_rtx;
! term2 = gen_binary (AND, GET_MODE (src),
! XEXP (XEXP (src, 0), 0), true_rtx);
! term3 = gen_binary (AND, GET_MODE (src),
! simplify_gen_unary (NOT, GET_MODE (src),
! XEXP (XEXP (src, 0), 0),
! GET_MODE (src)),
! false_rtx);
SUBST (SET_SRC (x),
! gen_binary (IOR, GET_MODE (src),
! gen_binary (IOR, GET_MODE (src), term1, term2),
! term3));
src = SET_SRC (x);
}
--- 5255,5273 ----
&& rtx_equal_p (XEXP (false_rtx, 1), true_rtx))
term1 = true_rtx, false_rtx = XEXP (false_rtx, 0), true_rtx = const0_rtx;
! term2 = simplify_gen_binary (AND, GET_MODE (src),
! XEXP (XEXP (src, 0), 0), true_rtx);
! term3 = simplify_gen_binary (AND, GET_MODE (src),
! simplify_gen_unary (NOT, GET_MODE (src),
! XEXP (XEXP (src, 0), 0),
! GET_MODE (src)),
! false_rtx);
SUBST (SET_SRC (x),
! simplify_gen_binary (IOR, GET_MODE (src),
! simplify_gen_binary (IOR, GET_MODE (src),
! term1, term2),
! term3));
src = SET_SRC (x);
}
***************
*** 5286,5314 ****
if (GET_CODE (op0) == XOR
&& rtx_equal_p (XEXP (op0, 0), op1)
&& ! side_effects_p (op1))
! x = gen_binary (AND, mode,
! simplify_gen_unary (NOT, mode, XEXP (op0, 1), mode),
! op1);
if (GET_CODE (op0) == XOR
&& rtx_equal_p (XEXP (op0, 1), op1)
&& ! side_effects_p (op1))
! x = gen_binary (AND, mode,
! simplify_gen_unary (NOT, mode, XEXP (op0, 0), mode),
! op1);
/* Similarly for (~(A ^ B)) & A. */
if (GET_CODE (op0) == NOT
&& GET_CODE (XEXP (op0, 0)) == XOR
&& rtx_equal_p (XEXP (XEXP (op0, 0), 0), op1)
&& ! side_effects_p (op1))
! x = gen_binary (AND, mode, XEXP (XEXP (op0, 0), 1), op1);
if (GET_CODE (op0) == NOT
&& GET_CODE (XEXP (op0, 0)) == XOR
&& rtx_equal_p (XEXP (XEXP (op0, 0), 1), op1)
&& ! side_effects_p (op1))
! x = gen_binary (AND, mode, XEXP (XEXP (op0, 0), 0), op1);
/* We can call simplify_and_const_int only if we don't lose
any (sign) bits when converting INTVAL (op1) to
--- 5302,5332 ----
if (GET_CODE (op0) == XOR
&& rtx_equal_p (XEXP (op0, 0), op1)
&& ! side_effects_p (op1))
! x = simplify_gen_binary (AND, mode,
! simplify_gen_unary (NOT, mode,
! XEXP (op0, 1), mode),
! op1);
if (GET_CODE (op0) == XOR
&& rtx_equal_p (XEXP (op0, 1), op1)
&& ! side_effects_p (op1))
! x = simplify_gen_binary (AND, mode,
! simplify_gen_unary (NOT, mode,
! XEXP (op0, 0), mode),
! op1);
/* Similarly for (~(A ^ B)) & A. */
if (GET_CODE (op0) == NOT
&& GET_CODE (XEXP (op0, 0)) == XOR
&& rtx_equal_p (XEXP (XEXP (op0, 0), 0), op1)
&& ! side_effects_p (op1))
! x = simplify_gen_binary (AND, mode, XEXP (XEXP (op0, 0), 1), op1);
if (GET_CODE (op0) == NOT
&& GET_CODE (XEXP (op0, 0)) == XOR
&& rtx_equal_p (XEXP (XEXP (op0, 0), 1), op1)
&& ! side_effects_p (op1))
! x = simplify_gen_binary (AND, mode, XEXP (XEXP (op0, 0), 0), op1);
/* We can call simplify_and_const_int only if we don't lose
any (sign) bits when converting INTVAL (op1) to
***************
*** 5328,5335 ****
&& GET_CODE (XEXP (op0, 1)) == CONST_INT
&& GET_CODE (op1) == CONST_INT
&& (INTVAL (XEXP (op0, 1)) & INTVAL (op1)) != 0)
! return gen_binary (IOR, mode,
! gen_binary (AND, mode, XEXP (op0, 0),
GEN_INT (INTVAL (XEXP (op0, 1))
& ~INTVAL (op1))), op1);
--- 5346,5354 ----
&& GET_CODE (XEXP (op0, 1)) == CONST_INT
&& GET_CODE (op1) == CONST_INT
&& (INTVAL (XEXP (op0, 1)) & INTVAL (op1)) != 0)
! return simplify_gen_binary (IOR, mode,
! simplify_gen_binary
! (AND, mode, XEXP (op0, 0),
GEN_INT (INTVAL (XEXP (op0, 1))
& ~INTVAL (op1))), op1);
***************
*** 5348,5401 ****
&& ! side_effects_p (XEXP (op0, 1)))
return op1;
! /* In the following group of tests (and those in case IOR below),
! we start with some combination of logical operations and apply
! the distributive law followed by the inverse distributive law.
! Most of the time, this results in no change. However, if some of
! the operands are the same or inverses of each other, simplifications
! will result.
!
! For example, (and (ior A B) (not B)) can occur as the result of
! expanding a bit field assignment. When we apply the distributive
! law to this, we get (ior (and (A (not B))) (and (B (not B)))),
! which then simplifies to (and (A (not B))).
!
! If we have (and (ior A B) C), apply the distributive law and then
! the inverse distributive law to see if things simplify. */
!
! if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR)
! {
! x = apply_distributive_law
! (gen_binary (GET_CODE (op0), mode,
! gen_binary (AND, mode, XEXP (op0, 0), op1),
! gen_binary (AND, mode, XEXP (op0, 1),
! copy_rtx (op1))));
! if (GET_CODE (x) != AND)
! return x;
}
-
- if (GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
- return apply_distributive_law
- (gen_binary (GET_CODE (op1), mode,
- gen_binary (AND, mode, XEXP (op1, 0), op0),
- gen_binary (AND, mode, XEXP (op1, 1),
- copy_rtx (op0))));
-
- /* Similarly, taking advantage of the fact that
- (and (not A) (xor B C)) == (xor (ior A B) (ior A C)) */
-
- if (GET_CODE (op0) == NOT && GET_CODE (op1) == XOR)
- return apply_distributive_law
- (gen_binary (XOR, mode,
- gen_binary (IOR, mode, XEXP (op0, 0), XEXP (op1, 0)),
- gen_binary (IOR, mode, copy_rtx (XEXP (op0, 0)),
- XEXP (op1, 1))));
-
- else if (GET_CODE (op1) == NOT && GET_CODE (op0) == XOR)
- return apply_distributive_law
- (gen_binary (XOR, mode,
- gen_binary (IOR, mode, XEXP (op1, 0), XEXP (op0, 0)),
- gen_binary (IOR, mode, copy_rtx (XEXP (op1, 0)), XEXP (op0, 1))));
break;
case IOR:
--- 5367,5382 ----
&& ! side_effects_p (XEXP (op0, 1)))
return op1;
! /* If we have any of (and (ior A B) C) or (and (xor A B) C),
! apply the distributive law and then the inverse distributive
! law to see if things simplify. */
! if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR
! || GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
! {
! rtx result = distribute_and_simplify_rtx (x);
! if (result)
! return result;
}
break;
case IOR:
***************
*** 5416,5443 ****
/* If we have (ior (and A B) C), apply the distributive law and then
the inverse distributive law to see if things simplify. */
! if (GET_CODE (op0) == AND)
! {
! x = apply_distributive_law
! (gen_binary (AND, mode,
! gen_binary (IOR, mode, XEXP (op0, 0), op1),
! gen_binary (IOR, mode, XEXP (op0, 1),
! copy_rtx (op1))));
!
! if (GET_CODE (x) != IOR)
! return x;
! }
!
! if (GET_CODE (op1) == AND)
{
! x = apply_distributive_law
! (gen_binary (AND, mode,
! gen_binary (IOR, mode, XEXP (op1, 0), op0),
! gen_binary (IOR, mode, XEXP (op1, 1),
! copy_rtx (op0))));
!
! if (GET_CODE (x) != IOR)
! return x;
}
/* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
--- 5397,5407 ----
/* If we have (ior (and A B) C), apply the distributive law and then
the inverse distributive law to see if things simplify. */
! if (GET_CODE (op0) == AND || GET_CODE (op1) == AND)
{
! rtx result = distribute_and_simplify_rtx (x);
! if (result)
! return result;
}
/* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
***************
*** 5486,5492 ****
if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
&& (nonzero_bits (op0, mode)
& nonzero_bits (op1, mode)) == 0)
! return (gen_binary (IOR, mode, op0, op1));
/* Convert (XOR (NOT x) (NOT y)) to (XOR x y).
Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for
--- 5450,5456 ----
if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
&& (nonzero_bits (op0, mode)
& nonzero_bits (op1, mode)) == 0)
! return (simplify_gen_binary (IOR, mode, op0, op1));
/* Convert (XOR (NOT x) (NOT y)) to (XOR x y).
Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for
***************
*** 5506,5512 ****
}
else if (num_negated == 1)
return
! simplify_gen_unary (NOT, mode, gen_binary (XOR, mode, op0, op1),
mode);
}
--- 5470,5477 ----
}
else if (num_negated == 1)
return
! simplify_gen_unary (NOT, mode,
! simplify_gen_binary (XOR, mode, op0, op1),
mode);
}
***************
*** 5517,5532 ****
if (GET_CODE (op0) == AND
&& rtx_equal_p (XEXP (op0, 1), op1)
&& ! side_effects_p (op1))
! return gen_binary (AND, mode,
! simplify_gen_unary (NOT, mode, XEXP (op0, 0), mode),
! op1);
else if (GET_CODE (op0) == AND
&& rtx_equal_p (XEXP (op0, 0), op1)
&& ! side_effects_p (op1))
! return gen_binary (AND, mode,
! simplify_gen_unary (NOT, mode, XEXP (op0, 1), mode),
! op1);
/* (xor (comparison foo bar) (const_int 1)) can become the reversed
comparison if STORE_FLAG_VALUE is 1. */
--- 5482,5499 ----
if (GET_CODE (op0) == AND
&& rtx_equal_p (XEXP (op0, 1), op1)
&& ! side_effects_p (op1))
! return simplify_gen_binary (AND, mode,
! simplify_gen_unary (NOT, mode,
! XEXP (op0, 0), mode),
! op1);
else if (GET_CODE (op0) == AND
&& rtx_equal_p (XEXP (op0, 0), op1)
&& ! side_effects_p (op1))
! return simplify_gen_binary (AND, mode,
! simplify_gen_unary (NOT, mode,
! XEXP (op0, 1), mode),
! op1);
/* (xor (comparison foo bar) (const_int 1)) can become the reversed
comparison if STORE_FLAG_VALUE is 1. */
***************
*** 5795,5801 ****
rtx inner;
rtx pos; /* Always counts from low bit. */
int len;
! rtx mask;
enum machine_mode compute_mode;
/* Loop until we find something we can't simplify. */
--- 5762,5768 ----
rtx inner;
rtx pos; /* Always counts from low bit. */
int len;
! rtx mask, cleared, masked;
enum machine_mode compute_mode;
/* Loop until we find something we can't simplify. */
***************
*** 5833,5842 ****
/* If position is ADJUST - X, new position is X. */
pos = XEXP (pos, 0);
else
! pos = gen_binary (MINUS, GET_MODE (pos),
! GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner))
! - len),
! pos);
}
}
--- 5800,5810 ----
/* If position is ADJUST - X, new position is X. */
pos = XEXP (pos, 0);
else
! pos = simplify_gen_binary (MINUS, GET_MODE (pos),
! GEN_INT (GET_MODE_BITSIZE (
! GET_MODE (inner))
! - len),
! pos);
}
}
***************
*** 5883,5912 ****
}
/* Compute a mask of LEN bits, if we can do this on the host machine. */
! if (len < HOST_BITS_PER_WIDE_INT)
! mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1);
! else
break;
/* Now compute the equivalent expression. Make a copy of INNER
for the SET_DEST in case it is a MEM into which we will substitute;
we don't want shared RTL in that case. */
! x = gen_rtx_SET
! (VOIDmode, copy_rtx (inner),
! gen_binary (IOR, compute_mode,
! gen_binary (AND, compute_mode,
! simplify_gen_unary (NOT, compute_mode,
! gen_binary (ASHIFT,
! compute_mode,
! mask, pos),
! compute_mode),
! inner),
! gen_binary (ASHIFT, compute_mode,
! gen_binary (AND, compute_mode,
! gen_lowpart
! (compute_mode, SET_SRC (x)),
! mask),
! pos)));
}
return x;
--- 5851,5880 ----
}
/* Compute a mask of LEN bits, if we can do this on the host machine. */
! if (len >= HOST_BITS_PER_WIDE_INT)
break;
/* Now compute the equivalent expression. Make a copy of INNER
for the SET_DEST in case it is a MEM into which we will substitute;
we don't want shared RTL in that case. */
! mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1);
! cleared = simplify_gen_binary (AND, compute_mode,
! simplify_gen_unary (NOT, compute_mode,
! simplify_gen_binary (ASHIFT,
! compute_mode,
! mask, pos),
! compute_mode),
! inner);
! masked = simplify_gen_binary (ASHIFT, compute_mode,
! simplify_gen_binary (
! AND, compute_mode,
! gen_lowpart (compute_mode, SET_SRC (x)),
! mask),
! pos);
!
! x = gen_rtx_SET (VOIDmode, copy_rtx (inner),
! simplify_gen_binary (IOR, compute_mode,
! cleared, masked));
}
return x;
***************
*** 6362,6369 ****
if (GET_CODE (XEXP (x, 1)) == CONST_INT
&& (INTVAL (XEXP (x, 1)) & ((((HOST_WIDE_INT) 1 << count)) - 1)) == 0
&& (tem = extract_left_shift (XEXP (x, 0), count)) != 0)
! return gen_binary (code, mode, tem,
! GEN_INT (INTVAL (XEXP (x, 1)) >> count));
break;
--- 6330,6337 ----
if (GET_CODE (XEXP (x, 1)) == CONST_INT
&& (INTVAL (XEXP (x, 1)) & ((((HOST_WIDE_INT) 1 << count)) - 1)) == 0
&& (tem = extract_left_shift (XEXP (x, 0), count)) != 0)
! return simplify_gen_binary (code, mode, tem,
! GEN_INT (INTVAL (XEXP (x, 1)) >> count));
break;
***************
*** 6854,6860 ****
&& (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
cval |= (HOST_WIDE_INT) -1 << width;
! y = gen_binary (AND, GET_MODE (x), XEXP (x, 0), GEN_INT (cval));
if (rtx_cost (y, SET) < rtx_cost (x, SET))
x = y;
}
--- 6822,6829 ----
&& (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
cval |= (HOST_WIDE_INT) -1 << width;
! y = simplify_gen_binary (AND, GET_MODE (x),
! XEXP (x, 0), GEN_INT (cval));
if (rtx_cost (y, SET) < rtx_cost (x, SET))
x = y;
}
***************
*** 6946,6955 ****
{
temp = GEN_INT ((INTVAL (XEXP (x, 1)) & mask)
<< INTVAL (XEXP (XEXP (x, 0), 1)));
! temp = gen_binary (GET_CODE (x), GET_MODE (x),
! XEXP (XEXP (x, 0), 0), temp);
! x = gen_binary (LSHIFTRT, GET_MODE (x), temp,
! XEXP (XEXP (x, 0), 1));
return force_to_mode (x, mode, mask, reg, next_select);
}
--- 6915,6924 ----
{
temp = GEN_INT ((INTVAL (XEXP (x, 1)) & mask)
<< INTVAL (XEXP (XEXP (x, 0), 1)));
! temp = simplify_gen_binary (GET_CODE (x), GET_MODE (x),
! XEXP (XEXP (x, 0), 0), temp);
! x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), temp,
! XEXP (XEXP (x, 0), 1));
return force_to_mode (x, mode, mask, reg, next_select);
}
***************
*** 6965,6971 ****
reg, next_select));
if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
! x = gen_binary (code, op_mode, op0, op1);
break;
case ASHIFT:
--- 6934,6940 ----
reg, next_select));
if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
! x = simplify_gen_binary (code, op_mode, op0, op1);
break;
case ASHIFT:
***************
*** 6999,7005 ****
mask, reg, next_select));
if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
! x = gen_binary (code, op_mode, op0, XEXP (x, 1));
break;
case LSHIFTRT:
--- 6968,6974 ----
mask, reg, next_select));
if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
! x = simplify_gen_binary (code, op_mode, op0, XEXP (x, 1));
break;
case LSHIFTRT:
***************
*** 7027,7033 ****
inner = force_to_mode (inner, op_mode, inner_mask, reg, next_select);
if (GET_MODE (x) != op_mode || inner != XEXP (x, 0))
! x = gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
}
/* If we have (and (lshiftrt FOO C1) C2) where the combination of the
--- 6996,7002 ----
inner = force_to_mode (inner, op_mode, inner_mask, reg, next_select);
if (GET_MODE (x) != op_mode || inner != XEXP (x, 0))
! x = simplify_gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
}
/* If we have (and (lshiftrt FOO C1) C2) where the combination of the
***************
*** 7049,7057 ****
/* Must be more sign bit copies than the mask needs. */
&& ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
>= exact_log2 (mask + 1)))
! x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
! GEN_INT (GET_MODE_BITSIZE (GET_MODE (x))
! - exact_log2 (mask + 1)));
goto shiftrt;
--- 7018,7026 ----
/* Must be more sign bit copies than the mask needs. */
&& ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
>= exact_log2 (mask + 1)))
! x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
! GEN_INT (GET_MODE_BITSIZE (GET_MODE (x))
! - exact_log2 (mask + 1)));
goto shiftrt;
***************
*** 7116,7122 ****
/* If MASK is 1, convert this to an LSHIFTRT. This can be done
even if the shift count isn't a constant. */
if (mask == 1)
! x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0), XEXP (x, 1));
shiftrt:
--- 7085,7092 ----
/* If MASK is 1, convert this to an LSHIFTRT. This can be done
even if the shift count isn't a constant. */
if (mask == 1)
! x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
! XEXP (x, 0), XEXP (x, 1));
shiftrt:
***************
*** 7181,7188 ****
{
temp = gen_int_mode (mask << INTVAL (XEXP (XEXP (x, 0), 1)),
GET_MODE (x));
! temp = gen_binary (XOR, GET_MODE (x), XEXP (XEXP (x, 0), 0), temp);
! x = gen_binary (LSHIFTRT, GET_MODE (x), temp, XEXP (XEXP (x, 0), 1));
return force_to_mode (x, mode, mask, reg, next_select);
}
--- 7151,7160 ----
{
temp = gen_int_mode (mask << INTVAL (XEXP (XEXP (x, 0), 1)),
GET_MODE (x));
! temp = simplify_gen_binary (XOR, GET_MODE (x),
! XEXP (XEXP (x, 0), 0), temp);
! x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
! temp, XEXP (XEXP (x, 0), 1));
return force_to_mode (x, mode, mask, reg, next_select);
}
***************
*** 7292,7299 ****
else if (cond1 == 0)
true1 = copy_rtx (true1);
! *ptrue = gen_binary (code, mode, true0, true1);
! *pfalse = gen_binary (code, mode, false0, false1);
return cond0 ? cond0 : cond1;
}
--- 7264,7282 ----
else if (cond1 == 0)
true1 = copy_rtx (true1);
! if (COMPARISON_P (x))
! {
! *ptrue = simplify_gen_relational (code, mode, VOIDmode,
! true0, true1);
! *pfalse = simplify_gen_relational (code, mode, VOIDmode,
! false0, false1);
! }
! else
! {
! *ptrue = simplify_gen_binary (code, mode, true0, true1);
! *pfalse = simplify_gen_binary (code, mode, false0, false1);
! }
!
return cond0 ? cond0 : cond1;
}
***************
*** 7323,7335 ****
&& rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
&& ! side_effects_p (x))
{
! *ptrue = gen_binary (MULT, mode, op0, const_true_rtx);
! *pfalse = gen_binary (MULT, mode,
! (code == MINUS
! ? simplify_gen_unary (NEG, mode, op1,
! mode)
! : op1),
! const_true_rtx);
return cond0;
}
}
--- 7306,7318 ----
&& rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
&& ! side_effects_p (x))
{
! *ptrue = simplify_gen_binary (MULT, mode, op0, const_true_rtx);
! *pfalse = simplify_gen_binary (MULT, mode,
! (code == MINUS
! ? simplify_gen_unary (NEG, mode,
! op1, mode)
! : op1),
! const_true_rtx);
return cond0;
}
}
***************
*** 7833,7840 ****
|| GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD)
return x;
! tem = gen_binary (code, GET_MODE (SUBREG_REG (lhs)),
! SUBREG_REG (lhs), SUBREG_REG (rhs));
return gen_lowpart (GET_MODE (x), tem);
default:
--- 7816,7823 ----
|| GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD)
return x;
! tem = simplify_gen_binary (code, GET_MODE (SUBREG_REG (lhs)),
! SUBREG_REG (lhs), SUBREG_REG (rhs));
return gen_lowpart (GET_MODE (x), tem);
default:
***************
*** 7860,7866 ****
return x;
/* Form the new inner operation, seeing if it simplifies first. */
! tem = gen_binary (code, GET_MODE (x), lhs, rhs);
/* There is one exception to the general way of distributing:
(a | c) ^ (b | c) -> (a ^ b) & ~c */
--- 7843,7849 ----
return x;
/* Form the new inner operation, seeing if it simplifies first. */
! tem = simplify_gen_binary (code, GET_MODE (x), lhs, rhs);
/* There is one exception to the general way of distributing:
(a | c) ^ (b | c) -> (a ^ b) & ~c */
***************
*** 7873,7880 ****
/* We may be able to continuing distributing the result, so call
ourselves recursively on the inner operation before forming the
outer operation, which we return. */
! return gen_binary (inner_code, GET_MODE (x),
! apply_distributive_law (tem), other);
}
\f
/* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
--- 7856,7942 ----
/* We may be able to continuing distributing the result, so call
ourselves recursively on the inner operation before forming the
outer operation, which we return. */
! return simplify_gen_binary (inner_code, GET_MODE (x),
! apply_distributive_law (tem), other);
! }
!
! /* See if X is of the form (* (+ a b) c), and if so convert to
! (+ (* a c) (* b c)) and try to simplify.
!
! Most of the time, this results in no change. However, if some of
! the operands are the same or inverses of each other, simplifications
! will result.
!
! For example, (and (ior A B) (not B)) can occur as the result of
! expanding a bit field assignment. When we apply the distributive
! law to this, we get (ior (and (A (not B))) (and (B (not B)))),
! which then simplifies to (and (A (not B))).
!
! Note that no checks happen on the validity of applying the inverse
! distributive law. This is pointless since we can do it in the
! few places where this routine is called. */
! static rtx
! distribute_and_simplify_rtx (rtx x)
! {
! enum machine_mode mode;
! enum rtx_code outer, inner;
! rtx op0, op1, inner_op0, inner_op1, new_op0, new_op1;
!
! mode = GET_MODE (x);
! outer = GET_CODE (x);
! op0 = XEXP (x, 0);
! op1 = XEXP (x, 1);
! if (ARITHMETIC_P (op0))
! {
! inner = GET_CODE (op0);
! inner_op0 = XEXP (op0, 0);
! inner_op1 = XEXP (op0, 1);
!
! /* (and (xor B C) (not A)) == (xor (ior A B) (ior A C)) */
! if (outer == AND && inner == XOR && GET_CODE (op1) == NOT)
! {
! new_op0 = simplify_gen_binary (IOR, mode, inner_op0, XEXP (op1, 0));
! new_op1 = simplify_gen_binary (IOR, mode, inner_op1, XEXP (op1, 0));
! x = apply_distributive_law (simplify_gen_binary (XOR, mode,
! new_op0, new_op1));
! }
! else
! {
! new_op0 = simplify_gen_binary (outer, mode, inner_op0, op1);
! new_op1 = simplify_gen_binary (outer, mode, inner_op1, op1);
! x = apply_distributive_law (simplify_gen_binary (inner, mode,
! new_op0, new_op1));
! }
! if (GET_CODE (x) != outer)
! return x;
! }
!
! if (ARITHMETIC_P (op1))
! {
! inner = GET_CODE (op1);
! inner_op0 = XEXP (op1, 0);
! inner_op1 = XEXP (op1, 1);
!
! /* (and (not A) (xor B C)) == (xor (ior A B) (ior A C)) */
! if (outer == AND && inner == XOR && GET_CODE (op0) == NOT)
! {
! new_op0 = simplify_gen_binary (IOR, mode, inner_op0, XEXP (op0, 0));
! new_op1 = simplify_gen_binary (IOR, mode, inner_op1, XEXP (op0, 0));
! x = apply_distributive_law (simplify_gen_binary (XOR, mode,
! new_op0, new_op1));
! }
! else
! {
! new_op0 = simplify_gen_binary (outer, mode, op0, inner_op0);
! new_op1 = simplify_gen_binary (outer, mode, op0, inner_op1);
! x = apply_distributive_law (simplify_gen_binary (inner, mode,
! new_op0, new_op1));
! }
! if (GET_CODE (x) != outer)
! return x;
! }
!
! return NULL_RTX;
}
\f
/* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
***************
*** 7941,7951 ****
gen_lowpart
(mode,
apply_distributive_law
! (gen_binary (GET_CODE (varop), GET_MODE (varop),
! simplify_and_const_int (NULL_RTX, GET_MODE (varop),
! XEXP (varop, 0), constop),
! simplify_and_const_int (NULL_RTX, GET_MODE (varop),
! XEXP (varop, 1), constop))));
/* If VAROP is PLUS, and the constant is a mask of low bite, distribute
the AND and see if one of the operands simplifies to zero. If so, we
--- 8003,8017 ----
gen_lowpart
(mode,
apply_distributive_law
! (simplify_gen_binary (GET_CODE (varop), GET_MODE (varop),
! simplify_and_const_int (NULL_RTX,
! GET_MODE (varop),
! XEXP (varop, 0),
! constop),
! simplify_and_const_int (NULL_RTX,
! GET_MODE (varop),
! XEXP (varop, 1),
! constop))));
/* If VAROP is PLUS, and the constant is a mask of low bite, distribute
the AND and see if one of the operands simplifies to zero. If so, we
***************
*** 7986,7992 ****
constop = trunc_int_for_mode (constop, mode);
/* See how much, if any, of X we can use. */
if (x == 0 || GET_CODE (x) != AND || GET_MODE (x) != mode)
! x = gen_binary (AND, mode, varop, GEN_INT (constop));
else
{
--- 8052,8058 ----
constop = trunc_int_for_mode (constop, mode);
/* See how much, if any, of X we can use. */
if (x == 0 || GET_CODE (x) != AND || GET_MODE (x) != mode)
! x = simplify_gen_binary (AND, mode, varop, GEN_INT (constop));
else
{
***************
*** 8505,8512 ****
&& exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
{
varop
! = gen_binary (ASHIFT, GET_MODE (varop), XEXP (varop, 0),
! GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));
continue;
}
break;
--- 8571,8580 ----
&& exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
{
varop
! = simplify_gen_binary (ASHIFT, GET_MODE (varop),
! XEXP (varop, 0),
! GEN_INT (exact_log2 (
! INTVAL (XEXP (varop, 1)))));
continue;
}
break;
***************
*** 8517,8524 ****
&& exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
{
varop
! = gen_binary (LSHIFTRT, GET_MODE (varop), XEXP (varop, 0),
! GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));
continue;
}
break;
--- 8585,8594 ----
&& exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
{
varop
! = simplify_gen_binary (LSHIFTRT, GET_MODE (varop),
! XEXP (varop, 0),
! GEN_INT (exact_log2 (
! INTVAL (XEXP (varop, 1)))));
continue;
}
break;
***************
*** 8773,8779 ****
rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode,
XEXP (varop, 1), count);
! varop = gen_binary (GET_CODE (varop), shift_mode, lhs, rhs);
varop = apply_distributive_law (varop);
count = 0;
--- 8843,8850 ----
rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode,
XEXP (varop, 1), count);
! varop = simplify_gen_binary (GET_CODE (varop), shift_mode,
! lhs, rhs);
varop = apply_distributive_law (varop);
count = 0;
***************
*** 9028,9034 ****
else if (GET_RTX_CLASS (outer_op) == RTX_UNARY)
x = simplify_gen_unary (outer_op, result_mode, x, result_mode);
else
! x = gen_binary (outer_op, result_mode, x, GEN_INT (outer_const));
}
return x;
--- 9099,9106 ----
else if (GET_RTX_CLASS (outer_op) == RTX_UNARY)
x = simplify_gen_unary (outer_op, result_mode, x, result_mode);
else
! x = simplify_gen_binary (outer_op, result_mode, x,
! GEN_INT (outer_const));
}
return x;
***************
*** 9261,9323 ****
}
}
\f
- /* These routines make binary and unary operations by first seeing if they
- fold; if not, a new expression is allocated. */
-
- static rtx
- gen_binary (enum rtx_code code, enum machine_mode mode, rtx op0, rtx op1)
- {
- rtx result;
- rtx tem;
-
- if (GET_CODE (op0) == CLOBBER)
- return op0;
- else if (GET_CODE (op1) == CLOBBER)
- return op1;
-
- if (GET_RTX_CLASS (code) == RTX_COMM_ARITH
- && swap_commutative_operands_p (op0, op1))
- tem = op0, op0 = op1, op1 = tem;
-
- if (GET_RTX_CLASS (code) == RTX_COMPARE
- || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
- {
- enum machine_mode op_mode = GET_MODE (op0);
-
- /* Strip the COMPARE from (REL_OP (compare X Y) 0) to get
- just (REL_OP X Y). */
- if (GET_CODE (op0) == COMPARE && op1 == const0_rtx)
- {
- op1 = XEXP (op0, 1);
- op0 = XEXP (op0, 0);
- op_mode = GET_MODE (op0);
- }
-
- if (op_mode == VOIDmode)
- op_mode = GET_MODE (op1);
- result = simplify_relational_operation (code, mode, op_mode, op0, op1);
- }
- else
- result = simplify_binary_operation (code, mode, op0, op1);
-
- if (result)
- return result;
-
- /* Put complex operands first and constants second. */
- if (GET_RTX_CLASS (code) == RTX_COMM_ARITH
- && swap_commutative_operands_p (op0, op1))
- return gen_rtx_fmt_ee (code, mode, op1, op0);
-
- /* If we are turning off bits already known off in OP0, we need not do
- an AND. */
- else if (code == AND && GET_CODE (op1) == CONST_INT
- && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
- && (nonzero_bits (op0, mode) & ~INTVAL (op1)) == 0)
- return op0;
-
- return gen_rtx_fmt_ee (code, mode, op0, op1);
- }
- \f
/* Simplify a comparison between *POP0 and *POP1 where CODE is the
comparison code that will be tested.
--- 9333,9338 ----
***************
*** 10152,10160 ****
&& c1 != mask
&& c1 != GET_MODE_MASK (tmode))
{
! op0 = gen_binary (AND, tmode,
! SUBREG_REG (XEXP (op0, 0)),
! gen_int_mode (c1, tmode));
op0 = gen_lowpart (mode, op0);
continue;
}
--- 10167,10175 ----
&& c1 != mask
&& c1 != GET_MODE_MASK (tmode))
{
! op0 = simplify_gen_binary (AND, tmode,
! SUBREG_REG (XEXP (op0, 0)),
! gen_int_mode (c1, tmode));
op0 = gen_lowpart (mode, op0);
continue;
}
***************
*** 10298,10309 ****
{
rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
rtx add_const = XEXP (XEXP (op0, 0), 1);
! rtx new_const = gen_binary (ASHIFTRT, GET_MODE (op0), add_const,
! XEXP (op0, 1));
! op0 = gen_binary (PLUS, tmode,
! gen_lowpart (tmode, inner),
! new_const);
continue;
}
--- 10313,10324 ----
{
rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
rtx add_const = XEXP (XEXP (op0, 0), 1);
! rtx new_const = simplify_gen_binary (ASHIFTRT, GET_MODE (op0),
! add_const, XEXP (op0, 1));
! op0 = simplify_gen_binary (PLUS, tmode,
! gen_lowpart (tmode, inner),
! new_const);
continue;
}
***************
*** 10456,10466 ****
make a new AND in the proper mode. */
if (GET_CODE (op0) == AND
&& !have_insn_for (AND, mode))
! op0 = gen_binary (AND, tmode,
! gen_lowpart (tmode,
! XEXP (op0, 0)),
! gen_lowpart (tmode,
! XEXP (op0, 1)));
op0 = gen_lowpart (tmode, op0);
if (zero_extended && GET_CODE (op1) == CONST_INT)
--- 10471,10481 ----
make a new AND in the proper mode. */
if (GET_CODE (op0) == AND
&& !have_insn_for (AND, mode))
! op0 = simplify_gen_binary (AND, tmode,
! gen_lowpart (tmode,
! XEXP (op0, 0)),
! gen_lowpart (tmode,
! XEXP (op0, 1)));
op0 = gen_lowpart (tmode, op0);
if (zero_extended && GET_CODE (op1) == CONST_INT)
***************
*** 10475,10484 ****
if (op1 == const0_rtx && (code == LT || code == GE)
&& GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
{
! op0 = gen_binary (AND, tmode,
! gen_lowpart (tmode, op0),
! GEN_INT ((HOST_WIDE_INT) 1
! << (GET_MODE_BITSIZE (mode) - 1)));
code = (code == LT) ? NE : EQ;
break;
}
--- 10490,10500 ----
if (op1 == const0_rtx && (code == LT || code == GE)
&& GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
{
! op0 = simplify_gen_binary (AND, tmode,
! gen_lowpart (tmode, op0),
! GEN_INT ((HOST_WIDE_INT) 1
! << (GET_MODE_BITSIZE (mode)
! - 1)));
code = (code == LT) ? NE : EQ;
break;
}
***************
*** 10525,10531 ****
if (reversed_code == UNKNOWN)
return NULL_RTX;
else
! return gen_binary (reversed_code, mode, op0, op1);
}
\f
/* Utility function for following routine. Called when X is part of a value
--- 10541,10547 ----
if (reversed_code == UNKNOWN)
return NULL_RTX;
else
! return simplify_gen_relational (reversed_code, mode, VOIDmode, op0, op1);
}
\f
/* Utility function for following routine. Called when X is part of a value
WARNING: multiple messages have this Message-ID
From: Paolo Bonzini <bonzini@gnu.org>
To: Eric Botcazou <ebotcazou@libertysurf.fr>
Cc: GCC Patches <gcc-patches@gcc.gnu.org>
Subject: Re: RFT/RFA: Eliminate gen_binary, take 2
Date: Wed, 09 Jun 2004 09:36:00 -0000 [thread overview]
Message-ID: <40C6BAF5.6020201@gnu.org> (raw)
Message-ID: <20040609093600.GjGLHVSFcp5ErqV-bCCbH8Ka4EaA89MUKMBvrM5VQBU@z> (raw)
In-Reply-To: <200406082314.40908.ebotcazou@libertysurf.fr>
[-- Attachment #1: Type: text/plain, Size: 195 bytes --]
> Please provide a complete patch. And I'll try to find a version of GNU patch
> that can apply it this time. :-)
Here it is.
I can mail you privately a gzipped combine.c if you want.
Paolo
[-- Attachment #2: combine-kill-gen-binary-take-4.patch --]
[-- Type: text/plain, Size: 49569 bytes --]
Index: combine.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/combine.c,v
retrieving revision 1.432
diff -c -r1.432 combine.c
*** combine.c 5 Jun 2004 07:59:39 -0000 1.432
--- combine.c 9 Jun 2004 07:20:09 -0000
***************
*** 372,377 ****
--- 372,378 ----
static int rtx_equal_for_field_assignment_p (rtx, rtx);
static rtx make_field_assignment (rtx);
static rtx apply_distributive_law (rtx);
+ static rtx distribute_and_simplify_rtx (rtx);
static rtx simplify_and_const_int (rtx, enum machine_mode, rtx,
unsigned HOST_WIDE_INT);
static int merge_outer_ops (enum rtx_code *, HOST_WIDE_INT *, enum rtx_code,
***************
*** 380,386 ****
int);
static int recog_for_combine (rtx *, rtx, rtx *);
static rtx gen_lowpart_for_combine (enum machine_mode, rtx);
- static rtx gen_binary (enum rtx_code, enum machine_mode, rtx, rtx);
static enum rtx_code simplify_comparison (enum rtx_code, rtx *, rtx *);
static void update_table_tick (rtx);
static void record_value_for_reg (rtx, rtx, rtx);
--- 381,386 ----
***************
*** 3017,3030 ****
if (src == mask)
SUBST (SET_SRC (x),
! gen_binary (IOR, mode, dest, GEN_INT (src << pos)));
else
! SUBST (SET_SRC (x),
! gen_binary (IOR, mode,
! gen_binary (AND, mode, dest,
! gen_int_mode (~(mask << pos),
! mode)),
! GEN_INT (src << pos)));
SUBST (SET_DEST (x), dest);
--- 3017,3032 ----
if (src == mask)
SUBST (SET_SRC (x),
! simplify_gen_binary (IOR, mode, dest, GEN_INT (src << pos)));
else
! {
! rtx negmask = gen_int_mode (~(mask << pos), mode);
! SUBST (SET_SRC (x),
! simplify_gen_binary (IOR, mode,
! simplify_gen_binary (AND, mode,
! dest, negmask),
! GEN_INT (src << pos)));
! }
SUBST (SET_DEST (x), dest);
***************
*** 3599,3605 ****
new = simplify_shift_const (NULL_RTX, ASHIFTRT, mode, new,
INTVAL (XEXP (XEXP (x, 0), 1)));
! SUBST (XEXP (x, 0), gen_binary (PLUS, mode, new, temp));
}
/* If this is a simple operation applied to an IF_THEN_ELSE, try
--- 3601,3607 ----
new = simplify_shift_const (NULL_RTX, ASHIFTRT, mode, new,
INTVAL (XEXP (XEXP (x, 0), 1)));
! SUBST (XEXP (x, 0), simplify_gen_binary (PLUS, mode, new, temp));
}
/* If this is a simple operation applied to an IF_THEN_ELSE, try
***************
*** 3656,3667 ****
/* If the result values are STORE_FLAG_VALUE and zero, we can
just make the comparison operation. */
if (true_rtx == const_true_rtx && false_rtx == const0_rtx)
! x = gen_binary (cond_code, mode, cond, cop1);
else if (true_rtx == const0_rtx && false_rtx == const_true_rtx
&& ((reversed = reversed_comparison_code_parts
(cond_code, cond, cop1, NULL))
!= UNKNOWN))
! x = gen_binary (reversed, mode, cond, cop1);
/* Likewise, we can make the negate of a comparison operation
if the result values are - STORE_FLAG_VALUE and zero. */
--- 3658,3671 ----
/* If the result values are STORE_FLAG_VALUE and zero, we can
just make the comparison operation. */
if (true_rtx == const_true_rtx && false_rtx == const0_rtx)
! x = simplify_gen_relational (cond_code, mode, VOIDmode,
! cond, cop1);
else if (true_rtx == const0_rtx && false_rtx == const_true_rtx
&& ((reversed = reversed_comparison_code_parts
(cond_code, cond, cop1, NULL))
!= UNKNOWN))
! x = simplify_gen_relational (reversed, mode, VOIDmode,
! cond, cop1);
/* Likewise, we can make the negate of a comparison operation
if the result values are - STORE_FLAG_VALUE and zero. */
***************
*** 3669,3676 ****
&& INTVAL (true_rtx) == - STORE_FLAG_VALUE
&& false_rtx == const0_rtx)
x = simplify_gen_unary (NEG, mode,
! gen_binary (cond_code, mode, cond,
! cop1),
mode);
else if (GET_CODE (false_rtx) == CONST_INT
&& INTVAL (false_rtx) == - STORE_FLAG_VALUE
--- 3673,3681 ----
&& INTVAL (true_rtx) == - STORE_FLAG_VALUE
&& false_rtx == const0_rtx)
x = simplify_gen_unary (NEG, mode,
! simplify_gen_relational (cond_code,
! mode, VOIDmode,
! cond, cop1),
mode);
else if (GET_CODE (false_rtx) == CONST_INT
&& INTVAL (false_rtx) == - STORE_FLAG_VALUE
***************
*** 3679,3691 ****
(cond_code, cond, cop1, NULL))
!= UNKNOWN))
x = simplify_gen_unary (NEG, mode,
! gen_binary (reversed, mode,
! cond, cop1),
mode);
else
return gen_rtx_IF_THEN_ELSE (mode,
! gen_binary (cond_code, VOIDmode,
! cond, cop1),
true_rtx, false_rtx);
code = GET_CODE (x);
--- 3684,3700 ----
(cond_code, cond, cop1, NULL))
!= UNKNOWN))
x = simplify_gen_unary (NEG, mode,
! simplify_gen_relational (reversed,
! mode, VOIDmode,
! cond, cop1),
mode);
else
return gen_rtx_IF_THEN_ELSE (mode,
! simplify_gen_relational (cond_code,
! mode,
! VOIDmode,
! cond,
! cop1),
true_rtx, false_rtx);
code = GET_CODE (x);
***************
*** 3788,3794 ****
}
if (inner)
! return gen_binary (code, mode, other, inner);
}
}
--- 3797,3803 ----
}
if (inner)
! return simplify_gen_binary (code, mode, other, inner);
}
}
***************
*** 3890,3896 ****
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);
temp = expand_compound_operation (XEXP (x, 0));
--- 3899,3906 ----
if (GET_CODE (XEXP (x, 0)) == XOR
&& XEXP (XEXP (x, 0), 1) == const1_rtx
&& nonzero_bits (XEXP (XEXP (x, 0), 0), mode) == 1)
! return simplify_gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0),
! constm1_rtx);
temp = expand_compound_operation (XEXP (x, 0));
***************
*** 4118,4125 ****
in1 = XEXP (XEXP (XEXP (x, 0), 0), 0);
in2 = XEXP (XEXP (x, 0), 1);
! return gen_binary (MINUS, mode, XEXP (x, 1),
! gen_binary (MULT, mode, in1, in2));
}
/* If we have (plus (plus (A const) B)), associate it so that CONST is
--- 4128,4136 ----
in1 = XEXP (XEXP (XEXP (x, 0), 0), 0);
in2 = XEXP (XEXP (x, 0), 1);
! return simplify_gen_binary (MINUS, mode, XEXP (x, 1),
! simplify_gen_binary (MULT, mode,
! in1, in2));
}
/* If we have (plus (plus (A const) B)), associate it so that CONST is
***************
*** 4128,4137 ****
they are now checked elsewhere. */
if (GET_CODE (XEXP (x, 0)) == PLUS
&& CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1)))
! return gen_binary (PLUS, mode,
! gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0),
! XEXP (x, 1)),
! XEXP (XEXP (x, 0), 1));
/* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
when c is (const_int (pow2 + 1) / 2) is a sign extension of a
--- 4139,4149 ----
they are now checked elsewhere. */
if (GET_CODE (XEXP (x, 0)) == PLUS
&& CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1)))
! return simplify_gen_binary (PLUS, mode,
! simplify_gen_binary (PLUS, mode,
! XEXP (XEXP (x, 0), 0),
! XEXP (x, 1)),
! XEXP (XEXP (x, 0), 1));
/* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
when c is (const_int (pow2 + 1) / 2) is a sign extension of a
***************
*** 4197,4203 ****
& nonzero_bits (XEXP (x, 1), mode)) == 0)
{
/* Try to simplify the expression further. */
! rtx tor = gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
temp = combine_simplify_rtx (tor, mode, in_dest);
/* If we could, great. If not, do not go ahead with the IOR
--- 4209,4215 ----
& nonzero_bits (XEXP (x, 1), mode)) == 0)
{
/* Try to simplify the expression further. */
! rtx tor = simplify_gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
temp = combine_simplify_rtx (tor, mode, in_dest);
/* If we could, great. If not, do not go ahead with the IOR
***************
*** 4237,4244 ****
in1 = XEXP (XEXP (XEXP (x, 1), 0), 0);
in2 = XEXP (XEXP (x, 1), 1);
! return gen_binary (PLUS, mode, gen_binary (MULT, mode, in1, in2),
! XEXP (x, 0));
}
/* Canonicalize (minus (neg A) (mult B C)) to
--- 4249,4258 ----
in1 = XEXP (XEXP (XEXP (x, 1), 0), 0);
in2 = XEXP (XEXP (x, 1), 1);
! return simplify_gen_binary (PLUS, mode,
! simplify_gen_binary (MULT, mode,
! in1, in2),
! XEXP (x, 0));
}
/* Canonicalize (minus (neg A) (mult B C)) to
***************
*** 4250,4266 ****
in1 = simplify_gen_unary (NEG, mode, XEXP (XEXP (x, 1), 0), mode);
in2 = XEXP (XEXP (x, 1), 1);
! return gen_binary (MINUS, mode, gen_binary (MULT, mode, in1, in2),
! XEXP (XEXP (x, 0), 0));
}
/* Canonicalize (minus A (plus B C)) to (minus (minus A B) C) for
integers. */
if (GET_CODE (XEXP (x, 1)) == PLUS && INTEGRAL_MODE_P (mode))
! return gen_binary (MINUS, mode,
! gen_binary (MINUS, mode, XEXP (x, 0),
! XEXP (XEXP (x, 1), 0)),
! XEXP (XEXP (x, 1), 1));
break;
case MULT:
--- 4264,4283 ----
in1 = simplify_gen_unary (NEG, mode, XEXP (XEXP (x, 1), 0), mode);
in2 = XEXP (XEXP (x, 1), 1);
! return simplify_gen_binary (MINUS, mode,
! simplify_gen_binary (MULT, mode,
! in1, in2),
! XEXP (XEXP (x, 0), 0));
}
/* Canonicalize (minus A (plus B C)) to (minus (minus A B) C) for
integers. */
if (GET_CODE (XEXP (x, 1)) == PLUS && INTEGRAL_MODE_P (mode))
! return simplify_gen_binary (MINUS, mode,
! simplify_gen_binary (MINUS, mode,
! XEXP (x, 0),
! XEXP (XEXP (x, 1), 0)),
! XEXP (XEXP (x, 1), 1));
break;
case MULT:
***************
*** 4270,4286 ****
if (GET_CODE (XEXP (x, 0)) == PLUS)
{
! x = apply_distributive_law
! (gen_binary (PLUS, mode,
! gen_binary (MULT, mode,
! XEXP (XEXP (x, 0), 0), XEXP (x, 1)),
! gen_binary (MULT, mode,
! XEXP (XEXP (x, 0), 1),
! copy_rtx (XEXP (x, 1)))));
!
! if (GET_CODE (x) != MULT)
! return x;
}
/* Try simplify a*(b/c) as (a*b)/c. */
if (FLOAT_MODE_P (mode) && flag_unsafe_math_optimizations
&& GET_CODE (XEXP (x, 0)) == DIV)
--- 4287,4297 ----
if (GET_CODE (XEXP (x, 0)) == PLUS)
{
! rtx result = distribute_and_simplify_rtx (x);
! if (result)
! return result;
}
+
/* Try simplify a*(b/c) as (a*b)/c. */
if (FLOAT_MODE_P (mode) && flag_unsafe_math_optimizations
&& GET_CODE (XEXP (x, 0)) == DIV)
***************
*** 4289,4295 ****
XEXP (XEXP (x, 0), 0),
XEXP (x, 1));
if (tem)
! return gen_binary (DIV, mode, tem, XEXP (XEXP (x, 0), 1));
}
break;
--- 4300,4306 ----
XEXP (XEXP (x, 0), 0),
XEXP (x, 1));
if (tem)
! return simplify_gen_binary (DIV, mode, tem, XEXP (XEXP (x, 0), 1));
}
break;
***************
*** 4369,4377 ****
&& nonzero_bits (op0, mode) == 1)
{
op0 = expand_compound_operation (op0);
! return gen_binary (XOR, mode,
! gen_lowpart (mode, op0),
! const1_rtx);
}
else if (STORE_FLAG_VALUE == 1
--- 4380,4388 ----
&& nonzero_bits (op0, mode) == 1)
{
op0 = expand_compound_operation (op0);
! return simplify_gen_binary (XOR, mode,
! gen_lowpart (mode, op0),
! const1_rtx);
}
else if (STORE_FLAG_VALUE == 1
***************
*** 4614,4620 ****
/* Simplify storing of the truth value. */
if (comparison_p && true_rtx == const_true_rtx && false_rtx == const0_rtx)
! return gen_binary (true_code, mode, XEXP (cond, 0), XEXP (cond, 1));
/* Also when the truth value has to be reversed. */
if (comparison_p
--- 4625,4632 ----
/* Simplify storing of the truth value. */
if (comparison_p && true_rtx == const_true_rtx && false_rtx == const0_rtx)
! return simplify_gen_relational (true_code, mode, VOIDmode,
! XEXP (cond, 0), XEXP (cond, 1));
/* Also when the truth value has to be reversed. */
if (comparison_p
***************
*** 4764,4779 ****
{
case GE:
case GT:
! return gen_binary (SMAX, mode, true_rtx, false_rtx);
case LE:
case LT:
! return gen_binary (SMIN, mode, true_rtx, false_rtx);
case GEU:
case GTU:
! return gen_binary (UMAX, mode, true_rtx, false_rtx);
case LEU:
case LTU:
! return gen_binary (UMIN, mode, true_rtx, false_rtx);
default:
break;
}
--- 4776,4791 ----
{
case GE:
case GT:
! return simplify_gen_binary (SMAX, mode, true_rtx, false_rtx);
case LE:
case LT:
! return simplify_gen_binary (SMIN, mode, true_rtx, false_rtx);
case GEU:
case GTU:
! return simplify_gen_binary (UMAX, mode, true_rtx, false_rtx);
case LEU:
case LTU:
! return simplify_gen_binary (UMIN, mode, true_rtx, false_rtx);
default:
break;
}
***************
*** 4886,4897 ****
if (z)
{
! temp = subst (gen_binary (true_code, m, cond_op0, cond_op1),
pc_rtx, pc_rtx, 0, 0);
! temp = gen_binary (MULT, m, temp,
! gen_binary (MULT, m, c1, const_true_rtx));
temp = subst (temp, pc_rtx, pc_rtx, 0, 0);
! temp = gen_binary (op, m, gen_lowpart (m, z), temp);
if (extend_op != NIL)
temp = simplify_gen_unary (extend_op, mode, temp, m);
--- 4898,4911 ----
if (z)
{
! temp = subst (simplify_gen_relational (true_code, m, VOIDmode,
! cond_op0, cond_op1),
pc_rtx, pc_rtx, 0, 0);
! temp = simplify_gen_binary (MULT, m, temp,
! simplify_gen_binary (MULT, m, c1,
! const_true_rtx));
temp = subst (temp, pc_rtx, pc_rtx, 0, 0);
! temp = simplify_gen_binary (op, m, gen_lowpart (m, z), temp);
if (extend_op != NIL)
temp = simplify_gen_unary (extend_op, mode, temp, m);
***************
*** 5076,5082 ****
PUT_CODE (*cc_use, old_code);
other_changed = 0;
! op0 = gen_binary (XOR, GET_MODE (op0), op0, GEN_INT (mask));
}
}
}
--- 5090,5097 ----
PUT_CODE (*cc_use, old_code);
other_changed = 0;
! op0 = simplify_gen_binary (XOR, GET_MODE (op0),
! op0, GEN_INT (mask));
}
}
}
***************
*** 5240,5257 ****
&& rtx_equal_p (XEXP (false_rtx, 1), true_rtx))
term1 = true_rtx, false_rtx = XEXP (false_rtx, 0), true_rtx = const0_rtx;
! term2 = gen_binary (AND, GET_MODE (src),
! XEXP (XEXP (src, 0), 0), true_rtx);
! term3 = gen_binary (AND, GET_MODE (src),
! simplify_gen_unary (NOT, GET_MODE (src),
! XEXP (XEXP (src, 0), 0),
! GET_MODE (src)),
! false_rtx);
SUBST (SET_SRC (x),
! gen_binary (IOR, GET_MODE (src),
! gen_binary (IOR, GET_MODE (src), term1, term2),
! term3));
src = SET_SRC (x);
}
--- 5255,5273 ----
&& rtx_equal_p (XEXP (false_rtx, 1), true_rtx))
term1 = true_rtx, false_rtx = XEXP (false_rtx, 0), true_rtx = const0_rtx;
! term2 = simplify_gen_binary (AND, GET_MODE (src),
! XEXP (XEXP (src, 0), 0), true_rtx);
! term3 = simplify_gen_binary (AND, GET_MODE (src),
! simplify_gen_unary (NOT, GET_MODE (src),
! XEXP (XEXP (src, 0), 0),
! GET_MODE (src)),
! false_rtx);
SUBST (SET_SRC (x),
! simplify_gen_binary (IOR, GET_MODE (src),
! simplify_gen_binary (IOR, GET_MODE (src),
! term1, term2),
! term3));
src = SET_SRC (x);
}
***************
*** 5286,5314 ****
if (GET_CODE (op0) == XOR
&& rtx_equal_p (XEXP (op0, 0), op1)
&& ! side_effects_p (op1))
! x = gen_binary (AND, mode,
! simplify_gen_unary (NOT, mode, XEXP (op0, 1), mode),
! op1);
if (GET_CODE (op0) == XOR
&& rtx_equal_p (XEXP (op0, 1), op1)
&& ! side_effects_p (op1))
! x = gen_binary (AND, mode,
! simplify_gen_unary (NOT, mode, XEXP (op0, 0), mode),
! op1);
/* Similarly for (~(A ^ B)) & A. */
if (GET_CODE (op0) == NOT
&& GET_CODE (XEXP (op0, 0)) == XOR
&& rtx_equal_p (XEXP (XEXP (op0, 0), 0), op1)
&& ! side_effects_p (op1))
! x = gen_binary (AND, mode, XEXP (XEXP (op0, 0), 1), op1);
if (GET_CODE (op0) == NOT
&& GET_CODE (XEXP (op0, 0)) == XOR
&& rtx_equal_p (XEXP (XEXP (op0, 0), 1), op1)
&& ! side_effects_p (op1))
! x = gen_binary (AND, mode, XEXP (XEXP (op0, 0), 0), op1);
/* We can call simplify_and_const_int only if we don't lose
any (sign) bits when converting INTVAL (op1) to
--- 5302,5332 ----
if (GET_CODE (op0) == XOR
&& rtx_equal_p (XEXP (op0, 0), op1)
&& ! side_effects_p (op1))
! x = simplify_gen_binary (AND, mode,
! simplify_gen_unary (NOT, mode,
! XEXP (op0, 1), mode),
! op1);
if (GET_CODE (op0) == XOR
&& rtx_equal_p (XEXP (op0, 1), op1)
&& ! side_effects_p (op1))
! x = simplify_gen_binary (AND, mode,
! simplify_gen_unary (NOT, mode,
! XEXP (op0, 0), mode),
! op1);
/* Similarly for (~(A ^ B)) & A. */
if (GET_CODE (op0) == NOT
&& GET_CODE (XEXP (op0, 0)) == XOR
&& rtx_equal_p (XEXP (XEXP (op0, 0), 0), op1)
&& ! side_effects_p (op1))
! x = simplify_gen_binary (AND, mode, XEXP (XEXP (op0, 0), 1), op1);
if (GET_CODE (op0) == NOT
&& GET_CODE (XEXP (op0, 0)) == XOR
&& rtx_equal_p (XEXP (XEXP (op0, 0), 1), op1)
&& ! side_effects_p (op1))
! x = simplify_gen_binary (AND, mode, XEXP (XEXP (op0, 0), 0), op1);
/* We can call simplify_and_const_int only if we don't lose
any (sign) bits when converting INTVAL (op1) to
***************
*** 5328,5335 ****
&& GET_CODE (XEXP (op0, 1)) == CONST_INT
&& GET_CODE (op1) == CONST_INT
&& (INTVAL (XEXP (op0, 1)) & INTVAL (op1)) != 0)
! return gen_binary (IOR, mode,
! gen_binary (AND, mode, XEXP (op0, 0),
GEN_INT (INTVAL (XEXP (op0, 1))
& ~INTVAL (op1))), op1);
--- 5346,5354 ----
&& GET_CODE (XEXP (op0, 1)) == CONST_INT
&& GET_CODE (op1) == CONST_INT
&& (INTVAL (XEXP (op0, 1)) & INTVAL (op1)) != 0)
! return simplify_gen_binary (IOR, mode,
! simplify_gen_binary
! (AND, mode, XEXP (op0, 0),
GEN_INT (INTVAL (XEXP (op0, 1))
& ~INTVAL (op1))), op1);
***************
*** 5348,5401 ****
&& ! side_effects_p (XEXP (op0, 1)))
return op1;
! /* In the following group of tests (and those in case IOR below),
! we start with some combination of logical operations and apply
! the distributive law followed by the inverse distributive law.
! Most of the time, this results in no change. However, if some of
! the operands are the same or inverses of each other, simplifications
! will result.
!
! For example, (and (ior A B) (not B)) can occur as the result of
! expanding a bit field assignment. When we apply the distributive
! law to this, we get (ior (and (A (not B))) (and (B (not B)))),
! which then simplifies to (and (A (not B))).
!
! If we have (and (ior A B) C), apply the distributive law and then
! the inverse distributive law to see if things simplify. */
!
! if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR)
! {
! x = apply_distributive_law
! (gen_binary (GET_CODE (op0), mode,
! gen_binary (AND, mode, XEXP (op0, 0), op1),
! gen_binary (AND, mode, XEXP (op0, 1),
! copy_rtx (op1))));
! if (GET_CODE (x) != AND)
! return x;
}
-
- if (GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
- return apply_distributive_law
- (gen_binary (GET_CODE (op1), mode,
- gen_binary (AND, mode, XEXP (op1, 0), op0),
- gen_binary (AND, mode, XEXP (op1, 1),
- copy_rtx (op0))));
-
- /* Similarly, taking advantage of the fact that
- (and (not A) (xor B C)) == (xor (ior A B) (ior A C)) */
-
- if (GET_CODE (op0) == NOT && GET_CODE (op1) == XOR)
- return apply_distributive_law
- (gen_binary (XOR, mode,
- gen_binary (IOR, mode, XEXP (op0, 0), XEXP (op1, 0)),
- gen_binary (IOR, mode, copy_rtx (XEXP (op0, 0)),
- XEXP (op1, 1))));
-
- else if (GET_CODE (op1) == NOT && GET_CODE (op0) == XOR)
- return apply_distributive_law
- (gen_binary (XOR, mode,
- gen_binary (IOR, mode, XEXP (op1, 0), XEXP (op0, 0)),
- gen_binary (IOR, mode, copy_rtx (XEXP (op1, 0)), XEXP (op0, 1))));
break;
case IOR:
--- 5367,5382 ----
&& ! side_effects_p (XEXP (op0, 1)))
return op1;
! /* If we have any of (and (ior A B) C) or (and (xor A B) C),
! apply the distributive law and then the inverse distributive
! law to see if things simplify. */
! if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR
! || GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
! {
! rtx result = distribute_and_simplify_rtx (x);
! if (result)
! return result;
}
break;
case IOR:
***************
*** 5416,5443 ****
/* If we have (ior (and A B) C), apply the distributive law and then
the inverse distributive law to see if things simplify. */
! if (GET_CODE (op0) == AND)
! {
! x = apply_distributive_law
! (gen_binary (AND, mode,
! gen_binary (IOR, mode, XEXP (op0, 0), op1),
! gen_binary (IOR, mode, XEXP (op0, 1),
! copy_rtx (op1))));
!
! if (GET_CODE (x) != IOR)
! return x;
! }
!
! if (GET_CODE (op1) == AND)
{
! x = apply_distributive_law
! (gen_binary (AND, mode,
! gen_binary (IOR, mode, XEXP (op1, 0), op0),
! gen_binary (IOR, mode, XEXP (op1, 1),
! copy_rtx (op0))));
!
! if (GET_CODE (x) != IOR)
! return x;
}
/* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
--- 5397,5407 ----
/* If we have (ior (and A B) C), apply the distributive law and then
the inverse distributive law to see if things simplify. */
! if (GET_CODE (op0) == AND || GET_CODE (op1) == AND)
{
! rtx result = distribute_and_simplify_rtx (x);
! if (result)
! return result;
}
/* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
***************
*** 5486,5492 ****
if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
&& (nonzero_bits (op0, mode)
& nonzero_bits (op1, mode)) == 0)
! return (gen_binary (IOR, mode, op0, op1));
/* Convert (XOR (NOT x) (NOT y)) to (XOR x y).
Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for
--- 5450,5456 ----
if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
&& (nonzero_bits (op0, mode)
& nonzero_bits (op1, mode)) == 0)
! return (simplify_gen_binary (IOR, mode, op0, op1));
/* Convert (XOR (NOT x) (NOT y)) to (XOR x y).
Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for
***************
*** 5506,5512 ****
}
else if (num_negated == 1)
return
! simplify_gen_unary (NOT, mode, gen_binary (XOR, mode, op0, op1),
mode);
}
--- 5470,5477 ----
}
else if (num_negated == 1)
return
! simplify_gen_unary (NOT, mode,
! simplify_gen_binary (XOR, mode, op0, op1),
mode);
}
***************
*** 5517,5532 ****
if (GET_CODE (op0) == AND
&& rtx_equal_p (XEXP (op0, 1), op1)
&& ! side_effects_p (op1))
! return gen_binary (AND, mode,
! simplify_gen_unary (NOT, mode, XEXP (op0, 0), mode),
! op1);
else if (GET_CODE (op0) == AND
&& rtx_equal_p (XEXP (op0, 0), op1)
&& ! side_effects_p (op1))
! return gen_binary (AND, mode,
! simplify_gen_unary (NOT, mode, XEXP (op0, 1), mode),
! op1);
/* (xor (comparison foo bar) (const_int 1)) can become the reversed
comparison if STORE_FLAG_VALUE is 1. */
--- 5482,5499 ----
if (GET_CODE (op0) == AND
&& rtx_equal_p (XEXP (op0, 1), op1)
&& ! side_effects_p (op1))
! return simplify_gen_binary (AND, mode,
! simplify_gen_unary (NOT, mode,
! XEXP (op0, 0), mode),
! op1);
else if (GET_CODE (op0) == AND
&& rtx_equal_p (XEXP (op0, 0), op1)
&& ! side_effects_p (op1))
! return simplify_gen_binary (AND, mode,
! simplify_gen_unary (NOT, mode,
! XEXP (op0, 1), mode),
! op1);
/* (xor (comparison foo bar) (const_int 1)) can become the reversed
comparison if STORE_FLAG_VALUE is 1. */
***************
*** 5795,5801 ****
rtx inner;
rtx pos; /* Always counts from low bit. */
int len;
! rtx mask;
enum machine_mode compute_mode;
/* Loop until we find something we can't simplify. */
--- 5762,5768 ----
rtx inner;
rtx pos; /* Always counts from low bit. */
int len;
! rtx mask, cleared, masked;
enum machine_mode compute_mode;
/* Loop until we find something we can't simplify. */
***************
*** 5833,5842 ****
/* If position is ADJUST - X, new position is X. */
pos = XEXP (pos, 0);
else
! pos = gen_binary (MINUS, GET_MODE (pos),
! GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner))
! - len),
! pos);
}
}
--- 5800,5810 ----
/* If position is ADJUST - X, new position is X. */
pos = XEXP (pos, 0);
else
! pos = simplify_gen_binary (MINUS, GET_MODE (pos),
! GEN_INT (GET_MODE_BITSIZE (
! GET_MODE (inner))
! - len),
! pos);
}
}
***************
*** 5883,5912 ****
}
/* Compute a mask of LEN bits, if we can do this on the host machine. */
! if (len < HOST_BITS_PER_WIDE_INT)
! mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1);
! else
break;
/* Now compute the equivalent expression. Make a copy of INNER
for the SET_DEST in case it is a MEM into which we will substitute;
we don't want shared RTL in that case. */
! x = gen_rtx_SET
! (VOIDmode, copy_rtx (inner),
! gen_binary (IOR, compute_mode,
! gen_binary (AND, compute_mode,
! simplify_gen_unary (NOT, compute_mode,
! gen_binary (ASHIFT,
! compute_mode,
! mask, pos),
! compute_mode),
! inner),
! gen_binary (ASHIFT, compute_mode,
! gen_binary (AND, compute_mode,
! gen_lowpart
! (compute_mode, SET_SRC (x)),
! mask),
! pos)));
}
return x;
--- 5851,5880 ----
}
/* Compute a mask of LEN bits, if we can do this on the host machine. */
! if (len >= HOST_BITS_PER_WIDE_INT)
break;
/* Now compute the equivalent expression. Make a copy of INNER
for the SET_DEST in case it is a MEM into which we will substitute;
we don't want shared RTL in that case. */
! mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1);
! cleared = simplify_gen_binary (AND, compute_mode,
! simplify_gen_unary (NOT, compute_mode,
! simplify_gen_binary (ASHIFT,
! compute_mode,
! mask, pos),
! compute_mode),
! inner);
! masked = simplify_gen_binary (ASHIFT, compute_mode,
! simplify_gen_binary (
! AND, compute_mode,
! gen_lowpart (compute_mode, SET_SRC (x)),
! mask),
! pos);
!
! x = gen_rtx_SET (VOIDmode, copy_rtx (inner),
! simplify_gen_binary (IOR, compute_mode,
! cleared, masked));
}
return x;
***************
*** 6362,6369 ****
if (GET_CODE (XEXP (x, 1)) == CONST_INT
&& (INTVAL (XEXP (x, 1)) & ((((HOST_WIDE_INT) 1 << count)) - 1)) == 0
&& (tem = extract_left_shift (XEXP (x, 0), count)) != 0)
! return gen_binary (code, mode, tem,
! GEN_INT (INTVAL (XEXP (x, 1)) >> count));
break;
--- 6330,6337 ----
if (GET_CODE (XEXP (x, 1)) == CONST_INT
&& (INTVAL (XEXP (x, 1)) & ((((HOST_WIDE_INT) 1 << count)) - 1)) == 0
&& (tem = extract_left_shift (XEXP (x, 0), count)) != 0)
! return simplify_gen_binary (code, mode, tem,
! GEN_INT (INTVAL (XEXP (x, 1)) >> count));
break;
***************
*** 6854,6860 ****
&& (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
cval |= (HOST_WIDE_INT) -1 << width;
! y = gen_binary (AND, GET_MODE (x), XEXP (x, 0), GEN_INT (cval));
if (rtx_cost (y, SET) < rtx_cost (x, SET))
x = y;
}
--- 6822,6829 ----
&& (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
cval |= (HOST_WIDE_INT) -1 << width;
! y = simplify_gen_binary (AND, GET_MODE (x),
! XEXP (x, 0), GEN_INT (cval));
if (rtx_cost (y, SET) < rtx_cost (x, SET))
x = y;
}
***************
*** 6946,6955 ****
{
temp = GEN_INT ((INTVAL (XEXP (x, 1)) & mask)
<< INTVAL (XEXP (XEXP (x, 0), 1)));
! temp = gen_binary (GET_CODE (x), GET_MODE (x),
! XEXP (XEXP (x, 0), 0), temp);
! x = gen_binary (LSHIFTRT, GET_MODE (x), temp,
! XEXP (XEXP (x, 0), 1));
return force_to_mode (x, mode, mask, reg, next_select);
}
--- 6915,6924 ----
{
temp = GEN_INT ((INTVAL (XEXP (x, 1)) & mask)
<< INTVAL (XEXP (XEXP (x, 0), 1)));
! temp = simplify_gen_binary (GET_CODE (x), GET_MODE (x),
! XEXP (XEXP (x, 0), 0), temp);
! x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), temp,
! XEXP (XEXP (x, 0), 1));
return force_to_mode (x, mode, mask, reg, next_select);
}
***************
*** 6965,6971 ****
reg, next_select));
if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
! x = gen_binary (code, op_mode, op0, op1);
break;
case ASHIFT:
--- 6934,6940 ----
reg, next_select));
if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
! x = simplify_gen_binary (code, op_mode, op0, op1);
break;
case ASHIFT:
***************
*** 6999,7005 ****
mask, reg, next_select));
if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
! x = gen_binary (code, op_mode, op0, XEXP (x, 1));
break;
case LSHIFTRT:
--- 6968,6974 ----
mask, reg, next_select));
if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
! x = simplify_gen_binary (code, op_mode, op0, XEXP (x, 1));
break;
case LSHIFTRT:
***************
*** 7027,7033 ****
inner = force_to_mode (inner, op_mode, inner_mask, reg, next_select);
if (GET_MODE (x) != op_mode || inner != XEXP (x, 0))
! x = gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
}
/* If we have (and (lshiftrt FOO C1) C2) where the combination of the
--- 6996,7002 ----
inner = force_to_mode (inner, op_mode, inner_mask, reg, next_select);
if (GET_MODE (x) != op_mode || inner != XEXP (x, 0))
! x = simplify_gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
}
/* If we have (and (lshiftrt FOO C1) C2) where the combination of the
***************
*** 7049,7057 ****
/* Must be more sign bit copies than the mask needs. */
&& ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
>= exact_log2 (mask + 1)))
! x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
! GEN_INT (GET_MODE_BITSIZE (GET_MODE (x))
! - exact_log2 (mask + 1)));
goto shiftrt;
--- 7018,7026 ----
/* Must be more sign bit copies than the mask needs. */
&& ((int) num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
>= exact_log2 (mask + 1)))
! x = simplify_gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
! GEN_INT (GET_MODE_BITSIZE (GET_MODE (x))
! - exact_log2 (mask + 1)));
goto shiftrt;
***************
*** 7116,7122 ****
/* If MASK is 1, convert this to an LSHIFTRT. This can be done
even if the shift count isn't a constant. */
if (mask == 1)
! x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0), XEXP (x, 1));
shiftrt:
--- 7085,7092 ----
/* If MASK is 1, convert this to an LSHIFTRT. This can be done
even if the shift count isn't a constant. */
if (mask == 1)
! x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
! XEXP (x, 0), XEXP (x, 1));
shiftrt:
***************
*** 7181,7188 ****
{
temp = gen_int_mode (mask << INTVAL (XEXP (XEXP (x, 0), 1)),
GET_MODE (x));
! temp = gen_binary (XOR, GET_MODE (x), XEXP (XEXP (x, 0), 0), temp);
! x = gen_binary (LSHIFTRT, GET_MODE (x), temp, XEXP (XEXP (x, 0), 1));
return force_to_mode (x, mode, mask, reg, next_select);
}
--- 7151,7160 ----
{
temp = gen_int_mode (mask << INTVAL (XEXP (XEXP (x, 0), 1)),
GET_MODE (x));
! temp = simplify_gen_binary (XOR, GET_MODE (x),
! XEXP (XEXP (x, 0), 0), temp);
! x = simplify_gen_binary (LSHIFTRT, GET_MODE (x),
! temp, XEXP (XEXP (x, 0), 1));
return force_to_mode (x, mode, mask, reg, next_select);
}
***************
*** 7292,7299 ****
else if (cond1 == 0)
true1 = copy_rtx (true1);
! *ptrue = gen_binary (code, mode, true0, true1);
! *pfalse = gen_binary (code, mode, false0, false1);
return cond0 ? cond0 : cond1;
}
--- 7264,7282 ----
else if (cond1 == 0)
true1 = copy_rtx (true1);
! if (COMPARISON_P (x))
! {
! *ptrue = simplify_gen_relational (code, mode, VOIDmode,
! true0, true1);
! *pfalse = simplify_gen_relational (code, mode, VOIDmode,
! false0, false1);
! }
! else
! {
! *ptrue = simplify_gen_binary (code, mode, true0, true1);
! *pfalse = simplify_gen_binary (code, mode, false0, false1);
! }
!
return cond0 ? cond0 : cond1;
}
***************
*** 7323,7335 ****
&& rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
&& ! side_effects_p (x))
{
! *ptrue = gen_binary (MULT, mode, op0, const_true_rtx);
! *pfalse = gen_binary (MULT, mode,
! (code == MINUS
! ? simplify_gen_unary (NEG, mode, op1,
! mode)
! : op1),
! const_true_rtx);
return cond0;
}
}
--- 7306,7318 ----
&& rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
&& ! side_effects_p (x))
{
! *ptrue = simplify_gen_binary (MULT, mode, op0, const_true_rtx);
! *pfalse = simplify_gen_binary (MULT, mode,
! (code == MINUS
! ? simplify_gen_unary (NEG, mode,
! op1, mode)
! : op1),
! const_true_rtx);
return cond0;
}
}
***************
*** 7833,7840 ****
|| GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD)
return x;
! tem = gen_binary (code, GET_MODE (SUBREG_REG (lhs)),
! SUBREG_REG (lhs), SUBREG_REG (rhs));
return gen_lowpart (GET_MODE (x), tem);
default:
--- 7816,7823 ----
|| GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD)
return x;
! tem = simplify_gen_binary (code, GET_MODE (SUBREG_REG (lhs)),
! SUBREG_REG (lhs), SUBREG_REG (rhs));
return gen_lowpart (GET_MODE (x), tem);
default:
***************
*** 7860,7866 ****
return x;
/* Form the new inner operation, seeing if it simplifies first. */
! tem = gen_binary (code, GET_MODE (x), lhs, rhs);
/* There is one exception to the general way of distributing:
(a | c) ^ (b | c) -> (a ^ b) & ~c */
--- 7843,7849 ----
return x;
/* Form the new inner operation, seeing if it simplifies first. */
! tem = simplify_gen_binary (code, GET_MODE (x), lhs, rhs);
/* There is one exception to the general way of distributing:
(a | c) ^ (b | c) -> (a ^ b) & ~c */
***************
*** 7873,7880 ****
/* We may be able to continuing distributing the result, so call
ourselves recursively on the inner operation before forming the
outer operation, which we return. */
! return gen_binary (inner_code, GET_MODE (x),
! apply_distributive_law (tem), other);
}
\f
/* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
--- 7856,7942 ----
/* We may be able to continuing distributing the result, so call
ourselves recursively on the inner operation before forming the
outer operation, which we return. */
! return simplify_gen_binary (inner_code, GET_MODE (x),
! apply_distributive_law (tem), other);
! }
!
! /* See if X is of the form (* (+ a b) c), and if so convert to
! (+ (* a c) (* b c)) and try to simplify.
!
! Most of the time, this results in no change. However, if some of
! the operands are the same or inverses of each other, simplifications
! will result.
!
! For example, (and (ior A B) (not B)) can occur as the result of
! expanding a bit field assignment. When we apply the distributive
! law to this, we get (ior (and (A (not B))) (and (B (not B)))),
! which then simplifies to (and (A (not B))).
!
! Note that no checks happen on the validity of applying the inverse
! distributive law. This is pointless since we can do it in the
! few places where this routine is called. */
! static rtx
! distribute_and_simplify_rtx (rtx x)
! {
! enum machine_mode mode;
! enum rtx_code outer, inner;
! rtx op0, op1, inner_op0, inner_op1, new_op0, new_op1;
!
! mode = GET_MODE (x);
! outer = GET_CODE (x);
! op0 = XEXP (x, 0);
! op1 = XEXP (x, 1);
! if (ARITHMETIC_P (op0))
! {
! inner = GET_CODE (op0);
! inner_op0 = XEXP (op0, 0);
! inner_op1 = XEXP (op0, 1);
!
! /* (and (xor B C) (not A)) == (xor (ior A B) (ior A C)) */
! if (outer == AND && inner == XOR && GET_CODE (op1) == NOT)
! {
! new_op0 = simplify_gen_binary (IOR, mode, inner_op0, XEXP (op1, 0));
! new_op1 = simplify_gen_binary (IOR, mode, inner_op1, XEXP (op1, 0));
! x = apply_distributive_law (simplify_gen_binary (XOR, mode,
! new_op0, new_op1));
! }
! else
! {
! new_op0 = simplify_gen_binary (outer, mode, inner_op0, op1);
! new_op1 = simplify_gen_binary (outer, mode, inner_op1, op1);
! x = apply_distributive_law (simplify_gen_binary (inner, mode,
! new_op0, new_op1));
! }
! if (GET_CODE (x) != outer)
! return x;
! }
!
! if (ARITHMETIC_P (op1))
! {
! inner = GET_CODE (op1);
! inner_op0 = XEXP (op1, 0);
! inner_op1 = XEXP (op1, 1);
!
! /* (and (not A) (xor B C)) == (xor (ior A B) (ior A C)) */
! if (outer == AND && inner == XOR && GET_CODE (op0) == NOT)
! {
! new_op0 = simplify_gen_binary (IOR, mode, inner_op0, XEXP (op0, 0));
! new_op1 = simplify_gen_binary (IOR, mode, inner_op1, XEXP (op0, 0));
! x = apply_distributive_law (simplify_gen_binary (XOR, mode,
! new_op0, new_op1));
! }
! else
! {
! new_op0 = simplify_gen_binary (outer, mode, op0, inner_op0);
! new_op1 = simplify_gen_binary (outer, mode, op0, inner_op1);
! x = apply_distributive_law (simplify_gen_binary (inner, mode,
! new_op0, new_op1));
! }
! if (GET_CODE (x) != outer)
! return x;
! }
!
! return NULL_RTX;
}
\f
/* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
***************
*** 7941,7951 ****
gen_lowpart
(mode,
apply_distributive_law
! (gen_binary (GET_CODE (varop), GET_MODE (varop),
! simplify_and_const_int (NULL_RTX, GET_MODE (varop),
! XEXP (varop, 0), constop),
! simplify_and_const_int (NULL_RTX, GET_MODE (varop),
! XEXP (varop, 1), constop))));
/* If VAROP is PLUS, and the constant is a mask of low bite, distribute
the AND and see if one of the operands simplifies to zero. If so, we
--- 8003,8017 ----
gen_lowpart
(mode,
apply_distributive_law
! (simplify_gen_binary (GET_CODE (varop), GET_MODE (varop),
! simplify_and_const_int (NULL_RTX,
! GET_MODE (varop),
! XEXP (varop, 0),
! constop),
! simplify_and_const_int (NULL_RTX,
! GET_MODE (varop),
! XEXP (varop, 1),
! constop))));
/* If VAROP is PLUS, and the constant is a mask of low bite, distribute
the AND and see if one of the operands simplifies to zero. If so, we
***************
*** 7986,7992 ****
constop = trunc_int_for_mode (constop, mode);
/* See how much, if any, of X we can use. */
if (x == 0 || GET_CODE (x) != AND || GET_MODE (x) != mode)
! x = gen_binary (AND, mode, varop, GEN_INT (constop));
else
{
--- 8052,8058 ----
constop = trunc_int_for_mode (constop, mode);
/* See how much, if any, of X we can use. */
if (x == 0 || GET_CODE (x) != AND || GET_MODE (x) != mode)
! x = simplify_gen_binary (AND, mode, varop, GEN_INT (constop));
else
{
***************
*** 8505,8512 ****
&& exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
{
varop
! = gen_binary (ASHIFT, GET_MODE (varop), XEXP (varop, 0),
! GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));
continue;
}
break;
--- 8571,8580 ----
&& exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
{
varop
! = simplify_gen_binary (ASHIFT, GET_MODE (varop),
! XEXP (varop, 0),
! GEN_INT (exact_log2 (
! INTVAL (XEXP (varop, 1)))));
continue;
}
break;
***************
*** 8517,8524 ****
&& exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
{
varop
! = gen_binary (LSHIFTRT, GET_MODE (varop), XEXP (varop, 0),
! GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));
continue;
}
break;
--- 8585,8594 ----
&& exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
{
varop
! = simplify_gen_binary (LSHIFTRT, GET_MODE (varop),
! XEXP (varop, 0),
! GEN_INT (exact_log2 (
! INTVAL (XEXP (varop, 1)))));
continue;
}
break;
***************
*** 8773,8779 ****
rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode,
XEXP (varop, 1), count);
! varop = gen_binary (GET_CODE (varop), shift_mode, lhs, rhs);
varop = apply_distributive_law (varop);
count = 0;
--- 8843,8850 ----
rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode,
XEXP (varop, 1), count);
! varop = simplify_gen_binary (GET_CODE (varop), shift_mode,
! lhs, rhs);
varop = apply_distributive_law (varop);
count = 0;
***************
*** 9028,9034 ****
else if (GET_RTX_CLASS (outer_op) == RTX_UNARY)
x = simplify_gen_unary (outer_op, result_mode, x, result_mode);
else
! x = gen_binary (outer_op, result_mode, x, GEN_INT (outer_const));
}
return x;
--- 9099,9106 ----
else if (GET_RTX_CLASS (outer_op) == RTX_UNARY)
x = simplify_gen_unary (outer_op, result_mode, x, result_mode);
else
! x = simplify_gen_binary (outer_op, result_mode, x,
! GEN_INT (outer_const));
}
return x;
***************
*** 9261,9323 ****
}
}
\f
- /* These routines make binary and unary operations by first seeing if they
- fold; if not, a new expression is allocated. */
-
- static rtx
- gen_binary (enum rtx_code code, enum machine_mode mode, rtx op0, rtx op1)
- {
- rtx result;
- rtx tem;
-
- if (GET_CODE (op0) == CLOBBER)
- return op0;
- else if (GET_CODE (op1) == CLOBBER)
- return op1;
-
- if (GET_RTX_CLASS (code) == RTX_COMM_ARITH
- && swap_commutative_operands_p (op0, op1))
- tem = op0, op0 = op1, op1 = tem;
-
- if (GET_RTX_CLASS (code) == RTX_COMPARE
- || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
- {
- enum machine_mode op_mode = GET_MODE (op0);
-
- /* Strip the COMPARE from (REL_OP (compare X Y) 0) to get
- just (REL_OP X Y). */
- if (GET_CODE (op0) == COMPARE && op1 == const0_rtx)
- {
- op1 = XEXP (op0, 1);
- op0 = XEXP (op0, 0);
- op_mode = GET_MODE (op0);
- }
-
- if (op_mode == VOIDmode)
- op_mode = GET_MODE (op1);
- result = simplify_relational_operation (code, mode, op_mode, op0, op1);
- }
- else
- result = simplify_binary_operation (code, mode, op0, op1);
-
- if (result)
- return result;
-
- /* Put complex operands first and constants second. */
- if (GET_RTX_CLASS (code) == RTX_COMM_ARITH
- && swap_commutative_operands_p (op0, op1))
- return gen_rtx_fmt_ee (code, mode, op1, op0);
-
- /* If we are turning off bits already known off in OP0, we need not do
- an AND. */
- else if (code == AND && GET_CODE (op1) == CONST_INT
- && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
- && (nonzero_bits (op0, mode) & ~INTVAL (op1)) == 0)
- return op0;
-
- return gen_rtx_fmt_ee (code, mode, op0, op1);
- }
- \f
/* Simplify a comparison between *POP0 and *POP1 where CODE is the
comparison code that will be tested.
--- 9333,9338 ----
***************
*** 10152,10160 ****
&& c1 != mask
&& c1 != GET_MODE_MASK (tmode))
{
! op0 = gen_binary (AND, tmode,
! SUBREG_REG (XEXP (op0, 0)),
! gen_int_mode (c1, tmode));
op0 = gen_lowpart (mode, op0);
continue;
}
--- 10167,10175 ----
&& c1 != mask
&& c1 != GET_MODE_MASK (tmode))
{
! op0 = simplify_gen_binary (AND, tmode,
! SUBREG_REG (XEXP (op0, 0)),
! gen_int_mode (c1, tmode));
op0 = gen_lowpart (mode, op0);
continue;
}
***************
*** 10298,10309 ****
{
rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
rtx add_const = XEXP (XEXP (op0, 0), 1);
! rtx new_const = gen_binary (ASHIFTRT, GET_MODE (op0), add_const,
! XEXP (op0, 1));
! op0 = gen_binary (PLUS, tmode,
! gen_lowpart (tmode, inner),
! new_const);
continue;
}
--- 10313,10324 ----
{
rtx inner = XEXP (XEXP (XEXP (op0, 0), 0), 0);
rtx add_const = XEXP (XEXP (op0, 0), 1);
! rtx new_const = simplify_gen_binary (ASHIFTRT, GET_MODE (op0),
! add_const, XEXP (op0, 1));
! op0 = simplify_gen_binary (PLUS, tmode,
! gen_lowpart (tmode, inner),
! new_const);
continue;
}
***************
*** 10456,10466 ****
make a new AND in the proper mode. */
if (GET_CODE (op0) == AND
&& !have_insn_for (AND, mode))
! op0 = gen_binary (AND, tmode,
! gen_lowpart (tmode,
! XEXP (op0, 0)),
! gen_lowpart (tmode,
! XEXP (op0, 1)));
op0 = gen_lowpart (tmode, op0);
if (zero_extended && GET_CODE (op1) == CONST_INT)
--- 10471,10481 ----
make a new AND in the proper mode. */
if (GET_CODE (op0) == AND
&& !have_insn_for (AND, mode))
! op0 = simplify_gen_binary (AND, tmode,
! gen_lowpart (tmode,
! XEXP (op0, 0)),
! gen_lowpart (tmode,
! XEXP (op0, 1)));
op0 = gen_lowpart (tmode, op0);
if (zero_extended && GET_CODE (op1) == CONST_INT)
***************
*** 10475,10484 ****
if (op1 == const0_rtx && (code == LT || code == GE)
&& GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
{
! op0 = gen_binary (AND, tmode,
! gen_lowpart (tmode, op0),
! GEN_INT ((HOST_WIDE_INT) 1
! << (GET_MODE_BITSIZE (mode) - 1)));
code = (code == LT) ? NE : EQ;
break;
}
--- 10490,10500 ----
if (op1 == const0_rtx && (code == LT || code == GE)
&& GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
{
! op0 = simplify_gen_binary (AND, tmode,
! gen_lowpart (tmode, op0),
! GEN_INT ((HOST_WIDE_INT) 1
! << (GET_MODE_BITSIZE (mode)
! - 1)));
code = (code == LT) ? NE : EQ;
break;
}
***************
*** 10525,10531 ****
if (reversed_code == UNKNOWN)
return NULL_RTX;
else
! return gen_binary (reversed_code, mode, op0, op1);
}
\f
/* Utility function for following routine. Called when X is part of a value
--- 10541,10547 ----
if (reversed_code == UNKNOWN)
return NULL_RTX;
else
! return simplify_gen_relational (reversed_code, mode, VOIDmode, op0, op1);
}
\f
/* Utility function for following routine. Called when X is part of a value
next prev parent reply other threads:[~2004-06-09 7:21 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-06-08 16:42 Paolo Bonzini
2004-06-08 21:13 ` Roger Sayle
2004-06-08 21:51 ` Eric Botcazou
2004-06-09 9:21 ` Paolo Bonzini [this message]
2004-06-09 9:36 ` Paolo Bonzini
2004-06-10 7:17 ` Eric Botcazou
2004-06-10 8:16 ` Paolo Bonzini
2004-06-10 11:16 ` Eric Botcazou
2004-06-10 12:34 ` Eric Botcazou
2004-06-10 12:48 ` Paolo Bonzini
2004-06-10 23:30 ` Eric Botcazou
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=40C6BAF5.6020201@gnu.org \
--to=bonzini@gnu.org \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).