@@ -100,14 +100,22 @@ def loongarch_tail_large : SDNode<"LoongArchISD::TAIL_LARGE", SDT_LoongArchCall,
100100def loongarch_selectcc : SDNode<"LoongArchISD::SELECT_CC", SDT_LoongArchSelectCC>;
101101def loongarch_brcc : SDNode<"LoongArchISD::BR_CC", SDT_LoongArchBrCC,
102102 [SDNPHasChain]>;
103+
104+ // 32-bit shifts, directly matching the semantics of the named LoongArch
105+ // instructions.
103106def loongarch_sll_w : SDNode<"LoongArchISD::SLL_W", SDT_LoongArchIntBinOpW>;
104107def loongarch_sra_w : SDNode<"LoongArchISD::SRA_W", SDT_LoongArchIntBinOpW>;
105108def loongarch_srl_w : SDNode<"LoongArchISD::SRL_W", SDT_LoongArchIntBinOpW>;
109+
106110def loongarch_rotr_w : SDNode<"LoongArchISD::ROTR_W", SDT_LoongArchIntBinOpW>;
111+
112+ // unsigned 32-bit integer division
107113def loongarch_div_w : SDNode<"LoongArchISD::DIV_W", SDT_LoongArchIntBinOpW>;
108114def loongarch_div_wu : SDNode<"LoongArchISD::DIV_WU", SDT_LoongArchIntBinOpW>;
109115def loongarch_mod_w : SDNode<"LoongArchISD::MOD_W", SDT_LoongArchIntBinOpW>;
110116def loongarch_mod_wu : SDNode<"LoongArchISD::MOD_WU", SDT_LoongArchIntBinOpW>;
117+
118+ // CRC check operations
111119def loongarch_crc_w_b_w
112120 : SDNode<"LoongArchISD::CRC_W_B_W", SDT_LoongArchIntBinOpW, [SDNPHasChain]>;
113121def loongarch_crc_w_h_w
@@ -124,37 +132,63 @@ def loongarch_crcc_w_w_w : SDNode<"LoongArchISD::CRCC_W_W_W",
124132 SDT_LoongArchIntBinOpW, [SDNPHasChain]>;
125133def loongarch_crcc_w_d_w : SDNode<"LoongArchISD::CRCC_W_D_W",
126134 SDT_LoongArchIntBinOpW, [SDNPHasChain]>;
135+
127136def loongarch_bstrins
128137 : SDNode<"LoongArchISD::BSTRINS", SDT_LoongArchBStrIns>;
129138def loongarch_bstrpick
130139 : SDNode<"LoongArchISD::BSTRPICK", SDT_LoongArchBStrPick>;
140+
141+ // Byte-swapping and bit-reversal
131142def loongarch_revb_2h : SDNode<"LoongArchISD::REVB_2H", SDTUnaryOp>;
132143def loongarch_revb_2w : SDNode<"LoongArchISD::REVB_2W", SDTUnaryOp>;
133144def loongarch_bitrev_4b : SDNode<"LoongArchISD::BITREV_4B", SDTUnaryOp>;
134145def loongarch_bitrev_8b : SDNode<"LoongArchISD::BITREV_8B", SDTUnaryOp>;
135146def loongarch_bitrev_w : SDNode<"LoongArchISD::BITREV_W", SDTUnaryOp>;
147+
148+ // Bit counting operations
136149def loongarch_clzw : SDNode<"LoongArchISD::CLZ_W", SDTIntBitCountUnaryOp>;
137150def loongarch_ctzw : SDNode<"LoongArchISD::CTZ_W", SDTIntBitCountUnaryOp>;
151+
138152def loongarch_dbar : SDNode<"LoongArchISD::DBAR", SDT_LoongArchVI,
139153 [SDNPHasChain, SDNPSideEffect]>;
140154def loongarch_ibar : SDNode<"LoongArchISD::IBAR", SDT_LoongArchVI,
141155 [SDNPHasChain, SDNPSideEffect]>;
142156def loongarch_break : SDNode<"LoongArchISD::BREAK", SDT_LoongArchVI,
143157 [SDNPHasChain, SDNPSideEffect]>;
158+
159+ // FPR<->GPR transfer operations
144160def loongarch_movfcsr2gr : SDNode<"LoongArchISD::MOVFCSR2GR",
145161 SDT_LoongArchMovfcsr2gr, [SDNPHasChain]>;
146162def loongarch_movgr2fcsr : SDNode<"LoongArchISD::MOVGR2FCSR",
147163 SDT_LoongArchMovgr2fcsr,
148164 [SDNPHasChain, SDNPSideEffect]>;
165+
149166def loongarch_syscall : SDNode<"LoongArchISD::SYSCALL", SDT_LoongArchVI,
150167 [SDNPHasChain, SDNPSideEffect]>;
151168def loongarch_csrrd : SDNode<"LoongArchISD::CSRRD", SDT_LoongArchCsrrd,
152169 [SDNPHasChain, SDNPSideEffect]>;
170+
171+ // Write new value to CSR and return old value.
172+ // Operand 0: A chain pointer.
173+ // Operand 1: The new value to write.
174+ // Operand 2: The address of the required CSR.
175+ // Result 0: The old value of the CSR.
176+ // Result 1: The new chain pointer.
153177def loongarch_csrwr : SDNode<"LoongArchISD::CSRWR", SDT_LoongArchCsrwr,
154178 [SDNPHasChain, SDNPSideEffect]>;
179+
180+ // Similar to CSRWR but with a write mask.
181+ // Operand 0: A chain pointer.
182+ // Operand 1: The new value to write.
183+ // Operand 2: The write mask.
184+ // Operand 3: The address of the required CSR.
185+ // Result 0: The old value of the CSR.
186+ // Result 1: The new chain pointer.
155187def loongarch_csrxchg : SDNode<"LoongArchISD::CSRXCHG",
156188 SDT_LoongArchCsrxchg,
157189 [SDNPHasChain, SDNPSideEffect]>;
190+
191+ // IOCSR access operations
158192def loongarch_iocsrrd_b : SDNode<"LoongArchISD::IOCSRRD_B", SDTUnaryOp,
159193 [SDNPHasChain, SDNPSideEffect]>;
160194def loongarch_iocsrrd_h : SDNode<"LoongArchISD::IOCSRRD_H", SDTUnaryOp,
@@ -175,9 +209,12 @@ def loongarch_iocsrwr_w : SDNode<"LoongArchISD::IOCSRWR_W",
175209def loongarch_iocsrwr_d : SDNode<"LoongArchISD::IOCSRWR_D",
176210 SDT_LoongArchIocsrwr,
177211 [SDNPHasChain, SDNPSideEffect]>;
212+
213+ // Read CPU configuration information operation
178214def loongarch_cpucfg : SDNode<"LoongArchISD::CPUCFG", SDTUnaryOp,
179215 [SDNPHasChain]>;
180216
217+ // Build and split F64 pair
181218def loongarch_build_pair_f64 : SDNode<"LoongArchISD::BUILD_PAIR_F64",
182219 SDT_LoongArchBuildPairF64>;
183220def loongarch_split_pair_f64 : SDNode<"LoongArchISD::SPLIT_PAIR_F64",
0 commit comments