@@ -2075,100 +2075,49 @@ multiclass ternary_atomic_op_failure_ord {
20752075defm atomic_cmp_swap_i32 : ternary_atomic_op_failure_ord;
20762076defm atomic_cmp_swap_i64 : ternary_atomic_op_failure_ord;
20772077
2078+ // Atomic operation for word and double word
2079+ multiclass binary_atomic_op_wd<string inst, string op, string signed = ""> {
2080+ def : Pat<(!cast<PatFrag>(op#"_i32_monotonic") GPR:$rj, GPR:$rk),
2081+ (!cast<Instruction>(inst#"_W"#signed) GPR:$rk, GPR:$rj)>;
2082+ def : Pat<(!cast<PatFrag>(op#"_i64_monotonic") GPR:$rj, GPR:$rk),
2083+ (!cast<Instruction>(inst#"_D"#signed) GPR:$rk, GPR:$rj)>;
2084+
2085+ def : Pat<(!cast<PatFrag>(op#"_i32") GPR:$rj, GPR:$rk),
2086+ (!cast<Instruction>(inst#"__DB_W"#signed) GPR:$rk, GPR:$rj)>;
2087+ def : Pat<(!cast<PatFrag>(op#"_i64") GPR:$rj, GPR:$rk),
2088+ (!cast<Instruction>(inst#"__DB_D"#signed) GPR:$rk, GPR:$rj)>;
2089+ }
2090+
20782091let Predicates = [IsLA64] in {
20792092
2080- def : Pat<(atomic_swap_i32_monotonic GPR:$addr, GPR:$incr),
2081- (AMSWAP_W GPR:$incr, GPR:$addr)>;
2082- def : Pat<(atomic_swap_i64_monotonic GPR:$addr, GPR:$incr),
2083- (AMSWAP_D GPR:$incr, GPR:$addr)>;
2084- def : Pat<(atomic_load_add_i32_monotonic GPR:$rj, GPR:$rk),
2085- (AMADD_W GPR:$rk, GPR:$rj)>;
2086- def : Pat<(atomic_load_add_i64_monotonic GPR:$rj, GPR:$rk),
2087- (AMADD_D GPR:$rk, GPR:$rj)>;
2093+ defm : binary_atomic_op_wd<"AMSWAP", "atomic_swap">;
2094+ defm : binary_atomic_op_wd<"AMADD", "atomic_load_add">;
2095+ defm : binary_atomic_op_wd<"AMAND", "atomic_load_and">;
2096+ defm : binary_atomic_op_wd<"AMOR", "atomic_load_or">;
2097+ defm : binary_atomic_op_wd<"AMXOR", "atomic_load_xor">;
2098+ defm : binary_atomic_op_wd<"AMMIN", "atomic_load_umin", "U">;
2099+ defm : binary_atomic_op_wd<"AMMAX", "atomic_load_umax", "U">;
2100+ defm : binary_atomic_op_wd<"AMMIN", "atomic_load_min">;
2101+ defm : binary_atomic_op_wd<"AMMAX", "atomic_load_max">;
20882102def : Pat<(atomic_load_sub_i32_monotonic GPR:$rj, GPR:$rk),
20892103 (AMADD_W (SUB_W R0, GPR:$rk), GPR:$rj)>;
20902104def : Pat<(atomic_load_sub_i64_monotonic GPR:$rj, GPR:$rk),
20912105 (AMADD_D (SUB_D R0, GPR:$rk), GPR:$rj)>;
2092- def : Pat<(atomic_load_and_i32_monotonic GPR:$rj, GPR:$rk),
2093- (AMAND_W GPR:$rk, GPR:$rj)>;
2094- def : Pat<(atomic_load_and_i64_monotonic GPR:$rj, GPR:$rk),
2095- (AMAND_D GPR:$rk, GPR:$rj)>;
2096- def : Pat<(atomic_load_or_i32_monotonic GPR:$rj, GPR:$rk),
2097- (AMOR_W GPR:$rk, GPR:$rj)>;
2098- def : Pat<(atomic_load_or_i64_monotonic GPR:$rj, GPR:$rk),
2099- (AMOR_D GPR:$rk, GPR:$rj)>;
2100- def : Pat<(atomic_load_xor_i32_monotonic GPR:$rj, GPR:$rk),
2101- (AMXOR_W GPR:$rk, GPR:$rj)>;
2102- def : Pat<(atomic_load_xor_i64_monotonic GPR:$rj, GPR:$rk),
2103- (AMXOR_D GPR:$rk, GPR:$rj)>;
2104- def : Pat<(atomic_load_umin_i32_monotonic GPR:$rj, GPR:$rk),
2105- (AMMIN_WU GPR:$rk, GPR:$rj)>;
2106- def : Pat<(atomic_load_umin_i64_monotonic GPR:$rj, GPR:$rk),
2107- (AMMIN_DU GPR:$rk, GPR:$rj)>;
2108- def : Pat<(atomic_load_umax_i32_monotonic GPR:$rj, GPR:$rk),
2109- (AMMAX_WU GPR:$rk, GPR:$rj)>;
2110- def : Pat<(atomic_load_umax_i64_monotonic GPR:$rj, GPR:$rk),
2111- (AMMAX_DU GPR:$rk, GPR:$rj)>;
2112- def : Pat<(atomic_load_min_i32_monotonic GPR:$rj, GPR:$rk),
2113- (AMMIN_W GPR:$rk, GPR:$rj)>;
2114- def : Pat<(atomic_load_min_i64_monotonic GPR:$rj, GPR:$rk),
2115- (AMMIN_D GPR:$rk, GPR:$rj)>;
2116- def : Pat<(atomic_load_max_i32_monotonic GPR:$rj, GPR:$rk),
2117- (AMMAX_W GPR:$rk, GPR:$rj)>;
2118- def : Pat<(atomic_load_max_i64_monotonic GPR:$rj, GPR:$rk),
2119- (AMMAX_D GPR:$rk, GPR:$rj)>;
21202106
2121- def : AtomicPat<int_loongarch_masked_atomicrmw_xchg_i64,
2122- PseudoMaskedAtomicSwap32>;
2123- def : Pat<(atomic_swap_i32 GPR:$addr, GPR:$incr),
2124- (AMSWAP__DB_W GPR:$incr, GPR:$addr)>;
2125- def : Pat<(atomic_swap_i64 GPR:$addr, GPR:$incr),
2126- (AMSWAP__DB_D GPR:$incr, GPR:$addr)>;
2127- def : Pat<(atomic_load_add_i64 GPR:$rj, GPR:$rk),
2128- (AMADD__DB_D GPR:$rk, GPR:$rj)>;
2129- def : AtomicPat<int_loongarch_masked_atomicrmw_add_i64,
2130- PseudoMaskedAtomicLoadAdd32>;
21312107def : Pat<(atomic_load_sub_i32 GPR:$rj, GPR:$rk),
21322108 (AMADD__DB_W (SUB_W R0, GPR:$rk), GPR:$rj)>;
21332109def : Pat<(atomic_load_sub_i64 GPR:$rj, GPR:$rk),
21342110 (AMADD__DB_D (SUB_D R0, GPR:$rk), GPR:$rj)>;
2111+
2112+ def : AtomicPat<int_loongarch_masked_atomicrmw_xchg_i64,
2113+ PseudoMaskedAtomicSwap32>;
2114+ def : AtomicPat<int_loongarch_masked_atomicrmw_add_i64,
2115+ PseudoMaskedAtomicLoadAdd32>;
21352116def : AtomicPat<int_loongarch_masked_atomicrmw_sub_i64,
21362117 PseudoMaskedAtomicLoadSub32>;
21372118defm : PseudoBinPat<"atomic_load_nand_i64", PseudoAtomicLoadNand64>;
21382119def : AtomicPat<int_loongarch_masked_atomicrmw_nand_i64,
21392120 PseudoMaskedAtomicLoadNand32>;
2140- def : Pat<(atomic_load_add_i32 GPR:$rj, GPR:$rk),
2141- (AMADD__DB_W GPR:$rk, GPR:$rj)>;
2142- def : Pat<(atomic_load_and_i32 GPR:$rj, GPR:$rk),
2143- (AMAND__DB_W GPR:$rk, GPR:$rj)>;
2144- def : Pat<(atomic_load_and_i64 GPR:$rj, GPR:$rk),
2145- (AMAND__DB_D GPR:$rk, GPR:$rj)>;
2146- def : Pat<(atomic_load_or_i32 GPR:$rj, GPR:$rk),
2147- (AMOR__DB_W GPR:$rk, GPR:$rj)>;
2148- def : Pat<(atomic_load_or_i64 GPR:$rj, GPR:$rk),
2149- (AMOR__DB_D GPR:$rk, GPR:$rj)>;
2150- def : Pat<(atomic_load_xor_i32 GPR:$rj, GPR:$rk),
2151- (AMXOR__DB_W GPR:$rk, GPR:$rj)>;
2152- def : Pat<(atomic_load_xor_i64 GPR:$rj, GPR:$rk),
2153- (AMXOR__DB_D GPR:$rk, GPR:$rj)>;
2154-
2155- def : Pat<(atomic_load_umin_i32 GPR:$rj, GPR:$rk),
2156- (AMMIN__DB_WU GPR:$rk, GPR:$rj)>;
2157- def : Pat<(atomic_load_umin_i64 GPR:$rj, GPR:$rk),
2158- (AMMIN__DB_DU GPR:$rk, GPR:$rj)>;
2159- def : Pat<(atomic_load_umax_i32 GPR:$rj, GPR:$rk),
2160- (AMMAX__DB_WU GPR:$rk, GPR:$rj)>;
2161- def : Pat<(atomic_load_umax_i64 GPR:$rj, GPR:$rk),
2162- (AMMAX__DB_DU GPR:$rk, GPR:$rj)>;
2163-
2164- def : Pat<(atomic_load_min_i32 GPR:$rj, GPR:$rk),
2165- (AMMIN__DB_W GPR:$rk, GPR:$rj)>;
2166- def : Pat<(atomic_load_min_i64 GPR:$rj, GPR:$rk),
2167- (AMMIN__DB_D GPR:$rk, GPR:$rj)>;
2168- def : Pat<(atomic_load_max_i32 GPR:$rj, GPR:$rk),
2169- (AMMAX__DB_W GPR:$rk, GPR:$rj)>;
2170- def : Pat<(atomic_load_max_i64 GPR:$rj, GPR:$rk),
2171- (AMMAX__DB_D GPR:$rk, GPR:$rj)>;
21722121
21732122def : AtomicPat<int_loongarch_masked_atomicrmw_umax_i64,
21742123 PseudoMaskedAtomicLoadUMax32>;
0 commit comments