Commit 213ce6f2 by Richard Sandiford Committed by Richard Sandiford

mips.c (mips_canonicalize_comparison): Check mips_relational_operand_ok_p before…

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
parent b87bc4e8
2007-10-19 Richard Sandiford <rsandifo@nildram.co.uk> 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 * config/mips/mips.c (mips16e_build_save_restore): Fix *OFFSET_PTR
calculation. calculation.
...@@ -3678,40 +3678,38 @@ static bool ...@@ -3678,40 +3678,38 @@ static bool
mips_canonicalize_comparison (enum rtx_code *code, rtx *cmp1, mips_canonicalize_comparison (enum rtx_code *code, rtx *cmp1,
enum machine_mode mode) enum machine_mode mode)
{ {
HOST_WIDE_INT original, plus_one; HOST_WIDE_INT plus_one;
if (GET_CODE (*cmp1) != CONST_INT) if (mips_relational_operand_ok_p (*code, *cmp1))
return false; return true;
original = INTVAL (*cmp1);
plus_one = trunc_int_for_mode ((unsigned HOST_WIDE_INT) original + 1, mode);
switch (*code)
{
case LE:
if (original < plus_one)
{
*code = LT;
*cmp1 = force_reg (mode, GEN_INT (plus_one));
return true;
}
break;
case LEU: if (GET_CODE (*cmp1) == CONST_INT)
if (plus_one != 0) switch (*code)
{ {
*code = LTU; case LE:
*cmp1 = force_reg (mode, GEN_INT (plus_one)); plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
return true; if (INTVAL (*cmp1) < plus_one)
} {
break; *code = LT;
*cmp1 = force_reg (mode, GEN_INT (plus_one));
return true;
}
break;
default: case LEU:
return false; 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; return false;
} }
/* Compare CMP0 and CMP1 using relational operator CODE and store the /* Compare CMP0 and CMP1 using relational operator CODE and store the
...@@ -3723,19 +3721,15 @@ static void ...@@ -3723,19 +3721,15 @@ static void
mips_emit_int_relational (enum rtx_code code, bool *invert_ptr, mips_emit_int_relational (enum rtx_code code, bool *invert_ptr,
rtx target, rtx cmp0, rtx cmp1) rtx target, rtx cmp0, rtx cmp1)
{ {
/* First see if there is a MIPS instruction that can do this operation /* 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 If not, try doing the same for the inverse operation. If that also
comparison to LT. If that fails, try doing the same for the fails, force CMP1 into a register and try again. */
inverse operation. If that also fails, force CMP1 into a register if (mips_canonicalize_comparison (&code, &cmp1, GET_MODE (target)))
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)))
mips_emit_binary (code, target, cmp0, cmp1); mips_emit_binary (code, target, cmp0, cmp1);
else else
{ {
enum rtx_code inv_code = reverse_condition (code); 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); cmp1 = force_reg (GET_MODE (cmp0), cmp1);
mips_emit_int_relational (code, invert_ptr, target, cmp0, cmp1); mips_emit_int_relational (code, invert_ptr, target, cmp0, cmp1);
......
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