[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