With the addition of CSSC (Common Short Sequence Compression) instructions, a number of idioms match to single instructions (e.g., abs) that previously expanded to multi-instruction sequences.
This recognizes (some of) those idioms that are now misclassified and returns a cost of a single instruction. gcc/ChangeLog: * config/aarch64/aarch64.cc (aarch64_rtx_costs): Support idioms matching to CSSC instructions, if target CSSC is present Signed-off-by: Philipp Tomsich <philipp.toms...@vrull.eu> --- gcc/config/aarch64/aarch64.cc | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index 800a8b0e110..d89c94519e9 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -14431,10 +14431,17 @@ aarch64_rtx_costs (rtx x, machine_mode mode, int outer ATTRIBUTE_UNUSED, return false; case CTZ: - *cost = COSTS_N_INSNS (2); + if (!TARGET_CSSC) + { + /* Will be split to a bit-reversal + clz */ + *cost = COSTS_N_INSNS (2); + + if (speed) + *cost += extra_cost->alu.clz + extra_cost->alu.rev; + } + else + *cost = COSTS_N_INSNS (1); - if (speed) - *cost += extra_cost->alu.clz + extra_cost->alu.rev; return false; case COMPARE: @@ -15373,12 +15380,17 @@ cost_plus: } else { - /* Integer ABS will either be split to - two arithmetic instructions, or will be an ABS - (scalar), which we don't model. */ - *cost = COSTS_N_INSNS (2); - if (speed) - *cost += 2 * extra_cost->alu.arith; + if (!TARGET_CSSC) + { + /* Integer ABS will either be split to + two arithmetic instructions, or will be an ABS + (scalar), which we don't model. */ + *cost = COSTS_N_INSNS (2); + if (speed) + *cost += 2 * extra_cost->alu.arith; + } + else + *cost = COSTS_N_INSNS (1); } return false; @@ -15388,13 +15400,15 @@ cost_plus: { if (VECTOR_MODE_P (mode)) *cost += extra_cost->vect.alu; - else + else if (GET_MODE_CLASS (mode) == MODE_FLOAT) { /* FMAXNM/FMINNM/FMAX/FMIN. TODO: This may not be accurate for all implementations, but we do not model this in the cost tables. */ *cost += extra_cost->fp[mode == DFmode].addsub; } + else if (TARGET_CSSC) + *cost = COSTS_N_INSNS (1); } return false; -- 2.34.1