diff options
author | Richard Henderson <richard.henderson@linaro.org> | 2025-08-05 20:58:36 +0000 |
---|---|---|
committer | Richard Henderson <richard.henderson@linaro.org> | 2025-08-11 23:25:08 +0000 |
commit | aa14b355ca790a331a3488d22b764fead31c2583 (patch) | |
tree | f5473fec576d8bc16690187d11c3884dbd246b3c /gcc | |
parent | dd9f0d402b327a2f29f9bff7ce22cd5caa617e61 (diff) | |
download | gcc-aa14b355ca790a331a3488d22b764fead31c2583.zip gcc-aa14b355ca790a331a3488d22b764fead31c2583.tar.gz gcc-aa14b355ca790a331a3488d22b764fead31c2583.tar.bz2 |
aarch64: Reorg aarch64_if_the_else_costs, conditional branch
gcc:
* config/aarch64/aarch64.cc (aarch64_if_the_else_costs): Reorg to
include the cost of inner within TBZ sign-bit test, only match
CBZ/CBNZ with valid modes, and both for the aarch64_imm24 test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/aarch64/aarch64.cc | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index 50b3004..123aa10 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -14380,39 +14380,48 @@ aarch64_if_then_else_costs (rtx op0, rtx op1, rtx op2, int *cost, bool speed) if (GET_CODE (op1) == PC || GET_CODE (op2) == PC) { /* Conditional branch. */ - if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_CC) + enum machine_mode cmpmode = GET_MODE (inner); + if (GET_MODE_CLASS (cmpmode) == MODE_CC) return true; - if (cmpcode == NE || cmpcode == EQ) + if (comparator == const0_rtx) { - if (comparator == const0_rtx) + switch (cmpcode) { - /* TBZ/TBNZ/CBZ/CBNZ. */ + case NE: + case EQ: + if (cmpmode != SImode && cmpmode != DImode) + break; if (GET_CODE (inner) == ZERO_EXTRACT) - /* TBZ/TBNZ. */ - *cost += rtx_cost (XEXP (inner, 0), VOIDmode, - ZERO_EXTRACT, 0, speed); - else - /* CBZ/CBNZ. */ - *cost += rtx_cost (inner, VOIDmode, cmpcode, 0, speed); + { + /* TBZ/TBNZ. */ + *cost += rtx_cost (XEXP (inner, 0), VOIDmode, + ZERO_EXTRACT, 0, speed); + return true; + } + /* FALLTHRU */ + case LT: + case GE: + /* CBZ/CBNZ/TBZ/TBNZ. */ + *cost += rtx_cost (inner, cmpmode, cmpcode, 0, speed); return true; - } - if (register_operand (inner, VOIDmode) - && aarch64_imm24 (comparator, VOIDmode)) - { - /* SUB and SUBS. */ - *cost += COSTS_N_INSNS (2); - if (speed) - *cost += extra_cost->alu.arith * 2; - return true; + + default: + break; } } - else if (cmpcode == LT || cmpcode == GE) + + if ((cmpcode == NE || cmpcode == EQ) + && (cmpmode == SImode || cmpmode == DImode) + && aarch64_imm24 (comparator, cmpmode)) { - /* TBZ/TBNZ. */ - if (comparator == const0_rtx) - return true; + /* SUB and SUBS. */ + *cost += rtx_cost (inner, cmpmode, cmpcode, 0, speed); + *cost += COSTS_N_INSNS (2); + if (speed) + *cost += extra_cost->alu.arith * 2; + return true; } } else if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_CC) |