@@ -67,6 +67,57 @@ defm AMOCAS_D_RV64 : AMO_cas_aq_rl<0b00101, 0b011, "amocas.d", GPR>;
6767defm 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