rs6000.c (rs6000_rtx_costs): Improve DIV/MOD.
authorDale Johannesen <dalej@apple.com>
Fri, 20 Aug 2004 19:07:10 +0000 (19:07 +0000)
committerDale Johannesen <dalej@gcc.gnu.org>
Fri, 20 Aug 2004 19:07:10 +0000 (19:07 +0000)
2004-08-20  Dale Johannesen  <dalej@apple.com>

        * config/rs6000/rs6000.c (rs6000_rtx_costs): Improve DIV/MOD.

From-SVN: r86334

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index cd2748451c78a053d835416c398f1bc068986fd9..5a4c7c50c6baf37084bdefa9a28cf8b9a846ee4b 100644 (file)
@@ -1,3 +1,7 @@
+2004-08-20  Dale Johannesen  <dalej@apple.com>
+
+        * config/rs6000/rs6000.c (rs6000_rtx_costs): Improve DIV/MOD.
+
 2004-08-20  Daniel Jacobowitz  <dan@debian.org>
 
        * regrename.c (kill_value_one_regno): Renamed from kill_value_regno.
index f9792ecdadcb120a3f1070f85e958438b9bf96ed..3d788442a271e312eb0fab24aba1b2e62ed68a93 100644 (file)
@@ -17064,6 +17064,9 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED,
          || ((outer_code == IOR || outer_code == XOR)
              && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
                  || CONST_OK_FOR_LETTER_P (INTVAL (x), 'L')))
+         || ((outer_code == DIV || outer_code == UDIV
+              || outer_code == MOD || outer_code == UMOD)
+             && exact_log2 (INTVAL (x)) >= 0)
          || (outer_code == AND
              && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
                  || CONST_OK_FOR_LETTER_P (INTVAL (x), 'L')
@@ -17232,20 +17235,30 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED,
                                  : rs6000_cost->sdiv;
          return false;
        }
-      if (GET_CODE (XEXP (x, 1)) == CONST_INT
-         && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
-       {
-         *total = COSTS_N_INSNS (2);
-         return false;
-       }
       /* FALLTHRU */
 
     case UDIV:
     case UMOD:
-      if (GET_MODE (XEXP (x, 1)) == DImode)
-       *total = rs6000_cost->divdi;
-      else
-       *total = rs6000_cost->divsi;
+      if (GET_CODE (XEXP (x, 1)) == CONST_INT
+         && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
+       {
+         if (code == DIV || code == MOD)
+           /* Shift, addze */
+           *total = COSTS_N_INSNS (2);
+         else
+           /* Shift */
+           *total = COSTS_N_INSNS (1);
+       }
+      else 
+       {
+         if (GET_MODE (XEXP (x, 1)) == DImode)
+           *total = rs6000_cost->divdi;
+         else
+           *total = rs6000_cost->divsi;
+       }
+      /* Add in shift and subtract for MOD. */
+      if (code == MOD || code == UMOD)
+       *total += COSTS_N_INSNS (2);
       return false;
 
     case FFS: