i386: Correct costs on CONST_DOUBLE and CONST_VECTOR
authorRichard Henderson <rth@redhat.com>
Wed, 27 Jun 2012 03:20:08 +0000 (20:20 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 27 Jun 2012 03:20:08 +0000 (20:20 -0700)
We were always falling through to the memory default.
Also use standard_sse_constant_p on CONST_VECTOR.

        * config/i386/i386.c (ix86_rtx_costs): Use standard_sse_constant_p
        and don't fall thru from standard_80387_constant_p to the memory
        fallback,

From-SVN: r189007

gcc/ChangeLog
gcc/config/i386/i386.c

index 2eb52597665b66e4295ceeb0d0c10ff0fdb23a02..1d98b79c720c2b9230cbd44c2fdd6200e3d54af8 100644 (file)
@@ -1,3 +1,9 @@
+2012-06-26  Richard Henderson  <rth@redhat.com>
+
+       * config/i386/i386.c (ix86_rtx_costs): Use standard_sse_constant_p
+       and don't fall thru from standard_80387_constant_p to the memory
+       fallback,
+
 2012-06-26  Richard Henderson  <rth@redhat.com>
 
        * config/i386/i386.c (bdesc_args): Update.  Change
index b96fc6e5371e7ef19f2cd682f79842d18841ee80..edfc6498d73e3b01863839d24af6c64c782d3113 100644 (file)
@@ -32102,24 +32102,38 @@ ix86_rtx_costs (rtx x, int code_i, int outer_code_i, int opno, int *total,
 
     case CONST_DOUBLE:
       if (mode == VOIDmode)
-       *total = 0;
-      else
-       switch (standard_80387_constant_p (x))
-         {
-         case 1: /* 0.0 */
-           *total = 1;
-           break;
-         default: /* Other constants */
-           *total = 2;
-           break;
-         case 0:
-         case -1:
-           break;
-         }
-      /* FALLTHRU */
-
+       {
+         *total = 0;
+         return true;
+       }
+      switch (standard_80387_constant_p (x))
+       {
+       case 1: /* 0.0 */
+         *total = 1;
+         return true;
+       default: /* Other constants */
+         *total = 2;
+         return true;
+       case 0:
+       case -1:
+         break;
+       }
+      if (SSE_FLOAT_MODE_P (mode))
+       {
     case CONST_VECTOR:
-      /* Start with (MEM (SYMBOL_REF)), since that's where
+         switch (standard_sse_constant_p (x))
+           {
+           case 0:
+             break;
+           case 1:  /* 0: xor eliminates false dependency */
+             *total = 0;
+             return true;
+           default: /* -1: cmp contains false dependency */
+             *total = 1;
+             return true;
+           }
+       }
+      /* Fall back to (MEM (SYMBOL_REF)), since that's where
         it'll probably end up.  Add a penalty for size.  */
       *total = (COSTS_N_INSNS (1)
                + (flag_pic != 0 && !TARGET_64BIT)