Skip to content

Commit 0a1b066

Browse files
authored
[RISCV] Support isel for Zacas for XLen and i32. (#77666)
This adds new isel patterns for Zacas that take priority over the pseudoinstructions we use for the A extension. Support for 2x XLen types will come in a separate patch since they need to be done differently.
1 parent 2dde029 commit 0a1b066

File tree

5 files changed

+1977
-187
lines changed

5 files changed

+1977
-187
lines changed

llvm/lib/Target/RISCV/RISCVFeatures.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,7 @@ def FeatureStdExtZacas
736736
def HasStdExtZacas : Predicate<"Subtarget->hasStdExtZacas()">,
737737
AssemblerPredicate<(all_of FeatureStdExtZacas),
738738
"'Zacas' (Atomic Compare-And-Swap Instructions)">;
739+
def NoStdExtZacas : Predicate<"!Subtarget->hasStdExtZacas()">;
739740

740741
//===----------------------------------------------------------------------===//
741742
// Vendor extensions

llvm/lib/Target/RISCV/RISCVInstrInfoA.td

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -333,11 +333,17 @@ multiclass PseudoCmpXchgPat<string Op, Pseudo CmpXchgInst,
333333
(CmpXchgInst GPR:$addr, GPR:$cmp, GPR:$new, 7)>;
334334
}
335335

336-
let Predicates = [HasStdExtA] in {
337-
336+
let Predicates = [HasStdExtA, NoStdExtZacas] in {
338337
def PseudoCmpXchg32 : PseudoCmpXchg;
339338
defm : PseudoCmpXchgPat<"atomic_cmp_swap_32", PseudoCmpXchg32>;
339+
}
340+
341+
let Predicates = [HasStdExtA, NoStdExtZacas, IsRV64] in {
342+
def PseudoCmpXchg64 : PseudoCmpXchg;
343+
defm : PseudoCmpXchgPat<"atomic_cmp_swap_64", PseudoCmpXchg64, i64>;
344+
}
340345

346+
let Predicates = [HasStdExtA] in {
341347
def PseudoMaskedCmpXchg32
342348
: Pseudo<(outs GPR:$res, GPR:$scratch),
343349
(ins GPR:$addr, GPR:$cmpval, GPR:$newval, GPR:$mask,
@@ -356,10 +362,6 @@ def : Pat<(int_riscv_masked_cmpxchg_i32
356362
} // Predicates = [HasStdExtA]
357363

358364
let Predicates = [HasStdExtA, IsRV64] in {
359-
360-
def PseudoCmpXchg64 : PseudoCmpXchg;
361-
defm : PseudoCmpXchgPat<"atomic_cmp_swap_64", PseudoCmpXchg64, i64>;
362-
363365
def : Pat<(int_riscv_masked_cmpxchg_i64
364366
GPR:$addr, GPR:$cmpval, GPR:$newval, GPR:$mask, timm:$ordering),
365367
(PseudoMaskedCmpXchg32

llvm/lib/Target/RISCV/RISCVInstrInfoZa.td

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,57 @@ defm AMOCAS_D_RV64 : AMO_cas_aq_rl<0b00101, 0b011, "amocas.d", GPR>;
6767
defm AMOCAS_Q : AMO_cas_aq_rl<0b00101, 0b100, "amocas.q", GPRPairRV64>;
6868
} // Predicates = [HasStdExtZacas, IsRV64]
6969

70+
multiclass AMOCASPat<string AtomicOp, string BaseInst, ValueType vt = XLenVT,
71+
list<Predicate> ExtraPreds = []> {
72+
let Predicates = !listconcat([HasStdExtZacas, NotHasStdExtZtso], ExtraPreds) in {
73+
def : Pat<(!cast<PatFrag>(AtomicOp#"_monotonic") (vt GPR:$addr),
74+
(vt GPR:$cmp),
75+
(vt GPR:$new)),
76+
(!cast<RVInst>(BaseInst) GPR:$cmp, GPR:$addr, GPR:$new)>;
77+
def : Pat<(!cast<PatFrag>(AtomicOp#"_acquire") (vt GPR:$addr),
78+
(vt GPR:$cmp),
79+
(vt GPR:$new)),
80+
(!cast<RVInst>(BaseInst#"_AQ") GPR:$cmp, GPR:$addr, GPR:$new)>;
81+
def : Pat<(!cast<PatFrag>(AtomicOp#"_release") (vt GPR:$addr),
82+
(vt GPR:$cmp),
83+
(vt GPR:$new)),
84+
(!cast<RVInst>(BaseInst#"_RL") GPR:$cmp, GPR:$addr, GPR:$new)>;
85+
def : Pat<(!cast<PatFrag>(AtomicOp#"_acq_rel") (vt GPR:$addr),
86+
(vt GPR:$cmp),
87+
(vt GPR:$new)),
88+
(!cast<RVInst>(BaseInst#"_AQ_RL") GPR:$cmp, GPR:$addr, GPR:$new)>;
89+
def : Pat<(!cast<PatFrag>(AtomicOp#"_seq_cst") (vt GPR:$addr),
90+
(vt GPR:$cmp),
91+
(vt GPR:$new)),
92+
(!cast<RVInst>(BaseInst#"_AQ_RL") GPR:$cmp, GPR:$addr, GPR:$new)>;
93+
} // Predicates = !listconcat([HasStdExtZacas, NotHasStdExtZtso], ExtraPreds)
94+
let Predicates = !listconcat([HasStdExtZacas, HasStdExtZtso], ExtraPreds) in {
95+
def : Pat<(!cast<PatFrag>(AtomicOp#"_monotonic") (vt GPR:$addr),
96+
(vt GPR:$cmp),
97+
(vt GPR:$new)),
98+
(!cast<RVInst>(BaseInst) GPR:$cmp, GPR:$addr, GPR:$new)>;
99+
def : Pat<(!cast<PatFrag>(AtomicOp#"_acquire") (vt GPR:$addr),
100+
(vt GPR:$cmp),
101+
(vt GPR:$new)),
102+
(!cast<RVInst>(BaseInst) GPR:$cmp, GPR:$addr, GPR:$new)>;
103+
def : Pat<(!cast<PatFrag>(AtomicOp#"_release") (vt GPR:$addr),
104+
(vt GPR:$cmp),
105+
(vt GPR:$new)),
106+
(!cast<RVInst>(BaseInst) GPR:$cmp, GPR:$addr, GPR:$new)>;
107+
def : Pat<(!cast<PatFrag>(AtomicOp#"_acq_rel") (vt GPR:$addr),
108+
(vt GPR:$cmp),
109+
(vt GPR:$new)),
110+
(!cast<RVInst>(BaseInst) GPR:$cmp, GPR:$addr, GPR:$new)>;
111+
def : Pat<(!cast<PatFrag>(AtomicOp#"_seq_cst") (vt GPR:$addr),
112+
(vt GPR:$cmp),
113+
(vt GPR:$new)),
114+
(!cast<RVInst>(BaseInst) GPR:$cmp, GPR:$addr, GPR:$new)>;
115+
} // Predicates = !listconcat([HasStdExtZacas, HasStdExtZtso], ExtraPreds)
116+
}
117+
118+
defm : AMOCASPat<"atomic_cmp_swap_32", "AMOCAS_W">;
119+
defm : AMOCASPat<"atomic_cmp_swap_64", "AMOCAS_D_RV64", i64, [IsRV64]>;
120+
70121
//===----------------------------------------------------------------------===//
71122
// Zawrs (Wait-on-Reservation-Set)
72123
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)