diff options
author | James Greenhalgh <james.greenhalgh@arm.com> | 2014-05-16 09:03:19 +0000 |
---|---|---|
committer | James Greenhalgh <jgreenhalgh@gcc.gnu.org> | 2014-05-16 09:03:19 +0000 |
commit | ba0cfa1700ccede16632595e36f783e24cb65e1a (patch) | |
tree | 8ad9e1dd69424fcfccdd21f460bdc53468639ae2 /gcc | |
parent | b1685e6274a141a05050c9734b974732a5019f4a (diff) | |
download | gcc-ba0cfa1700ccede16632595e36f783e24cb65e1a.zip gcc-ba0cfa1700ccede16632595e36f783e24cb65e1a.tar.gz gcc-ba0cfa1700ccede16632595e36f783e24cb65e1a.tar.bz2 |
[AArch64 costs 11/18] Improve costs for rotate and shift operations.
* config/aarch64/aarch64.c (aarch64_rtx_costs): Improve costs for
rotates and shifts.
Co-Authored-By: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
From-SVN: r210503
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/aarch64/aarch64.c | 56 |
2 files changed, 53 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 38a66e7..a31e4a3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,12 @@ 2014-05-16 James Greenhalgh <james.greenhalgh@arm.com> Philipp Tomsich <philipp.tomsich@theobroma-systems.com> + * config/aarch64/aarch64.c (aarch64_rtx_costs): Improve costs for + rotates and shifts. + +2014-05-16 James Greenhalgh <james.greenhalgh@arm.com> + Philipp Tomsich <philipp.tomsich@theobroma-systems.com> + * config/aarch64/aarch64.c (aarch64_rtx_costs): Cost ZERO_EXTEND and SIGN_EXTEND better. diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 76ef7ce..34084a9 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -5339,21 +5339,59 @@ cost_minus: *cost += extra_cost->alu.extend; return false; + case ASHIFT: + op0 = XEXP (x, 0); + op1 = XEXP (x, 1); + + if (CONST_INT_P (op1)) + { + /* LSL (immediate), UBMF, UBFIZ and friends. These are all + aliases. */ + if (speed) + *cost += extra_cost->alu.shift; + + /* We can incorporate zero/sign extend for free. */ + if (GET_CODE (op0) == ZERO_EXTEND + || GET_CODE (op0) == SIGN_EXTEND) + op0 = XEXP (op0, 0); + + *cost += rtx_cost (op0, ASHIFT, 0, speed); + return true; + } + else + { + /* LSLV. */ + if (speed) + *cost += extra_cost->alu.shift_reg; + + return false; /* All arguments need to be in registers. */ + } + case ROTATE: - if (!CONST_INT_P (XEXP (x, 1))) - *cost += COSTS_N_INSNS (2); - /* Fall through. */ case ROTATERT: case LSHIFTRT: - case ASHIFT: case ASHIFTRT: + op0 = XEXP (x, 0); + op1 = XEXP (x, 1); - /* Shifting by a register often takes an extra cycle. */ - if (speed && !CONST_INT_P (XEXP (x, 1))) - *cost += extra_cost->alu.arith_shift_reg; + if (CONST_INT_P (op1)) + { + /* ASR (immediate) and friends. */ + if (speed) + *cost += extra_cost->alu.shift; - *cost += rtx_cost (XEXP (x, 0), ASHIFT, 0, speed); - return true; + *cost += rtx_cost (op0, (enum rtx_code) code, 0, speed); + return true; + } + else + { + + /* ASR (register) and friends. */ + if (speed) + *cost += extra_cost->alu.shift_reg; + + return false; /* All arguments need to be in registers. */ + } case HIGH: if (!CONSTANT_P (XEXP (x, 0))) |