mips.c (mips_canonicalize_comparison): Check mips_relational_operand_ok_p before trying to rewrite the test.

gcc/
	* config/mips/mips.c (mips_canonicalize_comparison):  Check
	mips_relational_operand_ok_p before trying to rewrite the test.
	Only calculate PLUS_ONE if needed.
	(mips_emit_int_relational): Don't call mips_relational_operand_ok_p
	here.

From-SVN: r129483
This commit is contained in:
Richard Sandiford 2007-10-19 09:17:17 +00:00 committed by Richard Sandiford
parent b87bc4e835
commit 213ce6f2c0
2 changed files with 40 additions and 38 deletions

View File

@ -1,3 +1,11 @@
2007-10-19 Richard Sandiford <rsandifo@nildram.co.uk>
* config/mips/mips.c (mips_canonicalize_comparison): Check
mips_relational_operand_ok_p before trying to rewrite the test.
Only calculate PLUS_ONE if needed.
(mips_emit_int_relational): Don't call mips_relational_operand_ok_p
here.
2007-10-19 Richard Sandiford <rsandifo@nildram.co.uk>
* config/mips/mips.c (mips16e_build_save_restore): Fix *OFFSET_PTR

View File

@ -3678,40 +3678,38 @@ static bool
mips_canonicalize_comparison (enum rtx_code *code, rtx *cmp1,
enum machine_mode mode)
{
HOST_WIDE_INT original, plus_one;
HOST_WIDE_INT plus_one;
if (GET_CODE (*cmp1) != CONST_INT)
return false;
if (mips_relational_operand_ok_p (*code, *cmp1))
return true;
original = INTVAL (*cmp1);
plus_one = trunc_int_for_mode ((unsigned HOST_WIDE_INT) original + 1, mode);
if (GET_CODE (*cmp1) == CONST_INT)
switch (*code)
{
case LE:
plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
if (INTVAL (*cmp1) < plus_one)
{
*code = LT;
*cmp1 = force_reg (mode, GEN_INT (plus_one));
return true;
}
break;
switch (*code)
{
case LE:
if (original < plus_one)
{
*code = LT;
*cmp1 = force_reg (mode, GEN_INT (plus_one));
return true;
}
break;
case LEU:
if (plus_one != 0)
{
*code = LTU;
*cmp1 = force_reg (mode, GEN_INT (plus_one));
return true;
}
break;
default:
return false;
}
case LEU:
plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
if (plus_one != 0)
{
*code = LTU;
*cmp1 = force_reg (mode, GEN_INT (plus_one));
return true;
}
break;
default:
break;
}
return false;
}
/* Compare CMP0 and CMP1 using relational operator CODE and store the
@ -3723,19 +3721,15 @@ static void
mips_emit_int_relational (enum rtx_code code, bool *invert_ptr,
rtx target, rtx cmp0, rtx cmp1)
{
/* First see if there is a MIPS instruction that can do this operation
with CMP1 in its current form. If not, try to canonicalize the
comparison to LT. If that fails, try doing the same for the
inverse operation. If that also fails, force CMP1 into a register
and try again. */
if (mips_relational_operand_ok_p (code, cmp1))
mips_emit_binary (code, target, cmp0, cmp1);
else if (mips_canonicalize_comparison (&code, &cmp1, GET_MODE (target)))
/* First see if there is a MIPS instruction that can do this operation.
If not, try doing the same for the inverse operation. If that also
fails, force CMP1 into a register and try again. */
if (mips_canonicalize_comparison (&code, &cmp1, GET_MODE (target)))
mips_emit_binary (code, target, cmp0, cmp1);
else
{
enum rtx_code inv_code = reverse_condition (code);
if (!mips_relational_operand_ok_p (inv_code, cmp1))
if (!mips_canonicalize_comparison (&inv_code, &cmp1, GET_MODE (target)))
{
cmp1 = force_reg (GET_MODE (cmp0), cmp1);
mips_emit_int_relational (code, invert_ptr, target, cmp0, cmp1);