OSDN Git Service

2004-08-20 Dale Johannesen <dalej@apple.com>
authordalej <dalej@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Aug 2004 19:07:10 +0000 (19:07 +0000)
committerdalej <dalej@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Aug 2004 19:07:10 +0000 (19:07 +0000)
        * config/rs6000/rs6000.c (rs6000_rtx_costs): Improve DIV/MOD.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@86334 138bc75d-0d04-0410-961f-82ee72b054a4

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

index cd27484..5a4c7c5 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 f9792ec..3d78844 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: