aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2025-08-05 20:58:36 +0000
committerRichard Henderson <richard.henderson@linaro.org>2025-08-11 23:25:08 +0000
commitaa14b355ca790a331a3488d22b764fead31c2583 (patch)
treef5473fec576d8bc16690187d11c3884dbd246b3c /gcc
parentdd9f0d402b327a2f29f9bff7ce22cd5caa617e61 (diff)
downloadgcc-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.cc55
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)