diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-06-27 03:20:08 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-06-27 03:20:08 +0000 |
commit | 981d19b48e07fbe1d6ecca3bbaf7bf52a1039459 (patch) | |
tree | a9c63a4b7197e02e38966e6ba619cc7ec2083e7c /gcc/config | |
parent | 5cd92c37ca1226fc68392c128585d59818767d4e (diff) | |
download | gcc-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.c | 48 |
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) |