combine.c (combine_simplify_rtx): Use gen_unary to distribute the NOT for De Morgan's rule.
* combine.c (combine_simplify_rtx): Use gen_unary to distribute the NOT for De Morgan's rule. * simplify-rtx.c (simplify_unary_operation): Simplify a BImode NOT of a comparison to the reverse comparison. From-SVN: r36506
This commit is contained in:
parent
b4927ead98
commit
5bd60ce6de
3 changed files with 27 additions and 15 deletions
|
@ -1,5 +1,10 @@
|
|||
2000-09-18 Richard Henderson <rth@cygnus.com>
|
||||
|
||||
* combine.c (combine_simplify_rtx): Use gen_unary to distribute
|
||||
the NOT for De Morgan's rule.
|
||||
* simplify-rtx.c (simplify_unary_operation): Simplify a BImode NOT
|
||||
of a comparison to the reverse comparison.
|
||||
|
||||
* combine.c (try_combine): Allow split to create a single insn.
|
||||
|
||||
* machmode.def: Add BImode. Add a column for bitsize.
|
||||
|
|
|
@ -3933,21 +3933,17 @@ combine_simplify_rtx (x, op0_mode, last, in_dest)
|
|||
if (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == AND)
|
||||
{
|
||||
rtx in1 = XEXP (XEXP (x, 0), 0), in2 = XEXP (XEXP (x, 0), 1);
|
||||
enum machine_mode op_mode;
|
||||
|
||||
if (GET_CODE (in1) == NOT)
|
||||
in1 = XEXP (in1, 0);
|
||||
else
|
||||
in1 = gen_rtx_combine (NOT, GET_MODE (in1), in1);
|
||||
op_mode = GET_MODE (in1);
|
||||
in1 = gen_unary (NOT, op_mode, op_mode, in1);
|
||||
|
||||
if (GET_CODE (in2) == NOT)
|
||||
in2 = XEXP (in2, 0);
|
||||
else if (GET_CODE (in2) == CONST_INT
|
||||
&& GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
|
||||
in2 = GEN_INT (GET_MODE_MASK (mode) & ~INTVAL (in2));
|
||||
else
|
||||
in2 = gen_rtx_combine (NOT, GET_MODE (in2), in2);
|
||||
op_mode = GET_MODE (in2);
|
||||
if (op_mode == VOIDmode)
|
||||
op_mode = mode;
|
||||
in2 = gen_unary (NOT, op_mode, op_mode, in2);
|
||||
|
||||
if (GET_CODE (in2) == NOT)
|
||||
if (GET_CODE (in2) == NOT && GET_CODE (in1) != NOT)
|
||||
{
|
||||
rtx tem = in2;
|
||||
in2 = in1; in1 = tem;
|
||||
|
|
|
@ -583,10 +583,21 @@ simplify_unary_operation (code, mode, op, op_mode)
|
|||
aren't constant. */
|
||||
switch (code)
|
||||
{
|
||||
case NEG:
|
||||
case NOT:
|
||||
/* (not (not X)) == X, similarly for NEG. */
|
||||
if (GET_CODE (op) == code)
|
||||
/* (not (not X)) == X. */
|
||||
if (GET_CODE (op) == NOT)
|
||||
return XEXP (op, 0);
|
||||
|
||||
/* (not (eq X Y)) == (ne X Y), etc. */
|
||||
if (mode == BImode && GET_RTX_CLASS (GET_CODE (op)) == '<'
|
||||
&& can_reverse_comparison_p (op, NULL_RTX))
|
||||
return gen_rtx_fmt_ee (reverse_condition (GET_CODE (op)),
|
||||
op_mode, XEXP (op, 0), XEXP (op, 1));
|
||||
break;
|
||||
|
||||
case NEG:
|
||||
/* (neg (neg X)) == X. */
|
||||
if (GET_CODE (op) == NEG)
|
||||
return XEXP (op, 0);
|
||||
break;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue