summaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2012-06-27 03:20:08 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2012-06-27 03:20:08 +0000
commit981d19b48e07fbe1d6ecca3bbaf7bf52a1039459 (patch)
treea9c63a4b7197e02e38966e6ba619cc7ec2083e7c /gcc/config
parent5cd92c37ca1226fc68392c128585d59818767d4e (diff)
downloadgcc-981d19b48e07fbe1d6ecca3bbaf7bf52a1039459.tar.gz
i386: Correct costs on CONST_DOUBLE and CONST_VECTOR
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, git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@189007 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/i386/i386.c48
1 files changed, 31 insertions, 17 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index b96fc6e5371..edfc6498d73 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)