Skip to content

Commit a9452c1

Browse files
committed
refactor the matching pattern of atomic operations
1 parent c463953 commit a9452c1

File tree

1 file changed

+27
-78
lines changed

1 file changed

+27
-78
lines changed

llvm/lib/Target/LoongArch/LoongArchInstrInfo.td

Lines changed: 27 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -2075,100 +2075,49 @@ multiclass ternary_atomic_op_failure_ord {
20752075
defm atomic_cmp_swap_i32 : ternary_atomic_op_failure_ord;
20762076
defm 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+
20782091
let 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">;
20882102
def : Pat<(atomic_load_sub_i32_monotonic GPR:$rj, GPR:$rk),
20892103
(AMADD_W (SUB_W R0, GPR:$rk), GPR:$rj)>;
20902104
def : 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>;
21312107
def : Pat<(atomic_load_sub_i32 GPR:$rj, GPR:$rk),
21322108
(AMADD__DB_W (SUB_W R0, GPR:$rk), GPR:$rj)>;
21332109
def : 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>;
21352116
def : AtomicPat<int_loongarch_masked_atomicrmw_sub_i64,
21362117
PseudoMaskedAtomicLoadSub32>;
21372118
defm : PseudoBinPat<"atomic_load_nand_i64", PseudoAtomicLoadNand64>;
21382119
def : 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

21732122
def : AtomicPat<int_loongarch_masked_atomicrmw_umax_i64,
21742123
PseudoMaskedAtomicLoadUMax32>;

0 commit comments

Comments
 (0)