@@ -277,6 +277,21 @@ class PseudoMaskedAMOUMinUMax
277277 let hasSideEffects = 0;
278278}
279279
280+ // Ordering constants must be kept in sync with the AtomicOrdering enum in
281+ // AtomicOrdering.h.
282+ multiclass PseudoAMOPat<string AtomicOp, Pseudo AMOInst, ValueType vt = XLenVT> {
283+ def : Pat<(vt (!cast<PatFrag>(AtomicOp#"_monotonic") GPR:$addr, GPR:$incr)),
284+ (AMOInst GPR:$addr, GPR:$incr, 2)>;
285+ def : Pat<(vt (!cast<PatFrag>(AtomicOp#"_acquire") GPR:$addr, GPR:$incr)),
286+ (AMOInst GPR:$addr, GPR:$incr, 4)>;
287+ def : Pat<(vt (!cast<PatFrag>(AtomicOp#"_release") GPR:$addr, GPR:$incr)),
288+ (AMOInst GPR:$addr, GPR:$incr, 5)>;
289+ def : Pat<(vt (!cast<PatFrag>(AtomicOp#"_acq_rel") GPR:$addr, GPR:$incr)),
290+ (AMOInst GPR:$addr, GPR:$incr, 6)>;
291+ def : Pat<(vt (!cast<PatFrag>(AtomicOp#"_seq_cst") GPR:$addr, GPR:$incr)),
292+ (AMOInst GPR:$addr, GPR:$incr, 7)>;
293+ }
294+
280295class PseudoMaskedAMOPat<Intrinsic intrin, Pseudo AMOInst>
281296 : Pat<(intrin GPR:$addr, GPR:$incr, GPR:$mask, timm:$ordering),
282297 (AMOInst GPR:$addr, GPR:$incr, GPR:$mask, timm:$ordering)>;
@@ -291,18 +306,7 @@ let Predicates = [HasStdExtA] in {
291306
292307let Size = 20 in
293308def PseudoAtomicLoadNand32 : PseudoAMO;
294- // Ordering constants must be kept in sync with the AtomicOrdering enum in
295- // AtomicOrdering.h.
296- def : Pat<(XLenVT (atomic_load_nand_i32_monotonic GPR:$addr, GPR:$incr)),
297- (PseudoAtomicLoadNand32 GPR:$addr, GPR:$incr, 2)>;
298- def : Pat<(XLenVT (atomic_load_nand_i32_acquire GPR:$addr, GPR:$incr)),
299- (PseudoAtomicLoadNand32 GPR:$addr, GPR:$incr, 4)>;
300- def : Pat<(XLenVT (atomic_load_nand_i32_release GPR:$addr, GPR:$incr)),
301- (PseudoAtomicLoadNand32 GPR:$addr, GPR:$incr, 5)>;
302- def : Pat<(XLenVT (atomic_load_nand_i32_acq_rel GPR:$addr, GPR:$incr)),
303- (PseudoAtomicLoadNand32 GPR:$addr, GPR:$incr, 6)>;
304- def : Pat<(XLenVT (atomic_load_nand_i32_seq_cst GPR:$addr, GPR:$incr)),
305- (PseudoAtomicLoadNand32 GPR:$addr, GPR:$incr, 7)>;
309+ defm : PseudoAMOPat<"atomic_load_nand_i32", PseudoAtomicLoadNand32>;
306310
307311let Size = 28 in {
308312 def PseudoMaskedAtomicSwap32 : PseudoMaskedAMO;
@@ -345,18 +349,7 @@ let Predicates = [HasStdExtA, IsRV64] in {
345349
346350let Size = 20 in
347351def PseudoAtomicLoadNand64 : PseudoAMO;
348- // Ordering constants must be kept in sync with the AtomicOrdering enum in
349- // AtomicOrdering.h.
350- def : Pat<(i64 (atomic_load_nand_i64_monotonic GPR:$addr, GPR:$incr)),
351- (PseudoAtomicLoadNand64 GPR:$addr, GPR:$incr, 2)>;
352- def : Pat<(i64 (atomic_load_nand_i64_acquire GPR:$addr, GPR:$incr)),
353- (PseudoAtomicLoadNand64 GPR:$addr, GPR:$incr, 4)>;
354- def : Pat<(i64 (atomic_load_nand_i64_release GPR:$addr, GPR:$incr)),
355- (PseudoAtomicLoadNand64 GPR:$addr, GPR:$incr, 5)>;
356- def : Pat<(i64 (atomic_load_nand_i64_acq_rel GPR:$addr, GPR:$incr)),
357- (PseudoAtomicLoadNand64 GPR:$addr, GPR:$incr, 6)>;
358- def : Pat<(i64 (atomic_load_nand_i64_seq_cst GPR:$addr, GPR:$incr)),
359- (PseudoAtomicLoadNand64 GPR:$addr, GPR:$incr, 7)>;
352+ defm : PseudoAMOPat<"atomic_load_nand_i64", PseudoAtomicLoadNand64, i64>;
360353
361354def : PseudoMaskedAMOPat<int_riscv_masked_atomicrmw_xchg_i64,
362355 PseudoMaskedAtomicSwap32>;
0 commit comments