[llvm] [LoongArch] fix: Support LoongArch atomic memory operations with monotonic semantics (PR #112681)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 18 02:10:33 PDT 2024
================
@@ -2075,58 +2075,62 @@ multiclass ternary_atomic_op_failure_ord {
defm atomic_cmp_swap_i32 : ternary_atomic_op_failure_ord;
defm atomic_cmp_swap_i64 : ternary_atomic_op_failure_ord;
+// Atomic operation with the given atomic ordering for word and double word
+multiclass binaray_atomic_op_ord_wd<string inst, string op,
+ string ord, string signed = ""> {
+ def : Pat<(!cast<PatFrag>(op#"_i32_"#ord) GPR:$rj, GPR:$rk),
+ (!cast<Instruction>(inst#"_W"#signed) GPR:$rk, GPR:$rj)>;
+ def : Pat<(!cast<PatFrag>(op#"_i64_"#ord) GPR:$rj, GPR:$rk),
+ (!cast<Instruction>(inst#"_D"#signed) GPR:$rk, GPR:$rj)>;
+}
+
+// Atomic operation for word and double word
+multiclass binaray_atomic_op_wd<string inst, string op, string signed = ""> {
+ def : Pat<(!cast<PatFrag>(op#"_i32") GPR:$rj, GPR:$rk),
+ (!cast<Instruction>(inst#"_W"#signed) GPR:$rk, GPR:$rj)>;
+ def : Pat<(!cast<PatFrag>(op#"_i64") GPR:$rj, GPR:$rk),
+ (!cast<Instruction>(inst#"_D"#signed) GPR:$rk, GPR:$rj)>;
+}
+
let Predicates = [IsLA64] in {
-def : AtomicPat<int_loongarch_masked_atomicrmw_xchg_i64,
- PseudoMaskedAtomicSwap32>;
-def : Pat<(atomic_swap_i32 GPR:$addr, GPR:$incr),
- (AMSWAP__DB_W GPR:$incr, GPR:$addr)>;
-def : Pat<(atomic_swap_i64 GPR:$addr, GPR:$incr),
- (AMSWAP__DB_D GPR:$incr, GPR:$addr)>;
-def : Pat<(atomic_load_add_i64 GPR:$rj, GPR:$rk),
- (AMADD__DB_D GPR:$rk, GPR:$rj)>;
-def : AtomicPat<int_loongarch_masked_atomicrmw_add_i64,
- PseudoMaskedAtomicLoadAdd32>;
+
+defm : binaray_atomic_op_ord_wd<"AMSWAP", "atomic_swap", "monotonic">;
+defm : binaray_atomic_op_ord_wd<"AMADD", "atomic_load_add", "monotonic">;
+defm : binaray_atomic_op_ord_wd<"AMAND", "atomic_load_and", "monotonic">;
+defm : binaray_atomic_op_ord_wd<"AMOR", "atomic_load_or", "monotonic">;
+defm : binaray_atomic_op_ord_wd<"AMXOR", "atomic_load_xor", "monotonic">;
+defm : binaray_atomic_op_ord_wd<"AMMIN", "atomic_load_umin", "monotonic", "U">;
+defm : binaray_atomic_op_ord_wd<"AMMAX", "atomic_load_umax", "monotonic", "U">;
+defm : binaray_atomic_op_ord_wd<"AMMIN", "atomic_load_min", "monotonic">;
+defm : binaray_atomic_op_ord_wd<"AMMAX", "atomic_load_max", "monotonic">;
----------------
tangaac wrote:
Very clear, thanks
https://github.com/llvm/llvm-project/pull/112681
More information about the llvm-commits
mailing list