Commit d4c5ac1f by Alan Modra Committed by Alan Modra

combine.c (simplify_comparison): When widening modes, ignore sign extension on CONST_INTs.

	* combine.c (simplify_comparison): When widening modes, ignore
	sign extension on CONST_INTs.

From-SVN: r51216
parent 84bf8c2c
2002-03-23 Alan Modra <amodra@bigpond.net.au>
* combine.c (simplify_comparison): When widening modes, ignore
sign extension on CONST_INTs.
2002-03-22 Bob Wilson <bob.wilson@acm.org>
* config/xtensa/xtensa.c (print_operand): Fix incorrect mode
......
......@@ -10975,14 +10975,22 @@ simplify_comparison (code, pop0, pop1)
tmode = GET_MODE_WIDER_MODE (tmode))
if (have_insn_for (COMPARE, tmode))
{
int zero_extended;
/* If the only nonzero bits in OP0 and OP1 are those in the
narrower mode and this is an equality or unsigned comparison,
we can use the wider mode. Similarly for sign-extended
values, in which case it is true for all comparisons. */
if (((code == EQ || code == NE
|| code == GEU || code == GTU || code == LEU || code == LTU)
&& (nonzero_bits (op0, tmode) & ~GET_MODE_MASK (mode)) == 0
&& (nonzero_bits (op1, tmode) & ~GET_MODE_MASK (mode)) == 0)
zero_extended = ((code == EQ || code == NE
|| code == GEU || code == GTU
|| code == LEU || code == LTU)
&& (nonzero_bits (op0, tmode)
& ~GET_MODE_MASK (mode)) == 0
&& ((GET_CODE (op1) == CONST_INT
|| (nonzero_bits (op1, tmode)
& ~GET_MODE_MASK (mode)) == 0)));
if (zero_extended
|| ((num_sign_bit_copies (op0, tmode)
> GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode))
&& (num_sign_bit_copies (op1, tmode)
......@@ -10999,6 +11007,8 @@ simplify_comparison (code, pop0, pop1)
XEXP (op0, 1)));
op0 = gen_lowpart_for_combine (tmode, op0);
if (zero_extended && GET_CODE (op1) == CONST_INT)
op1 = GEN_INT (INTVAL (op1) & GET_MODE_MASK (mode));
op1 = gen_lowpart_for_combine (tmode, op1);
break;
}
......
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