@@ -67,6 +67,57 @@ defm AMOCAS_D_RV64 : AMO_cas_aq_rl<0b00101, 0b011, "amocas.d", GPR>;
67
67
defm AMOCAS_Q : AMO_cas_aq_rl<0b00101, 0b100, "amocas.q", GPRPairRV64>;
68
68
} // Predicates = [HasStdExtZacas, IsRV64]
69
69
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
+
70
121
//===----------------------------------------------------------------------===//
71
122
// Zawrs (Wait-on-Reservation-Set)
72
123
//===----------------------------------------------------------------------===//
0 commit comments