rs6000.c (rs6000_rtx_costs): Fix mask_operand and mask64_operand thinkos.
authorDavid Edelsohn <dje@gcc.gnu.org>
Thu, 5 Aug 2004 17:05:48 +0000 (13:05 -0400)
committerDavid Edelsohn <dje@gcc.gnu.org>
Thu, 5 Aug 2004 17:05:48 +0000 (13:05 -0400)
* config/rs6000/rs6000.c (rs6000_rtx_costs): Fix mask_operand
and mask64_operand thinkos.  Handle ZERO_EXTRACT.  Handle
SIGN_EXTEND / ZERO_EXTEND of MEM.  Handle rlwinm patterns.

From-SVN: r85604

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

index 32ef013b52fe48cb6a1c365eaf18e7a8825b6226..1794b807633e4da5d592ee8bf8da804039f3f791 100644 (file)
@@ -1,3 +1,9 @@
+2004-08-05  David Edelsohn  <edelsohn@gnu.org>
+
+       * config/rs6000/rs6000.c (rs6000_rtx_costs): Fix mask_operand
+       and mask64_operand thinkos.  Handle ZERO_EXTRACT.  Handle
+       SIGN_EXTEND / ZERO_EXTEND of MEM.  Handle rlwinm patterns.
+
 2004-08-05  Joseph S. Myers  <jsm@polyomino.org.uk>
 
        * config/linux.h, config/i386/linux.h, config/sparc/linux.h:
        * config/i386/xmmintrin.h: Include <mm_malloc.h>.
 
 2004-08-03  H.J. Lu  <hongjiu.lu@intel.com>
-           Tanguy FautrÃ\83  <tfautre@pandora.be>
+           Tanguy Fautrà <tfautre@pandora.be>
 
        * config/i386/pmm_malloc.h: New file.
 
index 035c02599c78af56ba4ca92edf9aaa88cb35044e..338ed8250315af323ef8ad980e19c08e80ddecd8 100644 (file)
@@ -16533,12 +16533,13 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED,
          || (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), 'T')))
+                 || mask_operand (x, VOIDmode)))
          || outer_code == ASHIFT
          || outer_code == ASHIFTRT
          || outer_code == LSHIFTRT
          || outer_code == ROTATE
          || outer_code == ROTATERT
+         || outer_code == ZERO_EXTRACT
          || (outer_code == MULT
              && CONST_OK_FOR_LETTER_P (INTVAL (x), 'I'))
          || (outer_code == COMPARE
@@ -16568,7 +16569,7 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED,
          && ((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), 'S')))
+                  || mask64_operand (x, DImode)))
              || ((outer_code == IOR || outer_code == XOR)
                  && CONST_DOUBLE_HIGH (x) == 0
                  && (CONST_DOUBLE_LOW (x)
@@ -16728,13 +16729,16 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED,
     case AND:
     case IOR:
     case XOR:
+    case ZERO_EXTRACT:
+      *total = COSTS_N_INSNS (1);
+      return false;
+
     case ASHIFT:
     case ASHIFTRT:
     case LSHIFTRT:
     case ROTATE:
     case ROTATERT:
-    case SIGN_EXTEND:
-    case ZERO_EXTEND:
+      /* Handle mul_highpart.  */
       if (outer_code == TRUNCATE
          && GET_CODE (XEXP (x, 0)) == MULT)
        {
@@ -16744,7 +16748,18 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED,
            *total = rs6000_cost->mulsi;
          return true;
        }
-      *total = COSTS_N_INSNS (1);
+      else if (outer_code == AND)
+       *total = 0;
+      else
+       *total = COSTS_N_INSNS (1);
+      return false;
+
+    case SIGN_EXTEND:
+    case ZERO_EXTEND:
+      if (GET_CODE (XEXP (x, 0)) == MEM)
+       *total = 0;
+      else
+       *total = COSTS_N_INSNS (1);
       return false;
 
     case COMPARE: