Patchwork [3/3] i386: Correct costs on CONST_DOUBLE and CONST_VECTOR

login
register
mail settings
Submitter Richard Henderson
Date June 27, 2012, 3:20 a.m.
Message ID <1340767258-21086-3-git-send-email-rth@redhat.com>
Download mbox | patch
Permalink /patch/167493/
State New
Headers show

Comments

Richard Henderson - June 27, 2012, 3:20 a.m.
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,
---
 gcc/ChangeLog          |    6 ++++++
 gcc/config/i386/i386.c |   48 +++++++++++++++++++++++++++++++-----------------
 2 files changed, 37 insertions(+), 17 deletions(-)

Patch

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index b96fc6e..edfc649 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -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)