xref: /freebsd-src/contrib/llvm-project/llvm/include/llvm/IR/IntrinsicsLoongArch.td (revision 7a6dacaca14b62ca4b74406814becb87a3fefac0)
1bdd1243dSDimitry Andric//===- IntrinsicsLoongArch.td - Defines LoongArch intrinsics *- tablegen -*===//
2bdd1243dSDimitry Andric//
3bdd1243dSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4bdd1243dSDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5bdd1243dSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6bdd1243dSDimitry Andric//
7bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
8bdd1243dSDimitry Andric//
9bdd1243dSDimitry Andric// This file defines all of the LoongArch-specific intrinsics.
10bdd1243dSDimitry Andric//
11bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
12bdd1243dSDimitry Andric
13bdd1243dSDimitry Andriclet TargetPrefix = "loongarch" in {
14bdd1243dSDimitry Andric
15bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
16bdd1243dSDimitry Andric// Atomics
17bdd1243dSDimitry Andric
18bdd1243dSDimitry Andric// T @llvm.<name>.T.<p>(any*, T, T, T imm);
19bdd1243dSDimitry Andricclass MaskedAtomicRMW<LLVMType itype>
20bdd1243dSDimitry Andric    : Intrinsic<[itype], [llvm_anyptr_ty, itype, itype, itype],
21bdd1243dSDimitry Andric                [IntrArgMemOnly, NoCapture<ArgIndex<0>>, ImmArg<ArgIndex<3>>]>;
22bdd1243dSDimitry Andric
23bdd1243dSDimitry Andric// We define 32-bit and 64-bit variants of the above, where T stands for i32
24bdd1243dSDimitry Andric// or i64 respectively:
25bdd1243dSDimitry Andricmulticlass MaskedAtomicRMWIntrinsics {
26bdd1243dSDimitry Andric  // i32 @llvm.<name>.i32.<p>(any*, i32, i32, i32 imm);
27bdd1243dSDimitry Andric  def _i32 : MaskedAtomicRMW<llvm_i32_ty>;
28bdd1243dSDimitry Andric  // i64 @llvm.<name>.i32.<p>(any*, i64, i64, i64 imm);
29bdd1243dSDimitry Andric  def _i64 : MaskedAtomicRMW<llvm_i64_ty>;
30bdd1243dSDimitry Andric}
31bdd1243dSDimitry Andric
32bdd1243dSDimitry Andricmulticlass MaskedAtomicRMWFiveOpIntrinsics {
33bdd1243dSDimitry Andric  // TODO: Support cmpxchg on LA32.
34bdd1243dSDimitry Andric  // i64 @llvm.<name>.i64.<p>(any*, i64, i64, i64, i64 imm);
35bdd1243dSDimitry Andric  def _i64 : MaskedAtomicRMWFiveArg<llvm_i64_ty>;
36bdd1243dSDimitry Andric}
37bdd1243dSDimitry Andric
38bdd1243dSDimitry Andricdefm int_loongarch_masked_atomicrmw_xchg : MaskedAtomicRMWIntrinsics;
39bdd1243dSDimitry Andricdefm int_loongarch_masked_atomicrmw_add : MaskedAtomicRMWIntrinsics;
40bdd1243dSDimitry Andricdefm int_loongarch_masked_atomicrmw_sub : MaskedAtomicRMWIntrinsics;
41bdd1243dSDimitry Andricdefm int_loongarch_masked_atomicrmw_nand : MaskedAtomicRMWIntrinsics;
42bdd1243dSDimitry Andricdefm int_loongarch_masked_atomicrmw_umax : MaskedAtomicRMWIntrinsics;
43bdd1243dSDimitry Andricdefm int_loongarch_masked_atomicrmw_umin : MaskedAtomicRMWIntrinsics;
44bdd1243dSDimitry Andricdefm int_loongarch_masked_atomicrmw_max : MaskedAtomicRMWFiveOpIntrinsics;
45bdd1243dSDimitry Andricdefm int_loongarch_masked_atomicrmw_min : MaskedAtomicRMWFiveOpIntrinsics;
46bdd1243dSDimitry Andric
47bdd1243dSDimitry Andric// @llvm.loongarch.masked.cmpxchg.i64.<p>(
48bdd1243dSDimitry Andric//   ptr addr, grlen cmpval, grlen newval, grlen mask, grlenimm ordering)
49bdd1243dSDimitry Andricdefm int_loongarch_masked_cmpxchg : MaskedAtomicRMWFiveOpIntrinsics;
50bdd1243dSDimitry Andric
51bdd1243dSDimitry Andric//===----------------------------------------------------------------------===//
52bdd1243dSDimitry Andric// LoongArch BASE
53bdd1243dSDimitry Andric
545f757f3fSDimitry Andricclass BaseInt<list<LLVMType> ret_types, list<LLVMType> param_types,
555f757f3fSDimitry Andric              list<IntrinsicProperty> intr_properties = []>
565f757f3fSDimitry Andric    : Intrinsic<ret_types, param_types, intr_properties>,
575f757f3fSDimitry Andric      ClangBuiltin<!subst("int_loongarch", "__builtin_loongarch", NAME)>;
58bdd1243dSDimitry Andric
595f757f3fSDimitry Andricdef int_loongarch_break : BaseInt<[], [llvm_i32_ty], [ImmArg<ArgIndex<0>>]>;
605f757f3fSDimitry Andricdef int_loongarch_cacop_d : BaseInt<[], [llvm_i64_ty, llvm_i64_ty, llvm_i64_ty],
615f757f3fSDimitry Andric                                    [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<2>>]>;
625f757f3fSDimitry Andricdef int_loongarch_cacop_w : BaseInt<[], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
635f757f3fSDimitry Andric                                    [ImmArg<ArgIndex<0>>, ImmArg<ArgIndex<2>>]>;
645f757f3fSDimitry Andricdef int_loongarch_dbar : BaseInt<[], [llvm_i32_ty], [ImmArg<ArgIndex<0>>]>;
655f757f3fSDimitry Andric
665f757f3fSDimitry Andricdef int_loongarch_ibar : BaseInt<[], [llvm_i32_ty], [ImmArg<ArgIndex<0>>]>;
675f757f3fSDimitry Andricdef int_loongarch_movfcsr2gr : BaseInt<[llvm_i32_ty], [llvm_i32_ty],
685f757f3fSDimitry Andric                                       [ImmArg<ArgIndex<0>>]>;
695f757f3fSDimitry Andricdef int_loongarch_movgr2fcsr : BaseInt<[], [llvm_i32_ty, llvm_i32_ty],
705f757f3fSDimitry Andric                                       [ImmArg<ArgIndex<0>>]>;
715f757f3fSDimitry Andricdef int_loongarch_syscall : BaseInt<[], [llvm_i32_ty], [ImmArg<ArgIndex<0>>]>;
725f757f3fSDimitry Andric
735f757f3fSDimitry Andricdef int_loongarch_crc_w_b_w : BaseInt<[llvm_i32_ty],
74bdd1243dSDimitry Andric                                      [llvm_i32_ty, llvm_i32_ty]>;
755f757f3fSDimitry Andricdef int_loongarch_crc_w_h_w : BaseInt<[llvm_i32_ty],
76bdd1243dSDimitry Andric                                      [llvm_i32_ty, llvm_i32_ty]>;
775f757f3fSDimitry Andricdef int_loongarch_crc_w_w_w : BaseInt<[llvm_i32_ty],
78bdd1243dSDimitry Andric                                      [llvm_i32_ty, llvm_i32_ty]>;
795f757f3fSDimitry Andricdef int_loongarch_crc_w_d_w : BaseInt<[llvm_i32_ty],
80bdd1243dSDimitry Andric                                      [llvm_i64_ty, llvm_i32_ty]>;
81bdd1243dSDimitry Andric
825f757f3fSDimitry Andricdef int_loongarch_crcc_w_b_w : BaseInt<[llvm_i32_ty],
83bdd1243dSDimitry Andric                                       [llvm_i32_ty, llvm_i32_ty]>;
845f757f3fSDimitry Andricdef int_loongarch_crcc_w_h_w : BaseInt<[llvm_i32_ty],
85bdd1243dSDimitry Andric                                       [llvm_i32_ty, llvm_i32_ty]>;
865f757f3fSDimitry Andricdef int_loongarch_crcc_w_w_w : BaseInt<[llvm_i32_ty],
87bdd1243dSDimitry Andric                                       [llvm_i32_ty, llvm_i32_ty]>;
885f757f3fSDimitry Andricdef int_loongarch_crcc_w_d_w : BaseInt<[llvm_i32_ty],
89bdd1243dSDimitry Andric                                       [llvm_i64_ty, llvm_i32_ty]>;
90bdd1243dSDimitry Andric
915f757f3fSDimitry Andricdef int_loongarch_csrrd_w : BaseInt<[llvm_i32_ty], [llvm_i32_ty],
92bdd1243dSDimitry Andric                                    [ImmArg<ArgIndex<0>>]>;
935f757f3fSDimitry Andricdef int_loongarch_csrrd_d : BaseInt<[llvm_i64_ty], [llvm_i32_ty],
94bdd1243dSDimitry Andric                                    [ImmArg<ArgIndex<0>>]>;
955f757f3fSDimitry Andricdef int_loongarch_csrwr_w : BaseInt<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
96bdd1243dSDimitry Andric                                    [ImmArg<ArgIndex<1>>]>;
975f757f3fSDimitry Andricdef int_loongarch_csrwr_d : BaseInt<[llvm_i64_ty], [llvm_i64_ty, llvm_i32_ty],
98bdd1243dSDimitry Andric                                    [ImmArg<ArgIndex<1>>]>;
995f757f3fSDimitry Andricdef int_loongarch_csrxchg_w : BaseInt<[llvm_i32_ty],
1005f757f3fSDimitry Andric                                      [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
101bdd1243dSDimitry Andric                                      [ImmArg<ArgIndex<2>>]>;
1025f757f3fSDimitry Andricdef int_loongarch_csrxchg_d : BaseInt<[llvm_i64_ty],
1035f757f3fSDimitry Andric                                      [llvm_i64_ty, llvm_i64_ty, llvm_i32_ty],
104bdd1243dSDimitry Andric                                      [ImmArg<ArgIndex<2>>]>;
105bdd1243dSDimitry Andric
1065f757f3fSDimitry Andricdef int_loongarch_iocsrrd_b : BaseInt<[llvm_i32_ty], [llvm_i32_ty]>;
1075f757f3fSDimitry Andricdef int_loongarch_iocsrrd_h : BaseInt<[llvm_i32_ty], [llvm_i32_ty]>;
1085f757f3fSDimitry Andricdef int_loongarch_iocsrrd_w : BaseInt<[llvm_i32_ty], [llvm_i32_ty]>;
1095f757f3fSDimitry Andricdef int_loongarch_iocsrrd_d : BaseInt<[llvm_i64_ty], [llvm_i32_ty]>;
110bdd1243dSDimitry Andric
1115f757f3fSDimitry Andricdef int_loongarch_iocsrwr_b : BaseInt<[], [llvm_i32_ty, llvm_i32_ty]>;
1125f757f3fSDimitry Andricdef int_loongarch_iocsrwr_h : BaseInt<[], [llvm_i32_ty, llvm_i32_ty]>;
1135f757f3fSDimitry Andricdef int_loongarch_iocsrwr_w : BaseInt<[], [llvm_i32_ty, llvm_i32_ty]>;
1145f757f3fSDimitry Andricdef int_loongarch_iocsrwr_d : BaseInt<[], [llvm_i64_ty, llvm_i32_ty]>;
115bdd1243dSDimitry Andric
1165f757f3fSDimitry Andricdef int_loongarch_cpucfg : BaseInt<[llvm_i32_ty], [llvm_i32_ty]>;
117bdd1243dSDimitry Andric
1185f757f3fSDimitry Andricdef int_loongarch_asrtle_d : BaseInt<[], [llvm_i64_ty, llvm_i64_ty]>;
1195f757f3fSDimitry Andricdef int_loongarch_asrtgt_d : BaseInt<[], [llvm_i64_ty, llvm_i64_ty]>;
120bdd1243dSDimitry Andric
1215f757f3fSDimitry Andricdef int_loongarch_lddir_d : BaseInt<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
122bdd1243dSDimitry Andric                                    [ImmArg<ArgIndex<1>>]>;
1235f757f3fSDimitry Andricdef int_loongarch_ldpte_d : BaseInt<[], [llvm_i64_ty, llvm_i64_ty],
124bdd1243dSDimitry Andric                                    [ImmArg<ArgIndex<1>>]>;
125*7a6dacacSDimitry Andric
126*7a6dacacSDimitry Andricdef int_loongarch_frecipe_s : BaseInt<[llvm_float_ty], [llvm_float_ty],
127*7a6dacacSDimitry Andric                                      [IntrNoMem]>;
128*7a6dacacSDimitry Andricdef int_loongarch_frecipe_d : BaseInt<[llvm_double_ty], [llvm_double_ty],
129*7a6dacacSDimitry Andric                                      [IntrNoMem]>;
130*7a6dacacSDimitry Andricdef int_loongarch_frsqrte_s : BaseInt<[llvm_float_ty], [llvm_float_ty],
131*7a6dacacSDimitry Andric                                      [IntrNoMem]>;
132*7a6dacacSDimitry Andricdef int_loongarch_frsqrte_d : BaseInt<[llvm_double_ty], [llvm_double_ty],
133*7a6dacacSDimitry Andric                                      [IntrNoMem]>;
134bdd1243dSDimitry Andric} // TargetPrefix = "loongarch"
1355f757f3fSDimitry Andric
1365f757f3fSDimitry Andric/// Vector intrinsic
1375f757f3fSDimitry Andric
1385f757f3fSDimitry Andricclass VecInt<list<LLVMType> ret_types, list<LLVMType> param_types,
1395f757f3fSDimitry Andric             list<IntrinsicProperty> intr_properties = []>
1405f757f3fSDimitry Andric    : Intrinsic<ret_types, param_types, intr_properties>,
1415f757f3fSDimitry Andric      ClangBuiltin<!subst("int_loongarch", "__builtin", NAME)>;
1425f757f3fSDimitry Andric
1435f757f3fSDimitry Andric//===----------------------------------------------------------------------===//
1445f757f3fSDimitry Andric// LSX
1455f757f3fSDimitry Andric
1465f757f3fSDimitry Andriclet TargetPrefix = "loongarch" in {
1475f757f3fSDimitry Andric
1485f757f3fSDimitry Andricforeach inst = ["vadd_b", "vsub_b",
1495f757f3fSDimitry Andric                "vsadd_b", "vsadd_bu", "vssub_b", "vssub_bu",
1505f757f3fSDimitry Andric                "vavg_b", "vavg_bu", "vavgr_b", "vavgr_bu",
1515f757f3fSDimitry Andric                "vabsd_b", "vabsd_bu", "vadda_b",
1525f757f3fSDimitry Andric                "vmax_b", "vmax_bu", "vmin_b", "vmin_bu",
1535f757f3fSDimitry Andric                "vmul_b", "vmuh_b", "vmuh_bu",
1545f757f3fSDimitry Andric                "vdiv_b", "vdiv_bu", "vmod_b", "vmod_bu", "vsigncov_b",
1555f757f3fSDimitry Andric                "vand_v", "vor_v", "vxor_v", "vnor_v", "vandn_v", "vorn_v",
1565f757f3fSDimitry Andric                "vsll_b", "vsrl_b", "vsra_b", "vrotr_b", "vsrlr_b", "vsrar_b",
1575f757f3fSDimitry Andric                "vbitclr_b", "vbitset_b", "vbitrev_b",
1585f757f3fSDimitry Andric                "vseq_b", "vsle_b", "vsle_bu", "vslt_b", "vslt_bu",
1595f757f3fSDimitry Andric                "vpackev_b", "vpackod_b", "vpickev_b", "vpickod_b",
1605f757f3fSDimitry Andric                "vilvl_b", "vilvh_b"] in
1615f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v16i8_ty],
1625f757f3fSDimitry Andric                                       [llvm_v16i8_ty, llvm_v16i8_ty],
1635f757f3fSDimitry Andric                                       [IntrNoMem]>;
1645f757f3fSDimitry Andric
1655f757f3fSDimitry Andricforeach inst = ["vadd_h", "vsub_h",
1665f757f3fSDimitry Andric                "vsadd_h", "vsadd_hu", "vssub_h", "vssub_hu",
1675f757f3fSDimitry Andric                "vavg_h", "vavg_hu", "vavgr_h", "vavgr_hu",
1685f757f3fSDimitry Andric                "vabsd_h", "vabsd_hu", "vadda_h",
1695f757f3fSDimitry Andric                "vmax_h", "vmax_hu", "vmin_h", "vmin_hu",
1705f757f3fSDimitry Andric                "vmul_h", "vmuh_h", "vmuh_hu",
1715f757f3fSDimitry Andric                "vdiv_h", "vdiv_hu", "vmod_h", "vmod_hu", "vsigncov_h",
1725f757f3fSDimitry Andric                "vsll_h", "vsrl_h", "vsra_h", "vrotr_h", "vsrlr_h", "vsrar_h",
1735f757f3fSDimitry Andric                "vbitclr_h", "vbitset_h", "vbitrev_h",
1745f757f3fSDimitry Andric                "vseq_h", "vsle_h", "vsle_hu", "vslt_h", "vslt_hu",
1755f757f3fSDimitry Andric                "vpackev_h", "vpackod_h", "vpickev_h", "vpickod_h",
1765f757f3fSDimitry Andric                "vilvl_h", "vilvh_h"] in
1775f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v8i16_ty],
1785f757f3fSDimitry Andric                                       [llvm_v8i16_ty, llvm_v8i16_ty],
1795f757f3fSDimitry Andric                                       [IntrNoMem]>;
1805f757f3fSDimitry Andric
1815f757f3fSDimitry Andricforeach inst = ["vadd_w", "vsub_w",
1825f757f3fSDimitry Andric                "vsadd_w", "vsadd_wu", "vssub_w", "vssub_wu",
1835f757f3fSDimitry Andric                "vavg_w", "vavg_wu", "vavgr_w", "vavgr_wu",
1845f757f3fSDimitry Andric                "vabsd_w", "vabsd_wu", "vadda_w",
1855f757f3fSDimitry Andric                "vmax_w", "vmax_wu", "vmin_w", "vmin_wu",
1865f757f3fSDimitry Andric                "vmul_w", "vmuh_w", "vmuh_wu",
1875f757f3fSDimitry Andric                "vdiv_w", "vdiv_wu", "vmod_w", "vmod_wu", "vsigncov_w",
1885f757f3fSDimitry Andric                "vsll_w", "vsrl_w", "vsra_w", "vrotr_w", "vsrlr_w", "vsrar_w",
1895f757f3fSDimitry Andric                "vbitclr_w", "vbitset_w", "vbitrev_w",
1905f757f3fSDimitry Andric                "vseq_w", "vsle_w", "vsle_wu", "vslt_w", "vslt_wu",
1915f757f3fSDimitry Andric                "vpackev_w", "vpackod_w", "vpickev_w", "vpickod_w",
1925f757f3fSDimitry Andric                "vilvl_w", "vilvh_w"] in
1935f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v4i32_ty],
1945f757f3fSDimitry Andric                                       [llvm_v4i32_ty, llvm_v4i32_ty],
1955f757f3fSDimitry Andric                                       [IntrNoMem]>;
1965f757f3fSDimitry Andric
1975f757f3fSDimitry Andricforeach inst = ["vadd_d", "vadd_q", "vsub_d", "vsub_q",
1985f757f3fSDimitry Andric                "vsadd_d", "vsadd_du", "vssub_d", "vssub_du",
1995f757f3fSDimitry Andric                "vhaddw_q_d", "vhaddw_qu_du", "vhsubw_q_d", "vhsubw_qu_du",
2005f757f3fSDimitry Andric                "vaddwev_q_d", "vaddwod_q_d", "vsubwev_q_d", "vsubwod_q_d",
2015f757f3fSDimitry Andric                "vaddwev_q_du", "vaddwod_q_du", "vsubwev_q_du", "vsubwod_q_du",
2025f757f3fSDimitry Andric                "vaddwev_q_du_d", "vaddwod_q_du_d",
2035f757f3fSDimitry Andric                "vavg_d", "vavg_du", "vavgr_d", "vavgr_du",
2045f757f3fSDimitry Andric                "vabsd_d", "vabsd_du", "vadda_d",
2055f757f3fSDimitry Andric                "vmax_d", "vmax_du", "vmin_d", "vmin_du",
2065f757f3fSDimitry Andric                "vmul_d", "vmuh_d", "vmuh_du",
2075f757f3fSDimitry Andric                "vmulwev_q_d", "vmulwod_q_d", "vmulwev_q_du", "vmulwod_q_du",
2085f757f3fSDimitry Andric                "vmulwev_q_du_d", "vmulwod_q_du_d",
2095f757f3fSDimitry Andric                "vdiv_d", "vdiv_du", "vmod_d", "vmod_du", "vsigncov_d",
2105f757f3fSDimitry Andric                "vsll_d", "vsrl_d", "vsra_d", "vrotr_d", "vsrlr_d", "vsrar_d",
2115f757f3fSDimitry Andric                "vbitclr_d", "vbitset_d", "vbitrev_d",
2125f757f3fSDimitry Andric                "vseq_d", "vsle_d", "vsle_du", "vslt_d", "vslt_du",
2135f757f3fSDimitry Andric                "vpackev_d", "vpackod_d", "vpickev_d", "vpickod_d",
2145f757f3fSDimitry Andric                "vilvl_d", "vilvh_d"] in
2155f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v2i64_ty],
2165f757f3fSDimitry Andric                                       [llvm_v2i64_ty, llvm_v2i64_ty],
2175f757f3fSDimitry Andric                                       [IntrNoMem]>;
2185f757f3fSDimitry Andric
2195f757f3fSDimitry Andricforeach inst = ["vaddi_bu", "vsubi_bu",
2205f757f3fSDimitry Andric                "vmaxi_b", "vmaxi_bu", "vmini_b", "vmini_bu",
2215f757f3fSDimitry Andric                "vsat_b", "vsat_bu",
2225f757f3fSDimitry Andric                "vandi_b", "vori_b", "vxori_b", "vnori_b",
2235f757f3fSDimitry Andric                "vslli_b", "vsrli_b", "vsrai_b", "vrotri_b",
2245f757f3fSDimitry Andric                "vsrlri_b", "vsrari_b",
2255f757f3fSDimitry Andric                "vbitclri_b", "vbitseti_b", "vbitrevi_b",
2265f757f3fSDimitry Andric                "vseqi_b", "vslei_b", "vslei_bu", "vslti_b", "vslti_bu",
2275f757f3fSDimitry Andric                "vreplvei_b", "vbsll_v", "vbsrl_v", "vshuf4i_b"] in
2285f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v16i8_ty],
2295f757f3fSDimitry Andric                                       [llvm_v16i8_ty, llvm_i32_ty],
2305f757f3fSDimitry Andric                                       [IntrNoMem, ImmArg<ArgIndex<1>>]>;
2315f757f3fSDimitry Andricforeach inst = ["vaddi_hu", "vsubi_hu",
2325f757f3fSDimitry Andric                "vmaxi_h", "vmaxi_hu", "vmini_h", "vmini_hu",
2335f757f3fSDimitry Andric                "vsat_h", "vsat_hu",
2345f757f3fSDimitry Andric                "vslli_h", "vsrli_h", "vsrai_h", "vrotri_h",
2355f757f3fSDimitry Andric                "vsrlri_h", "vsrari_h",
2365f757f3fSDimitry Andric                "vbitclri_h", "vbitseti_h", "vbitrevi_h",
2375f757f3fSDimitry Andric                "vseqi_h", "vslei_h", "vslei_hu", "vslti_h", "vslti_hu",
2385f757f3fSDimitry Andric                "vreplvei_h", "vshuf4i_h"] in
2395f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v8i16_ty],
2405f757f3fSDimitry Andric                                       [llvm_v8i16_ty, llvm_i32_ty],
2415f757f3fSDimitry Andric                                       [IntrNoMem, ImmArg<ArgIndex<1>>]>;
2425f757f3fSDimitry Andricforeach inst = ["vaddi_wu", "vsubi_wu",
2435f757f3fSDimitry Andric                "vmaxi_w", "vmaxi_wu", "vmini_w", "vmini_wu",
2445f757f3fSDimitry Andric                "vsat_w", "vsat_wu",
2455f757f3fSDimitry Andric                "vslli_w", "vsrli_w", "vsrai_w", "vrotri_w",
2465f757f3fSDimitry Andric                "vsrlri_w", "vsrari_w",
2475f757f3fSDimitry Andric                "vbitclri_w", "vbitseti_w", "vbitrevi_w",
2485f757f3fSDimitry Andric                "vseqi_w", "vslei_w", "vslei_wu", "vslti_w", "vslti_wu",
2495f757f3fSDimitry Andric                "vreplvei_w", "vshuf4i_w"] in
2505f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v4i32_ty],
2515f757f3fSDimitry Andric                                       [llvm_v4i32_ty, llvm_i32_ty],
2525f757f3fSDimitry Andric                                       [IntrNoMem, ImmArg<ArgIndex<1>>]>;
2535f757f3fSDimitry Andricforeach inst = ["vaddi_du", "vsubi_du",
2545f757f3fSDimitry Andric                "vmaxi_d", "vmaxi_du", "vmini_d", "vmini_du",
2555f757f3fSDimitry Andric                "vsat_d", "vsat_du",
2565f757f3fSDimitry Andric                "vslli_d", "vsrli_d", "vsrai_d", "vrotri_d",
2575f757f3fSDimitry Andric                "vsrlri_d", "vsrari_d",
2585f757f3fSDimitry Andric                "vbitclri_d", "vbitseti_d", "vbitrevi_d",
2595f757f3fSDimitry Andric                "vseqi_d", "vslei_d", "vslei_du", "vslti_d", "vslti_du",
2605f757f3fSDimitry Andric                "vreplvei_d"] in
2615f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v2i64_ty],
2625f757f3fSDimitry Andric                                       [llvm_v2i64_ty, llvm_i32_ty],
2635f757f3fSDimitry Andric                                       [IntrNoMem, ImmArg<ArgIndex<1>>]>;
2645f757f3fSDimitry Andric
2655f757f3fSDimitry Andricforeach inst = ["vhaddw_h_b", "vhaddw_hu_bu", "vhsubw_h_b", "vhsubw_hu_bu",
2665f757f3fSDimitry Andric                "vaddwev_h_b", "vaddwod_h_b", "vsubwev_h_b", "vsubwod_h_b",
2675f757f3fSDimitry Andric                "vaddwev_h_bu", "vaddwod_h_bu", "vsubwev_h_bu", "vsubwod_h_bu",
2685f757f3fSDimitry Andric                "vaddwev_h_bu_b", "vaddwod_h_bu_b",
2695f757f3fSDimitry Andric                "vmulwev_h_b", "vmulwod_h_b", "vmulwev_h_bu", "vmulwod_h_bu",
2705f757f3fSDimitry Andric                "vmulwev_h_bu_b", "vmulwod_h_bu_b"] in
2715f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v8i16_ty],
2725f757f3fSDimitry Andric                                       [llvm_v16i8_ty, llvm_v16i8_ty],
2735f757f3fSDimitry Andric                                       [IntrNoMem]>;
2745f757f3fSDimitry Andric
2755f757f3fSDimitry Andricforeach inst = ["vhaddw_w_h", "vhaddw_wu_hu", "vhsubw_w_h", "vhsubw_wu_hu",
2765f757f3fSDimitry Andric                "vaddwev_w_h", "vaddwod_w_h", "vsubwev_w_h", "vsubwod_w_h",
2775f757f3fSDimitry Andric                "vaddwev_w_hu", "vaddwod_w_hu", "vsubwev_w_hu", "vsubwod_w_hu",
2785f757f3fSDimitry Andric                "vaddwev_w_hu_h", "vaddwod_w_hu_h",
2795f757f3fSDimitry Andric                "vmulwev_w_h", "vmulwod_w_h", "vmulwev_w_hu", "vmulwod_w_hu",
2805f757f3fSDimitry Andric                "vmulwev_w_hu_h", "vmulwod_w_hu_h"] in
2815f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v4i32_ty],
2825f757f3fSDimitry Andric                                       [llvm_v8i16_ty, llvm_v8i16_ty],
2835f757f3fSDimitry Andric                                       [IntrNoMem]>;
2845f757f3fSDimitry Andric
2855f757f3fSDimitry Andricforeach inst = ["vhaddw_d_w", "vhaddw_du_wu", "vhsubw_d_w", "vhsubw_du_wu",
2865f757f3fSDimitry Andric                "vaddwev_d_w", "vaddwod_d_w", "vsubwev_d_w", "vsubwod_d_w",
2875f757f3fSDimitry Andric                "vaddwev_d_wu", "vaddwod_d_wu", "vsubwev_d_wu", "vsubwod_d_wu",
2885f757f3fSDimitry Andric                "vaddwev_d_wu_w", "vaddwod_d_wu_w",
2895f757f3fSDimitry Andric                "vmulwev_d_w", "vmulwod_d_w", "vmulwev_d_wu", "vmulwod_d_wu",
2905f757f3fSDimitry Andric                "vmulwev_d_wu_w", "vmulwod_d_wu_w"] in
2915f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v2i64_ty],
2925f757f3fSDimitry Andric                                       [llvm_v4i32_ty, llvm_v4i32_ty],
2935f757f3fSDimitry Andric                                       [IntrNoMem]>;
2945f757f3fSDimitry Andric
2955f757f3fSDimitry Andricforeach inst = ["vsrln_b_h", "vsran_b_h", "vsrlrn_b_h", "vsrarn_b_h",
2965f757f3fSDimitry Andric                "vssrln_b_h", "vssran_b_h", "vssrln_bu_h", "vssran_bu_h",
2975f757f3fSDimitry Andric                "vssrlrn_b_h", "vssrarn_b_h", "vssrlrn_bu_h", "vssrarn_bu_h"] in
2985f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v16i8_ty],
2995f757f3fSDimitry Andric                                       [llvm_v8i16_ty, llvm_v8i16_ty],
3005f757f3fSDimitry Andric                                       [IntrNoMem]>;
3015f757f3fSDimitry Andric
3025f757f3fSDimitry Andricforeach inst = ["vsrln_h_w", "vsran_h_w", "vsrlrn_h_w", "vsrarn_h_w",
3035f757f3fSDimitry Andric                "vssrln_h_w", "vssran_h_w", "vssrln_hu_w", "vssran_hu_w",
3045f757f3fSDimitry Andric                "vssrlrn_h_w", "vssrarn_h_w", "vssrlrn_hu_w", "vssrarn_hu_w"] in
3055f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v8i16_ty],
3065f757f3fSDimitry Andric                                       [llvm_v4i32_ty, llvm_v4i32_ty],
3075f757f3fSDimitry Andric                                       [IntrNoMem]>;
3085f757f3fSDimitry Andric
3095f757f3fSDimitry Andricforeach inst = ["vsrln_w_d", "vsran_w_d", "vsrlrn_w_d", "vsrarn_w_d",
3105f757f3fSDimitry Andric                "vssrln_w_d", "vssran_w_d", "vssrln_wu_d", "vssran_wu_d",
3115f757f3fSDimitry Andric                "vssrlrn_w_d", "vssrarn_w_d", "vssrlrn_wu_d", "vssrarn_wu_d"] in
3125f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v4i32_ty],
3135f757f3fSDimitry Andric                                       [llvm_v2i64_ty, llvm_v2i64_ty],
3145f757f3fSDimitry Andric                                       [IntrNoMem]>;
3155f757f3fSDimitry Andric
3165f757f3fSDimitry Andricforeach inst = ["vmadd_b", "vmsub_b", "vfrstp_b", "vbitsel_v", "vshuf_b"] in
3175f757f3fSDimitry Andric  def int_loongarch_lsx_#inst
3185f757f3fSDimitry Andric    : VecInt<[llvm_v16i8_ty],
3195f757f3fSDimitry Andric             [llvm_v16i8_ty, llvm_v16i8_ty, llvm_v16i8_ty],
3205f757f3fSDimitry Andric             [IntrNoMem]>;
3215f757f3fSDimitry Andricforeach inst = ["vmadd_h", "vmsub_h", "vfrstp_h", "vshuf_h"] in
3225f757f3fSDimitry Andric  def int_loongarch_lsx_#inst
3235f757f3fSDimitry Andric    : VecInt<[llvm_v8i16_ty],
3245f757f3fSDimitry Andric             [llvm_v8i16_ty, llvm_v8i16_ty, llvm_v8i16_ty],
3255f757f3fSDimitry Andric             [IntrNoMem]>;
3265f757f3fSDimitry Andricforeach inst = ["vmadd_w", "vmsub_w", "vshuf_w"] in
3275f757f3fSDimitry Andric  def int_loongarch_lsx_#inst
3285f757f3fSDimitry Andric    : VecInt<[llvm_v4i32_ty],
3295f757f3fSDimitry Andric             [llvm_v4i32_ty, llvm_v4i32_ty, llvm_v4i32_ty],
3305f757f3fSDimitry Andric             [IntrNoMem]>;
3315f757f3fSDimitry Andricforeach inst = ["vmadd_d", "vmsub_d", "vshuf_d"] in
3325f757f3fSDimitry Andric  def int_loongarch_lsx_#inst
3335f757f3fSDimitry Andric    : VecInt<[llvm_v2i64_ty],
3345f757f3fSDimitry Andric             [llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],
3355f757f3fSDimitry Andric             [IntrNoMem]>;
3365f757f3fSDimitry Andric
3375f757f3fSDimitry Andricforeach inst = ["vsrlni_b_h", "vsrani_b_h", "vsrlrni_b_h", "vsrarni_b_h",
3385f757f3fSDimitry Andric                "vssrlni_b_h", "vssrani_b_h", "vssrlni_bu_h", "vssrani_bu_h",
3395f757f3fSDimitry Andric                "vssrlrni_b_h", "vssrarni_b_h", "vssrlrni_bu_h", "vssrarni_bu_h",
3405f757f3fSDimitry Andric                "vfrstpi_b", "vbitseli_b", "vextrins_b"] in
3415f757f3fSDimitry Andric  def int_loongarch_lsx_#inst
3425f757f3fSDimitry Andric    : VecInt<[llvm_v16i8_ty],
3435f757f3fSDimitry Andric             [llvm_v16i8_ty, llvm_v16i8_ty, llvm_i32_ty],
3445f757f3fSDimitry Andric             [IntrNoMem, ImmArg<ArgIndex<2>>]>;
3455f757f3fSDimitry Andricforeach inst = ["vsrlni_h_w", "vsrani_h_w", "vsrlrni_h_w", "vsrarni_h_w",
3465f757f3fSDimitry Andric                "vssrlni_h_w", "vssrani_h_w", "vssrlni_hu_w", "vssrani_hu_w",
3475f757f3fSDimitry Andric                "vssrlrni_h_w", "vssrarni_h_w", "vssrlrni_hu_w", "vssrarni_hu_w",
3485f757f3fSDimitry Andric                "vfrstpi_h", "vextrins_h"] in
3495f757f3fSDimitry Andric  def int_loongarch_lsx_#inst
3505f757f3fSDimitry Andric    : VecInt<[llvm_v8i16_ty],
3515f757f3fSDimitry Andric             [llvm_v8i16_ty, llvm_v8i16_ty, llvm_i32_ty],
3525f757f3fSDimitry Andric             [IntrNoMem, ImmArg<ArgIndex<2>>]>;
3535f757f3fSDimitry Andricforeach inst = ["vsrlni_w_d", "vsrani_w_d", "vsrlrni_w_d", "vsrarni_w_d",
3545f757f3fSDimitry Andric                "vssrlni_w_d", "vssrani_w_d", "vssrlni_wu_d", "vssrani_wu_d",
3555f757f3fSDimitry Andric                "vssrlrni_w_d", "vssrarni_w_d", "vssrlrni_wu_d", "vssrarni_wu_d",
3565f757f3fSDimitry Andric                "vpermi_w", "vextrins_w"] in
3575f757f3fSDimitry Andric  def int_loongarch_lsx_#inst
3585f757f3fSDimitry Andric    : VecInt<[llvm_v4i32_ty],
3595f757f3fSDimitry Andric             [llvm_v4i32_ty, llvm_v4i32_ty, llvm_i32_ty],
3605f757f3fSDimitry Andric             [IntrNoMem, ImmArg<ArgIndex<2>>]>;
3615f757f3fSDimitry Andricforeach inst = ["vsrlni_d_q", "vsrani_d_q", "vsrlrni_d_q", "vsrarni_d_q",
3625f757f3fSDimitry Andric                "vssrlni_d_q", "vssrani_d_q", "vssrlni_du_q", "vssrani_du_q",
3635f757f3fSDimitry Andric                "vssrlrni_d_q", "vssrarni_d_q", "vssrlrni_du_q", "vssrarni_du_q",
3645f757f3fSDimitry Andric                "vshuf4i_d", "vextrins_d"] in
3655f757f3fSDimitry Andric  def int_loongarch_lsx_#inst
3665f757f3fSDimitry Andric    : VecInt<[llvm_v2i64_ty],
3675f757f3fSDimitry Andric             [llvm_v2i64_ty, llvm_v2i64_ty, llvm_i32_ty],
3685f757f3fSDimitry Andric             [IntrNoMem, ImmArg<ArgIndex<2>>]>;
3695f757f3fSDimitry Andric
3705f757f3fSDimitry Andricforeach inst = ["vmaddwev_h_b", "vmaddwod_h_b", "vmaddwev_h_bu",
3715f757f3fSDimitry Andric                "vmaddwod_h_bu", "vmaddwev_h_bu_b", "vmaddwod_h_bu_b"] in
3725f757f3fSDimitry Andric  def int_loongarch_lsx_#inst
3735f757f3fSDimitry Andric    : VecInt<[llvm_v8i16_ty],
3745f757f3fSDimitry Andric             [llvm_v8i16_ty, llvm_v16i8_ty, llvm_v16i8_ty],
3755f757f3fSDimitry Andric             [IntrNoMem]>;
3765f757f3fSDimitry Andricforeach inst = ["vmaddwev_w_h", "vmaddwod_w_h", "vmaddwev_w_hu",
3775f757f3fSDimitry Andric                "vmaddwod_w_hu", "vmaddwev_w_hu_h", "vmaddwod_w_hu_h"] in
3785f757f3fSDimitry Andric  def int_loongarch_lsx_#inst
3795f757f3fSDimitry Andric    : VecInt<[llvm_v4i32_ty],
3805f757f3fSDimitry Andric             [llvm_v4i32_ty, llvm_v8i16_ty, llvm_v8i16_ty],
3815f757f3fSDimitry Andric             [IntrNoMem]>;
3825f757f3fSDimitry Andricforeach inst = ["vmaddwev_d_w", "vmaddwod_d_w", "vmaddwev_d_wu",
3835f757f3fSDimitry Andric                "vmaddwod_d_wu", "vmaddwev_d_wu_w", "vmaddwod_d_wu_w"] in
3845f757f3fSDimitry Andric  def int_loongarch_lsx_#inst
3855f757f3fSDimitry Andric    : VecInt<[llvm_v2i64_ty],
3865f757f3fSDimitry Andric             [llvm_v2i64_ty, llvm_v4i32_ty, llvm_v4i32_ty],
3875f757f3fSDimitry Andric             [IntrNoMem]>;
3885f757f3fSDimitry Andricforeach inst = ["vmaddwev_q_d", "vmaddwod_q_d", "vmaddwev_q_du",
3895f757f3fSDimitry Andric                "vmaddwod_q_du", "vmaddwev_q_du_d", "vmaddwod_q_du_d"] in
3905f757f3fSDimitry Andric  def int_loongarch_lsx_#inst
3915f757f3fSDimitry Andric    : VecInt<[llvm_v2i64_ty],
3925f757f3fSDimitry Andric             [llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],
3935f757f3fSDimitry Andric             [IntrNoMem]>;
3945f757f3fSDimitry Andric
3955f757f3fSDimitry Andricforeach inst = ["vsllwil_h_b", "vsllwil_hu_bu"] in
3965f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v8i16_ty],
3975f757f3fSDimitry Andric                                       [llvm_v16i8_ty, llvm_i32_ty],
3985f757f3fSDimitry Andric                                       [IntrNoMem, ImmArg<ArgIndex<1>>]>;
3995f757f3fSDimitry Andricforeach inst = ["vsllwil_w_h", "vsllwil_wu_hu"] in
4005f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v4i32_ty],
4015f757f3fSDimitry Andric                                       [llvm_v8i16_ty, llvm_i32_ty],
4025f757f3fSDimitry Andric                                       [IntrNoMem, ImmArg<ArgIndex<1>>]>;
4035f757f3fSDimitry Andricforeach inst = ["vsllwil_d_w", "vsllwil_du_wu"] in
4045f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v2i64_ty],
4055f757f3fSDimitry Andric                                       [llvm_v4i32_ty, llvm_i32_ty],
4065f757f3fSDimitry Andric                                       [IntrNoMem, ImmArg<ArgIndex<1>>]>;
4075f757f3fSDimitry Andric
4085f757f3fSDimitry Andricforeach inst = ["vneg_b", "vmskltz_b", "vmskgez_b", "vmsknz_b",
4095f757f3fSDimitry Andric                "vclo_b", "vclz_b", "vpcnt_b"] in
4105f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v16i8_ty], [llvm_v16i8_ty],
4115f757f3fSDimitry Andric                                       [IntrNoMem]>;
4125f757f3fSDimitry Andricforeach inst = ["vneg_h", "vmskltz_h", "vclo_h", "vclz_h", "vpcnt_h"] in
4135f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v8i16_ty], [llvm_v8i16_ty],
4145f757f3fSDimitry Andric                                       [IntrNoMem]>;
4155f757f3fSDimitry Andricforeach inst = ["vneg_w", "vmskltz_w", "vclo_w", "vclz_w", "vpcnt_w"] in
4165f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v4i32_ty], [llvm_v4i32_ty],
4175f757f3fSDimitry Andric                                       [IntrNoMem]>;
4185f757f3fSDimitry Andricforeach inst = ["vneg_d", "vexth_q_d", "vexth_qu_du", "vmskltz_d",
4195f757f3fSDimitry Andric                "vextl_q_d", "vextl_qu_du", "vclo_d", "vclz_d", "vpcnt_d"] in
4205f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v2i64_ty], [llvm_v2i64_ty],
4215f757f3fSDimitry Andric                                       [IntrNoMem]>;
4225f757f3fSDimitry Andric
4235f757f3fSDimitry Andricforeach inst = ["vexth_h_b", "vexth_hu_bu"] in
4245f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v8i16_ty], [llvm_v16i8_ty],
4255f757f3fSDimitry Andric                                       [IntrNoMem]>;
4265f757f3fSDimitry Andricforeach inst = ["vexth_w_h", "vexth_wu_hu"] in
4275f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v4i32_ty], [llvm_v8i16_ty],
4285f757f3fSDimitry Andric                                       [IntrNoMem]>;
4295f757f3fSDimitry Andricforeach inst = ["vexth_d_w", "vexth_du_wu"] in
4305f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v2i64_ty], [llvm_v4i32_ty],
4315f757f3fSDimitry Andric                                       [IntrNoMem]>;
4325f757f3fSDimitry Andric
4335f757f3fSDimitry Andricdef int_loongarch_lsx_vldi : VecInt<[llvm_v2i64_ty], [llvm_i32_ty],
4345f757f3fSDimitry Andric                                    [IntrNoMem, ImmArg<ArgIndex<0>>]>;
4355f757f3fSDimitry Andricdef int_loongarch_lsx_vrepli_b : VecInt<[llvm_v16i8_ty], [llvm_i32_ty],
4365f757f3fSDimitry Andric                                        [IntrNoMem, ImmArg<ArgIndex<0>>]>;
4375f757f3fSDimitry Andricdef int_loongarch_lsx_vrepli_h : VecInt<[llvm_v8i16_ty], [llvm_i32_ty],
4385f757f3fSDimitry Andric                                        [IntrNoMem, ImmArg<ArgIndex<0>>]>;
4395f757f3fSDimitry Andricdef int_loongarch_lsx_vrepli_w : VecInt<[llvm_v4i32_ty], [llvm_i32_ty],
4405f757f3fSDimitry Andric                                        [IntrNoMem, ImmArg<ArgIndex<0>>]>;
4415f757f3fSDimitry Andricdef int_loongarch_lsx_vrepli_d : VecInt<[llvm_v2i64_ty], [llvm_i32_ty],
4425f757f3fSDimitry Andric                                        [IntrNoMem, ImmArg<ArgIndex<0>>]>;
4435f757f3fSDimitry Andric
4445f757f3fSDimitry Andricdef int_loongarch_lsx_vreplgr2vr_b : VecInt<[llvm_v16i8_ty], [llvm_i32_ty],
4455f757f3fSDimitry Andric                                            [IntrNoMem]>;
4465f757f3fSDimitry Andricdef int_loongarch_lsx_vreplgr2vr_h : VecInt<[llvm_v8i16_ty], [llvm_i32_ty],
4475f757f3fSDimitry Andric                                            [IntrNoMem]>;
4485f757f3fSDimitry Andricdef int_loongarch_lsx_vreplgr2vr_w : VecInt<[llvm_v4i32_ty], [llvm_i32_ty],
4495f757f3fSDimitry Andric                                            [IntrNoMem]>;
4505f757f3fSDimitry Andricdef int_loongarch_lsx_vreplgr2vr_d : VecInt<[llvm_v2i64_ty], [llvm_i64_ty],
4515f757f3fSDimitry Andric                                            [IntrNoMem]>;
4525f757f3fSDimitry Andric
4535f757f3fSDimitry Andricdef int_loongarch_lsx_vinsgr2vr_b
4545f757f3fSDimitry Andric  : VecInt<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_i32_ty, llvm_i32_ty],
4555f757f3fSDimitry Andric           [IntrNoMem, ImmArg<ArgIndex<2>>]>;
4565f757f3fSDimitry Andricdef int_loongarch_lsx_vinsgr2vr_h
4575f757f3fSDimitry Andric  : VecInt<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_i32_ty, llvm_i32_ty],
4585f757f3fSDimitry Andric           [IntrNoMem, ImmArg<ArgIndex<2>>]>;
4595f757f3fSDimitry Andricdef int_loongarch_lsx_vinsgr2vr_w
4605f757f3fSDimitry Andric  : VecInt<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_i32_ty, llvm_i32_ty],
4615f757f3fSDimitry Andric           [IntrNoMem, ImmArg<ArgIndex<2>>]>;
4625f757f3fSDimitry Andricdef int_loongarch_lsx_vinsgr2vr_d
4635f757f3fSDimitry Andric  : VecInt<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_i64_ty, llvm_i32_ty],
4645f757f3fSDimitry Andric           [IntrNoMem, ImmArg<ArgIndex<2>>]>;
4655f757f3fSDimitry Andric
4665f757f3fSDimitry Andricdef int_loongarch_lsx_vreplve_b
4675f757f3fSDimitry Andric  : VecInt<[llvm_v16i8_ty], [llvm_v16i8_ty, llvm_i32_ty], [IntrNoMem]>;
4685f757f3fSDimitry Andricdef int_loongarch_lsx_vreplve_h
4695f757f3fSDimitry Andric  : VecInt<[llvm_v8i16_ty], [llvm_v8i16_ty, llvm_i32_ty], [IntrNoMem]>;
4705f757f3fSDimitry Andricdef int_loongarch_lsx_vreplve_w
4715f757f3fSDimitry Andric  : VecInt<[llvm_v4i32_ty], [llvm_v4i32_ty, llvm_i32_ty], [IntrNoMem]>;
4725f757f3fSDimitry Andricdef int_loongarch_lsx_vreplve_d
4735f757f3fSDimitry Andric  : VecInt<[llvm_v2i64_ty], [llvm_v2i64_ty, llvm_i32_ty], [IntrNoMem]>;
4745f757f3fSDimitry Andric
4755f757f3fSDimitry Andricforeach inst = ["vpickve2gr_b", "vpickve2gr_bu" ] in
4765f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_i32_ty],
4775f757f3fSDimitry Andric                                       [llvm_v16i8_ty, llvm_i32_ty],
4785f757f3fSDimitry Andric                                       [IntrNoMem, ImmArg<ArgIndex<1>>]>;
4795f757f3fSDimitry Andricforeach inst = ["vpickve2gr_h", "vpickve2gr_hu" ] in
4805f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_i32_ty],
4815f757f3fSDimitry Andric                                       [llvm_v8i16_ty, llvm_i32_ty],
4825f757f3fSDimitry Andric                                       [IntrNoMem, ImmArg<ArgIndex<1>>]>;
4835f757f3fSDimitry Andricforeach inst = ["vpickve2gr_w", "vpickve2gr_wu" ] in
4845f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_i32_ty],
4855f757f3fSDimitry Andric                                       [llvm_v4i32_ty, llvm_i32_ty],
4865f757f3fSDimitry Andric                                       [IntrNoMem, ImmArg<ArgIndex<1>>]>;
4875f757f3fSDimitry Andricforeach inst = ["vpickve2gr_d", "vpickve2gr_du" ] in
4885f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_i64_ty],
4895f757f3fSDimitry Andric                                       [llvm_v2i64_ty, llvm_i32_ty],
4905f757f3fSDimitry Andric                                       [IntrNoMem, ImmArg<ArgIndex<1>>]>;
4915f757f3fSDimitry Andric
4925f757f3fSDimitry Andricdef int_loongarch_lsx_bz_b : VecInt<[llvm_i32_ty], [llvm_v16i8_ty],
4935f757f3fSDimitry Andric                                    [IntrNoMem]>;
4945f757f3fSDimitry Andricdef int_loongarch_lsx_bz_h : VecInt<[llvm_i32_ty], [llvm_v8i16_ty],
4955f757f3fSDimitry Andric                                    [IntrNoMem]>;
4965f757f3fSDimitry Andricdef int_loongarch_lsx_bz_w : VecInt<[llvm_i32_ty], [llvm_v4i32_ty],
4975f757f3fSDimitry Andric                                    [IntrNoMem]>;
4985f757f3fSDimitry Andricdef int_loongarch_lsx_bz_d : VecInt<[llvm_i32_ty], [llvm_v2i64_ty],
4995f757f3fSDimitry Andric                                    [IntrNoMem]>;
5005f757f3fSDimitry Andricdef int_loongarch_lsx_bz_v : VecInt<[llvm_i32_ty], [llvm_v16i8_ty],
5015f757f3fSDimitry Andric                                    [IntrNoMem]>;
5025f757f3fSDimitry Andric
5035f757f3fSDimitry Andricdef int_loongarch_lsx_bnz_v : VecInt<[llvm_i32_ty], [llvm_v16i8_ty],
5045f757f3fSDimitry Andric                                     [IntrNoMem]>;
5055f757f3fSDimitry Andricdef int_loongarch_lsx_bnz_b : VecInt<[llvm_i32_ty], [llvm_v16i8_ty],
5065f757f3fSDimitry Andric                                     [IntrNoMem]>;
5075f757f3fSDimitry Andricdef int_loongarch_lsx_bnz_h : VecInt<[llvm_i32_ty], [llvm_v8i16_ty],
5085f757f3fSDimitry Andric                                     [IntrNoMem]>;
5095f757f3fSDimitry Andricdef int_loongarch_lsx_bnz_w : VecInt<[llvm_i32_ty], [llvm_v4i32_ty],
5105f757f3fSDimitry Andric                                     [IntrNoMem]>;
5115f757f3fSDimitry Andricdef int_loongarch_lsx_bnz_d : VecInt<[llvm_i32_ty], [llvm_v2i64_ty],
5125f757f3fSDimitry Andric                                     [IntrNoMem]>;
5135f757f3fSDimitry Andric
5145f757f3fSDimitry Andric// LSX Float
5155f757f3fSDimitry Andric
5165f757f3fSDimitry Andricforeach inst = ["vfadd_s", "vfsub_s", "vfmul_s", "vfdiv_s",
5175f757f3fSDimitry Andric                "vfmax_s", "vfmin_s", "vfmaxa_s", "vfmina_s"] in
5185f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v4f32_ty],
5195f757f3fSDimitry Andric                                       [llvm_v4f32_ty, llvm_v4f32_ty],
5205f757f3fSDimitry Andric                                       [IntrNoMem]>;
5215f757f3fSDimitry Andricforeach inst = ["vfadd_d", "vfsub_d", "vfmul_d", "vfdiv_d",
5225f757f3fSDimitry Andric                "vfmax_d", "vfmin_d", "vfmaxa_d", "vfmina_d"] in
5235f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v2f64_ty],
5245f757f3fSDimitry Andric                                       [llvm_v2f64_ty, llvm_v2f64_ty],
5255f757f3fSDimitry Andric                                       [IntrNoMem]>;
5265f757f3fSDimitry Andric
5275f757f3fSDimitry Andricforeach inst = ["vfmadd_s", "vfmsub_s", "vfnmadd_s", "vfnmsub_s"] in
5285f757f3fSDimitry Andric  def int_loongarch_lsx_#inst
5295f757f3fSDimitry Andric    : VecInt<[llvm_v4f32_ty],
5305f757f3fSDimitry Andric             [llvm_v4f32_ty, llvm_v4f32_ty, llvm_v4f32_ty],
5315f757f3fSDimitry Andric             [IntrNoMem]>;
5325f757f3fSDimitry Andricforeach inst = ["vfmadd_d", "vfmsub_d", "vfnmadd_d", "vfnmsub_d"] in
5335f757f3fSDimitry Andric  def int_loongarch_lsx_#inst
5345f757f3fSDimitry Andric    : VecInt<[llvm_v2f64_ty],
5355f757f3fSDimitry Andric             [llvm_v2f64_ty, llvm_v2f64_ty, llvm_v2f64_ty],
5365f757f3fSDimitry Andric             [IntrNoMem]>;
5375f757f3fSDimitry Andric
5385f757f3fSDimitry Andricforeach inst = ["vflogb_s", "vfsqrt_s", "vfrecip_s", "vfrsqrt_s", "vfrint_s",
539*7a6dacacSDimitry Andric                "vfrecipe_s", "vfrsqrte_s",
5405f757f3fSDimitry Andric                "vfrintrne_s", "vfrintrz_s", "vfrintrp_s", "vfrintrm_s"] in
5415f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v4f32_ty], [llvm_v4f32_ty],
5425f757f3fSDimitry Andric                                       [IntrNoMem]>;
5435f757f3fSDimitry Andricforeach inst = ["vflogb_d", "vfsqrt_d", "vfrecip_d", "vfrsqrt_d", "vfrint_d",
544*7a6dacacSDimitry Andric                "vfrecipe_d", "vfrsqrte_d",
5455f757f3fSDimitry Andric                "vfrintrne_d", "vfrintrz_d", "vfrintrp_d", "vfrintrm_d"] in
5465f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v2f64_ty], [llvm_v2f64_ty],
5475f757f3fSDimitry Andric                                       [IntrNoMem]>;
5485f757f3fSDimitry Andric
5495f757f3fSDimitry Andricforeach inst = ["vfcvtl_s_h", "vfcvth_s_h"] in
5505f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v4f32_ty], [llvm_v8i16_ty],
5515f757f3fSDimitry Andric                                       [IntrNoMem]>;
5525f757f3fSDimitry Andricforeach inst = ["vfcvtl_d_s", "vfcvth_d_s"] in
5535f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v2f64_ty], [llvm_v4f32_ty],
5545f757f3fSDimitry Andric                                       [IntrNoMem]>;
5555f757f3fSDimitry Andric
5565f757f3fSDimitry Andricforeach inst = ["vftintrne_w_s", "vftintrz_w_s", "vftintrp_w_s", "vftintrm_w_s",
5575f757f3fSDimitry Andric                "vftint_w_s", "vftintrz_wu_s", "vftint_wu_s", "vfclass_s"] in
5585f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v4i32_ty], [llvm_v4f32_ty],
5595f757f3fSDimitry Andric                                       [IntrNoMem]>;
5605f757f3fSDimitry Andricforeach inst = ["vftintrne_l_d", "vftintrz_l_d", "vftintrp_l_d", "vftintrm_l_d",
5615f757f3fSDimitry Andric                "vftint_l_d", "vftintrz_lu_d", "vftint_lu_d", "vfclass_d"] in
5625f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v2i64_ty], [llvm_v2f64_ty],
5635f757f3fSDimitry Andric                                       [IntrNoMem]>;
5645f757f3fSDimitry Andric
5655f757f3fSDimitry Andricforeach inst = ["vftintrnel_l_s", "vftintrneh_l_s", "vftintrzl_l_s",
5665f757f3fSDimitry Andric                "vftintrzh_l_s", "vftintrpl_l_s", "vftintrph_l_s",
5675f757f3fSDimitry Andric                "vftintrml_l_s", "vftintrmh_l_s", "vftintl_l_s",
5685f757f3fSDimitry Andric                "vftinth_l_s"] in
5695f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v2i64_ty], [llvm_v4f32_ty],
5705f757f3fSDimitry Andric                                       [IntrNoMem]>;
5715f757f3fSDimitry Andric
5725f757f3fSDimitry Andricforeach inst = ["vffint_s_w", "vffint_s_wu"] in
5735f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v4f32_ty], [llvm_v4i32_ty],
5745f757f3fSDimitry Andric                                       [IntrNoMem]>;
5755f757f3fSDimitry Andricforeach inst = ["vffint_d_l", "vffint_d_lu"] in
5765f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v2f64_ty], [llvm_v2i64_ty],
5775f757f3fSDimitry Andric                                       [IntrNoMem]>;
5785f757f3fSDimitry Andric
5795f757f3fSDimitry Andricforeach inst = ["vffintl_d_w", "vffinth_d_w"] in
5805f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v2f64_ty], [llvm_v4i32_ty],
5815f757f3fSDimitry Andric                                       [IntrNoMem]>;
5825f757f3fSDimitry Andric
5835f757f3fSDimitry Andricforeach inst = ["vffint_s_l"] in
5845f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v4f32_ty],
5855f757f3fSDimitry Andric                                       [llvm_v2i64_ty, llvm_v2i64_ty],
5865f757f3fSDimitry Andric                                       [IntrNoMem]>;
5875f757f3fSDimitry Andricforeach inst = ["vftintrne_w_d", "vftintrz_w_d", "vftintrp_w_d", "vftintrm_w_d",
5885f757f3fSDimitry Andric                "vftint_w_d"] in
5895f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v4i32_ty],
5905f757f3fSDimitry Andric                                       [llvm_v2f64_ty, llvm_v2f64_ty],
5915f757f3fSDimitry Andric                                       [IntrNoMem]>;
5925f757f3fSDimitry Andric
5935f757f3fSDimitry Andricforeach inst = ["vfcvt_h_s"] in
5945f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v8i16_ty],
5955f757f3fSDimitry Andric                                       [llvm_v4f32_ty, llvm_v4f32_ty],
5965f757f3fSDimitry Andric                                       [IntrNoMem]>;
5975f757f3fSDimitry Andricforeach inst = ["vfcvt_s_d"] in
5985f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v4f32_ty],
5995f757f3fSDimitry Andric                                       [llvm_v2f64_ty, llvm_v2f64_ty],
6005f757f3fSDimitry Andric                                       [IntrNoMem]>;
6015f757f3fSDimitry Andric
6025f757f3fSDimitry Andricforeach inst = ["vfcmp_caf_s", "vfcmp_cun_s", "vfcmp_ceq_s", "vfcmp_cueq_s",
6035f757f3fSDimitry Andric                "vfcmp_clt_s", "vfcmp_cult_s", "vfcmp_cle_s", "vfcmp_cule_s",
6045f757f3fSDimitry Andric                "vfcmp_cne_s", "vfcmp_cor_s", "vfcmp_cune_s",
6055f757f3fSDimitry Andric                "vfcmp_saf_s", "vfcmp_sun_s", "vfcmp_seq_s", "vfcmp_sueq_s",
6065f757f3fSDimitry Andric                "vfcmp_slt_s", "vfcmp_sult_s", "vfcmp_sle_s", "vfcmp_sule_s",
6075f757f3fSDimitry Andric                "vfcmp_sne_s", "vfcmp_sor_s", "vfcmp_sune_s"] in
6085f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v4i32_ty],
6095f757f3fSDimitry Andric                                       [llvm_v4f32_ty, llvm_v4f32_ty],
6105f757f3fSDimitry Andric                                       [IntrNoMem]>;
6115f757f3fSDimitry Andricforeach inst = ["vfcmp_caf_d", "vfcmp_cun_d", "vfcmp_ceq_d", "vfcmp_cueq_d",
6125f757f3fSDimitry Andric                "vfcmp_clt_d", "vfcmp_cult_d", "vfcmp_cle_d", "vfcmp_cule_d",
6135f757f3fSDimitry Andric                "vfcmp_cne_d", "vfcmp_cor_d", "vfcmp_cune_d",
6145f757f3fSDimitry Andric                "vfcmp_saf_d", "vfcmp_sun_d", "vfcmp_seq_d", "vfcmp_sueq_d",
6155f757f3fSDimitry Andric                "vfcmp_slt_d", "vfcmp_sult_d", "vfcmp_sle_d", "vfcmp_sule_d",
6165f757f3fSDimitry Andric                "vfcmp_sne_d", "vfcmp_sor_d", "vfcmp_sune_d"] in
6175f757f3fSDimitry Andric  def int_loongarch_lsx_#inst : VecInt<[llvm_v2i64_ty],
6185f757f3fSDimitry Andric                                       [llvm_v2f64_ty, llvm_v2f64_ty],
6195f757f3fSDimitry Andric                                       [IntrNoMem]>;
6205f757f3fSDimitry Andric
6215f757f3fSDimitry Andric// LSX load/store
6225f757f3fSDimitry Andricdef int_loongarch_lsx_vld
6235f757f3fSDimitry Andric  : VecInt<[llvm_v16i8_ty], [llvm_ptr_ty, llvm_i32_ty],
6245f757f3fSDimitry Andric           [IntrReadMem, IntrArgMemOnly, ImmArg<ArgIndex<1>>]>;
6255f757f3fSDimitry Andricdef int_loongarch_lsx_vldx
6265f757f3fSDimitry Andric  : VecInt<[llvm_v16i8_ty], [llvm_ptr_ty, llvm_i64_ty],
6275f757f3fSDimitry Andric           [IntrReadMem, IntrArgMemOnly]>;
6285f757f3fSDimitry Andricdef int_loongarch_lsx_vldrepl_b
6295f757f3fSDimitry Andric  : VecInt<[llvm_v16i8_ty], [llvm_ptr_ty, llvm_i32_ty],
6305f757f3fSDimitry Andric           [IntrReadMem, IntrArgMemOnly, ImmArg<ArgIndex<1>>]>;
6315f757f3fSDimitry Andricdef int_loongarch_lsx_vldrepl_h
6325f757f3fSDimitry Andric  : VecInt<[llvm_v8i16_ty], [llvm_ptr_ty, llvm_i32_ty],
6335f757f3fSDimitry Andric           [IntrReadMem, IntrArgMemOnly, ImmArg<ArgIndex<1>>]>;
6345f757f3fSDimitry Andricdef int_loongarch_lsx_vldrepl_w
6355f757f3fSDimitry Andric  : VecInt<[llvm_v4i32_ty], [llvm_ptr_ty, llvm_i32_ty],
6365f757f3fSDimitry Andric           [IntrReadMem, IntrArgMemOnly, ImmArg<ArgIndex<1>>]>;
6375f757f3fSDimitry Andricdef int_loongarch_lsx_vldrepl_d
6385f757f3fSDimitry Andric  : VecInt<[llvm_v2i64_ty], [llvm_ptr_ty, llvm_i32_ty],
6395f757f3fSDimitry Andric           [IntrReadMem, IntrArgMemOnly, ImmArg<ArgIndex<1>>]>;
6405f757f3fSDimitry Andric
6415f757f3fSDimitry Andricdef int_loongarch_lsx_vst
6425f757f3fSDimitry Andric  : VecInt<[], [llvm_v16i8_ty, llvm_ptr_ty, llvm_i32_ty],
6435f757f3fSDimitry Andric           [IntrWriteMem, IntrArgMemOnly, ImmArg<ArgIndex<2>>]>;
6445f757f3fSDimitry Andricdef int_loongarch_lsx_vstx
6455f757f3fSDimitry Andric  : VecInt<[], [llvm_v16i8_ty, llvm_ptr_ty, llvm_i64_ty],
6465f757f3fSDimitry Andric           [IntrWriteMem, IntrArgMemOnly]>;
6475f757f3fSDimitry Andricdef int_loongarch_lsx_vstelm_b
6485f757f3fSDimitry Andric  : VecInt<[], [llvm_v16i8_ty, llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
6495f757f3fSDimitry Andric           [IntrWriteMem, IntrArgMemOnly, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<3>>]>;
6505f757f3fSDimitry Andricdef int_loongarch_lsx_vstelm_h
6515f757f3fSDimitry Andric  : VecInt<[], [llvm_v8i16_ty, llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
6525f757f3fSDimitry Andric           [IntrWriteMem, IntrArgMemOnly, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<3>>]>;
6535f757f3fSDimitry Andricdef int_loongarch_lsx_vstelm_w
6545f757f3fSDimitry Andric  : VecInt<[], [llvm_v4i32_ty, llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
6555f757f3fSDimitry Andric           [IntrWriteMem, IntrArgMemOnly, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<3>>]>;
6565f757f3fSDimitry Andricdef int_loongarch_lsx_vstelm_d
6575f757f3fSDimitry Andric  : VecInt<[], [llvm_v2i64_ty, llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
6585f757f3fSDimitry Andric           [IntrWriteMem, IntrArgMemOnly, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<3>>]>;
6595f757f3fSDimitry Andric
6605f757f3fSDimitry Andric} // TargetPrefix = "loongarch"
6615f757f3fSDimitry Andric
6625f757f3fSDimitry Andric//===----------------------------------------------------------------------===//
6635f757f3fSDimitry Andric// LASX
6645f757f3fSDimitry Andric
6655f757f3fSDimitry Andriclet TargetPrefix = "loongarch" in {
6665f757f3fSDimitry Andricforeach inst = ["xvadd_b", "xvsub_b",
6675f757f3fSDimitry Andric                "xvsadd_b", "xvsadd_bu", "xvssub_b", "xvssub_bu",
6685f757f3fSDimitry Andric                "xvavg_b", "xvavg_bu", "xvavgr_b", "xvavgr_bu",
6695f757f3fSDimitry Andric                "xvabsd_b", "xvabsd_bu", "xvadda_b",
6705f757f3fSDimitry Andric                "xvmax_b", "xvmax_bu", "xvmin_b", "xvmin_bu",
6715f757f3fSDimitry Andric                "xvmul_b", "xvmuh_b", "xvmuh_bu",
6725f757f3fSDimitry Andric                "xvdiv_b", "xvdiv_bu", "xvmod_b", "xvmod_bu", "xvsigncov_b",
6735f757f3fSDimitry Andric                "xvand_v", "xvor_v", "xvxor_v", "xvnor_v", "xvandn_v", "xvorn_v",
6745f757f3fSDimitry Andric                "xvsll_b", "xvsrl_b", "xvsra_b", "xvrotr_b", "xvsrlr_b", "xvsrar_b",
6755f757f3fSDimitry Andric                "xvbitclr_b", "xvbitset_b", "xvbitrev_b",
6765f757f3fSDimitry Andric                "xvseq_b", "xvsle_b", "xvsle_bu", "xvslt_b", "xvslt_bu",
6775f757f3fSDimitry Andric                "xvpackev_b", "xvpackod_b", "xvpickev_b", "xvpickod_b",
6785f757f3fSDimitry Andric                "xvilvl_b", "xvilvh_b"] in
6795f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v32i8_ty],
6805f757f3fSDimitry Andric                                        [llvm_v32i8_ty, llvm_v32i8_ty],
6815f757f3fSDimitry Andric                                        [IntrNoMem]>;
6825f757f3fSDimitry Andric
6835f757f3fSDimitry Andricforeach inst = ["xvadd_h", "xvsub_h",
6845f757f3fSDimitry Andric                "xvsadd_h", "xvsadd_hu", "xvssub_h", "xvssub_hu",
6855f757f3fSDimitry Andric                "xvavg_h", "xvavg_hu", "xvavgr_h", "xvavgr_hu",
6865f757f3fSDimitry Andric                "xvabsd_h", "xvabsd_hu", "xvadda_h",
6875f757f3fSDimitry Andric                "xvmax_h", "xvmax_hu", "xvmin_h", "xvmin_hu",
6885f757f3fSDimitry Andric                "xvmul_h", "xvmuh_h", "xvmuh_hu",
6895f757f3fSDimitry Andric                "xvdiv_h", "xvdiv_hu", "xvmod_h", "xvmod_hu", "xvsigncov_h",
6905f757f3fSDimitry Andric                "xvsll_h", "xvsrl_h", "xvsra_h", "xvrotr_h", "xvsrlr_h", "xvsrar_h",
6915f757f3fSDimitry Andric                "xvbitclr_h", "xvbitset_h", "xvbitrev_h",
6925f757f3fSDimitry Andric                "xvseq_h", "xvsle_h", "xvsle_hu", "xvslt_h", "xvslt_hu",
6935f757f3fSDimitry Andric                "xvpackev_h", "xvpackod_h", "xvpickev_h", "xvpickod_h",
6945f757f3fSDimitry Andric                "xvilvl_h", "xvilvh_h"] in
6955f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v16i16_ty],
6965f757f3fSDimitry Andric                                        [llvm_v16i16_ty, llvm_v16i16_ty],
6975f757f3fSDimitry Andric                                        [IntrNoMem]>;
6985f757f3fSDimitry Andric
6995f757f3fSDimitry Andricforeach inst = ["xvadd_w", "xvsub_w",
7005f757f3fSDimitry Andric                "xvsadd_w", "xvsadd_wu", "xvssub_w", "xvssub_wu",
7015f757f3fSDimitry Andric                "xvavg_w", "xvavg_wu", "xvavgr_w", "xvavgr_wu",
7025f757f3fSDimitry Andric                "xvabsd_w", "xvabsd_wu", "xvadda_w",
7035f757f3fSDimitry Andric                "xvmax_w", "xvmax_wu", "xvmin_w", "xvmin_wu",
7045f757f3fSDimitry Andric                "xvmul_w", "xvmuh_w", "xvmuh_wu",
7055f757f3fSDimitry Andric                "xvdiv_w", "xvdiv_wu", "xvmod_w", "xvmod_wu", "xvsigncov_w",
7065f757f3fSDimitry Andric                "xvsll_w", "xvsrl_w", "xvsra_w", "xvrotr_w", "xvsrlr_w", "xvsrar_w",
7075f757f3fSDimitry Andric                "xvbitclr_w", "xvbitset_w", "xvbitrev_w",
7085f757f3fSDimitry Andric                "xvseq_w", "xvsle_w", "xvsle_wu", "xvslt_w", "xvslt_wu",
7095f757f3fSDimitry Andric                "xvpackev_w", "xvpackod_w", "xvpickev_w", "xvpickod_w",
7105f757f3fSDimitry Andric                "xvilvl_w", "xvilvh_w", "xvperm_w"] in
7115f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8i32_ty],
7125f757f3fSDimitry Andric                                        [llvm_v8i32_ty, llvm_v8i32_ty],
7135f757f3fSDimitry Andric                                        [IntrNoMem]>;
7145f757f3fSDimitry Andric
7155f757f3fSDimitry Andricforeach inst = ["xvadd_d", "xvadd_q", "xvsub_d", "xvsub_q",
7165f757f3fSDimitry Andric                "xvsadd_d", "xvsadd_du", "xvssub_d", "xvssub_du",
7175f757f3fSDimitry Andric                "xvhaddw_q_d", "xvhaddw_qu_du", "xvhsubw_q_d", "xvhsubw_qu_du",
7185f757f3fSDimitry Andric                "xvaddwev_q_d", "xvaddwod_q_d", "xvsubwev_q_d", "xvsubwod_q_d",
7195f757f3fSDimitry Andric                "xvaddwev_q_du", "xvaddwod_q_du", "xvsubwev_q_du", "xvsubwod_q_du",
7205f757f3fSDimitry Andric                "xvaddwev_q_du_d", "xvaddwod_q_du_d",
7215f757f3fSDimitry Andric                "xvavg_d", "xvavg_du", "xvavgr_d", "xvavgr_du",
7225f757f3fSDimitry Andric                "xvabsd_d", "xvabsd_du", "xvadda_d",
7235f757f3fSDimitry Andric                "xvmax_d", "xvmax_du", "xvmin_d", "xvmin_du",
7245f757f3fSDimitry Andric                "xvmul_d", "xvmuh_d", "xvmuh_du",
7255f757f3fSDimitry Andric                "xvmulwev_q_d", "xvmulwod_q_d", "xvmulwev_q_du", "xvmulwod_q_du",
7265f757f3fSDimitry Andric                "xvmulwev_q_du_d", "xvmulwod_q_du_d",
7275f757f3fSDimitry Andric                "xvdiv_d", "xvdiv_du", "xvmod_d", "xvmod_du", "xvsigncov_d",
7285f757f3fSDimitry Andric                "xvsll_d", "xvsrl_d", "xvsra_d", "xvrotr_d", "xvsrlr_d", "xvsrar_d",
7295f757f3fSDimitry Andric                "xvbitclr_d", "xvbitset_d", "xvbitrev_d",
7305f757f3fSDimitry Andric                "xvseq_d", "xvsle_d", "xvsle_du", "xvslt_d", "xvslt_du",
7315f757f3fSDimitry Andric                "xvpackev_d", "xvpackod_d", "xvpickev_d", "xvpickod_d",
7325f757f3fSDimitry Andric                "xvilvl_d", "xvilvh_d"] in
7335f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v4i64_ty],
7345f757f3fSDimitry Andric                                        [llvm_v4i64_ty, llvm_v4i64_ty],
7355f757f3fSDimitry Andric                                        [IntrNoMem]>;
7365f757f3fSDimitry Andric
7375f757f3fSDimitry Andricforeach inst = ["xvaddi_bu", "xvsubi_bu",
7385f757f3fSDimitry Andric                "xvmaxi_b", "xvmaxi_bu", "xvmini_b", "xvmini_bu",
7395f757f3fSDimitry Andric                "xvsat_b", "xvsat_bu",
7405f757f3fSDimitry Andric                "xvandi_b", "xvori_b", "xvxori_b", "xvnori_b",
7415f757f3fSDimitry Andric                "xvslli_b", "xvsrli_b", "xvsrai_b", "xvrotri_b",
7425f757f3fSDimitry Andric                "xvsrlri_b", "xvsrari_b",
7435f757f3fSDimitry Andric                "xvbitclri_b", "xvbitseti_b", "xvbitrevi_b",
7445f757f3fSDimitry Andric                "xvseqi_b", "xvslei_b", "xvslei_bu", "xvslti_b", "xvslti_bu",
7455f757f3fSDimitry Andric                "xvrepl128vei_b", "xvbsll_v", "xvbsrl_v", "xvshuf4i_b"] in
7465f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v32i8_ty],
7475f757f3fSDimitry Andric                                        [llvm_v32i8_ty, llvm_i32_ty],
7485f757f3fSDimitry Andric                                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
7495f757f3fSDimitry Andricforeach inst = ["xvaddi_hu", "xvsubi_hu",
7505f757f3fSDimitry Andric                "xvmaxi_h", "xvmaxi_hu", "xvmini_h", "xvmini_hu",
7515f757f3fSDimitry Andric                "xvsat_h", "xvsat_hu",
7525f757f3fSDimitry Andric                "xvslli_h", "xvsrli_h", "xvsrai_h", "xvrotri_h",
7535f757f3fSDimitry Andric                "xvsrlri_h", "xvsrari_h",
7545f757f3fSDimitry Andric                "xvbitclri_h", "xvbitseti_h", "xvbitrevi_h",
7555f757f3fSDimitry Andric                "xvseqi_h", "xvslei_h", "xvslei_hu", "xvslti_h", "xvslti_hu",
7565f757f3fSDimitry Andric                "xvrepl128vei_h", "xvshuf4i_h"] in
7575f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v16i16_ty],
7585f757f3fSDimitry Andric                                        [llvm_v16i16_ty, llvm_i32_ty],
7595f757f3fSDimitry Andric                                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
7605f757f3fSDimitry Andricforeach inst = ["xvaddi_wu", "xvsubi_wu",
7615f757f3fSDimitry Andric                "xvmaxi_w", "xvmaxi_wu", "xvmini_w", "xvmini_wu",
7625f757f3fSDimitry Andric                "xvsat_w", "xvsat_wu",
7635f757f3fSDimitry Andric                "xvslli_w", "xvsrli_w", "xvsrai_w", "xvrotri_w",
7645f757f3fSDimitry Andric                "xvsrlri_w", "xvsrari_w",
7655f757f3fSDimitry Andric                "xvbitclri_w", "xvbitseti_w", "xvbitrevi_w",
7665f757f3fSDimitry Andric                "xvseqi_w", "xvslei_w", "xvslei_wu", "xvslti_w", "xvslti_wu",
7675f757f3fSDimitry Andric                "xvrepl128vei_w", "xvshuf4i_w", "xvpickve_w"] in
7685f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8i32_ty],
7695f757f3fSDimitry Andric                                        [llvm_v8i32_ty, llvm_i32_ty],
7705f757f3fSDimitry Andric                                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
7715f757f3fSDimitry Andricforeach inst = ["xvaddi_du", "xvsubi_du",
7725f757f3fSDimitry Andric                "xvmaxi_d", "xvmaxi_du", "xvmini_d", "xvmini_du",
7735f757f3fSDimitry Andric                "xvsat_d", "xvsat_du",
7745f757f3fSDimitry Andric                "xvslli_d", "xvsrli_d", "xvsrai_d", "xvrotri_d",
7755f757f3fSDimitry Andric                "xvsrlri_d", "xvsrari_d",
7765f757f3fSDimitry Andric                "xvbitclri_d", "xvbitseti_d", "xvbitrevi_d",
7775f757f3fSDimitry Andric                "xvseqi_d", "xvslei_d", "xvslei_du", "xvslti_d", "xvslti_du",
7785f757f3fSDimitry Andric                "xvrepl128vei_d", "xvpermi_d", "xvpickve_d"] in
7795f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v4i64_ty],
7805f757f3fSDimitry Andric                                        [llvm_v4i64_ty, llvm_i32_ty],
7815f757f3fSDimitry Andric                                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
7825f757f3fSDimitry Andric
7835f757f3fSDimitry Andricforeach inst = ["xvhaddw_h_b", "xvhaddw_hu_bu", "xvhsubw_h_b", "xvhsubw_hu_bu",
7845f757f3fSDimitry Andric                "xvaddwev_h_b", "xvaddwod_h_b", "xvsubwev_h_b", "xvsubwod_h_b",
7855f757f3fSDimitry Andric                "xvaddwev_h_bu", "xvaddwod_h_bu", "xvsubwev_h_bu", "xvsubwod_h_bu",
7865f757f3fSDimitry Andric                "xvaddwev_h_bu_b", "xvaddwod_h_bu_b",
7875f757f3fSDimitry Andric                "xvmulwev_h_b", "xvmulwod_h_b", "xvmulwev_h_bu", "xvmulwod_h_bu",
7885f757f3fSDimitry Andric                "xvmulwev_h_bu_b", "xvmulwod_h_bu_b"] in
7895f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v16i16_ty],
7905f757f3fSDimitry Andric                                        [llvm_v32i8_ty, llvm_v32i8_ty],
7915f757f3fSDimitry Andric                                        [IntrNoMem]>;
7925f757f3fSDimitry Andric
7935f757f3fSDimitry Andricforeach inst = ["xvhaddw_w_h", "xvhaddw_wu_hu", "xvhsubw_w_h", "xvhsubw_wu_hu",
7945f757f3fSDimitry Andric                "xvaddwev_w_h", "xvaddwod_w_h", "xvsubwev_w_h", "xvsubwod_w_h",
7955f757f3fSDimitry Andric                "xvaddwev_w_hu", "xvaddwod_w_hu", "xvsubwev_w_hu", "xvsubwod_w_hu",
7965f757f3fSDimitry Andric                "xvaddwev_w_hu_h", "xvaddwod_w_hu_h",
7975f757f3fSDimitry Andric                "xvmulwev_w_h", "xvmulwod_w_h", "xvmulwev_w_hu", "xvmulwod_w_hu",
7985f757f3fSDimitry Andric                "xvmulwev_w_hu_h", "xvmulwod_w_hu_h"] in
7995f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8i32_ty],
8005f757f3fSDimitry Andric                                        [llvm_v16i16_ty, llvm_v16i16_ty],
8015f757f3fSDimitry Andric                                        [IntrNoMem]>;
8025f757f3fSDimitry Andric
8035f757f3fSDimitry Andricforeach inst = ["xvhaddw_d_w", "xvhaddw_du_wu", "xvhsubw_d_w", "xvhsubw_du_wu",
8045f757f3fSDimitry Andric                "xvaddwev_d_w", "xvaddwod_d_w", "xvsubwev_d_w", "xvsubwod_d_w",
8055f757f3fSDimitry Andric                "xvaddwev_d_wu", "xvaddwod_d_wu", "xvsubwev_d_wu", "xvsubwod_d_wu",
8065f757f3fSDimitry Andric                "xvaddwev_d_wu_w", "xvaddwod_d_wu_w",
8075f757f3fSDimitry Andric                "xvmulwev_d_w", "xvmulwod_d_w", "xvmulwev_d_wu", "xvmulwod_d_wu",
8085f757f3fSDimitry Andric                "xvmulwev_d_wu_w", "xvmulwod_d_wu_w"] in
8095f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v4i64_ty],
8105f757f3fSDimitry Andric                                        [llvm_v8i32_ty, llvm_v8i32_ty],
8115f757f3fSDimitry Andric                                        [IntrNoMem]>;
8125f757f3fSDimitry Andric
8135f757f3fSDimitry Andricforeach inst = ["xvsrln_b_h", "xvsran_b_h", "xvsrlrn_b_h", "xvsrarn_b_h",
8145f757f3fSDimitry Andric                "xvssrln_b_h", "xvssran_b_h", "xvssrln_bu_h", "xvssran_bu_h",
8155f757f3fSDimitry Andric                "xvssrlrn_b_h", "xvssrarn_b_h", "xvssrlrn_bu_h", "xvssrarn_bu_h"] in
8165f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v32i8_ty],
8175f757f3fSDimitry Andric                                        [llvm_v16i16_ty, llvm_v16i16_ty],
8185f757f3fSDimitry Andric                                        [IntrNoMem]>;
8195f757f3fSDimitry Andric
8205f757f3fSDimitry Andricforeach inst = ["xvsrln_h_w", "xvsran_h_w", "xvsrlrn_h_w", "xvsrarn_h_w",
8215f757f3fSDimitry Andric                "xvssrln_h_w", "xvssran_h_w", "xvssrln_hu_w", "xvssran_hu_w",
8225f757f3fSDimitry Andric                "xvssrlrn_h_w", "xvssrarn_h_w", "xvssrlrn_hu_w", "xvssrarn_hu_w"] in
8235f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v16i16_ty],
8245f757f3fSDimitry Andric                                        [llvm_v8i32_ty, llvm_v8i32_ty],
8255f757f3fSDimitry Andric                                        [IntrNoMem]>;
8265f757f3fSDimitry Andric
8275f757f3fSDimitry Andricforeach inst = ["xvsrln_w_d", "xvsran_w_d", "xvsrlrn_w_d", "xvsrarn_w_d",
8285f757f3fSDimitry Andric                "xvssrln_w_d", "xvssran_w_d", "xvssrln_wu_d", "xvssran_wu_d",
8295f757f3fSDimitry Andric                "xvssrlrn_w_d", "xvssrarn_w_d", "xvssrlrn_wu_d", "xvssrarn_wu_d"] in
8305f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8i32_ty],
8315f757f3fSDimitry Andric                                        [llvm_v4i64_ty, llvm_v4i64_ty],
8325f757f3fSDimitry Andric                                        [IntrNoMem]>;
8335f757f3fSDimitry Andric
8345f757f3fSDimitry Andricforeach inst = ["xvmadd_b", "xvmsub_b", "xvfrstp_b", "xvbitsel_v", "xvshuf_b"] in
8355f757f3fSDimitry Andric  def int_loongarch_lasx_#inst
8365f757f3fSDimitry Andric    : VecInt<[llvm_v32i8_ty],
8375f757f3fSDimitry Andric             [llvm_v32i8_ty, llvm_v32i8_ty, llvm_v32i8_ty],
8385f757f3fSDimitry Andric             [IntrNoMem]>;
8395f757f3fSDimitry Andricforeach inst = ["xvmadd_h", "xvmsub_h", "xvfrstp_h", "xvshuf_h"] in
8405f757f3fSDimitry Andric  def int_loongarch_lasx_#inst
8415f757f3fSDimitry Andric    : VecInt<[llvm_v16i16_ty],
8425f757f3fSDimitry Andric             [llvm_v16i16_ty, llvm_v16i16_ty, llvm_v16i16_ty],
8435f757f3fSDimitry Andric             [IntrNoMem]>;
8445f757f3fSDimitry Andricforeach inst = ["xvmadd_w", "xvmsub_w", "xvshuf_w"] in
8455f757f3fSDimitry Andric  def int_loongarch_lasx_#inst
8465f757f3fSDimitry Andric    : VecInt<[llvm_v8i32_ty],
8475f757f3fSDimitry Andric             [llvm_v8i32_ty, llvm_v8i32_ty, llvm_v8i32_ty],
8485f757f3fSDimitry Andric             [IntrNoMem]>;
8495f757f3fSDimitry Andricforeach inst = ["xvmadd_d", "xvmsub_d", "xvshuf_d"] in
8505f757f3fSDimitry Andric  def int_loongarch_lasx_#inst
8515f757f3fSDimitry Andric    : VecInt<[llvm_v4i64_ty],
8525f757f3fSDimitry Andric             [llvm_v4i64_ty, llvm_v4i64_ty, llvm_v4i64_ty],
8535f757f3fSDimitry Andric             [IntrNoMem]>;
8545f757f3fSDimitry Andric
8555f757f3fSDimitry Andricforeach inst = ["xvsrlni_b_h", "xvsrani_b_h", "xvsrlrni_b_h", "xvsrarni_b_h",
8565f757f3fSDimitry Andric                "xvssrlni_b_h", "xvssrani_b_h", "xvssrlni_bu_h", "xvssrani_bu_h",
8575f757f3fSDimitry Andric                "xvssrlrni_b_h", "xvssrarni_b_h", "xvssrlrni_bu_h", "xvssrarni_bu_h",
8585f757f3fSDimitry Andric                "xvfrstpi_b", "xvbitseli_b", "xvextrins_b", "xvpermi_q"] in
8595f757f3fSDimitry Andric  def int_loongarch_lasx_#inst
8605f757f3fSDimitry Andric    : VecInt<[llvm_v32i8_ty],
8615f757f3fSDimitry Andric             [llvm_v32i8_ty, llvm_v32i8_ty, llvm_i32_ty],
8625f757f3fSDimitry Andric             [IntrNoMem, ImmArg<ArgIndex<2>>]>;
8635f757f3fSDimitry Andricforeach inst = ["xvsrlni_h_w", "xvsrani_h_w", "xvsrlrni_h_w", "xvsrarni_h_w",
8645f757f3fSDimitry Andric                "xvssrlni_h_w", "xvssrani_h_w", "xvssrlni_hu_w", "xvssrani_hu_w",
8655f757f3fSDimitry Andric                "xvssrlrni_h_w", "xvssrarni_h_w", "xvssrlrni_hu_w", "xvssrarni_hu_w",
8665f757f3fSDimitry Andric                "xvfrstpi_h", "xvextrins_h"] in
8675f757f3fSDimitry Andric  def int_loongarch_lasx_#inst
8685f757f3fSDimitry Andric    : VecInt<[llvm_v16i16_ty],
8695f757f3fSDimitry Andric             [llvm_v16i16_ty, llvm_v16i16_ty, llvm_i32_ty],
8705f757f3fSDimitry Andric             [IntrNoMem, ImmArg<ArgIndex<2>>]>;
8715f757f3fSDimitry Andricforeach inst = ["xvsrlni_w_d", "xvsrani_w_d", "xvsrlrni_w_d", "xvsrarni_w_d",
8725f757f3fSDimitry Andric                "xvssrlni_w_d", "xvssrani_w_d", "xvssrlni_wu_d", "xvssrani_wu_d",
8735f757f3fSDimitry Andric                "xvssrlrni_w_d", "xvssrarni_w_d", "xvssrlrni_wu_d", "xvssrarni_wu_d",
8745f757f3fSDimitry Andric                "xvpermi_w", "xvextrins_w", "xvinsve0_w"] in
8755f757f3fSDimitry Andric  def int_loongarch_lasx_#inst
8765f757f3fSDimitry Andric    : VecInt<[llvm_v8i32_ty],
8775f757f3fSDimitry Andric             [llvm_v8i32_ty, llvm_v8i32_ty, llvm_i32_ty],
8785f757f3fSDimitry Andric             [IntrNoMem, ImmArg<ArgIndex<2>>]>;
8795f757f3fSDimitry Andricforeach inst = ["xvsrlni_d_q", "xvsrani_d_q", "xvsrlrni_d_q", "xvsrarni_d_q",
8805f757f3fSDimitry Andric                "xvssrlni_d_q", "xvssrani_d_q", "xvssrlni_du_q", "xvssrani_du_q",
8815f757f3fSDimitry Andric                "xvssrlrni_d_q", "xvssrarni_d_q", "xvssrlrni_du_q", "xvssrarni_du_q",
8825f757f3fSDimitry Andric                "xvshuf4i_d", "xvextrins_d", "xvinsve0_d"] in
8835f757f3fSDimitry Andric  def int_loongarch_lasx_#inst
8845f757f3fSDimitry Andric    : VecInt<[llvm_v4i64_ty],
8855f757f3fSDimitry Andric             [llvm_v4i64_ty, llvm_v4i64_ty, llvm_i32_ty],
8865f757f3fSDimitry Andric             [IntrNoMem, ImmArg<ArgIndex<2>>]>;
8875f757f3fSDimitry Andric
8885f757f3fSDimitry Andricforeach inst = ["xvmaddwev_h_b", "xvmaddwod_h_b", "xvmaddwev_h_bu",
8895f757f3fSDimitry Andric                "xvmaddwod_h_bu", "xvmaddwev_h_bu_b", "xvmaddwod_h_bu_b"] in
8905f757f3fSDimitry Andric  def int_loongarch_lasx_#inst
8915f757f3fSDimitry Andric    : VecInt<[llvm_v16i16_ty],
8925f757f3fSDimitry Andric             [llvm_v16i16_ty, llvm_v32i8_ty, llvm_v32i8_ty],
8935f757f3fSDimitry Andric             [IntrNoMem]>;
8945f757f3fSDimitry Andricforeach inst = ["xvmaddwev_w_h", "xvmaddwod_w_h", "xvmaddwev_w_hu",
8955f757f3fSDimitry Andric                "xvmaddwod_w_hu", "xvmaddwev_w_hu_h", "xvmaddwod_w_hu_h"] in
8965f757f3fSDimitry Andric  def int_loongarch_lasx_#inst
8975f757f3fSDimitry Andric    : VecInt<[llvm_v8i32_ty],
8985f757f3fSDimitry Andric             [llvm_v8i32_ty, llvm_v16i16_ty, llvm_v16i16_ty],
8995f757f3fSDimitry Andric             [IntrNoMem]>;
9005f757f3fSDimitry Andricforeach inst = ["xvmaddwev_d_w", "xvmaddwod_d_w", "xvmaddwev_d_wu",
9015f757f3fSDimitry Andric                "xvmaddwod_d_wu", "xvmaddwev_d_wu_w", "xvmaddwod_d_wu_w"] in
9025f757f3fSDimitry Andric  def int_loongarch_lasx_#inst
9035f757f3fSDimitry Andric    : VecInt<[llvm_v4i64_ty],
9045f757f3fSDimitry Andric             [llvm_v4i64_ty, llvm_v8i32_ty, llvm_v8i32_ty],
9055f757f3fSDimitry Andric             [IntrNoMem]>;
9065f757f3fSDimitry Andricforeach inst = ["xvmaddwev_q_d", "xvmaddwod_q_d", "xvmaddwev_q_du",
9075f757f3fSDimitry Andric                "xvmaddwod_q_du", "xvmaddwev_q_du_d", "xvmaddwod_q_du_d"] in
9085f757f3fSDimitry Andric  def int_loongarch_lasx_#inst
9095f757f3fSDimitry Andric    : VecInt<[llvm_v4i64_ty],
9105f757f3fSDimitry Andric             [llvm_v4i64_ty, llvm_v4i64_ty, llvm_v4i64_ty],
9115f757f3fSDimitry Andric             [IntrNoMem]>;
9125f757f3fSDimitry Andric
9135f757f3fSDimitry Andricforeach inst = ["xvsllwil_h_b", "xvsllwil_hu_bu"] in
9145f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v16i16_ty],
9155f757f3fSDimitry Andric                                        [llvm_v32i8_ty, llvm_i32_ty],
9165f757f3fSDimitry Andric                                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
9175f757f3fSDimitry Andricforeach inst = ["xvsllwil_w_h", "xvsllwil_wu_hu"] in
9185f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8i32_ty],
9195f757f3fSDimitry Andric                                        [llvm_v16i16_ty, llvm_i32_ty],
9205f757f3fSDimitry Andric                                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
9215f757f3fSDimitry Andricforeach inst = ["xvsllwil_d_w", "xvsllwil_du_wu"] in
9225f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v4i64_ty],
9235f757f3fSDimitry Andric                                        [llvm_v8i32_ty, llvm_i32_ty],
9245f757f3fSDimitry Andric                                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
9255f757f3fSDimitry Andric
9265f757f3fSDimitry Andricforeach inst = ["xvneg_b", "xvmskltz_b", "xvmskgez_b", "xvmsknz_b",
9275f757f3fSDimitry Andric                "xvclo_b", "xvclz_b", "xvpcnt_b",
9285f757f3fSDimitry Andric                "xvreplve0_b", "xvreplve0_q"] in
9295f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v32i8_ty], [llvm_v32i8_ty],
9305f757f3fSDimitry Andric                                        [IntrNoMem]>;
9315f757f3fSDimitry Andricforeach inst = ["xvneg_h", "xvmskltz_h", "xvclo_h", "xvclz_h", "xvpcnt_h",
9325f757f3fSDimitry Andric                "xvreplve0_h"] in
9335f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v16i16_ty], [llvm_v16i16_ty],
9345f757f3fSDimitry Andric                                        [IntrNoMem]>;
9355f757f3fSDimitry Andricforeach inst = ["xvneg_w", "xvmskltz_w", "xvclo_w", "xvclz_w", "xvpcnt_w",
9365f757f3fSDimitry Andric                "xvreplve0_w"] in
9375f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8i32_ty], [llvm_v8i32_ty],
9385f757f3fSDimitry Andric                                        [IntrNoMem]>;
9395f757f3fSDimitry Andricforeach inst = ["xvneg_d", "xvexth_q_d", "xvexth_qu_du", "xvmskltz_d",
9405f757f3fSDimitry Andric                "xvextl_q_d", "xvextl_qu_du", "xvclo_d", "xvclz_d", "xvpcnt_d",
9415f757f3fSDimitry Andric                "xvreplve0_d"] in
9425f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v4i64_ty], [llvm_v4i64_ty],
9435f757f3fSDimitry Andric                                        [IntrNoMem]>;
9445f757f3fSDimitry Andric
9455f757f3fSDimitry Andricforeach inst = ["xvexth_h_b", "xvexth_hu_bu", "vext2xv_h_b", "vext2xv_hu_bu"] in
9465f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v16i16_ty], [llvm_v32i8_ty],
9475f757f3fSDimitry Andric                                        [IntrNoMem]>;
9485f757f3fSDimitry Andricforeach inst = ["xvexth_w_h", "xvexth_wu_hu", "vext2xv_w_h", "vext2xv_wu_hu"] in
9495f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8i32_ty], [llvm_v16i16_ty],
9505f757f3fSDimitry Andric                                        [IntrNoMem]>;
9515f757f3fSDimitry Andricforeach inst = ["xvexth_d_w", "xvexth_du_wu", "vext2xv_d_w", "vext2xv_du_wu"] in
9525f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v4i64_ty], [llvm_v8i32_ty],
9535f757f3fSDimitry Andric                                        [IntrNoMem]>;
9545f757f3fSDimitry Andric
9555f757f3fSDimitry Andricforeach inst = ["vext2xv_w_b", "vext2xv_wu_bu"] in
9565f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8i32_ty], [llvm_v32i8_ty],
9575f757f3fSDimitry Andric                                        [IntrNoMem]>;
9585f757f3fSDimitry Andricforeach inst = ["vext2xv_d_h", "vext2xv_du_hu"] in
9595f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v4i64_ty], [llvm_v16i16_ty],
9605f757f3fSDimitry Andric                                        [IntrNoMem]>;
9615f757f3fSDimitry Andric
9625f757f3fSDimitry Andricforeach inst = ["vext2xv_d_b", "vext2xv_du_bu"] in
9635f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v4i64_ty], [llvm_v32i8_ty],
9645f757f3fSDimitry Andric                                        [IntrNoMem]>;
9655f757f3fSDimitry Andric
9665f757f3fSDimitry Andricdef int_loongarch_lasx_xvldi : VecInt<[llvm_v4i64_ty], [llvm_i32_ty],
9675f757f3fSDimitry Andric                                      [IntrNoMem, ImmArg<ArgIndex<0>>]>;
9685f757f3fSDimitry Andricdef int_loongarch_lasx_xvrepli_b : VecInt<[llvm_v32i8_ty], [llvm_i32_ty],
9695f757f3fSDimitry Andric                                          [IntrNoMem, ImmArg<ArgIndex<0>>]>;
9705f757f3fSDimitry Andricdef int_loongarch_lasx_xvrepli_h : VecInt<[llvm_v16i16_ty], [llvm_i32_ty],
9715f757f3fSDimitry Andric                                          [IntrNoMem, ImmArg<ArgIndex<0>>]>;
9725f757f3fSDimitry Andricdef int_loongarch_lasx_xvrepli_w : VecInt<[llvm_v8i32_ty], [llvm_i32_ty],
9735f757f3fSDimitry Andric                                          [IntrNoMem, ImmArg<ArgIndex<0>>]>;
9745f757f3fSDimitry Andricdef int_loongarch_lasx_xvrepli_d : VecInt<[llvm_v4i64_ty], [llvm_i32_ty],
9755f757f3fSDimitry Andric                                          [IntrNoMem, ImmArg<ArgIndex<0>>]>;
9765f757f3fSDimitry Andric
9775f757f3fSDimitry Andricdef int_loongarch_lasx_xvreplgr2vr_b : VecInt<[llvm_v32i8_ty], [llvm_i32_ty],
9785f757f3fSDimitry Andric                                             [IntrNoMem]>;
9795f757f3fSDimitry Andricdef int_loongarch_lasx_xvreplgr2vr_h : VecInt<[llvm_v16i16_ty], [llvm_i32_ty],
9805f757f3fSDimitry Andric                                             [IntrNoMem]>;
9815f757f3fSDimitry Andricdef int_loongarch_lasx_xvreplgr2vr_w : VecInt<[llvm_v8i32_ty], [llvm_i32_ty],
9825f757f3fSDimitry Andric                                             [IntrNoMem]>;
9835f757f3fSDimitry Andricdef int_loongarch_lasx_xvreplgr2vr_d : VecInt<[llvm_v4i64_ty], [llvm_i64_ty],
9845f757f3fSDimitry Andric                                             [IntrNoMem]>;
9855f757f3fSDimitry Andric
9865f757f3fSDimitry Andricdef int_loongarch_lasx_xvinsgr2vr_w
9875f757f3fSDimitry Andric  : VecInt<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_i32_ty, llvm_i32_ty],
9885f757f3fSDimitry Andric           [IntrNoMem, ImmArg<ArgIndex<2>>]>;
9895f757f3fSDimitry Andricdef int_loongarch_lasx_xvinsgr2vr_d
9905f757f3fSDimitry Andric  : VecInt<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_i64_ty, llvm_i32_ty],
9915f757f3fSDimitry Andric           [IntrNoMem, ImmArg<ArgIndex<2>>]>;
9925f757f3fSDimitry Andric
9935f757f3fSDimitry Andricdef int_loongarch_lasx_xvreplve_b
9945f757f3fSDimitry Andric  : VecInt<[llvm_v32i8_ty], [llvm_v32i8_ty, llvm_i32_ty], [IntrNoMem]>;
9955f757f3fSDimitry Andricdef int_loongarch_lasx_xvreplve_h
9965f757f3fSDimitry Andric  : VecInt<[llvm_v16i16_ty], [llvm_v16i16_ty, llvm_i32_ty], [IntrNoMem]>;
9975f757f3fSDimitry Andricdef int_loongarch_lasx_xvreplve_w
9985f757f3fSDimitry Andric  : VecInt<[llvm_v8i32_ty], [llvm_v8i32_ty, llvm_i32_ty], [IntrNoMem]>;
9995f757f3fSDimitry Andricdef int_loongarch_lasx_xvreplve_d
10005f757f3fSDimitry Andric  : VecInt<[llvm_v4i64_ty], [llvm_v4i64_ty, llvm_i32_ty], [IntrNoMem]>;
10015f757f3fSDimitry Andric
10025f757f3fSDimitry Andricforeach inst = ["xvpickve2gr_w", "xvpickve2gr_wu" ] in
10035f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_i32_ty],
10045f757f3fSDimitry Andric                                        [llvm_v8i32_ty, llvm_i32_ty],
10055f757f3fSDimitry Andric                                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
10065f757f3fSDimitry Andricforeach inst = ["xvpickve2gr_d", "xvpickve2gr_du" ] in
10075f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_i64_ty],
10085f757f3fSDimitry Andric                                        [llvm_v4i64_ty, llvm_i32_ty],
10095f757f3fSDimitry Andric                                        [IntrNoMem, ImmArg<ArgIndex<1>>]>;
10105f757f3fSDimitry Andric
10115f757f3fSDimitry Andricdef int_loongarch_lasx_xbz_b : VecInt<[llvm_i32_ty], [llvm_v32i8_ty],
10125f757f3fSDimitry Andric                                      [IntrNoMem]>;
10135f757f3fSDimitry Andricdef int_loongarch_lasx_xbz_h : VecInt<[llvm_i32_ty], [llvm_v16i16_ty],
10145f757f3fSDimitry Andric                                      [IntrNoMem]>;
10155f757f3fSDimitry Andricdef int_loongarch_lasx_xbz_w : VecInt<[llvm_i32_ty], [llvm_v8i32_ty],
10165f757f3fSDimitry Andric                                      [IntrNoMem]>;
10175f757f3fSDimitry Andricdef int_loongarch_lasx_xbz_d : VecInt<[llvm_i32_ty], [llvm_v4i64_ty],
10185f757f3fSDimitry Andric                                      [IntrNoMem]>;
10195f757f3fSDimitry Andricdef int_loongarch_lasx_xbz_v : VecInt<[llvm_i32_ty], [llvm_v32i8_ty],
10205f757f3fSDimitry Andric                                      [IntrNoMem]>;
10215f757f3fSDimitry Andric
10225f757f3fSDimitry Andricdef int_loongarch_lasx_xbnz_v : VecInt<[llvm_i32_ty], [llvm_v32i8_ty],
10235f757f3fSDimitry Andric                                       [IntrNoMem]>;
10245f757f3fSDimitry Andricdef int_loongarch_lasx_xbnz_b : VecInt<[llvm_i32_ty], [llvm_v32i8_ty],
10255f757f3fSDimitry Andric                                       [IntrNoMem]>;
10265f757f3fSDimitry Andricdef int_loongarch_lasx_xbnz_h : VecInt<[llvm_i32_ty], [llvm_v16i16_ty],
10275f757f3fSDimitry Andric                                       [IntrNoMem]>;
10285f757f3fSDimitry Andricdef int_loongarch_lasx_xbnz_w : VecInt<[llvm_i32_ty], [llvm_v8i32_ty],
10295f757f3fSDimitry Andric                                       [IntrNoMem]>;
10305f757f3fSDimitry Andricdef int_loongarch_lasx_xbnz_d : VecInt<[llvm_i32_ty], [llvm_v4i64_ty],
10315f757f3fSDimitry Andric                                       [IntrNoMem]>;
10325f757f3fSDimitry Andric
10335f757f3fSDimitry Andric// LASX Float
10345f757f3fSDimitry Andric
10355f757f3fSDimitry Andricforeach inst = ["xvfadd_s", "xvfsub_s", "xvfmul_s", "xvfdiv_s",
10365f757f3fSDimitry Andric                "xvfmax_s", "xvfmin_s", "xvfmaxa_s", "xvfmina_s"] in
10375f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8f32_ty],
10385f757f3fSDimitry Andric                                        [llvm_v8f32_ty, llvm_v8f32_ty],
10395f757f3fSDimitry Andric                                        [IntrNoMem]>;
10405f757f3fSDimitry Andricforeach inst = ["xvfadd_d", "xvfsub_d", "xvfmul_d", "xvfdiv_d",
10415f757f3fSDimitry Andric                "xvfmax_d", "xvfmin_d", "xvfmaxa_d", "xvfmina_d"] in
10425f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v4f64_ty],
10435f757f3fSDimitry Andric                                        [llvm_v4f64_ty, llvm_v4f64_ty],
10445f757f3fSDimitry Andric                                        [IntrNoMem]>;
10455f757f3fSDimitry Andric
10465f757f3fSDimitry Andricforeach inst = ["xvfmadd_s", "xvfmsub_s", "xvfnmadd_s", "xvfnmsub_s"] in
10475f757f3fSDimitry Andric  def int_loongarch_lasx_#inst
10485f757f3fSDimitry Andric    : VecInt<[llvm_v8f32_ty],
10495f757f3fSDimitry Andric             [llvm_v8f32_ty, llvm_v8f32_ty, llvm_v8f32_ty],
10505f757f3fSDimitry Andric             [IntrNoMem]>;
10515f757f3fSDimitry Andricforeach inst = ["xvfmadd_d", "xvfmsub_d", "xvfnmadd_d", "xvfnmsub_d"] in
10525f757f3fSDimitry Andric  def int_loongarch_lasx_#inst
10535f757f3fSDimitry Andric    : VecInt<[llvm_v4f64_ty],
10545f757f3fSDimitry Andric             [llvm_v4f64_ty, llvm_v4f64_ty, llvm_v4f64_ty],
10555f757f3fSDimitry Andric             [IntrNoMem]>;
10565f757f3fSDimitry Andric
10575f757f3fSDimitry Andricforeach inst = ["xvflogb_s", "xvfsqrt_s", "xvfrecip_s", "xvfrsqrt_s", "xvfrint_s",
1058*7a6dacacSDimitry Andric                "xvfrecipe_s", "xvfrsqrte_s",
10595f757f3fSDimitry Andric                "xvfrintrne_s", "xvfrintrz_s", "xvfrintrp_s", "xvfrintrm_s"] in
10605f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8f32_ty], [llvm_v8f32_ty],
10615f757f3fSDimitry Andric                                        [IntrNoMem]>;
10625f757f3fSDimitry Andricforeach inst = ["xvflogb_d", "xvfsqrt_d", "xvfrecip_d", "xvfrsqrt_d", "xvfrint_d",
1063*7a6dacacSDimitry Andric                "xvfrecipe_d", "xvfrsqrte_d",
10645f757f3fSDimitry Andric                "xvfrintrne_d", "xvfrintrz_d", "xvfrintrp_d", "xvfrintrm_d"] in
10655f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v4f64_ty], [llvm_v4f64_ty],
10665f757f3fSDimitry Andric                                        [IntrNoMem]>;
10675f757f3fSDimitry Andric
10685f757f3fSDimitry Andricforeach inst = ["xvfcvtl_s_h", "xvfcvth_s_h"] in
10695f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8f32_ty], [llvm_v16i16_ty],
10705f757f3fSDimitry Andric                                        [IntrNoMem]>;
10715f757f3fSDimitry Andricforeach inst = ["xvfcvtl_d_s", "xvfcvth_d_s"] in
10725f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v4f64_ty], [llvm_v8f32_ty],
10735f757f3fSDimitry Andric                                        [IntrNoMem]>;
10745f757f3fSDimitry Andric
10755f757f3fSDimitry Andricforeach inst = ["xvftintrne_w_s", "xvftintrz_w_s", "xvftintrp_w_s", "xvftintrm_w_s",
10765f757f3fSDimitry Andric                "xvftint_w_s", "xvftintrz_wu_s", "xvftint_wu_s", "xvfclass_s"] in
10775f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8i32_ty], [llvm_v8f32_ty],
10785f757f3fSDimitry Andric                                        [IntrNoMem]>;
10795f757f3fSDimitry Andricforeach inst = ["xvftintrne_l_d", "xvftintrz_l_d", "xvftintrp_l_d", "xvftintrm_l_d",
10805f757f3fSDimitry Andric                "xvftint_l_d", "xvftintrz_lu_d", "xvftint_lu_d", "xvfclass_d"] in
10815f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v4i64_ty], [llvm_v4f64_ty],
10825f757f3fSDimitry Andric                                        [IntrNoMem]>;
10835f757f3fSDimitry Andric
10845f757f3fSDimitry Andricforeach inst = ["xvftintrnel_l_s", "xvftintrneh_l_s", "xvftintrzl_l_s",
10855f757f3fSDimitry Andric                "xvftintrzh_l_s", "xvftintrpl_l_s", "xvftintrph_l_s",
10865f757f3fSDimitry Andric                "xvftintrml_l_s", "xvftintrmh_l_s", "xvftintl_l_s",
10875f757f3fSDimitry Andric                "xvftinth_l_s"] in
10885f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v4i64_ty], [llvm_v8f32_ty],
10895f757f3fSDimitry Andric                                        [IntrNoMem]>;
10905f757f3fSDimitry Andric
10915f757f3fSDimitry Andricforeach inst = ["xvffint_s_w", "xvffint_s_wu"] in
10925f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8f32_ty], [llvm_v8i32_ty],
10935f757f3fSDimitry Andric                                        [IntrNoMem]>;
10945f757f3fSDimitry Andricforeach inst = ["xvffint_d_l", "xvffint_d_lu"] in
10955f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v4f64_ty], [llvm_v4i64_ty],
10965f757f3fSDimitry Andric                                        [IntrNoMem]>;
10975f757f3fSDimitry Andric
10985f757f3fSDimitry Andricforeach inst = ["xvffintl_d_w", "xvffinth_d_w"] in
10995f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v4f64_ty], [llvm_v8i32_ty],
11005f757f3fSDimitry Andric                                        [IntrNoMem]>;
11015f757f3fSDimitry Andric
11025f757f3fSDimitry Andricforeach inst = ["xvffint_s_l"] in
11035f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8f32_ty],
11045f757f3fSDimitry Andric                                        [llvm_v4i64_ty, llvm_v4i64_ty],
11055f757f3fSDimitry Andric                                        [IntrNoMem]>;
11065f757f3fSDimitry Andricforeach inst = ["xvftintrne_w_d", "xvftintrz_w_d", "xvftintrp_w_d", "xvftintrm_w_d",
11075f757f3fSDimitry Andric                "xvftint_w_d"] in
11085f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8i32_ty],
11095f757f3fSDimitry Andric                                        [llvm_v4f64_ty, llvm_v4f64_ty],
11105f757f3fSDimitry Andric                                        [IntrNoMem]>;
11115f757f3fSDimitry Andric
11125f757f3fSDimitry Andricforeach inst = ["xvfcvt_h_s"] in
11135f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v16i16_ty],
11145f757f3fSDimitry Andric                                        [llvm_v8f32_ty, llvm_v8f32_ty],
11155f757f3fSDimitry Andric                                        [IntrNoMem]>;
11165f757f3fSDimitry Andricforeach inst = ["xvfcvt_s_d"] in
11175f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8f32_ty],
11185f757f3fSDimitry Andric                                        [llvm_v4f64_ty, llvm_v4f64_ty],
11195f757f3fSDimitry Andric                                        [IntrNoMem]>;
11205f757f3fSDimitry Andric
11215f757f3fSDimitry Andricforeach inst = ["xvfcmp_caf_s", "xvfcmp_cun_s", "xvfcmp_ceq_s", "xvfcmp_cueq_s",
11225f757f3fSDimitry Andric                "xvfcmp_clt_s", "xvfcmp_cult_s", "xvfcmp_cle_s", "xvfcmp_cule_s",
11235f757f3fSDimitry Andric                "xvfcmp_cne_s", "xvfcmp_cor_s", "xvfcmp_cune_s",
11245f757f3fSDimitry Andric                "xvfcmp_saf_s", "xvfcmp_sun_s", "xvfcmp_seq_s", "xvfcmp_sueq_s",
11255f757f3fSDimitry Andric                "xvfcmp_slt_s", "xvfcmp_sult_s", "xvfcmp_sle_s", "xvfcmp_sule_s",
11265f757f3fSDimitry Andric                "xvfcmp_sne_s", "xvfcmp_sor_s", "xvfcmp_sune_s"] in
11275f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v8i32_ty],
11285f757f3fSDimitry Andric                                        [llvm_v8f32_ty, llvm_v8f32_ty],
11295f757f3fSDimitry Andric                                        [IntrNoMem]>;
11305f757f3fSDimitry Andricforeach inst = ["xvfcmp_caf_d", "xvfcmp_cun_d", "xvfcmp_ceq_d", "xvfcmp_cueq_d",
11315f757f3fSDimitry Andric                "xvfcmp_clt_d", "xvfcmp_cult_d", "xvfcmp_cle_d", "xvfcmp_cule_d",
11325f757f3fSDimitry Andric                "xvfcmp_cne_d", "xvfcmp_cor_d", "xvfcmp_cune_d",
11335f757f3fSDimitry Andric                "xvfcmp_saf_d", "xvfcmp_sun_d", "xvfcmp_seq_d", "xvfcmp_sueq_d",
11345f757f3fSDimitry Andric                "xvfcmp_slt_d", "xvfcmp_sult_d", "xvfcmp_sle_d", "xvfcmp_sule_d",
11355f757f3fSDimitry Andric                "xvfcmp_sne_d", "xvfcmp_sor_d", "xvfcmp_sune_d"] in
11365f757f3fSDimitry Andric  def int_loongarch_lasx_#inst : VecInt<[llvm_v4i64_ty],
11375f757f3fSDimitry Andric                                        [llvm_v4f64_ty, llvm_v4f64_ty],
11385f757f3fSDimitry Andric                                        [IntrNoMem]>;
11395f757f3fSDimitry Andric
11405f757f3fSDimitry Andricdef int_loongarch_lasx_xvpickve_w_f
11415f757f3fSDimitry Andric  : VecInt<[llvm_v8f32_ty], [llvm_v8f32_ty, llvm_i32_ty],
11425f757f3fSDimitry Andric           [IntrNoMem, ImmArg<ArgIndex<1>>]>;
11435f757f3fSDimitry Andricdef int_loongarch_lasx_xvpickve_d_f
11445f757f3fSDimitry Andric  : VecInt<[llvm_v4f64_ty], [llvm_v4f64_ty, llvm_i32_ty],
11455f757f3fSDimitry Andric           [IntrNoMem, ImmArg<ArgIndex<1>>]>;
11465f757f3fSDimitry Andric
11475f757f3fSDimitry Andric// LASX load/store
11485f757f3fSDimitry Andricdef int_loongarch_lasx_xvld
11495f757f3fSDimitry Andric  : VecInt<[llvm_v32i8_ty], [llvm_ptr_ty, llvm_i32_ty],
11505f757f3fSDimitry Andric           [IntrReadMem, IntrArgMemOnly, ImmArg<ArgIndex<1>>]>;
11515f757f3fSDimitry Andricdef int_loongarch_lasx_xvldx
11525f757f3fSDimitry Andric  : VecInt<[llvm_v32i8_ty], [llvm_ptr_ty, llvm_i64_ty],
11535f757f3fSDimitry Andric           [IntrReadMem, IntrArgMemOnly]>;
11545f757f3fSDimitry Andricdef int_loongarch_lasx_xvldrepl_b
11555f757f3fSDimitry Andric  : VecInt<[llvm_v32i8_ty], [llvm_ptr_ty, llvm_i32_ty],
11565f757f3fSDimitry Andric           [IntrReadMem, IntrArgMemOnly, ImmArg<ArgIndex<1>>]>;
11575f757f3fSDimitry Andricdef int_loongarch_lasx_xvldrepl_h
11585f757f3fSDimitry Andric  : VecInt<[llvm_v16i16_ty], [llvm_ptr_ty, llvm_i32_ty],
11595f757f3fSDimitry Andric           [IntrReadMem, IntrArgMemOnly, ImmArg<ArgIndex<1>>]>;
11605f757f3fSDimitry Andricdef int_loongarch_lasx_xvldrepl_w
11615f757f3fSDimitry Andric  : VecInt<[llvm_v8i32_ty], [llvm_ptr_ty, llvm_i32_ty],
11625f757f3fSDimitry Andric           [IntrReadMem, IntrArgMemOnly, ImmArg<ArgIndex<1>>]>;
11635f757f3fSDimitry Andricdef int_loongarch_lasx_xvldrepl_d
11645f757f3fSDimitry Andric  : VecInt<[llvm_v4i64_ty], [llvm_ptr_ty, llvm_i32_ty],
11655f757f3fSDimitry Andric           [IntrReadMem, IntrArgMemOnly, ImmArg<ArgIndex<1>>]>;
11665f757f3fSDimitry Andric
11675f757f3fSDimitry Andricdef int_loongarch_lasx_xvst
11685f757f3fSDimitry Andric  : VecInt<[], [llvm_v32i8_ty, llvm_ptr_ty, llvm_i32_ty],
11695f757f3fSDimitry Andric           [IntrWriteMem, IntrArgMemOnly, ImmArg<ArgIndex<2>>]>;
11705f757f3fSDimitry Andricdef int_loongarch_lasx_xvstx
11715f757f3fSDimitry Andric  : VecInt<[], [llvm_v32i8_ty, llvm_ptr_ty, llvm_i64_ty],
11725f757f3fSDimitry Andric           [IntrWriteMem, IntrArgMemOnly]>;
11735f757f3fSDimitry Andricdef int_loongarch_lasx_xvstelm_b
11745f757f3fSDimitry Andric  : VecInt<[], [llvm_v32i8_ty, llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
11755f757f3fSDimitry Andric           [IntrWriteMem, IntrArgMemOnly, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<3>>]>;
11765f757f3fSDimitry Andricdef int_loongarch_lasx_xvstelm_h
11775f757f3fSDimitry Andric  : VecInt<[], [llvm_v16i16_ty, llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
11785f757f3fSDimitry Andric           [IntrWriteMem, IntrArgMemOnly, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<3>>]>;
11795f757f3fSDimitry Andricdef int_loongarch_lasx_xvstelm_w
11805f757f3fSDimitry Andric  : VecInt<[], [llvm_v8i32_ty, llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
11815f757f3fSDimitry Andric           [IntrWriteMem, IntrArgMemOnly, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<3>>]>;
11825f757f3fSDimitry Andricdef int_loongarch_lasx_xvstelm_d
11835f757f3fSDimitry Andric  : VecInt<[], [llvm_v4i64_ty, llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty],
11845f757f3fSDimitry Andric           [IntrWriteMem, IntrArgMemOnly, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<3>>]>;
11855f757f3fSDimitry Andric} // TargetPrefix = "loongarch"
1186