@@ -129,8 +129,9 @@ let Predicates = [HasAtomicLdSt, IsRV64] in {
129
129
130
130
/// AMOs
131
131
132
- multiclass AMOPat<string AtomicOp, string BaseInst, ValueType vt = XLenVT> {
133
- let Predicates = [HasStdExtA, NotHasStdExtZtso] in {
132
+ multiclass AMOPat<string AtomicOp, string BaseInst, ValueType vt = XLenVT,
133
+ list<Predicate> ExtraPreds = []> {
134
+ let Predicates = !listconcat([HasStdExtA, NotHasStdExtZtso], ExtraPreds) in {
134
135
def : PatGprGpr<!cast<PatFrag>(AtomicOp#"_monotonic"),
135
136
!cast<RVInst>(BaseInst), vt>;
136
137
def : PatGprGpr<!cast<PatFrag>(AtomicOp#"_acquire"),
@@ -142,7 +143,7 @@ let Predicates = [HasStdExtA, NotHasStdExtZtso] in {
142
143
def : PatGprGpr<!cast<PatFrag>(AtomicOp#"_seq_cst"),
143
144
!cast<RVInst>(BaseInst#"_AQ_RL"), vt>;
144
145
}
145
- let Predicates = [HasStdExtA, HasStdExtZtso] in {
146
+ let Predicates = !listconcat( [HasStdExtA, HasStdExtZtso], ExtraPreds) in {
146
147
def : PatGprGpr<!cast<PatFrag>(AtomicOp#"_monotonic"),
147
148
!cast<RVInst>(BaseInst), vt>;
148
149
def : PatGprGpr<!cast<PatFrag>(AtomicOp#"_acquire"),
@@ -156,8 +157,6 @@ let Predicates = [HasStdExtA, HasStdExtZtso] in {
156
157
}
157
158
}
158
159
159
- let Predicates = [HasStdExtA] in {
160
-
161
160
defm : AMOPat<"atomic_swap_32", "AMOSWAP_W">;
162
161
defm : AMOPat<"atomic_load_add_32", "AMOADD_W">;
163
162
defm : AMOPat<"atomic_load_and_32", "AMOAND_W">;
@@ -168,6 +167,8 @@ defm : AMOPat<"atomic_load_min_32", "AMOMIN_W">;
168
167
defm : AMOPat<"atomic_load_umax_32", "AMOMAXU_W">;
169
168
defm : AMOPat<"atomic_load_umin_32", "AMOMINU_W">;
170
169
170
+ let Predicates = [HasStdExtA] in {
171
+
171
172
/// Pseudo AMOs
172
173
173
174
class PseudoAMO : Pseudo<(outs GPR:$res, GPR:$scratch),
@@ -315,17 +316,17 @@ def : Pat<(int_riscv_masked_cmpxchg_i32
315
316
316
317
} // Predicates = [HasStdExtA]
317
318
318
- let Predicates = [HasStdExtA, IsRV64] in {
319
+ defm : AMOPat<"atomic_swap_64", "AMOSWAP_D", i64, [IsRV64]>;
320
+ defm : AMOPat<"atomic_load_add_64", "AMOADD_D", i64, [IsRV64]>;
321
+ defm : AMOPat<"atomic_load_and_64", "AMOAND_D", i64, [IsRV64]>;
322
+ defm : AMOPat<"atomic_load_or_64", "AMOOR_D", i64, [IsRV64]>;
323
+ defm : AMOPat<"atomic_load_xor_64", "AMOXOR_D", i64, [IsRV64]>;
324
+ defm : AMOPat<"atomic_load_max_64", "AMOMAX_D", i64, [IsRV64]>;
325
+ defm : AMOPat<"atomic_load_min_64", "AMOMIN_D", i64, [IsRV64]>;
326
+ defm : AMOPat<"atomic_load_umax_64", "AMOMAXU_D", i64, [IsRV64]>;
327
+ defm : AMOPat<"atomic_load_umin_64", "AMOMINU_D", i64, [IsRV64]>;
319
328
320
- defm : AMOPat<"atomic_swap_64", "AMOSWAP_D", i64>;
321
- defm : AMOPat<"atomic_load_add_64", "AMOADD_D", i64>;
322
- defm : AMOPat<"atomic_load_and_64", "AMOAND_D", i64>;
323
- defm : AMOPat<"atomic_load_or_64", "AMOOR_D", i64>;
324
- defm : AMOPat<"atomic_load_xor_64", "AMOXOR_D", i64>;
325
- defm : AMOPat<"atomic_load_max_64", "AMOMAX_D", i64>;
326
- defm : AMOPat<"atomic_load_min_64", "AMOMIN_D", i64>;
327
- defm : AMOPat<"atomic_load_umax_64", "AMOMAXU_D", i64>;
328
- defm : AMOPat<"atomic_load_umin_64", "AMOMINU_D", i64>;
329
+ let Predicates = [HasStdExtA, IsRV64] in {
329
330
330
331
/// 64-bit pseudo AMOs
331
332
0 commit comments