1//===- LoongArchLSXInstrInfo.td - LoongArch LSX instructions -*- tablegen -*-=//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file describes the SIMD extension instructions.
10//
11//===----------------------------------------------------------------------===//
12
13def SDT_LoongArchVreplve : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisVec<0>,
14                                         SDTCisInt<1>, SDTCisVec<1>,
15                                         SDTCisSameAs<0, 1>, SDTCisInt<2>]>;
16def SDT_LoongArchVecCond : SDTypeProfile<1, 1, [SDTCisInt<0>, SDTCisVec<1>]>;
17
18// Target nodes.
19def loongarch_vreplve : SDNode<"LoongArchISD::VREPLVE", SDT_LoongArchVreplve>;
20def loongarch_vall_nonzero : SDNode<"LoongArchISD::VALL_NONZERO",
21                                    SDT_LoongArchVecCond>;
22def loongarch_vany_nonzero : SDNode<"LoongArchISD::VANY_NONZERO",
23                                    SDT_LoongArchVecCond>;
24def loongarch_vall_zero : SDNode<"LoongArchISD::VALL_ZERO",
25                                SDT_LoongArchVecCond>;
26def loongarch_vany_zero : SDNode<"LoongArchISD::VANY_ZERO",
27                                SDT_LoongArchVecCond>;
28
29def loongarch_vpick_sext_elt : SDNode<"LoongArchISD::VPICK_SEXT_ELT",
30                                      SDTypeProfile<1, 3, [SDTCisPtrTy<2>]>>;
31def loongarch_vpick_zext_elt : SDNode<"LoongArchISD::VPICK_ZEXT_ELT",
32                                      SDTypeProfile<1, 3, [SDTCisPtrTy<2>]>>;
33
34class VecCond<SDPatternOperator OpNode, ValueType TyNode,
35              RegisterClass RC = LSX128>
36    : Pseudo<(outs GPR:$rd), (ins RC:$vj),
37             [(set GPR:$rd, (OpNode (TyNode RC:$vj)))]> {
38  let hasSideEffects = 0;
39  let mayLoad = 0;
40  let mayStore = 0;
41  let usesCustomInserter = 1;
42}
43
44def vsplat_imm_eq_1 : PatFrags<(ops), [(build_vector),
45                                       (bitconvert (v4i32 (build_vector)))], [{
46  APInt Imm;
47  EVT EltTy = N->getValueType(0).getVectorElementType();
48
49  if (N->getOpcode() == ISD::BITCAST)
50    N = N->getOperand(0).getNode();
51
52  return selectVSplat(N, Imm, EltTy.getSizeInBits()) &&
53         Imm.getBitWidth() == EltTy.getSizeInBits() && Imm == 1;
54}]>;
55
56def vsplati8_imm_eq_7 : PatFrags<(ops), [(build_vector)], [{
57  APInt Imm;
58  EVT EltTy = N->getValueType(0).getVectorElementType();
59
60  if (N->getOpcode() == ISD::BITCAST)
61    N = N->getOperand(0).getNode();
62
63  return selectVSplat(N, Imm, EltTy.getSizeInBits()) &&
64         Imm.getBitWidth() == EltTy.getSizeInBits() && Imm == 7;
65}]>;
66def vsplati16_imm_eq_15 : PatFrags<(ops), [(build_vector)], [{
67  APInt Imm;
68  EVT EltTy = N->getValueType(0).getVectorElementType();
69
70  if (N->getOpcode() == ISD::BITCAST)
71    N = N->getOperand(0).getNode();
72
73  return selectVSplat(N, Imm, EltTy.getSizeInBits()) &&
74         Imm.getBitWidth() == EltTy.getSizeInBits() && Imm == 15;
75}]>;
76def vsplati32_imm_eq_31 : PatFrags<(ops), [(build_vector)], [{
77  APInt Imm;
78  EVT EltTy = N->getValueType(0).getVectorElementType();
79
80  if (N->getOpcode() == ISD::BITCAST)
81    N = N->getOperand(0).getNode();
82
83  return selectVSplat(N, Imm, EltTy.getSizeInBits()) &&
84         Imm.getBitWidth() == EltTy.getSizeInBits() && Imm == 31;
85}]>;
86def vsplati64_imm_eq_63 : PatFrags<(ops), [(build_vector),
87                                           (bitconvert (v4i32 (build_vector)))], [{
88  APInt Imm;
89  EVT EltTy = N->getValueType(0).getVectorElementType();
90
91  if (N->getOpcode() == ISD::BITCAST)
92    N = N->getOperand(0).getNode();
93
94  return selectVSplat(N, Imm, EltTy.getSizeInBits()) &&
95         Imm.getBitWidth() == EltTy.getSizeInBits() && Imm == 63;
96}]>;
97
98def vsplatf32_fpimm_eq_1
99  : PatFrags<(ops), [(bitconvert (v4i32 (build_vector))),
100                     (bitconvert (v8i32 (build_vector)))], [{
101  APInt Imm;
102  EVT EltTy = N->getValueType(0).getVectorElementType();
103  N = N->getOperand(0).getNode();
104
105  return selectVSplat(N, Imm, EltTy.getSizeInBits()) &&
106         Imm.getBitWidth() == EltTy.getSizeInBits() &&
107         Imm == APFloat(+1.0f).bitcastToAPInt();
108}]>;
109def vsplatf64_fpimm_eq_1
110  : PatFrags<(ops), [(bitconvert (v2i64 (build_vector))),
111                     (bitconvert (v4i64 (build_vector)))], [{
112  APInt Imm;
113  EVT EltTy = N->getValueType(0).getVectorElementType();
114  N = N->getOperand(0).getNode();
115
116  return selectVSplat(N, Imm, EltTy.getSizeInBits()) &&
117         Imm.getBitWidth() == EltTy.getSizeInBits() &&
118         Imm == APFloat(+1.0).bitcastToAPInt();
119}]>;
120
121def vsplati8imm7   : PatFrag<(ops node:$reg),
122                             (and node:$reg, vsplati8_imm_eq_7)>;
123def vsplati16imm15 : PatFrag<(ops node:$reg),
124                             (and node:$reg, vsplati16_imm_eq_15)>;
125def vsplati32imm31 : PatFrag<(ops node:$reg),
126                             (and node:$reg, vsplati32_imm_eq_31)>;
127def vsplati64imm63 : PatFrag<(ops node:$reg),
128                             (and node:$reg, vsplati64_imm_eq_63)>;
129
130foreach N = [3, 4, 5, 6, 8] in
131  def SplatPat_uimm#N : ComplexPattern<vAny, 1, "selectVSplatImm<"#N#">",
132                                       [build_vector, bitconvert], [], 2>;
133
134foreach N = [5] in
135  def SplatPat_simm#N : ComplexPattern<vAny, 1, "selectVSplatImm<"#N#", true>",
136                                       [build_vector, bitconvert]>;
137
138def vsplat_uimm_inv_pow2 : ComplexPattern<vAny, 1, "selectVSplatUimmInvPow2",
139                                          [build_vector, bitconvert]>;
140
141def vsplat_uimm_pow2 : ComplexPattern<vAny, 1, "selectVSplatUimmPow2",
142                                      [build_vector, bitconvert]>;
143
144def muladd : PatFrag<(ops node:$vd, node:$vj, node:$vk),
145                     (add node:$vd, (mul node:$vj, node:$vk))>;
146
147def mulsub : PatFrag<(ops node:$vd, node:$vj, node:$vk),
148                     (sub node:$vd, (mul node:$vj, node:$vk))>;
149
150def lsxsplati8  : PatFrag<(ops node:$e0),
151                          (v16i8 (build_vector node:$e0, node:$e0,
152                                               node:$e0, node:$e0,
153                                               node:$e0, node:$e0,
154                                               node:$e0, node:$e0,
155                                               node:$e0, node:$e0,
156                                               node:$e0, node:$e0,
157                                               node:$e0, node:$e0,
158                                               node:$e0, node:$e0))>;
159def lsxsplati16 : PatFrag<(ops node:$e0),
160                          (v8i16 (build_vector node:$e0, node:$e0,
161                                               node:$e0, node:$e0,
162                                               node:$e0, node:$e0,
163                                               node:$e0, node:$e0))>;
164def lsxsplati32 : PatFrag<(ops node:$e0),
165                          (v4i32 (build_vector node:$e0, node:$e0,
166                                               node:$e0, node:$e0))>;
167def lsxsplati64 : PatFrag<(ops node:$e0),
168                          (v2i64 (build_vector node:$e0, node:$e0))>;
169def lsxsplatf32 : PatFrag<(ops node:$e0),
170                          (v4f32 (build_vector node:$e0, node:$e0,
171                                               node:$e0, node:$e0))>;
172def lsxsplatf64 : PatFrag<(ops node:$e0),
173                          (v2f64 (build_vector node:$e0, node:$e0))>;
174
175def to_valid_timm : SDNodeXForm<timm, [{
176  auto CN = cast<ConstantSDNode>(N);
177  return CurDAG->getTargetConstant(CN->getSExtValue(), SDLoc(N), Subtarget->getGRLenVT());
178}]>;
179
180//===----------------------------------------------------------------------===//
181// Instruction class templates
182//===----------------------------------------------------------------------===//
183
184class LSX1RI13_VI<bits<32> op, Operand ImmOpnd = simm13>
185    : Fmt1RI13_VI<op, (outs LSX128:$vd), (ins ImmOpnd:$imm13), "$vd, $imm13">;
186
187class LSX2R_VV<bits<32> op>
188    : Fmt2R_VV<op, (outs LSX128:$vd), (ins LSX128:$vj), "$vd, $vj">;
189
190class LSX2R_VR<bits<32> op>
191    : Fmt2R_VR<op, (outs LSX128:$vd), (ins GPR:$rj), "$vd, $rj">;
192
193class LSX2R_CV<bits<32> op>
194    : Fmt2R_CV<op, (outs CFR:$cd), (ins LSX128:$vj), "$cd, $vj">;
195
196class LSX2RI1_VVI<bits<32> op, Operand ImmOpnd = uimm1>
197    : Fmt2RI1_VVI<op, (outs LSX128:$vd), (ins LSX128:$vj, ImmOpnd:$imm1),
198                  "$vd, $vj, $imm1">;
199
200class LSX2RI1_RVI<bits<32> op, Operand ImmOpnd = uimm1>
201    : Fmt2RI1_RVI<op, (outs GPR:$rd), (ins LSX128:$vj, ImmOpnd:$imm1),
202                  "$rd, $vj, $imm1">;
203
204class LSX2RI2_VVI<bits<32> op, Operand ImmOpnd = uimm2>
205    : Fmt2RI2_VVI<op, (outs LSX128:$vd), (ins LSX128:$vj, ImmOpnd:$imm2),
206                  "$vd, $vj, $imm2">;
207
208class LSX2RI2_RVI<bits<32> op, Operand ImmOpnd = uimm2>
209    : Fmt2RI2_RVI<op, (outs GPR:$rd), (ins LSX128:$vj, ImmOpnd:$imm2),
210                  "$rd, $vj, $imm2">;
211
212class LSX2RI3_VVI<bits<32> op, Operand ImmOpnd = uimm3>
213    : Fmt2RI3_VVI<op, (outs LSX128:$vd), (ins LSX128:$vj, ImmOpnd:$imm3),
214                  "$vd, $vj, $imm3">;
215
216class LSX2RI3_RVI<bits<32> op, Operand ImmOpnd = uimm3>
217    : Fmt2RI3_RVI<op, (outs GPR:$rd), (ins LSX128:$vj, ImmOpnd:$imm3),
218                  "$rd, $vj, $imm3">;
219
220class LSX2RI4_VVI<bits<32> op, Operand ImmOpnd = uimm4>
221    : Fmt2RI4_VVI<op, (outs LSX128:$vd), (ins LSX128:$vj, ImmOpnd:$imm4),
222                  "$vd, $vj, $imm4">;
223
224class LSX2RI4_RVI<bits<32> op, Operand ImmOpnd = uimm4>
225    : Fmt2RI4_RVI<op, (outs GPR:$rd), (ins LSX128:$vj, ImmOpnd:$imm4),
226                  "$rd, $vj, $imm4">;
227
228class LSX2RI5_VVI<bits<32> op, Operand ImmOpnd = uimm5>
229    : Fmt2RI5_VVI<op, (outs LSX128:$vd), (ins LSX128:$vj, ImmOpnd:$imm5),
230                  "$vd, $vj, $imm5">;
231
232class LSX2RI6_VVI<bits<32> op, Operand ImmOpnd = uimm6>
233    : Fmt2RI6_VVI<op, (outs LSX128:$vd), (ins LSX128:$vj, ImmOpnd:$imm6),
234                  "$vd, $vj, $imm6">;
235
236class LSX2RI8_VVI<bits<32> op, Operand ImmOpnd = uimm8>
237    : Fmt2RI8_VVI<op, (outs LSX128:$vd), (ins LSX128:$vj, ImmOpnd:$imm8),
238                  "$vd, $vj, $imm8">;
239
240class LSX2RI8I1_VRII<bits<32> op, Operand ImmOpnd = simm8,
241                     Operand IdxOpnd = uimm1>
242    : Fmt2RI8I1_VRII<op, (outs),
243                     (ins LSX128:$vd, GPR:$rj, ImmOpnd:$imm8, IdxOpnd:$imm1),
244                     "$vd, $rj, $imm8, $imm1">;
245class LSX2RI8I2_VRII<bits<32> op, Operand ImmOpnd = simm8,
246                     Operand IdxOpnd = uimm2>
247    : Fmt2RI8I2_VRII<op, (outs),
248                     (ins LSX128:$vd, GPR:$rj, ImmOpnd:$imm8, IdxOpnd:$imm2),
249                     "$vd, $rj, $imm8, $imm2">;
250class LSX2RI8I3_VRII<bits<32> op, Operand ImmOpnd = simm8,
251                     Operand IdxOpnd = uimm3>
252    : Fmt2RI8I3_VRII<op, (outs),
253                     (ins LSX128:$vd, GPR:$rj, ImmOpnd:$imm8, IdxOpnd:$imm3),
254                     "$vd, $rj, $imm8, $imm3">;
255class LSX2RI8I4_VRII<bits<32> op, Operand ImmOpnd = simm8,
256                     Operand IdxOpnd = uimm4>
257    : Fmt2RI8I4_VRII<op, (outs),
258                     (ins LSX128:$vd, GPR:$rj, ImmOpnd:$imm8, IdxOpnd:$imm4),
259                     "$vd, $rj, $imm8, $imm4">;
260
261class LSX3R_VVV<bits<32> op>
262    : Fmt3R_VVV<op, (outs LSX128:$vd), (ins LSX128:$vj, LSX128:$vk),
263                "$vd, $vj, $vk">;
264
265class LSX3R_VVR<bits<32> op>
266    : Fmt3R_VVR<op, (outs LSX128:$vd), (ins LSX128:$vj, GPR:$rk),
267                "$vd, $vj, $rk">;
268
269class LSX4R_VVVV<bits<32> op>
270    : Fmt4R_VVVV<op, (outs LSX128:$vd),
271                 (ins LSX128:$vj, LSX128:$vk, LSX128:$va),
272                 "$vd, $vj, $vk, $va">;
273
274let Constraints = "$vd = $dst" in {
275
276class LSX2RI1_VVRI<bits<32> op, Operand ImmOpnd = uimm1>
277    : Fmt2RI1_VRI<op, (outs LSX128:$dst), (ins LSX128:$vd, GPR:$rj, ImmOpnd:$imm1),
278                  "$vd, $rj, $imm1">;
279class LSX2RI2_VVRI<bits<32> op, Operand ImmOpnd = uimm2>
280    : Fmt2RI2_VRI<op, (outs LSX128:$dst), (ins LSX128:$vd, GPR:$rj, ImmOpnd:$imm2),
281                  "$vd, $rj, $imm2">;
282class LSX2RI3_VVRI<bits<32> op, Operand ImmOpnd = uimm3>
283    : Fmt2RI3_VRI<op, (outs LSX128:$dst), (ins LSX128:$vd, GPR:$rj, ImmOpnd:$imm3),
284                  "$vd, $rj, $imm3">;
285class LSX2RI4_VVRI<bits<32> op, Operand ImmOpnd = uimm4>
286    : Fmt2RI4_VRI<op, (outs LSX128:$dst), (ins LSX128:$vd, GPR:$rj, ImmOpnd:$imm4),
287                  "$vd, $rj, $imm4">;
288
289class LSX2RI4_VVVI<bits<32> op, Operand ImmOpnd = uimm4>
290    : Fmt2RI4_VVI<op, (outs LSX128:$dst), (ins LSX128:$vd, LSX128:$vj, ImmOpnd:$imm4),
291                  "$vd, $vj, $imm4">;
292class LSX2RI5_VVVI<bits<32> op, Operand ImmOpnd = uimm5>
293    : Fmt2RI5_VVI<op, (outs LSX128:$dst), (ins LSX128:$vd, LSX128:$vj, ImmOpnd:$imm5),
294                  "$vd, $vj, $imm5">;
295class LSX2RI6_VVVI<bits<32> op, Operand ImmOpnd = uimm6>
296    : Fmt2RI6_VVI<op, (outs LSX128:$dst), (ins LSX128:$vd, LSX128:$vj, ImmOpnd:$imm6),
297                  "$vd, $vj, $imm6">;
298class LSX2RI7_VVVI<bits<32> op, Operand ImmOpnd = uimm7>
299    : Fmt2RI7_VVI<op, (outs LSX128:$dst), (ins LSX128:$vd, LSX128:$vj, ImmOpnd:$imm7),
300                  "$vd, $vj, $imm7">;
301
302class LSX2RI8_VVVI<bits<32> op, Operand ImmOpnd = uimm8>
303    : Fmt2RI8_VVI<op, (outs LSX128:$dst), (ins LSX128:$vd, LSX128:$vj, ImmOpnd:$imm8),
304                  "$vd, $vj, $imm8">;
305
306class LSX3R_VVVV<bits<32> op>
307    : Fmt3R_VVV<op, (outs LSX128:$dst), (ins LSX128:$vd, LSX128:$vj, LSX128:$vk),
308                "$vd, $vj, $vk">;
309
310} // Constraints = "$vd = $dst"
311
312class LSX2RI9_Load<bits<32> op, Operand ImmOpnd = simm9_lsl3>
313    : Fmt2RI9_VRI<op, (outs LSX128:$vd), (ins GPR:$rj, ImmOpnd:$imm9),
314                  "$vd, $rj, $imm9">;
315class LSX2RI10_Load<bits<32> op, Operand ImmOpnd = simm10_lsl2>
316    : Fmt2RI10_VRI<op, (outs LSX128:$vd), (ins GPR:$rj, ImmOpnd:$imm10),
317                  "$vd, $rj, $imm10">;
318class LSX2RI11_Load<bits<32> op, Operand ImmOpnd = simm11_lsl1>
319    : Fmt2RI11_VRI<op, (outs LSX128:$vd), (ins GPR:$rj, ImmOpnd:$imm11),
320                  "$vd, $rj, $imm11">;
321class LSX2RI12_Load<bits<32> op, Operand ImmOpnd = simm12>
322    : Fmt2RI12_VRI<op, (outs LSX128:$vd), (ins GPR:$rj, ImmOpnd:$imm12),
323                  "$vd, $rj, $imm12">;
324class LSX2RI12_Store<bits<32> op, Operand ImmOpnd = simm12>
325    : Fmt2RI12_VRI<op, (outs), (ins LSX128:$vd, GPR:$rj, ImmOpnd:$imm12),
326                  "$vd, $rj, $imm12">;
327
328class LSX3R_Load<bits<32> op>
329    : Fmt3R_VRR<op, (outs LSX128:$vd), (ins GPR:$rj, GPR:$rk),
330                "$vd, $rj, $rk">;
331class LSX3R_Store<bits<32> op>
332    : Fmt3R_VRR<op, (outs), (ins LSX128:$vd, GPR:$rj, GPR:$rk),
333                "$vd, $rj, $rk">;
334
335//===----------------------------------------------------------------------===//
336// Instructions
337//===----------------------------------------------------------------------===//
338
339let hasSideEffects = 0, Predicates = [HasExtLSX] in {
340
341let mayLoad = 0, mayStore = 0 in {
342
343def VADD_B : LSX3R_VVV<0x700a0000>;
344def VADD_H : LSX3R_VVV<0x700a8000>;
345def VADD_W : LSX3R_VVV<0x700b0000>;
346def VADD_D : LSX3R_VVV<0x700b8000>;
347def VADD_Q : LSX3R_VVV<0x712d0000>;
348
349def VSUB_B : LSX3R_VVV<0x700c0000>;
350def VSUB_H : LSX3R_VVV<0x700c8000>;
351def VSUB_W : LSX3R_VVV<0x700d0000>;
352def VSUB_D : LSX3R_VVV<0x700d8000>;
353def VSUB_Q : LSX3R_VVV<0x712d8000>;
354
355def VADDI_BU : LSX2RI5_VVI<0x728a0000>;
356def VADDI_HU : LSX2RI5_VVI<0x728a8000>;
357def VADDI_WU : LSX2RI5_VVI<0x728b0000>;
358def VADDI_DU : LSX2RI5_VVI<0x728b8000>;
359
360def VSUBI_BU : LSX2RI5_VVI<0x728c0000>;
361def VSUBI_HU : LSX2RI5_VVI<0x728c8000>;
362def VSUBI_WU : LSX2RI5_VVI<0x728d0000>;
363def VSUBI_DU : LSX2RI5_VVI<0x728d8000>;
364
365def VNEG_B : LSX2R_VV<0x729c3000>;
366def VNEG_H : LSX2R_VV<0x729c3400>;
367def VNEG_W : LSX2R_VV<0x729c3800>;
368def VNEG_D : LSX2R_VV<0x729c3c00>;
369
370def VSADD_B : LSX3R_VVV<0x70460000>;
371def VSADD_H : LSX3R_VVV<0x70468000>;
372def VSADD_W : LSX3R_VVV<0x70470000>;
373def VSADD_D : LSX3R_VVV<0x70478000>;
374def VSADD_BU : LSX3R_VVV<0x704a0000>;
375def VSADD_HU : LSX3R_VVV<0x704a8000>;
376def VSADD_WU : LSX3R_VVV<0x704b0000>;
377def VSADD_DU : LSX3R_VVV<0x704b8000>;
378
379def VSSUB_B : LSX3R_VVV<0x70480000>;
380def VSSUB_H : LSX3R_VVV<0x70488000>;
381def VSSUB_W : LSX3R_VVV<0x70490000>;
382def VSSUB_D : LSX3R_VVV<0x70498000>;
383def VSSUB_BU : LSX3R_VVV<0x704c0000>;
384def VSSUB_HU : LSX3R_VVV<0x704c8000>;
385def VSSUB_WU : LSX3R_VVV<0x704d0000>;
386def VSSUB_DU : LSX3R_VVV<0x704d8000>;
387
388def VHADDW_H_B : LSX3R_VVV<0x70540000>;
389def VHADDW_W_H : LSX3R_VVV<0x70548000>;
390def VHADDW_D_W : LSX3R_VVV<0x70550000>;
391def VHADDW_Q_D : LSX3R_VVV<0x70558000>;
392def VHADDW_HU_BU : LSX3R_VVV<0x70580000>;
393def VHADDW_WU_HU : LSX3R_VVV<0x70588000>;
394def VHADDW_DU_WU : LSX3R_VVV<0x70590000>;
395def VHADDW_QU_DU : LSX3R_VVV<0x70598000>;
396
397def VHSUBW_H_B : LSX3R_VVV<0x70560000>;
398def VHSUBW_W_H : LSX3R_VVV<0x70568000>;
399def VHSUBW_D_W : LSX3R_VVV<0x70570000>;
400def VHSUBW_Q_D : LSX3R_VVV<0x70578000>;
401def VHSUBW_HU_BU : LSX3R_VVV<0x705a0000>;
402def VHSUBW_WU_HU : LSX3R_VVV<0x705a8000>;
403def VHSUBW_DU_WU : LSX3R_VVV<0x705b0000>;
404def VHSUBW_QU_DU : LSX3R_VVV<0x705b8000>;
405
406def VADDWEV_H_B : LSX3R_VVV<0x701e0000>;
407def VADDWEV_W_H : LSX3R_VVV<0x701e8000>;
408def VADDWEV_D_W : LSX3R_VVV<0x701f0000>;
409def VADDWEV_Q_D : LSX3R_VVV<0x701f8000>;
410def VADDWOD_H_B : LSX3R_VVV<0x70220000>;
411def VADDWOD_W_H : LSX3R_VVV<0x70228000>;
412def VADDWOD_D_W : LSX3R_VVV<0x70230000>;
413def VADDWOD_Q_D : LSX3R_VVV<0x70238000>;
414
415def VSUBWEV_H_B : LSX3R_VVV<0x70200000>;
416def VSUBWEV_W_H : LSX3R_VVV<0x70208000>;
417def VSUBWEV_D_W : LSX3R_VVV<0x70210000>;
418def VSUBWEV_Q_D : LSX3R_VVV<0x70218000>;
419def VSUBWOD_H_B : LSX3R_VVV<0x70240000>;
420def VSUBWOD_W_H : LSX3R_VVV<0x70248000>;
421def VSUBWOD_D_W : LSX3R_VVV<0x70250000>;
422def VSUBWOD_Q_D : LSX3R_VVV<0x70258000>;
423
424def VADDWEV_H_BU : LSX3R_VVV<0x702e0000>;
425def VADDWEV_W_HU : LSX3R_VVV<0x702e8000>;
426def VADDWEV_D_WU : LSX3R_VVV<0x702f0000>;
427def VADDWEV_Q_DU : LSX3R_VVV<0x702f8000>;
428def VADDWOD_H_BU : LSX3R_VVV<0x70320000>;
429def VADDWOD_W_HU : LSX3R_VVV<0x70328000>;
430def VADDWOD_D_WU : LSX3R_VVV<0x70330000>;
431def VADDWOD_Q_DU : LSX3R_VVV<0x70338000>;
432
433def VSUBWEV_H_BU : LSX3R_VVV<0x70300000>;
434def VSUBWEV_W_HU : LSX3R_VVV<0x70308000>;
435def VSUBWEV_D_WU : LSX3R_VVV<0x70310000>;
436def VSUBWEV_Q_DU : LSX3R_VVV<0x70318000>;
437def VSUBWOD_H_BU : LSX3R_VVV<0x70340000>;
438def VSUBWOD_W_HU : LSX3R_VVV<0x70348000>;
439def VSUBWOD_D_WU : LSX3R_VVV<0x70350000>;
440def VSUBWOD_Q_DU : LSX3R_VVV<0x70358000>;
441
442def VADDWEV_H_BU_B : LSX3R_VVV<0x703e0000>;
443def VADDWEV_W_HU_H : LSX3R_VVV<0x703e8000>;
444def VADDWEV_D_WU_W : LSX3R_VVV<0x703f0000>;
445def VADDWEV_Q_DU_D : LSX3R_VVV<0x703f8000>;
446def VADDWOD_H_BU_B : LSX3R_VVV<0x70400000>;
447def VADDWOD_W_HU_H : LSX3R_VVV<0x70408000>;
448def VADDWOD_D_WU_W : LSX3R_VVV<0x70410000>;
449def VADDWOD_Q_DU_D : LSX3R_VVV<0x70418000>;
450
451def VAVG_B : LSX3R_VVV<0x70640000>;
452def VAVG_H : LSX3R_VVV<0x70648000>;
453def VAVG_W : LSX3R_VVV<0x70650000>;
454def VAVG_D : LSX3R_VVV<0x70658000>;
455def VAVG_BU : LSX3R_VVV<0x70660000>;
456def VAVG_HU : LSX3R_VVV<0x70668000>;
457def VAVG_WU : LSX3R_VVV<0x70670000>;
458def VAVG_DU : LSX3R_VVV<0x70678000>;
459def VAVGR_B : LSX3R_VVV<0x70680000>;
460def VAVGR_H : LSX3R_VVV<0x70688000>;
461def VAVGR_W : LSX3R_VVV<0x70690000>;
462def VAVGR_D : LSX3R_VVV<0x70698000>;
463def VAVGR_BU : LSX3R_VVV<0x706a0000>;
464def VAVGR_HU : LSX3R_VVV<0x706a8000>;
465def VAVGR_WU : LSX3R_VVV<0x706b0000>;
466def VAVGR_DU : LSX3R_VVV<0x706b8000>;
467
468def VABSD_B : LSX3R_VVV<0x70600000>;
469def VABSD_H : LSX3R_VVV<0x70608000>;
470def VABSD_W : LSX3R_VVV<0x70610000>;
471def VABSD_D : LSX3R_VVV<0x70618000>;
472def VABSD_BU : LSX3R_VVV<0x70620000>;
473def VABSD_HU : LSX3R_VVV<0x70628000>;
474def VABSD_WU : LSX3R_VVV<0x70630000>;
475def VABSD_DU : LSX3R_VVV<0x70638000>;
476
477def VADDA_B : LSX3R_VVV<0x705c0000>;
478def VADDA_H : LSX3R_VVV<0x705c8000>;
479def VADDA_W : LSX3R_VVV<0x705d0000>;
480def VADDA_D : LSX3R_VVV<0x705d8000>;
481
482def VMAX_B : LSX3R_VVV<0x70700000>;
483def VMAX_H : LSX3R_VVV<0x70708000>;
484def VMAX_W : LSX3R_VVV<0x70710000>;
485def VMAX_D : LSX3R_VVV<0x70718000>;
486def VMAXI_B : LSX2RI5_VVI<0x72900000, simm5>;
487def VMAXI_H : LSX2RI5_VVI<0x72908000, simm5>;
488def VMAXI_W : LSX2RI5_VVI<0x72910000, simm5>;
489def VMAXI_D : LSX2RI5_VVI<0x72918000, simm5>;
490def VMAX_BU : LSX3R_VVV<0x70740000>;
491def VMAX_HU : LSX3R_VVV<0x70748000>;
492def VMAX_WU : LSX3R_VVV<0x70750000>;
493def VMAX_DU : LSX3R_VVV<0x70758000>;
494def VMAXI_BU : LSX2RI5_VVI<0x72940000>;
495def VMAXI_HU : LSX2RI5_VVI<0x72948000>;
496def VMAXI_WU : LSX2RI5_VVI<0x72950000>;
497def VMAXI_DU : LSX2RI5_VVI<0x72958000>;
498
499def VMIN_B : LSX3R_VVV<0x70720000>;
500def VMIN_H : LSX3R_VVV<0x70728000>;
501def VMIN_W : LSX3R_VVV<0x70730000>;
502def VMIN_D : LSX3R_VVV<0x70738000>;
503def VMINI_B : LSX2RI5_VVI<0x72920000, simm5>;
504def VMINI_H : LSX2RI5_VVI<0x72928000, simm5>;
505def VMINI_W : LSX2RI5_VVI<0x72930000, simm5>;
506def VMINI_D : LSX2RI5_VVI<0x72938000, simm5>;
507def VMIN_BU : LSX3R_VVV<0x70760000>;
508def VMIN_HU : LSX3R_VVV<0x70768000>;
509def VMIN_WU : LSX3R_VVV<0x70770000>;
510def VMIN_DU : LSX3R_VVV<0x70778000>;
511def VMINI_BU : LSX2RI5_VVI<0x72960000>;
512def VMINI_HU : LSX2RI5_VVI<0x72968000>;
513def VMINI_WU : LSX2RI5_VVI<0x72970000>;
514def VMINI_DU : LSX2RI5_VVI<0x72978000>;
515
516def VMUL_B : LSX3R_VVV<0x70840000>;
517def VMUL_H : LSX3R_VVV<0x70848000>;
518def VMUL_W : LSX3R_VVV<0x70850000>;
519def VMUL_D : LSX3R_VVV<0x70858000>;
520
521def VMUH_B : LSX3R_VVV<0x70860000>;
522def VMUH_H : LSX3R_VVV<0x70868000>;
523def VMUH_W : LSX3R_VVV<0x70870000>;
524def VMUH_D : LSX3R_VVV<0x70878000>;
525def VMUH_BU : LSX3R_VVV<0x70880000>;
526def VMUH_HU : LSX3R_VVV<0x70888000>;
527def VMUH_WU : LSX3R_VVV<0x70890000>;
528def VMUH_DU : LSX3R_VVV<0x70898000>;
529
530def VMULWEV_H_B : LSX3R_VVV<0x70900000>;
531def VMULWEV_W_H : LSX3R_VVV<0x70908000>;
532def VMULWEV_D_W : LSX3R_VVV<0x70910000>;
533def VMULWEV_Q_D : LSX3R_VVV<0x70918000>;
534def VMULWOD_H_B : LSX3R_VVV<0x70920000>;
535def VMULWOD_W_H : LSX3R_VVV<0x70928000>;
536def VMULWOD_D_W : LSX3R_VVV<0x70930000>;
537def VMULWOD_Q_D : LSX3R_VVV<0x70938000>;
538def VMULWEV_H_BU : LSX3R_VVV<0x70980000>;
539def VMULWEV_W_HU : LSX3R_VVV<0x70988000>;
540def VMULWEV_D_WU : LSX3R_VVV<0x70990000>;
541def VMULWEV_Q_DU : LSX3R_VVV<0x70998000>;
542def VMULWOD_H_BU : LSX3R_VVV<0x709a0000>;
543def VMULWOD_W_HU : LSX3R_VVV<0x709a8000>;
544def VMULWOD_D_WU : LSX3R_VVV<0x709b0000>;
545def VMULWOD_Q_DU : LSX3R_VVV<0x709b8000>;
546def VMULWEV_H_BU_B : LSX3R_VVV<0x70a00000>;
547def VMULWEV_W_HU_H : LSX3R_VVV<0x70a08000>;
548def VMULWEV_D_WU_W : LSX3R_VVV<0x70a10000>;
549def VMULWEV_Q_DU_D : LSX3R_VVV<0x70a18000>;
550def VMULWOD_H_BU_B : LSX3R_VVV<0x70a20000>;
551def VMULWOD_W_HU_H : LSX3R_VVV<0x70a28000>;
552def VMULWOD_D_WU_W : LSX3R_VVV<0x70a30000>;
553def VMULWOD_Q_DU_D : LSX3R_VVV<0x70a38000>;
554
555def VMADD_B : LSX3R_VVVV<0x70a80000>;
556def VMADD_H : LSX3R_VVVV<0x70a88000>;
557def VMADD_W : LSX3R_VVVV<0x70a90000>;
558def VMADD_D : LSX3R_VVVV<0x70a98000>;
559
560def VMSUB_B : LSX3R_VVVV<0x70aa0000>;
561def VMSUB_H : LSX3R_VVVV<0x70aa8000>;
562def VMSUB_W : LSX3R_VVVV<0x70ab0000>;
563def VMSUB_D : LSX3R_VVVV<0x70ab8000>;
564
565def VMADDWEV_H_B : LSX3R_VVVV<0x70ac0000>;
566def VMADDWEV_W_H : LSX3R_VVVV<0x70ac8000>;
567def VMADDWEV_D_W : LSX3R_VVVV<0x70ad0000>;
568def VMADDWEV_Q_D : LSX3R_VVVV<0x70ad8000>;
569def VMADDWOD_H_B : LSX3R_VVVV<0x70ae0000>;
570def VMADDWOD_W_H : LSX3R_VVVV<0x70ae8000>;
571def VMADDWOD_D_W : LSX3R_VVVV<0x70af0000>;
572def VMADDWOD_Q_D : LSX3R_VVVV<0x70af8000>;
573def VMADDWEV_H_BU : LSX3R_VVVV<0x70b40000>;
574def VMADDWEV_W_HU : LSX3R_VVVV<0x70b48000>;
575def VMADDWEV_D_WU : LSX3R_VVVV<0x70b50000>;
576def VMADDWEV_Q_DU : LSX3R_VVVV<0x70b58000>;
577def VMADDWOD_H_BU : LSX3R_VVVV<0x70b60000>;
578def VMADDWOD_W_HU : LSX3R_VVVV<0x70b68000>;
579def VMADDWOD_D_WU : LSX3R_VVVV<0x70b70000>;
580def VMADDWOD_Q_DU : LSX3R_VVVV<0x70b78000>;
581def VMADDWEV_H_BU_B : LSX3R_VVVV<0x70bc0000>;
582def VMADDWEV_W_HU_H : LSX3R_VVVV<0x70bc8000>;
583def VMADDWEV_D_WU_W : LSX3R_VVVV<0x70bd0000>;
584def VMADDWEV_Q_DU_D : LSX3R_VVVV<0x70bd8000>;
585def VMADDWOD_H_BU_B : LSX3R_VVVV<0x70be0000>;
586def VMADDWOD_W_HU_H : LSX3R_VVVV<0x70be8000>;
587def VMADDWOD_D_WU_W : LSX3R_VVVV<0x70bf0000>;
588def VMADDWOD_Q_DU_D : LSX3R_VVVV<0x70bf8000>;
589
590def VDIV_B : LSX3R_VVV<0x70e00000>;
591def VDIV_H : LSX3R_VVV<0x70e08000>;
592def VDIV_W : LSX3R_VVV<0x70e10000>;
593def VDIV_D : LSX3R_VVV<0x70e18000>;
594def VDIV_BU : LSX3R_VVV<0x70e40000>;
595def VDIV_HU : LSX3R_VVV<0x70e48000>;
596def VDIV_WU : LSX3R_VVV<0x70e50000>;
597def VDIV_DU : LSX3R_VVV<0x70e58000>;
598
599def VMOD_B : LSX3R_VVV<0x70e20000>;
600def VMOD_H : LSX3R_VVV<0x70e28000>;
601def VMOD_W : LSX3R_VVV<0x70e30000>;
602def VMOD_D : LSX3R_VVV<0x70e38000>;
603def VMOD_BU : LSX3R_VVV<0x70e60000>;
604def VMOD_HU : LSX3R_VVV<0x70e68000>;
605def VMOD_WU : LSX3R_VVV<0x70e70000>;
606def VMOD_DU : LSX3R_VVV<0x70e78000>;
607
608def VSAT_B : LSX2RI3_VVI<0x73242000>;
609def VSAT_H : LSX2RI4_VVI<0x73244000>;
610def VSAT_W : LSX2RI5_VVI<0x73248000>;
611def VSAT_D : LSX2RI6_VVI<0x73250000>;
612def VSAT_BU : LSX2RI3_VVI<0x73282000>;
613def VSAT_HU : LSX2RI4_VVI<0x73284000>;
614def VSAT_WU : LSX2RI5_VVI<0x73288000>;
615def VSAT_DU : LSX2RI6_VVI<0x73290000>;
616
617def VEXTH_H_B : LSX2R_VV<0x729ee000>;
618def VEXTH_W_H : LSX2R_VV<0x729ee400>;
619def VEXTH_D_W : LSX2R_VV<0x729ee800>;
620def VEXTH_Q_D : LSX2R_VV<0x729eec00>;
621def VEXTH_HU_BU : LSX2R_VV<0x729ef000>;
622def VEXTH_WU_HU : LSX2R_VV<0x729ef400>;
623def VEXTH_DU_WU : LSX2R_VV<0x729ef800>;
624def VEXTH_QU_DU : LSX2R_VV<0x729efc00>;
625
626def VSIGNCOV_B : LSX3R_VVV<0x712e0000>;
627def VSIGNCOV_H : LSX3R_VVV<0x712e8000>;
628def VSIGNCOV_W : LSX3R_VVV<0x712f0000>;
629def VSIGNCOV_D : LSX3R_VVV<0x712f8000>;
630
631def VMSKLTZ_B : LSX2R_VV<0x729c4000>;
632def VMSKLTZ_H : LSX2R_VV<0x729c4400>;
633def VMSKLTZ_W : LSX2R_VV<0x729c4800>;
634def VMSKLTZ_D : LSX2R_VV<0x729c4c00>;
635
636def VMSKGEZ_B : LSX2R_VV<0x729c5000>;
637
638def VMSKNZ_B : LSX2R_VV<0x729c6000>;
639
640def VLDI : LSX1RI13_VI<0x73e00000>;
641
642def VAND_V : LSX3R_VVV<0x71260000>;
643def VOR_V : LSX3R_VVV<0x71268000>;
644def VXOR_V : LSX3R_VVV<0x71270000>;
645def VNOR_V : LSX3R_VVV<0x71278000>;
646def VANDN_V : LSX3R_VVV<0x71280000>;
647def VORN_V : LSX3R_VVV<0x71288000>;
648
649def VANDI_B : LSX2RI8_VVI<0x73d00000>;
650def VORI_B : LSX2RI8_VVI<0x73d40000>;
651def VXORI_B : LSX2RI8_VVI<0x73d80000>;
652def VNORI_B : LSX2RI8_VVI<0x73dc0000>;
653
654def VSLL_B : LSX3R_VVV<0x70e80000>;
655def VSLL_H : LSX3R_VVV<0x70e88000>;
656def VSLL_W : LSX3R_VVV<0x70e90000>;
657def VSLL_D : LSX3R_VVV<0x70e98000>;
658def VSLLI_B : LSX2RI3_VVI<0x732c2000>;
659def VSLLI_H : LSX2RI4_VVI<0x732c4000>;
660def VSLLI_W : LSX2RI5_VVI<0x732c8000>;
661def VSLLI_D : LSX2RI6_VVI<0x732d0000>;
662
663def VSRL_B : LSX3R_VVV<0x70ea0000>;
664def VSRL_H : LSX3R_VVV<0x70ea8000>;
665def VSRL_W : LSX3R_VVV<0x70eb0000>;
666def VSRL_D : LSX3R_VVV<0x70eb8000>;
667def VSRLI_B : LSX2RI3_VVI<0x73302000>;
668def VSRLI_H : LSX2RI4_VVI<0x73304000>;
669def VSRLI_W : LSX2RI5_VVI<0x73308000>;
670def VSRLI_D : LSX2RI6_VVI<0x73310000>;
671
672def VSRA_B : LSX3R_VVV<0x70ec0000>;
673def VSRA_H : LSX3R_VVV<0x70ec8000>;
674def VSRA_W : LSX3R_VVV<0x70ed0000>;
675def VSRA_D : LSX3R_VVV<0x70ed8000>;
676def VSRAI_B : LSX2RI3_VVI<0x73342000>;
677def VSRAI_H : LSX2RI4_VVI<0x73344000>;
678def VSRAI_W : LSX2RI5_VVI<0x73348000>;
679def VSRAI_D : LSX2RI6_VVI<0x73350000>;
680
681def VROTR_B : LSX3R_VVV<0x70ee0000>;
682def VROTR_H : LSX3R_VVV<0x70ee8000>;
683def VROTR_W : LSX3R_VVV<0x70ef0000>;
684def VROTR_D : LSX3R_VVV<0x70ef8000>;
685def VROTRI_B : LSX2RI3_VVI<0x72a02000>;
686def VROTRI_H : LSX2RI4_VVI<0x72a04000>;
687def VROTRI_W : LSX2RI5_VVI<0x72a08000>;
688def VROTRI_D : LSX2RI6_VVI<0x72a10000>;
689
690def VSLLWIL_H_B : LSX2RI3_VVI<0x73082000>;
691def VSLLWIL_W_H : LSX2RI4_VVI<0x73084000>;
692def VSLLWIL_D_W : LSX2RI5_VVI<0x73088000>;
693def VEXTL_Q_D : LSX2R_VV<0x73090000>;
694def VSLLWIL_HU_BU : LSX2RI3_VVI<0x730c2000>;
695def VSLLWIL_WU_HU : LSX2RI4_VVI<0x730c4000>;
696def VSLLWIL_DU_WU : LSX2RI5_VVI<0x730c8000>;
697def VEXTL_QU_DU : LSX2R_VV<0x730d0000>;
698
699def VSRLR_B : LSX3R_VVV<0x70f00000>;
700def VSRLR_H : LSX3R_VVV<0x70f08000>;
701def VSRLR_W : LSX3R_VVV<0x70f10000>;
702def VSRLR_D : LSX3R_VVV<0x70f18000>;
703def VSRLRI_B : LSX2RI3_VVI<0x72a42000>;
704def VSRLRI_H : LSX2RI4_VVI<0x72a44000>;
705def VSRLRI_W : LSX2RI5_VVI<0x72a48000>;
706def VSRLRI_D : LSX2RI6_VVI<0x72a50000>;
707
708def VSRAR_B : LSX3R_VVV<0x70f20000>;
709def VSRAR_H : LSX3R_VVV<0x70f28000>;
710def VSRAR_W : LSX3R_VVV<0x70f30000>;
711def VSRAR_D : LSX3R_VVV<0x70f38000>;
712def VSRARI_B : LSX2RI3_VVI<0x72a82000>;
713def VSRARI_H : LSX2RI4_VVI<0x72a84000>;
714def VSRARI_W : LSX2RI5_VVI<0x72a88000>;
715def VSRARI_D : LSX2RI6_VVI<0x72a90000>;
716
717def VSRLN_B_H : LSX3R_VVV<0x70f48000>;
718def VSRLN_H_W : LSX3R_VVV<0x70f50000>;
719def VSRLN_W_D : LSX3R_VVV<0x70f58000>;
720def VSRAN_B_H : LSX3R_VVV<0x70f68000>;
721def VSRAN_H_W : LSX3R_VVV<0x70f70000>;
722def VSRAN_W_D : LSX3R_VVV<0x70f78000>;
723
724def VSRLNI_B_H : LSX2RI4_VVVI<0x73404000>;
725def VSRLNI_H_W : LSX2RI5_VVVI<0x73408000>;
726def VSRLNI_W_D : LSX2RI6_VVVI<0x73410000>;
727def VSRLNI_D_Q : LSX2RI7_VVVI<0x73420000>;
728def VSRANI_B_H : LSX2RI4_VVVI<0x73584000>;
729def VSRANI_H_W : LSX2RI5_VVVI<0x73588000>;
730def VSRANI_W_D : LSX2RI6_VVVI<0x73590000>;
731def VSRANI_D_Q : LSX2RI7_VVVI<0x735a0000>;
732
733def VSRLRN_B_H : LSX3R_VVV<0x70f88000>;
734def VSRLRN_H_W : LSX3R_VVV<0x70f90000>;
735def VSRLRN_W_D : LSX3R_VVV<0x70f98000>;
736def VSRARN_B_H : LSX3R_VVV<0x70fa8000>;
737def VSRARN_H_W : LSX3R_VVV<0x70fb0000>;
738def VSRARN_W_D : LSX3R_VVV<0x70fb8000>;
739
740def VSRLRNI_B_H : LSX2RI4_VVVI<0x73444000>;
741def VSRLRNI_H_W : LSX2RI5_VVVI<0x73448000>;
742def VSRLRNI_W_D : LSX2RI6_VVVI<0x73450000>;
743def VSRLRNI_D_Q : LSX2RI7_VVVI<0x73460000>;
744def VSRARNI_B_H : LSX2RI4_VVVI<0x735c4000>;
745def VSRARNI_H_W : LSX2RI5_VVVI<0x735c8000>;
746def VSRARNI_W_D : LSX2RI6_VVVI<0x735d0000>;
747def VSRARNI_D_Q : LSX2RI7_VVVI<0x735e0000>;
748
749def VSSRLN_B_H : LSX3R_VVV<0x70fc8000>;
750def VSSRLN_H_W : LSX3R_VVV<0x70fd0000>;
751def VSSRLN_W_D : LSX3R_VVV<0x70fd8000>;
752def VSSRAN_B_H : LSX3R_VVV<0x70fe8000>;
753def VSSRAN_H_W : LSX3R_VVV<0x70ff0000>;
754def VSSRAN_W_D : LSX3R_VVV<0x70ff8000>;
755def VSSRLN_BU_H : LSX3R_VVV<0x71048000>;
756def VSSRLN_HU_W : LSX3R_VVV<0x71050000>;
757def VSSRLN_WU_D : LSX3R_VVV<0x71058000>;
758def VSSRAN_BU_H : LSX3R_VVV<0x71068000>;
759def VSSRAN_HU_W : LSX3R_VVV<0x71070000>;
760def VSSRAN_WU_D : LSX3R_VVV<0x71078000>;
761
762def VSSRLNI_B_H : LSX2RI4_VVVI<0x73484000>;
763def VSSRLNI_H_W : LSX2RI5_VVVI<0x73488000>;
764def VSSRLNI_W_D : LSX2RI6_VVVI<0x73490000>;
765def VSSRLNI_D_Q : LSX2RI7_VVVI<0x734a0000>;
766def VSSRANI_B_H : LSX2RI4_VVVI<0x73604000>;
767def VSSRANI_H_W : LSX2RI5_VVVI<0x73608000>;
768def VSSRANI_W_D : LSX2RI6_VVVI<0x73610000>;
769def VSSRANI_D_Q : LSX2RI7_VVVI<0x73620000>;
770def VSSRLNI_BU_H : LSX2RI4_VVVI<0x734c4000>;
771def VSSRLNI_HU_W : LSX2RI5_VVVI<0x734c8000>;
772def VSSRLNI_WU_D : LSX2RI6_VVVI<0x734d0000>;
773def VSSRLNI_DU_Q : LSX2RI7_VVVI<0x734e0000>;
774def VSSRANI_BU_H : LSX2RI4_VVVI<0x73644000>;
775def VSSRANI_HU_W : LSX2RI5_VVVI<0x73648000>;
776def VSSRANI_WU_D : LSX2RI6_VVVI<0x73650000>;
777def VSSRANI_DU_Q : LSX2RI7_VVVI<0x73660000>;
778
779def VSSRLRN_B_H : LSX3R_VVV<0x71008000>;
780def VSSRLRN_H_W : LSX3R_VVV<0x71010000>;
781def VSSRLRN_W_D : LSX3R_VVV<0x71018000>;
782def VSSRARN_B_H : LSX3R_VVV<0x71028000>;
783def VSSRARN_H_W : LSX3R_VVV<0x71030000>;
784def VSSRARN_W_D : LSX3R_VVV<0x71038000>;
785def VSSRLRN_BU_H : LSX3R_VVV<0x71088000>;
786def VSSRLRN_HU_W : LSX3R_VVV<0x71090000>;
787def VSSRLRN_WU_D : LSX3R_VVV<0x71098000>;
788def VSSRARN_BU_H : LSX3R_VVV<0x710a8000>;
789def VSSRARN_HU_W : LSX3R_VVV<0x710b0000>;
790def VSSRARN_WU_D : LSX3R_VVV<0x710b8000>;
791
792def VSSRLRNI_B_H : LSX2RI4_VVVI<0x73504000>;
793def VSSRLRNI_H_W : LSX2RI5_VVVI<0x73508000>;
794def VSSRLRNI_W_D : LSX2RI6_VVVI<0x73510000>;
795def VSSRLRNI_D_Q : LSX2RI7_VVVI<0x73520000>;
796def VSSRARNI_B_H : LSX2RI4_VVVI<0x73684000>;
797def VSSRARNI_H_W : LSX2RI5_VVVI<0x73688000>;
798def VSSRARNI_W_D : LSX2RI6_VVVI<0x73690000>;
799def VSSRARNI_D_Q : LSX2RI7_VVVI<0x736a0000>;
800def VSSRLRNI_BU_H : LSX2RI4_VVVI<0x73544000>;
801def VSSRLRNI_HU_W : LSX2RI5_VVVI<0x73548000>;
802def VSSRLRNI_WU_D : LSX2RI6_VVVI<0x73550000>;
803def VSSRLRNI_DU_Q : LSX2RI7_VVVI<0x73560000>;
804def VSSRARNI_BU_H : LSX2RI4_VVVI<0x736c4000>;
805def VSSRARNI_HU_W : LSX2RI5_VVVI<0x736c8000>;
806def VSSRARNI_WU_D : LSX2RI6_VVVI<0x736d0000>;
807def VSSRARNI_DU_Q : LSX2RI7_VVVI<0x736e0000>;
808
809def VCLO_B : LSX2R_VV<0x729c0000>;
810def VCLO_H : LSX2R_VV<0x729c0400>;
811def VCLO_W : LSX2R_VV<0x729c0800>;
812def VCLO_D : LSX2R_VV<0x729c0c00>;
813def VCLZ_B : LSX2R_VV<0x729c1000>;
814def VCLZ_H : LSX2R_VV<0x729c1400>;
815def VCLZ_W : LSX2R_VV<0x729c1800>;
816def VCLZ_D : LSX2R_VV<0x729c1c00>;
817
818def VPCNT_B : LSX2R_VV<0x729c2000>;
819def VPCNT_H : LSX2R_VV<0x729c2400>;
820def VPCNT_W : LSX2R_VV<0x729c2800>;
821def VPCNT_D : LSX2R_VV<0x729c2c00>;
822
823def VBITCLR_B : LSX3R_VVV<0x710c0000>;
824def VBITCLR_H : LSX3R_VVV<0x710c8000>;
825def VBITCLR_W : LSX3R_VVV<0x710d0000>;
826def VBITCLR_D : LSX3R_VVV<0x710d8000>;
827def VBITCLRI_B : LSX2RI3_VVI<0x73102000>;
828def VBITCLRI_H : LSX2RI4_VVI<0x73104000>;
829def VBITCLRI_W : LSX2RI5_VVI<0x73108000>;
830def VBITCLRI_D : LSX2RI6_VVI<0x73110000>;
831
832def VBITSET_B : LSX3R_VVV<0x710e0000>;
833def VBITSET_H : LSX3R_VVV<0x710e8000>;
834def VBITSET_W : LSX3R_VVV<0x710f0000>;
835def VBITSET_D : LSX3R_VVV<0x710f8000>;
836def VBITSETI_B : LSX2RI3_VVI<0x73142000>;
837def VBITSETI_H : LSX2RI4_VVI<0x73144000>;
838def VBITSETI_W : LSX2RI5_VVI<0x73148000>;
839def VBITSETI_D : LSX2RI6_VVI<0x73150000>;
840
841def VBITREV_B : LSX3R_VVV<0x71100000>;
842def VBITREV_H : LSX3R_VVV<0x71108000>;
843def VBITREV_W : LSX3R_VVV<0x71110000>;
844def VBITREV_D : LSX3R_VVV<0x71118000>;
845def VBITREVI_B : LSX2RI3_VVI<0x73182000>;
846def VBITREVI_H : LSX2RI4_VVI<0x73184000>;
847def VBITREVI_W : LSX2RI5_VVI<0x73188000>;
848def VBITREVI_D : LSX2RI6_VVI<0x73190000>;
849
850def VFRSTP_B : LSX3R_VVVV<0x712b0000>;
851def VFRSTP_H : LSX3R_VVVV<0x712b8000>;
852def VFRSTPI_B : LSX2RI5_VVVI<0x729a0000>;
853def VFRSTPI_H : LSX2RI5_VVVI<0x729a8000>;
854
855def VFADD_S : LSX3R_VVV<0x71308000>;
856def VFADD_D : LSX3R_VVV<0x71310000>;
857def VFSUB_S : LSX3R_VVV<0x71328000>;
858def VFSUB_D : LSX3R_VVV<0x71330000>;
859def VFMUL_S : LSX3R_VVV<0x71388000>;
860def VFMUL_D : LSX3R_VVV<0x71390000>;
861def VFDIV_S : LSX3R_VVV<0x713a8000>;
862def VFDIV_D : LSX3R_VVV<0x713b0000>;
863
864def VFMADD_S : LSX4R_VVVV<0x09100000>;
865def VFMADD_D : LSX4R_VVVV<0x09200000>;
866def VFMSUB_S : LSX4R_VVVV<0x09500000>;
867def VFMSUB_D : LSX4R_VVVV<0x09600000>;
868def VFNMADD_S : LSX4R_VVVV<0x09900000>;
869def VFNMADD_D : LSX4R_VVVV<0x09a00000>;
870def VFNMSUB_S : LSX4R_VVVV<0x09d00000>;
871def VFNMSUB_D : LSX4R_VVVV<0x09e00000>;
872
873def VFMAX_S : LSX3R_VVV<0x713c8000>;
874def VFMAX_D : LSX3R_VVV<0x713d0000>;
875def VFMIN_S : LSX3R_VVV<0x713e8000>;
876def VFMIN_D : LSX3R_VVV<0x713f0000>;
877
878def VFMAXA_S : LSX3R_VVV<0x71408000>;
879def VFMAXA_D : LSX3R_VVV<0x71410000>;
880def VFMINA_S : LSX3R_VVV<0x71428000>;
881def VFMINA_D : LSX3R_VVV<0x71430000>;
882
883def VFLOGB_S : LSX2R_VV<0x729cc400>;
884def VFLOGB_D : LSX2R_VV<0x729cc800>;
885
886def VFCLASS_S : LSX2R_VV<0x729cd400>;
887def VFCLASS_D : LSX2R_VV<0x729cd800>;
888
889def VFSQRT_S : LSX2R_VV<0x729ce400>;
890def VFSQRT_D : LSX2R_VV<0x729ce800>;
891def VFRECIP_S : LSX2R_VV<0x729cf400>;
892def VFRECIP_D : LSX2R_VV<0x729cf800>;
893def VFRSQRT_S : LSX2R_VV<0x729d0400>;
894def VFRSQRT_D : LSX2R_VV<0x729d0800>;
895
896def VFCVTL_S_H : LSX2R_VV<0x729de800>;
897def VFCVTH_S_H : LSX2R_VV<0x729dec00>;
898def VFCVTL_D_S : LSX2R_VV<0x729df000>;
899def VFCVTH_D_S : LSX2R_VV<0x729df400>;
900def VFCVT_H_S : LSX3R_VVV<0x71460000>;
901def VFCVT_S_D : LSX3R_VVV<0x71468000>;
902
903def VFRINTRNE_S : LSX2R_VV<0x729d7400>;
904def VFRINTRNE_D : LSX2R_VV<0x729d7800>;
905def VFRINTRZ_S : LSX2R_VV<0x729d6400>;
906def VFRINTRZ_D : LSX2R_VV<0x729d6800>;
907def VFRINTRP_S : LSX2R_VV<0x729d5400>;
908def VFRINTRP_D : LSX2R_VV<0x729d5800>;
909def VFRINTRM_S : LSX2R_VV<0x729d4400>;
910def VFRINTRM_D : LSX2R_VV<0x729d4800>;
911def VFRINT_S : LSX2R_VV<0x729d3400>;
912def VFRINT_D : LSX2R_VV<0x729d3800>;
913
914def VFTINTRNE_W_S : LSX2R_VV<0x729e5000>;
915def VFTINTRNE_L_D : LSX2R_VV<0x729e5400>;
916def VFTINTRZ_W_S : LSX2R_VV<0x729e4800>;
917def VFTINTRZ_L_D : LSX2R_VV<0x729e4c00>;
918def VFTINTRP_W_S : LSX2R_VV<0x729e4000>;
919def VFTINTRP_L_D : LSX2R_VV<0x729e4400>;
920def VFTINTRM_W_S : LSX2R_VV<0x729e3800>;
921def VFTINTRM_L_D : LSX2R_VV<0x729e3c00>;
922def VFTINT_W_S : LSX2R_VV<0x729e3000>;
923def VFTINT_L_D : LSX2R_VV<0x729e3400>;
924def VFTINTRZ_WU_S : LSX2R_VV<0x729e7000>;
925def VFTINTRZ_LU_D : LSX2R_VV<0x729e7400>;
926def VFTINT_WU_S : LSX2R_VV<0x729e5800>;
927def VFTINT_LU_D : LSX2R_VV<0x729e5c00>;
928
929def VFTINTRNE_W_D : LSX3R_VVV<0x714b8000>;
930def VFTINTRZ_W_D : LSX3R_VVV<0x714b0000>;
931def VFTINTRP_W_D : LSX3R_VVV<0x714a8000>;
932def VFTINTRM_W_D : LSX3R_VVV<0x714a0000>;
933def VFTINT_W_D : LSX3R_VVV<0x71498000>;
934
935def VFTINTRNEL_L_S : LSX2R_VV<0x729ea000>;
936def VFTINTRNEH_L_S : LSX2R_VV<0x729ea400>;
937def VFTINTRZL_L_S : LSX2R_VV<0x729e9800>;
938def VFTINTRZH_L_S : LSX2R_VV<0x729e9c00>;
939def VFTINTRPL_L_S : LSX2R_VV<0x729e9000>;
940def VFTINTRPH_L_S : LSX2R_VV<0x729e9400>;
941def VFTINTRML_L_S : LSX2R_VV<0x729e8800>;
942def VFTINTRMH_L_S : LSX2R_VV<0x729e8c00>;
943def VFTINTL_L_S : LSX2R_VV<0x729e8000>;
944def VFTINTH_L_S : LSX2R_VV<0x729e8400>;
945
946def VFFINT_S_W : LSX2R_VV<0x729e0000>;
947def VFFINT_D_L : LSX2R_VV<0x729e0800>;
948def VFFINT_S_WU : LSX2R_VV<0x729e0400>;
949def VFFINT_D_LU : LSX2R_VV<0x729e0c00>;
950def VFFINTL_D_W : LSX2R_VV<0x729e1000>;
951def VFFINTH_D_W : LSX2R_VV<0x729e1400>;
952def VFFINT_S_L : LSX3R_VVV<0x71480000>;
953
954def VSEQ_B : LSX3R_VVV<0x70000000>;
955def VSEQ_H : LSX3R_VVV<0x70008000>;
956def VSEQ_W : LSX3R_VVV<0x70010000>;
957def VSEQ_D : LSX3R_VVV<0x70018000>;
958def VSEQI_B : LSX2RI5_VVI<0x72800000, simm5>;
959def VSEQI_H : LSX2RI5_VVI<0x72808000, simm5>;
960def VSEQI_W : LSX2RI5_VVI<0x72810000, simm5>;
961def VSEQI_D : LSX2RI5_VVI<0x72818000, simm5>;
962
963def VSLE_B : LSX3R_VVV<0x70020000>;
964def VSLE_H : LSX3R_VVV<0x70028000>;
965def VSLE_W : LSX3R_VVV<0x70030000>;
966def VSLE_D : LSX3R_VVV<0x70038000>;
967def VSLEI_B : LSX2RI5_VVI<0x72820000, simm5>;
968def VSLEI_H : LSX2RI5_VVI<0x72828000, simm5>;
969def VSLEI_W : LSX2RI5_VVI<0x72830000, simm5>;
970def VSLEI_D : LSX2RI5_VVI<0x72838000, simm5>;
971
972def VSLE_BU : LSX3R_VVV<0x70040000>;
973def VSLE_HU : LSX3R_VVV<0x70048000>;
974def VSLE_WU : LSX3R_VVV<0x70050000>;
975def VSLE_DU : LSX3R_VVV<0x70058000>;
976def VSLEI_BU : LSX2RI5_VVI<0x72840000>;
977def VSLEI_HU : LSX2RI5_VVI<0x72848000>;
978def VSLEI_WU : LSX2RI5_VVI<0x72850000>;
979def VSLEI_DU : LSX2RI5_VVI<0x72858000>;
980
981def VSLT_B : LSX3R_VVV<0x70060000>;
982def VSLT_H : LSX3R_VVV<0x70068000>;
983def VSLT_W : LSX3R_VVV<0x70070000>;
984def VSLT_D : LSX3R_VVV<0x70078000>;
985def VSLTI_B : LSX2RI5_VVI<0x72860000, simm5>;
986def VSLTI_H : LSX2RI5_VVI<0x72868000, simm5>;
987def VSLTI_W : LSX2RI5_VVI<0x72870000, simm5>;
988def VSLTI_D : LSX2RI5_VVI<0x72878000, simm5>;
989
990def VSLT_BU : LSX3R_VVV<0x70080000>;
991def VSLT_HU : LSX3R_VVV<0x70088000>;
992def VSLT_WU : LSX3R_VVV<0x70090000>;
993def VSLT_DU : LSX3R_VVV<0x70098000>;
994def VSLTI_BU : LSX2RI5_VVI<0x72880000>;
995def VSLTI_HU : LSX2RI5_VVI<0x72888000>;
996def VSLTI_WU : LSX2RI5_VVI<0x72890000>;
997def VSLTI_DU : LSX2RI5_VVI<0x72898000>;
998
999def VFCMP_CAF_S : LSX3R_VVV<0x0c500000>;
1000def VFCMP_SAF_S : LSX3R_VVV<0x0c508000>;
1001def VFCMP_CLT_S : LSX3R_VVV<0x0c510000>;
1002def VFCMP_SLT_S : LSX3R_VVV<0x0c518000>;
1003def VFCMP_CEQ_S : LSX3R_VVV<0x0c520000>;
1004def VFCMP_SEQ_S : LSX3R_VVV<0x0c528000>;
1005def VFCMP_CLE_S : LSX3R_VVV<0x0c530000>;
1006def VFCMP_SLE_S : LSX3R_VVV<0x0c538000>;
1007def VFCMP_CUN_S : LSX3R_VVV<0x0c540000>;
1008def VFCMP_SUN_S : LSX3R_VVV<0x0c548000>;
1009def VFCMP_CULT_S : LSX3R_VVV<0x0c550000>;
1010def VFCMP_SULT_S : LSX3R_VVV<0x0c558000>;
1011def VFCMP_CUEQ_S : LSX3R_VVV<0x0c560000>;
1012def VFCMP_SUEQ_S : LSX3R_VVV<0x0c568000>;
1013def VFCMP_CULE_S : LSX3R_VVV<0x0c570000>;
1014def VFCMP_SULE_S : LSX3R_VVV<0x0c578000>;
1015def VFCMP_CNE_S : LSX3R_VVV<0x0c580000>;
1016def VFCMP_SNE_S : LSX3R_VVV<0x0c588000>;
1017def VFCMP_COR_S : LSX3R_VVV<0x0c5a0000>;
1018def VFCMP_SOR_S : LSX3R_VVV<0x0c5a8000>;
1019def VFCMP_CUNE_S : LSX3R_VVV<0x0c5c0000>;
1020def VFCMP_SUNE_S : LSX3R_VVV<0x0c5c8000>;
1021
1022def VFCMP_CAF_D : LSX3R_VVV<0x0c600000>;
1023def VFCMP_SAF_D : LSX3R_VVV<0x0c608000>;
1024def VFCMP_CLT_D : LSX3R_VVV<0x0c610000>;
1025def VFCMP_SLT_D : LSX3R_VVV<0x0c618000>;
1026def VFCMP_CEQ_D : LSX3R_VVV<0x0c620000>;
1027def VFCMP_SEQ_D : LSX3R_VVV<0x0c628000>;
1028def VFCMP_CLE_D : LSX3R_VVV<0x0c630000>;
1029def VFCMP_SLE_D : LSX3R_VVV<0x0c638000>;
1030def VFCMP_CUN_D : LSX3R_VVV<0x0c640000>;
1031def VFCMP_SUN_D : LSX3R_VVV<0x0c648000>;
1032def VFCMP_CULT_D : LSX3R_VVV<0x0c650000>;
1033def VFCMP_SULT_D : LSX3R_VVV<0x0c658000>;
1034def VFCMP_CUEQ_D : LSX3R_VVV<0x0c660000>;
1035def VFCMP_SUEQ_D : LSX3R_VVV<0x0c668000>;
1036def VFCMP_CULE_D : LSX3R_VVV<0x0c670000>;
1037def VFCMP_SULE_D : LSX3R_VVV<0x0c678000>;
1038def VFCMP_CNE_D : LSX3R_VVV<0x0c680000>;
1039def VFCMP_SNE_D : LSX3R_VVV<0x0c688000>;
1040def VFCMP_COR_D : LSX3R_VVV<0x0c6a0000>;
1041def VFCMP_SOR_D : LSX3R_VVV<0x0c6a8000>;
1042def VFCMP_CUNE_D : LSX3R_VVV<0x0c6c0000>;
1043def VFCMP_SUNE_D : LSX3R_VVV<0x0c6c8000>;
1044
1045def VBITSEL_V : LSX4R_VVVV<0x0d100000>;
1046
1047def VBITSELI_B : LSX2RI8_VVVI<0x73c40000>;
1048
1049def VSETEQZ_V : LSX2R_CV<0x729c9800>;
1050def VSETNEZ_V : LSX2R_CV<0x729c9c00>;
1051def VSETANYEQZ_B : LSX2R_CV<0x729ca000>;
1052def VSETANYEQZ_H : LSX2R_CV<0x729ca400>;
1053def VSETANYEQZ_W : LSX2R_CV<0x729ca800>;
1054def VSETANYEQZ_D : LSX2R_CV<0x729cac00>;
1055def VSETALLNEZ_B : LSX2R_CV<0x729cb000>;
1056def VSETALLNEZ_H : LSX2R_CV<0x729cb400>;
1057def VSETALLNEZ_W : LSX2R_CV<0x729cb800>;
1058def VSETALLNEZ_D : LSX2R_CV<0x729cbc00>;
1059
1060def VINSGR2VR_B : LSX2RI4_VVRI<0x72eb8000>;
1061def VINSGR2VR_H : LSX2RI3_VVRI<0x72ebc000>;
1062def VINSGR2VR_W : LSX2RI2_VVRI<0x72ebe000>;
1063def VINSGR2VR_D : LSX2RI1_VVRI<0x72ebf000>;
1064def VPICKVE2GR_B : LSX2RI4_RVI<0x72ef8000>;
1065def VPICKVE2GR_H : LSX2RI3_RVI<0x72efc000>;
1066def VPICKVE2GR_W : LSX2RI2_RVI<0x72efe000>;
1067def VPICKVE2GR_D : LSX2RI1_RVI<0x72eff000>;
1068def VPICKVE2GR_BU : LSX2RI4_RVI<0x72f38000>;
1069def VPICKVE2GR_HU : LSX2RI3_RVI<0x72f3c000>;
1070def VPICKVE2GR_WU : LSX2RI2_RVI<0x72f3e000>;
1071def VPICKVE2GR_DU : LSX2RI1_RVI<0x72f3f000>;
1072
1073def VREPLGR2VR_B : LSX2R_VR<0x729f0000>;
1074def VREPLGR2VR_H : LSX2R_VR<0x729f0400>;
1075def VREPLGR2VR_W : LSX2R_VR<0x729f0800>;
1076def VREPLGR2VR_D : LSX2R_VR<0x729f0c00>;
1077
1078def VREPLVE_B : LSX3R_VVR<0x71220000>;
1079def VREPLVE_H : LSX3R_VVR<0x71228000>;
1080def VREPLVE_W : LSX3R_VVR<0x71230000>;
1081def VREPLVE_D : LSX3R_VVR<0x71238000>;
1082def VREPLVEI_B : LSX2RI4_VVI<0x72f78000>;
1083def VREPLVEI_H : LSX2RI3_VVI<0x72f7c000>;
1084def VREPLVEI_W : LSX2RI2_VVI<0x72f7e000>;
1085def VREPLVEI_D : LSX2RI1_VVI<0x72f7f000>;
1086
1087def VBSLL_V : LSX2RI5_VVI<0x728e0000>;
1088def VBSRL_V : LSX2RI5_VVI<0x728e8000>;
1089
1090def VPACKEV_B : LSX3R_VVV<0x71160000>;
1091def VPACKEV_H : LSX3R_VVV<0x71168000>;
1092def VPACKEV_W : LSX3R_VVV<0x71170000>;
1093def VPACKEV_D : LSX3R_VVV<0x71178000>;
1094def VPACKOD_B : LSX3R_VVV<0x71180000>;
1095def VPACKOD_H : LSX3R_VVV<0x71188000>;
1096def VPACKOD_W : LSX3R_VVV<0x71190000>;
1097def VPACKOD_D : LSX3R_VVV<0x71198000>;
1098
1099def VPICKEV_B : LSX3R_VVV<0x711e0000>;
1100def VPICKEV_H : LSX3R_VVV<0x711e8000>;
1101def VPICKEV_W : LSX3R_VVV<0x711f0000>;
1102def VPICKEV_D : LSX3R_VVV<0x711f8000>;
1103def VPICKOD_B : LSX3R_VVV<0x71200000>;
1104def VPICKOD_H : LSX3R_VVV<0x71208000>;
1105def VPICKOD_W : LSX3R_VVV<0x71210000>;
1106def VPICKOD_D : LSX3R_VVV<0x71218000>;
1107
1108def VILVL_B : LSX3R_VVV<0x711a0000>;
1109def VILVL_H : LSX3R_VVV<0x711a8000>;
1110def VILVL_W : LSX3R_VVV<0x711b0000>;
1111def VILVL_D : LSX3R_VVV<0x711b8000>;
1112def VILVH_B : LSX3R_VVV<0x711c0000>;
1113def VILVH_H : LSX3R_VVV<0x711c8000>;
1114def VILVH_W : LSX3R_VVV<0x711d0000>;
1115def VILVH_D : LSX3R_VVV<0x711d8000>;
1116
1117def VSHUF_B : LSX4R_VVVV<0x0d500000>;
1118
1119def VSHUF_H : LSX3R_VVVV<0x717a8000>;
1120def VSHUF_W : LSX3R_VVVV<0x717b0000>;
1121def VSHUF_D : LSX3R_VVVV<0x717b8000>;
1122
1123def VSHUF4I_B : LSX2RI8_VVI<0x73900000>;
1124def VSHUF4I_H : LSX2RI8_VVI<0x73940000>;
1125def VSHUF4I_W : LSX2RI8_VVI<0x73980000>;
1126def VSHUF4I_D : LSX2RI8_VVVI<0x739c0000>;
1127
1128def VPERMI_W : LSX2RI8_VVVI<0x73e40000>;
1129
1130def VEXTRINS_D : LSX2RI8_VVVI<0x73800000>;
1131def VEXTRINS_W : LSX2RI8_VVVI<0x73840000>;
1132def VEXTRINS_H : LSX2RI8_VVVI<0x73880000>;
1133def VEXTRINS_B : LSX2RI8_VVVI<0x738c0000>;
1134} // mayLoad = 0, mayStore = 0
1135
1136let mayLoad = 1, mayStore = 0 in {
1137def VLD : LSX2RI12_Load<0x2c000000>;
1138def VLDX : LSX3R_Load<0x38400000>;
1139
1140def VLDREPL_B : LSX2RI12_Load<0x30800000>;
1141def VLDREPL_H : LSX2RI11_Load<0x30400000>;
1142def VLDREPL_W : LSX2RI10_Load<0x30200000>;
1143def VLDREPL_D : LSX2RI9_Load<0x30100000>;
1144} // mayLoad = 1, mayStore = 0
1145
1146let mayLoad = 0, mayStore = 1 in {
1147def VST : LSX2RI12_Store<0x2c400000>;
1148def VSTX : LSX3R_Store<0x38440000>;
1149
1150def VSTELM_B : LSX2RI8I4_VRII<0x31800000>;
1151def VSTELM_H : LSX2RI8I3_VRII<0x31400000, simm8_lsl1>;
1152def VSTELM_W : LSX2RI8I2_VRII<0x31200000, simm8_lsl2>;
1153def VSTELM_D : LSX2RI8I1_VRII<0x31100000, simm8_lsl3>;
1154} // mayLoad = 0, mayStore = 1
1155
1156} // hasSideEffects = 0, Predicates = [HasExtLSX]
1157
1158/// Pseudo-instructions
1159
1160let Predicates = [HasExtLSX] in {
1161
1162let hasSideEffects = 0, mayLoad = 0, mayStore = 0, isCodeGenOnly = 0,
1163    isAsmParserOnly = 1 in {
1164def PseudoVREPLI_B : Pseudo<(outs LSX128:$vd), (ins simm10:$imm), [],
1165                            "vrepli.b", "$vd, $imm">;
1166def PseudoVREPLI_H : Pseudo<(outs LSX128:$vd), (ins simm10:$imm), [],
1167                            "vrepli.h", "$vd, $imm">;
1168def PseudoVREPLI_W : Pseudo<(outs LSX128:$vd), (ins simm10:$imm), [],
1169                            "vrepli.w", "$vd, $imm">;
1170def PseudoVREPLI_D : Pseudo<(outs LSX128:$vd), (ins simm10:$imm), [],
1171                            "vrepli.d", "$vd, $imm">;
1172}
1173
1174def PseudoVBNZ_B : VecCond<loongarch_vall_nonzero, v16i8>;
1175def PseudoVBNZ_H : VecCond<loongarch_vall_nonzero, v8i16>;
1176def PseudoVBNZ_W : VecCond<loongarch_vall_nonzero, v4i32>;
1177def PseudoVBNZ_D : VecCond<loongarch_vall_nonzero, v2i64>;
1178def PseudoVBNZ : VecCond<loongarch_vany_nonzero, v16i8>;
1179
1180def PseudoVBZ_B : VecCond<loongarch_vall_zero, v16i8>;
1181def PseudoVBZ_H : VecCond<loongarch_vall_zero, v8i16>;
1182def PseudoVBZ_W : VecCond<loongarch_vall_zero, v4i32>;
1183def PseudoVBZ_D : VecCond<loongarch_vall_zero, v2i64>;
1184def PseudoVBZ : VecCond<loongarch_vany_zero, v16i8>;
1185
1186} // Predicates = [HasExtLSX]
1187
1188multiclass PatVr<SDPatternOperator OpNode, string Inst> {
1189  def : Pat<(v16i8 (OpNode (v16i8 LSX128:$vj))),
1190            (!cast<LAInst>(Inst#"_B") LSX128:$vj)>;
1191  def : Pat<(v8i16 (OpNode (v8i16 LSX128:$vj))),
1192            (!cast<LAInst>(Inst#"_H") LSX128:$vj)>;
1193  def : Pat<(v4i32 (OpNode (v4i32 LSX128:$vj))),
1194            (!cast<LAInst>(Inst#"_W") LSX128:$vj)>;
1195  def : Pat<(v2i64 (OpNode (v2i64 LSX128:$vj))),
1196            (!cast<LAInst>(Inst#"_D") LSX128:$vj)>;
1197}
1198
1199multiclass PatVrF<SDPatternOperator OpNode, string Inst> {
1200  def : Pat<(v4f32 (OpNode (v4f32 LSX128:$vj))),
1201            (!cast<LAInst>(Inst#"_S") LSX128:$vj)>;
1202  def : Pat<(v2f64 (OpNode (v2f64 LSX128:$vj))),
1203            (!cast<LAInst>(Inst#"_D") LSX128:$vj)>;
1204}
1205
1206multiclass PatVrVr<SDPatternOperator OpNode, string Inst> {
1207  def : Pat<(OpNode (v16i8 LSX128:$vj), (v16i8 LSX128:$vk)),
1208            (!cast<LAInst>(Inst#"_B") LSX128:$vj, LSX128:$vk)>;
1209  def : Pat<(OpNode (v8i16 LSX128:$vj), (v8i16 LSX128:$vk)),
1210            (!cast<LAInst>(Inst#"_H") LSX128:$vj, LSX128:$vk)>;
1211  def : Pat<(OpNode (v4i32 LSX128:$vj), (v4i32 LSX128:$vk)),
1212            (!cast<LAInst>(Inst#"_W") LSX128:$vj, LSX128:$vk)>;
1213  def : Pat<(OpNode (v2i64 LSX128:$vj), (v2i64 LSX128:$vk)),
1214            (!cast<LAInst>(Inst#"_D") LSX128:$vj, LSX128:$vk)>;
1215}
1216
1217multiclass PatVrVrF<SDPatternOperator OpNode, string Inst> {
1218  def : Pat<(OpNode (v4f32 LSX128:$vj), (v4f32 LSX128:$vk)),
1219            (!cast<LAInst>(Inst#"_S") LSX128:$vj, LSX128:$vk)>;
1220  def : Pat<(OpNode (v2f64 LSX128:$vj), (v2f64 LSX128:$vk)),
1221            (!cast<LAInst>(Inst#"_D") LSX128:$vj, LSX128:$vk)>;
1222}
1223
1224multiclass PatVrVrU<SDPatternOperator OpNode, string Inst> {
1225  def : Pat<(OpNode (v16i8 LSX128:$vj), (v16i8 LSX128:$vk)),
1226            (!cast<LAInst>(Inst#"_BU") LSX128:$vj, LSX128:$vk)>;
1227  def : Pat<(OpNode (v8i16 LSX128:$vj), (v8i16 LSX128:$vk)),
1228            (!cast<LAInst>(Inst#"_HU") LSX128:$vj, LSX128:$vk)>;
1229  def : Pat<(OpNode (v4i32 LSX128:$vj), (v4i32 LSX128:$vk)),
1230            (!cast<LAInst>(Inst#"_WU") LSX128:$vj, LSX128:$vk)>;
1231  def : Pat<(OpNode (v2i64 LSX128:$vj), (v2i64 LSX128:$vk)),
1232            (!cast<LAInst>(Inst#"_DU") LSX128:$vj, LSX128:$vk)>;
1233}
1234
1235multiclass PatVrSimm5<SDPatternOperator OpNode, string Inst> {
1236  def : Pat<(OpNode (v16i8 LSX128:$vj), (v16i8 (SplatPat_simm5 simm5:$imm))),
1237            (!cast<LAInst>(Inst#"_B") LSX128:$vj, simm5:$imm)>;
1238  def : Pat<(OpNode (v8i16 LSX128:$vj), (v8i16 (SplatPat_simm5 simm5:$imm))),
1239            (!cast<LAInst>(Inst#"_H") LSX128:$vj, simm5:$imm)>;
1240  def : Pat<(OpNode (v4i32 LSX128:$vj), (v4i32 (SplatPat_simm5 simm5:$imm))),
1241            (!cast<LAInst>(Inst#"_W") LSX128:$vj, simm5:$imm)>;
1242  def : Pat<(OpNode (v2i64 LSX128:$vj), (v2i64 (SplatPat_simm5 simm5:$imm))),
1243            (!cast<LAInst>(Inst#"_D") LSX128:$vj, simm5:$imm)>;
1244}
1245
1246multiclass PatVrUimm5<SDPatternOperator OpNode, string Inst> {
1247  def : Pat<(OpNode (v16i8 LSX128:$vj), (v16i8 (SplatPat_uimm5 uimm5:$imm))),
1248            (!cast<LAInst>(Inst#"_BU") LSX128:$vj, uimm5:$imm)>;
1249  def : Pat<(OpNode (v8i16 LSX128:$vj), (v8i16 (SplatPat_uimm5 uimm5:$imm))),
1250            (!cast<LAInst>(Inst#"_HU") LSX128:$vj, uimm5:$imm)>;
1251  def : Pat<(OpNode (v4i32 LSX128:$vj), (v4i32 (SplatPat_uimm5 uimm5:$imm))),
1252            (!cast<LAInst>(Inst#"_WU") LSX128:$vj, uimm5:$imm)>;
1253  def : Pat<(OpNode (v2i64 LSX128:$vj), (v2i64 (SplatPat_uimm5 uimm5:$imm))),
1254            (!cast<LAInst>(Inst#"_DU") LSX128:$vj, uimm5:$imm)>;
1255}
1256
1257multiclass PatVrVrVr<SDPatternOperator OpNode, string Inst> {
1258  def : Pat<(OpNode (v16i8 LSX128:$vd), (v16i8 LSX128:$vj), (v16i8 LSX128:$vk)),
1259            (!cast<LAInst>(Inst#"_B") LSX128:$vd, LSX128:$vj, LSX128:$vk)>;
1260  def : Pat<(OpNode (v8i16 LSX128:$vd), (v8i16 LSX128:$vj), (v8i16 LSX128:$vk)),
1261            (!cast<LAInst>(Inst#"_H") LSX128:$vd, LSX128:$vj, LSX128:$vk)>;
1262  def : Pat<(OpNode (v4i32 LSX128:$vd), (v4i32 LSX128:$vj), (v4i32 LSX128:$vk)),
1263            (!cast<LAInst>(Inst#"_W") LSX128:$vd, LSX128:$vj, LSX128:$vk)>;
1264  def : Pat<(OpNode (v2i64 LSX128:$vd), (v2i64 LSX128:$vj), (v2i64 LSX128:$vk)),
1265            (!cast<LAInst>(Inst#"_D") LSX128:$vd, LSX128:$vj, LSX128:$vk)>;
1266}
1267
1268multiclass PatShiftVrVr<SDPatternOperator OpNode, string Inst> {
1269  def : Pat<(OpNode (v16i8 LSX128:$vj), (and vsplati8_imm_eq_7,
1270                                             (v16i8 LSX128:$vk))),
1271            (!cast<LAInst>(Inst#"_B") LSX128:$vj, LSX128:$vk)>;
1272  def : Pat<(OpNode (v8i16 LSX128:$vj), (and vsplati16_imm_eq_15,
1273                                             (v8i16 LSX128:$vk))),
1274            (!cast<LAInst>(Inst#"_H") LSX128:$vj, LSX128:$vk)>;
1275  def : Pat<(OpNode (v4i32 LSX128:$vj), (and vsplati32_imm_eq_31,
1276                                             (v4i32 LSX128:$vk))),
1277            (!cast<LAInst>(Inst#"_W") LSX128:$vj, LSX128:$vk)>;
1278  def : Pat<(OpNode (v2i64 LSX128:$vj), (and vsplati64_imm_eq_63,
1279                                             (v2i64 LSX128:$vk))),
1280            (!cast<LAInst>(Inst#"_D") LSX128:$vj, LSX128:$vk)>;
1281}
1282
1283multiclass PatShiftVrUimm<SDPatternOperator OpNode, string Inst> {
1284  def : Pat<(OpNode (v16i8 LSX128:$vj), (v16i8 (SplatPat_uimm3 uimm3:$imm))),
1285            (!cast<LAInst>(Inst#"_B") LSX128:$vj, uimm3:$imm)>;
1286  def : Pat<(OpNode (v8i16 LSX128:$vj), (v8i16 (SplatPat_uimm4 uimm4:$imm))),
1287            (!cast<LAInst>(Inst#"_H") LSX128:$vj, uimm4:$imm)>;
1288  def : Pat<(OpNode (v4i32 LSX128:$vj), (v4i32 (SplatPat_uimm5 uimm5:$imm))),
1289            (!cast<LAInst>(Inst#"_W") LSX128:$vj, uimm5:$imm)>;
1290  def : Pat<(OpNode (v2i64 LSX128:$vj), (v2i64 (SplatPat_uimm6 uimm6:$imm))),
1291            (!cast<LAInst>(Inst#"_D") LSX128:$vj, uimm6:$imm)>;
1292}
1293
1294multiclass PatCCVrSimm5<CondCode CC, string Inst> {
1295  def : Pat<(v16i8 (setcc (v16i8 LSX128:$vj),
1296                          (v16i8 (SplatPat_simm5 simm5:$imm)), CC)),
1297            (!cast<LAInst>(Inst#"_B") LSX128:$vj, simm5:$imm)>;
1298  def : Pat<(v8i16 (setcc (v8i16 LSX128:$vj),
1299                          (v8i16 (SplatPat_simm5 simm5:$imm)), CC)),
1300            (!cast<LAInst>(Inst#"_H") LSX128:$vj, simm5:$imm)>;
1301  def : Pat<(v4i32 (setcc (v4i32 LSX128:$vj),
1302                          (v4i32 (SplatPat_simm5 simm5:$imm)), CC)),
1303            (!cast<LAInst>(Inst#"_W") LSX128:$vj, simm5:$imm)>;
1304  def : Pat<(v2i64 (setcc (v2i64 LSX128:$vj),
1305                          (v2i64 (SplatPat_simm5 simm5:$imm)), CC)),
1306            (!cast<LAInst>(Inst#"_D") LSX128:$vj, simm5:$imm)>;
1307}
1308
1309multiclass PatCCVrUimm5<CondCode CC, string Inst> {
1310  def : Pat<(v16i8 (setcc (v16i8 LSX128:$vj),
1311                          (v16i8 (SplatPat_uimm5 uimm5:$imm)), CC)),
1312            (!cast<LAInst>(Inst#"_BU") LSX128:$vj, uimm5:$imm)>;
1313  def : Pat<(v8i16 (setcc (v8i16 LSX128:$vj),
1314                          (v8i16 (SplatPat_uimm5 uimm5:$imm)), CC)),
1315            (!cast<LAInst>(Inst#"_HU") LSX128:$vj, uimm5:$imm)>;
1316  def : Pat<(v4i32 (setcc (v4i32 LSX128:$vj),
1317                          (v4i32 (SplatPat_uimm5 uimm5:$imm)), CC)),
1318            (!cast<LAInst>(Inst#"_WU") LSX128:$vj, uimm5:$imm)>;
1319  def : Pat<(v2i64 (setcc (v2i64 LSX128:$vj),
1320                          (v2i64 (SplatPat_uimm5 uimm5:$imm)), CC)),
1321            (!cast<LAInst>(Inst#"_DU") LSX128:$vj, uimm5:$imm)>;
1322}
1323
1324multiclass PatCCVrVr<CondCode CC, string Inst> {
1325  def : Pat<(v16i8 (setcc (v16i8 LSX128:$vj), (v16i8 LSX128:$vk), CC)),
1326            (!cast<LAInst>(Inst#"_B") LSX128:$vj, LSX128:$vk)>;
1327  def : Pat<(v8i16 (setcc (v8i16 LSX128:$vj), (v8i16 LSX128:$vk), CC)),
1328            (!cast<LAInst>(Inst#"_H") LSX128:$vj, LSX128:$vk)>;
1329  def : Pat<(v4i32 (setcc (v4i32 LSX128:$vj), (v4i32 LSX128:$vk), CC)),
1330            (!cast<LAInst>(Inst#"_W") LSX128:$vj, LSX128:$vk)>;
1331  def : Pat<(v2i64 (setcc (v2i64 LSX128:$vj), (v2i64 LSX128:$vk), CC)),
1332            (!cast<LAInst>(Inst#"_D") LSX128:$vj, LSX128:$vk)>;
1333}
1334
1335multiclass PatCCVrVrU<CondCode CC, string Inst> {
1336  def : Pat<(v16i8 (setcc (v16i8 LSX128:$vj), (v16i8 LSX128:$vk), CC)),
1337            (!cast<LAInst>(Inst#"_BU") LSX128:$vj, LSX128:$vk)>;
1338  def : Pat<(v8i16 (setcc (v8i16 LSX128:$vj), (v8i16 LSX128:$vk), CC)),
1339            (!cast<LAInst>(Inst#"_HU") LSX128:$vj, LSX128:$vk)>;
1340  def : Pat<(v4i32 (setcc (v4i32 LSX128:$vj), (v4i32 LSX128:$vk), CC)),
1341            (!cast<LAInst>(Inst#"_WU") LSX128:$vj, LSX128:$vk)>;
1342  def : Pat<(v2i64 (setcc (v2i64 LSX128:$vj), (v2i64 LSX128:$vk), CC)),
1343            (!cast<LAInst>(Inst#"_DU") LSX128:$vj, LSX128:$vk)>;
1344}
1345
1346multiclass PatCCVrVrF<CondCode CC, string Inst> {
1347  def : Pat<(v4i32 (setcc (v4f32 LSX128:$vj), (v4f32 LSX128:$vk), CC)),
1348            (!cast<LAInst>(Inst#"_S") LSX128:$vj, LSX128:$vk)>;
1349  def : Pat<(v2i64 (setcc (v2f64 LSX128:$vj), (v2f64 LSX128:$vk), CC)),
1350            (!cast<LAInst>(Inst#"_D") LSX128:$vj, LSX128:$vk)>;
1351}
1352
1353let Predicates = [HasExtLSX] in {
1354
1355// VADD_{B/H/W/D}
1356defm : PatVrVr<add, "VADD">;
1357// VSUB_{B/H/W/D}
1358defm : PatVrVr<sub, "VSUB">;
1359
1360// VADDI_{B/H/W/D}U
1361defm : PatVrUimm5<add, "VADDI">;
1362// VSUBI_{B/H/W/D}U
1363defm : PatVrUimm5<sub, "VSUBI">;
1364
1365// VNEG_{B/H/W/D}
1366def : Pat<(sub immAllZerosV, (v16i8 LSX128:$vj)), (VNEG_B LSX128:$vj)>;
1367def : Pat<(sub immAllZerosV, (v8i16 LSX128:$vj)), (VNEG_H LSX128:$vj)>;
1368def : Pat<(sub immAllZerosV, (v4i32 LSX128:$vj)), (VNEG_W LSX128:$vj)>;
1369def : Pat<(sub immAllZerosV, (v2i64 LSX128:$vj)), (VNEG_D LSX128:$vj)>;
1370
1371// VMAX[I]_{B/H/W/D}[U]
1372defm : PatVrVr<smax, "VMAX">;
1373defm : PatVrVrU<umax, "VMAX">;
1374defm : PatVrSimm5<smax, "VMAXI">;
1375defm : PatVrUimm5<umax, "VMAXI">;
1376
1377// VMIN[I]_{B/H/W/D}[U]
1378defm : PatVrVr<smin, "VMIN">;
1379defm : PatVrVrU<umin, "VMIN">;
1380defm : PatVrSimm5<smin, "VMINI">;
1381defm : PatVrUimm5<umin, "VMINI">;
1382
1383// VMUL_{B/H/W/D}
1384defm : PatVrVr<mul, "VMUL">;
1385
1386// VMUH_{B/H/W/D}[U]
1387defm : PatVrVr<mulhs, "VMUH">;
1388defm : PatVrVrU<mulhu, "VMUH">;
1389
1390// VMADD_{B/H/W/D}
1391defm : PatVrVrVr<muladd, "VMADD">;
1392// VMSUB_{B/H/W/D}
1393defm : PatVrVrVr<mulsub, "VMSUB">;
1394
1395// VDIV_{B/H/W/D}[U]
1396defm : PatVrVr<sdiv, "VDIV">;
1397defm : PatVrVrU<udiv, "VDIV">;
1398
1399// VMOD_{B/H/W/D}[U]
1400defm : PatVrVr<srem, "VMOD">;
1401defm : PatVrVrU<urem, "VMOD">;
1402
1403// VAND_V
1404foreach vt = [v16i8, v8i16, v4i32, v2i64] in
1405def : Pat<(and (vt LSX128:$vj), (vt LSX128:$vk)),
1406          (VAND_V LSX128:$vj, LSX128:$vk)>;
1407// VOR_V
1408foreach vt = [v16i8, v8i16, v4i32, v2i64] in
1409def : Pat<(or (vt LSX128:$vj), (vt LSX128:$vk)),
1410          (VOR_V LSX128:$vj, LSX128:$vk)>;
1411// VXOR_V
1412foreach vt = [v16i8, v8i16, v4i32, v2i64] in
1413def : Pat<(xor (vt LSX128:$vj), (vt LSX128:$vk)),
1414          (VXOR_V LSX128:$vj, LSX128:$vk)>;
1415// VNOR_V
1416foreach vt = [v16i8, v8i16, v4i32, v2i64] in
1417def : Pat<(vnot (or (vt LSX128:$vj), (vt LSX128:$vk))),
1418          (VNOR_V LSX128:$vj, LSX128:$vk)>;
1419
1420// VANDI_B
1421def : Pat<(and (v16i8 LSX128:$vj), (v16i8 (SplatPat_uimm8 uimm8:$imm))),
1422          (VANDI_B LSX128:$vj, uimm8:$imm)>;
1423// VORI_B
1424def : Pat<(or (v16i8 LSX128:$vj), (v16i8 (SplatPat_uimm8 uimm8:$imm))),
1425          (VORI_B LSX128:$vj, uimm8:$imm)>;
1426
1427// VXORI_B
1428def : Pat<(xor (v16i8 LSX128:$vj), (v16i8 (SplatPat_uimm8 uimm8:$imm))),
1429          (VXORI_B LSX128:$vj, uimm8:$imm)>;
1430
1431// VSLL[I]_{B/H/W/D}
1432defm : PatVrVr<shl, "VSLL">;
1433defm : PatShiftVrVr<shl, "VSLL">;
1434defm : PatShiftVrUimm<shl, "VSLLI">;
1435
1436// VSRL[I]_{B/H/W/D}
1437defm : PatVrVr<srl, "VSRL">;
1438defm : PatShiftVrVr<srl, "VSRL">;
1439defm : PatShiftVrUimm<srl, "VSRLI">;
1440
1441// VSRA[I]_{B/H/W/D}
1442defm : PatVrVr<sra, "VSRA">;
1443defm : PatShiftVrVr<sra, "VSRA">;
1444defm : PatShiftVrUimm<sra, "VSRAI">;
1445
1446// VCLZ_{B/H/W/D}
1447defm : PatVr<ctlz, "VCLZ">;
1448
1449// VPCNT_{B/H/W/D}
1450defm : PatVr<ctpop, "VPCNT">;
1451
1452// VBITCLR_{B/H/W/D}
1453def : Pat<(and v16i8:$vj, (vnot (shl vsplat_imm_eq_1, v16i8:$vk))),
1454          (v16i8 (VBITCLR_B v16i8:$vj, v16i8:$vk))>;
1455def : Pat<(and v8i16:$vj, (vnot (shl vsplat_imm_eq_1, v8i16:$vk))),
1456          (v8i16 (VBITCLR_H v8i16:$vj, v8i16:$vk))>;
1457def : Pat<(and v4i32:$vj, (vnot (shl vsplat_imm_eq_1, v4i32:$vk))),
1458          (v4i32 (VBITCLR_W v4i32:$vj, v4i32:$vk))>;
1459def : Pat<(and v2i64:$vj, (vnot (shl vsplat_imm_eq_1, v2i64:$vk))),
1460          (v2i64 (VBITCLR_D v2i64:$vj, v2i64:$vk))>;
1461def : Pat<(and v16i8:$vj, (vnot (shl vsplat_imm_eq_1,
1462                                     (vsplati8imm7 v16i8:$vk)))),
1463          (v16i8 (VBITCLR_B v16i8:$vj, v16i8:$vk))>;
1464def : Pat<(and v8i16:$vj, (vnot (shl vsplat_imm_eq_1,
1465                                     (vsplati16imm15 v8i16:$vk)))),
1466          (v8i16 (VBITCLR_H v8i16:$vj, v8i16:$vk))>;
1467def : Pat<(and v4i32:$vj, (vnot (shl vsplat_imm_eq_1,
1468                                     (vsplati32imm31 v4i32:$vk)))),
1469          (v4i32 (VBITCLR_W v4i32:$vj, v4i32:$vk))>;
1470def : Pat<(and v2i64:$vj, (vnot (shl vsplat_imm_eq_1,
1471                                     (vsplati64imm63 v2i64:$vk)))),
1472          (v2i64 (VBITCLR_D v2i64:$vj, v2i64:$vk))>;
1473
1474// VBITCLRI_{B/H/W/D}
1475def : Pat<(and (v16i8 LSX128:$vj), (v16i8 (vsplat_uimm_inv_pow2 uimm3:$imm))),
1476          (VBITCLRI_B LSX128:$vj, uimm3:$imm)>;
1477def : Pat<(and (v8i16 LSX128:$vj), (v8i16 (vsplat_uimm_inv_pow2 uimm4:$imm))),
1478          (VBITCLRI_H LSX128:$vj, uimm4:$imm)>;
1479def : Pat<(and (v4i32 LSX128:$vj), (v4i32 (vsplat_uimm_inv_pow2 uimm5:$imm))),
1480          (VBITCLRI_W LSX128:$vj, uimm5:$imm)>;
1481def : Pat<(and (v2i64 LSX128:$vj), (v2i64 (vsplat_uimm_inv_pow2 uimm6:$imm))),
1482          (VBITCLRI_D LSX128:$vj, uimm6:$imm)>;
1483
1484// VBITSET_{B/H/W/D}
1485def : Pat<(or v16i8:$vj, (shl vsplat_imm_eq_1, v16i8:$vk)),
1486          (v16i8 (VBITSET_B v16i8:$vj, v16i8:$vk))>;
1487def : Pat<(or v8i16:$vj, (shl vsplat_imm_eq_1, v8i16:$vk)),
1488          (v8i16 (VBITSET_H v8i16:$vj, v8i16:$vk))>;
1489def : Pat<(or v4i32:$vj, (shl vsplat_imm_eq_1, v4i32:$vk)),
1490          (v4i32 (VBITSET_W v4i32:$vj, v4i32:$vk))>;
1491def : Pat<(or v2i64:$vj, (shl vsplat_imm_eq_1, v2i64:$vk)),
1492          (v2i64 (VBITSET_D v2i64:$vj, v2i64:$vk))>;
1493def : Pat<(or v16i8:$vj, (shl vsplat_imm_eq_1, (vsplati8imm7 v16i8:$vk))),
1494          (v16i8 (VBITSET_B v16i8:$vj, v16i8:$vk))>;
1495def : Pat<(or v8i16:$vj, (shl vsplat_imm_eq_1, (vsplati16imm15 v8i16:$vk))),
1496          (v8i16 (VBITSET_H v8i16:$vj, v8i16:$vk))>;
1497def : Pat<(or v4i32:$vj, (shl vsplat_imm_eq_1, (vsplati32imm31 v4i32:$vk))),
1498          (v4i32 (VBITSET_W v4i32:$vj, v4i32:$vk))>;
1499def : Pat<(or v2i64:$vj, (shl vsplat_imm_eq_1, (vsplati64imm63 v2i64:$vk))),
1500          (v2i64 (VBITSET_D v2i64:$vj, v2i64:$vk))>;
1501
1502// VBITSETI_{B/H/W/D}
1503def : Pat<(or (v16i8 LSX128:$vj), (v16i8 (vsplat_uimm_pow2 uimm3:$imm))),
1504          (VBITSETI_B LSX128:$vj, uimm3:$imm)>;
1505def : Pat<(or (v8i16 LSX128:$vj), (v8i16 (vsplat_uimm_pow2 uimm4:$imm))),
1506          (VBITSETI_H LSX128:$vj, uimm4:$imm)>;
1507def : Pat<(or (v4i32 LSX128:$vj), (v4i32 (vsplat_uimm_pow2 uimm5:$imm))),
1508          (VBITSETI_W LSX128:$vj, uimm5:$imm)>;
1509def : Pat<(or (v2i64 LSX128:$vj), (v2i64 (vsplat_uimm_pow2 uimm6:$imm))),
1510          (VBITSETI_D LSX128:$vj, uimm6:$imm)>;
1511
1512// VBITREV_{B/H/W/D}
1513def : Pat<(xor v16i8:$vj, (shl vsplat_imm_eq_1, v16i8:$vk)),
1514          (v16i8 (VBITREV_B v16i8:$vj, v16i8:$vk))>;
1515def : Pat<(xor v8i16:$vj, (shl vsplat_imm_eq_1, v8i16:$vk)),
1516          (v8i16 (VBITREV_H v8i16:$vj, v8i16:$vk))>;
1517def : Pat<(xor v4i32:$vj, (shl vsplat_imm_eq_1, v4i32:$vk)),
1518          (v4i32 (VBITREV_W v4i32:$vj, v4i32:$vk))>;
1519def : Pat<(xor v2i64:$vj, (shl vsplat_imm_eq_1, v2i64:$vk)),
1520          (v2i64 (VBITREV_D v2i64:$vj, v2i64:$vk))>;
1521def : Pat<(xor v16i8:$vj, (shl vsplat_imm_eq_1, (vsplati8imm7 v16i8:$vk))),
1522          (v16i8 (VBITREV_B v16i8:$vj, v16i8:$vk))>;
1523def : Pat<(xor v8i16:$vj, (shl vsplat_imm_eq_1, (vsplati16imm15 v8i16:$vk))),
1524          (v8i16 (VBITREV_H v8i16:$vj, v8i16:$vk))>;
1525def : Pat<(xor v4i32:$vj, (shl vsplat_imm_eq_1, (vsplati32imm31 v4i32:$vk))),
1526          (v4i32 (VBITREV_W v4i32:$vj, v4i32:$vk))>;
1527def : Pat<(xor v2i64:$vj, (shl vsplat_imm_eq_1, (vsplati64imm63 v2i64:$vk))),
1528          (v2i64 (VBITREV_D v2i64:$vj, v2i64:$vk))>;
1529
1530// VBITREVI_{B/H/W/D}
1531def : Pat<(xor (v16i8 LSX128:$vj), (v16i8 (vsplat_uimm_pow2 uimm3:$imm))),
1532          (VBITREVI_B LSX128:$vj, uimm3:$imm)>;
1533def : Pat<(xor (v8i16 LSX128:$vj), (v8i16 (vsplat_uimm_pow2 uimm4:$imm))),
1534          (VBITREVI_H LSX128:$vj, uimm4:$imm)>;
1535def : Pat<(xor (v4i32 LSX128:$vj), (v4i32 (vsplat_uimm_pow2 uimm5:$imm))),
1536          (VBITREVI_W LSX128:$vj, uimm5:$imm)>;
1537def : Pat<(xor (v2i64 LSX128:$vj), (v2i64 (vsplat_uimm_pow2 uimm6:$imm))),
1538          (VBITREVI_D LSX128:$vj, uimm6:$imm)>;
1539
1540// VFADD_{S/D}
1541defm : PatVrVrF<fadd, "VFADD">;
1542
1543// VFSUB_{S/D}
1544defm : PatVrVrF<fsub, "VFSUB">;
1545
1546// VFMUL_{S/D}
1547defm : PatVrVrF<fmul, "VFMUL">;
1548
1549// VFDIV_{S/D}
1550defm : PatVrVrF<fdiv, "VFDIV">;
1551
1552// VFMADD_{S/D}
1553def : Pat<(fma v4f32:$vj, v4f32:$vk, v4f32:$va),
1554          (VFMADD_S v4f32:$vj, v4f32:$vk, v4f32:$va)>;
1555def : Pat<(fma v2f64:$vj, v2f64:$vk, v2f64:$va),
1556          (VFMADD_D v2f64:$vj, v2f64:$vk, v2f64:$va)>;
1557
1558// VFMSUB_{S/D}
1559def : Pat<(fma v4f32:$vj, v4f32:$vk, (fneg v4f32:$va)),
1560          (VFMSUB_S v4f32:$vj, v4f32:$vk, v4f32:$va)>;
1561def : Pat<(fma v2f64:$vj, v2f64:$vk, (fneg v2f64:$va)),
1562          (VFMSUB_D v2f64:$vj, v2f64:$vk, v2f64:$va)>;
1563
1564// VFNMADD_{S/D}
1565def : Pat<(fneg (fma v4f32:$vj, v4f32:$vk, v4f32:$va)),
1566          (VFNMADD_S v4f32:$vj, v4f32:$vk, v4f32:$va)>;
1567def : Pat<(fneg (fma v2f64:$vj, v2f64:$vk, v2f64:$va)),
1568          (VFNMADD_D v2f64:$vj, v2f64:$vk, v2f64:$va)>;
1569def : Pat<(fma_nsz (fneg v4f32:$vj), v4f32:$vk, (fneg v4f32:$va)),
1570          (VFNMADD_S v4f32:$vj, v4f32:$vk, v4f32:$va)>;
1571def : Pat<(fma_nsz (fneg v2f64:$vj), v2f64:$vk, (fneg v2f64:$va)),
1572          (VFNMADD_D v2f64:$vj, v2f64:$vk, v2f64:$va)>;
1573
1574// VFNMSUB_{S/D}
1575def : Pat<(fneg (fma v4f32:$vj, v4f32:$vk, (fneg v4f32:$va))),
1576          (VFNMSUB_S v4f32:$vj, v4f32:$vk, v4f32:$va)>;
1577def : Pat<(fneg (fma v2f64:$vj, v2f64:$vk, (fneg v2f64:$va))),
1578          (VFNMSUB_D v2f64:$vj, v2f64:$vk, v2f64:$va)>;
1579def : Pat<(fma_nsz (fneg v4f32:$vj), v4f32:$vk, v4f32:$va),
1580          (VFNMSUB_S v4f32:$vj, v4f32:$vk, v4f32:$va)>;
1581def : Pat<(fma_nsz (fneg v2f64:$vj), v2f64:$vk, v2f64:$va),
1582          (VFNMSUB_D v2f64:$vj, v2f64:$vk, v2f64:$va)>;
1583
1584// VFSQRT_{S/D}
1585defm : PatVrF<fsqrt, "VFSQRT">;
1586
1587// VFRECIP_{S/D}
1588def : Pat<(fdiv vsplatf32_fpimm_eq_1, v4f32:$vj),
1589          (VFRECIP_S v4f32:$vj)>;
1590def : Pat<(fdiv vsplatf64_fpimm_eq_1, v2f64:$vj),
1591          (VFRECIP_D v2f64:$vj)>;
1592
1593// VFRSQRT_{S/D}
1594def : Pat<(fdiv vsplatf32_fpimm_eq_1, (fsqrt v4f32:$vj)),
1595          (VFRSQRT_S v4f32:$vj)>;
1596def : Pat<(fdiv vsplatf64_fpimm_eq_1, (fsqrt v2f64:$vj)),
1597          (VFRSQRT_D v2f64:$vj)>;
1598
1599// VSEQ[I]_{B/H/W/D}
1600defm : PatCCVrSimm5<SETEQ, "VSEQI">;
1601defm : PatCCVrVr<SETEQ, "VSEQ">;
1602
1603// VSLE[I]_{B/H/W/D}[U]
1604defm : PatCCVrSimm5<SETLE, "VSLEI">;
1605defm : PatCCVrUimm5<SETULE, "VSLEI">;
1606defm : PatCCVrVr<SETLE, "VSLE">;
1607defm : PatCCVrVrU<SETULE, "VSLE">;
1608
1609// VSLT[I]_{B/H/W/D}[U]
1610defm : PatCCVrSimm5<SETLT, "VSLTI">;
1611defm : PatCCVrUimm5<SETULT, "VSLTI">;
1612defm : PatCCVrVr<SETLT, "VSLT">;
1613defm : PatCCVrVrU<SETULT, "VSLT">;
1614
1615// VFCMP.cond.{S/D}
1616defm : PatCCVrVrF<SETEQ, "VFCMP_CEQ">;
1617defm : PatCCVrVrF<SETOEQ, "VFCMP_CEQ">;
1618defm : PatCCVrVrF<SETUEQ, "VFCMP_CUEQ">;
1619
1620defm : PatCCVrVrF<SETLE, "VFCMP_CLE">;
1621defm : PatCCVrVrF<SETOLE, "VFCMP_CLE">;
1622defm : PatCCVrVrF<SETULE, "VFCMP_CULE">;
1623
1624defm : PatCCVrVrF<SETLT, "VFCMP_CLT">;
1625defm : PatCCVrVrF<SETOLT, "VFCMP_CLT">;
1626defm : PatCCVrVrF<SETULT, "VFCMP_CULT">;
1627
1628defm : PatCCVrVrF<SETNE, "VFCMP_CNE">;
1629defm : PatCCVrVrF<SETONE, "VFCMP_CNE">;
1630defm : PatCCVrVrF<SETUNE, "VFCMP_CUNE">;
1631
1632defm : PatCCVrVrF<SETO, "VFCMP_COR">;
1633defm : PatCCVrVrF<SETUO, "VFCMP_CUN">;
1634
1635// VINSGR2VR_{B/H/W/D}
1636def : Pat<(vector_insert v16i8:$vd, GRLenVT:$rj, uimm4:$imm),
1637          (VINSGR2VR_B v16i8:$vd, GRLenVT:$rj, uimm4:$imm)>;
1638def : Pat<(vector_insert v8i16:$vd, GRLenVT:$rj, uimm3:$imm),
1639          (VINSGR2VR_H v8i16:$vd, GRLenVT:$rj, uimm3:$imm)>;
1640def : Pat<(vector_insert v4i32:$vd, GRLenVT:$rj, uimm2:$imm),
1641          (VINSGR2VR_W v4i32:$vd, GRLenVT:$rj, uimm2:$imm)>;
1642def : Pat<(vector_insert v2i64:$vd, GRLenVT:$rj, uimm1:$imm),
1643          (VINSGR2VR_D v2i64:$vd, GRLenVT:$rj, uimm1:$imm)>;
1644
1645def : Pat<(vector_insert v4f32:$vd, FPR32:$fj, uimm2:$imm),
1646          (VINSGR2VR_W $vd, (COPY_TO_REGCLASS FPR32:$fj, GPR), uimm2:$imm)>;
1647def : Pat<(vector_insert v2f64:$vd, FPR64:$fj, uimm1:$imm),
1648          (VINSGR2VR_D $vd, (COPY_TO_REGCLASS FPR64:$fj, GPR), uimm1:$imm)>;
1649
1650// VPICKVE2GR_{B/H/W}[U]
1651def : Pat<(loongarch_vpick_sext_elt v16i8:$vd, uimm4:$imm, i8),
1652          (VPICKVE2GR_B v16i8:$vd, uimm4:$imm)>;
1653def : Pat<(loongarch_vpick_sext_elt v8i16:$vd, uimm3:$imm, i16),
1654          (VPICKVE2GR_H v8i16:$vd, uimm3:$imm)>;
1655def : Pat<(loongarch_vpick_sext_elt v4i32:$vd, uimm2:$imm, i32),
1656          (VPICKVE2GR_W v4i32:$vd, uimm2:$imm)>;
1657
1658def : Pat<(loongarch_vpick_zext_elt v16i8:$vd, uimm4:$imm, i8),
1659          (VPICKVE2GR_BU v16i8:$vd, uimm4:$imm)>;
1660def : Pat<(loongarch_vpick_zext_elt v8i16:$vd, uimm3:$imm, i16),
1661          (VPICKVE2GR_HU v8i16:$vd, uimm3:$imm)>;
1662def : Pat<(loongarch_vpick_zext_elt v4i32:$vd, uimm2:$imm, i32),
1663          (VPICKVE2GR_WU v4i32:$vd, uimm2:$imm)>;
1664
1665// VREPLGR2VR_{B/H/W/D}
1666def : Pat<(lsxsplati8 GPR:$rj), (VREPLGR2VR_B GPR:$rj)>;
1667def : Pat<(lsxsplati16 GPR:$rj), (VREPLGR2VR_H GPR:$rj)>;
1668def : Pat<(lsxsplati32 GPR:$rj), (VREPLGR2VR_W GPR:$rj)>;
1669def : Pat<(lsxsplati64 GPR:$rj), (VREPLGR2VR_D GPR:$rj)>;
1670
1671// VREPLVE_{B/H/W/D}
1672def : Pat<(loongarch_vreplve v16i8:$vj, GRLenVT:$rk),
1673          (VREPLVE_B v16i8:$vj, GRLenVT:$rk)>;
1674def : Pat<(loongarch_vreplve v8i16:$vj, GRLenVT:$rk),
1675          (VREPLVE_H v8i16:$vj, GRLenVT:$rk)>;
1676def : Pat<(loongarch_vreplve v4i32:$vj, GRLenVT:$rk),
1677          (VREPLVE_W v4i32:$vj, GRLenVT:$rk)>;
1678def : Pat<(loongarch_vreplve v2i64:$vj, GRLenVT:$rk),
1679          (VREPLVE_D v2i64:$vj, GRLenVT:$rk)>;
1680
1681// VREPLVEI_{W/D}
1682def : Pat<(lsxsplatf32 FPR32:$fj),
1683          (VREPLVEI_W (SUBREG_TO_REG (i64 0), FPR32:$fj, sub_32), 0)>;
1684def : Pat<(lsxsplatf64 FPR64:$fj),
1685          (VREPLVEI_D (SUBREG_TO_REG (i64 0), FPR64:$fj, sub_64), 0)>;
1686
1687// Loads/Stores
1688foreach vt = [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64] in {
1689  defm : LdPat<load, VLD, vt>;
1690  def  : RegRegLdPat<load, VLDX, vt>;
1691  defm : StPat<store, VST, LSX128, vt>;
1692  def  : RegRegStPat<store, VSTX, LSX128, vt>;
1693}
1694
1695// Vector extraction with constant index.
1696def : Pat<(i64 (vector_extract v16i8:$vj, uimm4:$imm)),
1697          (VPICKVE2GR_B v16i8:$vj, uimm4:$imm)>;
1698def : Pat<(i64 (vector_extract v8i16:$vj, uimm3:$imm)),
1699          (VPICKVE2GR_H v8i16:$vj, uimm3:$imm)>;
1700def : Pat<(i64 (vector_extract v4i32:$vj, uimm2:$imm)),
1701          (VPICKVE2GR_W v4i32:$vj, uimm2:$imm)>;
1702def : Pat<(i64 (vector_extract v2i64:$vj, uimm1:$imm)),
1703          (VPICKVE2GR_D v2i64:$vj, uimm1:$imm)>;
1704def : Pat<(f32 (vector_extract v4f32:$vj, uimm2:$imm)),
1705          (f32 (EXTRACT_SUBREG (VREPLVEI_W v4f32:$vj, uimm2:$imm), sub_32))>;
1706def : Pat<(f64 (vector_extract v2f64:$vj, uimm1:$imm)),
1707          (f64 (EXTRACT_SUBREG (VREPLVEI_D v2f64:$vj, uimm1:$imm), sub_64))>;
1708
1709// Vector extraction with variable index.
1710def : Pat<(i64 (vector_extract v16i8:$vj, i64:$rk)),
1711          (SRAI_W (COPY_TO_REGCLASS (f32 (EXTRACT_SUBREG (VREPLVE_B v16i8:$vj,
1712                                                                    i64:$rk),
1713                                                         sub_32)),
1714                                    GPR), (i64 24))>;
1715def : Pat<(i64 (vector_extract v8i16:$vj, i64:$rk)),
1716          (SRAI_W (COPY_TO_REGCLASS (f32 (EXTRACT_SUBREG (VREPLVE_H v8i16:$vj,
1717                                                                    i64:$rk),
1718                                                         sub_32)),
1719                                    GPR), (i64 16))>;
1720def : Pat<(i64 (vector_extract v4i32:$vj, i64:$rk)),
1721          (COPY_TO_REGCLASS (f32 (EXTRACT_SUBREG (VREPLVE_W v4i32:$vj, i64:$rk),
1722                                                 sub_32)),
1723                            GPR)>;
1724def : Pat<(i64 (vector_extract v2i64:$vj, i64:$rk)),
1725          (COPY_TO_REGCLASS (f64 (EXTRACT_SUBREG (VREPLVE_D v2i64:$vj, i64:$rk),
1726                                                 sub_64)),
1727                            GPR)>;
1728def : Pat<(f32 (vector_extract v4f32:$vj, i64:$rk)),
1729          (f32 (EXTRACT_SUBREG (VREPLVE_W v4f32:$vj, i64:$rk), sub_32))>;
1730def : Pat<(f64 (vector_extract v2f64:$vj, i64:$rk)),
1731          (f64 (EXTRACT_SUBREG (VREPLVE_D v2f64:$vj, i64:$rk), sub_64))>;
1732
1733// vselect
1734def : Pat<(v16i8 (vselect LSX128:$vj, LSX128:$vd,
1735                          (v16i8 (SplatPat_uimm8 uimm8:$imm)))),
1736          (VBITSELI_B LSX128:$vd, LSX128:$vj, uimm8:$imm)>;
1737foreach vt = [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64] in
1738  def  : Pat<(vt (vselect LSX128:$va, LSX128:$vk, LSX128:$vj)),
1739             (VBITSEL_V LSX128:$vj, LSX128:$vk, LSX128:$va)>;
1740
1741// fneg
1742def : Pat<(fneg (v4f32 LSX128:$vj)), (VBITREVI_W LSX128:$vj, 31)>;
1743def : Pat<(fneg (v2f64 LSX128:$vj)), (VBITREVI_D LSX128:$vj, 63)>;
1744
1745} // Predicates = [HasExtLSX]
1746
1747/// Intrinsic pattern
1748
1749class deriveLSXIntrinsic<string Inst> {
1750  Intrinsic ret = !cast<Intrinsic>(!tolower("int_loongarch_lsx_"#Inst));
1751}
1752
1753let Predicates = [HasExtLSX] in {
1754
1755// vty: v16i8/v8i16/v4i32/v2i64
1756// Pat<(Intrinsic vty:$vj, vty:$vk),
1757//     (LAInst vty:$vj, vty:$vk)>;
1758foreach Inst = ["VSADD_B", "VSADD_BU", "VSSUB_B", "VSSUB_BU",
1759                "VHADDW_H_B", "VHADDW_HU_BU", "VHSUBW_H_B", "VHSUBW_HU_BU",
1760                "VADDWEV_H_B", "VADDWOD_H_B", "VSUBWEV_H_B", "VSUBWOD_H_B",
1761                "VADDWEV_H_BU", "VADDWOD_H_BU", "VSUBWEV_H_BU", "VSUBWOD_H_BU",
1762                "VADDWEV_H_BU_B", "VADDWOD_H_BU_B",
1763                "VAVG_B", "VAVG_BU", "VAVGR_B", "VAVGR_BU",
1764                "VABSD_B", "VABSD_BU", "VADDA_B", "VMUH_B", "VMUH_BU",
1765                "VMULWEV_H_B", "VMULWOD_H_B", "VMULWEV_H_BU", "VMULWOD_H_BU",
1766                "VMULWEV_H_BU_B", "VMULWOD_H_BU_B", "VSIGNCOV_B",
1767                "VANDN_V", "VORN_V", "VROTR_B", "VSRLR_B", "VSRAR_B",
1768                "VSEQ_B", "VSLE_B", "VSLE_BU", "VSLT_B", "VSLT_BU",
1769                "VPACKEV_B", "VPACKOD_B", "VPICKEV_B", "VPICKOD_B",
1770                "VILVL_B", "VILVH_B"] in
1771  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1772               (v16i8 LSX128:$vj), (v16i8 LSX128:$vk)),
1773            (!cast<LAInst>(Inst) LSX128:$vj, LSX128:$vk)>;
1774foreach Inst = ["VSADD_H", "VSADD_HU", "VSSUB_H", "VSSUB_HU",
1775                "VHADDW_W_H", "VHADDW_WU_HU", "VHSUBW_W_H", "VHSUBW_WU_HU",
1776                "VADDWEV_W_H", "VADDWOD_W_H", "VSUBWEV_W_H", "VSUBWOD_W_H",
1777                "VADDWEV_W_HU", "VADDWOD_W_HU", "VSUBWEV_W_HU", "VSUBWOD_W_HU",
1778                "VADDWEV_W_HU_H", "VADDWOD_W_HU_H",
1779                "VAVG_H", "VAVG_HU", "VAVGR_H", "VAVGR_HU",
1780                "VABSD_H", "VABSD_HU", "VADDA_H", "VMUH_H", "VMUH_HU",
1781                "VMULWEV_W_H", "VMULWOD_W_H", "VMULWEV_W_HU", "VMULWOD_W_HU",
1782                "VMULWEV_W_HU_H", "VMULWOD_W_HU_H", "VSIGNCOV_H", "VROTR_H",
1783                "VSRLR_H", "VSRAR_H", "VSRLN_B_H", "VSRAN_B_H", "VSRLRN_B_H",
1784                "VSRARN_B_H", "VSSRLN_B_H", "VSSRAN_B_H", "VSSRLN_BU_H",
1785                "VSSRAN_BU_H", "VSSRLRN_B_H", "VSSRARN_B_H", "VSSRLRN_BU_H",
1786                "VSSRARN_BU_H",
1787                "VSEQ_H", "VSLE_H", "VSLE_HU", "VSLT_H", "VSLT_HU",
1788                "VPACKEV_H", "VPACKOD_H", "VPICKEV_H", "VPICKOD_H",
1789                "VILVL_H", "VILVH_H"] in
1790  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1791               (v8i16 LSX128:$vj), (v8i16 LSX128:$vk)),
1792            (!cast<LAInst>(Inst) LSX128:$vj, LSX128:$vk)>;
1793foreach Inst = ["VSADD_W", "VSADD_WU", "VSSUB_W", "VSSUB_WU",
1794                "VHADDW_D_W", "VHADDW_DU_WU", "VHSUBW_D_W", "VHSUBW_DU_WU",
1795                "VADDWEV_D_W", "VADDWOD_D_W", "VSUBWEV_D_W", "VSUBWOD_D_W",
1796                "VADDWEV_D_WU", "VADDWOD_D_WU", "VSUBWEV_D_WU", "VSUBWOD_D_WU",
1797                "VADDWEV_D_WU_W", "VADDWOD_D_WU_W",
1798                "VAVG_W", "VAVG_WU", "VAVGR_W", "VAVGR_WU",
1799                "VABSD_W", "VABSD_WU", "VADDA_W", "VMUH_W", "VMUH_WU",
1800                "VMULWEV_D_W", "VMULWOD_D_W", "VMULWEV_D_WU", "VMULWOD_D_WU",
1801                "VMULWEV_D_WU_W", "VMULWOD_D_WU_W", "VSIGNCOV_W", "VROTR_W",
1802                "VSRLR_W", "VSRAR_W", "VSRLN_H_W", "VSRAN_H_W", "VSRLRN_H_W",
1803                "VSRARN_H_W", "VSSRLN_H_W", "VSSRAN_H_W", "VSSRLN_HU_W",
1804                "VSSRAN_HU_W", "VSSRLRN_H_W", "VSSRARN_H_W", "VSSRLRN_HU_W",
1805                "VSSRARN_HU_W",
1806                "VSEQ_W", "VSLE_W", "VSLE_WU", "VSLT_W", "VSLT_WU",
1807                "VPACKEV_W", "VPACKOD_W", "VPICKEV_W", "VPICKOD_W",
1808                "VILVL_W", "VILVH_W"] in
1809  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1810               (v4i32 LSX128:$vj), (v4i32 LSX128:$vk)),
1811            (!cast<LAInst>(Inst) LSX128:$vj, LSX128:$vk)>;
1812foreach Inst = ["VADD_Q", "VSUB_Q",
1813                "VSADD_D", "VSADD_DU", "VSSUB_D", "VSSUB_DU",
1814                "VHADDW_Q_D", "VHADDW_QU_DU", "VHSUBW_Q_D", "VHSUBW_QU_DU",
1815                "VADDWEV_Q_D", "VADDWOD_Q_D", "VSUBWEV_Q_D", "VSUBWOD_Q_D",
1816                "VADDWEV_Q_DU", "VADDWOD_Q_DU", "VSUBWEV_Q_DU", "VSUBWOD_Q_DU",
1817                "VADDWEV_Q_DU_D", "VADDWOD_Q_DU_D",
1818                "VAVG_D", "VAVG_DU", "VAVGR_D", "VAVGR_DU",
1819                "VABSD_D", "VABSD_DU", "VADDA_D", "VMUH_D", "VMUH_DU",
1820                "VMULWEV_Q_D", "VMULWOD_Q_D", "VMULWEV_Q_DU", "VMULWOD_Q_DU",
1821                "VMULWEV_Q_DU_D", "VMULWOD_Q_DU_D", "VSIGNCOV_D", "VROTR_D",
1822                "VSRLR_D", "VSRAR_D", "VSRLN_W_D", "VSRAN_W_D", "VSRLRN_W_D",
1823                "VSRARN_W_D", "VSSRLN_W_D", "VSSRAN_W_D", "VSSRLN_WU_D",
1824                "VSSRAN_WU_D", "VSSRLRN_W_D", "VSSRARN_W_D", "VSSRLRN_WU_D",
1825                "VSSRARN_WU_D", "VFFINT_S_L",
1826                "VSEQ_D", "VSLE_D", "VSLE_DU", "VSLT_D", "VSLT_DU",
1827                "VPACKEV_D", "VPACKOD_D", "VPICKEV_D", "VPICKOD_D",
1828                "VILVL_D", "VILVH_D"] in
1829  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1830               (v2i64 LSX128:$vj), (v2i64 LSX128:$vk)),
1831            (!cast<LAInst>(Inst) LSX128:$vj, LSX128:$vk)>;
1832
1833// vty: v16i8/v8i16/v4i32/v2i64
1834// Pat<(Intrinsic vty:$vd, vty:$vj, vty:$vk),
1835//     (LAInst vty:$vd, vty:$vj, vty:$vk)>;
1836foreach Inst = ["VMADDWEV_H_B", "VMADDWOD_H_B", "VMADDWEV_H_BU",
1837                "VMADDWOD_H_BU", "VMADDWEV_H_BU_B", "VMADDWOD_H_BU_B"] in
1838  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1839               (v8i16 LSX128:$vd), (v16i8 LSX128:$vj), (v16i8 LSX128:$vk)),
1840            (!cast<LAInst>(Inst) LSX128:$vd, LSX128:$vj, LSX128:$vk)>;
1841foreach Inst = ["VMADDWEV_W_H", "VMADDWOD_W_H", "VMADDWEV_W_HU",
1842                "VMADDWOD_W_HU", "VMADDWEV_W_HU_H", "VMADDWOD_W_HU_H"] in
1843  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1844               (v4i32 LSX128:$vd), (v8i16 LSX128:$vj), (v8i16 LSX128:$vk)),
1845            (!cast<LAInst>(Inst) LSX128:$vd, LSX128:$vj, LSX128:$vk)>;
1846foreach Inst = ["VMADDWEV_D_W", "VMADDWOD_D_W", "VMADDWEV_D_WU",
1847                "VMADDWOD_D_WU", "VMADDWEV_D_WU_W", "VMADDWOD_D_WU_W"] in
1848  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1849               (v2i64 LSX128:$vd), (v4i32 LSX128:$vj), (v4i32 LSX128:$vk)),
1850            (!cast<LAInst>(Inst) LSX128:$vd, LSX128:$vj, LSX128:$vk)>;
1851foreach Inst = ["VMADDWEV_Q_D", "VMADDWOD_Q_D", "VMADDWEV_Q_DU",
1852                "VMADDWOD_Q_DU", "VMADDWEV_Q_DU_D", "VMADDWOD_Q_DU_D"] in
1853  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1854               (v2i64 LSX128:$vd), (v2i64 LSX128:$vj), (v2i64 LSX128:$vk)),
1855            (!cast<LAInst>(Inst) LSX128:$vd, LSX128:$vj, LSX128:$vk)>;
1856
1857// vty: v16i8/v8i16/v4i32/v2i64
1858// Pat<(Intrinsic vty:$vj),
1859//     (LAInst vty:$vj)>;
1860foreach Inst = ["VEXTH_H_B", "VEXTH_HU_BU",
1861                "VMSKLTZ_B", "VMSKGEZ_B", "VMSKNZ_B",
1862                "VCLO_B"] in
1863  def : Pat<(deriveLSXIntrinsic<Inst>.ret (v16i8 LSX128:$vj)),
1864            (!cast<LAInst>(Inst) LSX128:$vj)>;
1865foreach Inst = ["VEXTH_W_H", "VEXTH_WU_HU", "VMSKLTZ_H",
1866                "VCLO_H", "VFCVTL_S_H", "VFCVTH_S_H"] in
1867  def : Pat<(deriveLSXIntrinsic<Inst>.ret (v8i16 LSX128:$vj)),
1868            (!cast<LAInst>(Inst) LSX128:$vj)>;
1869foreach Inst = ["VEXTH_D_W", "VEXTH_DU_WU", "VMSKLTZ_W",
1870                "VCLO_W", "VFFINT_S_W", "VFFINT_S_WU",
1871                "VFFINTL_D_W", "VFFINTH_D_W"] in
1872  def : Pat<(deriveLSXIntrinsic<Inst>.ret (v4i32 LSX128:$vj)),
1873            (!cast<LAInst>(Inst) LSX128:$vj)>;
1874foreach Inst = ["VEXTH_Q_D", "VEXTH_QU_DU", "VMSKLTZ_D",
1875                "VEXTL_Q_D", "VEXTL_QU_DU",
1876                "VCLO_D", "VFFINT_D_L", "VFFINT_D_LU"] in
1877  def : Pat<(deriveLSXIntrinsic<Inst>.ret (v2i64 LSX128:$vj)),
1878            (!cast<LAInst>(Inst) LSX128:$vj)>;
1879
1880// Pat<(Intrinsic timm:$imm)
1881//     (LAInst timm:$imm)>;
1882def : Pat<(int_loongarch_lsx_vldi timm:$imm),
1883          (VLDI (to_valid_timm timm:$imm))>;
1884foreach Inst = ["VREPLI_B", "VREPLI_H", "VREPLI_W", "VREPLI_D"] in
1885  def : Pat<(deriveLSXIntrinsic<Inst>.ret timm:$imm),
1886            (!cast<LAInst>("Pseudo"#Inst) (to_valid_timm timm:$imm))>;
1887
1888// vty: v16i8/v8i16/v4i32/v2i64
1889// Pat<(Intrinsic vty:$vj, timm:$imm)
1890//     (LAInst vty:$vj, timm:$imm)>;
1891foreach Inst = ["VSAT_B", "VSAT_BU", "VNORI_B", "VROTRI_B", "VSLLWIL_H_B",
1892                "VSLLWIL_HU_BU", "VSRLRI_B", "VSRARI_B",
1893                "VSEQI_B", "VSLEI_B", "VSLEI_BU", "VSLTI_B", "VSLTI_BU",
1894                "VREPLVEI_B", "VBSLL_V", "VBSRL_V", "VSHUF4I_B"] in
1895  def : Pat<(deriveLSXIntrinsic<Inst>.ret (v16i8 LSX128:$vj), timm:$imm),
1896            (!cast<LAInst>(Inst) LSX128:$vj, (to_valid_timm timm:$imm))>;
1897foreach Inst = ["VSAT_H", "VSAT_HU", "VROTRI_H", "VSLLWIL_W_H",
1898                "VSLLWIL_WU_HU", "VSRLRI_H", "VSRARI_H",
1899                "VSEQI_H", "VSLEI_H", "VSLEI_HU", "VSLTI_H", "VSLTI_HU",
1900                "VREPLVEI_H", "VSHUF4I_H"] in
1901  def : Pat<(deriveLSXIntrinsic<Inst>.ret (v8i16 LSX128:$vj), timm:$imm),
1902            (!cast<LAInst>(Inst) LSX128:$vj, (to_valid_timm timm:$imm))>;
1903foreach Inst = ["VSAT_W", "VSAT_WU", "VROTRI_W", "VSLLWIL_D_W",
1904                "VSLLWIL_DU_WU", "VSRLRI_W", "VSRARI_W",
1905                "VSEQI_W", "VSLEI_W", "VSLEI_WU", "VSLTI_W", "VSLTI_WU",
1906                "VREPLVEI_W", "VSHUF4I_W"] in
1907  def : Pat<(deriveLSXIntrinsic<Inst>.ret (v4i32 LSX128:$vj), timm:$imm),
1908            (!cast<LAInst>(Inst) LSX128:$vj, (to_valid_timm timm:$imm))>;
1909foreach Inst = ["VSAT_D", "VSAT_DU", "VROTRI_D", "VSRLRI_D", "VSRARI_D",
1910                "VSEQI_D", "VSLEI_D", "VSLEI_DU", "VSLTI_D", "VSLTI_DU",
1911                "VPICKVE2GR_D", "VPICKVE2GR_DU",
1912                "VREPLVEI_D"] in
1913  def : Pat<(deriveLSXIntrinsic<Inst>.ret (v2i64 LSX128:$vj), timm:$imm),
1914            (!cast<LAInst>(Inst) LSX128:$vj, (to_valid_timm timm:$imm))>;
1915
1916// vty: v16i8/v8i16/v4i32/v2i64
1917// Pat<(Intrinsic vty:$vd, vty:$vj, timm:$imm)
1918//     (LAInst vty:$vd, vty:$vj, timm:$imm)>;
1919foreach Inst = ["VSRLNI_B_H", "VSRANI_B_H", "VSRLRNI_B_H", "VSRARNI_B_H",
1920                "VSSRLNI_B_H", "VSSRANI_B_H", "VSSRLNI_BU_H", "VSSRANI_BU_H",
1921                "VSSRLRNI_B_H", "VSSRARNI_B_H", "VSSRLRNI_BU_H", "VSSRARNI_BU_H",
1922                "VFRSTPI_B", "VBITSELI_B", "VEXTRINS_B"] in
1923  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1924               (v16i8 LSX128:$vd), (v16i8 LSX128:$vj), timm:$imm),
1925            (!cast<LAInst>(Inst) LSX128:$vd, LSX128:$vj,
1926               (to_valid_timm timm:$imm))>;
1927foreach Inst = ["VSRLNI_H_W", "VSRANI_H_W", "VSRLRNI_H_W", "VSRARNI_H_W",
1928                "VSSRLNI_H_W", "VSSRANI_H_W", "VSSRLNI_HU_W", "VSSRANI_HU_W",
1929                "VSSRLRNI_H_W", "VSSRARNI_H_W", "VSSRLRNI_HU_W", "VSSRARNI_HU_W",
1930                "VFRSTPI_H", "VEXTRINS_H"] in
1931  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1932               (v8i16 LSX128:$vd), (v8i16 LSX128:$vj), timm:$imm),
1933            (!cast<LAInst>(Inst) LSX128:$vd, LSX128:$vj,
1934               (to_valid_timm timm:$imm))>;
1935foreach Inst = ["VSRLNI_W_D", "VSRANI_W_D", "VSRLRNI_W_D", "VSRARNI_W_D",
1936                "VSSRLNI_W_D", "VSSRANI_W_D", "VSSRLNI_WU_D", "VSSRANI_WU_D",
1937                "VSSRLRNI_W_D", "VSSRARNI_W_D", "VSSRLRNI_WU_D", "VSSRARNI_WU_D",
1938                "VPERMI_W", "VEXTRINS_W"] in
1939  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1940               (v4i32 LSX128:$vd), (v4i32 LSX128:$vj), timm:$imm),
1941            (!cast<LAInst>(Inst) LSX128:$vd, LSX128:$vj,
1942               (to_valid_timm timm:$imm))>;
1943foreach Inst = ["VSRLNI_D_Q", "VSRANI_D_Q", "VSRLRNI_D_Q", "VSRARNI_D_Q",
1944                "VSSRLNI_D_Q", "VSSRANI_D_Q", "VSSRLNI_DU_Q", "VSSRANI_DU_Q",
1945                "VSSRLRNI_D_Q", "VSSRARNI_D_Q", "VSSRLRNI_DU_Q", "VSSRARNI_DU_Q",
1946                "VSHUF4I_D", "VEXTRINS_D"] in
1947  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1948               (v2i64 LSX128:$vd), (v2i64 LSX128:$vj), timm:$imm),
1949            (!cast<LAInst>(Inst) LSX128:$vd, LSX128:$vj,
1950               (to_valid_timm timm:$imm))>;
1951
1952// vty: v16i8/v8i16/v4i32/v2i64
1953// Pat<(Intrinsic vty:$vd, vty:$vj, vty:$vk),
1954//     (LAInst vty:$vd, vty:$vj, vty:$vk)>;
1955foreach Inst = ["VFRSTP_B", "VBITSEL_V", "VSHUF_B"] in
1956  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1957               (v16i8 LSX128:$vd), (v16i8 LSX128:$vj), (v16i8 LSX128:$vk)),
1958            (!cast<LAInst>(Inst) LSX128:$vd, LSX128:$vj, LSX128:$vk)>;
1959foreach Inst = ["VFRSTP_H", "VSHUF_H"] in
1960  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1961               (v8i16 LSX128:$vd), (v8i16 LSX128:$vj), (v8i16 LSX128:$vk)),
1962            (!cast<LAInst>(Inst) LSX128:$vd, LSX128:$vj, LSX128:$vk)>;
1963def : Pat<(int_loongarch_lsx_vshuf_w (v4i32 LSX128:$vd), (v4i32 LSX128:$vj),
1964                                     (v4i32 LSX128:$vk)),
1965          (VSHUF_W LSX128:$vd, LSX128:$vj, LSX128:$vk)>;
1966def : Pat<(int_loongarch_lsx_vshuf_d (v2i64 LSX128:$vd), (v2i64 LSX128:$vj),
1967                                     (v2i64 LSX128:$vk)),
1968          (VSHUF_D LSX128:$vd, LSX128:$vj, LSX128:$vk)>;
1969
1970// vty: v4f32/v2f64
1971// Pat<(Intrinsic vty:$vj, vty:$vk, vty:$va),
1972//     (LAInst vty:$vj, vty:$vk, vty:$va)>;
1973foreach Inst = ["VFMSUB_S", "VFNMADD_S", "VFNMSUB_S"] in
1974  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1975               (v4f32 LSX128:$vj), (v4f32 LSX128:$vk), (v4f32 LSX128:$va)),
1976            (!cast<LAInst>(Inst) LSX128:$vj, LSX128:$vk, LSX128:$va)>;
1977foreach Inst = ["VFMSUB_D", "VFNMADD_D", "VFNMSUB_D"] in
1978  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1979               (v2f64 LSX128:$vj), (v2f64 LSX128:$vk), (v2f64 LSX128:$va)),
1980            (!cast<LAInst>(Inst) LSX128:$vj, LSX128:$vk, LSX128:$va)>;
1981
1982// vty: v4f32/v2f64
1983// Pat<(Intrinsic vty:$vj, vty:$vk),
1984//     (LAInst vty:$vj, vty:$vk)>;
1985foreach Inst = ["VFMAX_S", "VFMIN_S", "VFMAXA_S", "VFMINA_S", "VFCVT_H_S",
1986                "VFCMP_CAF_S", "VFCMP_CUN_S", "VFCMP_CEQ_S", "VFCMP_CUEQ_S",
1987                "VFCMP_CLT_S", "VFCMP_CULT_S", "VFCMP_CLE_S", "VFCMP_CULE_S",
1988                "VFCMP_CNE_S", "VFCMP_COR_S", "VFCMP_CUNE_S",
1989                "VFCMP_SAF_S", "VFCMP_SUN_S", "VFCMP_SEQ_S", "VFCMP_SUEQ_S",
1990                "VFCMP_SLT_S", "VFCMP_SULT_S", "VFCMP_SLE_S", "VFCMP_SULE_S",
1991                "VFCMP_SNE_S", "VFCMP_SOR_S", "VFCMP_SUNE_S"] in
1992  def : Pat<(deriveLSXIntrinsic<Inst>.ret
1993               (v4f32 LSX128:$vj), (v4f32 LSX128:$vk)),
1994            (!cast<LAInst>(Inst) LSX128:$vj, LSX128:$vk)>;
1995foreach Inst = ["VFMAX_D", "VFMIN_D", "VFMAXA_D", "VFMINA_D", "VFCVT_S_D",
1996                "VFTINTRNE_W_D", "VFTINTRZ_W_D", "VFTINTRP_W_D", "VFTINTRM_W_D",
1997                "VFTINT_W_D",
1998                "VFCMP_CAF_D", "VFCMP_CUN_D", "VFCMP_CEQ_D", "VFCMP_CUEQ_D",
1999                "VFCMP_CLT_D", "VFCMP_CULT_D", "VFCMP_CLE_D", "VFCMP_CULE_D",
2000                "VFCMP_CNE_D", "VFCMP_COR_D", "VFCMP_CUNE_D",
2001                "VFCMP_SAF_D", "VFCMP_SUN_D", "VFCMP_SEQ_D", "VFCMP_SUEQ_D",
2002                "VFCMP_SLT_D", "VFCMP_SULT_D", "VFCMP_SLE_D", "VFCMP_SULE_D",
2003                "VFCMP_SNE_D", "VFCMP_SOR_D", "VFCMP_SUNE_D"] in
2004  def : Pat<(deriveLSXIntrinsic<Inst>.ret
2005               (v2f64 LSX128:$vj), (v2f64 LSX128:$vk)),
2006            (!cast<LAInst>(Inst) LSX128:$vj, LSX128:$vk)>;
2007
2008// vty: v4f32/v2f64
2009// Pat<(Intrinsic vty:$vj),
2010//     (LAInst vty:$vj)>;
2011foreach Inst = ["VFLOGB_S", "VFCLASS_S", "VFSQRT_S", "VFRECIP_S", "VFRSQRT_S",
2012                "VFRINT_S", "VFCVTL_D_S", "VFCVTH_D_S",
2013                "VFRINTRNE_S", "VFRINTRZ_S", "VFRINTRP_S", "VFRINTRM_S",
2014                "VFTINTRNE_W_S", "VFTINTRZ_W_S", "VFTINTRP_W_S", "VFTINTRM_W_S",
2015                "VFTINT_W_S", "VFTINTRZ_WU_S", "VFTINT_WU_S",
2016                "VFTINTRNEL_L_S", "VFTINTRNEH_L_S", "VFTINTRZL_L_S",
2017                "VFTINTRZH_L_S", "VFTINTRPL_L_S", "VFTINTRPH_L_S",
2018                "VFTINTRML_L_S", "VFTINTRMH_L_S", "VFTINTL_L_S",
2019                "VFTINTH_L_S"] in
2020  def : Pat<(deriveLSXIntrinsic<Inst>.ret (v4f32 LSX128:$vj)),
2021            (!cast<LAInst>(Inst) LSX128:$vj)>;
2022foreach Inst = ["VFLOGB_D", "VFCLASS_D", "VFSQRT_D", "VFRECIP_D", "VFRSQRT_D",
2023                "VFRINT_D",
2024                "VFRINTRNE_D", "VFRINTRZ_D", "VFRINTRP_D", "VFRINTRM_D",
2025                "VFTINTRNE_L_D", "VFTINTRZ_L_D", "VFTINTRP_L_D", "VFTINTRM_L_D",
2026                "VFTINT_L_D", "VFTINTRZ_LU_D", "VFTINT_LU_D"] in
2027  def : Pat<(deriveLSXIntrinsic<Inst>.ret (v2f64 LSX128:$vj)),
2028            (!cast<LAInst>(Inst) LSX128:$vj)>;
2029
2030// load
2031def : Pat<(int_loongarch_lsx_vld GPR:$rj, timm:$imm),
2032          (VLD GPR:$rj, (to_valid_timm timm:$imm))>;
2033def : Pat<(int_loongarch_lsx_vldx GPR:$rj, GPR:$rk),
2034          (VLDX GPR:$rj, GPR:$rk)>;
2035
2036def : Pat<(int_loongarch_lsx_vldrepl_b GPR:$rj, timm:$imm),
2037          (VLDREPL_B GPR:$rj, (to_valid_timm timm:$imm))>;
2038def : Pat<(int_loongarch_lsx_vldrepl_h GPR:$rj, timm:$imm),
2039          (VLDREPL_H GPR:$rj, (to_valid_timm timm:$imm))>;
2040def : Pat<(int_loongarch_lsx_vldrepl_w GPR:$rj, timm:$imm),
2041          (VLDREPL_W GPR:$rj, (to_valid_timm timm:$imm))>;
2042def : Pat<(int_loongarch_lsx_vldrepl_d GPR:$rj, timm:$imm),
2043          (VLDREPL_D GPR:$rj, (to_valid_timm timm:$imm))>;
2044
2045// store
2046def : Pat<(int_loongarch_lsx_vst LSX128:$vd, GPR:$rj, timm:$imm),
2047          (VST LSX128:$vd, GPR:$rj, (to_valid_timm timm:$imm))>;
2048def : Pat<(int_loongarch_lsx_vstx LSX128:$vd, GPR:$rj, GPR:$rk),
2049          (VSTX LSX128:$vd, GPR:$rj, GPR:$rk)>;
2050
2051def : Pat<(int_loongarch_lsx_vstelm_b v16i8:$vd, GPR:$rj, timm:$imm, timm:$idx),
2052          (VSTELM_B v16i8:$vd, GPR:$rj, (to_valid_timm timm:$imm),
2053                    (to_valid_timm timm:$idx))>;
2054def : Pat<(int_loongarch_lsx_vstelm_h v8i16:$vd, GPR:$rj, timm:$imm, timm:$idx),
2055          (VSTELM_H v8i16:$vd, GPR:$rj, (to_valid_timm timm:$imm),
2056                    (to_valid_timm timm:$idx))>;
2057def : Pat<(int_loongarch_lsx_vstelm_w v4i32:$vd, GPR:$rj, timm:$imm, timm:$idx),
2058          (VSTELM_W v4i32:$vd, GPR:$rj, (to_valid_timm timm:$imm),
2059                    (to_valid_timm timm:$idx))>;
2060def : Pat<(int_loongarch_lsx_vstelm_d v2i64:$vd, GPR:$rj, timm:$imm, timm:$idx),
2061          (VSTELM_D v2i64:$vd, GPR:$rj, (to_valid_timm timm:$imm),
2062                    (to_valid_timm timm:$idx))>;
2063
2064} // Predicates = [HasExtLSX]
2065