aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2025-08-04 22:02:42 +1000
committerRichard Henderson <richard.henderson@linaro.org>2025-08-11 23:25:08 +0000
commitd91b9432f3d7a1458888e2705dc5c700ed4fe25d (patch)
tree227efecda99680c795b21f7513de12ff098c9832 /gcc
parentaa14b355ca790a331a3488d22b764fead31c2583 (diff)
downloadgcc-d91b9432f3d7a1458888e2705dc5c700ed4fe25d.zip
gcc-d91b9432f3d7a1458888e2705dc5c700ed4fe25d.tar.gz
gcc-d91b9432f3d7a1458888e2705dc5c700ed4fe25d.tar.bz2
aarch64: Use aarch64_gen_compare_zero_and_branch in aarch64_restore_za
With -mtrack-speculation, the pattern that was directly expanded by aarch64_restore_za is disabled. Use the helper function instead. gcc: * config/aarch64/aarch64.cc (aarch64_gen_compare_zero_and_branch): Export. * config/aarch64/aarch64-protos.h (aarch64_gen_compare_zero_and_branch): Declare it. * config/aarch64/aarch64-sme.md (aarch64_restore_za): Use it. * config/aarch64/aarch64.md (*aarch64_cbz<EQL><GPI>): Unexport.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/aarch64/aarch64-protos.h3
-rw-r--r--gcc/config/aarch64/aarch64-sme.md3
-rw-r--r--gcc/config/aarch64/aarch64.cc2
-rw-r--r--gcc/config/aarch64/aarch64.md2
4 files changed, 7 insertions, 3 deletions
diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h
index 36bd885..7b9b16b 100644
--- a/gcc/config/aarch64/aarch64-protos.h
+++ b/gcc/config/aarch64/aarch64-protos.h
@@ -1281,4 +1281,7 @@ extern bool aarch64_gcs_enabled ();
extern unsigned aarch64_data_alignment (const_tree exp, unsigned align);
extern unsigned aarch64_stack_alignment (const_tree exp, unsigned align);
+extern rtx aarch64_gen_compare_zero_and_branch (rtx_code code, rtx x,
+ rtx_code_label *label);
+
#endif /* GCC_AARCH64_PROTOS_H */
diff --git a/gcc/config/aarch64/aarch64-sme.md b/gcc/config/aarch64/aarch64-sme.md
index 6b1a747..0123ea0 100644
--- a/gcc/config/aarch64/aarch64-sme.md
+++ b/gcc/config/aarch64/aarch64-sme.md
@@ -400,7 +400,8 @@
auto label = gen_label_rtx ();
auto tpidr2 = gen_rtx_REG (DImode, R16_REGNUM);
emit_insn (gen_aarch64_read_tpidr2 (tpidr2));
- auto jump = emit_likely_jump_insn (gen_aarch64_cbznedi1 (tpidr2, label));
+ auto pat = aarch64_gen_compare_zero_and_branch (NE, tpidr2, label);
+ auto jump = emit_likely_jump_insn (pat);
JUMP_LABEL (jump) = label;
aarch64_restore_za (operands[0]);
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index 123aa10..cb38870 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -2885,7 +2885,7 @@ aarch64_gen_compare_reg_maybe_ze (RTX_CODE code, rtx x, rtx y,
/* Generate conditional branch to LABEL, comparing X to 0 using CODE.
Return the jump instruction. */
-static rtx
+rtx
aarch64_gen_compare_zero_and_branch (rtx_code code, rtx x,
rtx_code_label *label)
{
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index 2d86a02..3da5bc2 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -804,7 +804,7 @@
)
;; For an EQ/NE comparison against zero, emit `CBZ`/`CBNZ`
-(define_insn "aarch64_cbz<optab><mode>1"
+(define_insn "*aarch64_cbz<optab><mode>"
[(set (pc) (if_then_else (EQL (match_operand:GPI 0 "register_operand" "r")
(const_int 0))
(label_ref (match_operand 1))