]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
mips.c (mips_canonicalize_comparison): Check mips_relational_operand_ok_p before...
authorRichard Sandiford <rsandifo@nildram.co.uk>
Fri, 19 Oct 2007 09:17:17 +0000 (09:17 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 19 Oct 2007 09:17:17 +0000 (09:17 +0000)
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

gcc/ChangeLog
gcc/config/mips/mips.c

index 26433bb6bac39febd9a19ddac301bb2b40908cd5..f7454c50c817eca2a1692154389f7f55683325e9 100644 (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
index 781388a2d7a62a701f3e00503605552bc225b492..8c45369ba7888b876dae2eed60bf3664d59cbeab 100644 (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;
-
-  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;
+  if (mips_relational_operand_ok_p (*code, *cmp1))
+    return true;
 
-    case LEU:
-      if (plus_one != 0)
-       {
-         *code = LTU;
-         *cmp1 = force_reg (mode, GEN_INT (plus_one));
-         return true;
-       }
-      break;
+  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;
 
-    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);