re PR target/16800 (PowerPC - Unnecessary rldicl)
authorDavid Edelsohn <edelsohn@gnu.org>
Sat, 27 Nov 2004 23:00:57 +0000 (23:00 +0000)
committerDavid Edelsohn <dje@gcc.gnu.org>
Sat, 27 Nov 2004 23:00:57 +0000 (18:00 -0500)
        PR target/16800
        * config/rs6000/rs6000.c (rs6000_rtx_costs): Improve accuracy of
        EQ, GTU, and LTU costs.  Add costs for GT, LT, and UNORDERED.
        Distinguish between SImode and DImode CONST_INT.

From-SVN: r91399

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

index 6def113843baa8d9cf422292bd041937ef217598..cc56027bc397f1b3544739d6d4bde0aa7dbffbd9 100644 (file)
@@ -1,3 +1,10 @@
+2004-11-28  David Edelsohn  <edelsohn@gnu.org>
+
+       PR target/16800
+       * config/rs6000/rs6000.c (rs6000_rtx_costs): Improve accuracy of
+       EQ, GTU, and LTU costs.  Add costs for GT, LT, and UNORDERED.
+       Distinguish between SImode and DImode CONST_INT.
+
 2004-11-28  Andreas Fischer <a_fisch@gmx.de>
            Alan Modra  <amodra@bigpond.net.au>
 
index ca919b35a0f21d35f7bcf5a32d90604cfb1ec127..ab80a47bdf21a5d104d237f6fef7af640eb6a8cf 100644 (file)
@@ -18050,16 +18050,15 @@ rs6000_rtx_costs (rtx x, int code, int outer_code, int *total)
            || outer_code == MINUS)
           && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'I')
               || CONST_OK_FOR_LETTER_P (INTVAL (x), 'L')))
-         || ((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')
+                 || (CONST_OK_FOR_LETTER_P (INTVAL (x),
+                                            mode == SImode ? 'L' : 'J'))
                  || mask_operand (x, VOIDmode)))
+         || ((outer_code == IOR || outer_code == XOR)
+             && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
+                 || (CONST_OK_FOR_LETTER_P (INTVAL (x),
+                                            mode == SImode ? 'L' : 'J'))))
          || outer_code == ASHIFT
          || outer_code == ASHIFTRT
          || outer_code == LSHIFTRT
@@ -18068,9 +18067,21 @@ rs6000_rtx_costs (rtx x, int code, int outer_code, int *total)
          || outer_code == ZERO_EXTRACT
          || (outer_code == MULT
              && CONST_OK_FOR_LETTER_P (INTVAL (x), 'I'))
+         || ((outer_code == DIV || outer_code == UDIV
+              || outer_code == MOD || outer_code == UMOD)
+             && exact_log2 (INTVAL (x)) >= 0)
          || (outer_code == COMPARE
              && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'I')
-                 || CONST_OK_FOR_LETTER_P (INTVAL (x), 'K'))))
+                 || CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')))
+         || (outer_code == EQ
+             && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'I')
+                 || CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
+                 || (CONST_OK_FOR_LETTER_P (INTVAL (x),
+                                            mode == SImode ? 'L' : 'J'))))
+         || (outer_code == GTU
+             && CONST_OK_FOR_LETTER_P (INTVAL (x), 'I'))
+         || (outer_code == LTU
+             && CONST_OK_FOR_LETTER_P (INTVAL (x), 'P')))
        {
          *total = 0;
          return true;
@@ -18348,26 +18359,44 @@ rs6000_rtx_costs (rtx x, int code, int outer_code, int *total)
     case EQ:
     case GTU:
     case LTU:
-      if (mode == Pmode)
+      /* Carry bit requires mode == Pmode.
+        NEG or PLUS already counted so only add one.  */
+      if (mode == Pmode
+         && (outer_code == NEG || outer_code == PLUS))
        {
-         switch (outer_code)
+         *total = COSTS_N_INSNS (1);
+         return true;
+       }
+      if (outer_code == SET)
+       {
+         if (XEXP (x, 1) == const0_rtx)
            {
-           case PLUS:
-           case NEG:
-             /* PLUS or NEG already counted so only add one more.  */
-             *total = COSTS_N_INSNS (1);
-             break;
-           case SET:
-             *total = COSTS_N_INSNS (3);
-             break;
-           case COMPARE:
-             *total = 0;
+             *total = COSTS_N_INSNS (2);
              return true;
-           default:
-             break;
            }
-         return false;
+         else if (mode == Pmode)
+           {
+             *total = COSTS_N_INSNS (3);
+             return false;
+           }
+       }
+      /* FALLTHRU */
+
+    case GT:
+    case LT:
+    case UNORDERED:
+      if (outer_code == SET && (XEXP (x, 1) == const0_rtx))
+       {
+         *total = COSTS_N_INSNS (2);
+         return true;
        }
+      /* CC COMPARE.  */
+      if (outer_code == COMPARE)
+       {
+         *total = 0;
+         return true;
+       }
+      break;
 
     default:
       break;