From 78520f3ff1f922bb86bdaa6188b3168e68fbb908 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Fri, 20 May 2016 19:44:29 +0200 Subject: [PATCH] i386.c (ix86_rtx_costs): Use IS_STACK_MODE when calculating cost of standard 80387 constants. * gcc/config/i386/i386.c (ix86_rtx_costs) : Use IS_STACK_MODE when calculating cost of standard 80387 constants. Fallthru to CONST_VECTOR case to calculate cost of standard SSE constants. : Calculate cost of (MEM (SYMBOL_REF)). (ix86_legitimate_constant_p): Use CASE_CONST_SCALAR_INT and CASE_CONST_ANY. From-SVN: r236524 --- gcc/ChangeLog | 10 ++++++ gcc/config/i386/i386.c | 69 ++++++++++++++++++++---------------------- 2 files changed, 43 insertions(+), 36 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 69d61eefc9d..07dceaabe92 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2016-05-20 Uros Bizjak + + * gcc/config/i386/i386.c (ix86_rtx_costs) : + Use IS_STACK_MODE when calculating cost of standard 80387 constants. + Fallthru to CONST_VECTOR case to calculate cost of standard SSE + constants. + : Calculate cost of (MEM (SYMBOL_REF)). + (ix86_legitimate_constant_p): Use CASE_CONST_SCALAR_INT + and CASE_CONST_ANY. + 2016-05-20 Cesar Philippidis * config/nvptx/nvptx.md (sincossf3): New pattern. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index af434ecd57e..54483168fed 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -14867,8 +14867,7 @@ ix86_legitimate_constant_p (machine_mode mode, rtx x) #endif break; - case CONST_INT: - case CONST_WIDE_INT: + CASE_CONST_SCALAR_INT: switch (mode) { case TImode: @@ -14903,18 +14902,16 @@ ix86_legitimate_constant_p (machine_mode mode, rtx x) static bool ix86_cannot_force_const_mem (machine_mode mode, rtx x) { - /* We can always put integral constants and vectors in memory. */ + /* We can put any immediate constant in memory. */ switch (GET_CODE (x)) { - case CONST_INT: - case CONST_WIDE_INT: - case CONST_DOUBLE: - case CONST_VECTOR: + CASE_CONST_ANY: return false; default: break; } + return !ix86_legitimate_constant_p (mode, x); } @@ -44076,43 +44073,43 @@ ix86_rtx_costs (rtx x, machine_mode mode, int outer_code_i, int opno, *total = 0; return true; - case CONST_WIDE_INT: - *total = 0; - return true; - case CONST_DOUBLE: - switch (standard_80387_constant_p (x)) + if (TARGET_80387 && IS_STACK_MODE (mode)) + switch (standard_80387_constant_p (x)) + { + case -1: + case 0: + break; + case 1: /* 0.0 */ + *total = 1; + return true; + default: /* Other constants */ + *total = 2; + return true; + } + /* FALLTHRU */ + + case CONST_VECTOR: + switch (standard_sse_constant_p (x, mode)) { - case 1: /* 0.0 */ - *total = 1; - return true; - default: /* Other constants */ - *total = 2; - return true; case 0: - case -1: break; + case 1: /* 0: xor eliminates false dependency */ + *total = 0; + return true; + default: /* -1: cmp contains false dependency */ + *total = 1; + return true; } - if (SSE_FLOAT_MODE_P (mode)) - { - case CONST_VECTOR: - switch (standard_sse_constant_p (x, mode)) - { - case 0: - break; - case 1: /* 0: xor eliminates false dependency */ - *total = 0; - return true; - default: /* -1: cmp contains false dependency */ - *total = 1; - return true; - } - } + /* FALLTHRU */ + + case CONST_WIDE_INT: /* 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) - + (mode == SFmode ? 0 : mode == DFmode ? 1 : 2)); + + (!TARGET_64BIT && flag_pic) + + (GET_MODE_SIZE (mode) <= 4 + ? 0 : GET_MODE_SIZE (mode) <= 8 ? 1 : 2)); return true; case ZERO_EXTEND: -- 2.30.2