xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/Mips/MipsMSAInstrInfo.td (revision 71ac745d76c3ba442e753daff1870893f272b29d)
10b57cec5SDimitry Andric//===- MipsMSAInstrInfo.td - MSA ASE instructions -*- tablegen ------------*-=//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric//
90b57cec5SDimitry Andric// This file describes Mips MSA ASE instructions.
100b57cec5SDimitry Andric//
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andricdef SDT_MipsVecCond : SDTypeProfile<1, 1, [SDTCisInt<0>, SDTCisVec<1>]>;
140b57cec5SDimitry Andricdef SDT_VSetCC : SDTypeProfile<1, 3, [SDTCisInt<0>,
150b57cec5SDimitry Andric                                      SDTCisInt<1>,
160b57cec5SDimitry Andric                                      SDTCisSameAs<1, 2>,
170b57cec5SDimitry Andric                                      SDTCisVT<3, OtherVT>]>;
180b57cec5SDimitry Andricdef SDT_VFSetCC : SDTypeProfile<1, 3, [SDTCisInt<0>,
190b57cec5SDimitry Andric                                       SDTCisFP<1>,
200b57cec5SDimitry Andric                                       SDTCisSameAs<1, 2>,
210b57cec5SDimitry Andric                                       SDTCisVT<3, OtherVT>]>;
220b57cec5SDimitry Andricdef SDT_VSHF : SDTypeProfile<1, 3, [SDTCisInt<0>, SDTCisVec<0>,
230b57cec5SDimitry Andric                                    SDTCisInt<1>, SDTCisVec<1>,
240b57cec5SDimitry Andric                                    SDTCisSameAs<0, 2>, SDTCisSameAs<2, 3>]>;
250b57cec5SDimitry Andricdef SDT_SHF : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisVec<0>,
260b57cec5SDimitry Andric                                   SDTCisVT<1, i32>, SDTCisSameAs<0, 2>]>;
270b57cec5SDimitry Andricdef SDT_ILV : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisVec<0>,
280b57cec5SDimitry Andric                                   SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>]>;
290b57cec5SDimitry Andricdef SDT_INSVE : SDTypeProfile<1, 4, [SDTCisVec<0>, SDTCisSameAs<0, 1>,
300b57cec5SDimitry Andric                                     SDTCisVT<2, i32>, SDTCisSameAs<0, 3>,
310b57cec5SDimitry Andric                                     SDTCisVT<4, i32>]>;
320b57cec5SDimitry Andric
330b57cec5SDimitry Andricdef MipsVAllNonZero : SDNode<"MipsISD::VALL_NONZERO", SDT_MipsVecCond>;
340b57cec5SDimitry Andricdef MipsVAnyNonZero : SDNode<"MipsISD::VANY_NONZERO", SDT_MipsVecCond>;
350b57cec5SDimitry Andricdef MipsVAllZero : SDNode<"MipsISD::VALL_ZERO", SDT_MipsVecCond>;
360b57cec5SDimitry Andricdef MipsVAnyZero : SDNode<"MipsISD::VANY_ZERO", SDT_MipsVecCond>;
370b57cec5SDimitry Andricdef MipsVNOR : SDNode<"MipsISD::VNOR", SDTIntBinOp,
380b57cec5SDimitry Andric                      [SDNPCommutative, SDNPAssociative]>;
390b57cec5SDimitry Andricdef MipsVSHF : SDNode<"MipsISD::VSHF", SDT_VSHF>;
400b57cec5SDimitry Andricdef MipsSHF : SDNode<"MipsISD::SHF", SDT_SHF>;
410b57cec5SDimitry Andricdef MipsILVEV : SDNode<"MipsISD::ILVEV", SDT_ILV>;
420b57cec5SDimitry Andricdef MipsILVOD : SDNode<"MipsISD::ILVOD", SDT_ILV>;
430b57cec5SDimitry Andricdef MipsILVL  : SDNode<"MipsISD::ILVL",  SDT_ILV>;
440b57cec5SDimitry Andricdef MipsILVR  : SDNode<"MipsISD::ILVR",  SDT_ILV>;
450b57cec5SDimitry Andricdef MipsPCKEV : SDNode<"MipsISD::PCKEV", SDT_ILV>;
460b57cec5SDimitry Andricdef MipsPCKOD : SDNode<"MipsISD::PCKOD", SDT_ILV>;
470b57cec5SDimitry Andricdef MipsINSVE : SDNode<"MipsISD::INSVE", SDT_INSVE>;
480b57cec5SDimitry Andricdef MipsFMS   : SDNode<"MipsISD::FMS", SDTFPTernaryOp>;
490b57cec5SDimitry Andric
500b57cec5SDimitry Andricdef vsetcc : SDNode<"ISD::SETCC", SDT_VSetCC>;
510b57cec5SDimitry Andricdef vfsetcc : SDNode<"ISD::SETCC", SDT_VFSetCC>;
520b57cec5SDimitry Andric
530b57cec5SDimitry Andricdef MipsVExtractSExt : SDNode<"MipsISD::VEXTRACT_SEXT_ELT",
540b57cec5SDimitry Andric    SDTypeProfile<1, 3, [SDTCisPtrTy<2>]>, []>;
550b57cec5SDimitry Andricdef MipsVExtractZExt : SDNode<"MipsISD::VEXTRACT_ZEXT_ELT",
560b57cec5SDimitry Andric    SDTypeProfile<1, 3, [SDTCisPtrTy<2>]>, []>;
570b57cec5SDimitry Andric
580b57cec5SDimitry Andricdef immZExt1Ptr : ImmLeaf<iPTR, [{return isUInt<1>(Imm);}]>;
590b57cec5SDimitry Andricdef immZExt2Ptr : ImmLeaf<iPTR, [{return isUInt<2>(Imm);}]>;
600b57cec5SDimitry Andricdef immZExt3Ptr : ImmLeaf<iPTR, [{return isUInt<3>(Imm);}]>;
610b57cec5SDimitry Andricdef immZExt4Ptr : ImmLeaf<iPTR, [{return isUInt<4>(Imm);}]>;
620b57cec5SDimitry Andric
638bcb0991SDimitry Andricdef timmZExt1Ptr : TImmLeaf<iPTR, [{return isUInt<1>(Imm);}]>;
648bcb0991SDimitry Andricdef timmZExt2Ptr : TImmLeaf<iPTR, [{return isUInt<2>(Imm);}]>;
658bcb0991SDimitry Andricdef timmZExt3Ptr : TImmLeaf<iPTR, [{return isUInt<3>(Imm);}]>;
668bcb0991SDimitry Andricdef timmZExt4Ptr : TImmLeaf<iPTR, [{return isUInt<4>(Imm);}]>;
678bcb0991SDimitry Andric
680b57cec5SDimitry Andric// Operands
690b57cec5SDimitry Andric
700b57cec5SDimitry Andricdef immZExt2Lsa : ImmLeaf<i32, [{return isUInt<2>(Imm - 1);}]>;
710b57cec5SDimitry Andric
720b57cec5SDimitry Andric// Pattern fragments
730b57cec5SDimitry Andricdef vextract_sext_i8  : PatFrag<(ops node:$vec, node:$idx),
740b57cec5SDimitry Andric                                (MipsVExtractSExt node:$vec, node:$idx, i8)>;
750b57cec5SDimitry Andricdef vextract_sext_i16 : PatFrag<(ops node:$vec, node:$idx),
760b57cec5SDimitry Andric                                (MipsVExtractSExt node:$vec, node:$idx, i16)>;
770b57cec5SDimitry Andricdef vextract_sext_i32 : PatFrag<(ops node:$vec, node:$idx),
780b57cec5SDimitry Andric                                (MipsVExtractSExt node:$vec, node:$idx, i32)>;
790b57cec5SDimitry Andricdef vextract_sext_i64 : PatFrag<(ops node:$vec, node:$idx),
800b57cec5SDimitry Andric                                (MipsVExtractSExt node:$vec, node:$idx, i64)>;
810b57cec5SDimitry Andric
820b57cec5SDimitry Andricdef vextract_zext_i8  : PatFrag<(ops node:$vec, node:$idx),
830b57cec5SDimitry Andric                                (MipsVExtractZExt node:$vec, node:$idx, i8)>;
840b57cec5SDimitry Andricdef vextract_zext_i16 : PatFrag<(ops node:$vec, node:$idx),
850b57cec5SDimitry Andric                                (MipsVExtractZExt node:$vec, node:$idx, i16)>;
860b57cec5SDimitry Andricdef vextract_zext_i32 : PatFrag<(ops node:$vec, node:$idx),
870b57cec5SDimitry Andric                                (MipsVExtractZExt node:$vec, node:$idx, i32)>;
880b57cec5SDimitry Andricdef vextract_zext_i64 : PatFrag<(ops node:$vec, node:$idx),
890b57cec5SDimitry Andric                                (MipsVExtractZExt node:$vec, node:$idx, i64)>;
900b57cec5SDimitry Andric
910b57cec5SDimitry Andricdef vinsert_v16i8 : PatFrag<(ops node:$vec, node:$val, node:$idx),
920b57cec5SDimitry Andric    (v16i8 (vector_insert node:$vec, node:$val, node:$idx))>;
930b57cec5SDimitry Andricdef vinsert_v8i16 : PatFrag<(ops node:$vec, node:$val, node:$idx),
940b57cec5SDimitry Andric    (v8i16 (vector_insert node:$vec, node:$val, node:$idx))>;
950b57cec5SDimitry Andricdef vinsert_v4i32 : PatFrag<(ops node:$vec, node:$val, node:$idx),
960b57cec5SDimitry Andric    (v4i32 (vector_insert node:$vec, node:$val, node:$idx))>;
970b57cec5SDimitry Andricdef vinsert_v2i64 : PatFrag<(ops node:$vec, node:$val, node:$idx),
980b57cec5SDimitry Andric    (v2i64 (vector_insert node:$vec, node:$val, node:$idx))>;
990b57cec5SDimitry Andric
1000b57cec5SDimitry Andricdef insve_v16i8 : PatFrag<(ops node:$v1, node:$i1, node:$v2, node:$i2),
1010b57cec5SDimitry Andric    (v16i8 (MipsINSVE node:$v1, node:$i1, node:$v2, node:$i2))>;
1020b57cec5SDimitry Andricdef insve_v8i16 : PatFrag<(ops node:$v1, node:$i1, node:$v2, node:$i2),
1030b57cec5SDimitry Andric    (v8i16 (MipsINSVE node:$v1, node:$i1, node:$v2, node:$i2))>;
1040b57cec5SDimitry Andricdef insve_v4i32 : PatFrag<(ops node:$v1, node:$i1, node:$v2, node:$i2),
1050b57cec5SDimitry Andric    (v4i32 (MipsINSVE node:$v1, node:$i1, node:$v2, node:$i2))>;
1060b57cec5SDimitry Andricdef insve_v2i64 : PatFrag<(ops node:$v1, node:$i1, node:$v2, node:$i2),
1070b57cec5SDimitry Andric    (v2i64 (MipsINSVE node:$v1, node:$i1, node:$v2, node:$i2))>;
1080b57cec5SDimitry Andric
1090b57cec5SDimitry Andricclass vfsetcc_type<ValueType ResTy, ValueType OpTy, CondCode CC> :
1100b57cec5SDimitry Andric  PatFrag<(ops node:$lhs, node:$rhs),
1110b57cec5SDimitry Andric          (ResTy (vfsetcc (OpTy node:$lhs), (OpTy node:$rhs), CC))>;
1120b57cec5SDimitry Andric
1130b57cec5SDimitry Andric// ISD::SETFALSE cannot occur
1140b57cec5SDimitry Andricdef vfseteq_v4f32 : vfsetcc_type<v4i32, v4f32, SETEQ>;
1150b57cec5SDimitry Andricdef vfseteq_v2f64 : vfsetcc_type<v2i64, v2f64, SETEQ>;
1160b57cec5SDimitry Andricdef vfsetge_v4f32 : vfsetcc_type<v4i32, v4f32, SETGE>;
1170b57cec5SDimitry Andricdef vfsetge_v2f64 : vfsetcc_type<v2i64, v2f64, SETGE>;
1180b57cec5SDimitry Andricdef vfsetgt_v4f32 : vfsetcc_type<v4i32, v4f32, SETGT>;
1190b57cec5SDimitry Andricdef vfsetgt_v2f64 : vfsetcc_type<v2i64, v2f64, SETGT>;
1200b57cec5SDimitry Andricdef vfsetle_v4f32 : vfsetcc_type<v4i32, v4f32, SETLE>;
1210b57cec5SDimitry Andricdef vfsetle_v2f64 : vfsetcc_type<v2i64, v2f64, SETLE>;
1220b57cec5SDimitry Andricdef vfsetlt_v4f32 : vfsetcc_type<v4i32, v4f32, SETLT>;
1230b57cec5SDimitry Andricdef vfsetlt_v2f64 : vfsetcc_type<v2i64, v2f64, SETLT>;
1240b57cec5SDimitry Andricdef vfsetne_v4f32 : vfsetcc_type<v4i32, v4f32, SETNE>;
1250b57cec5SDimitry Andricdef vfsetne_v2f64 : vfsetcc_type<v2i64, v2f64, SETNE>;
1260b57cec5SDimitry Andricdef vfsetoeq_v4f32 : vfsetcc_type<v4i32, v4f32, SETOEQ>;
1270b57cec5SDimitry Andricdef vfsetoeq_v2f64 : vfsetcc_type<v2i64, v2f64, SETOEQ>;
1280b57cec5SDimitry Andricdef vfsetoge_v4f32 : vfsetcc_type<v4i32, v4f32, SETOGE>;
1290b57cec5SDimitry Andricdef vfsetoge_v2f64 : vfsetcc_type<v2i64, v2f64, SETOGE>;
1300b57cec5SDimitry Andricdef vfsetogt_v4f32 : vfsetcc_type<v4i32, v4f32, SETOGT>;
1310b57cec5SDimitry Andricdef vfsetogt_v2f64 : vfsetcc_type<v2i64, v2f64, SETOGT>;
1320b57cec5SDimitry Andricdef vfsetole_v4f32 : vfsetcc_type<v4i32, v4f32, SETOLE>;
1330b57cec5SDimitry Andricdef vfsetole_v2f64 : vfsetcc_type<v2i64, v2f64, SETOLE>;
1340b57cec5SDimitry Andricdef vfsetolt_v4f32 : vfsetcc_type<v4i32, v4f32, SETOLT>;
1350b57cec5SDimitry Andricdef vfsetolt_v2f64 : vfsetcc_type<v2i64, v2f64, SETOLT>;
1360b57cec5SDimitry Andricdef vfsetone_v4f32 : vfsetcc_type<v4i32, v4f32, SETONE>;
1370b57cec5SDimitry Andricdef vfsetone_v2f64 : vfsetcc_type<v2i64, v2f64, SETONE>;
1380b57cec5SDimitry Andricdef vfsetord_v4f32 : vfsetcc_type<v4i32, v4f32, SETO>;
1390b57cec5SDimitry Andricdef vfsetord_v2f64 : vfsetcc_type<v2i64, v2f64, SETO>;
1400b57cec5SDimitry Andricdef vfsetun_v4f32  : vfsetcc_type<v4i32, v4f32, SETUO>;
1410b57cec5SDimitry Andricdef vfsetun_v2f64  : vfsetcc_type<v2i64, v2f64, SETUO>;
1420b57cec5SDimitry Andricdef vfsetueq_v4f32 : vfsetcc_type<v4i32, v4f32, SETUEQ>;
1430b57cec5SDimitry Andricdef vfsetueq_v2f64 : vfsetcc_type<v2i64, v2f64, SETUEQ>;
1440b57cec5SDimitry Andricdef vfsetuge_v4f32 : vfsetcc_type<v4i32, v4f32, SETUGE>;
1450b57cec5SDimitry Andricdef vfsetuge_v2f64 : vfsetcc_type<v2i64, v2f64, SETUGE>;
1460b57cec5SDimitry Andricdef vfsetugt_v4f32 : vfsetcc_type<v4i32, v4f32, SETUGT>;
1470b57cec5SDimitry Andricdef vfsetugt_v2f64 : vfsetcc_type<v2i64, v2f64, SETUGT>;
1480b57cec5SDimitry Andricdef vfsetule_v4f32 : vfsetcc_type<v4i32, v4f32, SETULE>;
1490b57cec5SDimitry Andricdef vfsetule_v2f64 : vfsetcc_type<v2i64, v2f64, SETULE>;
1500b57cec5SDimitry Andricdef vfsetult_v4f32 : vfsetcc_type<v4i32, v4f32, SETULT>;
1510b57cec5SDimitry Andricdef vfsetult_v2f64 : vfsetcc_type<v2i64, v2f64, SETULT>;
1520b57cec5SDimitry Andricdef vfsetune_v4f32 : vfsetcc_type<v4i32, v4f32, SETUNE>;
1530b57cec5SDimitry Andricdef vfsetune_v2f64 : vfsetcc_type<v2i64, v2f64, SETUNE>;
1540b57cec5SDimitry Andric// ISD::SETTRUE cannot occur
1550b57cec5SDimitry Andric// ISD::SETFALSE2 cannot occur
1560b57cec5SDimitry Andric// ISD::SETTRUE2 cannot occur
1570b57cec5SDimitry Andric
1580b57cec5SDimitry Andricclass vsetcc_type<ValueType ResTy, CondCode CC> :
1590b57cec5SDimitry Andric  PatFrag<(ops node:$lhs, node:$rhs),
1600b57cec5SDimitry Andric          (ResTy (vsetcc node:$lhs, node:$rhs, CC))>;
1610b57cec5SDimitry Andric
1620b57cec5SDimitry Andricdef vseteq_v16i8  : vsetcc_type<v16i8, SETEQ>;
1630b57cec5SDimitry Andricdef vseteq_v8i16  : vsetcc_type<v8i16, SETEQ>;
1640b57cec5SDimitry Andricdef vseteq_v4i32  : vsetcc_type<v4i32, SETEQ>;
1650b57cec5SDimitry Andricdef vseteq_v2i64  : vsetcc_type<v2i64, SETEQ>;
1660b57cec5SDimitry Andricdef vsetle_v16i8  : vsetcc_type<v16i8, SETLE>;
1670b57cec5SDimitry Andricdef vsetle_v8i16  : vsetcc_type<v8i16, SETLE>;
1680b57cec5SDimitry Andricdef vsetle_v4i32  : vsetcc_type<v4i32, SETLE>;
1690b57cec5SDimitry Andricdef vsetle_v2i64  : vsetcc_type<v2i64, SETLE>;
1700b57cec5SDimitry Andricdef vsetlt_v16i8  : vsetcc_type<v16i8, SETLT>;
1710b57cec5SDimitry Andricdef vsetlt_v8i16  : vsetcc_type<v8i16, SETLT>;
1720b57cec5SDimitry Andricdef vsetlt_v4i32  : vsetcc_type<v4i32, SETLT>;
1730b57cec5SDimitry Andricdef vsetlt_v2i64  : vsetcc_type<v2i64, SETLT>;
1740b57cec5SDimitry Andricdef vsetule_v16i8 : vsetcc_type<v16i8, SETULE>;
1750b57cec5SDimitry Andricdef vsetule_v8i16 : vsetcc_type<v8i16, SETULE>;
1760b57cec5SDimitry Andricdef vsetule_v4i32 : vsetcc_type<v4i32, SETULE>;
1770b57cec5SDimitry Andricdef vsetule_v2i64 : vsetcc_type<v2i64, SETULE>;
1780b57cec5SDimitry Andricdef vsetult_v16i8 : vsetcc_type<v16i8, SETULT>;
1790b57cec5SDimitry Andricdef vsetult_v8i16 : vsetcc_type<v8i16, SETULT>;
1800b57cec5SDimitry Andricdef vsetult_v4i32 : vsetcc_type<v4i32, SETULT>;
1810b57cec5SDimitry Andricdef vsetult_v2i64 : vsetcc_type<v2i64, SETULT>;
1820b57cec5SDimitry Andric
1830b57cec5SDimitry Andricdef vsplati8  : PatFrag<(ops node:$e0),
1840b57cec5SDimitry Andric                        (v16i8 (build_vector node:$e0, node:$e0,
1850b57cec5SDimitry Andric                                             node:$e0, node:$e0,
1860b57cec5SDimitry Andric                                             node:$e0, node:$e0,
1870b57cec5SDimitry Andric                                             node:$e0, node:$e0,
1880b57cec5SDimitry Andric                                             node:$e0, node:$e0,
1890b57cec5SDimitry Andric                                             node:$e0, node:$e0,
1900b57cec5SDimitry Andric                                             node:$e0, node:$e0,
1910b57cec5SDimitry Andric                                             node:$e0, node:$e0))>;
1920b57cec5SDimitry Andricdef vsplati16 : PatFrag<(ops node:$e0),
1930b57cec5SDimitry Andric                        (v8i16 (build_vector node:$e0, node:$e0,
1940b57cec5SDimitry Andric                                             node:$e0, node:$e0,
1950b57cec5SDimitry Andric                                             node:$e0, node:$e0,
1960b57cec5SDimitry Andric                                             node:$e0, node:$e0))>;
1970b57cec5SDimitry Andricdef vsplati32 : PatFrag<(ops node:$e0),
1980b57cec5SDimitry Andric                        (v4i32 (build_vector node:$e0, node:$e0,
1990b57cec5SDimitry Andric                                             node:$e0, node:$e0))>;
2000b57cec5SDimitry Andric
201*71ac745dSDimitry Andric// Any build_vector that is a constant splat with a value that equals 1
202*71ac745dSDimitry Andricdef vsplat_imm_eq_1 : ComplexPattern<vAny, 0, "selectVSplatImmEq1">;
2030b57cec5SDimitry Andric
2040b57cec5SDimitry Andricdef vsplati64 : PatFrag<(ops node:$e0),
2050b57cec5SDimitry Andric                        (v2i64 (build_vector node:$e0, node:$e0))>;
2060b57cec5SDimitry Andric
2070b57cec5SDimitry Andricdef vsplati64_splat_d : PatFrag<(ops node:$e0),
2080b57cec5SDimitry Andric                                (v2i64 (bitconvert
2090b57cec5SDimitry Andric                                         (v4i32 (and
2100b57cec5SDimitry Andric                                           (v4i32 (build_vector node:$e0,
2110b57cec5SDimitry Andric                                                                node:$e0,
2120b57cec5SDimitry Andric                                                                node:$e0,
2130b57cec5SDimitry Andric                                                                node:$e0)),
214*71ac745dSDimitry Andric                                           (vsplat_imm_eq_1)))))>;
2150b57cec5SDimitry Andric
2160b57cec5SDimitry Andricdef vsplatf32 : PatFrag<(ops node:$e0),
2170b57cec5SDimitry Andric                        (v4f32 (build_vector node:$e0, node:$e0,
2180b57cec5SDimitry Andric                                             node:$e0, node:$e0))>;
2190b57cec5SDimitry Andricdef vsplatf64 : PatFrag<(ops node:$e0),
2200b57cec5SDimitry Andric                        (v2f64 (build_vector node:$e0, node:$e0))>;
2210b57cec5SDimitry Andric
2220b57cec5SDimitry Andricdef vsplati8_elt  : PatFrag<(ops node:$v, node:$i),
2230b57cec5SDimitry Andric                            (MipsVSHF (vsplati8 node:$i), node:$v, node:$v)>;
2240b57cec5SDimitry Andricdef vsplati16_elt : PatFrag<(ops node:$v, node:$i),
2250b57cec5SDimitry Andric                            (MipsVSHF (vsplati16 node:$i), node:$v, node:$v)>;
2260b57cec5SDimitry Andricdef vsplati32_elt : PatFrag<(ops node:$v, node:$i),
2270b57cec5SDimitry Andric                            (MipsVSHF (vsplati32 node:$i), node:$v, node:$v)>;
2280b57cec5SDimitry Andricdef vsplati64_elt : PatFrag<(ops node:$v, node:$i),
2290b57cec5SDimitry Andric                            (MipsVSHF (vsplati64_splat_d node:$i),
2300b57cec5SDimitry Andric                                      node:$v, node:$v)>;
2310b57cec5SDimitry Andric
2320b57cec5SDimitry Andricclass SplatPatLeaf<Operand opclass, dag frag, code pred = [{}],
2330b57cec5SDimitry Andric                   SDNodeXForm xform = NOOP_SDNodeXForm>
2340b57cec5SDimitry Andric  : PatLeaf<frag, pred, xform> {
2350b57cec5SDimitry Andric  Operand OpClass = opclass;
2360b57cec5SDimitry Andric}
2370b57cec5SDimitry Andric
2380b57cec5SDimitry Andricclass SplatComplexPattern<Operand opclass, ValueType ty, int numops, string fn,
2390b57cec5SDimitry Andric                          list<SDNode> roots = [],
2400b57cec5SDimitry Andric                          list<SDNodeProperty> props = []> :
2410b57cec5SDimitry Andric  ComplexPattern<ty, numops, fn, roots, props> {
2420b57cec5SDimitry Andric  Operand OpClass = opclass;
2430b57cec5SDimitry Andric}
2440b57cec5SDimitry Andric
2450b57cec5SDimitry Andricdef vsplati8_uimm3 : SplatComplexPattern<vsplat_uimm3, v16i8, 1,
2460b57cec5SDimitry Andric                                         "selectVSplatUimm3",
2470b57cec5SDimitry Andric                                         [build_vector, bitconvert]>;
2480b57cec5SDimitry Andric
2490b57cec5SDimitry Andricdef vsplati8_uimm4 : SplatComplexPattern<vsplat_uimm4, v16i8, 1,
2500b57cec5SDimitry Andric                                         "selectVSplatUimm4",
2510b57cec5SDimitry Andric                                         [build_vector, bitconvert]>;
2520b57cec5SDimitry Andric
2530b57cec5SDimitry Andricdef vsplati8_uimm5 : SplatComplexPattern<vsplat_uimm5, v16i8, 1,
2540b57cec5SDimitry Andric                                         "selectVSplatUimm5",
2550b57cec5SDimitry Andric                                         [build_vector, bitconvert]>;
2560b57cec5SDimitry Andric
2570b57cec5SDimitry Andricdef vsplati8_uimm8 : SplatComplexPattern<vsplat_uimm8, v16i8, 1,
2580b57cec5SDimitry Andric                                         "selectVSplatUimm8",
2590b57cec5SDimitry Andric                                         [build_vector, bitconvert]>;
2600b57cec5SDimitry Andric
2610b57cec5SDimitry Andricdef vsplati8_simm5 : SplatComplexPattern<vsplat_simm5, v16i8, 1,
2620b57cec5SDimitry Andric                                         "selectVSplatSimm5",
2630b57cec5SDimitry Andric                                         [build_vector, bitconvert]>;
2640b57cec5SDimitry Andric
2650b57cec5SDimitry Andricdef vsplati16_uimm3 : SplatComplexPattern<vsplat_uimm3, v8i16, 1,
2660b57cec5SDimitry Andric                                          "selectVSplatUimm3",
2670b57cec5SDimitry Andric                                          [build_vector, bitconvert]>;
2680b57cec5SDimitry Andric
2690b57cec5SDimitry Andricdef vsplati16_uimm4 : SplatComplexPattern<vsplat_uimm4, v8i16, 1,
2700b57cec5SDimitry Andric                                          "selectVSplatUimm4",
2710b57cec5SDimitry Andric                                          [build_vector, bitconvert]>;
2720b57cec5SDimitry Andric
2730b57cec5SDimitry Andricdef vsplati16_uimm5 : SplatComplexPattern<vsplat_uimm5, v8i16, 1,
2740b57cec5SDimitry Andric                                          "selectVSplatUimm5",
2750b57cec5SDimitry Andric                                          [build_vector, bitconvert]>;
2760b57cec5SDimitry Andric
2770b57cec5SDimitry Andricdef vsplati16_simm5 : SplatComplexPattern<vsplat_simm5, v8i16, 1,
2780b57cec5SDimitry Andric                                          "selectVSplatSimm5",
2790b57cec5SDimitry Andric                                          [build_vector, bitconvert]>;
2800b57cec5SDimitry Andric
2810b57cec5SDimitry Andricdef vsplati32_uimm2 : SplatComplexPattern<vsplat_uimm2, v4i32, 1,
2820b57cec5SDimitry Andric                                          "selectVSplatUimm2",
2830b57cec5SDimitry Andric                                          [build_vector, bitconvert]>;
2840b57cec5SDimitry Andric
2850b57cec5SDimitry Andricdef vsplati32_uimm5 : SplatComplexPattern<vsplat_uimm5, v4i32, 1,
2860b57cec5SDimitry Andric                                          "selectVSplatUimm5",
2870b57cec5SDimitry Andric                                          [build_vector, bitconvert]>;
2880b57cec5SDimitry Andric
2890b57cec5SDimitry Andricdef vsplati32_simm5 : SplatComplexPattern<vsplat_simm5, v4i32, 1,
2900b57cec5SDimitry Andric                                          "selectVSplatSimm5",
2910b57cec5SDimitry Andric                                          [build_vector, bitconvert]>;
2920b57cec5SDimitry Andric
2930b57cec5SDimitry Andricdef vsplati64_uimm1 : SplatComplexPattern<vsplat_uimm1, v2i64, 1,
2940b57cec5SDimitry Andric                                          "selectVSplatUimm1",
2950b57cec5SDimitry Andric                                          [build_vector, bitconvert]>;
2960b57cec5SDimitry Andric
2970b57cec5SDimitry Andricdef vsplati64_uimm5 : SplatComplexPattern<vsplat_uimm5, v2i64, 1,
2980b57cec5SDimitry Andric                                          "selectVSplatUimm5",
2990b57cec5SDimitry Andric                                          [build_vector, bitconvert]>;
3000b57cec5SDimitry Andric
3010b57cec5SDimitry Andricdef vsplati64_uimm6 : SplatComplexPattern<vsplat_uimm6, v2i64, 1,
3020b57cec5SDimitry Andric                                          "selectVSplatUimm6",
3030b57cec5SDimitry Andric                                          [build_vector, bitconvert]>;
3040b57cec5SDimitry Andric
3050b57cec5SDimitry Andricdef vsplati64_simm5 : SplatComplexPattern<vsplat_simm5, v2i64, 1,
3060b57cec5SDimitry Andric                                          "selectVSplatSimm5",
3070b57cec5SDimitry Andric                                          [build_vector, bitconvert]>;
3080b57cec5SDimitry Andric
3090b57cec5SDimitry Andric// Any build_vector that is a constant splat with a value that is an exact
3100b57cec5SDimitry Andric// power of 2
3110b57cec5SDimitry Andricdef vsplat_uimm_pow2 : ComplexPattern<vAny, 1, "selectVSplatUimmPow2",
3120b57cec5SDimitry Andric                                      [build_vector, bitconvert]>;
3130b57cec5SDimitry Andric
3140b57cec5SDimitry Andric// Any build_vector that is a constant splat with a value that is the bitwise
3150b57cec5SDimitry Andric// inverse of an exact power of 2
3160b57cec5SDimitry Andricdef vsplat_uimm_inv_pow2 : ComplexPattern<vAny, 1, "selectVSplatUimmInvPow2",
3170b57cec5SDimitry Andric                                          [build_vector, bitconvert]>;
3180b57cec5SDimitry Andric
3190b57cec5SDimitry Andric// Any build_vector that is a constant splat with only a consecutive sequence
3200b57cec5SDimitry Andric// of left-most bits set.
3210b57cec5SDimitry Andricdef vsplat_maskl_bits_uimm3
3220b57cec5SDimitry Andric    : SplatComplexPattern<vsplat_uimm3, vAny, 1, "selectVSplatMaskL",
3230b57cec5SDimitry Andric                          [build_vector, bitconvert]>;
3240b57cec5SDimitry Andricdef vsplat_maskl_bits_uimm4
3250b57cec5SDimitry Andric    : SplatComplexPattern<vsplat_uimm4, vAny, 1, "selectVSplatMaskL",
3260b57cec5SDimitry Andric                          [build_vector, bitconvert]>;
3270b57cec5SDimitry Andricdef vsplat_maskl_bits_uimm5
3280b57cec5SDimitry Andric    : SplatComplexPattern<vsplat_uimm5, vAny, 1, "selectVSplatMaskL",
3290b57cec5SDimitry Andric                          [build_vector, bitconvert]>;
3300b57cec5SDimitry Andricdef vsplat_maskl_bits_uimm6
3310b57cec5SDimitry Andric    : SplatComplexPattern<vsplat_uimm6, vAny, 1, "selectVSplatMaskL",
3320b57cec5SDimitry Andric                          [build_vector, bitconvert]>;
3330b57cec5SDimitry Andric
3340b57cec5SDimitry Andric// Any build_vector that is a constant splat with only a consecutive sequence
3350b57cec5SDimitry Andric// of right-most bits set.
3360b57cec5SDimitry Andricdef vsplat_maskr_bits_uimm3
3370b57cec5SDimitry Andric    : SplatComplexPattern<vsplat_uimm3, vAny, 1, "selectVSplatMaskR",
3380b57cec5SDimitry Andric                          [build_vector, bitconvert]>;
3390b57cec5SDimitry Andricdef vsplat_maskr_bits_uimm4
3400b57cec5SDimitry Andric    : SplatComplexPattern<vsplat_uimm4, vAny, 1, "selectVSplatMaskR",
3410b57cec5SDimitry Andric                          [build_vector, bitconvert]>;
3420b57cec5SDimitry Andricdef vsplat_maskr_bits_uimm5
3430b57cec5SDimitry Andric    : SplatComplexPattern<vsplat_uimm5, vAny, 1, "selectVSplatMaskR",
3440b57cec5SDimitry Andric                          [build_vector, bitconvert]>;
3450b57cec5SDimitry Andricdef vsplat_maskr_bits_uimm6
3460b57cec5SDimitry Andric    : SplatComplexPattern<vsplat_uimm6, vAny, 1, "selectVSplatMaskR",
3470b57cec5SDimitry Andric                          [build_vector, bitconvert]>;
3480b57cec5SDimitry Andric
3490b57cec5SDimitry Andric
3500b57cec5SDimitry Andricdef vbclr_b : PatFrag<(ops node:$ws, node:$wt),
351*71ac745dSDimitry Andric                      (and node:$ws, (vnot (shl (vsplat_imm_eq_1), node:$wt)))>;
3520b57cec5SDimitry Andricdef vbclr_h : PatFrag<(ops node:$ws, node:$wt),
353*71ac745dSDimitry Andric                      (and node:$ws, (vnot (shl (vsplat_imm_eq_1), node:$wt)))>;
3540b57cec5SDimitry Andricdef vbclr_w : PatFrag<(ops node:$ws, node:$wt),
355*71ac745dSDimitry Andric                      (and node:$ws, (vnot (shl (vsplat_imm_eq_1), node:$wt)))>;
3560b57cec5SDimitry Andricdef vbclr_d : PatFrag<(ops node:$ws, node:$wt),
357*71ac745dSDimitry Andric                      (and node:$ws, (vnot (shl (v2i64 (vsplat_imm_eq_1)),
358fe6060f1SDimitry Andric                                               node:$wt)))>;
3590b57cec5SDimitry Andric
3600b57cec5SDimitry Andricdef vbneg_b : PatFrag<(ops node:$ws, node:$wt),
361*71ac745dSDimitry Andric                      (xor node:$ws, (shl (vsplat_imm_eq_1), node:$wt))>;
3620b57cec5SDimitry Andricdef vbneg_h : PatFrag<(ops node:$ws, node:$wt),
363*71ac745dSDimitry Andric                      (xor node:$ws, (shl (vsplat_imm_eq_1), node:$wt))>;
3640b57cec5SDimitry Andricdef vbneg_w : PatFrag<(ops node:$ws, node:$wt),
365*71ac745dSDimitry Andric                      (xor node:$ws, (shl (vsplat_imm_eq_1), node:$wt))>;
3660b57cec5SDimitry Andricdef vbneg_d : PatFrag<(ops node:$ws, node:$wt),
367*71ac745dSDimitry Andric                      (xor node:$ws, (shl (v2i64 (vsplat_imm_eq_1)),
3680b57cec5SDimitry Andric                                          node:$wt))>;
3690b57cec5SDimitry Andric
3700b57cec5SDimitry Andricdef vbset_b : PatFrag<(ops node:$ws, node:$wt),
371*71ac745dSDimitry Andric                      (or node:$ws, (shl (vsplat_imm_eq_1), node:$wt))>;
3720b57cec5SDimitry Andricdef vbset_h : PatFrag<(ops node:$ws, node:$wt),
373*71ac745dSDimitry Andric                      (or node:$ws, (shl (vsplat_imm_eq_1), node:$wt))>;
3740b57cec5SDimitry Andricdef vbset_w : PatFrag<(ops node:$ws, node:$wt),
375*71ac745dSDimitry Andric                      (or node:$ws, (shl (vsplat_imm_eq_1), node:$wt))>;
3760b57cec5SDimitry Andricdef vbset_d : PatFrag<(ops node:$ws, node:$wt),
377*71ac745dSDimitry Andric                      (or node:$ws, (shl (v2i64 (vsplat_imm_eq_1)),
3780b57cec5SDimitry Andric                                         node:$wt))>;
3790b57cec5SDimitry Andric
3800b57cec5SDimitry Andricdef muladd : PatFrag<(ops node:$wd, node:$ws, node:$wt),
3810b57cec5SDimitry Andric                     (add node:$wd, (mul node:$ws, node:$wt))>;
3820b57cec5SDimitry Andric
3830b57cec5SDimitry Andricdef mulsub : PatFrag<(ops node:$wd, node:$ws, node:$wt),
3840b57cec5SDimitry Andric                     (sub node:$wd, (mul node:$ws, node:$wt))>;
3850b57cec5SDimitry Andric
3860b57cec5SDimitry Andricdef mul_fexp2 : PatFrag<(ops node:$ws, node:$wt),
3870b57cec5SDimitry Andric                        (fmul node:$ws, (fexp2 node:$wt))>;
3880b57cec5SDimitry Andric
3890b57cec5SDimitry Andric// Instruction encoding.
3900b57cec5SDimitry Andricclass ADD_A_B_ENC : MSA_3R_FMT<0b000, 0b00, 0b010000>;
3910b57cec5SDimitry Andricclass ADD_A_H_ENC : MSA_3R_FMT<0b000, 0b01, 0b010000>;
3920b57cec5SDimitry Andricclass ADD_A_W_ENC : MSA_3R_FMT<0b000, 0b10, 0b010000>;
3930b57cec5SDimitry Andricclass ADD_A_D_ENC : MSA_3R_FMT<0b000, 0b11, 0b010000>;
3940b57cec5SDimitry Andric
3950b57cec5SDimitry Andricclass ADDS_A_B_ENC : MSA_3R_FMT<0b001, 0b00, 0b010000>;
3960b57cec5SDimitry Andricclass ADDS_A_H_ENC : MSA_3R_FMT<0b001, 0b01, 0b010000>;
3970b57cec5SDimitry Andricclass ADDS_A_W_ENC : MSA_3R_FMT<0b001, 0b10, 0b010000>;
3980b57cec5SDimitry Andricclass ADDS_A_D_ENC : MSA_3R_FMT<0b001, 0b11, 0b010000>;
3990b57cec5SDimitry Andric
4000b57cec5SDimitry Andricclass ADDS_S_B_ENC : MSA_3R_FMT<0b010, 0b00, 0b010000>;
4010b57cec5SDimitry Andricclass ADDS_S_H_ENC : MSA_3R_FMT<0b010, 0b01, 0b010000>;
4020b57cec5SDimitry Andricclass ADDS_S_W_ENC : MSA_3R_FMT<0b010, 0b10, 0b010000>;
4030b57cec5SDimitry Andricclass ADDS_S_D_ENC : MSA_3R_FMT<0b010, 0b11, 0b010000>;
4040b57cec5SDimitry Andric
4050b57cec5SDimitry Andricclass ADDS_U_B_ENC : MSA_3R_FMT<0b011, 0b00, 0b010000>;
4060b57cec5SDimitry Andricclass ADDS_U_H_ENC : MSA_3R_FMT<0b011, 0b01, 0b010000>;
4070b57cec5SDimitry Andricclass ADDS_U_W_ENC : MSA_3R_FMT<0b011, 0b10, 0b010000>;
4080b57cec5SDimitry Andricclass ADDS_U_D_ENC : MSA_3R_FMT<0b011, 0b11, 0b010000>;
4090b57cec5SDimitry Andric
4100b57cec5SDimitry Andricclass ADDV_B_ENC : MSA_3R_FMT<0b000, 0b00, 0b001110>;
4110b57cec5SDimitry Andricclass ADDV_H_ENC : MSA_3R_FMT<0b000, 0b01, 0b001110>;
4120b57cec5SDimitry Andricclass ADDV_W_ENC : MSA_3R_FMT<0b000, 0b10, 0b001110>;
4130b57cec5SDimitry Andricclass ADDV_D_ENC : MSA_3R_FMT<0b000, 0b11, 0b001110>;
4140b57cec5SDimitry Andric
4150b57cec5SDimitry Andricclass ADDVI_B_ENC : MSA_I5_FMT<0b000, 0b00, 0b000110>;
4160b57cec5SDimitry Andricclass ADDVI_H_ENC : MSA_I5_FMT<0b000, 0b01, 0b000110>;
4170b57cec5SDimitry Andricclass ADDVI_W_ENC : MSA_I5_FMT<0b000, 0b10, 0b000110>;
4180b57cec5SDimitry Andricclass ADDVI_D_ENC : MSA_I5_FMT<0b000, 0b11, 0b000110>;
4190b57cec5SDimitry Andric
4200b57cec5SDimitry Andricclass AND_V_ENC : MSA_VEC_FMT<0b00000, 0b011110>;
4210b57cec5SDimitry Andric
4220b57cec5SDimitry Andricclass ANDI_B_ENC : MSA_I8_FMT<0b00, 0b000000>;
4230b57cec5SDimitry Andric
4240b57cec5SDimitry Andricclass ASUB_S_B_ENC : MSA_3R_FMT<0b100, 0b00, 0b010001>;
4250b57cec5SDimitry Andricclass ASUB_S_H_ENC : MSA_3R_FMT<0b100, 0b01, 0b010001>;
4260b57cec5SDimitry Andricclass ASUB_S_W_ENC : MSA_3R_FMT<0b100, 0b10, 0b010001>;
4270b57cec5SDimitry Andricclass ASUB_S_D_ENC : MSA_3R_FMT<0b100, 0b11, 0b010001>;
4280b57cec5SDimitry Andric
4290b57cec5SDimitry Andricclass ASUB_U_B_ENC : MSA_3R_FMT<0b101, 0b00, 0b010001>;
4300b57cec5SDimitry Andricclass ASUB_U_H_ENC : MSA_3R_FMT<0b101, 0b01, 0b010001>;
4310b57cec5SDimitry Andricclass ASUB_U_W_ENC : MSA_3R_FMT<0b101, 0b10, 0b010001>;
4320b57cec5SDimitry Andricclass ASUB_U_D_ENC : MSA_3R_FMT<0b101, 0b11, 0b010001>;
4330b57cec5SDimitry Andric
4340b57cec5SDimitry Andricclass AVE_S_B_ENC : MSA_3R_FMT<0b100, 0b00, 0b010000>;
4350b57cec5SDimitry Andricclass AVE_S_H_ENC : MSA_3R_FMT<0b100, 0b01, 0b010000>;
4360b57cec5SDimitry Andricclass AVE_S_W_ENC : MSA_3R_FMT<0b100, 0b10, 0b010000>;
4370b57cec5SDimitry Andricclass AVE_S_D_ENC : MSA_3R_FMT<0b100, 0b11, 0b010000>;
4380b57cec5SDimitry Andric
4390b57cec5SDimitry Andricclass AVE_U_B_ENC : MSA_3R_FMT<0b101, 0b00, 0b010000>;
4400b57cec5SDimitry Andricclass AVE_U_H_ENC : MSA_3R_FMT<0b101, 0b01, 0b010000>;
4410b57cec5SDimitry Andricclass AVE_U_W_ENC : MSA_3R_FMT<0b101, 0b10, 0b010000>;
4420b57cec5SDimitry Andricclass AVE_U_D_ENC : MSA_3R_FMT<0b101, 0b11, 0b010000>;
4430b57cec5SDimitry Andric
4440b57cec5SDimitry Andricclass AVER_S_B_ENC : MSA_3R_FMT<0b110, 0b00, 0b010000>;
4450b57cec5SDimitry Andricclass AVER_S_H_ENC : MSA_3R_FMT<0b110, 0b01, 0b010000>;
4460b57cec5SDimitry Andricclass AVER_S_W_ENC : MSA_3R_FMT<0b110, 0b10, 0b010000>;
4470b57cec5SDimitry Andricclass AVER_S_D_ENC : MSA_3R_FMT<0b110, 0b11, 0b010000>;
4480b57cec5SDimitry Andric
4490b57cec5SDimitry Andricclass AVER_U_B_ENC : MSA_3R_FMT<0b111, 0b00, 0b010000>;
4500b57cec5SDimitry Andricclass AVER_U_H_ENC : MSA_3R_FMT<0b111, 0b01, 0b010000>;
4510b57cec5SDimitry Andricclass AVER_U_W_ENC : MSA_3R_FMT<0b111, 0b10, 0b010000>;
4520b57cec5SDimitry Andricclass AVER_U_D_ENC : MSA_3R_FMT<0b111, 0b11, 0b010000>;
4530b57cec5SDimitry Andric
4540b57cec5SDimitry Andricclass BCLR_B_ENC : MSA_3R_FMT<0b011, 0b00, 0b001101>;
4550b57cec5SDimitry Andricclass BCLR_H_ENC : MSA_3R_FMT<0b011, 0b01, 0b001101>;
4560b57cec5SDimitry Andricclass BCLR_W_ENC : MSA_3R_FMT<0b011, 0b10, 0b001101>;
4570b57cec5SDimitry Andricclass BCLR_D_ENC : MSA_3R_FMT<0b011, 0b11, 0b001101>;
4580b57cec5SDimitry Andric
4590b57cec5SDimitry Andricclass BCLRI_B_ENC : MSA_BIT_B_FMT<0b011, 0b001001>;
4600b57cec5SDimitry Andricclass BCLRI_H_ENC : MSA_BIT_H_FMT<0b011, 0b001001>;
4610b57cec5SDimitry Andricclass BCLRI_W_ENC : MSA_BIT_W_FMT<0b011, 0b001001>;
4620b57cec5SDimitry Andricclass BCLRI_D_ENC : MSA_BIT_D_FMT<0b011, 0b001001>;
4630b57cec5SDimitry Andric
4640b57cec5SDimitry Andricclass BINSL_B_ENC : MSA_3R_FMT<0b110, 0b00, 0b001101>;
4650b57cec5SDimitry Andricclass BINSL_H_ENC : MSA_3R_FMT<0b110, 0b01, 0b001101>;
4660b57cec5SDimitry Andricclass BINSL_W_ENC : MSA_3R_FMT<0b110, 0b10, 0b001101>;
4670b57cec5SDimitry Andricclass BINSL_D_ENC : MSA_3R_FMT<0b110, 0b11, 0b001101>;
4680b57cec5SDimitry Andric
4690b57cec5SDimitry Andricclass BINSLI_B_ENC : MSA_BIT_B_FMT<0b110, 0b001001>;
4700b57cec5SDimitry Andricclass BINSLI_H_ENC : MSA_BIT_H_FMT<0b110, 0b001001>;
4710b57cec5SDimitry Andricclass BINSLI_W_ENC : MSA_BIT_W_FMT<0b110, 0b001001>;
4720b57cec5SDimitry Andricclass BINSLI_D_ENC : MSA_BIT_D_FMT<0b110, 0b001001>;
4730b57cec5SDimitry Andric
4740b57cec5SDimitry Andricclass BINSR_B_ENC : MSA_3R_FMT<0b111, 0b00, 0b001101>;
4750b57cec5SDimitry Andricclass BINSR_H_ENC : MSA_3R_FMT<0b111, 0b01, 0b001101>;
4760b57cec5SDimitry Andricclass BINSR_W_ENC : MSA_3R_FMT<0b111, 0b10, 0b001101>;
4770b57cec5SDimitry Andricclass BINSR_D_ENC : MSA_3R_FMT<0b111, 0b11, 0b001101>;
4780b57cec5SDimitry Andric
4790b57cec5SDimitry Andricclass BINSRI_B_ENC : MSA_BIT_B_FMT<0b111, 0b001001>;
4800b57cec5SDimitry Andricclass BINSRI_H_ENC : MSA_BIT_H_FMT<0b111, 0b001001>;
4810b57cec5SDimitry Andricclass BINSRI_W_ENC : MSA_BIT_W_FMT<0b111, 0b001001>;
4820b57cec5SDimitry Andricclass BINSRI_D_ENC : MSA_BIT_D_FMT<0b111, 0b001001>;
4830b57cec5SDimitry Andric
4840b57cec5SDimitry Andricclass BMNZ_V_ENC : MSA_VEC_FMT<0b00100, 0b011110>;
4850b57cec5SDimitry Andric
4860b57cec5SDimitry Andricclass BMNZI_B_ENC : MSA_I8_FMT<0b00, 0b000001>;
4870b57cec5SDimitry Andric
4880b57cec5SDimitry Andricclass BMZ_V_ENC : MSA_VEC_FMT<0b00101, 0b011110>;
4890b57cec5SDimitry Andric
4900b57cec5SDimitry Andricclass BMZI_B_ENC : MSA_I8_FMT<0b01, 0b000001>;
4910b57cec5SDimitry Andric
4920b57cec5SDimitry Andricclass BNEG_B_ENC : MSA_3R_FMT<0b101, 0b00, 0b001101>;
4930b57cec5SDimitry Andricclass BNEG_H_ENC : MSA_3R_FMT<0b101, 0b01, 0b001101>;
4940b57cec5SDimitry Andricclass BNEG_W_ENC : MSA_3R_FMT<0b101, 0b10, 0b001101>;
4950b57cec5SDimitry Andricclass BNEG_D_ENC : MSA_3R_FMT<0b101, 0b11, 0b001101>;
4960b57cec5SDimitry Andric
4970b57cec5SDimitry Andricclass BNEGI_B_ENC : MSA_BIT_B_FMT<0b101, 0b001001>;
4980b57cec5SDimitry Andricclass BNEGI_H_ENC : MSA_BIT_H_FMT<0b101, 0b001001>;
4990b57cec5SDimitry Andricclass BNEGI_W_ENC : MSA_BIT_W_FMT<0b101, 0b001001>;
5000b57cec5SDimitry Andricclass BNEGI_D_ENC : MSA_BIT_D_FMT<0b101, 0b001001>;
5010b57cec5SDimitry Andric
5020b57cec5SDimitry Andricclass BNZ_B_ENC : MSA_CBRANCH_FMT<0b111, 0b00>;
5030b57cec5SDimitry Andricclass BNZ_H_ENC : MSA_CBRANCH_FMT<0b111, 0b01>;
5040b57cec5SDimitry Andricclass BNZ_W_ENC : MSA_CBRANCH_FMT<0b111, 0b10>;
5050b57cec5SDimitry Andricclass BNZ_D_ENC : MSA_CBRANCH_FMT<0b111, 0b11>;
5060b57cec5SDimitry Andric
5070b57cec5SDimitry Andricclass BNZ_V_ENC : MSA_CBRANCH_V_FMT<0b01111>;
5080b57cec5SDimitry Andric
5090b57cec5SDimitry Andricclass BSEL_V_ENC : MSA_VEC_FMT<0b00110, 0b011110>;
5100b57cec5SDimitry Andric
5110b57cec5SDimitry Andricclass BSELI_B_ENC : MSA_I8_FMT<0b10, 0b000001>;
5120b57cec5SDimitry Andric
5130b57cec5SDimitry Andricclass BSET_B_ENC : MSA_3R_FMT<0b100, 0b00, 0b001101>;
5140b57cec5SDimitry Andricclass BSET_H_ENC : MSA_3R_FMT<0b100, 0b01, 0b001101>;
5150b57cec5SDimitry Andricclass BSET_W_ENC : MSA_3R_FMT<0b100, 0b10, 0b001101>;
5160b57cec5SDimitry Andricclass BSET_D_ENC : MSA_3R_FMT<0b100, 0b11, 0b001101>;
5170b57cec5SDimitry Andric
5180b57cec5SDimitry Andricclass BSETI_B_ENC : MSA_BIT_B_FMT<0b100, 0b001001>;
5190b57cec5SDimitry Andricclass BSETI_H_ENC : MSA_BIT_H_FMT<0b100, 0b001001>;
5200b57cec5SDimitry Andricclass BSETI_W_ENC : MSA_BIT_W_FMT<0b100, 0b001001>;
5210b57cec5SDimitry Andricclass BSETI_D_ENC : MSA_BIT_D_FMT<0b100, 0b001001>;
5220b57cec5SDimitry Andric
5230b57cec5SDimitry Andricclass BZ_B_ENC : MSA_CBRANCH_FMT<0b110, 0b00>;
5240b57cec5SDimitry Andricclass BZ_H_ENC : MSA_CBRANCH_FMT<0b110, 0b01>;
5250b57cec5SDimitry Andricclass BZ_W_ENC : MSA_CBRANCH_FMT<0b110, 0b10>;
5260b57cec5SDimitry Andricclass BZ_D_ENC : MSA_CBRANCH_FMT<0b110, 0b11>;
5270b57cec5SDimitry Andric
5280b57cec5SDimitry Andricclass BZ_V_ENC : MSA_CBRANCH_V_FMT<0b01011>;
5290b57cec5SDimitry Andric
5300b57cec5SDimitry Andricclass CEQ_B_ENC : MSA_3R_FMT<0b000, 0b00, 0b001111>;
5310b57cec5SDimitry Andricclass CEQ_H_ENC : MSA_3R_FMT<0b000, 0b01, 0b001111>;
5320b57cec5SDimitry Andricclass CEQ_W_ENC : MSA_3R_FMT<0b000, 0b10, 0b001111>;
5330b57cec5SDimitry Andricclass CEQ_D_ENC : MSA_3R_FMT<0b000, 0b11, 0b001111>;
5340b57cec5SDimitry Andric
5350b57cec5SDimitry Andricclass CEQI_B_ENC : MSA_I5_FMT<0b000, 0b00, 0b000111>;
5360b57cec5SDimitry Andricclass CEQI_H_ENC : MSA_I5_FMT<0b000, 0b01, 0b000111>;
5370b57cec5SDimitry Andricclass CEQI_W_ENC : MSA_I5_FMT<0b000, 0b10, 0b000111>;
5380b57cec5SDimitry Andricclass CEQI_D_ENC : MSA_I5_FMT<0b000, 0b11, 0b000111>;
5390b57cec5SDimitry Andric
5400b57cec5SDimitry Andricclass CFCMSA_ENC : MSA_ELM_CFCMSA_FMT<0b0001111110, 0b011001>;
5410b57cec5SDimitry Andric
5420b57cec5SDimitry Andricclass CLE_S_B_ENC : MSA_3R_FMT<0b100, 0b00, 0b001111>;
5430b57cec5SDimitry Andricclass CLE_S_H_ENC : MSA_3R_FMT<0b100, 0b01, 0b001111>;
5440b57cec5SDimitry Andricclass CLE_S_W_ENC : MSA_3R_FMT<0b100, 0b10, 0b001111>;
5450b57cec5SDimitry Andricclass CLE_S_D_ENC : MSA_3R_FMT<0b100, 0b11, 0b001111>;
5460b57cec5SDimitry Andric
5470b57cec5SDimitry Andricclass CLE_U_B_ENC : MSA_3R_FMT<0b101, 0b00, 0b001111>;
5480b57cec5SDimitry Andricclass CLE_U_H_ENC : MSA_3R_FMT<0b101, 0b01, 0b001111>;
5490b57cec5SDimitry Andricclass CLE_U_W_ENC : MSA_3R_FMT<0b101, 0b10, 0b001111>;
5500b57cec5SDimitry Andricclass CLE_U_D_ENC : MSA_3R_FMT<0b101, 0b11, 0b001111>;
5510b57cec5SDimitry Andric
5520b57cec5SDimitry Andricclass CLEI_S_B_ENC : MSA_I5_FMT<0b100, 0b00, 0b000111>;
5530b57cec5SDimitry Andricclass CLEI_S_H_ENC : MSA_I5_FMT<0b100, 0b01, 0b000111>;
5540b57cec5SDimitry Andricclass CLEI_S_W_ENC : MSA_I5_FMT<0b100, 0b10, 0b000111>;
5550b57cec5SDimitry Andricclass CLEI_S_D_ENC : MSA_I5_FMT<0b100, 0b11, 0b000111>;
5560b57cec5SDimitry Andric
5570b57cec5SDimitry Andricclass CLEI_U_B_ENC : MSA_I5_FMT<0b101, 0b00, 0b000111>;
5580b57cec5SDimitry Andricclass CLEI_U_H_ENC : MSA_I5_FMT<0b101, 0b01, 0b000111>;
5590b57cec5SDimitry Andricclass CLEI_U_W_ENC : MSA_I5_FMT<0b101, 0b10, 0b000111>;
5600b57cec5SDimitry Andricclass CLEI_U_D_ENC : MSA_I5_FMT<0b101, 0b11, 0b000111>;
5610b57cec5SDimitry Andric
5620b57cec5SDimitry Andricclass CLT_S_B_ENC : MSA_3R_FMT<0b010, 0b00, 0b001111>;
5630b57cec5SDimitry Andricclass CLT_S_H_ENC : MSA_3R_FMT<0b010, 0b01, 0b001111>;
5640b57cec5SDimitry Andricclass CLT_S_W_ENC : MSA_3R_FMT<0b010, 0b10, 0b001111>;
5650b57cec5SDimitry Andricclass CLT_S_D_ENC : MSA_3R_FMT<0b010, 0b11, 0b001111>;
5660b57cec5SDimitry Andric
5670b57cec5SDimitry Andricclass CLT_U_B_ENC : MSA_3R_FMT<0b011, 0b00, 0b001111>;
5680b57cec5SDimitry Andricclass CLT_U_H_ENC : MSA_3R_FMT<0b011, 0b01, 0b001111>;
5690b57cec5SDimitry Andricclass CLT_U_W_ENC : MSA_3R_FMT<0b011, 0b10, 0b001111>;
5700b57cec5SDimitry Andricclass CLT_U_D_ENC : MSA_3R_FMT<0b011, 0b11, 0b001111>;
5710b57cec5SDimitry Andric
5720b57cec5SDimitry Andricclass CLTI_S_B_ENC : MSA_I5_FMT<0b010, 0b00, 0b000111>;
5730b57cec5SDimitry Andricclass CLTI_S_H_ENC : MSA_I5_FMT<0b010, 0b01, 0b000111>;
5740b57cec5SDimitry Andricclass CLTI_S_W_ENC : MSA_I5_FMT<0b010, 0b10, 0b000111>;
5750b57cec5SDimitry Andricclass CLTI_S_D_ENC : MSA_I5_FMT<0b010, 0b11, 0b000111>;
5760b57cec5SDimitry Andric
5770b57cec5SDimitry Andricclass CLTI_U_B_ENC : MSA_I5_FMT<0b011, 0b00, 0b000111>;
5780b57cec5SDimitry Andricclass CLTI_U_H_ENC : MSA_I5_FMT<0b011, 0b01, 0b000111>;
5790b57cec5SDimitry Andricclass CLTI_U_W_ENC : MSA_I5_FMT<0b011, 0b10, 0b000111>;
5800b57cec5SDimitry Andricclass CLTI_U_D_ENC : MSA_I5_FMT<0b011, 0b11, 0b000111>;
5810b57cec5SDimitry Andric
5820b57cec5SDimitry Andricclass COPY_S_B_ENC : MSA_ELM_COPY_B_FMT<0b0010, 0b011001>;
5830b57cec5SDimitry Andricclass COPY_S_H_ENC : MSA_ELM_COPY_H_FMT<0b0010, 0b011001>;
5840b57cec5SDimitry Andricclass COPY_S_W_ENC : MSA_ELM_COPY_W_FMT<0b0010, 0b011001>;
5850b57cec5SDimitry Andricclass COPY_S_D_ENC : MSA_ELM_COPY_D_FMT<0b0010, 0b011001>;
5860b57cec5SDimitry Andric
5870b57cec5SDimitry Andricclass COPY_U_B_ENC : MSA_ELM_COPY_B_FMT<0b0011, 0b011001>;
5880b57cec5SDimitry Andricclass COPY_U_H_ENC : MSA_ELM_COPY_H_FMT<0b0011, 0b011001>;
5890b57cec5SDimitry Andricclass COPY_U_W_ENC : MSA_ELM_COPY_W_FMT<0b0011, 0b011001>;
5900b57cec5SDimitry Andric
5910b57cec5SDimitry Andricclass CTCMSA_ENC : MSA_ELM_CTCMSA_FMT<0b0000111110, 0b011001>;
5920b57cec5SDimitry Andric
5930b57cec5SDimitry Andricclass DIV_S_B_ENC : MSA_3R_FMT<0b100, 0b00, 0b010010>;
5940b57cec5SDimitry Andricclass DIV_S_H_ENC : MSA_3R_FMT<0b100, 0b01, 0b010010>;
5950b57cec5SDimitry Andricclass DIV_S_W_ENC : MSA_3R_FMT<0b100, 0b10, 0b010010>;
5960b57cec5SDimitry Andricclass DIV_S_D_ENC : MSA_3R_FMT<0b100, 0b11, 0b010010>;
5970b57cec5SDimitry Andric
5980b57cec5SDimitry Andricclass DIV_U_B_ENC : MSA_3R_FMT<0b101, 0b00, 0b010010>;
5990b57cec5SDimitry Andricclass DIV_U_H_ENC : MSA_3R_FMT<0b101, 0b01, 0b010010>;
6000b57cec5SDimitry Andricclass DIV_U_W_ENC : MSA_3R_FMT<0b101, 0b10, 0b010010>;
6010b57cec5SDimitry Andricclass DIV_U_D_ENC : MSA_3R_FMT<0b101, 0b11, 0b010010>;
6020b57cec5SDimitry Andric
6030b57cec5SDimitry Andricclass DOTP_S_H_ENC : MSA_3R_FMT<0b000, 0b01, 0b010011>;
6040b57cec5SDimitry Andricclass DOTP_S_W_ENC : MSA_3R_FMT<0b000, 0b10, 0b010011>;
6050b57cec5SDimitry Andricclass DOTP_S_D_ENC : MSA_3R_FMT<0b000, 0b11, 0b010011>;
6060b57cec5SDimitry Andric
6070b57cec5SDimitry Andricclass DOTP_U_H_ENC : MSA_3R_FMT<0b001, 0b01, 0b010011>;
6080b57cec5SDimitry Andricclass DOTP_U_W_ENC : MSA_3R_FMT<0b001, 0b10, 0b010011>;
6090b57cec5SDimitry Andricclass DOTP_U_D_ENC : MSA_3R_FMT<0b001, 0b11, 0b010011>;
6100b57cec5SDimitry Andric
6110b57cec5SDimitry Andricclass DPADD_S_H_ENC : MSA_3R_FMT<0b010, 0b01, 0b010011>;
6120b57cec5SDimitry Andricclass DPADD_S_W_ENC : MSA_3R_FMT<0b010, 0b10, 0b010011>;
6130b57cec5SDimitry Andricclass DPADD_S_D_ENC : MSA_3R_FMT<0b010, 0b11, 0b010011>;
6140b57cec5SDimitry Andric
6150b57cec5SDimitry Andricclass DPADD_U_H_ENC : MSA_3R_FMT<0b011, 0b01, 0b010011>;
6160b57cec5SDimitry Andricclass DPADD_U_W_ENC : MSA_3R_FMT<0b011, 0b10, 0b010011>;
6170b57cec5SDimitry Andricclass DPADD_U_D_ENC : MSA_3R_FMT<0b011, 0b11, 0b010011>;
6180b57cec5SDimitry Andric
6190b57cec5SDimitry Andricclass DPSUB_S_H_ENC : MSA_3R_FMT<0b100, 0b01, 0b010011>;
6200b57cec5SDimitry Andricclass DPSUB_S_W_ENC : MSA_3R_FMT<0b100, 0b10, 0b010011>;
6210b57cec5SDimitry Andricclass DPSUB_S_D_ENC : MSA_3R_FMT<0b100, 0b11, 0b010011>;
6220b57cec5SDimitry Andric
6230b57cec5SDimitry Andricclass DPSUB_U_H_ENC : MSA_3R_FMT<0b101, 0b01, 0b010011>;
6240b57cec5SDimitry Andricclass DPSUB_U_W_ENC : MSA_3R_FMT<0b101, 0b10, 0b010011>;
6250b57cec5SDimitry Andricclass DPSUB_U_D_ENC : MSA_3R_FMT<0b101, 0b11, 0b010011>;
6260b57cec5SDimitry Andric
6270b57cec5SDimitry Andricclass FADD_W_ENC : MSA_3RF_FMT<0b0000, 0b0, 0b011011>;
6280b57cec5SDimitry Andricclass FADD_D_ENC : MSA_3RF_FMT<0b0000, 0b1, 0b011011>;
6290b57cec5SDimitry Andric
6300b57cec5SDimitry Andricclass FCAF_W_ENC : MSA_3RF_FMT<0b0000, 0b0, 0b011010>;
6310b57cec5SDimitry Andricclass FCAF_D_ENC : MSA_3RF_FMT<0b0000, 0b1, 0b011010>;
6320b57cec5SDimitry Andric
6330b57cec5SDimitry Andricclass FCEQ_W_ENC : MSA_3RF_FMT<0b0010, 0b0, 0b011010>;
6340b57cec5SDimitry Andricclass FCEQ_D_ENC : MSA_3RF_FMT<0b0010, 0b1, 0b011010>;
6350b57cec5SDimitry Andric
6360b57cec5SDimitry Andricclass FCLASS_W_ENC : MSA_2RF_FMT<0b110010000, 0b0, 0b011110>;
6370b57cec5SDimitry Andricclass FCLASS_D_ENC : MSA_2RF_FMT<0b110010000, 0b1, 0b011110>;
6380b57cec5SDimitry Andric
6390b57cec5SDimitry Andricclass FCLE_W_ENC : MSA_3RF_FMT<0b0110, 0b0, 0b011010>;
6400b57cec5SDimitry Andricclass FCLE_D_ENC : MSA_3RF_FMT<0b0110, 0b1, 0b011010>;
6410b57cec5SDimitry Andric
6420b57cec5SDimitry Andricclass FCLT_W_ENC : MSA_3RF_FMT<0b0100, 0b0, 0b011010>;
6430b57cec5SDimitry Andricclass FCLT_D_ENC : MSA_3RF_FMT<0b0100, 0b1, 0b011010>;
6440b57cec5SDimitry Andric
6450b57cec5SDimitry Andricclass FCNE_W_ENC : MSA_3RF_FMT<0b0011, 0b0, 0b011100>;
6460b57cec5SDimitry Andricclass FCNE_D_ENC : MSA_3RF_FMT<0b0011, 0b1, 0b011100>;
6470b57cec5SDimitry Andric
6480b57cec5SDimitry Andricclass FCOR_W_ENC : MSA_3RF_FMT<0b0001, 0b0, 0b011100>;
6490b57cec5SDimitry Andricclass FCOR_D_ENC : MSA_3RF_FMT<0b0001, 0b1, 0b011100>;
6500b57cec5SDimitry Andric
6510b57cec5SDimitry Andricclass FCUEQ_W_ENC : MSA_3RF_FMT<0b0011, 0b0, 0b011010>;
6520b57cec5SDimitry Andricclass FCUEQ_D_ENC : MSA_3RF_FMT<0b0011, 0b1, 0b011010>;
6530b57cec5SDimitry Andric
6540b57cec5SDimitry Andricclass FCULE_W_ENC : MSA_3RF_FMT<0b0111, 0b0, 0b011010>;
6550b57cec5SDimitry Andricclass FCULE_D_ENC : MSA_3RF_FMT<0b0111, 0b1, 0b011010>;
6560b57cec5SDimitry Andric
6570b57cec5SDimitry Andricclass FCULT_W_ENC : MSA_3RF_FMT<0b0101, 0b0, 0b011010>;
6580b57cec5SDimitry Andricclass FCULT_D_ENC : MSA_3RF_FMT<0b0101, 0b1, 0b011010>;
6590b57cec5SDimitry Andric
6600b57cec5SDimitry Andricclass FCUN_W_ENC : MSA_3RF_FMT<0b0001, 0b0, 0b011010>;
6610b57cec5SDimitry Andricclass FCUN_D_ENC : MSA_3RF_FMT<0b0001, 0b1, 0b011010>;
6620b57cec5SDimitry Andric
6630b57cec5SDimitry Andricclass FCUNE_W_ENC : MSA_3RF_FMT<0b0010, 0b0, 0b011100>;
6640b57cec5SDimitry Andricclass FCUNE_D_ENC : MSA_3RF_FMT<0b0010, 0b1, 0b011100>;
6650b57cec5SDimitry Andric
6660b57cec5SDimitry Andricclass FDIV_W_ENC : MSA_3RF_FMT<0b0011, 0b0, 0b011011>;
6670b57cec5SDimitry Andricclass FDIV_D_ENC : MSA_3RF_FMT<0b0011, 0b1, 0b011011>;
6680b57cec5SDimitry Andric
6690b57cec5SDimitry Andricclass FEXDO_H_ENC : MSA_3RF_FMT<0b1000, 0b0, 0b011011>;
6700b57cec5SDimitry Andricclass FEXDO_W_ENC : MSA_3RF_FMT<0b1000, 0b1, 0b011011>;
6710b57cec5SDimitry Andric
6720b57cec5SDimitry Andricclass FEXP2_W_ENC : MSA_3RF_FMT<0b0111, 0b0, 0b011011>;
6730b57cec5SDimitry Andricclass FEXP2_D_ENC : MSA_3RF_FMT<0b0111, 0b1, 0b011011>;
6740b57cec5SDimitry Andric
6750b57cec5SDimitry Andricclass FEXUPL_W_ENC : MSA_2RF_FMT<0b110011000, 0b0, 0b011110>;
6760b57cec5SDimitry Andricclass FEXUPL_D_ENC : MSA_2RF_FMT<0b110011000, 0b1, 0b011110>;
6770b57cec5SDimitry Andric
6780b57cec5SDimitry Andricclass FEXUPR_W_ENC : MSA_2RF_FMT<0b110011001, 0b0, 0b011110>;
6790b57cec5SDimitry Andricclass FEXUPR_D_ENC : MSA_2RF_FMT<0b110011001, 0b1, 0b011110>;
6800b57cec5SDimitry Andric
6810b57cec5SDimitry Andricclass FFINT_S_W_ENC : MSA_2RF_FMT<0b110011110, 0b0, 0b011110>;
6820b57cec5SDimitry Andricclass FFINT_S_D_ENC : MSA_2RF_FMT<0b110011110, 0b1, 0b011110>;
6830b57cec5SDimitry Andric
6840b57cec5SDimitry Andricclass FFINT_U_W_ENC : MSA_2RF_FMT<0b110011111, 0b0, 0b011110>;
6850b57cec5SDimitry Andricclass FFINT_U_D_ENC : MSA_2RF_FMT<0b110011111, 0b1, 0b011110>;
6860b57cec5SDimitry Andric
6870b57cec5SDimitry Andricclass FFQL_W_ENC : MSA_2RF_FMT<0b110011010, 0b0, 0b011110>;
6880b57cec5SDimitry Andricclass FFQL_D_ENC : MSA_2RF_FMT<0b110011010, 0b1, 0b011110>;
6890b57cec5SDimitry Andric
6900b57cec5SDimitry Andricclass FFQR_W_ENC : MSA_2RF_FMT<0b110011011, 0b0, 0b011110>;
6910b57cec5SDimitry Andricclass FFQR_D_ENC : MSA_2RF_FMT<0b110011011, 0b1, 0b011110>;
6920b57cec5SDimitry Andric
6930b57cec5SDimitry Andricclass FILL_B_ENC : MSA_2R_FILL_FMT<0b11000000, 0b00, 0b011110>;
6940b57cec5SDimitry Andricclass FILL_H_ENC : MSA_2R_FILL_FMT<0b11000000, 0b01, 0b011110>;
6950b57cec5SDimitry Andricclass FILL_W_ENC : MSA_2R_FILL_FMT<0b11000000, 0b10, 0b011110>;
6960b57cec5SDimitry Andricclass FILL_D_ENC : MSA_2R_FILL_D_FMT<0b11000000, 0b11, 0b011110>;
6970b57cec5SDimitry Andric
6980b57cec5SDimitry Andricclass FLOG2_W_ENC : MSA_2RF_FMT<0b110010111, 0b0, 0b011110>;
6990b57cec5SDimitry Andricclass FLOG2_D_ENC : MSA_2RF_FMT<0b110010111, 0b1, 0b011110>;
7000b57cec5SDimitry Andric
7010b57cec5SDimitry Andricclass FMADD_W_ENC : MSA_3RF_FMT<0b0100, 0b0, 0b011011>;
7020b57cec5SDimitry Andricclass FMADD_D_ENC : MSA_3RF_FMT<0b0100, 0b1, 0b011011>;
7030b57cec5SDimitry Andric
7040b57cec5SDimitry Andricclass FMAX_W_ENC : MSA_3RF_FMT<0b1110, 0b0, 0b011011>;
7050b57cec5SDimitry Andricclass FMAX_D_ENC : MSA_3RF_FMT<0b1110, 0b1, 0b011011>;
7060b57cec5SDimitry Andric
7070b57cec5SDimitry Andricclass FMAX_A_W_ENC : MSA_3RF_FMT<0b1111, 0b0, 0b011011>;
7080b57cec5SDimitry Andricclass FMAX_A_D_ENC : MSA_3RF_FMT<0b1111, 0b1, 0b011011>;
7090b57cec5SDimitry Andric
7100b57cec5SDimitry Andricclass FMIN_W_ENC : MSA_3RF_FMT<0b1100, 0b0, 0b011011>;
7110b57cec5SDimitry Andricclass FMIN_D_ENC : MSA_3RF_FMT<0b1100, 0b1, 0b011011>;
7120b57cec5SDimitry Andric
7130b57cec5SDimitry Andricclass FMIN_A_W_ENC : MSA_3RF_FMT<0b1101, 0b0, 0b011011>;
7140b57cec5SDimitry Andricclass FMIN_A_D_ENC : MSA_3RF_FMT<0b1101, 0b1, 0b011011>;
7150b57cec5SDimitry Andric
7160b57cec5SDimitry Andricclass FMSUB_W_ENC : MSA_3RF_FMT<0b0101, 0b0, 0b011011>;
7170b57cec5SDimitry Andricclass FMSUB_D_ENC : MSA_3RF_FMT<0b0101, 0b1, 0b011011>;
7180b57cec5SDimitry Andric
7190b57cec5SDimitry Andricclass FMUL_W_ENC : MSA_3RF_FMT<0b0010, 0b0, 0b011011>;
7200b57cec5SDimitry Andricclass FMUL_D_ENC : MSA_3RF_FMT<0b0010, 0b1, 0b011011>;
7210b57cec5SDimitry Andric
7220b57cec5SDimitry Andricclass FRINT_W_ENC : MSA_2RF_FMT<0b110010110, 0b0, 0b011110>;
7230b57cec5SDimitry Andricclass FRINT_D_ENC : MSA_2RF_FMT<0b110010110, 0b1, 0b011110>;
7240b57cec5SDimitry Andric
7250b57cec5SDimitry Andricclass FRCP_W_ENC : MSA_2RF_FMT<0b110010101, 0b0, 0b011110>;
7260b57cec5SDimitry Andricclass FRCP_D_ENC : MSA_2RF_FMT<0b110010101, 0b1, 0b011110>;
7270b57cec5SDimitry Andric
7280b57cec5SDimitry Andricclass FRSQRT_W_ENC : MSA_2RF_FMT<0b110010100, 0b0, 0b011110>;
7290b57cec5SDimitry Andricclass FRSQRT_D_ENC : MSA_2RF_FMT<0b110010100, 0b1, 0b011110>;
7300b57cec5SDimitry Andric
7310b57cec5SDimitry Andricclass FSAF_W_ENC : MSA_3RF_FMT<0b1000, 0b0, 0b011010>;
7320b57cec5SDimitry Andricclass FSAF_D_ENC : MSA_3RF_FMT<0b1000, 0b1, 0b011010>;
7330b57cec5SDimitry Andric
7340b57cec5SDimitry Andricclass FSEQ_W_ENC : MSA_3RF_FMT<0b1010, 0b0, 0b011010>;
7350b57cec5SDimitry Andricclass FSEQ_D_ENC : MSA_3RF_FMT<0b1010, 0b1, 0b011010>;
7360b57cec5SDimitry Andric
7370b57cec5SDimitry Andricclass FSLE_W_ENC : MSA_3RF_FMT<0b1110, 0b0, 0b011010>;
7380b57cec5SDimitry Andricclass FSLE_D_ENC : MSA_3RF_FMT<0b1110, 0b1, 0b011010>;
7390b57cec5SDimitry Andric
7400b57cec5SDimitry Andricclass FSLT_W_ENC : MSA_3RF_FMT<0b1100, 0b0, 0b011010>;
7410b57cec5SDimitry Andricclass FSLT_D_ENC : MSA_3RF_FMT<0b1100, 0b1, 0b011010>;
7420b57cec5SDimitry Andric
7430b57cec5SDimitry Andricclass FSNE_W_ENC : MSA_3RF_FMT<0b1011, 0b0, 0b011100>;
7440b57cec5SDimitry Andricclass FSNE_D_ENC : MSA_3RF_FMT<0b1011, 0b1, 0b011100>;
7450b57cec5SDimitry Andric
7460b57cec5SDimitry Andricclass FSOR_W_ENC : MSA_3RF_FMT<0b1001, 0b0, 0b011100>;
7470b57cec5SDimitry Andricclass FSOR_D_ENC : MSA_3RF_FMT<0b1001, 0b1, 0b011100>;
7480b57cec5SDimitry Andric
7490b57cec5SDimitry Andricclass FSQRT_W_ENC : MSA_2RF_FMT<0b110010011, 0b0, 0b011110>;
7500b57cec5SDimitry Andricclass FSQRT_D_ENC : MSA_2RF_FMT<0b110010011, 0b1, 0b011110>;
7510b57cec5SDimitry Andric
7520b57cec5SDimitry Andricclass FSUB_W_ENC : MSA_3RF_FMT<0b0001, 0b0, 0b011011>;
7530b57cec5SDimitry Andricclass FSUB_D_ENC : MSA_3RF_FMT<0b0001, 0b1, 0b011011>;
7540b57cec5SDimitry Andric
7550b57cec5SDimitry Andricclass FSUEQ_W_ENC : MSA_3RF_FMT<0b1011, 0b0, 0b011010>;
7560b57cec5SDimitry Andricclass FSUEQ_D_ENC : MSA_3RF_FMT<0b1011, 0b1, 0b011010>;
7570b57cec5SDimitry Andric
7580b57cec5SDimitry Andricclass FSULE_W_ENC : MSA_3RF_FMT<0b1111, 0b0, 0b011010>;
7590b57cec5SDimitry Andricclass FSULE_D_ENC : MSA_3RF_FMT<0b1111, 0b1, 0b011010>;
7600b57cec5SDimitry Andric
7610b57cec5SDimitry Andricclass FSULT_W_ENC : MSA_3RF_FMT<0b1101, 0b0, 0b011010>;
7620b57cec5SDimitry Andricclass FSULT_D_ENC : MSA_3RF_FMT<0b1101, 0b1, 0b011010>;
7630b57cec5SDimitry Andric
7640b57cec5SDimitry Andricclass FSUN_W_ENC : MSA_3RF_FMT<0b1001, 0b0, 0b011010>;
7650b57cec5SDimitry Andricclass FSUN_D_ENC : MSA_3RF_FMT<0b1001, 0b1, 0b011010>;
7660b57cec5SDimitry Andric
7670b57cec5SDimitry Andricclass FSUNE_W_ENC : MSA_3RF_FMT<0b1010, 0b0, 0b011100>;
7680b57cec5SDimitry Andricclass FSUNE_D_ENC : MSA_3RF_FMT<0b1010, 0b1, 0b011100>;
7690b57cec5SDimitry Andric
7700b57cec5SDimitry Andricclass FTINT_S_W_ENC : MSA_2RF_FMT<0b110011100, 0b0, 0b011110>;
7710b57cec5SDimitry Andricclass FTINT_S_D_ENC : MSA_2RF_FMT<0b110011100, 0b1, 0b011110>;
7720b57cec5SDimitry Andric
7730b57cec5SDimitry Andricclass FTINT_U_W_ENC : MSA_2RF_FMT<0b110011101, 0b0, 0b011110>;
7740b57cec5SDimitry Andricclass FTINT_U_D_ENC : MSA_2RF_FMT<0b110011101, 0b1, 0b011110>;
7750b57cec5SDimitry Andric
7760b57cec5SDimitry Andricclass FTQ_H_ENC : MSA_3RF_FMT<0b1010, 0b0, 0b011011>;
7770b57cec5SDimitry Andricclass FTQ_W_ENC : MSA_3RF_FMT<0b1010, 0b1, 0b011011>;
7780b57cec5SDimitry Andric
7790b57cec5SDimitry Andricclass FTRUNC_S_W_ENC : MSA_2RF_FMT<0b110010001, 0b0, 0b011110>;
7800b57cec5SDimitry Andricclass FTRUNC_S_D_ENC : MSA_2RF_FMT<0b110010001, 0b1, 0b011110>;
7810b57cec5SDimitry Andric
7820b57cec5SDimitry Andricclass FTRUNC_U_W_ENC : MSA_2RF_FMT<0b110010010, 0b0, 0b011110>;
7830b57cec5SDimitry Andricclass FTRUNC_U_D_ENC : MSA_2RF_FMT<0b110010010, 0b1, 0b011110>;
7840b57cec5SDimitry Andric
7850b57cec5SDimitry Andricclass HADD_S_H_ENC : MSA_3R_FMT<0b100, 0b01, 0b010101>;
7860b57cec5SDimitry Andricclass HADD_S_W_ENC : MSA_3R_FMT<0b100, 0b10, 0b010101>;
7870b57cec5SDimitry Andricclass HADD_S_D_ENC : MSA_3R_FMT<0b100, 0b11, 0b010101>;
7880b57cec5SDimitry Andric
7890b57cec5SDimitry Andricclass HADD_U_H_ENC : MSA_3R_FMT<0b101, 0b01, 0b010101>;
7900b57cec5SDimitry Andricclass HADD_U_W_ENC : MSA_3R_FMT<0b101, 0b10, 0b010101>;
7910b57cec5SDimitry Andricclass HADD_U_D_ENC : MSA_3R_FMT<0b101, 0b11, 0b010101>;
7920b57cec5SDimitry Andric
7930b57cec5SDimitry Andricclass HSUB_S_H_ENC : MSA_3R_FMT<0b110, 0b01, 0b010101>;
7940b57cec5SDimitry Andricclass HSUB_S_W_ENC : MSA_3R_FMT<0b110, 0b10, 0b010101>;
7950b57cec5SDimitry Andricclass HSUB_S_D_ENC : MSA_3R_FMT<0b110, 0b11, 0b010101>;
7960b57cec5SDimitry Andric
7970b57cec5SDimitry Andricclass HSUB_U_H_ENC : MSA_3R_FMT<0b111, 0b01, 0b010101>;
7980b57cec5SDimitry Andricclass HSUB_U_W_ENC : MSA_3R_FMT<0b111, 0b10, 0b010101>;
7990b57cec5SDimitry Andricclass HSUB_U_D_ENC : MSA_3R_FMT<0b111, 0b11, 0b010101>;
8000b57cec5SDimitry Andric
8010b57cec5SDimitry Andricclass ILVEV_B_ENC : MSA_3R_FMT<0b110, 0b00, 0b010100>;
8020b57cec5SDimitry Andricclass ILVEV_H_ENC : MSA_3R_FMT<0b110, 0b01, 0b010100>;
8030b57cec5SDimitry Andricclass ILVEV_W_ENC : MSA_3R_FMT<0b110, 0b10, 0b010100>;
8040b57cec5SDimitry Andricclass ILVEV_D_ENC : MSA_3R_FMT<0b110, 0b11, 0b010100>;
8050b57cec5SDimitry Andric
8060b57cec5SDimitry Andricclass ILVL_B_ENC : MSA_3R_FMT<0b100, 0b00, 0b010100>;
8070b57cec5SDimitry Andricclass ILVL_H_ENC : MSA_3R_FMT<0b100, 0b01, 0b010100>;
8080b57cec5SDimitry Andricclass ILVL_W_ENC : MSA_3R_FMT<0b100, 0b10, 0b010100>;
8090b57cec5SDimitry Andricclass ILVL_D_ENC : MSA_3R_FMT<0b100, 0b11, 0b010100>;
8100b57cec5SDimitry Andric
8110b57cec5SDimitry Andricclass ILVOD_B_ENC : MSA_3R_FMT<0b111, 0b00, 0b010100>;
8120b57cec5SDimitry Andricclass ILVOD_H_ENC : MSA_3R_FMT<0b111, 0b01, 0b010100>;
8130b57cec5SDimitry Andricclass ILVOD_W_ENC : MSA_3R_FMT<0b111, 0b10, 0b010100>;
8140b57cec5SDimitry Andricclass ILVOD_D_ENC : MSA_3R_FMT<0b111, 0b11, 0b010100>;
8150b57cec5SDimitry Andric
8160b57cec5SDimitry Andricclass ILVR_B_ENC : MSA_3R_FMT<0b101, 0b00, 0b010100>;
8170b57cec5SDimitry Andricclass ILVR_H_ENC : MSA_3R_FMT<0b101, 0b01, 0b010100>;
8180b57cec5SDimitry Andricclass ILVR_W_ENC : MSA_3R_FMT<0b101, 0b10, 0b010100>;
8190b57cec5SDimitry Andricclass ILVR_D_ENC : MSA_3R_FMT<0b101, 0b11, 0b010100>;
8200b57cec5SDimitry Andric
8210b57cec5SDimitry Andricclass INSERT_B_ENC : MSA_ELM_INSERT_B_FMT<0b0100, 0b011001>;
8220b57cec5SDimitry Andricclass INSERT_H_ENC : MSA_ELM_INSERT_H_FMT<0b0100, 0b011001>;
8230b57cec5SDimitry Andricclass INSERT_W_ENC : MSA_ELM_INSERT_W_FMT<0b0100, 0b011001>;
8240b57cec5SDimitry Andricclass INSERT_D_ENC : MSA_ELM_INSERT_D_FMT<0b0100, 0b011001>;
8250b57cec5SDimitry Andric
8260b57cec5SDimitry Andricclass INSVE_B_ENC : MSA_ELM_B_FMT<0b0101, 0b011001>;
8270b57cec5SDimitry Andricclass INSVE_H_ENC : MSA_ELM_H_FMT<0b0101, 0b011001>;
8280b57cec5SDimitry Andricclass INSVE_W_ENC : MSA_ELM_W_FMT<0b0101, 0b011001>;
8290b57cec5SDimitry Andricclass INSVE_D_ENC : MSA_ELM_D_FMT<0b0101, 0b011001>;
8300b57cec5SDimitry Andric
8310b57cec5SDimitry Andricclass LD_B_ENC   : MSA_MI10_FMT<0b00, 0b1000>;
8320b57cec5SDimitry Andricclass LD_H_ENC   : MSA_MI10_FMT<0b01, 0b1000>;
8330b57cec5SDimitry Andricclass LD_W_ENC   : MSA_MI10_FMT<0b10, 0b1000>;
8340b57cec5SDimitry Andricclass LD_D_ENC   : MSA_MI10_FMT<0b11, 0b1000>;
8350b57cec5SDimitry Andric
8360b57cec5SDimitry Andricclass LDI_B_ENC  : MSA_I10_FMT<0b110, 0b00, 0b000111>;
8370b57cec5SDimitry Andricclass LDI_H_ENC  : MSA_I10_FMT<0b110, 0b01, 0b000111>;
8380b57cec5SDimitry Andricclass LDI_W_ENC  : MSA_I10_FMT<0b110, 0b10, 0b000111>;
8390b57cec5SDimitry Andricclass LDI_D_ENC  : MSA_I10_FMT<0b110, 0b11, 0b000111>;
8400b57cec5SDimitry Andric
8410b57cec5SDimitry Andricclass LSA_ENC : SPECIAL_LSA_FMT<0b000101>;
8420b57cec5SDimitry Andricclass DLSA_ENC : SPECIAL_DLSA_FMT<0b010101>;
8430b57cec5SDimitry Andric
8440b57cec5SDimitry Andricclass MADD_Q_H_ENC : MSA_3RF_FMT<0b0101, 0b0, 0b011100>;
8450b57cec5SDimitry Andricclass MADD_Q_W_ENC : MSA_3RF_FMT<0b0101, 0b1, 0b011100>;
8460b57cec5SDimitry Andric
8470b57cec5SDimitry Andricclass MADDR_Q_H_ENC : MSA_3RF_FMT<0b1101, 0b0, 0b011100>;
8480b57cec5SDimitry Andricclass MADDR_Q_W_ENC : MSA_3RF_FMT<0b1101, 0b1, 0b011100>;
8490b57cec5SDimitry Andric
8500b57cec5SDimitry Andricclass MADDV_B_ENC : MSA_3R_FMT<0b001, 0b00, 0b010010>;
8510b57cec5SDimitry Andricclass MADDV_H_ENC : MSA_3R_FMT<0b001, 0b01, 0b010010>;
8520b57cec5SDimitry Andricclass MADDV_W_ENC : MSA_3R_FMT<0b001, 0b10, 0b010010>;
8530b57cec5SDimitry Andricclass MADDV_D_ENC : MSA_3R_FMT<0b001, 0b11, 0b010010>;
8540b57cec5SDimitry Andric
8550b57cec5SDimitry Andricclass MAX_A_B_ENC : MSA_3R_FMT<0b110, 0b00, 0b001110>;
8560b57cec5SDimitry Andricclass MAX_A_H_ENC : MSA_3R_FMT<0b110, 0b01, 0b001110>;
8570b57cec5SDimitry Andricclass MAX_A_W_ENC : MSA_3R_FMT<0b110, 0b10, 0b001110>;
8580b57cec5SDimitry Andricclass MAX_A_D_ENC : MSA_3R_FMT<0b110, 0b11, 0b001110>;
8590b57cec5SDimitry Andric
8600b57cec5SDimitry Andricclass MAX_S_B_ENC : MSA_3R_FMT<0b010, 0b00, 0b001110>;
8610b57cec5SDimitry Andricclass MAX_S_H_ENC : MSA_3R_FMT<0b010, 0b01, 0b001110>;
8620b57cec5SDimitry Andricclass MAX_S_W_ENC : MSA_3R_FMT<0b010, 0b10, 0b001110>;
8630b57cec5SDimitry Andricclass MAX_S_D_ENC : MSA_3R_FMT<0b010, 0b11, 0b001110>;
8640b57cec5SDimitry Andric
8650b57cec5SDimitry Andricclass MAX_U_B_ENC : MSA_3R_FMT<0b011, 0b00, 0b001110>;
8660b57cec5SDimitry Andricclass MAX_U_H_ENC : MSA_3R_FMT<0b011, 0b01, 0b001110>;
8670b57cec5SDimitry Andricclass MAX_U_W_ENC : MSA_3R_FMT<0b011, 0b10, 0b001110>;
8680b57cec5SDimitry Andricclass MAX_U_D_ENC : MSA_3R_FMT<0b011, 0b11, 0b001110>;
8690b57cec5SDimitry Andric
8700b57cec5SDimitry Andricclass MAXI_S_B_ENC : MSA_I5_FMT<0b010, 0b00, 0b000110>;
8710b57cec5SDimitry Andricclass MAXI_S_H_ENC : MSA_I5_FMT<0b010, 0b01, 0b000110>;
8720b57cec5SDimitry Andricclass MAXI_S_W_ENC : MSA_I5_FMT<0b010, 0b10, 0b000110>;
8730b57cec5SDimitry Andricclass MAXI_S_D_ENC : MSA_I5_FMT<0b010, 0b11, 0b000110>;
8740b57cec5SDimitry Andric
8750b57cec5SDimitry Andricclass MAXI_U_B_ENC : MSA_I5_FMT<0b011, 0b00, 0b000110>;
8760b57cec5SDimitry Andricclass MAXI_U_H_ENC : MSA_I5_FMT<0b011, 0b01, 0b000110>;
8770b57cec5SDimitry Andricclass MAXI_U_W_ENC : MSA_I5_FMT<0b011, 0b10, 0b000110>;
8780b57cec5SDimitry Andricclass MAXI_U_D_ENC : MSA_I5_FMT<0b011, 0b11, 0b000110>;
8790b57cec5SDimitry Andric
8800b57cec5SDimitry Andricclass MIN_A_B_ENC : MSA_3R_FMT<0b111, 0b00, 0b001110>;
8810b57cec5SDimitry Andricclass MIN_A_H_ENC : MSA_3R_FMT<0b111, 0b01, 0b001110>;
8820b57cec5SDimitry Andricclass MIN_A_W_ENC : MSA_3R_FMT<0b111, 0b10, 0b001110>;
8830b57cec5SDimitry Andricclass MIN_A_D_ENC : MSA_3R_FMT<0b111, 0b11, 0b001110>;
8840b57cec5SDimitry Andric
8850b57cec5SDimitry Andricclass MIN_S_B_ENC : MSA_3R_FMT<0b100, 0b00, 0b001110>;
8860b57cec5SDimitry Andricclass MIN_S_H_ENC : MSA_3R_FMT<0b100, 0b01, 0b001110>;
8870b57cec5SDimitry Andricclass MIN_S_W_ENC : MSA_3R_FMT<0b100, 0b10, 0b001110>;
8880b57cec5SDimitry Andricclass MIN_S_D_ENC : MSA_3R_FMT<0b100, 0b11, 0b001110>;
8890b57cec5SDimitry Andric
8900b57cec5SDimitry Andricclass MIN_U_B_ENC : MSA_3R_FMT<0b101, 0b00, 0b001110>;
8910b57cec5SDimitry Andricclass MIN_U_H_ENC : MSA_3R_FMT<0b101, 0b01, 0b001110>;
8920b57cec5SDimitry Andricclass MIN_U_W_ENC : MSA_3R_FMT<0b101, 0b10, 0b001110>;
8930b57cec5SDimitry Andricclass MIN_U_D_ENC : MSA_3R_FMT<0b101, 0b11, 0b001110>;
8940b57cec5SDimitry Andric
8950b57cec5SDimitry Andricclass MINI_S_B_ENC : MSA_I5_FMT<0b100, 0b00, 0b000110>;
8960b57cec5SDimitry Andricclass MINI_S_H_ENC : MSA_I5_FMT<0b100, 0b01, 0b000110>;
8970b57cec5SDimitry Andricclass MINI_S_W_ENC : MSA_I5_FMT<0b100, 0b10, 0b000110>;
8980b57cec5SDimitry Andricclass MINI_S_D_ENC : MSA_I5_FMT<0b100, 0b11, 0b000110>;
8990b57cec5SDimitry Andric
9000b57cec5SDimitry Andricclass MINI_U_B_ENC : MSA_I5_FMT<0b101, 0b00, 0b000110>;
9010b57cec5SDimitry Andricclass MINI_U_H_ENC : MSA_I5_FMT<0b101, 0b01, 0b000110>;
9020b57cec5SDimitry Andricclass MINI_U_W_ENC : MSA_I5_FMT<0b101, 0b10, 0b000110>;
9030b57cec5SDimitry Andricclass MINI_U_D_ENC : MSA_I5_FMT<0b101, 0b11, 0b000110>;
9040b57cec5SDimitry Andric
9050b57cec5SDimitry Andricclass MOD_S_B_ENC : MSA_3R_FMT<0b110, 0b00, 0b010010>;
9060b57cec5SDimitry Andricclass MOD_S_H_ENC : MSA_3R_FMT<0b110, 0b01, 0b010010>;
9070b57cec5SDimitry Andricclass MOD_S_W_ENC : MSA_3R_FMT<0b110, 0b10, 0b010010>;
9080b57cec5SDimitry Andricclass MOD_S_D_ENC : MSA_3R_FMT<0b110, 0b11, 0b010010>;
9090b57cec5SDimitry Andric
9100b57cec5SDimitry Andricclass MOD_U_B_ENC : MSA_3R_FMT<0b111, 0b00, 0b010010>;
9110b57cec5SDimitry Andricclass MOD_U_H_ENC : MSA_3R_FMT<0b111, 0b01, 0b010010>;
9120b57cec5SDimitry Andricclass MOD_U_W_ENC : MSA_3R_FMT<0b111, 0b10, 0b010010>;
9130b57cec5SDimitry Andricclass MOD_U_D_ENC : MSA_3R_FMT<0b111, 0b11, 0b010010>;
9140b57cec5SDimitry Andric
9150b57cec5SDimitry Andricclass MOVE_V_ENC : MSA_ELM_FMT<0b0010111110, 0b011001>;
9160b57cec5SDimitry Andric
9170b57cec5SDimitry Andricclass MSUB_Q_H_ENC : MSA_3RF_FMT<0b0110, 0b0, 0b011100>;
9180b57cec5SDimitry Andricclass MSUB_Q_W_ENC : MSA_3RF_FMT<0b0110, 0b1, 0b011100>;
9190b57cec5SDimitry Andric
9200b57cec5SDimitry Andricclass MSUBR_Q_H_ENC : MSA_3RF_FMT<0b1110, 0b0, 0b011100>;
9210b57cec5SDimitry Andricclass MSUBR_Q_W_ENC : MSA_3RF_FMT<0b1110, 0b1, 0b011100>;
9220b57cec5SDimitry Andric
9230b57cec5SDimitry Andricclass MSUBV_B_ENC : MSA_3R_FMT<0b010, 0b00, 0b010010>;
9240b57cec5SDimitry Andricclass MSUBV_H_ENC : MSA_3R_FMT<0b010, 0b01, 0b010010>;
9250b57cec5SDimitry Andricclass MSUBV_W_ENC : MSA_3R_FMT<0b010, 0b10, 0b010010>;
9260b57cec5SDimitry Andricclass MSUBV_D_ENC : MSA_3R_FMT<0b010, 0b11, 0b010010>;
9270b57cec5SDimitry Andric
9280b57cec5SDimitry Andricclass MUL_Q_H_ENC : MSA_3RF_FMT<0b0100, 0b0, 0b011100>;
9290b57cec5SDimitry Andricclass MUL_Q_W_ENC : MSA_3RF_FMT<0b0100, 0b1, 0b011100>;
9300b57cec5SDimitry Andric
9310b57cec5SDimitry Andricclass MULR_Q_H_ENC : MSA_3RF_FMT<0b1100, 0b0, 0b011100>;
9320b57cec5SDimitry Andricclass MULR_Q_W_ENC : MSA_3RF_FMT<0b1100, 0b1, 0b011100>;
9330b57cec5SDimitry Andric
9340b57cec5SDimitry Andricclass MULV_B_ENC : MSA_3R_FMT<0b000, 0b00, 0b010010>;
9350b57cec5SDimitry Andricclass MULV_H_ENC : MSA_3R_FMT<0b000, 0b01, 0b010010>;
9360b57cec5SDimitry Andricclass MULV_W_ENC : MSA_3R_FMT<0b000, 0b10, 0b010010>;
9370b57cec5SDimitry Andricclass MULV_D_ENC : MSA_3R_FMT<0b000, 0b11, 0b010010>;
9380b57cec5SDimitry Andric
9390b57cec5SDimitry Andricclass NLOC_B_ENC : MSA_2R_FMT<0b11000010, 0b00, 0b011110>;
9400b57cec5SDimitry Andricclass NLOC_H_ENC : MSA_2R_FMT<0b11000010, 0b01, 0b011110>;
9410b57cec5SDimitry Andricclass NLOC_W_ENC : MSA_2R_FMT<0b11000010, 0b10, 0b011110>;
9420b57cec5SDimitry Andricclass NLOC_D_ENC : MSA_2R_FMT<0b11000010, 0b11, 0b011110>;
9430b57cec5SDimitry Andric
9440b57cec5SDimitry Andricclass NLZC_B_ENC : MSA_2R_FMT<0b11000011, 0b00, 0b011110>;
9450b57cec5SDimitry Andricclass NLZC_H_ENC : MSA_2R_FMT<0b11000011, 0b01, 0b011110>;
9460b57cec5SDimitry Andricclass NLZC_W_ENC : MSA_2R_FMT<0b11000011, 0b10, 0b011110>;
9470b57cec5SDimitry Andricclass NLZC_D_ENC : MSA_2R_FMT<0b11000011, 0b11, 0b011110>;
9480b57cec5SDimitry Andric
9490b57cec5SDimitry Andricclass NOR_V_ENC : MSA_VEC_FMT<0b00010, 0b011110>;
9500b57cec5SDimitry Andric
9510b57cec5SDimitry Andricclass NORI_B_ENC : MSA_I8_FMT<0b10, 0b000000>;
9520b57cec5SDimitry Andric
9530b57cec5SDimitry Andricclass OR_V_ENC : MSA_VEC_FMT<0b00001, 0b011110>;
9540b57cec5SDimitry Andric
9550b57cec5SDimitry Andricclass ORI_B_ENC  : MSA_I8_FMT<0b01, 0b000000>;
9560b57cec5SDimitry Andric
9570b57cec5SDimitry Andricclass PCKEV_B_ENC : MSA_3R_FMT<0b010, 0b00, 0b010100>;
9580b57cec5SDimitry Andricclass PCKEV_H_ENC : MSA_3R_FMT<0b010, 0b01, 0b010100>;
9590b57cec5SDimitry Andricclass PCKEV_W_ENC : MSA_3R_FMT<0b010, 0b10, 0b010100>;
9600b57cec5SDimitry Andricclass PCKEV_D_ENC : MSA_3R_FMT<0b010, 0b11, 0b010100>;
9610b57cec5SDimitry Andric
9620b57cec5SDimitry Andricclass PCKOD_B_ENC : MSA_3R_FMT<0b011, 0b00, 0b010100>;
9630b57cec5SDimitry Andricclass PCKOD_H_ENC : MSA_3R_FMT<0b011, 0b01, 0b010100>;
9640b57cec5SDimitry Andricclass PCKOD_W_ENC : MSA_3R_FMT<0b011, 0b10, 0b010100>;
9650b57cec5SDimitry Andricclass PCKOD_D_ENC : MSA_3R_FMT<0b011, 0b11, 0b010100>;
9660b57cec5SDimitry Andric
9670b57cec5SDimitry Andricclass PCNT_B_ENC : MSA_2R_FMT<0b11000001, 0b00, 0b011110>;
9680b57cec5SDimitry Andricclass PCNT_H_ENC : MSA_2R_FMT<0b11000001, 0b01, 0b011110>;
9690b57cec5SDimitry Andricclass PCNT_W_ENC : MSA_2R_FMT<0b11000001, 0b10, 0b011110>;
9700b57cec5SDimitry Andricclass PCNT_D_ENC : MSA_2R_FMT<0b11000001, 0b11, 0b011110>;
9710b57cec5SDimitry Andric
9720b57cec5SDimitry Andricclass SAT_S_B_ENC : MSA_BIT_B_FMT<0b000, 0b001010>;
9730b57cec5SDimitry Andricclass SAT_S_H_ENC : MSA_BIT_H_FMT<0b000, 0b001010>;
9740b57cec5SDimitry Andricclass SAT_S_W_ENC : MSA_BIT_W_FMT<0b000, 0b001010>;
9750b57cec5SDimitry Andricclass SAT_S_D_ENC : MSA_BIT_D_FMT<0b000, 0b001010>;
9760b57cec5SDimitry Andric
9770b57cec5SDimitry Andricclass SAT_U_B_ENC : MSA_BIT_B_FMT<0b001, 0b001010>;
9780b57cec5SDimitry Andricclass SAT_U_H_ENC : MSA_BIT_H_FMT<0b001, 0b001010>;
9790b57cec5SDimitry Andricclass SAT_U_W_ENC : MSA_BIT_W_FMT<0b001, 0b001010>;
9800b57cec5SDimitry Andricclass SAT_U_D_ENC : MSA_BIT_D_FMT<0b001, 0b001010>;
9810b57cec5SDimitry Andric
9820b57cec5SDimitry Andricclass SHF_B_ENC  : MSA_I8_FMT<0b00, 0b000010>;
9830b57cec5SDimitry Andricclass SHF_H_ENC  : MSA_I8_FMT<0b01, 0b000010>;
9840b57cec5SDimitry Andricclass SHF_W_ENC  : MSA_I8_FMT<0b10, 0b000010>;
9850b57cec5SDimitry Andric
9860b57cec5SDimitry Andricclass SLD_B_ENC : MSA_3R_INDEX_FMT<0b000, 0b00, 0b010100>;
9870b57cec5SDimitry Andricclass SLD_H_ENC : MSA_3R_INDEX_FMT<0b000, 0b01, 0b010100>;
9880b57cec5SDimitry Andricclass SLD_W_ENC : MSA_3R_INDEX_FMT<0b000, 0b10, 0b010100>;
9890b57cec5SDimitry Andricclass SLD_D_ENC : MSA_3R_INDEX_FMT<0b000, 0b11, 0b010100>;
9900b57cec5SDimitry Andric
9910b57cec5SDimitry Andricclass SLDI_B_ENC : MSA_ELM_B_FMT<0b0000, 0b011001>;
9920b57cec5SDimitry Andricclass SLDI_H_ENC : MSA_ELM_H_FMT<0b0000, 0b011001>;
9930b57cec5SDimitry Andricclass SLDI_W_ENC : MSA_ELM_W_FMT<0b0000, 0b011001>;
9940b57cec5SDimitry Andricclass SLDI_D_ENC : MSA_ELM_D_FMT<0b0000, 0b011001>;
9950b57cec5SDimitry Andric
9960b57cec5SDimitry Andricclass SLL_B_ENC : MSA_3R_FMT<0b000, 0b00, 0b001101>;
9970b57cec5SDimitry Andricclass SLL_H_ENC : MSA_3R_FMT<0b000, 0b01, 0b001101>;
9980b57cec5SDimitry Andricclass SLL_W_ENC : MSA_3R_FMT<0b000, 0b10, 0b001101>;
9990b57cec5SDimitry Andricclass SLL_D_ENC : MSA_3R_FMT<0b000, 0b11, 0b001101>;
10000b57cec5SDimitry Andric
10010b57cec5SDimitry Andricclass SLLI_B_ENC : MSA_BIT_B_FMT<0b000, 0b001001>;
10020b57cec5SDimitry Andricclass SLLI_H_ENC : MSA_BIT_H_FMT<0b000, 0b001001>;
10030b57cec5SDimitry Andricclass SLLI_W_ENC : MSA_BIT_W_FMT<0b000, 0b001001>;
10040b57cec5SDimitry Andricclass SLLI_D_ENC : MSA_BIT_D_FMT<0b000, 0b001001>;
10050b57cec5SDimitry Andric
10060b57cec5SDimitry Andricclass SPLAT_B_ENC : MSA_3R_INDEX_FMT<0b001, 0b00, 0b010100>;
10070b57cec5SDimitry Andricclass SPLAT_H_ENC : MSA_3R_INDEX_FMT<0b001, 0b01, 0b010100>;
10080b57cec5SDimitry Andricclass SPLAT_W_ENC : MSA_3R_INDEX_FMT<0b001, 0b10, 0b010100>;
10090b57cec5SDimitry Andricclass SPLAT_D_ENC : MSA_3R_INDEX_FMT<0b001, 0b11, 0b010100>;
10100b57cec5SDimitry Andric
10110b57cec5SDimitry Andricclass SPLATI_B_ENC : MSA_ELM_B_FMT<0b0001, 0b011001>;
10120b57cec5SDimitry Andricclass SPLATI_H_ENC : MSA_ELM_H_FMT<0b0001, 0b011001>;
10130b57cec5SDimitry Andricclass SPLATI_W_ENC : MSA_ELM_W_FMT<0b0001, 0b011001>;
10140b57cec5SDimitry Andricclass SPLATI_D_ENC : MSA_ELM_D_FMT<0b0001, 0b011001>;
10150b57cec5SDimitry Andric
10160b57cec5SDimitry Andricclass SRA_B_ENC : MSA_3R_FMT<0b001, 0b00, 0b001101>;
10170b57cec5SDimitry Andricclass SRA_H_ENC : MSA_3R_FMT<0b001, 0b01, 0b001101>;
10180b57cec5SDimitry Andricclass SRA_W_ENC : MSA_3R_FMT<0b001, 0b10, 0b001101>;
10190b57cec5SDimitry Andricclass SRA_D_ENC : MSA_3R_FMT<0b001, 0b11, 0b001101>;
10200b57cec5SDimitry Andric
10210b57cec5SDimitry Andricclass SRAI_B_ENC : MSA_BIT_B_FMT<0b001, 0b001001>;
10220b57cec5SDimitry Andricclass SRAI_H_ENC : MSA_BIT_H_FMT<0b001, 0b001001>;
10230b57cec5SDimitry Andricclass SRAI_W_ENC : MSA_BIT_W_FMT<0b001, 0b001001>;
10240b57cec5SDimitry Andricclass SRAI_D_ENC : MSA_BIT_D_FMT<0b001, 0b001001>;
10250b57cec5SDimitry Andric
10260b57cec5SDimitry Andricclass SRAR_B_ENC : MSA_3R_FMT<0b001, 0b00, 0b010101>;
10270b57cec5SDimitry Andricclass SRAR_H_ENC : MSA_3R_FMT<0b001, 0b01, 0b010101>;
10280b57cec5SDimitry Andricclass SRAR_W_ENC : MSA_3R_FMT<0b001, 0b10, 0b010101>;
10290b57cec5SDimitry Andricclass SRAR_D_ENC : MSA_3R_FMT<0b001, 0b11, 0b010101>;
10300b57cec5SDimitry Andric
10310b57cec5SDimitry Andricclass SRARI_B_ENC : MSA_BIT_B_FMT<0b010, 0b001010>;
10320b57cec5SDimitry Andricclass SRARI_H_ENC : MSA_BIT_H_FMT<0b010, 0b001010>;
10330b57cec5SDimitry Andricclass SRARI_W_ENC : MSA_BIT_W_FMT<0b010, 0b001010>;
10340b57cec5SDimitry Andricclass SRARI_D_ENC : MSA_BIT_D_FMT<0b010, 0b001010>;
10350b57cec5SDimitry Andric
10360b57cec5SDimitry Andricclass SRL_B_ENC : MSA_3R_FMT<0b010, 0b00, 0b001101>;
10370b57cec5SDimitry Andricclass SRL_H_ENC : MSA_3R_FMT<0b010, 0b01, 0b001101>;
10380b57cec5SDimitry Andricclass SRL_W_ENC : MSA_3R_FMT<0b010, 0b10, 0b001101>;
10390b57cec5SDimitry Andricclass SRL_D_ENC : MSA_3R_FMT<0b010, 0b11, 0b001101>;
10400b57cec5SDimitry Andric
10410b57cec5SDimitry Andricclass SRLI_B_ENC : MSA_BIT_B_FMT<0b010, 0b001001>;
10420b57cec5SDimitry Andricclass SRLI_H_ENC : MSA_BIT_H_FMT<0b010, 0b001001>;
10430b57cec5SDimitry Andricclass SRLI_W_ENC : MSA_BIT_W_FMT<0b010, 0b001001>;
10440b57cec5SDimitry Andricclass SRLI_D_ENC : MSA_BIT_D_FMT<0b010, 0b001001>;
10450b57cec5SDimitry Andric
10460b57cec5SDimitry Andricclass SRLR_B_ENC : MSA_3R_FMT<0b010, 0b00, 0b010101>;
10470b57cec5SDimitry Andricclass SRLR_H_ENC : MSA_3R_FMT<0b010, 0b01, 0b010101>;
10480b57cec5SDimitry Andricclass SRLR_W_ENC : MSA_3R_FMT<0b010, 0b10, 0b010101>;
10490b57cec5SDimitry Andricclass SRLR_D_ENC : MSA_3R_FMT<0b010, 0b11, 0b010101>;
10500b57cec5SDimitry Andric
10510b57cec5SDimitry Andricclass SRLRI_B_ENC : MSA_BIT_B_FMT<0b011, 0b001010>;
10520b57cec5SDimitry Andricclass SRLRI_H_ENC : MSA_BIT_H_FMT<0b011, 0b001010>;
10530b57cec5SDimitry Andricclass SRLRI_W_ENC : MSA_BIT_W_FMT<0b011, 0b001010>;
10540b57cec5SDimitry Andricclass SRLRI_D_ENC : MSA_BIT_D_FMT<0b011, 0b001010>;
10550b57cec5SDimitry Andric
10560b57cec5SDimitry Andricclass ST_B_ENC   : MSA_MI10_FMT<0b00, 0b1001>;
10570b57cec5SDimitry Andricclass ST_H_ENC   : MSA_MI10_FMT<0b01, 0b1001>;
10580b57cec5SDimitry Andricclass ST_W_ENC   : MSA_MI10_FMT<0b10, 0b1001>;
10590b57cec5SDimitry Andricclass ST_D_ENC   : MSA_MI10_FMT<0b11, 0b1001>;
10600b57cec5SDimitry Andric
10610b57cec5SDimitry Andricclass SUBS_S_B_ENC : MSA_3R_FMT<0b000, 0b00, 0b010001>;
10620b57cec5SDimitry Andricclass SUBS_S_H_ENC : MSA_3R_FMT<0b000, 0b01, 0b010001>;
10630b57cec5SDimitry Andricclass SUBS_S_W_ENC : MSA_3R_FMT<0b000, 0b10, 0b010001>;
10640b57cec5SDimitry Andricclass SUBS_S_D_ENC : MSA_3R_FMT<0b000, 0b11, 0b010001>;
10650b57cec5SDimitry Andric
10660b57cec5SDimitry Andricclass SUBS_U_B_ENC : MSA_3R_FMT<0b001, 0b00, 0b010001>;
10670b57cec5SDimitry Andricclass SUBS_U_H_ENC : MSA_3R_FMT<0b001, 0b01, 0b010001>;
10680b57cec5SDimitry Andricclass SUBS_U_W_ENC : MSA_3R_FMT<0b001, 0b10, 0b010001>;
10690b57cec5SDimitry Andricclass SUBS_U_D_ENC : MSA_3R_FMT<0b001, 0b11, 0b010001>;
10700b57cec5SDimitry Andric
10710b57cec5SDimitry Andricclass SUBSUS_U_B_ENC : MSA_3R_FMT<0b010, 0b00, 0b010001>;
10720b57cec5SDimitry Andricclass SUBSUS_U_H_ENC : MSA_3R_FMT<0b010, 0b01, 0b010001>;
10730b57cec5SDimitry Andricclass SUBSUS_U_W_ENC : MSA_3R_FMT<0b010, 0b10, 0b010001>;
10740b57cec5SDimitry Andricclass SUBSUS_U_D_ENC : MSA_3R_FMT<0b010, 0b11, 0b010001>;
10750b57cec5SDimitry Andric
10760b57cec5SDimitry Andricclass SUBSUU_S_B_ENC : MSA_3R_FMT<0b011, 0b00, 0b010001>;
10770b57cec5SDimitry Andricclass SUBSUU_S_H_ENC : MSA_3R_FMT<0b011, 0b01, 0b010001>;
10780b57cec5SDimitry Andricclass SUBSUU_S_W_ENC : MSA_3R_FMT<0b011, 0b10, 0b010001>;
10790b57cec5SDimitry Andricclass SUBSUU_S_D_ENC : MSA_3R_FMT<0b011, 0b11, 0b010001>;
10800b57cec5SDimitry Andric
10810b57cec5SDimitry Andricclass SUBV_B_ENC : MSA_3R_FMT<0b001, 0b00, 0b001110>;
10820b57cec5SDimitry Andricclass SUBV_H_ENC : MSA_3R_FMT<0b001, 0b01, 0b001110>;
10830b57cec5SDimitry Andricclass SUBV_W_ENC : MSA_3R_FMT<0b001, 0b10, 0b001110>;
10840b57cec5SDimitry Andricclass SUBV_D_ENC : MSA_3R_FMT<0b001, 0b11, 0b001110>;
10850b57cec5SDimitry Andric
10860b57cec5SDimitry Andricclass SUBVI_B_ENC : MSA_I5_FMT<0b001, 0b00, 0b000110>;
10870b57cec5SDimitry Andricclass SUBVI_H_ENC : MSA_I5_FMT<0b001, 0b01, 0b000110>;
10880b57cec5SDimitry Andricclass SUBVI_W_ENC : MSA_I5_FMT<0b001, 0b10, 0b000110>;
10890b57cec5SDimitry Andricclass SUBVI_D_ENC : MSA_I5_FMT<0b001, 0b11, 0b000110>;
10900b57cec5SDimitry Andric
10910b57cec5SDimitry Andricclass VSHF_B_ENC : MSA_3R_FMT<0b000, 0b00, 0b010101>;
10920b57cec5SDimitry Andricclass VSHF_H_ENC : MSA_3R_FMT<0b000, 0b01, 0b010101>;
10930b57cec5SDimitry Andricclass VSHF_W_ENC : MSA_3R_FMT<0b000, 0b10, 0b010101>;
10940b57cec5SDimitry Andricclass VSHF_D_ENC : MSA_3R_FMT<0b000, 0b11, 0b010101>;
10950b57cec5SDimitry Andric
10960b57cec5SDimitry Andricclass XOR_V_ENC : MSA_VEC_FMT<0b00011, 0b011110>;
10970b57cec5SDimitry Andric
10980b57cec5SDimitry Andricclass XORI_B_ENC : MSA_I8_FMT<0b11, 0b000000>;
10990b57cec5SDimitry Andric
11000b57cec5SDimitry Andric// Instruction desc.
11010b57cec5SDimitry Andricclass MSA_BIT_B_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
11020b57cec5SDimitry Andric                          ComplexPattern Imm, RegisterOperand ROWD,
11030b57cec5SDimitry Andric                          RegisterOperand ROWS = ROWD,
11040b57cec5SDimitry Andric                          InstrItinClass itin = NoItinerary> {
11050b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
11060b57cec5SDimitry Andric  dag InOperandList = (ins ROWS:$ws, vsplat_uimm3:$m);
11070b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws, $m");
11080b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWS:$ws, Imm:$m))];
11090b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
11100b57cec5SDimitry Andric}
11110b57cec5SDimitry Andric
11120b57cec5SDimitry Andricclass MSA_BIT_H_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
11130b57cec5SDimitry Andric                          ComplexPattern Imm, RegisterOperand ROWD,
11140b57cec5SDimitry Andric                          RegisterOperand ROWS = ROWD,
11150b57cec5SDimitry Andric                          InstrItinClass itin = NoItinerary> {
11160b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
11170b57cec5SDimitry Andric  dag InOperandList = (ins ROWS:$ws, vsplat_uimm4:$m);
11180b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws, $m");
11190b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWS:$ws, Imm:$m))];
11200b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
11210b57cec5SDimitry Andric}
11220b57cec5SDimitry Andric
11230b57cec5SDimitry Andricclass MSA_BIT_W_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
11240b57cec5SDimitry Andric                          ComplexPattern Imm, RegisterOperand ROWD,
11250b57cec5SDimitry Andric                          RegisterOperand ROWS = ROWD,
11260b57cec5SDimitry Andric                          InstrItinClass itin = NoItinerary> {
11270b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
11280b57cec5SDimitry Andric  dag InOperandList = (ins ROWS:$ws, vsplat_uimm5:$m);
11290b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws, $m");
11300b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWS:$ws, Imm:$m))];
11310b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
11320b57cec5SDimitry Andric}
11330b57cec5SDimitry Andric
11340b57cec5SDimitry Andricclass MSA_BIT_D_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
11350b57cec5SDimitry Andric                          ComplexPattern Imm, RegisterOperand ROWD,
11360b57cec5SDimitry Andric                          RegisterOperand ROWS = ROWD,
11370b57cec5SDimitry Andric                          InstrItinClass itin = NoItinerary> {
11380b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
11390b57cec5SDimitry Andric  dag InOperandList = (ins ROWS:$ws, vsplat_uimm6:$m);
11400b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws, $m");
11410b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWS:$ws, Imm:$m))];
11420b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
11430b57cec5SDimitry Andric}
11440b57cec5SDimitry Andric
11450b57cec5SDimitry Andricclass MSA_BIT_X_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
11460b57cec5SDimitry Andric                          Operand ImmOp, ImmLeaf Imm, RegisterOperand ROWD,
11470b57cec5SDimitry Andric                          RegisterOperand ROWS = ROWD,
11480b57cec5SDimitry Andric                          InstrItinClass itin = NoItinerary> {
11490b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
11500b57cec5SDimitry Andric  dag InOperandList = (ins ROWS:$ws, ImmOp:$m);
11510b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws, $m");
11520b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWS:$ws, Imm:$m))];
11530b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
11540b57cec5SDimitry Andric}
11550b57cec5SDimitry Andric
11560b57cec5SDimitry Andricclass MSA_BIT_BINSXI_DESC_BASE<string instr_asm, ValueType Ty,
11570b57cec5SDimitry Andric                               SplatComplexPattern Mask, RegisterOperand ROWD,
11580b57cec5SDimitry Andric                               RegisterOperand ROWS = ROWD,
11590b57cec5SDimitry Andric                               InstrItinClass itin = NoItinerary> {
11600b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
11610b57cec5SDimitry Andric  dag InOperandList = (ins ROWD:$wd_in, ROWS:$ws, Mask.OpClass:$m);
11620b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws, $m");
11630b57cec5SDimitry Andric  // Note that binsxi and vselect treat the condition operand the opposite
11640b57cec5SDimitry Andric  // way to each other.
11650b57cec5SDimitry Andric  //   (vselect cond, if_set, if_clear)
11660b57cec5SDimitry Andric  //   (BSEL_V cond, if_clear, if_set)
11670b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (vselect (Ty Mask:$m), (Ty ROWD:$ws),
11680b57cec5SDimitry Andric                                               ROWS:$wd_in))];
11690b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
11700b57cec5SDimitry Andric  string Constraints = "$wd = $wd_in";
11710b57cec5SDimitry Andric}
11720b57cec5SDimitry Andric
11730b57cec5SDimitry Andricclass MSA_BIT_BINSLI_DESC_BASE<string instr_asm, ValueType Ty,
11740b57cec5SDimitry Andric                               SplatComplexPattern ImmOp, RegisterOperand ROWD,
11750b57cec5SDimitry Andric                               RegisterOperand ROWS = ROWD,
11760b57cec5SDimitry Andric                               InstrItinClass itin = NoItinerary> :
11770b57cec5SDimitry Andric  MSA_BIT_BINSXI_DESC_BASE<instr_asm, Ty, ImmOp, ROWD, ROWS, itin>;
11780b57cec5SDimitry Andric
11790b57cec5SDimitry Andricclass MSA_BIT_BINSRI_DESC_BASE<string instr_asm, ValueType Ty,
11800b57cec5SDimitry Andric                               SplatComplexPattern ImmOp, RegisterOperand ROWD,
11810b57cec5SDimitry Andric                               RegisterOperand ROWS = ROWD,
11820b57cec5SDimitry Andric                               InstrItinClass itin = NoItinerary> :
11830b57cec5SDimitry Andric  MSA_BIT_BINSXI_DESC_BASE<instr_asm, Ty, ImmOp, ROWD, ROWS, itin>;
11840b57cec5SDimitry Andric
11850b57cec5SDimitry Andricclass MSA_BIT_SPLAT_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
11860b57cec5SDimitry Andric                              SplatComplexPattern SplatImm,
11870b57cec5SDimitry Andric                              RegisterOperand ROWD, RegisterOperand ROWS = ROWD,
11880b57cec5SDimitry Andric                              InstrItinClass itin = NoItinerary> {
11890b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
11900b57cec5SDimitry Andric  dag InOperandList = (ins ROWS:$ws, SplatImm.OpClass:$m);
11910b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws, $m");
11920b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWS:$ws, SplatImm:$m))];
11930b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
11940b57cec5SDimitry Andric}
11950b57cec5SDimitry Andric
11960b57cec5SDimitry Andricclass MSA_COPY_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
11970b57cec5SDimitry Andric                         ValueType VecTy, Operand ImmOp, ImmLeaf Imm,
11980b57cec5SDimitry Andric                         RegisterOperand ROD, RegisterOperand ROWS,
11990b57cec5SDimitry Andric                         InstrItinClass itin = NoItinerary> {
12000b57cec5SDimitry Andric  dag OutOperandList = (outs ROD:$rd);
12010b57cec5SDimitry Andric  dag InOperandList = (ins ROWS:$ws, ImmOp:$n);
12020b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$rd, $ws[$n]");
12030b57cec5SDimitry Andric  list<dag> Pattern = [(set ROD:$rd, (OpNode (VecTy ROWS:$ws), Imm:$n))];
12040b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
12050b57cec5SDimitry Andric}
12060b57cec5SDimitry Andric
12070b57cec5SDimitry Andricclass MSA_ELM_SLD_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
12080b57cec5SDimitry Andric                            RegisterOperand ROWD, RegisterOperand ROWS,
12090b57cec5SDimitry Andric                            Operand ImmOp, ImmLeaf Imm,
12100b57cec5SDimitry Andric                            InstrItinClass itin = NoItinerary> {
12110b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
12120b57cec5SDimitry Andric  dag InOperandList = (ins ROWD:$wd_in, ROWS:$ws, ImmOp:$n);
12130b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws[$n]");
12140b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWD:$wd_in, ROWS:$ws,
12150b57cec5SDimitry Andric                                              Imm:$n))];
12160b57cec5SDimitry Andric  string Constraints = "$wd = $wd_in";
12170b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
12180b57cec5SDimitry Andric}
12190b57cec5SDimitry Andric
12200b57cec5SDimitry Andricclass MSA_COPY_PSEUDO_BASE<SDPatternOperator OpNode, ValueType VecTy,
12210b57cec5SDimitry Andric                           Operand ImmOp, ImmLeaf Imm, RegisterClass RCD,
12220b57cec5SDimitry Andric                           RegisterClass RCWS> :
12230b57cec5SDimitry Andric      MSAPseudo<(outs RCD:$wd), (ins RCWS:$ws, ImmOp:$n),
12240b57cec5SDimitry Andric                [(set RCD:$wd, (OpNode (VecTy RCWS:$ws), Imm:$n))]> {
12250b57cec5SDimitry Andric  bit usesCustomInserter = 1;
12260b57cec5SDimitry Andric  bit hasNoSchedulingInfo = 1;
12270b57cec5SDimitry Andric}
12280b57cec5SDimitry Andric
12290b57cec5SDimitry Andricclass MSA_I5_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
12300b57cec5SDimitry Andric                       SplatComplexPattern SplatImm, RegisterOperand ROWD,
12310b57cec5SDimitry Andric                       RegisterOperand ROWS = ROWD,
12320b57cec5SDimitry Andric                       InstrItinClass itin = NoItinerary> {
12330b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
12340b57cec5SDimitry Andric  dag InOperandList = (ins ROWS:$ws, SplatImm.OpClass:$imm);
12350b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws, $imm");
12360b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWS:$ws, SplatImm:$imm))];
12370b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
12380b57cec5SDimitry Andric}
12390b57cec5SDimitry Andric
12400b57cec5SDimitry Andricclass MSA_I8_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
12410b57cec5SDimitry Andric                       SplatComplexPattern SplatImm, RegisterOperand ROWD,
12420b57cec5SDimitry Andric                       RegisterOperand ROWS = ROWD,
12430b57cec5SDimitry Andric                       InstrItinClass itin = NoItinerary> {
12440b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
12450b57cec5SDimitry Andric  dag InOperandList = (ins ROWS:$ws, SplatImm.OpClass:$u8);
12460b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws, $u8");
12470b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWS:$ws, SplatImm:$u8))];
12480b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
12490b57cec5SDimitry Andric}
12500b57cec5SDimitry Andric
12510b57cec5SDimitry Andricclass MSA_I8_SHF_DESC_BASE<string instr_asm, RegisterOperand ROWD,
12520b57cec5SDimitry Andric                           RegisterOperand ROWS = ROWD,
12530b57cec5SDimitry Andric                           InstrItinClass itin = NoItinerary> {
12540b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
12550b57cec5SDimitry Andric  dag InOperandList = (ins ROWS:$ws, uimm8:$u8);
12560b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws, $u8");
12578bcb0991SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (MipsSHF timmZExt8:$u8, ROWS:$ws))];
12580b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
12590b57cec5SDimitry Andric}
12600b57cec5SDimitry Andric
12610b57cec5SDimitry Andricclass MSA_I10_LDI_DESC_BASE<string instr_asm, RegisterOperand ROWD,
12620b57cec5SDimitry Andric                            InstrItinClass itin = NoItinerary> {
12630b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
12640b57cec5SDimitry Andric  dag InOperandList = (ins vsplat_simm10:$s10);
12650b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $s10");
12660b57cec5SDimitry Andric  // LDI is matched using custom matching code in MipsSEISelDAGToDAG.cpp
12670b57cec5SDimitry Andric  list<dag> Pattern = [];
12680b57cec5SDimitry Andric  bit hasSideEffects = 0;
1269480093f4SDimitry Andric  bit isReMaterializable = 1;
12700b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
12710b57cec5SDimitry Andric}
12720b57cec5SDimitry Andric
12730b57cec5SDimitry Andricclass MSA_2R_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
12740b57cec5SDimitry Andric                       RegisterOperand ROWD, RegisterOperand ROWS = ROWD,
12750b57cec5SDimitry Andric                       InstrItinClass itin = NoItinerary> {
12760b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
12770b57cec5SDimitry Andric  dag InOperandList = (ins ROWS:$ws);
12780b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws");
12790b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWS:$ws))];
12800b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
12810b57cec5SDimitry Andric}
12820b57cec5SDimitry Andric
12830b57cec5SDimitry Andricclass MSA_2R_FILL_DESC_BASE<string instr_asm, ValueType VT,
12840b57cec5SDimitry Andric                            SDPatternOperator OpNode, RegisterOperand ROWD,
12850b57cec5SDimitry Andric                            RegisterOperand ROS = ROWD,
12860b57cec5SDimitry Andric                            InstrItinClass itin = NoItinerary> {
12870b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
12880b57cec5SDimitry Andric  dag InOperandList = (ins ROS:$rs);
12890b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $rs");
12900b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (VT (OpNode ROS:$rs)))];
12910b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
12920b57cec5SDimitry Andric}
12930b57cec5SDimitry Andric
1294349cc55cSDimitry Andricclass MSA_2R_FILL_PSEUDO_BASE<SDPatternOperator OpNode,
1295349cc55cSDimitry Andric                              RegisterClass RCWD, RegisterClass RCWS> :
12960b57cec5SDimitry Andric      MSAPseudo<(outs RCWD:$wd), (ins RCWS:$fs),
12970b57cec5SDimitry Andric                [(set RCWD:$wd, (OpNode RCWS:$fs))]> {
12980b57cec5SDimitry Andric  let usesCustomInserter = 1;
12990b57cec5SDimitry Andric}
13000b57cec5SDimitry Andric
13010b57cec5SDimitry Andricclass MSA_2RF_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
13020b57cec5SDimitry Andric                        RegisterOperand ROWD, RegisterOperand ROWS = ROWD,
13030b57cec5SDimitry Andric                        InstrItinClass itin = NoItinerary> {
13040b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
13050b57cec5SDimitry Andric  dag InOperandList = (ins ROWS:$ws);
13060b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws");
13070b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWS:$ws))];
13080b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
13090b57cec5SDimitry Andric}
13100b57cec5SDimitry Andric
13110b57cec5SDimitry Andricclass MSA_3R_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
13120b57cec5SDimitry Andric                       RegisterOperand ROWD, RegisterOperand ROWS = ROWD,
13130b57cec5SDimitry Andric                       RegisterOperand ROWT = ROWD,
13140b57cec5SDimitry Andric                       InstrItinClass itin = NoItinerary> {
13150b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
13160b57cec5SDimitry Andric  dag InOperandList = (ins ROWS:$ws, ROWT:$wt);
13170b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws, $wt");
13180b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWS:$ws, ROWT:$wt))];
13190b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
13200b57cec5SDimitry Andric}
13210b57cec5SDimitry Andric
13220b57cec5SDimitry Andricclass MSA_3R_BINSX_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
13230b57cec5SDimitry Andric                             RegisterOperand ROWD, RegisterOperand ROWS = ROWD,
13240b57cec5SDimitry Andric                             RegisterOperand ROWT = ROWD,
13250b57cec5SDimitry Andric                             InstrItinClass itin = NoItinerary> {
13260b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
13270b57cec5SDimitry Andric  dag InOperandList = (ins ROWD:$wd_in, ROWS:$ws, ROWT:$wt);
13280b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws, $wt");
13290b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWD:$wd_in, ROWS:$ws,
13300b57cec5SDimitry Andric                                              ROWT:$wt))];
13310b57cec5SDimitry Andric  string Constraints = "$wd = $wd_in";
13320b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
13330b57cec5SDimitry Andric}
13340b57cec5SDimitry Andric
13350b57cec5SDimitry Andricclass MSA_3R_SPLAT_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
13360b57cec5SDimitry Andric                             RegisterOperand ROWD, RegisterOperand ROWS = ROWD,
13370b57cec5SDimitry Andric                             InstrItinClass itin = NoItinerary> {
13380b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
13390b57cec5SDimitry Andric  dag InOperandList = (ins ROWS:$ws, GPR32Opnd:$rt);
13400b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws[$rt]");
13410b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWS:$ws, GPR32Opnd:$rt))];
13420b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
13430b57cec5SDimitry Andric}
13440b57cec5SDimitry Andric
13450b57cec5SDimitry Andricclass MSA_3R_VSHF_DESC_BASE<string instr_asm, RegisterOperand ROWD,
13460b57cec5SDimitry Andric                            RegisterOperand ROWS = ROWD,
13470b57cec5SDimitry Andric                            RegisterOperand ROWT = ROWD,
13480b57cec5SDimitry Andric                            InstrItinClass itin = NoItinerary> {
13490b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
13500b57cec5SDimitry Andric  dag InOperandList = (ins ROWD:$wd_in, ROWS:$ws, ROWT:$wt);
13510b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws, $wt");
13520b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (MipsVSHF ROWD:$wd_in, ROWS:$ws,
13530b57cec5SDimitry Andric                                                ROWT:$wt))];
13540b57cec5SDimitry Andric  string Constraints = "$wd = $wd_in";
13550b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
13560b57cec5SDimitry Andric}
13570b57cec5SDimitry Andric
13580b57cec5SDimitry Andricclass MSA_3R_SLD_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
13590b57cec5SDimitry Andric                           RegisterOperand ROWD, RegisterOperand ROWS = ROWD,
13600b57cec5SDimitry Andric                           InstrItinClass itin = NoItinerary> {
13610b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
13620b57cec5SDimitry Andric  dag InOperandList = (ins ROWD:$wd_in, ROWS:$ws, GPR32Opnd:$rt);
13630b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws[$rt]");
13640b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWD:$wd_in, ROWS:$ws,
13650b57cec5SDimitry Andric                                              GPR32Opnd:$rt))];
13660b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
13670b57cec5SDimitry Andric  string Constraints = "$wd = $wd_in";
13680b57cec5SDimitry Andric}
13690b57cec5SDimitry Andric
13700b57cec5SDimitry Andricclass MSA_3R_4R_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
13710b57cec5SDimitry Andric                          RegisterOperand ROWD, RegisterOperand ROWS = ROWD,
13720b57cec5SDimitry Andric                          RegisterOperand ROWT = ROWD,
13730b57cec5SDimitry Andric                          InstrItinClass itin = NoItinerary> {
13740b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
13750b57cec5SDimitry Andric  dag InOperandList = (ins ROWD:$wd_in, ROWS:$ws, ROWT:$wt);
13760b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws, $wt");
13770b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWD:$wd_in, ROWS:$ws,
13780b57cec5SDimitry Andric                                              ROWT:$wt))];
13790b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
13800b57cec5SDimitry Andric  string Constraints = "$wd = $wd_in";
13810b57cec5SDimitry Andric}
13820b57cec5SDimitry Andric
13830b57cec5SDimitry Andricclass MSA_3RF_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
13840b57cec5SDimitry Andric                        RegisterOperand ROWD, RegisterOperand ROWS = ROWD,
13850b57cec5SDimitry Andric                        RegisterOperand ROWT = ROWD,
13860b57cec5SDimitry Andric                        InstrItinClass itin = NoItinerary> :
13870b57cec5SDimitry Andric  MSA_3R_DESC_BASE<instr_asm, OpNode, ROWD, ROWS, ROWT, itin>;
13880b57cec5SDimitry Andric
13890b57cec5SDimitry Andricclass MSA_3RF_4RF_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
13900b57cec5SDimitry Andric                            RegisterOperand ROWD, RegisterOperand ROWS = ROWD,
13910b57cec5SDimitry Andric                            RegisterOperand ROWT = ROWD,
13920b57cec5SDimitry Andric                            InstrItinClass itin = NoItinerary> :
13930b57cec5SDimitry Andric  MSA_3R_4R_DESC_BASE<instr_asm, OpNode, ROWD, ROWS, ROWT, itin>;
13940b57cec5SDimitry Andric
13950b57cec5SDimitry Andricclass MSA_CBRANCH_DESC_BASE<string instr_asm, RegisterOperand ROWD> {
13960b57cec5SDimitry Andric  dag OutOperandList = (outs);
13970b57cec5SDimitry Andric  dag InOperandList = (ins ROWD:$wt, brtarget:$offset);
13980b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wt, $offset");
13990b57cec5SDimitry Andric  list<dag> Pattern = [];
14000b57cec5SDimitry Andric  InstrItinClass Itinerary = NoItinerary;
14010b57cec5SDimitry Andric  bit isBranch = 1;
14020b57cec5SDimitry Andric  bit isTerminator = 1;
14030b57cec5SDimitry Andric  bit hasDelaySlot = 1;
14040b57cec5SDimitry Andric  list<Register> Defs = [AT];
14050b57cec5SDimitry Andric}
14060b57cec5SDimitry Andric
14070b57cec5SDimitry Andricclass MSA_INSERT_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
14080b57cec5SDimitry Andric                           Operand ImmOp, ImmLeaf Imm, RegisterOperand ROWD,
14090b57cec5SDimitry Andric                           RegisterOperand ROS,
14100b57cec5SDimitry Andric                           InstrItinClass itin = NoItinerary> {
14110b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
14120b57cec5SDimitry Andric  dag InOperandList = (ins ROWD:$wd_in, ROS:$rs, ImmOp:$n);
14130b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd[$n], $rs");
14140b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWD:$wd_in, ROS:$rs, Imm:$n))];
14150b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
14160b57cec5SDimitry Andric  string Constraints = "$wd = $wd_in";
14170b57cec5SDimitry Andric}
14180b57cec5SDimitry Andric
14190b57cec5SDimitry Andricclass MSA_INSERT_PSEUDO_BASE<SDPatternOperator OpNode, ValueType Ty,
14200b57cec5SDimitry Andric                             Operand ImmOp, ImmLeaf Imm, RegisterOperand ROWD,
14210b57cec5SDimitry Andric                             RegisterOperand ROFS> :
14220b57cec5SDimitry Andric      MSAPseudo<(outs ROWD:$wd), (ins ROWD:$wd_in, ImmOp:$n, ROFS:$fs),
14230b57cec5SDimitry Andric                [(set ROWD:$wd, (OpNode (Ty ROWD:$wd_in), ROFS:$fs, Imm:$n))]> {
14240b57cec5SDimitry Andric  bit usesCustomInserter = 1;
14250b57cec5SDimitry Andric  string Constraints = "$wd = $wd_in";
14260b57cec5SDimitry Andric}
14270b57cec5SDimitry Andric
14280b57cec5SDimitry Andricclass MSA_INSERT_VIDX_PSEUDO_BASE<SDPatternOperator OpNode, ValueType Ty,
14290b57cec5SDimitry Andric                                  RegisterOperand ROWD, RegisterOperand ROFS,
14300b57cec5SDimitry Andric                                  RegisterOperand ROIdx> :
14310b57cec5SDimitry Andric      MSAPseudo<(outs ROWD:$wd), (ins ROWD:$wd_in, ROIdx:$n, ROFS:$fs),
14320b57cec5SDimitry Andric                [(set ROWD:$wd, (OpNode (Ty ROWD:$wd_in), ROFS:$fs,
14330b57cec5SDimitry Andric                                        ROIdx:$n))]> {
14340b57cec5SDimitry Andric  bit usesCustomInserter = 1;
14350b57cec5SDimitry Andric  bit hasNoSchedulingInfo = 1;
14360b57cec5SDimitry Andric  string Constraints = "$wd = $wd_in";
14370b57cec5SDimitry Andric}
14380b57cec5SDimitry Andric
14390b57cec5SDimitry Andricclass MSA_INSVE_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
14400b57cec5SDimitry Andric                          Operand ImmOp, ImmLeaf Imm, RegisterOperand ROWD,
14410b57cec5SDimitry Andric                          RegisterOperand ROWS = ROWD,
14420b57cec5SDimitry Andric                          InstrItinClass itin = NoItinerary> {
14430b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
14440b57cec5SDimitry Andric  dag InOperandList = (ins ROWD:$wd_in, ImmOp:$n, ROWS:$ws, uimmz:$n2);
14450b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd[$n], $ws[$n2]");
14460b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWD:$wd_in,
14470b57cec5SDimitry Andric                                              Imm:$n,
14480b57cec5SDimitry Andric                                              ROWS:$ws,
14490b57cec5SDimitry Andric                                              immz:$n2))];
14500b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
14510b57cec5SDimitry Andric  string Constraints = "$wd = $wd_in";
14520b57cec5SDimitry Andric}
14530b57cec5SDimitry Andric
14540b57cec5SDimitry Andricclass MSA_VEC_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
14550b57cec5SDimitry Andric                        RegisterOperand ROWD, RegisterOperand ROWS = ROWD,
14560b57cec5SDimitry Andric                        RegisterOperand ROWT = ROWD,
14570b57cec5SDimitry Andric                        InstrItinClass itin = NoItinerary> {
14580b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
14590b57cec5SDimitry Andric  dag InOperandList = (ins ROWS:$ws, ROWT:$wt);
14600b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws, $wt");
14610b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWS:$ws, ROWT:$wt))];
14620b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
14630b57cec5SDimitry Andric}
14640b57cec5SDimitry Andric
14650b57cec5SDimitry Andricclass MSA_ELM_SPLAT_DESC_BASE<string instr_asm, SplatComplexPattern SplatImm,
14660b57cec5SDimitry Andric                              RegisterOperand ROWD,
14670b57cec5SDimitry Andric                              RegisterOperand ROWS = ROWD,
14680b57cec5SDimitry Andric                              InstrItinClass itin = NoItinerary> {
14690b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
14700b57cec5SDimitry Andric  dag InOperandList = (ins ROWS:$ws, SplatImm.OpClass:$n);
14710b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $ws[$n]");
14720b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (MipsVSHF SplatImm:$n, ROWS:$ws,
14730b57cec5SDimitry Andric                                                ROWS:$ws))];
14740b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
14750b57cec5SDimitry Andric}
14760b57cec5SDimitry Andric
14770b57cec5SDimitry Andricclass MSA_VEC_PSEUDO_BASE<SDPatternOperator OpNode, RegisterOperand ROWD,
14780b57cec5SDimitry Andric                          RegisterOperand ROWS = ROWD,
14790b57cec5SDimitry Andric                          RegisterOperand ROWT = ROWD> :
14800b57cec5SDimitry Andric      MSAPseudo<(outs ROWD:$wd), (ins ROWS:$ws, ROWT:$wt),
14810b57cec5SDimitry Andric                [(set ROWD:$wd, (OpNode ROWS:$ws, ROWT:$wt))]>;
14820b57cec5SDimitry Andric
14830b57cec5SDimitry Andricclass ADD_A_B_DESC : MSA_3R_DESC_BASE<"add_a.b", int_mips_add_a_b, MSA128BOpnd>,
14840b57cec5SDimitry Andric                     IsCommutable;
14850b57cec5SDimitry Andricclass ADD_A_H_DESC : MSA_3R_DESC_BASE<"add_a.h", int_mips_add_a_h, MSA128HOpnd>,
14860b57cec5SDimitry Andric                     IsCommutable;
14870b57cec5SDimitry Andricclass ADD_A_W_DESC : MSA_3R_DESC_BASE<"add_a.w", int_mips_add_a_w, MSA128WOpnd>,
14880b57cec5SDimitry Andric                     IsCommutable;
14890b57cec5SDimitry Andricclass ADD_A_D_DESC : MSA_3R_DESC_BASE<"add_a.d", int_mips_add_a_d, MSA128DOpnd>,
14900b57cec5SDimitry Andric                     IsCommutable;
14910b57cec5SDimitry Andric
14920b57cec5SDimitry Andricclass ADDS_A_B_DESC : MSA_3R_DESC_BASE<"adds_a.b", int_mips_adds_a_b,
14930b57cec5SDimitry Andric                                       MSA128BOpnd>, IsCommutable;
14940b57cec5SDimitry Andricclass ADDS_A_H_DESC : MSA_3R_DESC_BASE<"adds_a.h", int_mips_adds_a_h,
14950b57cec5SDimitry Andric                                       MSA128HOpnd>, IsCommutable;
14960b57cec5SDimitry Andricclass ADDS_A_W_DESC : MSA_3R_DESC_BASE<"adds_a.w", int_mips_adds_a_w,
14970b57cec5SDimitry Andric                                       MSA128WOpnd>, IsCommutable;
14980b57cec5SDimitry Andricclass ADDS_A_D_DESC : MSA_3R_DESC_BASE<"adds_a.d", int_mips_adds_a_d,
14990b57cec5SDimitry Andric                                       MSA128DOpnd>, IsCommutable;
15000b57cec5SDimitry Andric
15010b57cec5SDimitry Andricclass ADDS_S_B_DESC : MSA_3R_DESC_BASE<"adds_s.b", int_mips_adds_s_b,
15020b57cec5SDimitry Andric                                       MSA128BOpnd>, IsCommutable;
15030b57cec5SDimitry Andricclass ADDS_S_H_DESC : MSA_3R_DESC_BASE<"adds_s.h", int_mips_adds_s_h,
15040b57cec5SDimitry Andric                                       MSA128HOpnd>, IsCommutable;
15050b57cec5SDimitry Andricclass ADDS_S_W_DESC : MSA_3R_DESC_BASE<"adds_s.w", int_mips_adds_s_w,
15060b57cec5SDimitry Andric                                       MSA128WOpnd>, IsCommutable;
15070b57cec5SDimitry Andricclass ADDS_S_D_DESC : MSA_3R_DESC_BASE<"adds_s.d", int_mips_adds_s_d,
15080b57cec5SDimitry Andric                                       MSA128DOpnd>, IsCommutable;
15090b57cec5SDimitry Andric
15100b57cec5SDimitry Andricclass ADDS_U_B_DESC : MSA_3R_DESC_BASE<"adds_u.b", int_mips_adds_u_b,
15110b57cec5SDimitry Andric                                       MSA128BOpnd>, IsCommutable;
15120b57cec5SDimitry Andricclass ADDS_U_H_DESC : MSA_3R_DESC_BASE<"adds_u.h", int_mips_adds_u_h,
15130b57cec5SDimitry Andric                                       MSA128HOpnd>, IsCommutable;
15140b57cec5SDimitry Andricclass ADDS_U_W_DESC : MSA_3R_DESC_BASE<"adds_u.w", int_mips_adds_u_w,
15150b57cec5SDimitry Andric                                       MSA128WOpnd>, IsCommutable;
15160b57cec5SDimitry Andricclass ADDS_U_D_DESC : MSA_3R_DESC_BASE<"adds_u.d", int_mips_adds_u_d,
15170b57cec5SDimitry Andric                                       MSA128DOpnd>, IsCommutable;
15180b57cec5SDimitry Andric
15190b57cec5SDimitry Andricclass ADDV_B_DESC : MSA_3R_DESC_BASE<"addv.b", add, MSA128BOpnd>, IsCommutable;
15200b57cec5SDimitry Andricclass ADDV_H_DESC : MSA_3R_DESC_BASE<"addv.h", add, MSA128HOpnd>, IsCommutable;
15210b57cec5SDimitry Andricclass ADDV_W_DESC : MSA_3R_DESC_BASE<"addv.w", add, MSA128WOpnd>, IsCommutable;
15220b57cec5SDimitry Andricclass ADDV_D_DESC : MSA_3R_DESC_BASE<"addv.d", add, MSA128DOpnd>, IsCommutable;
15230b57cec5SDimitry Andric
15240b57cec5SDimitry Andricclass ADDVI_B_DESC : MSA_I5_DESC_BASE<"addvi.b", add, vsplati8_uimm5,
15250b57cec5SDimitry Andric                                      MSA128BOpnd>;
15260b57cec5SDimitry Andricclass ADDVI_H_DESC : MSA_I5_DESC_BASE<"addvi.h", add, vsplati16_uimm5,
15270b57cec5SDimitry Andric                                      MSA128HOpnd>;
15280b57cec5SDimitry Andricclass ADDVI_W_DESC : MSA_I5_DESC_BASE<"addvi.w", add, vsplati32_uimm5,
15290b57cec5SDimitry Andric                                      MSA128WOpnd>;
15300b57cec5SDimitry Andricclass ADDVI_D_DESC : MSA_I5_DESC_BASE<"addvi.d", add, vsplati64_uimm5,
15310b57cec5SDimitry Andric                                      MSA128DOpnd>;
15320b57cec5SDimitry Andric
15330b57cec5SDimitry Andricclass AND_V_DESC : MSA_VEC_DESC_BASE<"and.v", and, MSA128BOpnd>;
15340b57cec5SDimitry Andricclass AND_V_H_PSEUDO_DESC : MSA_VEC_PSEUDO_BASE<and, MSA128HOpnd>;
15350b57cec5SDimitry Andricclass AND_V_W_PSEUDO_DESC : MSA_VEC_PSEUDO_BASE<and, MSA128WOpnd>;
15360b57cec5SDimitry Andricclass AND_V_D_PSEUDO_DESC : MSA_VEC_PSEUDO_BASE<and, MSA128DOpnd>;
15370b57cec5SDimitry Andric
15380b57cec5SDimitry Andricclass ANDI_B_DESC : MSA_I8_DESC_BASE<"andi.b", and, vsplati8_uimm8,
15390b57cec5SDimitry Andric                                     MSA128BOpnd>;
15400b57cec5SDimitry Andric
15410b57cec5SDimitry Andricclass ASUB_S_B_DESC : MSA_3R_DESC_BASE<"asub_s.b", int_mips_asub_s_b,
15420b57cec5SDimitry Andric                                       MSA128BOpnd>;
15430b57cec5SDimitry Andricclass ASUB_S_H_DESC : MSA_3R_DESC_BASE<"asub_s.h", int_mips_asub_s_h,
15440b57cec5SDimitry Andric                                       MSA128HOpnd>;
15450b57cec5SDimitry Andricclass ASUB_S_W_DESC : MSA_3R_DESC_BASE<"asub_s.w", int_mips_asub_s_w,
15460b57cec5SDimitry Andric                                       MSA128WOpnd>;
15470b57cec5SDimitry Andricclass ASUB_S_D_DESC : MSA_3R_DESC_BASE<"asub_s.d", int_mips_asub_s_d,
15480b57cec5SDimitry Andric                                       MSA128DOpnd>;
15490b57cec5SDimitry Andric
15500b57cec5SDimitry Andricclass ASUB_U_B_DESC : MSA_3R_DESC_BASE<"asub_u.b", int_mips_asub_u_b,
15510b57cec5SDimitry Andric                                       MSA128BOpnd>;
15520b57cec5SDimitry Andricclass ASUB_U_H_DESC : MSA_3R_DESC_BASE<"asub_u.h", int_mips_asub_u_h,
15530b57cec5SDimitry Andric                                       MSA128HOpnd>;
15540b57cec5SDimitry Andricclass ASUB_U_W_DESC : MSA_3R_DESC_BASE<"asub_u.w", int_mips_asub_u_w,
15550b57cec5SDimitry Andric                                       MSA128WOpnd>;
15560b57cec5SDimitry Andricclass ASUB_U_D_DESC : MSA_3R_DESC_BASE<"asub_u.d", int_mips_asub_u_d,
15570b57cec5SDimitry Andric                                       MSA128DOpnd>;
15580b57cec5SDimitry Andric
15590b57cec5SDimitry Andricclass AVE_S_B_DESC : MSA_3R_DESC_BASE<"ave_s.b", int_mips_ave_s_b, MSA128BOpnd>,
15600b57cec5SDimitry Andric                     IsCommutable;
15610b57cec5SDimitry Andricclass AVE_S_H_DESC : MSA_3R_DESC_BASE<"ave_s.h", int_mips_ave_s_h, MSA128HOpnd>,
15620b57cec5SDimitry Andric                     IsCommutable;
15630b57cec5SDimitry Andricclass AVE_S_W_DESC : MSA_3R_DESC_BASE<"ave_s.w", int_mips_ave_s_w, MSA128WOpnd>,
15640b57cec5SDimitry Andric                     IsCommutable;
15650b57cec5SDimitry Andricclass AVE_S_D_DESC : MSA_3R_DESC_BASE<"ave_s.d", int_mips_ave_s_d, MSA128DOpnd>,
15660b57cec5SDimitry Andric                     IsCommutable;
15670b57cec5SDimitry Andric
15680b57cec5SDimitry Andricclass AVE_U_B_DESC : MSA_3R_DESC_BASE<"ave_u.b", int_mips_ave_u_b, MSA128BOpnd>,
15690b57cec5SDimitry Andric                     IsCommutable;
15700b57cec5SDimitry Andricclass AVE_U_H_DESC : MSA_3R_DESC_BASE<"ave_u.h", int_mips_ave_u_h, MSA128HOpnd>,
15710b57cec5SDimitry Andric                     IsCommutable;
15720b57cec5SDimitry Andricclass AVE_U_W_DESC : MSA_3R_DESC_BASE<"ave_u.w", int_mips_ave_u_w, MSA128WOpnd>,
15730b57cec5SDimitry Andric                     IsCommutable;
15740b57cec5SDimitry Andricclass AVE_U_D_DESC : MSA_3R_DESC_BASE<"ave_u.d", int_mips_ave_u_d, MSA128DOpnd>,
15750b57cec5SDimitry Andric                     IsCommutable;
15760b57cec5SDimitry Andric
15770b57cec5SDimitry Andricclass AVER_S_B_DESC : MSA_3R_DESC_BASE<"aver_s.b", int_mips_aver_s_b,
15780b57cec5SDimitry Andric                                       MSA128BOpnd>, IsCommutable;
15790b57cec5SDimitry Andricclass AVER_S_H_DESC : MSA_3R_DESC_BASE<"aver_s.h", int_mips_aver_s_h,
15800b57cec5SDimitry Andric                                       MSA128HOpnd>, IsCommutable;
15810b57cec5SDimitry Andricclass AVER_S_W_DESC : MSA_3R_DESC_BASE<"aver_s.w", int_mips_aver_s_w,
15820b57cec5SDimitry Andric                                       MSA128WOpnd>, IsCommutable;
15830b57cec5SDimitry Andricclass AVER_S_D_DESC : MSA_3R_DESC_BASE<"aver_s.d", int_mips_aver_s_d,
15840b57cec5SDimitry Andric                                       MSA128DOpnd>, IsCommutable;
15850b57cec5SDimitry Andric
15860b57cec5SDimitry Andricclass AVER_U_B_DESC : MSA_3R_DESC_BASE<"aver_u.b", int_mips_aver_u_b,
15870b57cec5SDimitry Andric                                       MSA128BOpnd>, IsCommutable;
15880b57cec5SDimitry Andricclass AVER_U_H_DESC : MSA_3R_DESC_BASE<"aver_u.h", int_mips_aver_u_h,
15890b57cec5SDimitry Andric                                       MSA128HOpnd>, IsCommutable;
15900b57cec5SDimitry Andricclass AVER_U_W_DESC : MSA_3R_DESC_BASE<"aver_u.w", int_mips_aver_u_w,
15910b57cec5SDimitry Andric                                       MSA128WOpnd>, IsCommutable;
15920b57cec5SDimitry Andricclass AVER_U_D_DESC : MSA_3R_DESC_BASE<"aver_u.d", int_mips_aver_u_d,
15930b57cec5SDimitry Andric                                       MSA128DOpnd>, IsCommutable;
15940b57cec5SDimitry Andric
15950b57cec5SDimitry Andricclass BCLR_B_DESC : MSA_3R_DESC_BASE<"bclr.b", vbclr_b, MSA128BOpnd>;
15960b57cec5SDimitry Andricclass BCLR_H_DESC : MSA_3R_DESC_BASE<"bclr.h", vbclr_h, MSA128HOpnd>;
15970b57cec5SDimitry Andricclass BCLR_W_DESC : MSA_3R_DESC_BASE<"bclr.w", vbclr_w, MSA128WOpnd>;
15980b57cec5SDimitry Andricclass BCLR_D_DESC : MSA_3R_DESC_BASE<"bclr.d", vbclr_d, MSA128DOpnd>;
15990b57cec5SDimitry Andric
16000b57cec5SDimitry Andricclass BCLRI_B_DESC : MSA_BIT_B_DESC_BASE<"bclri.b", and, vsplat_uimm_inv_pow2,
16010b57cec5SDimitry Andric                                         MSA128BOpnd>;
16020b57cec5SDimitry Andricclass BCLRI_H_DESC : MSA_BIT_H_DESC_BASE<"bclri.h", and, vsplat_uimm_inv_pow2,
16030b57cec5SDimitry Andric                                         MSA128HOpnd>;
16040b57cec5SDimitry Andricclass BCLRI_W_DESC : MSA_BIT_W_DESC_BASE<"bclri.w", and, vsplat_uimm_inv_pow2,
16050b57cec5SDimitry Andric                                         MSA128WOpnd>;
16060b57cec5SDimitry Andricclass BCLRI_D_DESC : MSA_BIT_D_DESC_BASE<"bclri.d", and, vsplat_uimm_inv_pow2,
16070b57cec5SDimitry Andric                                         MSA128DOpnd>;
16080b57cec5SDimitry Andric
16090b57cec5SDimitry Andricclass BINSL_B_DESC : MSA_3R_BINSX_DESC_BASE<"binsl.b", int_mips_binsl_b,
16100b57cec5SDimitry Andric                                            MSA128BOpnd>;
16110b57cec5SDimitry Andricclass BINSL_H_DESC : MSA_3R_BINSX_DESC_BASE<"binsl.h", int_mips_binsl_h,
16120b57cec5SDimitry Andric                                            MSA128HOpnd>;
16130b57cec5SDimitry Andricclass BINSL_W_DESC : MSA_3R_BINSX_DESC_BASE<"binsl.w", int_mips_binsl_w,
16140b57cec5SDimitry Andric                                            MSA128WOpnd>;
16150b57cec5SDimitry Andricclass BINSL_D_DESC : MSA_3R_BINSX_DESC_BASE<"binsl.d", int_mips_binsl_d,
16160b57cec5SDimitry Andric                                            MSA128DOpnd>;
16170b57cec5SDimitry Andric
16180b57cec5SDimitry Andricclass BINSLI_B_DESC : MSA_BIT_BINSLI_DESC_BASE<"binsli.b", v16i8, vsplat_maskl_bits_uimm3, MSA128BOpnd>;
16190b57cec5SDimitry Andricclass BINSLI_H_DESC : MSA_BIT_BINSLI_DESC_BASE<"binsli.h", v8i16, vsplat_maskl_bits_uimm4, MSA128HOpnd>;
16200b57cec5SDimitry Andricclass BINSLI_W_DESC : MSA_BIT_BINSLI_DESC_BASE<"binsli.w", v4i32, vsplat_maskl_bits_uimm5, MSA128WOpnd>;
16210b57cec5SDimitry Andricclass BINSLI_D_DESC : MSA_BIT_BINSLI_DESC_BASE<"binsli.d", v2i64, vsplat_maskl_bits_uimm6, MSA128DOpnd>;
16220b57cec5SDimitry Andric
16230b57cec5SDimitry Andricclass BINSR_B_DESC : MSA_3R_BINSX_DESC_BASE<"binsr.b", int_mips_binsr_b,
16240b57cec5SDimitry Andric                                            MSA128BOpnd>;
16250b57cec5SDimitry Andricclass BINSR_H_DESC : MSA_3R_BINSX_DESC_BASE<"binsr.h", int_mips_binsr_h,
16260b57cec5SDimitry Andric                                            MSA128HOpnd>;
16270b57cec5SDimitry Andricclass BINSR_W_DESC : MSA_3R_BINSX_DESC_BASE<"binsr.w", int_mips_binsr_w,
16280b57cec5SDimitry Andric                                            MSA128WOpnd>;
16290b57cec5SDimitry Andricclass BINSR_D_DESC : MSA_3R_BINSX_DESC_BASE<"binsr.d", int_mips_binsr_d,
16300b57cec5SDimitry Andric                                            MSA128DOpnd>;
16310b57cec5SDimitry Andric
16320b57cec5SDimitry Andricclass BINSRI_B_DESC
16330b57cec5SDimitry Andric    : MSA_BIT_BINSRI_DESC_BASE<"binsri.b", v16i8, vsplat_maskr_bits_uimm3,
16340b57cec5SDimitry Andric                               MSA128BOpnd>;
16350b57cec5SDimitry Andricclass BINSRI_H_DESC
16360b57cec5SDimitry Andric    : MSA_BIT_BINSRI_DESC_BASE<"binsri.h", v8i16, vsplat_maskr_bits_uimm4,
16370b57cec5SDimitry Andric                               MSA128HOpnd>;
16380b57cec5SDimitry Andricclass BINSRI_W_DESC
16390b57cec5SDimitry Andric    : MSA_BIT_BINSRI_DESC_BASE<"binsri.w", v4i32, vsplat_maskr_bits_uimm5,
16400b57cec5SDimitry Andric                               MSA128WOpnd>;
16410b57cec5SDimitry Andricclass BINSRI_D_DESC
16420b57cec5SDimitry Andric    : MSA_BIT_BINSRI_DESC_BASE<"binsri.d", v2i64, vsplat_maskr_bits_uimm6,
16430b57cec5SDimitry Andric                               MSA128DOpnd>;
16440b57cec5SDimitry Andric
16450b57cec5SDimitry Andricclass BMNZ_V_DESC {
16460b57cec5SDimitry Andric  dag OutOperandList = (outs MSA128BOpnd:$wd);
16470b57cec5SDimitry Andric  dag InOperandList = (ins MSA128BOpnd:$wd_in, MSA128BOpnd:$ws,
16480b57cec5SDimitry Andric                       MSA128BOpnd:$wt);
16490b57cec5SDimitry Andric  string AsmString = "bmnz.v\t$wd, $ws, $wt";
16500b57cec5SDimitry Andric  list<dag> Pattern = [(set MSA128BOpnd:$wd, (vselect MSA128BOpnd:$wt,
16510b57cec5SDimitry Andric                                                      MSA128BOpnd:$ws,
16520b57cec5SDimitry Andric                                                      MSA128BOpnd:$wd_in))];
16530b57cec5SDimitry Andric  InstrItinClass Itinerary = NoItinerary;
16540b57cec5SDimitry Andric  string Constraints = "$wd = $wd_in";
16550b57cec5SDimitry Andric}
16560b57cec5SDimitry Andric
16570b57cec5SDimitry Andricclass BMNZI_B_DESC {
16580b57cec5SDimitry Andric  dag OutOperandList = (outs MSA128BOpnd:$wd);
16590b57cec5SDimitry Andric  dag InOperandList = (ins MSA128BOpnd:$wd_in, MSA128BOpnd:$ws,
16600b57cec5SDimitry Andric                           vsplat_uimm8:$u8);
16610b57cec5SDimitry Andric  string AsmString = "bmnzi.b\t$wd, $ws, $u8";
16620b57cec5SDimitry Andric  list<dag> Pattern = [(set MSA128BOpnd:$wd, (vselect vsplati8_uimm8:$u8,
16630b57cec5SDimitry Andric                                                      MSA128BOpnd:$ws,
16640b57cec5SDimitry Andric                                                      MSA128BOpnd:$wd_in))];
16650b57cec5SDimitry Andric  InstrItinClass Itinerary = NoItinerary;
16660b57cec5SDimitry Andric  string Constraints = "$wd = $wd_in";
16670b57cec5SDimitry Andric}
16680b57cec5SDimitry Andric
16690b57cec5SDimitry Andricclass BMZ_V_DESC {
16700b57cec5SDimitry Andric  dag OutOperandList = (outs MSA128BOpnd:$wd);
16710b57cec5SDimitry Andric  dag InOperandList = (ins MSA128BOpnd:$wd_in, MSA128BOpnd:$ws,
16720b57cec5SDimitry Andric                       MSA128BOpnd:$wt);
16730b57cec5SDimitry Andric  string AsmString = "bmz.v\t$wd, $ws, $wt";
16740b57cec5SDimitry Andric  list<dag> Pattern = [(set MSA128BOpnd:$wd, (vselect MSA128BOpnd:$wt,
16750b57cec5SDimitry Andric                                                      MSA128BOpnd:$wd_in,
16760b57cec5SDimitry Andric                                                      MSA128BOpnd:$ws))];
16770b57cec5SDimitry Andric  InstrItinClass Itinerary = NoItinerary;
16780b57cec5SDimitry Andric  string Constraints = "$wd = $wd_in";
16790b57cec5SDimitry Andric}
16800b57cec5SDimitry Andric
16810b57cec5SDimitry Andricclass BMZI_B_DESC {
16820b57cec5SDimitry Andric  dag OutOperandList = (outs MSA128BOpnd:$wd);
16830b57cec5SDimitry Andric  dag InOperandList = (ins MSA128BOpnd:$wd_in, MSA128BOpnd:$ws,
16840b57cec5SDimitry Andric                           vsplat_uimm8:$u8);
16850b57cec5SDimitry Andric  string AsmString = "bmzi.b\t$wd, $ws, $u8";
16860b57cec5SDimitry Andric  list<dag> Pattern = [(set MSA128BOpnd:$wd, (vselect vsplati8_uimm8:$u8,
16870b57cec5SDimitry Andric                                                      MSA128BOpnd:$wd_in,
16880b57cec5SDimitry Andric                                                      MSA128BOpnd:$ws))];
16890b57cec5SDimitry Andric  InstrItinClass Itinerary = NoItinerary;
16900b57cec5SDimitry Andric  string Constraints = "$wd = $wd_in";
16910b57cec5SDimitry Andric}
16920b57cec5SDimitry Andric
16930b57cec5SDimitry Andricclass BNEG_B_DESC : MSA_3R_DESC_BASE<"bneg.b", vbneg_b, MSA128BOpnd>;
16940b57cec5SDimitry Andricclass BNEG_H_DESC : MSA_3R_DESC_BASE<"bneg.h", vbneg_h, MSA128HOpnd>;
16950b57cec5SDimitry Andricclass BNEG_W_DESC : MSA_3R_DESC_BASE<"bneg.w", vbneg_w, MSA128WOpnd>;
16960b57cec5SDimitry Andricclass BNEG_D_DESC : MSA_3R_DESC_BASE<"bneg.d", vbneg_d, MSA128DOpnd>;
16970b57cec5SDimitry Andric
16980b57cec5SDimitry Andricclass BNEGI_B_DESC : MSA_BIT_B_DESC_BASE<"bnegi.b", xor, vsplat_uimm_pow2,
16990b57cec5SDimitry Andric                                         MSA128BOpnd>;
17000b57cec5SDimitry Andricclass BNEGI_H_DESC : MSA_BIT_H_DESC_BASE<"bnegi.h", xor, vsplat_uimm_pow2,
17010b57cec5SDimitry Andric                                         MSA128HOpnd>;
17020b57cec5SDimitry Andricclass BNEGI_W_DESC : MSA_BIT_W_DESC_BASE<"bnegi.w", xor, vsplat_uimm_pow2,
17030b57cec5SDimitry Andric                                         MSA128WOpnd>;
17040b57cec5SDimitry Andricclass BNEGI_D_DESC : MSA_BIT_D_DESC_BASE<"bnegi.d", xor, vsplat_uimm_pow2,
17050b57cec5SDimitry Andric                                         MSA128DOpnd>;
17060b57cec5SDimitry Andric
17070b57cec5SDimitry Andricclass BNZ_B_DESC : MSA_CBRANCH_DESC_BASE<"bnz.b", MSA128BOpnd>;
17080b57cec5SDimitry Andricclass BNZ_H_DESC : MSA_CBRANCH_DESC_BASE<"bnz.h", MSA128HOpnd>;
17090b57cec5SDimitry Andricclass BNZ_W_DESC : MSA_CBRANCH_DESC_BASE<"bnz.w", MSA128WOpnd>;
17100b57cec5SDimitry Andricclass BNZ_D_DESC : MSA_CBRANCH_DESC_BASE<"bnz.d", MSA128DOpnd>;
17110b57cec5SDimitry Andric
17120b57cec5SDimitry Andricclass BNZ_V_DESC : MSA_CBRANCH_DESC_BASE<"bnz.v", MSA128BOpnd>;
17130b57cec5SDimitry Andric
17140b57cec5SDimitry Andricclass BSEL_V_DESC {
17150b57cec5SDimitry Andric  dag OutOperandList = (outs MSA128BOpnd:$wd);
17160b57cec5SDimitry Andric  dag InOperandList = (ins MSA128BOpnd:$wd_in, MSA128BOpnd:$ws,
17170b57cec5SDimitry Andric                       MSA128BOpnd:$wt);
17180b57cec5SDimitry Andric  string AsmString = "bsel.v\t$wd, $ws, $wt";
17190b57cec5SDimitry Andric  // Note that vselect and BSEL_V treat the condition operand the opposite way
17200b57cec5SDimitry Andric  // from each other.
17210b57cec5SDimitry Andric  //   (vselect cond, if_set, if_clear)
17220b57cec5SDimitry Andric  //   (BSEL_V cond, if_clear, if_set)
17230b57cec5SDimitry Andric  list<dag> Pattern = [(set MSA128BOpnd:$wd,
17240b57cec5SDimitry Andric                        (vselect MSA128BOpnd:$wd_in, MSA128BOpnd:$wt,
17250b57cec5SDimitry Andric                                                     MSA128BOpnd:$ws))];
17260b57cec5SDimitry Andric  InstrItinClass Itinerary = NoItinerary;
17270b57cec5SDimitry Andric  string Constraints = "$wd = $wd_in";
17280b57cec5SDimitry Andric}
17290b57cec5SDimitry Andric
17300b57cec5SDimitry Andricclass BSELI_B_DESC {
17310b57cec5SDimitry Andric  dag OutOperandList = (outs MSA128BOpnd:$wd);
17320b57cec5SDimitry Andric  dag InOperandList = (ins MSA128BOpnd:$wd_in, MSA128BOpnd:$ws,
17330b57cec5SDimitry Andric                           vsplat_uimm8:$u8);
17340b57cec5SDimitry Andric  string AsmString = "bseli.b\t$wd, $ws, $u8";
17350b57cec5SDimitry Andric  // Note that vselect and BSEL_V treat the condition operand the opposite way
17360b57cec5SDimitry Andric  // from each other.
17370b57cec5SDimitry Andric  //   (vselect cond, if_set, if_clear)
17380b57cec5SDimitry Andric  //   (BSEL_V cond, if_clear, if_set)
17390b57cec5SDimitry Andric  list<dag> Pattern = [(set MSA128BOpnd:$wd, (vselect MSA128BOpnd:$wd_in,
17400b57cec5SDimitry Andric                                                      vsplati8_uimm8:$u8,
17410b57cec5SDimitry Andric                                                      MSA128BOpnd:$ws))];
17420b57cec5SDimitry Andric  InstrItinClass Itinerary = NoItinerary;
17430b57cec5SDimitry Andric  string Constraints = "$wd = $wd_in";
17440b57cec5SDimitry Andric}
17450b57cec5SDimitry Andric
17460b57cec5SDimitry Andricclass BSET_B_DESC : MSA_3R_DESC_BASE<"bset.b", vbset_b, MSA128BOpnd>;
17470b57cec5SDimitry Andricclass BSET_H_DESC : MSA_3R_DESC_BASE<"bset.h", vbset_h, MSA128HOpnd>;
17480b57cec5SDimitry Andricclass BSET_W_DESC : MSA_3R_DESC_BASE<"bset.w", vbset_w, MSA128WOpnd>;
17490b57cec5SDimitry Andricclass BSET_D_DESC : MSA_3R_DESC_BASE<"bset.d", vbset_d, MSA128DOpnd>;
17500b57cec5SDimitry Andric
17510b57cec5SDimitry Andricclass BSETI_B_DESC : MSA_BIT_B_DESC_BASE<"bseti.b", or, vsplat_uimm_pow2,
17520b57cec5SDimitry Andric                                         MSA128BOpnd>;
17530b57cec5SDimitry Andricclass BSETI_H_DESC : MSA_BIT_H_DESC_BASE<"bseti.h", or, vsplat_uimm_pow2,
17540b57cec5SDimitry Andric                                         MSA128HOpnd>;
17550b57cec5SDimitry Andricclass BSETI_W_DESC : MSA_BIT_W_DESC_BASE<"bseti.w", or, vsplat_uimm_pow2,
17560b57cec5SDimitry Andric                                         MSA128WOpnd>;
17570b57cec5SDimitry Andricclass BSETI_D_DESC : MSA_BIT_D_DESC_BASE<"bseti.d", or, vsplat_uimm_pow2,
17580b57cec5SDimitry Andric                                         MSA128DOpnd>;
17590b57cec5SDimitry Andric
17600b57cec5SDimitry Andricclass BZ_B_DESC : MSA_CBRANCH_DESC_BASE<"bz.b", MSA128BOpnd>;
17610b57cec5SDimitry Andricclass BZ_H_DESC : MSA_CBRANCH_DESC_BASE<"bz.h", MSA128HOpnd>;
17620b57cec5SDimitry Andricclass BZ_W_DESC : MSA_CBRANCH_DESC_BASE<"bz.w", MSA128WOpnd>;
17630b57cec5SDimitry Andricclass BZ_D_DESC : MSA_CBRANCH_DESC_BASE<"bz.d", MSA128DOpnd>;
17640b57cec5SDimitry Andric
17650b57cec5SDimitry Andricclass BZ_V_DESC : MSA_CBRANCH_DESC_BASE<"bz.v", MSA128BOpnd>;
17660b57cec5SDimitry Andric
17670b57cec5SDimitry Andricclass CEQ_B_DESC : MSA_3R_DESC_BASE<"ceq.b", vseteq_v16i8, MSA128BOpnd>,
17680b57cec5SDimitry Andric                   IsCommutable;
17690b57cec5SDimitry Andricclass CEQ_H_DESC : MSA_3R_DESC_BASE<"ceq.h", vseteq_v8i16, MSA128HOpnd>,
17700b57cec5SDimitry Andric                   IsCommutable;
17710b57cec5SDimitry Andricclass CEQ_W_DESC : MSA_3R_DESC_BASE<"ceq.w", vseteq_v4i32, MSA128WOpnd>,
17720b57cec5SDimitry Andric                   IsCommutable;
17730b57cec5SDimitry Andricclass CEQ_D_DESC : MSA_3R_DESC_BASE<"ceq.d", vseteq_v2i64, MSA128DOpnd>,
17740b57cec5SDimitry Andric                   IsCommutable;
17750b57cec5SDimitry Andric
17760b57cec5SDimitry Andricclass CEQI_B_DESC : MSA_I5_DESC_BASE<"ceqi.b", vseteq_v16i8, vsplati8_simm5,
17770b57cec5SDimitry Andric                                     MSA128BOpnd>;
17780b57cec5SDimitry Andricclass CEQI_H_DESC : MSA_I5_DESC_BASE<"ceqi.h", vseteq_v8i16, vsplati16_simm5,
17790b57cec5SDimitry Andric                                     MSA128HOpnd>;
17800b57cec5SDimitry Andricclass CEQI_W_DESC : MSA_I5_DESC_BASE<"ceqi.w", vseteq_v4i32, vsplati32_simm5,
17810b57cec5SDimitry Andric                                     MSA128WOpnd>;
17820b57cec5SDimitry Andricclass CEQI_D_DESC : MSA_I5_DESC_BASE<"ceqi.d", vseteq_v2i64, vsplati64_simm5,
17830b57cec5SDimitry Andric                                     MSA128DOpnd>;
17840b57cec5SDimitry Andric
17850b57cec5SDimitry Andricclass CFCMSA_DESC {
17860b57cec5SDimitry Andric  dag OutOperandList = (outs GPR32Opnd:$rd);
17870b57cec5SDimitry Andric  dag InOperandList = (ins MSA128CROpnd:$cs);
17880b57cec5SDimitry Andric  string AsmString = "cfcmsa\t$rd, $cs";
17890b57cec5SDimitry Andric  InstrItinClass Itinerary = NoItinerary;
17900b57cec5SDimitry Andric  bit hasSideEffects = 1;
17910b57cec5SDimitry Andric  bit isMoveReg = 1;
17920b57cec5SDimitry Andric}
17930b57cec5SDimitry Andric
17940b57cec5SDimitry Andricclass CLE_S_B_DESC : MSA_3R_DESC_BASE<"cle_s.b", vsetle_v16i8, MSA128BOpnd>;
17950b57cec5SDimitry Andricclass CLE_S_H_DESC : MSA_3R_DESC_BASE<"cle_s.h", vsetle_v8i16, MSA128HOpnd>;
17960b57cec5SDimitry Andricclass CLE_S_W_DESC : MSA_3R_DESC_BASE<"cle_s.w", vsetle_v4i32, MSA128WOpnd>;
17970b57cec5SDimitry Andricclass CLE_S_D_DESC : MSA_3R_DESC_BASE<"cle_s.d", vsetle_v2i64, MSA128DOpnd>;
17980b57cec5SDimitry Andric
17990b57cec5SDimitry Andricclass CLE_U_B_DESC : MSA_3R_DESC_BASE<"cle_u.b", vsetule_v16i8, MSA128BOpnd>;
18000b57cec5SDimitry Andricclass CLE_U_H_DESC : MSA_3R_DESC_BASE<"cle_u.h", vsetule_v8i16, MSA128HOpnd>;
18010b57cec5SDimitry Andricclass CLE_U_W_DESC : MSA_3R_DESC_BASE<"cle_u.w", vsetule_v4i32, MSA128WOpnd>;
18020b57cec5SDimitry Andricclass CLE_U_D_DESC : MSA_3R_DESC_BASE<"cle_u.d", vsetule_v2i64, MSA128DOpnd>;
18030b57cec5SDimitry Andric
18040b57cec5SDimitry Andricclass CLEI_S_B_DESC : MSA_I5_DESC_BASE<"clei_s.b", vsetle_v16i8,
18050b57cec5SDimitry Andric                                       vsplati8_simm5,  MSA128BOpnd>;
18060b57cec5SDimitry Andricclass CLEI_S_H_DESC : MSA_I5_DESC_BASE<"clei_s.h", vsetle_v8i16,
18070b57cec5SDimitry Andric                                       vsplati16_simm5, MSA128HOpnd>;
18080b57cec5SDimitry Andricclass CLEI_S_W_DESC : MSA_I5_DESC_BASE<"clei_s.w", vsetle_v4i32,
18090b57cec5SDimitry Andric                                       vsplati32_simm5, MSA128WOpnd>;
18100b57cec5SDimitry Andricclass CLEI_S_D_DESC : MSA_I5_DESC_BASE<"clei_s.d", vsetle_v2i64,
18110b57cec5SDimitry Andric                                       vsplati64_simm5, MSA128DOpnd>;
18120b57cec5SDimitry Andric
18130b57cec5SDimitry Andricclass CLEI_U_B_DESC : MSA_I5_DESC_BASE<"clei_u.b", vsetule_v16i8,
18140b57cec5SDimitry Andric                                       vsplati8_uimm5,  MSA128BOpnd>;
18150b57cec5SDimitry Andricclass CLEI_U_H_DESC : MSA_I5_DESC_BASE<"clei_u.h", vsetule_v8i16,
18160b57cec5SDimitry Andric                                       vsplati16_uimm5, MSA128HOpnd>;
18170b57cec5SDimitry Andricclass CLEI_U_W_DESC : MSA_I5_DESC_BASE<"clei_u.w", vsetule_v4i32,
18180b57cec5SDimitry Andric                                       vsplati32_uimm5, MSA128WOpnd>;
18190b57cec5SDimitry Andricclass CLEI_U_D_DESC : MSA_I5_DESC_BASE<"clei_u.d", vsetule_v2i64,
18200b57cec5SDimitry Andric                                       vsplati64_uimm5, MSA128DOpnd>;
18210b57cec5SDimitry Andric
18220b57cec5SDimitry Andricclass CLT_S_B_DESC : MSA_3R_DESC_BASE<"clt_s.b", vsetlt_v16i8, MSA128BOpnd>;
18230b57cec5SDimitry Andricclass CLT_S_H_DESC : MSA_3R_DESC_BASE<"clt_s.h", vsetlt_v8i16, MSA128HOpnd>;
18240b57cec5SDimitry Andricclass CLT_S_W_DESC : MSA_3R_DESC_BASE<"clt_s.w", vsetlt_v4i32, MSA128WOpnd>;
18250b57cec5SDimitry Andricclass CLT_S_D_DESC : MSA_3R_DESC_BASE<"clt_s.d", vsetlt_v2i64, MSA128DOpnd>;
18260b57cec5SDimitry Andric
18270b57cec5SDimitry Andricclass CLT_U_B_DESC : MSA_3R_DESC_BASE<"clt_u.b", vsetult_v16i8, MSA128BOpnd>;
18280b57cec5SDimitry Andricclass CLT_U_H_DESC : MSA_3R_DESC_BASE<"clt_u.h", vsetult_v8i16, MSA128HOpnd>;
18290b57cec5SDimitry Andricclass CLT_U_W_DESC : MSA_3R_DESC_BASE<"clt_u.w", vsetult_v4i32, MSA128WOpnd>;
18300b57cec5SDimitry Andricclass CLT_U_D_DESC : MSA_3R_DESC_BASE<"clt_u.d", vsetult_v2i64, MSA128DOpnd>;
18310b57cec5SDimitry Andric
18320b57cec5SDimitry Andricclass CLTI_S_B_DESC : MSA_I5_DESC_BASE<"clti_s.b", vsetlt_v16i8,
18330b57cec5SDimitry Andric                                       vsplati8_simm5, MSA128BOpnd>;
18340b57cec5SDimitry Andricclass CLTI_S_H_DESC : MSA_I5_DESC_BASE<"clti_s.h", vsetlt_v8i16,
18350b57cec5SDimitry Andric                                       vsplati16_simm5, MSA128HOpnd>;
18360b57cec5SDimitry Andricclass CLTI_S_W_DESC : MSA_I5_DESC_BASE<"clti_s.w", vsetlt_v4i32,
18370b57cec5SDimitry Andric                                       vsplati32_simm5, MSA128WOpnd>;
18380b57cec5SDimitry Andricclass CLTI_S_D_DESC : MSA_I5_DESC_BASE<"clti_s.d", vsetlt_v2i64,
18390b57cec5SDimitry Andric                                       vsplati64_simm5, MSA128DOpnd>;
18400b57cec5SDimitry Andric
18410b57cec5SDimitry Andricclass CLTI_U_B_DESC : MSA_I5_DESC_BASE<"clti_u.b", vsetult_v16i8,
18420b57cec5SDimitry Andric                                       vsplati8_uimm5, MSA128BOpnd>;
18430b57cec5SDimitry Andricclass CLTI_U_H_DESC : MSA_I5_DESC_BASE<"clti_u.h", vsetult_v8i16,
18440b57cec5SDimitry Andric                                       vsplati16_uimm5, MSA128HOpnd>;
18450b57cec5SDimitry Andricclass CLTI_U_W_DESC : MSA_I5_DESC_BASE<"clti_u.w", vsetult_v4i32,
18460b57cec5SDimitry Andric                                       vsplati32_uimm5, MSA128WOpnd>;
18470b57cec5SDimitry Andricclass CLTI_U_D_DESC : MSA_I5_DESC_BASE<"clti_u.d", vsetult_v2i64,
18480b57cec5SDimitry Andric                                       vsplati64_uimm5, MSA128DOpnd>;
18490b57cec5SDimitry Andric
18500b57cec5SDimitry Andricclass COPY_S_B_DESC : MSA_COPY_DESC_BASE<"copy_s.b", vextract_sext_i8,  v16i8,
18510b57cec5SDimitry Andric                                         uimm4_ptr, immZExt4Ptr, GPR32Opnd,
18520b57cec5SDimitry Andric                                         MSA128BOpnd>;
18530b57cec5SDimitry Andricclass COPY_S_H_DESC : MSA_COPY_DESC_BASE<"copy_s.h", vextract_sext_i16, v8i16,
18540b57cec5SDimitry Andric                                         uimm3_ptr, immZExt3Ptr, GPR32Opnd,
18550b57cec5SDimitry Andric                                         MSA128HOpnd>;
18560b57cec5SDimitry Andricclass COPY_S_W_DESC : MSA_COPY_DESC_BASE<"copy_s.w", vextract_sext_i32, v4i32,
18570b57cec5SDimitry Andric                                         uimm2_ptr, immZExt2Ptr, GPR32Opnd,
18580b57cec5SDimitry Andric                                         MSA128WOpnd>;
18590b57cec5SDimitry Andricclass COPY_S_D_DESC : MSA_COPY_DESC_BASE<"copy_s.d", vextract_sext_i64, v2i64,
18600b57cec5SDimitry Andric                                         uimm1_ptr, immZExt1Ptr, GPR64Opnd,
18610b57cec5SDimitry Andric                                         MSA128DOpnd>;
18620b57cec5SDimitry Andric
18630b57cec5SDimitry Andricclass COPY_U_B_DESC : MSA_COPY_DESC_BASE<"copy_u.b", vextract_zext_i8,  v16i8,
18640b57cec5SDimitry Andric                                         uimm4_ptr, immZExt4Ptr, GPR32Opnd,
18650b57cec5SDimitry Andric                                         MSA128BOpnd>;
18660b57cec5SDimitry Andricclass COPY_U_H_DESC : MSA_COPY_DESC_BASE<"copy_u.h", vextract_zext_i16, v8i16,
18670b57cec5SDimitry Andric                                         uimm3_ptr, immZExt3Ptr, GPR32Opnd,
18680b57cec5SDimitry Andric                                         MSA128HOpnd>;
18690b57cec5SDimitry Andricclass COPY_U_W_DESC : MSA_COPY_DESC_BASE<"copy_u.w", vextract_zext_i32, v4i32,
18700b57cec5SDimitry Andric                                         uimm2_ptr, immZExt2Ptr, GPR32Opnd,
18710b57cec5SDimitry Andric                                         MSA128WOpnd>;
18720b57cec5SDimitry Andric
18730b57cec5SDimitry Andricclass COPY_FW_PSEUDO_DESC : MSA_COPY_PSEUDO_BASE<vector_extract, v4f32,
18740b57cec5SDimitry Andric                                                 uimm2_ptr, immZExt2Ptr, FGR32,
18750b57cec5SDimitry Andric                                                 MSA128W>;
18760b57cec5SDimitry Andricclass COPY_FD_PSEUDO_DESC : MSA_COPY_PSEUDO_BASE<vector_extract, v2f64,
18770b57cec5SDimitry Andric                                                 uimm1_ptr, immZExt1Ptr, FGR64,
18780b57cec5SDimitry Andric                                                 MSA128D>;
18790b57cec5SDimitry Andric
18800b57cec5SDimitry Andricclass CTCMSA_DESC {
18810b57cec5SDimitry Andric  dag OutOperandList = (outs);
18820b57cec5SDimitry Andric  dag InOperandList = (ins MSA128CROpnd:$cd, GPR32Opnd:$rs);
18830b57cec5SDimitry Andric  string AsmString = "ctcmsa\t$cd, $rs";
18840b57cec5SDimitry Andric  InstrItinClass Itinerary = NoItinerary;
18850b57cec5SDimitry Andric  bit hasSideEffects = 1;
18860b57cec5SDimitry Andric  bit isMoveReg = 1;
18870b57cec5SDimitry Andric}
18880b57cec5SDimitry Andric
18890b57cec5SDimitry Andricclass DIV_S_B_DESC : MSA_3R_DESC_BASE<"div_s.b", sdiv, MSA128BOpnd>;
18900b57cec5SDimitry Andricclass DIV_S_H_DESC : MSA_3R_DESC_BASE<"div_s.h", sdiv, MSA128HOpnd>;
18910b57cec5SDimitry Andricclass DIV_S_W_DESC : MSA_3R_DESC_BASE<"div_s.w", sdiv, MSA128WOpnd>;
18920b57cec5SDimitry Andricclass DIV_S_D_DESC : MSA_3R_DESC_BASE<"div_s.d", sdiv, MSA128DOpnd>;
18930b57cec5SDimitry Andric
18940b57cec5SDimitry Andricclass DIV_U_B_DESC : MSA_3R_DESC_BASE<"div_u.b", udiv, MSA128BOpnd>;
18950b57cec5SDimitry Andricclass DIV_U_H_DESC : MSA_3R_DESC_BASE<"div_u.h", udiv, MSA128HOpnd>;
18960b57cec5SDimitry Andricclass DIV_U_W_DESC : MSA_3R_DESC_BASE<"div_u.w", udiv, MSA128WOpnd>;
18970b57cec5SDimitry Andricclass DIV_U_D_DESC : MSA_3R_DESC_BASE<"div_u.d", udiv, MSA128DOpnd>;
18980b57cec5SDimitry Andric
18990b57cec5SDimitry Andricclass DOTP_S_H_DESC : MSA_3R_DESC_BASE<"dotp_s.h", int_mips_dotp_s_h,
19000b57cec5SDimitry Andric                                       MSA128HOpnd, MSA128BOpnd, MSA128BOpnd>,
19010b57cec5SDimitry Andric                      IsCommutable;
19020b57cec5SDimitry Andricclass DOTP_S_W_DESC : MSA_3R_DESC_BASE<"dotp_s.w", int_mips_dotp_s_w,
19030b57cec5SDimitry Andric                                       MSA128WOpnd, MSA128HOpnd, MSA128HOpnd>,
19040b57cec5SDimitry Andric                      IsCommutable;
19050b57cec5SDimitry Andricclass DOTP_S_D_DESC : MSA_3R_DESC_BASE<"dotp_s.d", int_mips_dotp_s_d,
19060b57cec5SDimitry Andric                                       MSA128DOpnd, MSA128WOpnd, MSA128WOpnd>,
19070b57cec5SDimitry Andric                      IsCommutable;
19080b57cec5SDimitry Andric
19090b57cec5SDimitry Andricclass DOTP_U_H_DESC : MSA_3R_DESC_BASE<"dotp_u.h", int_mips_dotp_u_h,
19100b57cec5SDimitry Andric                                       MSA128HOpnd, MSA128BOpnd, MSA128BOpnd>,
19110b57cec5SDimitry Andric                      IsCommutable;
19120b57cec5SDimitry Andricclass DOTP_U_W_DESC : MSA_3R_DESC_BASE<"dotp_u.w", int_mips_dotp_u_w,
19130b57cec5SDimitry Andric                                       MSA128WOpnd, MSA128HOpnd, MSA128HOpnd>,
19140b57cec5SDimitry Andric                      IsCommutable;
19150b57cec5SDimitry Andricclass DOTP_U_D_DESC : MSA_3R_DESC_BASE<"dotp_u.d", int_mips_dotp_u_d,
19160b57cec5SDimitry Andric                                       MSA128DOpnd, MSA128WOpnd, MSA128WOpnd>,
19170b57cec5SDimitry Andric                      IsCommutable;
19180b57cec5SDimitry Andric
19190b57cec5SDimitry Andricclass DPADD_S_H_DESC : MSA_3R_4R_DESC_BASE<"dpadd_s.h", int_mips_dpadd_s_h,
19200b57cec5SDimitry Andric                                           MSA128HOpnd, MSA128BOpnd,
19210b57cec5SDimitry Andric                                           MSA128BOpnd>, IsCommutable;
19220b57cec5SDimitry Andricclass DPADD_S_W_DESC : MSA_3R_4R_DESC_BASE<"dpadd_s.w", int_mips_dpadd_s_w,
19230b57cec5SDimitry Andric                                           MSA128WOpnd, MSA128HOpnd,
19240b57cec5SDimitry Andric                                           MSA128HOpnd>, IsCommutable;
19250b57cec5SDimitry Andricclass DPADD_S_D_DESC : MSA_3R_4R_DESC_BASE<"dpadd_s.d", int_mips_dpadd_s_d,
19260b57cec5SDimitry Andric                                           MSA128DOpnd, MSA128WOpnd,
19270b57cec5SDimitry Andric                                           MSA128WOpnd>, IsCommutable;
19280b57cec5SDimitry Andric
19290b57cec5SDimitry Andricclass DPADD_U_H_DESC : MSA_3R_4R_DESC_BASE<"dpadd_u.h", int_mips_dpadd_u_h,
19300b57cec5SDimitry Andric                                           MSA128HOpnd, MSA128BOpnd,
19310b57cec5SDimitry Andric                                           MSA128BOpnd>, IsCommutable;
19320b57cec5SDimitry Andricclass DPADD_U_W_DESC : MSA_3R_4R_DESC_BASE<"dpadd_u.w", int_mips_dpadd_u_w,
19330b57cec5SDimitry Andric                                           MSA128WOpnd, MSA128HOpnd,
19340b57cec5SDimitry Andric                                           MSA128HOpnd>, IsCommutable;
19350b57cec5SDimitry Andricclass DPADD_U_D_DESC : MSA_3R_4R_DESC_BASE<"dpadd_u.d", int_mips_dpadd_u_d,
19360b57cec5SDimitry Andric                                           MSA128DOpnd, MSA128WOpnd,
19370b57cec5SDimitry Andric                                           MSA128WOpnd>, IsCommutable;
19380b57cec5SDimitry Andric
19390b57cec5SDimitry Andricclass DPSUB_S_H_DESC : MSA_3R_4R_DESC_BASE<"dpsub_s.h", int_mips_dpsub_s_h,
19400b57cec5SDimitry Andric                                           MSA128HOpnd, MSA128BOpnd,
19410b57cec5SDimitry Andric                                           MSA128BOpnd>;
19420b57cec5SDimitry Andricclass DPSUB_S_W_DESC : MSA_3R_4R_DESC_BASE<"dpsub_s.w", int_mips_dpsub_s_w,
19430b57cec5SDimitry Andric                                           MSA128WOpnd, MSA128HOpnd,
19440b57cec5SDimitry Andric                                           MSA128HOpnd>;
19450b57cec5SDimitry Andricclass DPSUB_S_D_DESC : MSA_3R_4R_DESC_BASE<"dpsub_s.d", int_mips_dpsub_s_d,
19460b57cec5SDimitry Andric                                           MSA128DOpnd, MSA128WOpnd,
19470b57cec5SDimitry Andric                                           MSA128WOpnd>;
19480b57cec5SDimitry Andric
19490b57cec5SDimitry Andricclass DPSUB_U_H_DESC : MSA_3R_4R_DESC_BASE<"dpsub_u.h", int_mips_dpsub_u_h,
19500b57cec5SDimitry Andric                                           MSA128HOpnd, MSA128BOpnd,
19510b57cec5SDimitry Andric                                           MSA128BOpnd>;
19520b57cec5SDimitry Andricclass DPSUB_U_W_DESC : MSA_3R_4R_DESC_BASE<"dpsub_u.w", int_mips_dpsub_u_w,
19530b57cec5SDimitry Andric                                           MSA128WOpnd, MSA128HOpnd,
19540b57cec5SDimitry Andric                                           MSA128HOpnd>;
19550b57cec5SDimitry Andricclass DPSUB_U_D_DESC : MSA_3R_4R_DESC_BASE<"dpsub_u.d", int_mips_dpsub_u_d,
19560b57cec5SDimitry Andric                                           MSA128DOpnd, MSA128WOpnd,
19570b57cec5SDimitry Andric                                           MSA128WOpnd>;
19580b57cec5SDimitry Andric
19590b57cec5SDimitry Andricclass FADD_W_DESC : MSA_3RF_DESC_BASE<"fadd.w", fadd, MSA128WOpnd>,
19600b57cec5SDimitry Andric                    IsCommutable;
19610b57cec5SDimitry Andricclass FADD_D_DESC : MSA_3RF_DESC_BASE<"fadd.d", fadd, MSA128DOpnd>,
19620b57cec5SDimitry Andric                    IsCommutable;
19630b57cec5SDimitry Andric
19640b57cec5SDimitry Andricclass FCAF_W_DESC : MSA_3RF_DESC_BASE<"fcaf.w", int_mips_fcaf_w, MSA128WOpnd>,
19650b57cec5SDimitry Andric                    IsCommutable;
19660b57cec5SDimitry Andricclass FCAF_D_DESC : MSA_3RF_DESC_BASE<"fcaf.d", int_mips_fcaf_d, MSA128DOpnd>,
19670b57cec5SDimitry Andric                    IsCommutable;
19680b57cec5SDimitry Andric
19690b57cec5SDimitry Andricclass FCEQ_W_DESC : MSA_3RF_DESC_BASE<"fceq.w", vfsetoeq_v4f32, MSA128WOpnd>,
19700b57cec5SDimitry Andric                    IsCommutable;
19710b57cec5SDimitry Andricclass FCEQ_D_DESC : MSA_3RF_DESC_BASE<"fceq.d", vfsetoeq_v2f64, MSA128DOpnd>,
19720b57cec5SDimitry Andric                    IsCommutable;
19730b57cec5SDimitry Andric
19740b57cec5SDimitry Andricclass FCLASS_W_DESC : MSA_2RF_DESC_BASE<"fclass.w", int_mips_fclass_w,
19750b57cec5SDimitry Andric                                        MSA128WOpnd>;
19760b57cec5SDimitry Andricclass FCLASS_D_DESC : MSA_2RF_DESC_BASE<"fclass.d", int_mips_fclass_d,
19770b57cec5SDimitry Andric                                        MSA128DOpnd>;
19780b57cec5SDimitry Andric
19790b57cec5SDimitry Andricclass FCLE_W_DESC : MSA_3RF_DESC_BASE<"fcle.w", vfsetole_v4f32, MSA128WOpnd>;
19800b57cec5SDimitry Andricclass FCLE_D_DESC : MSA_3RF_DESC_BASE<"fcle.d", vfsetole_v2f64, MSA128DOpnd>;
19810b57cec5SDimitry Andric
19820b57cec5SDimitry Andricclass FCLT_W_DESC : MSA_3RF_DESC_BASE<"fclt.w", vfsetolt_v4f32, MSA128WOpnd>;
19830b57cec5SDimitry Andricclass FCLT_D_DESC : MSA_3RF_DESC_BASE<"fclt.d", vfsetolt_v2f64, MSA128DOpnd>;
19840b57cec5SDimitry Andric
19850b57cec5SDimitry Andricclass FCNE_W_DESC : MSA_3RF_DESC_BASE<"fcne.w", vfsetone_v4f32, MSA128WOpnd>,
19860b57cec5SDimitry Andric                    IsCommutable;
19870b57cec5SDimitry Andricclass FCNE_D_DESC : MSA_3RF_DESC_BASE<"fcne.d", vfsetone_v2f64, MSA128DOpnd>,
19880b57cec5SDimitry Andric                    IsCommutable;
19890b57cec5SDimitry Andric
19900b57cec5SDimitry Andricclass FCOR_W_DESC : MSA_3RF_DESC_BASE<"fcor.w", vfsetord_v4f32, MSA128WOpnd>,
19910b57cec5SDimitry Andric                    IsCommutable;
19920b57cec5SDimitry Andricclass FCOR_D_DESC : MSA_3RF_DESC_BASE<"fcor.d", vfsetord_v2f64, MSA128DOpnd>,
19930b57cec5SDimitry Andric                    IsCommutable;
19940b57cec5SDimitry Andric
19950b57cec5SDimitry Andricclass FCUEQ_W_DESC : MSA_3RF_DESC_BASE<"fcueq.w", vfsetueq_v4f32, MSA128WOpnd>,
19960b57cec5SDimitry Andric                     IsCommutable;
19970b57cec5SDimitry Andricclass FCUEQ_D_DESC : MSA_3RF_DESC_BASE<"fcueq.d", vfsetueq_v2f64, MSA128DOpnd>,
19980b57cec5SDimitry Andric                     IsCommutable;
19990b57cec5SDimitry Andric
20000b57cec5SDimitry Andricclass FCULE_W_DESC : MSA_3RF_DESC_BASE<"fcule.w", vfsetule_v4f32, MSA128WOpnd>,
20010b57cec5SDimitry Andric                     IsCommutable;
20020b57cec5SDimitry Andricclass FCULE_D_DESC : MSA_3RF_DESC_BASE<"fcule.d", vfsetule_v2f64, MSA128DOpnd>,
20030b57cec5SDimitry Andric                     IsCommutable;
20040b57cec5SDimitry Andric
20050b57cec5SDimitry Andricclass FCULT_W_DESC : MSA_3RF_DESC_BASE<"fcult.w", vfsetult_v4f32, MSA128WOpnd>,
20060b57cec5SDimitry Andric                     IsCommutable;
20070b57cec5SDimitry Andricclass FCULT_D_DESC : MSA_3RF_DESC_BASE<"fcult.d", vfsetult_v2f64, MSA128DOpnd>,
20080b57cec5SDimitry Andric                     IsCommutable;
20090b57cec5SDimitry Andric
20100b57cec5SDimitry Andricclass FCUN_W_DESC : MSA_3RF_DESC_BASE<"fcun.w", vfsetun_v4f32, MSA128WOpnd>,
20110b57cec5SDimitry Andric                    IsCommutable;
20120b57cec5SDimitry Andricclass FCUN_D_DESC : MSA_3RF_DESC_BASE<"fcun.d", vfsetun_v2f64, MSA128DOpnd>,
20130b57cec5SDimitry Andric                    IsCommutable;
20140b57cec5SDimitry Andric
20150b57cec5SDimitry Andricclass FCUNE_W_DESC : MSA_3RF_DESC_BASE<"fcune.w", vfsetune_v4f32, MSA128WOpnd>,
20160b57cec5SDimitry Andric                     IsCommutable;
20170b57cec5SDimitry Andricclass FCUNE_D_DESC : MSA_3RF_DESC_BASE<"fcune.d", vfsetune_v2f64, MSA128DOpnd>,
20180b57cec5SDimitry Andric                     IsCommutable;
20190b57cec5SDimitry Andric
20200b57cec5SDimitry Andricclass FDIV_W_DESC : MSA_3RF_DESC_BASE<"fdiv.w", fdiv, MSA128WOpnd>;
20210b57cec5SDimitry Andricclass FDIV_D_DESC : MSA_3RF_DESC_BASE<"fdiv.d", fdiv, MSA128DOpnd>;
20220b57cec5SDimitry Andric
20230b57cec5SDimitry Andricclass FEXDO_H_DESC : MSA_3RF_DESC_BASE<"fexdo.h", int_mips_fexdo_h,
20240b57cec5SDimitry Andric                                       MSA128HOpnd, MSA128WOpnd, MSA128WOpnd>;
20250b57cec5SDimitry Andricclass FEXDO_W_DESC : MSA_3RF_DESC_BASE<"fexdo.w", int_mips_fexdo_w,
20260b57cec5SDimitry Andric                                       MSA128WOpnd, MSA128DOpnd, MSA128DOpnd>;
20270b57cec5SDimitry Andric
20280b57cec5SDimitry Andric// The fexp2.df instruction multiplies the first operand by 2 to the power of
20290b57cec5SDimitry Andric// the second operand. We therefore need a pseudo-insn in order to invent the
20300b57cec5SDimitry Andric// 1.0 when we only need to match ISD::FEXP2.
20310b57cec5SDimitry Andricclass FEXP2_W_DESC : MSA_3RF_DESC_BASE<"fexp2.w", mul_fexp2, MSA128WOpnd>;
20320b57cec5SDimitry Andricclass FEXP2_D_DESC : MSA_3RF_DESC_BASE<"fexp2.d", mul_fexp2, MSA128DOpnd>;
20330b57cec5SDimitry Andriclet usesCustomInserter = 1, hasNoSchedulingInfo = 1 in {
20340b57cec5SDimitry Andric  class FEXP2_W_1_PSEUDO_DESC :
20350b57cec5SDimitry Andric      MSAPseudo<(outs MSA128W:$wd), (ins MSA128W:$ws),
20360b57cec5SDimitry Andric                [(set MSA128W:$wd, (fexp2 MSA128W:$ws))]>;
20370b57cec5SDimitry Andric  class FEXP2_D_1_PSEUDO_DESC :
20380b57cec5SDimitry Andric      MSAPseudo<(outs MSA128D:$wd), (ins MSA128D:$ws),
20390b57cec5SDimitry Andric                [(set MSA128D:$wd, (fexp2 MSA128D:$ws))]>;
20400b57cec5SDimitry Andric}
20410b57cec5SDimitry Andric
20420b57cec5SDimitry Andricclass FEXUPL_W_DESC : MSA_2RF_DESC_BASE<"fexupl.w", int_mips_fexupl_w,
20430b57cec5SDimitry Andric                                        MSA128WOpnd, MSA128HOpnd>;
20440b57cec5SDimitry Andricclass FEXUPL_D_DESC : MSA_2RF_DESC_BASE<"fexupl.d", int_mips_fexupl_d,
20450b57cec5SDimitry Andric                                        MSA128DOpnd, MSA128WOpnd>;
20460b57cec5SDimitry Andric
20470b57cec5SDimitry Andricclass FEXUPR_W_DESC : MSA_2RF_DESC_BASE<"fexupr.w", int_mips_fexupr_w,
20480b57cec5SDimitry Andric                                        MSA128WOpnd, MSA128HOpnd>;
20490b57cec5SDimitry Andricclass FEXUPR_D_DESC : MSA_2RF_DESC_BASE<"fexupr.d", int_mips_fexupr_d,
20500b57cec5SDimitry Andric                                        MSA128DOpnd, MSA128WOpnd>;
20510b57cec5SDimitry Andric
20520b57cec5SDimitry Andricclass FFINT_S_W_DESC : MSA_2RF_DESC_BASE<"ffint_s.w", sint_to_fp, MSA128WOpnd>;
20530b57cec5SDimitry Andricclass FFINT_S_D_DESC : MSA_2RF_DESC_BASE<"ffint_s.d", sint_to_fp, MSA128DOpnd>;
20540b57cec5SDimitry Andric
20550b57cec5SDimitry Andricclass FFINT_U_W_DESC : MSA_2RF_DESC_BASE<"ffint_u.w", uint_to_fp, MSA128WOpnd>;
20560b57cec5SDimitry Andricclass FFINT_U_D_DESC : MSA_2RF_DESC_BASE<"ffint_u.d", uint_to_fp, MSA128DOpnd>;
20570b57cec5SDimitry Andric
20580b57cec5SDimitry Andricclass FFQL_W_DESC : MSA_2RF_DESC_BASE<"ffql.w", int_mips_ffql_w,
20590b57cec5SDimitry Andric                                      MSA128WOpnd, MSA128HOpnd>;
20600b57cec5SDimitry Andricclass FFQL_D_DESC : MSA_2RF_DESC_BASE<"ffql.d", int_mips_ffql_d,
20610b57cec5SDimitry Andric                                      MSA128DOpnd, MSA128WOpnd>;
20620b57cec5SDimitry Andric
20630b57cec5SDimitry Andricclass FFQR_W_DESC : MSA_2RF_DESC_BASE<"ffqr.w", int_mips_ffqr_w,
20640b57cec5SDimitry Andric                                      MSA128WOpnd, MSA128HOpnd>;
20650b57cec5SDimitry Andricclass FFQR_D_DESC : MSA_2RF_DESC_BASE<"ffqr.d", int_mips_ffqr_d,
20660b57cec5SDimitry Andric                                      MSA128DOpnd, MSA128WOpnd>;
20670b57cec5SDimitry Andric
20680b57cec5SDimitry Andricclass FILL_B_DESC : MSA_2R_FILL_DESC_BASE<"fill.b", v16i8, vsplati8,
20690b57cec5SDimitry Andric                                          MSA128BOpnd, GPR32Opnd>;
20700b57cec5SDimitry Andricclass FILL_H_DESC : MSA_2R_FILL_DESC_BASE<"fill.h", v8i16, vsplati16,
20710b57cec5SDimitry Andric                                          MSA128HOpnd, GPR32Opnd>;
20720b57cec5SDimitry Andricclass FILL_W_DESC : MSA_2R_FILL_DESC_BASE<"fill.w", v4i32, vsplati32,
20730b57cec5SDimitry Andric                                          MSA128WOpnd, GPR32Opnd>;
20740b57cec5SDimitry Andricclass FILL_D_DESC : MSA_2R_FILL_DESC_BASE<"fill.d", v2i64, vsplati64,
20750b57cec5SDimitry Andric                                          MSA128DOpnd, GPR64Opnd>;
20760b57cec5SDimitry Andric
2077349cc55cSDimitry Andricclass FILL_FW_PSEUDO_DESC : MSA_2R_FILL_PSEUDO_BASE<vsplatf32, MSA128W, FGR32>;
2078349cc55cSDimitry Andricclass FILL_FD_PSEUDO_DESC : MSA_2R_FILL_PSEUDO_BASE<vsplatf64, MSA128D, FGR64>;
20790b57cec5SDimitry Andric
20800b57cec5SDimitry Andricclass FLOG2_W_DESC : MSA_2RF_DESC_BASE<"flog2.w", flog2, MSA128WOpnd>;
20810b57cec5SDimitry Andricclass FLOG2_D_DESC : MSA_2RF_DESC_BASE<"flog2.d", flog2, MSA128DOpnd>;
20820b57cec5SDimitry Andric
20830b57cec5SDimitry Andricclass FMADD_W_DESC : MSA_3RF_4RF_DESC_BASE<"fmadd.w", fma, MSA128WOpnd>;
20840b57cec5SDimitry Andricclass FMADD_D_DESC : MSA_3RF_4RF_DESC_BASE<"fmadd.d", fma, MSA128DOpnd>;
20850b57cec5SDimitry Andric
20860b57cec5SDimitry Andricclass FMAX_W_DESC : MSA_3RF_DESC_BASE<"fmax.w", int_mips_fmax_w, MSA128WOpnd>;
20870b57cec5SDimitry Andricclass FMAX_D_DESC : MSA_3RF_DESC_BASE<"fmax.d", int_mips_fmax_d, MSA128DOpnd>;
20880b57cec5SDimitry Andric
20890b57cec5SDimitry Andricclass FMAX_A_W_DESC : MSA_3RF_DESC_BASE<"fmax_a.w", int_mips_fmax_a_w,
20900b57cec5SDimitry Andric                                        MSA128WOpnd>;
20910b57cec5SDimitry Andricclass FMAX_A_D_DESC : MSA_3RF_DESC_BASE<"fmax_a.d", int_mips_fmax_a_d,
20920b57cec5SDimitry Andric                                        MSA128DOpnd>;
20930b57cec5SDimitry Andric
20940b57cec5SDimitry Andricclass FMIN_W_DESC : MSA_3RF_DESC_BASE<"fmin.w", int_mips_fmin_w, MSA128WOpnd>;
20950b57cec5SDimitry Andricclass FMIN_D_DESC : MSA_3RF_DESC_BASE<"fmin.d", int_mips_fmin_d, MSA128DOpnd>;
20960b57cec5SDimitry Andric
20970b57cec5SDimitry Andricclass FMIN_A_W_DESC : MSA_3RF_DESC_BASE<"fmin_a.w", int_mips_fmin_a_w,
20980b57cec5SDimitry Andric                                        MSA128WOpnd>;
20990b57cec5SDimitry Andricclass FMIN_A_D_DESC : MSA_3RF_DESC_BASE<"fmin_a.d", int_mips_fmin_a_d,
21000b57cec5SDimitry Andric                                        MSA128DOpnd>;
21010b57cec5SDimitry Andric
21020b57cec5SDimitry Andricclass FMSUB_W_DESC : MSA_3RF_4RF_DESC_BASE<"fmsub.w", MipsFMS, MSA128WOpnd>;
21030b57cec5SDimitry Andricclass FMSUB_D_DESC : MSA_3RF_4RF_DESC_BASE<"fmsub.d", MipsFMS, MSA128DOpnd>;
21040b57cec5SDimitry Andric
21050b57cec5SDimitry Andricclass FMUL_W_DESC : MSA_3RF_DESC_BASE<"fmul.w", fmul, MSA128WOpnd>;
21060b57cec5SDimitry Andricclass FMUL_D_DESC : MSA_3RF_DESC_BASE<"fmul.d", fmul, MSA128DOpnd>;
21070b57cec5SDimitry Andric
21080b57cec5SDimitry Andricclass FRINT_W_DESC : MSA_2RF_DESC_BASE<"frint.w", frint, MSA128WOpnd>;
21090b57cec5SDimitry Andricclass FRINT_D_DESC : MSA_2RF_DESC_BASE<"frint.d", frint, MSA128DOpnd>;
21100b57cec5SDimitry Andric
21110b57cec5SDimitry Andricclass FRCP_W_DESC : MSA_2RF_DESC_BASE<"frcp.w", int_mips_frcp_w, MSA128WOpnd>;
21120b57cec5SDimitry Andricclass FRCP_D_DESC : MSA_2RF_DESC_BASE<"frcp.d", int_mips_frcp_d, MSA128DOpnd>;
21130b57cec5SDimitry Andric
21140b57cec5SDimitry Andricclass FRSQRT_W_DESC : MSA_2RF_DESC_BASE<"frsqrt.w", int_mips_frsqrt_w,
21150b57cec5SDimitry Andric                                        MSA128WOpnd>;
21160b57cec5SDimitry Andricclass FRSQRT_D_DESC : MSA_2RF_DESC_BASE<"frsqrt.d", int_mips_frsqrt_d,
21170b57cec5SDimitry Andric                                        MSA128DOpnd>;
21180b57cec5SDimitry Andric
21190b57cec5SDimitry Andricclass FSAF_W_DESC : MSA_3RF_DESC_BASE<"fsaf.w", int_mips_fsaf_w, MSA128WOpnd>;
21200b57cec5SDimitry Andricclass FSAF_D_DESC : MSA_3RF_DESC_BASE<"fsaf.d", int_mips_fsaf_d, MSA128DOpnd>;
21210b57cec5SDimitry Andric
21220b57cec5SDimitry Andricclass FSEQ_W_DESC : MSA_3RF_DESC_BASE<"fseq.w", int_mips_fseq_w, MSA128WOpnd>;
21230b57cec5SDimitry Andricclass FSEQ_D_DESC : MSA_3RF_DESC_BASE<"fseq.d", int_mips_fseq_d, MSA128DOpnd>;
21240b57cec5SDimitry Andric
21250b57cec5SDimitry Andricclass FSLE_W_DESC : MSA_3RF_DESC_BASE<"fsle.w", int_mips_fsle_w, MSA128WOpnd>;
21260b57cec5SDimitry Andricclass FSLE_D_DESC : MSA_3RF_DESC_BASE<"fsle.d", int_mips_fsle_d, MSA128DOpnd>;
21270b57cec5SDimitry Andric
21280b57cec5SDimitry Andricclass FSLT_W_DESC : MSA_3RF_DESC_BASE<"fslt.w", int_mips_fslt_w, MSA128WOpnd>;
21290b57cec5SDimitry Andricclass FSLT_D_DESC : MSA_3RF_DESC_BASE<"fslt.d", int_mips_fslt_d, MSA128DOpnd>;
21300b57cec5SDimitry Andric
21310b57cec5SDimitry Andricclass FSNE_W_DESC : MSA_3RF_DESC_BASE<"fsne.w", int_mips_fsne_w, MSA128WOpnd>;
21320b57cec5SDimitry Andricclass FSNE_D_DESC : MSA_3RF_DESC_BASE<"fsne.d", int_mips_fsne_d, MSA128DOpnd>;
21330b57cec5SDimitry Andric
21340b57cec5SDimitry Andricclass FSOR_W_DESC : MSA_3RF_DESC_BASE<"fsor.w", int_mips_fsor_w, MSA128WOpnd>;
21350b57cec5SDimitry Andricclass FSOR_D_DESC : MSA_3RF_DESC_BASE<"fsor.d", int_mips_fsor_d, MSA128DOpnd>;
21360b57cec5SDimitry Andric
21370b57cec5SDimitry Andricclass FSQRT_W_DESC : MSA_2RF_DESC_BASE<"fsqrt.w", fsqrt, MSA128WOpnd>;
21380b57cec5SDimitry Andricclass FSQRT_D_DESC : MSA_2RF_DESC_BASE<"fsqrt.d", fsqrt, MSA128DOpnd>;
21390b57cec5SDimitry Andric
21400b57cec5SDimitry Andricclass FSUB_W_DESC : MSA_3RF_DESC_BASE<"fsub.w", fsub, MSA128WOpnd>;
21410b57cec5SDimitry Andricclass FSUB_D_DESC : MSA_3RF_DESC_BASE<"fsub.d", fsub, MSA128DOpnd>;
21420b57cec5SDimitry Andric
21430b57cec5SDimitry Andricclass FSUEQ_W_DESC : MSA_3RF_DESC_BASE<"fsueq.w", int_mips_fsueq_w,
21440b57cec5SDimitry Andric                                       MSA128WOpnd>;
21450b57cec5SDimitry Andricclass FSUEQ_D_DESC : MSA_3RF_DESC_BASE<"fsueq.d", int_mips_fsueq_d,
21460b57cec5SDimitry Andric                                       MSA128DOpnd>;
21470b57cec5SDimitry Andric
21480b57cec5SDimitry Andricclass FSULE_W_DESC : MSA_3RF_DESC_BASE<"fsule.w", int_mips_fsule_w,
21490b57cec5SDimitry Andric                                       MSA128WOpnd>;
21500b57cec5SDimitry Andricclass FSULE_D_DESC : MSA_3RF_DESC_BASE<"fsule.d", int_mips_fsule_d,
21510b57cec5SDimitry Andric                                       MSA128DOpnd>;
21520b57cec5SDimitry Andric
21530b57cec5SDimitry Andricclass FSULT_W_DESC : MSA_3RF_DESC_BASE<"fsult.w", int_mips_fsult_w,
21540b57cec5SDimitry Andric                                       MSA128WOpnd>;
21550b57cec5SDimitry Andricclass FSULT_D_DESC : MSA_3RF_DESC_BASE<"fsult.d", int_mips_fsult_d,
21560b57cec5SDimitry Andric                                       MSA128DOpnd>;
21570b57cec5SDimitry Andric
21580b57cec5SDimitry Andricclass FSUN_W_DESC : MSA_3RF_DESC_BASE<"fsun.w", int_mips_fsun_w,
21590b57cec5SDimitry Andric                                      MSA128WOpnd>;
21600b57cec5SDimitry Andricclass FSUN_D_DESC : MSA_3RF_DESC_BASE<"fsun.d", int_mips_fsun_d,
21610b57cec5SDimitry Andric                                      MSA128DOpnd>;
21620b57cec5SDimitry Andric
21630b57cec5SDimitry Andricclass FSUNE_W_DESC : MSA_3RF_DESC_BASE<"fsune.w", int_mips_fsune_w,
21640b57cec5SDimitry Andric                                       MSA128WOpnd>;
21650b57cec5SDimitry Andricclass FSUNE_D_DESC : MSA_3RF_DESC_BASE<"fsune.d", int_mips_fsune_d,
21660b57cec5SDimitry Andric                                       MSA128DOpnd>;
21670b57cec5SDimitry Andric
21680b57cec5SDimitry Andricclass FTINT_S_W_DESC : MSA_2RF_DESC_BASE<"ftint_s.w", int_mips_ftint_s_w,
21690b57cec5SDimitry Andric                                         MSA128WOpnd>;
21700b57cec5SDimitry Andricclass FTINT_S_D_DESC : MSA_2RF_DESC_BASE<"ftint_s.d", int_mips_ftint_s_d,
21710b57cec5SDimitry Andric                                         MSA128DOpnd>;
21720b57cec5SDimitry Andric
21730b57cec5SDimitry Andricclass FTINT_U_W_DESC : MSA_2RF_DESC_BASE<"ftint_u.w", int_mips_ftint_u_w,
21740b57cec5SDimitry Andric                                         MSA128WOpnd>;
21750b57cec5SDimitry Andricclass FTINT_U_D_DESC : MSA_2RF_DESC_BASE<"ftint_u.d", int_mips_ftint_u_d,
21760b57cec5SDimitry Andric                                         MSA128DOpnd>;
21770b57cec5SDimitry Andric
21780b57cec5SDimitry Andricclass FTQ_H_DESC : MSA_3RF_DESC_BASE<"ftq.h", int_mips_ftq_h,
21790b57cec5SDimitry Andric                                     MSA128HOpnd, MSA128WOpnd, MSA128WOpnd>;
21800b57cec5SDimitry Andricclass FTQ_W_DESC : MSA_3RF_DESC_BASE<"ftq.w", int_mips_ftq_w,
21810b57cec5SDimitry Andric                                     MSA128WOpnd, MSA128DOpnd, MSA128DOpnd>;
21820b57cec5SDimitry Andric
21830b57cec5SDimitry Andricclass FTRUNC_S_W_DESC : MSA_2RF_DESC_BASE<"ftrunc_s.w", fp_to_sint,
21840b57cec5SDimitry Andric                                          MSA128WOpnd>;
21850b57cec5SDimitry Andricclass FTRUNC_S_D_DESC : MSA_2RF_DESC_BASE<"ftrunc_s.d", fp_to_sint,
21860b57cec5SDimitry Andric                                          MSA128DOpnd>;
21870b57cec5SDimitry Andric
21880b57cec5SDimitry Andricclass FTRUNC_U_W_DESC : MSA_2RF_DESC_BASE<"ftrunc_u.w", fp_to_uint,
21890b57cec5SDimitry Andric                                          MSA128WOpnd>;
21900b57cec5SDimitry Andricclass FTRUNC_U_D_DESC : MSA_2RF_DESC_BASE<"ftrunc_u.d", fp_to_uint,
21910b57cec5SDimitry Andric                                          MSA128DOpnd>;
21920b57cec5SDimitry Andric
21930b57cec5SDimitry Andricclass HADD_S_H_DESC : MSA_3R_DESC_BASE<"hadd_s.h", int_mips_hadd_s_h,
21940b57cec5SDimitry Andric                                       MSA128HOpnd, MSA128BOpnd, MSA128BOpnd>;
21950b57cec5SDimitry Andricclass HADD_S_W_DESC : MSA_3R_DESC_BASE<"hadd_s.w", int_mips_hadd_s_w,
21960b57cec5SDimitry Andric                                       MSA128WOpnd, MSA128HOpnd, MSA128HOpnd>;
21970b57cec5SDimitry Andricclass HADD_S_D_DESC : MSA_3R_DESC_BASE<"hadd_s.d", int_mips_hadd_s_d,
21980b57cec5SDimitry Andric                                       MSA128DOpnd, MSA128WOpnd, MSA128WOpnd>;
21990b57cec5SDimitry Andric
22000b57cec5SDimitry Andricclass HADD_U_H_DESC : MSA_3R_DESC_BASE<"hadd_u.h", int_mips_hadd_u_h,
22010b57cec5SDimitry Andric                                       MSA128HOpnd, MSA128BOpnd, MSA128BOpnd>;
22020b57cec5SDimitry Andricclass HADD_U_W_DESC : MSA_3R_DESC_BASE<"hadd_u.w", int_mips_hadd_u_w,
22030b57cec5SDimitry Andric                                       MSA128WOpnd, MSA128HOpnd, MSA128HOpnd>;
22040b57cec5SDimitry Andricclass HADD_U_D_DESC : MSA_3R_DESC_BASE<"hadd_u.d", int_mips_hadd_u_d,
22050b57cec5SDimitry Andric                                       MSA128DOpnd, MSA128WOpnd, MSA128WOpnd>;
22060b57cec5SDimitry Andric
22070b57cec5SDimitry Andricclass HSUB_S_H_DESC : MSA_3R_DESC_BASE<"hsub_s.h", int_mips_hsub_s_h,
22080b57cec5SDimitry Andric                                       MSA128HOpnd, MSA128BOpnd, MSA128BOpnd>;
22090b57cec5SDimitry Andricclass HSUB_S_W_DESC : MSA_3R_DESC_BASE<"hsub_s.w", int_mips_hsub_s_w,
22100b57cec5SDimitry Andric                                       MSA128WOpnd, MSA128HOpnd, MSA128HOpnd>;
22110b57cec5SDimitry Andricclass HSUB_S_D_DESC : MSA_3R_DESC_BASE<"hsub_s.d", int_mips_hsub_s_d,
22120b57cec5SDimitry Andric                                       MSA128DOpnd, MSA128WOpnd, MSA128WOpnd>;
22130b57cec5SDimitry Andric
22140b57cec5SDimitry Andricclass HSUB_U_H_DESC : MSA_3R_DESC_BASE<"hsub_u.h", int_mips_hsub_u_h,
22150b57cec5SDimitry Andric                                       MSA128HOpnd, MSA128BOpnd, MSA128BOpnd>;
22160b57cec5SDimitry Andricclass HSUB_U_W_DESC : MSA_3R_DESC_BASE<"hsub_u.w", int_mips_hsub_u_w,
22170b57cec5SDimitry Andric                                       MSA128WOpnd, MSA128HOpnd, MSA128HOpnd>;
22180b57cec5SDimitry Andricclass HSUB_U_D_DESC : MSA_3R_DESC_BASE<"hsub_u.d", int_mips_hsub_u_d,
22190b57cec5SDimitry Andric                                       MSA128DOpnd, MSA128WOpnd, MSA128WOpnd>;
22200b57cec5SDimitry Andric
22210b57cec5SDimitry Andricclass ILVEV_B_DESC : MSA_3R_DESC_BASE<"ilvev.b", MipsILVEV, MSA128BOpnd>;
22220b57cec5SDimitry Andricclass ILVEV_H_DESC : MSA_3R_DESC_BASE<"ilvev.h", MipsILVEV, MSA128HOpnd>;
22230b57cec5SDimitry Andricclass ILVEV_W_DESC : MSA_3R_DESC_BASE<"ilvev.w", MipsILVEV, MSA128WOpnd>;
22240b57cec5SDimitry Andricclass ILVEV_D_DESC : MSA_3R_DESC_BASE<"ilvev.d", MipsILVEV, MSA128DOpnd>;
22250b57cec5SDimitry Andric
22260b57cec5SDimitry Andricclass ILVL_B_DESC : MSA_3R_DESC_BASE<"ilvl.b", MipsILVL, MSA128BOpnd>;
22270b57cec5SDimitry Andricclass ILVL_H_DESC : MSA_3R_DESC_BASE<"ilvl.h", MipsILVL, MSA128HOpnd>;
22280b57cec5SDimitry Andricclass ILVL_W_DESC : MSA_3R_DESC_BASE<"ilvl.w", MipsILVL, MSA128WOpnd>;
22290b57cec5SDimitry Andricclass ILVL_D_DESC : MSA_3R_DESC_BASE<"ilvl.d", MipsILVL, MSA128DOpnd>;
22300b57cec5SDimitry Andric
22310b57cec5SDimitry Andricclass ILVOD_B_DESC : MSA_3R_DESC_BASE<"ilvod.b", MipsILVOD, MSA128BOpnd>;
22320b57cec5SDimitry Andricclass ILVOD_H_DESC : MSA_3R_DESC_BASE<"ilvod.h", MipsILVOD, MSA128HOpnd>;
22330b57cec5SDimitry Andricclass ILVOD_W_DESC : MSA_3R_DESC_BASE<"ilvod.w", MipsILVOD, MSA128WOpnd>;
22340b57cec5SDimitry Andricclass ILVOD_D_DESC : MSA_3R_DESC_BASE<"ilvod.d", MipsILVOD, MSA128DOpnd>;
22350b57cec5SDimitry Andric
22360b57cec5SDimitry Andricclass ILVR_B_DESC : MSA_3R_DESC_BASE<"ilvr.b", MipsILVR, MSA128BOpnd>;
22370b57cec5SDimitry Andricclass ILVR_H_DESC : MSA_3R_DESC_BASE<"ilvr.h", MipsILVR, MSA128HOpnd>;
22380b57cec5SDimitry Andricclass ILVR_W_DESC : MSA_3R_DESC_BASE<"ilvr.w", MipsILVR, MSA128WOpnd>;
22390b57cec5SDimitry Andricclass ILVR_D_DESC : MSA_3R_DESC_BASE<"ilvr.d", MipsILVR, MSA128DOpnd>;
22400b57cec5SDimitry Andric
22410b57cec5SDimitry Andricclass INSERT_B_DESC : MSA_INSERT_DESC_BASE<"insert.b", vinsert_v16i8, uimm4,
22420b57cec5SDimitry Andric                                           immZExt4Ptr, MSA128BOpnd, GPR32Opnd>;
22430b57cec5SDimitry Andricclass INSERT_H_DESC : MSA_INSERT_DESC_BASE<"insert.h", vinsert_v8i16, uimm3,
22440b57cec5SDimitry Andric                                           immZExt3Ptr, MSA128HOpnd, GPR32Opnd>;
22450b57cec5SDimitry Andricclass INSERT_W_DESC : MSA_INSERT_DESC_BASE<"insert.w", vinsert_v4i32, uimm2,
22460b57cec5SDimitry Andric                                           immZExt2Ptr, MSA128WOpnd, GPR32Opnd>;
22470b57cec5SDimitry Andricclass INSERT_D_DESC : MSA_INSERT_DESC_BASE<"insert.d", vinsert_v2i64, uimm1,
22480b57cec5SDimitry Andric                                           immZExt1Ptr, MSA128DOpnd, GPR64Opnd>;
22490b57cec5SDimitry Andric
22500b57cec5SDimitry Andricclass INSERT_B_VIDX_PSEUDO_DESC :
22510b57cec5SDimitry Andric    MSA_INSERT_VIDX_PSEUDO_BASE<vector_insert, v16i8, MSA128BOpnd, GPR32Opnd, GPR32Opnd>;
22520b57cec5SDimitry Andricclass INSERT_H_VIDX_PSEUDO_DESC :
22530b57cec5SDimitry Andric    MSA_INSERT_VIDX_PSEUDO_BASE<vector_insert, v8i16, MSA128HOpnd, GPR32Opnd, GPR32Opnd>;
22540b57cec5SDimitry Andricclass INSERT_W_VIDX_PSEUDO_DESC :
22550b57cec5SDimitry Andric    MSA_INSERT_VIDX_PSEUDO_BASE<vector_insert, v4i32, MSA128WOpnd, GPR32Opnd, GPR32Opnd>;
22560b57cec5SDimitry Andricclass INSERT_D_VIDX_PSEUDO_DESC :
22570b57cec5SDimitry Andric    MSA_INSERT_VIDX_PSEUDO_BASE<vector_insert, v2i64, MSA128DOpnd, GPR64Opnd, GPR32Opnd>;
22580b57cec5SDimitry Andric
22590b57cec5SDimitry Andricclass INSERT_FW_PSEUDO_DESC : MSA_INSERT_PSEUDO_BASE<vector_insert, v4f32,
22600b57cec5SDimitry Andric                                                     uimm2, immZExt2Ptr,
22610b57cec5SDimitry Andric                                                     MSA128WOpnd, FGR32Opnd>;
22620b57cec5SDimitry Andricclass INSERT_FD_PSEUDO_DESC : MSA_INSERT_PSEUDO_BASE<vector_insert, v2f64,
22630b57cec5SDimitry Andric                                                     uimm1, immZExt1Ptr,
22640b57cec5SDimitry Andric                                                     MSA128DOpnd, FGR64Opnd>;
22650b57cec5SDimitry Andric
22660b57cec5SDimitry Andricclass INSERT_FW_VIDX_PSEUDO_DESC :
22670b57cec5SDimitry Andric    MSA_INSERT_VIDX_PSEUDO_BASE<vector_insert, v4f32, MSA128WOpnd, FGR32Opnd, GPR32Opnd>;
22680b57cec5SDimitry Andricclass INSERT_FD_VIDX_PSEUDO_DESC :
22690b57cec5SDimitry Andric    MSA_INSERT_VIDX_PSEUDO_BASE<vector_insert, v2f64, MSA128DOpnd, FGR64Opnd, GPR32Opnd>;
22700b57cec5SDimitry Andric
22710b57cec5SDimitry Andricclass INSERT_B_VIDX64_PSEUDO_DESC :
22720b57cec5SDimitry Andric    MSA_INSERT_VIDX_PSEUDO_BASE<vector_insert, v16i8, MSA128BOpnd, GPR32Opnd, GPR64Opnd>;
22730b57cec5SDimitry Andricclass INSERT_H_VIDX64_PSEUDO_DESC :
22740b57cec5SDimitry Andric    MSA_INSERT_VIDX_PSEUDO_BASE<vector_insert, v8i16, MSA128HOpnd, GPR32Opnd, GPR64Opnd>;
22750b57cec5SDimitry Andricclass INSERT_W_VIDX64_PSEUDO_DESC :
22760b57cec5SDimitry Andric    MSA_INSERT_VIDX_PSEUDO_BASE<vector_insert, v4i32, MSA128WOpnd, GPR32Opnd, GPR64Opnd>;
22770b57cec5SDimitry Andricclass INSERT_D_VIDX64_PSEUDO_DESC :
22780b57cec5SDimitry Andric    MSA_INSERT_VIDX_PSEUDO_BASE<vector_insert, v2i64, MSA128DOpnd, GPR64Opnd, GPR64Opnd>;
22790b57cec5SDimitry Andric
22800b57cec5SDimitry Andricclass INSERT_FW_VIDX64_PSEUDO_DESC :
22810b57cec5SDimitry Andric    MSA_INSERT_VIDX_PSEUDO_BASE<vector_insert, v4f32, MSA128WOpnd, FGR32Opnd, GPR64Opnd>;
22820b57cec5SDimitry Andricclass INSERT_FD_VIDX64_PSEUDO_DESC :
22830b57cec5SDimitry Andric    MSA_INSERT_VIDX_PSEUDO_BASE<vector_insert, v2f64, MSA128DOpnd, FGR64Opnd, GPR64Opnd>;
22840b57cec5SDimitry Andric
22858bcb0991SDimitry Andricclass INSVE_B_DESC : MSA_INSVE_DESC_BASE<"insve.b", insve_v16i8, uimm4, timmZExt4,
22860b57cec5SDimitry Andric                                         MSA128BOpnd>;
22878bcb0991SDimitry Andricclass INSVE_H_DESC : MSA_INSVE_DESC_BASE<"insve.h", insve_v8i16, uimm3, timmZExt3,
22880b57cec5SDimitry Andric                                         MSA128HOpnd>;
22898bcb0991SDimitry Andricclass INSVE_W_DESC : MSA_INSVE_DESC_BASE<"insve.w", insve_v4i32, uimm2, timmZExt2,
22900b57cec5SDimitry Andric                                         MSA128WOpnd>;
22918bcb0991SDimitry Andricclass INSVE_D_DESC : MSA_INSVE_DESC_BASE<"insve.d", insve_v2i64, uimm1, timmZExt1,
22920b57cec5SDimitry Andric                                         MSA128DOpnd>;
22930b57cec5SDimitry Andric
22940b57cec5SDimitry Andricclass LD_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
22950b57cec5SDimitry Andric                   ValueType TyNode, RegisterOperand ROWD,
22960b57cec5SDimitry Andric                   Operand MemOpnd, ComplexPattern Addr = addrimm10,
22970b57cec5SDimitry Andric                   InstrItinClass itin = NoItinerary> {
22980b57cec5SDimitry Andric  dag OutOperandList = (outs ROWD:$wd);
22990b57cec5SDimitry Andric  dag InOperandList = (ins MemOpnd:$addr);
23000b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $addr");
23010b57cec5SDimitry Andric  list<dag> Pattern = [(set ROWD:$wd, (TyNode (OpNode Addr:$addr)))];
23020b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
23030b57cec5SDimitry Andric  string DecoderMethod = "DecodeMSA128Mem";
23040b57cec5SDimitry Andric}
23050b57cec5SDimitry Andric
23060b57cec5SDimitry Andricclass LD_B_DESC : LD_DESC_BASE<"ld.b", load, v16i8, MSA128BOpnd, mem_simm10>;
23070b57cec5SDimitry Andricclass LD_H_DESC : LD_DESC_BASE<"ld.h", load, v8i16, MSA128HOpnd,
23080b57cec5SDimitry Andric                               mem_simm10_lsl1, addrimm10lsl1>;
23090b57cec5SDimitry Andricclass LD_W_DESC : LD_DESC_BASE<"ld.w", load, v4i32, MSA128WOpnd,
23100b57cec5SDimitry Andric                               mem_simm10_lsl2, addrimm10lsl2>;
23110b57cec5SDimitry Andricclass LD_D_DESC : LD_DESC_BASE<"ld.d", load, v2i64, MSA128DOpnd,
23120b57cec5SDimitry Andric                               mem_simm10_lsl3, addrimm10lsl3>;
23130b57cec5SDimitry Andric
23140b57cec5SDimitry Andricclass LDI_B_DESC : MSA_I10_LDI_DESC_BASE<"ldi.b", MSA128BOpnd>;
23150b57cec5SDimitry Andricclass LDI_H_DESC : MSA_I10_LDI_DESC_BASE<"ldi.h", MSA128HOpnd>;
23160b57cec5SDimitry Andricclass LDI_W_DESC : MSA_I10_LDI_DESC_BASE<"ldi.w", MSA128WOpnd>;
23170b57cec5SDimitry Andricclass LDI_D_DESC : MSA_I10_LDI_DESC_BASE<"ldi.d", MSA128DOpnd>;
23180b57cec5SDimitry Andric
23195ffd83dbSDimitry Andricclass MSA_LOAD_PSEUDO_BASE<SDPatternOperator intrinsic, RegisterOperand RO> :
23205ffd83dbSDimitry Andric  PseudoSE<(outs RO:$dst), (ins PtrRC:$ptr, GPR32:$imm),
23215ffd83dbSDimitry Andric           [(set RO:$dst, (intrinsic iPTR:$ptr, GPR32:$imm))]> {
23225ffd83dbSDimitry Andric  let hasNoSchedulingInfo = 1;
23235ffd83dbSDimitry Andric  let usesCustomInserter = 1;
23245ffd83dbSDimitry Andric}
23255ffd83dbSDimitry Andric
23265ffd83dbSDimitry Andricdef LDR_D : MSA_LOAD_PSEUDO_BASE<int_mips_ldr_d, MSA128DOpnd>;
23275ffd83dbSDimitry Andricdef LDR_W : MSA_LOAD_PSEUDO_BASE<int_mips_ldr_w, MSA128WOpnd>;
23285ffd83dbSDimitry Andric
23290b57cec5SDimitry Andricclass LSA_DESC_BASE<string instr_asm, RegisterOperand RORD,
23300b57cec5SDimitry Andric                    InstrItinClass itin = NoItinerary> {
23310b57cec5SDimitry Andric  dag OutOperandList = (outs RORD:$rd);
23320b57cec5SDimitry Andric  dag InOperandList = (ins RORD:$rs, RORD:$rt, uimm2_plus1:$sa);
23330b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$rd, $rs, $rt, $sa");
23340b57cec5SDimitry Andric  list<dag> Pattern = [(set RORD:$rd, (add RORD:$rt,
23350b57cec5SDimitry Andric                                                (shl RORD:$rs,
23360b57cec5SDimitry Andric                                                     immZExt2Lsa:$sa)))];
23370b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
23380b57cec5SDimitry Andric}
23390b57cec5SDimitry Andric
23400b57cec5SDimitry Andricclass LSA_DESC : LSA_DESC_BASE<"lsa", GPR32Opnd, II_LSA>;
23410b57cec5SDimitry Andricclass DLSA_DESC : LSA_DESC_BASE<"dlsa", GPR64Opnd, II_DLSA>;
23420b57cec5SDimitry Andric
23430b57cec5SDimitry Andricclass MADD_Q_H_DESC : MSA_3RF_4RF_DESC_BASE<"madd_q.h", int_mips_madd_q_h,
23440b57cec5SDimitry Andric                                            MSA128HOpnd>;
23450b57cec5SDimitry Andricclass MADD_Q_W_DESC : MSA_3RF_4RF_DESC_BASE<"madd_q.w", int_mips_madd_q_w,
23460b57cec5SDimitry Andric                                            MSA128WOpnd>;
23470b57cec5SDimitry Andric
23480b57cec5SDimitry Andricclass MADDR_Q_H_DESC : MSA_3RF_4RF_DESC_BASE<"maddr_q.h", int_mips_maddr_q_h,
23490b57cec5SDimitry Andric                                             MSA128HOpnd>;
23500b57cec5SDimitry Andricclass MADDR_Q_W_DESC : MSA_3RF_4RF_DESC_BASE<"maddr_q.w", int_mips_maddr_q_w,
23510b57cec5SDimitry Andric                                             MSA128WOpnd>;
23520b57cec5SDimitry Andric
23530b57cec5SDimitry Andricclass MADDV_B_DESC : MSA_3R_4R_DESC_BASE<"maddv.b", muladd, MSA128BOpnd>;
23540b57cec5SDimitry Andricclass MADDV_H_DESC : MSA_3R_4R_DESC_BASE<"maddv.h", muladd, MSA128HOpnd>;
23550b57cec5SDimitry Andricclass MADDV_W_DESC : MSA_3R_4R_DESC_BASE<"maddv.w", muladd, MSA128WOpnd>;
23560b57cec5SDimitry Andricclass MADDV_D_DESC : MSA_3R_4R_DESC_BASE<"maddv.d", muladd, MSA128DOpnd>;
23570b57cec5SDimitry Andric
23580b57cec5SDimitry Andricclass MAX_A_B_DESC : MSA_3R_DESC_BASE<"max_a.b", int_mips_max_a_b, MSA128BOpnd>;
23590b57cec5SDimitry Andricclass MAX_A_H_DESC : MSA_3R_DESC_BASE<"max_a.h", int_mips_max_a_h, MSA128HOpnd>;
23600b57cec5SDimitry Andricclass MAX_A_W_DESC : MSA_3R_DESC_BASE<"max_a.w", int_mips_max_a_w, MSA128WOpnd>;
23610b57cec5SDimitry Andricclass MAX_A_D_DESC : MSA_3R_DESC_BASE<"max_a.d", int_mips_max_a_d, MSA128DOpnd>;
23620b57cec5SDimitry Andric
23630b57cec5SDimitry Andricclass MAX_S_B_DESC : MSA_3R_DESC_BASE<"max_s.b", smax, MSA128BOpnd>;
23640b57cec5SDimitry Andricclass MAX_S_H_DESC : MSA_3R_DESC_BASE<"max_s.h", smax, MSA128HOpnd>;
23650b57cec5SDimitry Andricclass MAX_S_W_DESC : MSA_3R_DESC_BASE<"max_s.w", smax, MSA128WOpnd>;
23660b57cec5SDimitry Andricclass MAX_S_D_DESC : MSA_3R_DESC_BASE<"max_s.d", smax, MSA128DOpnd>;
23670b57cec5SDimitry Andric
23680b57cec5SDimitry Andricclass MAX_U_B_DESC : MSA_3R_DESC_BASE<"max_u.b", umax, MSA128BOpnd>;
23690b57cec5SDimitry Andricclass MAX_U_H_DESC : MSA_3R_DESC_BASE<"max_u.h", umax, MSA128HOpnd>;
23700b57cec5SDimitry Andricclass MAX_U_W_DESC : MSA_3R_DESC_BASE<"max_u.w", umax, MSA128WOpnd>;
23710b57cec5SDimitry Andricclass MAX_U_D_DESC : MSA_3R_DESC_BASE<"max_u.d", umax, MSA128DOpnd>;
23720b57cec5SDimitry Andric
23730b57cec5SDimitry Andricclass MAXI_S_B_DESC : MSA_I5_DESC_BASE<"maxi_s.b", smax, vsplati8_simm5,
23740b57cec5SDimitry Andric                                       MSA128BOpnd>;
23750b57cec5SDimitry Andricclass MAXI_S_H_DESC : MSA_I5_DESC_BASE<"maxi_s.h", smax, vsplati16_simm5,
23760b57cec5SDimitry Andric                                       MSA128HOpnd>;
23770b57cec5SDimitry Andricclass MAXI_S_W_DESC : MSA_I5_DESC_BASE<"maxi_s.w", smax, vsplati32_simm5,
23780b57cec5SDimitry Andric                                       MSA128WOpnd>;
23790b57cec5SDimitry Andricclass MAXI_S_D_DESC : MSA_I5_DESC_BASE<"maxi_s.d", smax, vsplati64_simm5,
23800b57cec5SDimitry Andric                                       MSA128DOpnd>;
23810b57cec5SDimitry Andric
23820b57cec5SDimitry Andricclass MAXI_U_B_DESC : MSA_I5_DESC_BASE<"maxi_u.b", umax, vsplati8_uimm5,
23830b57cec5SDimitry Andric                                       MSA128BOpnd>;
23840b57cec5SDimitry Andricclass MAXI_U_H_DESC : MSA_I5_DESC_BASE<"maxi_u.h", umax, vsplati16_uimm5,
23850b57cec5SDimitry Andric                                       MSA128HOpnd>;
23860b57cec5SDimitry Andricclass MAXI_U_W_DESC : MSA_I5_DESC_BASE<"maxi_u.w", umax, vsplati32_uimm5,
23870b57cec5SDimitry Andric                                       MSA128WOpnd>;
23880b57cec5SDimitry Andricclass MAXI_U_D_DESC : MSA_I5_DESC_BASE<"maxi_u.d", umax, vsplati64_uimm5,
23890b57cec5SDimitry Andric                                       MSA128DOpnd>;
23900b57cec5SDimitry Andric
23910b57cec5SDimitry Andricclass MIN_A_B_DESC : MSA_3R_DESC_BASE<"min_a.b", int_mips_min_a_b, MSA128BOpnd>;
23920b57cec5SDimitry Andricclass MIN_A_H_DESC : MSA_3R_DESC_BASE<"min_a.h", int_mips_min_a_h, MSA128HOpnd>;
23930b57cec5SDimitry Andricclass MIN_A_W_DESC : MSA_3R_DESC_BASE<"min_a.w", int_mips_min_a_w, MSA128WOpnd>;
23940b57cec5SDimitry Andricclass MIN_A_D_DESC : MSA_3R_DESC_BASE<"min_a.d", int_mips_min_a_d, MSA128DOpnd>;
23950b57cec5SDimitry Andric
23960b57cec5SDimitry Andricclass MIN_S_B_DESC : MSA_3R_DESC_BASE<"min_s.b", smin, MSA128BOpnd>;
23970b57cec5SDimitry Andricclass MIN_S_H_DESC : MSA_3R_DESC_BASE<"min_s.h", smin, MSA128HOpnd>;
23980b57cec5SDimitry Andricclass MIN_S_W_DESC : MSA_3R_DESC_BASE<"min_s.w", smin, MSA128WOpnd>;
23990b57cec5SDimitry Andricclass MIN_S_D_DESC : MSA_3R_DESC_BASE<"min_s.d", smin, MSA128DOpnd>;
24000b57cec5SDimitry Andric
24010b57cec5SDimitry Andricclass MIN_U_B_DESC : MSA_3R_DESC_BASE<"min_u.b", umin, MSA128BOpnd>;
24020b57cec5SDimitry Andricclass MIN_U_H_DESC : MSA_3R_DESC_BASE<"min_u.h", umin, MSA128HOpnd>;
24030b57cec5SDimitry Andricclass MIN_U_W_DESC : MSA_3R_DESC_BASE<"min_u.w", umin, MSA128WOpnd>;
24040b57cec5SDimitry Andricclass MIN_U_D_DESC : MSA_3R_DESC_BASE<"min_u.d", umin, MSA128DOpnd>;
24050b57cec5SDimitry Andric
24060b57cec5SDimitry Andricclass MINI_S_B_DESC : MSA_I5_DESC_BASE<"mini_s.b", smin, vsplati8_simm5,
24070b57cec5SDimitry Andric                                       MSA128BOpnd>;
24080b57cec5SDimitry Andricclass MINI_S_H_DESC : MSA_I5_DESC_BASE<"mini_s.h", smin, vsplati16_simm5,
24090b57cec5SDimitry Andric                                       MSA128HOpnd>;
24100b57cec5SDimitry Andricclass MINI_S_W_DESC : MSA_I5_DESC_BASE<"mini_s.w", smin, vsplati32_simm5,
24110b57cec5SDimitry Andric                                       MSA128WOpnd>;
24120b57cec5SDimitry Andricclass MINI_S_D_DESC : MSA_I5_DESC_BASE<"mini_s.d", smin, vsplati64_simm5,
24130b57cec5SDimitry Andric                                       MSA128DOpnd>;
24140b57cec5SDimitry Andric
24150b57cec5SDimitry Andricclass MINI_U_B_DESC : MSA_I5_DESC_BASE<"mini_u.b", umin, vsplati8_uimm5,
24160b57cec5SDimitry Andric                                       MSA128BOpnd>;
24170b57cec5SDimitry Andricclass MINI_U_H_DESC : MSA_I5_DESC_BASE<"mini_u.h", umin, vsplati16_uimm5,
24180b57cec5SDimitry Andric                                       MSA128HOpnd>;
24190b57cec5SDimitry Andricclass MINI_U_W_DESC : MSA_I5_DESC_BASE<"mini_u.w", umin, vsplati32_uimm5,
24200b57cec5SDimitry Andric                                       MSA128WOpnd>;
24210b57cec5SDimitry Andricclass MINI_U_D_DESC : MSA_I5_DESC_BASE<"mini_u.d", umin, vsplati64_uimm5,
24220b57cec5SDimitry Andric                                       MSA128DOpnd>;
24230b57cec5SDimitry Andric
24240b57cec5SDimitry Andricclass MOD_S_B_DESC : MSA_3R_DESC_BASE<"mod_s.b", srem, MSA128BOpnd>;
24250b57cec5SDimitry Andricclass MOD_S_H_DESC : MSA_3R_DESC_BASE<"mod_s.h", srem, MSA128HOpnd>;
24260b57cec5SDimitry Andricclass MOD_S_W_DESC : MSA_3R_DESC_BASE<"mod_s.w", srem, MSA128WOpnd>;
24270b57cec5SDimitry Andricclass MOD_S_D_DESC : MSA_3R_DESC_BASE<"mod_s.d", srem, MSA128DOpnd>;
24280b57cec5SDimitry Andric
24290b57cec5SDimitry Andricclass MOD_U_B_DESC : MSA_3R_DESC_BASE<"mod_u.b", urem, MSA128BOpnd>;
24300b57cec5SDimitry Andricclass MOD_U_H_DESC : MSA_3R_DESC_BASE<"mod_u.h", urem, MSA128HOpnd>;
24310b57cec5SDimitry Andricclass MOD_U_W_DESC : MSA_3R_DESC_BASE<"mod_u.w", urem, MSA128WOpnd>;
24320b57cec5SDimitry Andricclass MOD_U_D_DESC : MSA_3R_DESC_BASE<"mod_u.d", urem, MSA128DOpnd>;
24330b57cec5SDimitry Andric
24340b57cec5SDimitry Andricclass MOVE_V_DESC {
24350b57cec5SDimitry Andric  dag OutOperandList = (outs MSA128BOpnd:$wd);
24360b57cec5SDimitry Andric  dag InOperandList = (ins MSA128BOpnd:$ws);
24370b57cec5SDimitry Andric  string AsmString = "move.v\t$wd, $ws";
24380b57cec5SDimitry Andric  list<dag> Pattern = [];
24390b57cec5SDimitry Andric  InstrItinClass Itinerary = NoItinerary;
24400b57cec5SDimitry Andric  bit isMoveReg = 1;
24410b57cec5SDimitry Andric}
24420b57cec5SDimitry Andric
24430b57cec5SDimitry Andricclass MSUB_Q_H_DESC : MSA_3RF_4RF_DESC_BASE<"msub_q.h", int_mips_msub_q_h,
24440b57cec5SDimitry Andric                                            MSA128HOpnd>;
24450b57cec5SDimitry Andricclass MSUB_Q_W_DESC : MSA_3RF_4RF_DESC_BASE<"msub_q.w", int_mips_msub_q_w,
24460b57cec5SDimitry Andric                                            MSA128WOpnd>;
24470b57cec5SDimitry Andric
24480b57cec5SDimitry Andricclass MSUBR_Q_H_DESC : MSA_3RF_4RF_DESC_BASE<"msubr_q.h", int_mips_msubr_q_h,
24490b57cec5SDimitry Andric                                             MSA128HOpnd>;
24500b57cec5SDimitry Andricclass MSUBR_Q_W_DESC : MSA_3RF_4RF_DESC_BASE<"msubr_q.w", int_mips_msubr_q_w,
24510b57cec5SDimitry Andric                                             MSA128WOpnd>;
24520b57cec5SDimitry Andric
24530b57cec5SDimitry Andricclass MSUBV_B_DESC : MSA_3R_4R_DESC_BASE<"msubv.b", mulsub, MSA128BOpnd>;
24540b57cec5SDimitry Andricclass MSUBV_H_DESC : MSA_3R_4R_DESC_BASE<"msubv.h", mulsub, MSA128HOpnd>;
24550b57cec5SDimitry Andricclass MSUBV_W_DESC : MSA_3R_4R_DESC_BASE<"msubv.w", mulsub, MSA128WOpnd>;
24560b57cec5SDimitry Andricclass MSUBV_D_DESC : MSA_3R_4R_DESC_BASE<"msubv.d", mulsub, MSA128DOpnd>;
24570b57cec5SDimitry Andric
24580b57cec5SDimitry Andricclass MUL_Q_H_DESC : MSA_3RF_DESC_BASE<"mul_q.h", int_mips_mul_q_h,
24590b57cec5SDimitry Andric                                       MSA128HOpnd>;
24600b57cec5SDimitry Andricclass MUL_Q_W_DESC : MSA_3RF_DESC_BASE<"mul_q.w", int_mips_mul_q_w,
24610b57cec5SDimitry Andric                                       MSA128WOpnd>;
24620b57cec5SDimitry Andric
24630b57cec5SDimitry Andricclass MULR_Q_H_DESC : MSA_3RF_DESC_BASE<"mulr_q.h", int_mips_mulr_q_h,
24640b57cec5SDimitry Andric                                        MSA128HOpnd>;
24650b57cec5SDimitry Andricclass MULR_Q_W_DESC : MSA_3RF_DESC_BASE<"mulr_q.w", int_mips_mulr_q_w,
24660b57cec5SDimitry Andric                                        MSA128WOpnd>;
24670b57cec5SDimitry Andric
24680b57cec5SDimitry Andricclass MULV_B_DESC : MSA_3R_DESC_BASE<"mulv.b", mul, MSA128BOpnd>;
24690b57cec5SDimitry Andricclass MULV_H_DESC : MSA_3R_DESC_BASE<"mulv.h", mul, MSA128HOpnd>;
24700b57cec5SDimitry Andricclass MULV_W_DESC : MSA_3R_DESC_BASE<"mulv.w", mul, MSA128WOpnd>;
24710b57cec5SDimitry Andricclass MULV_D_DESC : MSA_3R_DESC_BASE<"mulv.d", mul, MSA128DOpnd>;
24720b57cec5SDimitry Andric
24730b57cec5SDimitry Andricclass NLOC_B_DESC : MSA_2R_DESC_BASE<"nloc.b", int_mips_nloc_b, MSA128BOpnd>;
24740b57cec5SDimitry Andricclass NLOC_H_DESC : MSA_2R_DESC_BASE<"nloc.h", int_mips_nloc_h, MSA128HOpnd>;
24750b57cec5SDimitry Andricclass NLOC_W_DESC : MSA_2R_DESC_BASE<"nloc.w", int_mips_nloc_w, MSA128WOpnd>;
24760b57cec5SDimitry Andricclass NLOC_D_DESC : MSA_2R_DESC_BASE<"nloc.d", int_mips_nloc_d, MSA128DOpnd>;
24770b57cec5SDimitry Andric
24780b57cec5SDimitry Andricclass NLZC_B_DESC : MSA_2R_DESC_BASE<"nlzc.b", ctlz, MSA128BOpnd>;
24790b57cec5SDimitry Andricclass NLZC_H_DESC : MSA_2R_DESC_BASE<"nlzc.h", ctlz, MSA128HOpnd>;
24800b57cec5SDimitry Andricclass NLZC_W_DESC : MSA_2R_DESC_BASE<"nlzc.w", ctlz, MSA128WOpnd>;
24810b57cec5SDimitry Andricclass NLZC_D_DESC : MSA_2R_DESC_BASE<"nlzc.d", ctlz, MSA128DOpnd>;
24820b57cec5SDimitry Andric
24830b57cec5SDimitry Andricclass NOR_V_DESC : MSA_VEC_DESC_BASE<"nor.v", MipsVNOR, MSA128BOpnd>;
24840b57cec5SDimitry Andricclass NOR_V_H_PSEUDO_DESC : MSA_VEC_PSEUDO_BASE<MipsVNOR, MSA128HOpnd>;
24850b57cec5SDimitry Andricclass NOR_V_W_PSEUDO_DESC : MSA_VEC_PSEUDO_BASE<MipsVNOR, MSA128WOpnd>;
24860b57cec5SDimitry Andricclass NOR_V_D_PSEUDO_DESC : MSA_VEC_PSEUDO_BASE<MipsVNOR, MSA128DOpnd>;
24870b57cec5SDimitry Andric
24880b57cec5SDimitry Andricclass NORI_B_DESC : MSA_I8_DESC_BASE<"nori.b", MipsVNOR, vsplati8_uimm8,
24890b57cec5SDimitry Andric                                     MSA128BOpnd>;
24900b57cec5SDimitry Andric
24910b57cec5SDimitry Andricclass OR_V_DESC : MSA_VEC_DESC_BASE<"or.v", or, MSA128BOpnd>;
24920b57cec5SDimitry Andricclass OR_V_H_PSEUDO_DESC : MSA_VEC_PSEUDO_BASE<or, MSA128HOpnd>;
24930b57cec5SDimitry Andricclass OR_V_W_PSEUDO_DESC : MSA_VEC_PSEUDO_BASE<or, MSA128WOpnd>;
24940b57cec5SDimitry Andricclass OR_V_D_PSEUDO_DESC : MSA_VEC_PSEUDO_BASE<or, MSA128DOpnd>;
24950b57cec5SDimitry Andric
24960b57cec5SDimitry Andricclass ORI_B_DESC : MSA_I8_DESC_BASE<"ori.b", or, vsplati8_uimm8, MSA128BOpnd>;
24970b57cec5SDimitry Andric
24980b57cec5SDimitry Andricclass PCKEV_B_DESC : MSA_3R_DESC_BASE<"pckev.b", MipsPCKEV, MSA128BOpnd>;
24990b57cec5SDimitry Andricclass PCKEV_H_DESC : MSA_3R_DESC_BASE<"pckev.h", MipsPCKEV, MSA128HOpnd>;
25000b57cec5SDimitry Andricclass PCKEV_W_DESC : MSA_3R_DESC_BASE<"pckev.w", MipsPCKEV, MSA128WOpnd>;
25010b57cec5SDimitry Andricclass PCKEV_D_DESC : MSA_3R_DESC_BASE<"pckev.d", MipsPCKEV, MSA128DOpnd>;
25020b57cec5SDimitry Andric
25030b57cec5SDimitry Andricclass PCKOD_B_DESC : MSA_3R_DESC_BASE<"pckod.b", MipsPCKOD, MSA128BOpnd>;
25040b57cec5SDimitry Andricclass PCKOD_H_DESC : MSA_3R_DESC_BASE<"pckod.h", MipsPCKOD, MSA128HOpnd>;
25050b57cec5SDimitry Andricclass PCKOD_W_DESC : MSA_3R_DESC_BASE<"pckod.w", MipsPCKOD, MSA128WOpnd>;
25060b57cec5SDimitry Andricclass PCKOD_D_DESC : MSA_3R_DESC_BASE<"pckod.d", MipsPCKOD, MSA128DOpnd>;
25070b57cec5SDimitry Andric
25080b57cec5SDimitry Andricclass PCNT_B_DESC : MSA_2R_DESC_BASE<"pcnt.b", ctpop, MSA128BOpnd>;
25090b57cec5SDimitry Andricclass PCNT_H_DESC : MSA_2R_DESC_BASE<"pcnt.h", ctpop, MSA128HOpnd>;
25100b57cec5SDimitry Andricclass PCNT_W_DESC : MSA_2R_DESC_BASE<"pcnt.w", ctpop, MSA128WOpnd>;
25110b57cec5SDimitry Andricclass PCNT_D_DESC : MSA_2R_DESC_BASE<"pcnt.d", ctpop, MSA128DOpnd>;
25120b57cec5SDimitry Andric
25130b57cec5SDimitry Andricclass SAT_S_B_DESC : MSA_BIT_X_DESC_BASE<"sat_s.b", int_mips_sat_s_b, uimm3,
25148bcb0991SDimitry Andric                                         timmZExt3, MSA128BOpnd>;
25150b57cec5SDimitry Andricclass SAT_S_H_DESC : MSA_BIT_X_DESC_BASE<"sat_s.h", int_mips_sat_s_h, uimm4,
25168bcb0991SDimitry Andric                                         timmZExt4, MSA128HOpnd>;
25170b57cec5SDimitry Andricclass SAT_S_W_DESC : MSA_BIT_X_DESC_BASE<"sat_s.w", int_mips_sat_s_w, uimm5,
25188bcb0991SDimitry Andric                                         timmZExt5, MSA128WOpnd>;
25190b57cec5SDimitry Andricclass SAT_S_D_DESC : MSA_BIT_X_DESC_BASE<"sat_s.d", int_mips_sat_s_d, uimm6,
25208bcb0991SDimitry Andric                                         timmZExt6, MSA128DOpnd>;
25210b57cec5SDimitry Andric
25220b57cec5SDimitry Andricclass SAT_U_B_DESC : MSA_BIT_X_DESC_BASE<"sat_u.b", int_mips_sat_u_b, uimm3,
25238bcb0991SDimitry Andric                                         timmZExt3, MSA128BOpnd>;
25240b57cec5SDimitry Andricclass SAT_U_H_DESC : MSA_BIT_X_DESC_BASE<"sat_u.h", int_mips_sat_u_h, uimm4,
25258bcb0991SDimitry Andric                                         timmZExt4, MSA128HOpnd>;
25260b57cec5SDimitry Andricclass SAT_U_W_DESC : MSA_BIT_X_DESC_BASE<"sat_u.w", int_mips_sat_u_w, uimm5,
25278bcb0991SDimitry Andric                                         timmZExt5, MSA128WOpnd>;
25280b57cec5SDimitry Andricclass SAT_U_D_DESC : MSA_BIT_X_DESC_BASE<"sat_u.d", int_mips_sat_u_d, uimm6,
25298bcb0991SDimitry Andric                                         timmZExt6, MSA128DOpnd>;
25300b57cec5SDimitry Andric
25310b57cec5SDimitry Andricclass SHF_B_DESC : MSA_I8_SHF_DESC_BASE<"shf.b", MSA128BOpnd>;
25320b57cec5SDimitry Andricclass SHF_H_DESC : MSA_I8_SHF_DESC_BASE<"shf.h", MSA128HOpnd>;
25330b57cec5SDimitry Andricclass SHF_W_DESC : MSA_I8_SHF_DESC_BASE<"shf.w", MSA128WOpnd>;
25340b57cec5SDimitry Andric
25350b57cec5SDimitry Andricclass SLD_B_DESC : MSA_3R_SLD_DESC_BASE<"sld.b", int_mips_sld_b, MSA128BOpnd>;
25360b57cec5SDimitry Andricclass SLD_H_DESC : MSA_3R_SLD_DESC_BASE<"sld.h", int_mips_sld_h, MSA128HOpnd>;
25370b57cec5SDimitry Andricclass SLD_W_DESC : MSA_3R_SLD_DESC_BASE<"sld.w", int_mips_sld_w, MSA128WOpnd>;
25380b57cec5SDimitry Andricclass SLD_D_DESC : MSA_3R_SLD_DESC_BASE<"sld.d", int_mips_sld_d, MSA128DOpnd>;
25390b57cec5SDimitry Andric
25400b57cec5SDimitry Andricclass SLDI_B_DESC : MSA_ELM_SLD_DESC_BASE<"sldi.b", int_mips_sldi_b,
25410b57cec5SDimitry Andric                                          MSA128BOpnd, MSA128BOpnd, uimm4,
25428bcb0991SDimitry Andric                                          timmZExt4>;
25430b57cec5SDimitry Andricclass SLDI_H_DESC : MSA_ELM_SLD_DESC_BASE<"sldi.h", int_mips_sldi_h,
25440b57cec5SDimitry Andric                                          MSA128HOpnd, MSA128HOpnd, uimm3,
25458bcb0991SDimitry Andric                                          timmZExt3>;
25460b57cec5SDimitry Andricclass SLDI_W_DESC : MSA_ELM_SLD_DESC_BASE<"sldi.w", int_mips_sldi_w,
25470b57cec5SDimitry Andric                                          MSA128WOpnd, MSA128WOpnd, uimm2,
25488bcb0991SDimitry Andric                                          timmZExt2>;
25490b57cec5SDimitry Andricclass SLDI_D_DESC : MSA_ELM_SLD_DESC_BASE<"sldi.d", int_mips_sldi_d,
25500b57cec5SDimitry Andric                                          MSA128DOpnd, MSA128DOpnd, uimm1,
25518bcb0991SDimitry Andric                                          timmZExt1>;
25520b57cec5SDimitry Andric
25530b57cec5SDimitry Andricclass SLL_B_DESC : MSA_3R_DESC_BASE<"sll.b", shl, MSA128BOpnd>;
25540b57cec5SDimitry Andricclass SLL_H_DESC : MSA_3R_DESC_BASE<"sll.h", shl, MSA128HOpnd>;
25550b57cec5SDimitry Andricclass SLL_W_DESC : MSA_3R_DESC_BASE<"sll.w", shl, MSA128WOpnd>;
25560b57cec5SDimitry Andricclass SLL_D_DESC : MSA_3R_DESC_BASE<"sll.d", shl, MSA128DOpnd>;
25570b57cec5SDimitry Andric
25580b57cec5SDimitry Andricclass SLLI_B_DESC : MSA_BIT_SPLAT_DESC_BASE<"slli.b", shl, vsplati8_uimm3,
25590b57cec5SDimitry Andric                                            MSA128BOpnd>;
25600b57cec5SDimitry Andricclass SLLI_H_DESC : MSA_BIT_SPLAT_DESC_BASE<"slli.h", shl, vsplati16_uimm4,
25610b57cec5SDimitry Andric                                            MSA128HOpnd>;
25620b57cec5SDimitry Andricclass SLLI_W_DESC : MSA_BIT_SPLAT_DESC_BASE<"slli.w", shl, vsplati32_uimm5,
25630b57cec5SDimitry Andric                                            MSA128WOpnd>;
25640b57cec5SDimitry Andricclass SLLI_D_DESC : MSA_BIT_SPLAT_DESC_BASE<"slli.d", shl, vsplati64_uimm6,
25650b57cec5SDimitry Andric                                            MSA128DOpnd>;
25660b57cec5SDimitry Andric
25670b57cec5SDimitry Andricclass SPLAT_B_DESC : MSA_3R_SPLAT_DESC_BASE<"splat.b", vsplati8_elt,
25680b57cec5SDimitry Andric                                            MSA128BOpnd>;
25690b57cec5SDimitry Andricclass SPLAT_H_DESC : MSA_3R_SPLAT_DESC_BASE<"splat.h", vsplati16_elt,
25700b57cec5SDimitry Andric                                            MSA128HOpnd>;
25710b57cec5SDimitry Andricclass SPLAT_W_DESC : MSA_3R_SPLAT_DESC_BASE<"splat.w", vsplati32_elt,
25720b57cec5SDimitry Andric                                            MSA128WOpnd>;
25730b57cec5SDimitry Andricclass SPLAT_D_DESC : MSA_3R_SPLAT_DESC_BASE<"splat.d", vsplati64_elt,
25740b57cec5SDimitry Andric                                            MSA128DOpnd>;
25750b57cec5SDimitry Andric
25760b57cec5SDimitry Andricclass SPLATI_B_DESC : MSA_ELM_SPLAT_DESC_BASE<"splati.b", vsplati8_uimm4,
25770b57cec5SDimitry Andric                                              MSA128BOpnd>;
25780b57cec5SDimitry Andricclass SPLATI_H_DESC : MSA_ELM_SPLAT_DESC_BASE<"splati.h", vsplati16_uimm3,
25790b57cec5SDimitry Andric                                              MSA128HOpnd>;
25800b57cec5SDimitry Andricclass SPLATI_W_DESC : MSA_ELM_SPLAT_DESC_BASE<"splati.w", vsplati32_uimm2,
25810b57cec5SDimitry Andric                                              MSA128WOpnd>;
25820b57cec5SDimitry Andricclass SPLATI_D_DESC : MSA_ELM_SPLAT_DESC_BASE<"splati.d", vsplati64_uimm1,
25830b57cec5SDimitry Andric                                              MSA128DOpnd>;
25840b57cec5SDimitry Andric
25850b57cec5SDimitry Andricclass SRA_B_DESC : MSA_3R_DESC_BASE<"sra.b", sra, MSA128BOpnd>;
25860b57cec5SDimitry Andricclass SRA_H_DESC : MSA_3R_DESC_BASE<"sra.h", sra, MSA128HOpnd>;
25870b57cec5SDimitry Andricclass SRA_W_DESC : MSA_3R_DESC_BASE<"sra.w", sra, MSA128WOpnd>;
25880b57cec5SDimitry Andricclass SRA_D_DESC : MSA_3R_DESC_BASE<"sra.d", sra, MSA128DOpnd>;
25890b57cec5SDimitry Andric
25900b57cec5SDimitry Andricclass SRAI_B_DESC : MSA_BIT_SPLAT_DESC_BASE<"srai.b", sra, vsplati8_uimm3,
25910b57cec5SDimitry Andric                                            MSA128BOpnd>;
25920b57cec5SDimitry Andricclass SRAI_H_DESC : MSA_BIT_SPLAT_DESC_BASE<"srai.h", sra, vsplati16_uimm4,
25930b57cec5SDimitry Andric                                            MSA128HOpnd>;
25940b57cec5SDimitry Andricclass SRAI_W_DESC : MSA_BIT_SPLAT_DESC_BASE<"srai.w", sra, vsplati32_uimm5,
25950b57cec5SDimitry Andric                                            MSA128WOpnd>;
25960b57cec5SDimitry Andricclass SRAI_D_DESC : MSA_BIT_SPLAT_DESC_BASE<"srai.d", sra, vsplati64_uimm6,
25970b57cec5SDimitry Andric                                            MSA128DOpnd>;
25980b57cec5SDimitry Andric
25990b57cec5SDimitry Andricclass SRAR_B_DESC : MSA_3R_DESC_BASE<"srar.b", int_mips_srar_b, MSA128BOpnd>;
26000b57cec5SDimitry Andricclass SRAR_H_DESC : MSA_3R_DESC_BASE<"srar.h", int_mips_srar_h, MSA128HOpnd>;
26010b57cec5SDimitry Andricclass SRAR_W_DESC : MSA_3R_DESC_BASE<"srar.w", int_mips_srar_w, MSA128WOpnd>;
26020b57cec5SDimitry Andricclass SRAR_D_DESC : MSA_3R_DESC_BASE<"srar.d", int_mips_srar_d, MSA128DOpnd>;
26030b57cec5SDimitry Andric
26040b57cec5SDimitry Andricclass SRARI_B_DESC : MSA_BIT_X_DESC_BASE<"srari.b", int_mips_srari_b, uimm3,
26058bcb0991SDimitry Andric                                         timmZExt3, MSA128BOpnd>;
26060b57cec5SDimitry Andricclass SRARI_H_DESC : MSA_BIT_X_DESC_BASE<"srari.h", int_mips_srari_h, uimm4,
26078bcb0991SDimitry Andric                                         timmZExt4, MSA128HOpnd>;
26080b57cec5SDimitry Andricclass SRARI_W_DESC : MSA_BIT_X_DESC_BASE<"srari.w", int_mips_srari_w, uimm5,
26098bcb0991SDimitry Andric                                         timmZExt5, MSA128WOpnd>;
26100b57cec5SDimitry Andricclass SRARI_D_DESC : MSA_BIT_X_DESC_BASE<"srari.d", int_mips_srari_d, uimm6,
26118bcb0991SDimitry Andric                                         timmZExt6, MSA128DOpnd>;
26120b57cec5SDimitry Andric
26130b57cec5SDimitry Andricclass SRL_B_DESC : MSA_3R_DESC_BASE<"srl.b", srl, MSA128BOpnd>;
26140b57cec5SDimitry Andricclass SRL_H_DESC : MSA_3R_DESC_BASE<"srl.h", srl, MSA128HOpnd>;
26150b57cec5SDimitry Andricclass SRL_W_DESC : MSA_3R_DESC_BASE<"srl.w", srl, MSA128WOpnd>;
26160b57cec5SDimitry Andricclass SRL_D_DESC : MSA_3R_DESC_BASE<"srl.d", srl, MSA128DOpnd>;
26170b57cec5SDimitry Andric
26180b57cec5SDimitry Andricclass SRLI_B_DESC : MSA_BIT_SPLAT_DESC_BASE<"srli.b", srl, vsplati8_uimm3,
26190b57cec5SDimitry Andric                                            MSA128BOpnd>;
26200b57cec5SDimitry Andricclass SRLI_H_DESC : MSA_BIT_SPLAT_DESC_BASE<"srli.h", srl, vsplati16_uimm4,
26210b57cec5SDimitry Andric                                            MSA128HOpnd>;
26220b57cec5SDimitry Andricclass SRLI_W_DESC : MSA_BIT_SPLAT_DESC_BASE<"srli.w", srl, vsplati32_uimm5,
26230b57cec5SDimitry Andric                                            MSA128WOpnd>;
26240b57cec5SDimitry Andricclass SRLI_D_DESC : MSA_BIT_SPLAT_DESC_BASE<"srli.d", srl, vsplati64_uimm6,
26250b57cec5SDimitry Andric                                            MSA128DOpnd>;
26260b57cec5SDimitry Andric
26270b57cec5SDimitry Andricclass SRLR_B_DESC : MSA_3R_DESC_BASE<"srlr.b", int_mips_srlr_b, MSA128BOpnd>;
26280b57cec5SDimitry Andricclass SRLR_H_DESC : MSA_3R_DESC_BASE<"srlr.h", int_mips_srlr_h, MSA128HOpnd>;
26290b57cec5SDimitry Andricclass SRLR_W_DESC : MSA_3R_DESC_BASE<"srlr.w", int_mips_srlr_w, MSA128WOpnd>;
26300b57cec5SDimitry Andricclass SRLR_D_DESC : MSA_3R_DESC_BASE<"srlr.d", int_mips_srlr_d, MSA128DOpnd>;
26310b57cec5SDimitry Andric
26320b57cec5SDimitry Andricclass SRLRI_B_DESC : MSA_BIT_X_DESC_BASE<"srlri.b", int_mips_srlri_b, uimm3,
26338bcb0991SDimitry Andric                                         timmZExt3, MSA128BOpnd>;
26340b57cec5SDimitry Andricclass SRLRI_H_DESC : MSA_BIT_X_DESC_BASE<"srlri.h", int_mips_srlri_h, uimm4,
26358bcb0991SDimitry Andric                                         timmZExt4, MSA128HOpnd>;
26360b57cec5SDimitry Andricclass SRLRI_W_DESC : MSA_BIT_X_DESC_BASE<"srlri.w", int_mips_srlri_w, uimm5,
26378bcb0991SDimitry Andric                                         timmZExt5, MSA128WOpnd>;
26380b57cec5SDimitry Andricclass SRLRI_D_DESC : MSA_BIT_X_DESC_BASE<"srlri.d", int_mips_srlri_d, uimm6,
26398bcb0991SDimitry Andric                                         timmZExt6, MSA128DOpnd>;
26400b57cec5SDimitry Andric
26410b57cec5SDimitry Andricclass ST_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
26420b57cec5SDimitry Andric                   ValueType TyNode, RegisterOperand ROWD,
26430b57cec5SDimitry Andric                   Operand MemOpnd, ComplexPattern Addr = addrimm10,
26440b57cec5SDimitry Andric                   InstrItinClass itin = NoItinerary> {
26450b57cec5SDimitry Andric  dag OutOperandList = (outs);
26460b57cec5SDimitry Andric  dag InOperandList = (ins ROWD:$wd, MemOpnd:$addr);
26470b57cec5SDimitry Andric  string AsmString = !strconcat(instr_asm, "\t$wd, $addr");
26480b57cec5SDimitry Andric  list<dag> Pattern = [(OpNode (TyNode ROWD:$wd), Addr:$addr)];
26490b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
26500b57cec5SDimitry Andric  string DecoderMethod = "DecodeMSA128Mem";
26510b57cec5SDimitry Andric}
26520b57cec5SDimitry Andric
26530b57cec5SDimitry Andricclass ST_B_DESC : ST_DESC_BASE<"st.b", store, v16i8, MSA128BOpnd, mem_simm10>;
26540b57cec5SDimitry Andricclass ST_H_DESC : ST_DESC_BASE<"st.h", store, v8i16, MSA128HOpnd,
26550b57cec5SDimitry Andric                               mem_simm10_lsl1, addrimm10lsl1>;
26560b57cec5SDimitry Andricclass ST_W_DESC : ST_DESC_BASE<"st.w", store, v4i32, MSA128WOpnd,
26570b57cec5SDimitry Andric                               mem_simm10_lsl2, addrimm10lsl2>;
26580b57cec5SDimitry Andricclass ST_D_DESC : ST_DESC_BASE<"st.d", store, v2i64, MSA128DOpnd,
26590b57cec5SDimitry Andric                               mem_simm10_lsl3, addrimm10lsl3>;
26600b57cec5SDimitry Andric
26615ffd83dbSDimitry Andricclass MSA_STORE_PSEUDO_BASE<SDPatternOperator intrinsic, RegisterOperand RO> :
26625ffd83dbSDimitry Andric  PseudoSE<(outs), (ins RO:$dst, PtrRC:$ptr, GPR32:$imm),
26635ffd83dbSDimitry Andric           [(intrinsic RO:$dst, iPTR:$ptr, GPR32:$imm)]> {
26645ffd83dbSDimitry Andric  let hasNoSchedulingInfo = 1;
26655ffd83dbSDimitry Andric  let usesCustomInserter = 1;
26665ffd83dbSDimitry Andric}
26675ffd83dbSDimitry Andric
26685ffd83dbSDimitry Andricdef STR_D : MSA_STORE_PSEUDO_BASE<int_mips_str_d, MSA128DOpnd>;
26695ffd83dbSDimitry Andricdef STR_W : MSA_STORE_PSEUDO_BASE<int_mips_str_w, MSA128WOpnd>;
26705ffd83dbSDimitry Andric
26710b57cec5SDimitry Andricclass SUBS_S_B_DESC : MSA_3R_DESC_BASE<"subs_s.b", int_mips_subs_s_b,
26720b57cec5SDimitry Andric                                       MSA128BOpnd>;
26730b57cec5SDimitry Andricclass SUBS_S_H_DESC : MSA_3R_DESC_BASE<"subs_s.h", int_mips_subs_s_h,
26740b57cec5SDimitry Andric                                       MSA128HOpnd>;
26750b57cec5SDimitry Andricclass SUBS_S_W_DESC : MSA_3R_DESC_BASE<"subs_s.w", int_mips_subs_s_w,
26760b57cec5SDimitry Andric                                       MSA128WOpnd>;
26770b57cec5SDimitry Andricclass SUBS_S_D_DESC : MSA_3R_DESC_BASE<"subs_s.d", int_mips_subs_s_d,
26780b57cec5SDimitry Andric                                       MSA128DOpnd>;
26790b57cec5SDimitry Andric
26800b57cec5SDimitry Andricclass SUBS_U_B_DESC : MSA_3R_DESC_BASE<"subs_u.b", int_mips_subs_u_b,
26810b57cec5SDimitry Andric                                       MSA128BOpnd>;
26820b57cec5SDimitry Andricclass SUBS_U_H_DESC : MSA_3R_DESC_BASE<"subs_u.h", int_mips_subs_u_h,
26830b57cec5SDimitry Andric                                       MSA128HOpnd>;
26840b57cec5SDimitry Andricclass SUBS_U_W_DESC : MSA_3R_DESC_BASE<"subs_u.w", int_mips_subs_u_w,
26850b57cec5SDimitry Andric                                       MSA128WOpnd>;
26860b57cec5SDimitry Andricclass SUBS_U_D_DESC : MSA_3R_DESC_BASE<"subs_u.d", int_mips_subs_u_d,
26870b57cec5SDimitry Andric                                       MSA128DOpnd>;
26880b57cec5SDimitry Andric
26890b57cec5SDimitry Andricclass SUBSUS_U_B_DESC : MSA_3R_DESC_BASE<"subsus_u.b", int_mips_subsus_u_b,
26900b57cec5SDimitry Andric                                         MSA128BOpnd>;
26910b57cec5SDimitry Andricclass SUBSUS_U_H_DESC : MSA_3R_DESC_BASE<"subsus_u.h", int_mips_subsus_u_h,
26920b57cec5SDimitry Andric                                         MSA128HOpnd>;
26930b57cec5SDimitry Andricclass SUBSUS_U_W_DESC : MSA_3R_DESC_BASE<"subsus_u.w", int_mips_subsus_u_w,
26940b57cec5SDimitry Andric                                         MSA128WOpnd>;
26950b57cec5SDimitry Andricclass SUBSUS_U_D_DESC : MSA_3R_DESC_BASE<"subsus_u.d", int_mips_subsus_u_d,
26960b57cec5SDimitry Andric                                         MSA128DOpnd>;
26970b57cec5SDimitry Andric
26980b57cec5SDimitry Andricclass SUBSUU_S_B_DESC : MSA_3R_DESC_BASE<"subsuu_s.b", int_mips_subsuu_s_b,
26990b57cec5SDimitry Andric                                         MSA128BOpnd>;
27000b57cec5SDimitry Andricclass SUBSUU_S_H_DESC : MSA_3R_DESC_BASE<"subsuu_s.h", int_mips_subsuu_s_h,
27010b57cec5SDimitry Andric                                         MSA128HOpnd>;
27020b57cec5SDimitry Andricclass SUBSUU_S_W_DESC : MSA_3R_DESC_BASE<"subsuu_s.w", int_mips_subsuu_s_w,
27030b57cec5SDimitry Andric                                         MSA128WOpnd>;
27040b57cec5SDimitry Andricclass SUBSUU_S_D_DESC : MSA_3R_DESC_BASE<"subsuu_s.d", int_mips_subsuu_s_d,
27050b57cec5SDimitry Andric                                         MSA128DOpnd>;
27060b57cec5SDimitry Andric
27070b57cec5SDimitry Andricclass SUBV_B_DESC : MSA_3R_DESC_BASE<"subv.b", sub, MSA128BOpnd>;
27080b57cec5SDimitry Andricclass SUBV_H_DESC : MSA_3R_DESC_BASE<"subv.h", sub, MSA128HOpnd>;
27090b57cec5SDimitry Andricclass SUBV_W_DESC : MSA_3R_DESC_BASE<"subv.w", sub, MSA128WOpnd>;
27100b57cec5SDimitry Andricclass SUBV_D_DESC : MSA_3R_DESC_BASE<"subv.d", sub, MSA128DOpnd>;
27110b57cec5SDimitry Andric
27120b57cec5SDimitry Andricclass SUBVI_B_DESC : MSA_I5_DESC_BASE<"subvi.b", sub, vsplati8_uimm5,
27130b57cec5SDimitry Andric                                      MSA128BOpnd>;
27140b57cec5SDimitry Andricclass SUBVI_H_DESC : MSA_I5_DESC_BASE<"subvi.h", sub, vsplati16_uimm5,
27150b57cec5SDimitry Andric                                      MSA128HOpnd>;
27160b57cec5SDimitry Andricclass SUBVI_W_DESC : MSA_I5_DESC_BASE<"subvi.w", sub, vsplati32_uimm5,
27170b57cec5SDimitry Andric                                      MSA128WOpnd>;
27180b57cec5SDimitry Andricclass SUBVI_D_DESC : MSA_I5_DESC_BASE<"subvi.d", sub, vsplati64_uimm5,
27190b57cec5SDimitry Andric                                      MSA128DOpnd>;
27200b57cec5SDimitry Andric
27210b57cec5SDimitry Andricclass VSHF_B_DESC : MSA_3R_VSHF_DESC_BASE<"vshf.b", MSA128BOpnd>;
27220b57cec5SDimitry Andricclass VSHF_H_DESC : MSA_3R_VSHF_DESC_BASE<"vshf.h", MSA128HOpnd>;
27230b57cec5SDimitry Andricclass VSHF_W_DESC : MSA_3R_VSHF_DESC_BASE<"vshf.w", MSA128WOpnd>;
27240b57cec5SDimitry Andricclass VSHF_D_DESC : MSA_3R_VSHF_DESC_BASE<"vshf.d", MSA128DOpnd>;
27250b57cec5SDimitry Andric
27260b57cec5SDimitry Andricclass XOR_V_DESC : MSA_VEC_DESC_BASE<"xor.v", xor, MSA128BOpnd>;
27270b57cec5SDimitry Andricclass XOR_V_H_PSEUDO_DESC : MSA_VEC_PSEUDO_BASE<xor, MSA128HOpnd>;
27280b57cec5SDimitry Andricclass XOR_V_W_PSEUDO_DESC : MSA_VEC_PSEUDO_BASE<xor, MSA128WOpnd>;
27290b57cec5SDimitry Andricclass XOR_V_D_PSEUDO_DESC : MSA_VEC_PSEUDO_BASE<xor, MSA128DOpnd>;
27300b57cec5SDimitry Andric
27310b57cec5SDimitry Andricclass XORI_B_DESC : MSA_I8_DESC_BASE<"xori.b", xor, vsplati8_uimm8,
27320b57cec5SDimitry Andric                                     MSA128BOpnd>;
27330b57cec5SDimitry Andric
27340b57cec5SDimitry Andric// Instruction defs.
27350b57cec5SDimitry Andricdef ADD_A_B : ADD_A_B_ENC, ADD_A_B_DESC;
27360b57cec5SDimitry Andricdef ADD_A_H : ADD_A_H_ENC, ADD_A_H_DESC;
27370b57cec5SDimitry Andricdef ADD_A_W : ADD_A_W_ENC, ADD_A_W_DESC;
27380b57cec5SDimitry Andricdef ADD_A_D : ADD_A_D_ENC, ADD_A_D_DESC;
27390b57cec5SDimitry Andric
27400b57cec5SDimitry Andricdef ADDS_A_B : ADDS_A_B_ENC, ADDS_A_B_DESC;
27410b57cec5SDimitry Andricdef ADDS_A_H : ADDS_A_H_ENC, ADDS_A_H_DESC;
27420b57cec5SDimitry Andricdef ADDS_A_W : ADDS_A_W_ENC, ADDS_A_W_DESC;
27430b57cec5SDimitry Andricdef ADDS_A_D : ADDS_A_D_ENC, ADDS_A_D_DESC;
27440b57cec5SDimitry Andric
27450b57cec5SDimitry Andricdef ADDS_S_B : ADDS_S_B_ENC, ADDS_S_B_DESC;
27460b57cec5SDimitry Andricdef ADDS_S_H : ADDS_S_H_ENC, ADDS_S_H_DESC;
27470b57cec5SDimitry Andricdef ADDS_S_W : ADDS_S_W_ENC, ADDS_S_W_DESC;
27480b57cec5SDimitry Andricdef ADDS_S_D : ADDS_S_D_ENC, ADDS_S_D_DESC;
27490b57cec5SDimitry Andric
27500b57cec5SDimitry Andricdef ADDS_U_B : ADDS_U_B_ENC, ADDS_U_B_DESC;
27510b57cec5SDimitry Andricdef ADDS_U_H : ADDS_U_H_ENC, ADDS_U_H_DESC;
27520b57cec5SDimitry Andricdef ADDS_U_W : ADDS_U_W_ENC, ADDS_U_W_DESC;
27530b57cec5SDimitry Andricdef ADDS_U_D : ADDS_U_D_ENC, ADDS_U_D_DESC;
27540b57cec5SDimitry Andric
27550b57cec5SDimitry Andricdef ADDV_B : ADDV_B_ENC, ADDV_B_DESC;
27560b57cec5SDimitry Andricdef ADDV_H : ADDV_H_ENC, ADDV_H_DESC;
27570b57cec5SDimitry Andricdef ADDV_W : ADDV_W_ENC, ADDV_W_DESC;
27580b57cec5SDimitry Andricdef ADDV_D : ADDV_D_ENC, ADDV_D_DESC;
27590b57cec5SDimitry Andric
27600b57cec5SDimitry Andricdef ADDVI_B : ADDVI_B_ENC, ADDVI_B_DESC;
27610b57cec5SDimitry Andricdef ADDVI_H : ADDVI_H_ENC, ADDVI_H_DESC;
27620b57cec5SDimitry Andricdef ADDVI_W : ADDVI_W_ENC, ADDVI_W_DESC;
27630b57cec5SDimitry Andricdef ADDVI_D : ADDVI_D_ENC, ADDVI_D_DESC;
27640b57cec5SDimitry Andric
27650b57cec5SDimitry Andricdef AND_V : AND_V_ENC, AND_V_DESC;
27660b57cec5SDimitry Andricdef AND_V_H_PSEUDO : AND_V_H_PSEUDO_DESC,
27670b57cec5SDimitry Andric                     PseudoInstExpansion<(AND_V MSA128BOpnd:$wd,
27680b57cec5SDimitry Andric                                                MSA128BOpnd:$ws,
27690b57cec5SDimitry Andric                                                MSA128BOpnd:$wt)>;
27700b57cec5SDimitry Andricdef AND_V_W_PSEUDO : AND_V_W_PSEUDO_DESC,
27710b57cec5SDimitry Andric                     PseudoInstExpansion<(AND_V MSA128BOpnd:$wd,
27720b57cec5SDimitry Andric                                                MSA128BOpnd:$ws,
27730b57cec5SDimitry Andric                                                MSA128BOpnd:$wt)>;
27740b57cec5SDimitry Andricdef AND_V_D_PSEUDO : AND_V_D_PSEUDO_DESC,
27750b57cec5SDimitry Andric                     PseudoInstExpansion<(AND_V MSA128BOpnd:$wd,
27760b57cec5SDimitry Andric                                                MSA128BOpnd:$ws,
27770b57cec5SDimitry Andric                                                MSA128BOpnd:$wt)>;
27780b57cec5SDimitry Andric
27790b57cec5SDimitry Andricdef ANDI_B : ANDI_B_ENC, ANDI_B_DESC;
27800b57cec5SDimitry Andric
27810b57cec5SDimitry Andricdef ASUB_S_B : ASUB_S_B_ENC, ASUB_S_B_DESC;
27820b57cec5SDimitry Andricdef ASUB_S_H : ASUB_S_H_ENC, ASUB_S_H_DESC;
27830b57cec5SDimitry Andricdef ASUB_S_W : ASUB_S_W_ENC, ASUB_S_W_DESC;
27840b57cec5SDimitry Andricdef ASUB_S_D : ASUB_S_D_ENC, ASUB_S_D_DESC;
27850b57cec5SDimitry Andric
27860b57cec5SDimitry Andricdef ASUB_U_B : ASUB_U_B_ENC, ASUB_U_B_DESC;
27870b57cec5SDimitry Andricdef ASUB_U_H : ASUB_U_H_ENC, ASUB_U_H_DESC;
27880b57cec5SDimitry Andricdef ASUB_U_W : ASUB_U_W_ENC, ASUB_U_W_DESC;
27890b57cec5SDimitry Andricdef ASUB_U_D : ASUB_U_D_ENC, ASUB_U_D_DESC;
27900b57cec5SDimitry Andric
27910b57cec5SDimitry Andricdef AVE_S_B : AVE_S_B_ENC, AVE_S_B_DESC;
27920b57cec5SDimitry Andricdef AVE_S_H : AVE_S_H_ENC, AVE_S_H_DESC;
27930b57cec5SDimitry Andricdef AVE_S_W : AVE_S_W_ENC, AVE_S_W_DESC;
27940b57cec5SDimitry Andricdef AVE_S_D : AVE_S_D_ENC, AVE_S_D_DESC;
27950b57cec5SDimitry Andric
27960b57cec5SDimitry Andricdef AVE_U_B : AVE_U_B_ENC, AVE_U_B_DESC;
27970b57cec5SDimitry Andricdef AVE_U_H : AVE_U_H_ENC, AVE_U_H_DESC;
27980b57cec5SDimitry Andricdef AVE_U_W : AVE_U_W_ENC, AVE_U_W_DESC;
27990b57cec5SDimitry Andricdef AVE_U_D : AVE_U_D_ENC, AVE_U_D_DESC;
28000b57cec5SDimitry Andric
28010b57cec5SDimitry Andricdef AVER_S_B : AVER_S_B_ENC, AVER_S_B_DESC;
28020b57cec5SDimitry Andricdef AVER_S_H : AVER_S_H_ENC, AVER_S_H_DESC;
28030b57cec5SDimitry Andricdef AVER_S_W : AVER_S_W_ENC, AVER_S_W_DESC;
28040b57cec5SDimitry Andricdef AVER_S_D : AVER_S_D_ENC, AVER_S_D_DESC;
28050b57cec5SDimitry Andric
28060b57cec5SDimitry Andricdef AVER_U_B : AVER_U_B_ENC, AVER_U_B_DESC;
28070b57cec5SDimitry Andricdef AVER_U_H : AVER_U_H_ENC, AVER_U_H_DESC;
28080b57cec5SDimitry Andricdef AVER_U_W : AVER_U_W_ENC, AVER_U_W_DESC;
28090b57cec5SDimitry Andricdef AVER_U_D : AVER_U_D_ENC, AVER_U_D_DESC;
28100b57cec5SDimitry Andric
28110b57cec5SDimitry Andricdef BCLR_B : BCLR_B_ENC, BCLR_B_DESC;
28120b57cec5SDimitry Andricdef BCLR_H : BCLR_H_ENC, BCLR_H_DESC;
28130b57cec5SDimitry Andricdef BCLR_W : BCLR_W_ENC, BCLR_W_DESC;
28140b57cec5SDimitry Andricdef BCLR_D : BCLR_D_ENC, BCLR_D_DESC;
28150b57cec5SDimitry Andric
28160b57cec5SDimitry Andricdef BCLRI_B : BCLRI_B_ENC, BCLRI_B_DESC;
28170b57cec5SDimitry Andricdef BCLRI_H : BCLRI_H_ENC, BCLRI_H_DESC;
28180b57cec5SDimitry Andricdef BCLRI_W : BCLRI_W_ENC, BCLRI_W_DESC;
28190b57cec5SDimitry Andricdef BCLRI_D : BCLRI_D_ENC, BCLRI_D_DESC;
28200b57cec5SDimitry Andric
28210b57cec5SDimitry Andricdef BINSL_B : BINSL_B_ENC, BINSL_B_DESC;
28220b57cec5SDimitry Andricdef BINSL_H : BINSL_H_ENC, BINSL_H_DESC;
28230b57cec5SDimitry Andricdef BINSL_W : BINSL_W_ENC, BINSL_W_DESC;
28240b57cec5SDimitry Andricdef BINSL_D : BINSL_D_ENC, BINSL_D_DESC;
28250b57cec5SDimitry Andric
28260b57cec5SDimitry Andricdef BINSLI_B : BINSLI_B_ENC, BINSLI_B_DESC;
28270b57cec5SDimitry Andricdef BINSLI_H : BINSLI_H_ENC, BINSLI_H_DESC;
28280b57cec5SDimitry Andricdef BINSLI_W : BINSLI_W_ENC, BINSLI_W_DESC;
28290b57cec5SDimitry Andricdef BINSLI_D : BINSLI_D_ENC, BINSLI_D_DESC;
28300b57cec5SDimitry Andric
28310b57cec5SDimitry Andricdef BINSR_B : BINSR_B_ENC, BINSR_B_DESC;
28320b57cec5SDimitry Andricdef BINSR_H : BINSR_H_ENC, BINSR_H_DESC;
28330b57cec5SDimitry Andricdef BINSR_W : BINSR_W_ENC, BINSR_W_DESC;
28340b57cec5SDimitry Andricdef BINSR_D : BINSR_D_ENC, BINSR_D_DESC;
28350b57cec5SDimitry Andric
28360b57cec5SDimitry Andricdef BINSRI_B : BINSRI_B_ENC, BINSRI_B_DESC;
28370b57cec5SDimitry Andricdef BINSRI_H : BINSRI_H_ENC, BINSRI_H_DESC;
28380b57cec5SDimitry Andricdef BINSRI_W : BINSRI_W_ENC, BINSRI_W_DESC;
28390b57cec5SDimitry Andricdef BINSRI_D : BINSRI_D_ENC, BINSRI_D_DESC;
28400b57cec5SDimitry Andric
28410b57cec5SDimitry Andricdef BMNZ_V : BMNZ_V_ENC, BMNZ_V_DESC;
28420b57cec5SDimitry Andric
28430b57cec5SDimitry Andricdef BMNZI_B : BMNZI_B_ENC, BMNZI_B_DESC;
28440b57cec5SDimitry Andric
28450b57cec5SDimitry Andricdef BMZ_V : BMZ_V_ENC, BMZ_V_DESC;
28460b57cec5SDimitry Andric
28470b57cec5SDimitry Andricdef BMZI_B : BMZI_B_ENC, BMZI_B_DESC;
28480b57cec5SDimitry Andric
28490b57cec5SDimitry Andricdef BNEG_B : BNEG_B_ENC, BNEG_B_DESC;
28500b57cec5SDimitry Andricdef BNEG_H : BNEG_H_ENC, BNEG_H_DESC;
28510b57cec5SDimitry Andricdef BNEG_W : BNEG_W_ENC, BNEG_W_DESC;
28520b57cec5SDimitry Andricdef BNEG_D : BNEG_D_ENC, BNEG_D_DESC;
28530b57cec5SDimitry Andric
28540b57cec5SDimitry Andricdef BNEGI_B : BNEGI_B_ENC, BNEGI_B_DESC;
28550b57cec5SDimitry Andricdef BNEGI_H : BNEGI_H_ENC, BNEGI_H_DESC;
28560b57cec5SDimitry Andricdef BNEGI_W : BNEGI_W_ENC, BNEGI_W_DESC;
28570b57cec5SDimitry Andricdef BNEGI_D : BNEGI_D_ENC, BNEGI_D_DESC;
28580b57cec5SDimitry Andric
28590b57cec5SDimitry Andricdef BNZ_B : BNZ_B_ENC, BNZ_B_DESC;
28600b57cec5SDimitry Andricdef BNZ_H : BNZ_H_ENC, BNZ_H_DESC;
28610b57cec5SDimitry Andricdef BNZ_W : BNZ_W_ENC, BNZ_W_DESC;
28620b57cec5SDimitry Andricdef BNZ_D : BNZ_D_ENC, BNZ_D_DESC;
28630b57cec5SDimitry Andric
28640b57cec5SDimitry Andricdef BNZ_V : BNZ_V_ENC, BNZ_V_DESC;
28650b57cec5SDimitry Andric
28660b57cec5SDimitry Andricdef BSEL_V : BSEL_V_ENC, BSEL_V_DESC;
28670b57cec5SDimitry Andric
28680b57cec5SDimitry Andricclass MSA_BSEL_PSEUDO_BASE<RegisterOperand RO, ValueType Ty> :
28690b57cec5SDimitry Andric  MSAPseudo<(outs RO:$wd), (ins RO:$wd_in, RO:$ws, RO:$wt),
28700b57cec5SDimitry Andric            [(set RO:$wd, (Ty (vselect RO:$wd_in, RO:$wt, RO:$ws)))]>,
28710b57cec5SDimitry Andric  // Note that vselect and BSEL_V treat the condition operand the opposite way
28720b57cec5SDimitry Andric  // from each other.
28730b57cec5SDimitry Andric  //   (vselect cond, if_set, if_clear)
28740b57cec5SDimitry Andric  //   (BSEL_V cond, if_clear, if_set)
28750b57cec5SDimitry Andric  PseudoInstExpansion<(BSEL_V MSA128BOpnd:$wd, MSA128BOpnd:$wd_in,
28760b57cec5SDimitry Andric                              MSA128BOpnd:$ws, MSA128BOpnd:$wt)> {
28770b57cec5SDimitry Andric  let Constraints = "$wd_in = $wd";
28780b57cec5SDimitry Andric}
28790b57cec5SDimitry Andric
28800b57cec5SDimitry Andricdef BSEL_H_PSEUDO : MSA_BSEL_PSEUDO_BASE<MSA128HOpnd, v8i16>;
28810b57cec5SDimitry Andricdef BSEL_W_PSEUDO : MSA_BSEL_PSEUDO_BASE<MSA128WOpnd, v4i32>;
28820b57cec5SDimitry Andricdef BSEL_D_PSEUDO : MSA_BSEL_PSEUDO_BASE<MSA128DOpnd, v2i64>;
28830b57cec5SDimitry Andricdef BSEL_FW_PSEUDO : MSA_BSEL_PSEUDO_BASE<MSA128WOpnd, v4f32>;
28840b57cec5SDimitry Andricdef BSEL_FD_PSEUDO : MSA_BSEL_PSEUDO_BASE<MSA128DOpnd, v2f64>;
28850b57cec5SDimitry Andric
28860b57cec5SDimitry Andricdef BSELI_B : BSELI_B_ENC, BSELI_B_DESC;
28870b57cec5SDimitry Andric
28880b57cec5SDimitry Andricdef BSET_B : BSET_B_ENC, BSET_B_DESC;
28890b57cec5SDimitry Andricdef BSET_H : BSET_H_ENC, BSET_H_DESC;
28900b57cec5SDimitry Andricdef BSET_W : BSET_W_ENC, BSET_W_DESC;
28910b57cec5SDimitry Andricdef BSET_D : BSET_D_ENC, BSET_D_DESC;
28920b57cec5SDimitry Andric
28930b57cec5SDimitry Andricdef BSETI_B : BSETI_B_ENC, BSETI_B_DESC;
28940b57cec5SDimitry Andricdef BSETI_H : BSETI_H_ENC, BSETI_H_DESC;
28950b57cec5SDimitry Andricdef BSETI_W : BSETI_W_ENC, BSETI_W_DESC;
28960b57cec5SDimitry Andricdef BSETI_D : BSETI_D_ENC, BSETI_D_DESC;
28970b57cec5SDimitry Andric
28980b57cec5SDimitry Andricdef BZ_B : BZ_B_ENC, BZ_B_DESC;
28990b57cec5SDimitry Andricdef BZ_H : BZ_H_ENC, BZ_H_DESC;
29000b57cec5SDimitry Andricdef BZ_W : BZ_W_ENC, BZ_W_DESC;
29010b57cec5SDimitry Andricdef BZ_D : BZ_D_ENC, BZ_D_DESC;
29020b57cec5SDimitry Andric
29030b57cec5SDimitry Andricdef BZ_V : BZ_V_ENC, BZ_V_DESC;
29040b57cec5SDimitry Andric
29050b57cec5SDimitry Andricdef CEQ_B : CEQ_B_ENC, CEQ_B_DESC;
29060b57cec5SDimitry Andricdef CEQ_H : CEQ_H_ENC, CEQ_H_DESC;
29070b57cec5SDimitry Andricdef CEQ_W : CEQ_W_ENC, CEQ_W_DESC;
29080b57cec5SDimitry Andricdef CEQ_D : CEQ_D_ENC, CEQ_D_DESC;
29090b57cec5SDimitry Andric
29100b57cec5SDimitry Andricdef CEQI_B : CEQI_B_ENC, CEQI_B_DESC;
29110b57cec5SDimitry Andricdef CEQI_H : CEQI_H_ENC, CEQI_H_DESC;
29120b57cec5SDimitry Andricdef CEQI_W : CEQI_W_ENC, CEQI_W_DESC;
29130b57cec5SDimitry Andricdef CEQI_D : CEQI_D_ENC, CEQI_D_DESC;
29140b57cec5SDimitry Andric
29150b57cec5SDimitry Andricdef CFCMSA : CFCMSA_ENC, CFCMSA_DESC;
29160b57cec5SDimitry Andric
29170b57cec5SDimitry Andricdef CLE_S_B : CLE_S_B_ENC, CLE_S_B_DESC;
29180b57cec5SDimitry Andricdef CLE_S_H : CLE_S_H_ENC, CLE_S_H_DESC;
29190b57cec5SDimitry Andricdef CLE_S_W : CLE_S_W_ENC, CLE_S_W_DESC;
29200b57cec5SDimitry Andricdef CLE_S_D : CLE_S_D_ENC, CLE_S_D_DESC;
29210b57cec5SDimitry Andric
29220b57cec5SDimitry Andricdef CLE_U_B : CLE_U_B_ENC, CLE_U_B_DESC;
29230b57cec5SDimitry Andricdef CLE_U_H : CLE_U_H_ENC, CLE_U_H_DESC;
29240b57cec5SDimitry Andricdef CLE_U_W : CLE_U_W_ENC, CLE_U_W_DESC;
29250b57cec5SDimitry Andricdef CLE_U_D : CLE_U_D_ENC, CLE_U_D_DESC;
29260b57cec5SDimitry Andric
29270b57cec5SDimitry Andricdef CLEI_S_B : CLEI_S_B_ENC, CLEI_S_B_DESC;
29280b57cec5SDimitry Andricdef CLEI_S_H : CLEI_S_H_ENC, CLEI_S_H_DESC;
29290b57cec5SDimitry Andricdef CLEI_S_W : CLEI_S_W_ENC, CLEI_S_W_DESC;
29300b57cec5SDimitry Andricdef CLEI_S_D : CLEI_S_D_ENC, CLEI_S_D_DESC;
29310b57cec5SDimitry Andric
29320b57cec5SDimitry Andricdef CLEI_U_B : CLEI_U_B_ENC, CLEI_U_B_DESC;
29330b57cec5SDimitry Andricdef CLEI_U_H : CLEI_U_H_ENC, CLEI_U_H_DESC;
29340b57cec5SDimitry Andricdef CLEI_U_W : CLEI_U_W_ENC, CLEI_U_W_DESC;
29350b57cec5SDimitry Andricdef CLEI_U_D : CLEI_U_D_ENC, CLEI_U_D_DESC;
29360b57cec5SDimitry Andric
29370b57cec5SDimitry Andricdef CLT_S_B : CLT_S_B_ENC, CLT_S_B_DESC;
29380b57cec5SDimitry Andricdef CLT_S_H : CLT_S_H_ENC, CLT_S_H_DESC;
29390b57cec5SDimitry Andricdef CLT_S_W : CLT_S_W_ENC, CLT_S_W_DESC;
29400b57cec5SDimitry Andricdef CLT_S_D : CLT_S_D_ENC, CLT_S_D_DESC;
29410b57cec5SDimitry Andric
29420b57cec5SDimitry Andricdef CLT_U_B : CLT_U_B_ENC, CLT_U_B_DESC;
29430b57cec5SDimitry Andricdef CLT_U_H : CLT_U_H_ENC, CLT_U_H_DESC;
29440b57cec5SDimitry Andricdef CLT_U_W : CLT_U_W_ENC, CLT_U_W_DESC;
29450b57cec5SDimitry Andricdef CLT_U_D : CLT_U_D_ENC, CLT_U_D_DESC;
29460b57cec5SDimitry Andric
29470b57cec5SDimitry Andricdef CLTI_S_B : CLTI_S_B_ENC, CLTI_S_B_DESC;
29480b57cec5SDimitry Andricdef CLTI_S_H : CLTI_S_H_ENC, CLTI_S_H_DESC;
29490b57cec5SDimitry Andricdef CLTI_S_W : CLTI_S_W_ENC, CLTI_S_W_DESC;
29500b57cec5SDimitry Andricdef CLTI_S_D : CLTI_S_D_ENC, CLTI_S_D_DESC;
29510b57cec5SDimitry Andric
29520b57cec5SDimitry Andricdef CLTI_U_B : CLTI_U_B_ENC, CLTI_U_B_DESC;
29530b57cec5SDimitry Andricdef CLTI_U_H : CLTI_U_H_ENC, CLTI_U_H_DESC;
29540b57cec5SDimitry Andricdef CLTI_U_W : CLTI_U_W_ENC, CLTI_U_W_DESC;
29550b57cec5SDimitry Andricdef CLTI_U_D : CLTI_U_D_ENC, CLTI_U_D_DESC;
29560b57cec5SDimitry Andric
29570b57cec5SDimitry Andricdef COPY_S_B : COPY_S_B_ENC, COPY_S_B_DESC;
29580b57cec5SDimitry Andricdef COPY_S_H : COPY_S_H_ENC, COPY_S_H_DESC;
29590b57cec5SDimitry Andricdef COPY_S_W : COPY_S_W_ENC, COPY_S_W_DESC;
29600b57cec5SDimitry Andricdef COPY_S_D : COPY_S_D_ENC, COPY_S_D_DESC, ASE_MSA64;
29610b57cec5SDimitry Andric
29620b57cec5SDimitry Andricdef COPY_U_B : COPY_U_B_ENC, COPY_U_B_DESC;
29630b57cec5SDimitry Andricdef COPY_U_H : COPY_U_H_ENC, COPY_U_H_DESC;
29640b57cec5SDimitry Andricdef COPY_U_W : COPY_U_W_ENC, COPY_U_W_DESC, ASE_MSA64;
29650b57cec5SDimitry Andric
29660b57cec5SDimitry Andricdef COPY_FW_PSEUDO : COPY_FW_PSEUDO_DESC;
29670b57cec5SDimitry Andricdef COPY_FD_PSEUDO : COPY_FD_PSEUDO_DESC;
29680b57cec5SDimitry Andric
29690b57cec5SDimitry Andricdef CTCMSA : CTCMSA_ENC, CTCMSA_DESC;
29700b57cec5SDimitry Andric
29710b57cec5SDimitry Andricdef DIV_S_B : DIV_S_B_ENC, DIV_S_B_DESC;
29720b57cec5SDimitry Andricdef DIV_S_H : DIV_S_H_ENC, DIV_S_H_DESC;
29730b57cec5SDimitry Andricdef DIV_S_W : DIV_S_W_ENC, DIV_S_W_DESC;
29740b57cec5SDimitry Andricdef DIV_S_D : DIV_S_D_ENC, DIV_S_D_DESC;
29750b57cec5SDimitry Andric
29760b57cec5SDimitry Andricdef DIV_U_B : DIV_U_B_ENC, DIV_U_B_DESC;
29770b57cec5SDimitry Andricdef DIV_U_H : DIV_U_H_ENC, DIV_U_H_DESC;
29780b57cec5SDimitry Andricdef DIV_U_W : DIV_U_W_ENC, DIV_U_W_DESC;
29790b57cec5SDimitry Andricdef DIV_U_D : DIV_U_D_ENC, DIV_U_D_DESC;
29800b57cec5SDimitry Andric
29810b57cec5SDimitry Andricdef DOTP_S_H : DOTP_S_H_ENC, DOTP_S_H_DESC;
29820b57cec5SDimitry Andricdef DOTP_S_W : DOTP_S_W_ENC, DOTP_S_W_DESC;
29830b57cec5SDimitry Andricdef DOTP_S_D : DOTP_S_D_ENC, DOTP_S_D_DESC;
29840b57cec5SDimitry Andric
29850b57cec5SDimitry Andricdef DOTP_U_H : DOTP_U_H_ENC, DOTP_U_H_DESC;
29860b57cec5SDimitry Andricdef DOTP_U_W : DOTP_U_W_ENC, DOTP_U_W_DESC;
29870b57cec5SDimitry Andricdef DOTP_U_D : DOTP_U_D_ENC, DOTP_U_D_DESC;
29880b57cec5SDimitry Andric
29890b57cec5SDimitry Andricdef DPADD_S_H : DPADD_S_H_ENC, DPADD_S_H_DESC;
29900b57cec5SDimitry Andricdef DPADD_S_W : DPADD_S_W_ENC, DPADD_S_W_DESC;
29910b57cec5SDimitry Andricdef DPADD_S_D : DPADD_S_D_ENC, DPADD_S_D_DESC;
29920b57cec5SDimitry Andric
29930b57cec5SDimitry Andricdef DPADD_U_H : DPADD_U_H_ENC, DPADD_U_H_DESC;
29940b57cec5SDimitry Andricdef DPADD_U_W : DPADD_U_W_ENC, DPADD_U_W_DESC;
29950b57cec5SDimitry Andricdef DPADD_U_D : DPADD_U_D_ENC, DPADD_U_D_DESC;
29960b57cec5SDimitry Andric
29970b57cec5SDimitry Andricdef DPSUB_S_H : DPSUB_S_H_ENC, DPSUB_S_H_DESC;
29980b57cec5SDimitry Andricdef DPSUB_S_W : DPSUB_S_W_ENC, DPSUB_S_W_DESC;
29990b57cec5SDimitry Andricdef DPSUB_S_D : DPSUB_S_D_ENC, DPSUB_S_D_DESC;
30000b57cec5SDimitry Andric
30010b57cec5SDimitry Andricdef DPSUB_U_H : DPSUB_U_H_ENC, DPSUB_U_H_DESC;
30020b57cec5SDimitry Andricdef DPSUB_U_W : DPSUB_U_W_ENC, DPSUB_U_W_DESC;
30030b57cec5SDimitry Andricdef DPSUB_U_D : DPSUB_U_D_ENC, DPSUB_U_D_DESC;
30040b57cec5SDimitry Andric
30050b57cec5SDimitry Andricdef FADD_W : FADD_W_ENC, FADD_W_DESC;
30060b57cec5SDimitry Andricdef FADD_D : FADD_D_ENC, FADD_D_DESC;
30070b57cec5SDimitry Andric
30080b57cec5SDimitry Andricdef FCAF_W : FCAF_W_ENC, FCAF_W_DESC;
30090b57cec5SDimitry Andricdef FCAF_D : FCAF_D_ENC, FCAF_D_DESC;
30100b57cec5SDimitry Andric
30110b57cec5SDimitry Andricdef FCEQ_W : FCEQ_W_ENC, FCEQ_W_DESC;
30120b57cec5SDimitry Andricdef FCEQ_D : FCEQ_D_ENC, FCEQ_D_DESC;
30130b57cec5SDimitry Andric
30140b57cec5SDimitry Andricdef FCLE_W : FCLE_W_ENC, FCLE_W_DESC;
30150b57cec5SDimitry Andricdef FCLE_D : FCLE_D_ENC, FCLE_D_DESC;
30160b57cec5SDimitry Andric
30170b57cec5SDimitry Andricdef FCLT_W : FCLT_W_ENC, FCLT_W_DESC;
30180b57cec5SDimitry Andricdef FCLT_D : FCLT_D_ENC, FCLT_D_DESC;
30190b57cec5SDimitry Andric
30200b57cec5SDimitry Andricdef FCLASS_W : FCLASS_W_ENC, FCLASS_W_DESC;
30210b57cec5SDimitry Andricdef FCLASS_D : FCLASS_D_ENC, FCLASS_D_DESC;
30220b57cec5SDimitry Andric
30230b57cec5SDimitry Andricdef FCNE_W : FCNE_W_ENC, FCNE_W_DESC;
30240b57cec5SDimitry Andricdef FCNE_D : FCNE_D_ENC, FCNE_D_DESC;
30250b57cec5SDimitry Andric
30260b57cec5SDimitry Andricdef FCOR_W : FCOR_W_ENC, FCOR_W_DESC;
30270b57cec5SDimitry Andricdef FCOR_D : FCOR_D_ENC, FCOR_D_DESC;
30280b57cec5SDimitry Andric
30290b57cec5SDimitry Andricdef FCUEQ_W : FCUEQ_W_ENC, FCUEQ_W_DESC;
30300b57cec5SDimitry Andricdef FCUEQ_D : FCUEQ_D_ENC, FCUEQ_D_DESC;
30310b57cec5SDimitry Andric
30320b57cec5SDimitry Andricdef FCULE_W : FCULE_W_ENC, FCULE_W_DESC;
30330b57cec5SDimitry Andricdef FCULE_D : FCULE_D_ENC, FCULE_D_DESC;
30340b57cec5SDimitry Andric
30350b57cec5SDimitry Andricdef FCULT_W : FCULT_W_ENC, FCULT_W_DESC;
30360b57cec5SDimitry Andricdef FCULT_D : FCULT_D_ENC, FCULT_D_DESC;
30370b57cec5SDimitry Andric
30380b57cec5SDimitry Andricdef FCUN_W : FCUN_W_ENC, FCUN_W_DESC;
30390b57cec5SDimitry Andricdef FCUN_D : FCUN_D_ENC, FCUN_D_DESC;
30400b57cec5SDimitry Andric
30410b57cec5SDimitry Andricdef FCUNE_W : FCUNE_W_ENC, FCUNE_W_DESC;
30420b57cec5SDimitry Andricdef FCUNE_D : FCUNE_D_ENC, FCUNE_D_DESC;
30430b57cec5SDimitry Andric
30440b57cec5SDimitry Andricdef FDIV_W : FDIV_W_ENC, FDIV_W_DESC;
30450b57cec5SDimitry Andricdef FDIV_D : FDIV_D_ENC, FDIV_D_DESC;
30460b57cec5SDimitry Andric
30470b57cec5SDimitry Andricdef FEXDO_H : FEXDO_H_ENC, FEXDO_H_DESC;
30480b57cec5SDimitry Andricdef FEXDO_W : FEXDO_W_ENC, FEXDO_W_DESC;
30490b57cec5SDimitry Andric
30500b57cec5SDimitry Andricdef FEXP2_W : FEXP2_W_ENC, FEXP2_W_DESC;
30510b57cec5SDimitry Andricdef FEXP2_D : FEXP2_D_ENC, FEXP2_D_DESC;
30520b57cec5SDimitry Andricdef FEXP2_W_1_PSEUDO : FEXP2_W_1_PSEUDO_DESC;
30530b57cec5SDimitry Andricdef FEXP2_D_1_PSEUDO : FEXP2_D_1_PSEUDO_DESC;
30540b57cec5SDimitry Andric
30550b57cec5SDimitry Andricdef FEXUPL_W : FEXUPL_W_ENC, FEXUPL_W_DESC;
30560b57cec5SDimitry Andricdef FEXUPL_D : FEXUPL_D_ENC, FEXUPL_D_DESC;
30570b57cec5SDimitry Andric
30580b57cec5SDimitry Andricdef FEXUPR_W : FEXUPR_W_ENC, FEXUPR_W_DESC;
30590b57cec5SDimitry Andricdef FEXUPR_D : FEXUPR_D_ENC, FEXUPR_D_DESC;
30600b57cec5SDimitry Andric
30610b57cec5SDimitry Andricdef FFINT_S_W : FFINT_S_W_ENC, FFINT_S_W_DESC;
30620b57cec5SDimitry Andricdef FFINT_S_D : FFINT_S_D_ENC, FFINT_S_D_DESC;
30630b57cec5SDimitry Andric
30640b57cec5SDimitry Andricdef FFINT_U_W : FFINT_U_W_ENC, FFINT_U_W_DESC;
30650b57cec5SDimitry Andricdef FFINT_U_D : FFINT_U_D_ENC, FFINT_U_D_DESC;
30660b57cec5SDimitry Andric
30670b57cec5SDimitry Andricdef FFQL_W : FFQL_W_ENC, FFQL_W_DESC;
30680b57cec5SDimitry Andricdef FFQL_D : FFQL_D_ENC, FFQL_D_DESC;
30690b57cec5SDimitry Andric
30700b57cec5SDimitry Andricdef FFQR_W : FFQR_W_ENC, FFQR_W_DESC;
30710b57cec5SDimitry Andricdef FFQR_D : FFQR_D_ENC, FFQR_D_DESC;
30720b57cec5SDimitry Andric
30730b57cec5SDimitry Andricdef FILL_B : FILL_B_ENC, FILL_B_DESC;
30740b57cec5SDimitry Andricdef FILL_H : FILL_H_ENC, FILL_H_DESC;
30750b57cec5SDimitry Andricdef FILL_W : FILL_W_ENC, FILL_W_DESC;
30760b57cec5SDimitry Andricdef FILL_D : FILL_D_ENC, FILL_D_DESC, ASE_MSA64;
30770b57cec5SDimitry Andricdef FILL_FW_PSEUDO : FILL_FW_PSEUDO_DESC;
30780b57cec5SDimitry Andricdef FILL_FD_PSEUDO : FILL_FD_PSEUDO_DESC;
30790b57cec5SDimitry Andric
30800b57cec5SDimitry Andricdef FLOG2_W : FLOG2_W_ENC, FLOG2_W_DESC;
30810b57cec5SDimitry Andricdef FLOG2_D : FLOG2_D_ENC, FLOG2_D_DESC;
30820b57cec5SDimitry Andric
30830b57cec5SDimitry Andricdef FMADD_W : FMADD_W_ENC, FMADD_W_DESC;
30840b57cec5SDimitry Andricdef FMADD_D : FMADD_D_ENC, FMADD_D_DESC;
30850b57cec5SDimitry Andric
30860b57cec5SDimitry Andricdef FMAX_W : FMAX_W_ENC, FMAX_W_DESC;
30870b57cec5SDimitry Andricdef FMAX_D : FMAX_D_ENC, FMAX_D_DESC;
30880b57cec5SDimitry Andric
30890b57cec5SDimitry Andricdef FMAX_A_W : FMAX_A_W_ENC, FMAX_A_W_DESC;
30900b57cec5SDimitry Andricdef FMAX_A_D : FMAX_A_D_ENC, FMAX_A_D_DESC;
30910b57cec5SDimitry Andric
30920b57cec5SDimitry Andricdef FMIN_W : FMIN_W_ENC, FMIN_W_DESC;
30930b57cec5SDimitry Andricdef FMIN_D : FMIN_D_ENC, FMIN_D_DESC;
30940b57cec5SDimitry Andric
30950b57cec5SDimitry Andricdef FMIN_A_W : FMIN_A_W_ENC, FMIN_A_W_DESC;
30960b57cec5SDimitry Andricdef FMIN_A_D : FMIN_A_D_ENC, FMIN_A_D_DESC;
30970b57cec5SDimitry Andric
30980b57cec5SDimitry Andricdef FMSUB_W : FMSUB_W_ENC, FMSUB_W_DESC;
30990b57cec5SDimitry Andricdef FMSUB_D : FMSUB_D_ENC, FMSUB_D_DESC;
31000b57cec5SDimitry Andric
31010b57cec5SDimitry Andricdef FMUL_W : FMUL_W_ENC, FMUL_W_DESC;
31020b57cec5SDimitry Andricdef FMUL_D : FMUL_D_ENC, FMUL_D_DESC;
31030b57cec5SDimitry Andric
31040b57cec5SDimitry Andricdef FRINT_W : FRINT_W_ENC, FRINT_W_DESC;
31050b57cec5SDimitry Andricdef FRINT_D : FRINT_D_ENC, FRINT_D_DESC;
31060b57cec5SDimitry Andric
31070b57cec5SDimitry Andricdef FRCP_W : FRCP_W_ENC, FRCP_W_DESC;
31080b57cec5SDimitry Andricdef FRCP_D : FRCP_D_ENC, FRCP_D_DESC;
31090b57cec5SDimitry Andric
31100b57cec5SDimitry Andricdef FRSQRT_W : FRSQRT_W_ENC, FRSQRT_W_DESC;
31110b57cec5SDimitry Andricdef FRSQRT_D : FRSQRT_D_ENC, FRSQRT_D_DESC;
31120b57cec5SDimitry Andric
31130b57cec5SDimitry Andricdef FSAF_W : FSAF_W_ENC, FSAF_W_DESC;
31140b57cec5SDimitry Andricdef FSAF_D : FSAF_D_ENC, FSAF_D_DESC;
31150b57cec5SDimitry Andric
31160b57cec5SDimitry Andricdef FSEQ_W : FSEQ_W_ENC, FSEQ_W_DESC;
31170b57cec5SDimitry Andricdef FSEQ_D : FSEQ_D_ENC, FSEQ_D_DESC;
31180b57cec5SDimitry Andric
31190b57cec5SDimitry Andricdef FSLE_W : FSLE_W_ENC, FSLE_W_DESC;
31200b57cec5SDimitry Andricdef FSLE_D : FSLE_D_ENC, FSLE_D_DESC;
31210b57cec5SDimitry Andric
31220b57cec5SDimitry Andricdef FSLT_W : FSLT_W_ENC, FSLT_W_DESC;
31230b57cec5SDimitry Andricdef FSLT_D : FSLT_D_ENC, FSLT_D_DESC;
31240b57cec5SDimitry Andric
31250b57cec5SDimitry Andricdef FSNE_W : FSNE_W_ENC, FSNE_W_DESC;
31260b57cec5SDimitry Andricdef FSNE_D : FSNE_D_ENC, FSNE_D_DESC;
31270b57cec5SDimitry Andric
31280b57cec5SDimitry Andricdef FSOR_W : FSOR_W_ENC, FSOR_W_DESC;
31290b57cec5SDimitry Andricdef FSOR_D : FSOR_D_ENC, FSOR_D_DESC;
31300b57cec5SDimitry Andric
31310b57cec5SDimitry Andricdef FSQRT_W : FSQRT_W_ENC, FSQRT_W_DESC;
31320b57cec5SDimitry Andricdef FSQRT_D : FSQRT_D_ENC, FSQRT_D_DESC;
31330b57cec5SDimitry Andric
31340b57cec5SDimitry Andricdef FSUB_W : FSUB_W_ENC, FSUB_W_DESC;
31350b57cec5SDimitry Andricdef FSUB_D : FSUB_D_ENC, FSUB_D_DESC;
31360b57cec5SDimitry Andric
31370b57cec5SDimitry Andricdef FSUEQ_W : FSUEQ_W_ENC, FSUEQ_W_DESC;
31380b57cec5SDimitry Andricdef FSUEQ_D : FSUEQ_D_ENC, FSUEQ_D_DESC;
31390b57cec5SDimitry Andric
31400b57cec5SDimitry Andricdef FSULE_W : FSULE_W_ENC, FSULE_W_DESC;
31410b57cec5SDimitry Andricdef FSULE_D : FSULE_D_ENC, FSULE_D_DESC;
31420b57cec5SDimitry Andric
31430b57cec5SDimitry Andricdef FSULT_W : FSULT_W_ENC, FSULT_W_DESC;
31440b57cec5SDimitry Andricdef FSULT_D : FSULT_D_ENC, FSULT_D_DESC;
31450b57cec5SDimitry Andric
31460b57cec5SDimitry Andricdef FSUN_W : FSUN_W_ENC, FSUN_W_DESC;
31470b57cec5SDimitry Andricdef FSUN_D : FSUN_D_ENC, FSUN_D_DESC;
31480b57cec5SDimitry Andric
31490b57cec5SDimitry Andricdef FSUNE_W : FSUNE_W_ENC, FSUNE_W_DESC;
31500b57cec5SDimitry Andricdef FSUNE_D : FSUNE_D_ENC, FSUNE_D_DESC;
31510b57cec5SDimitry Andric
31520b57cec5SDimitry Andricdef FTINT_S_W : FTINT_S_W_ENC, FTINT_S_W_DESC;
31530b57cec5SDimitry Andricdef FTINT_S_D : FTINT_S_D_ENC, FTINT_S_D_DESC;
31540b57cec5SDimitry Andric
31550b57cec5SDimitry Andricdef FTINT_U_W : FTINT_U_W_ENC, FTINT_U_W_DESC;
31560b57cec5SDimitry Andricdef FTINT_U_D : FTINT_U_D_ENC, FTINT_U_D_DESC;
31570b57cec5SDimitry Andric
31580b57cec5SDimitry Andricdef FTQ_H : FTQ_H_ENC, FTQ_H_DESC;
31590b57cec5SDimitry Andricdef FTQ_W : FTQ_W_ENC, FTQ_W_DESC;
31600b57cec5SDimitry Andric
31610b57cec5SDimitry Andricdef FTRUNC_S_W : FTRUNC_S_W_ENC, FTRUNC_S_W_DESC;
31620b57cec5SDimitry Andricdef FTRUNC_S_D : FTRUNC_S_D_ENC, FTRUNC_S_D_DESC;
31630b57cec5SDimitry Andric
31640b57cec5SDimitry Andricdef FTRUNC_U_W : FTRUNC_U_W_ENC, FTRUNC_U_W_DESC;
31650b57cec5SDimitry Andricdef FTRUNC_U_D : FTRUNC_U_D_ENC, FTRUNC_U_D_DESC;
31660b57cec5SDimitry Andric
31670b57cec5SDimitry Andricdef : MipsPat<(fsub MSA128WOpnd:$wd, (fmul MSA128WOpnd:$ws, MSA128WOpnd:$wt)),
31680b57cec5SDimitry Andric              (FMSUB_W MSA128WOpnd:$wd, MSA128WOpnd:$ws, MSA128WOpnd:$wt)>,
31690b57cec5SDimitry Andric              ISA_MIPS1, ASE_MSA, FPOP_FUSION_FAST;
31700b57cec5SDimitry Andricdef : MipsPat<(fsub MSA128DOpnd:$wd, (fmul MSA128DOpnd:$ws, MSA128DOpnd:$wt)),
31710b57cec5SDimitry Andric              (FMSUB_D MSA128DOpnd:$wd, MSA128DOpnd:$ws, MSA128DOpnd:$wt)>,
31720b57cec5SDimitry Andric              ISA_MIPS1, ASE_MSA, FPOP_FUSION_FAST;
31730b57cec5SDimitry Andric
31740b57cec5SDimitry Andricdef : MipsPat<(fadd MSA128WOpnd:$wd, (fmul MSA128WOpnd:$ws, MSA128WOpnd:$wt)),
31750b57cec5SDimitry Andric              (FMADD_W MSA128WOpnd:$wd, MSA128WOpnd:$ws, MSA128WOpnd:$wt)>,
31760b57cec5SDimitry Andric              ISA_MIPS1, ASE_MSA, FPOP_FUSION_FAST;
31770b57cec5SDimitry Andricdef : MipsPat<(fadd MSA128DOpnd:$wd, (fmul MSA128DOpnd:$ws, MSA128DOpnd:$wt)),
31780b57cec5SDimitry Andric              (FMADD_D MSA128DOpnd:$wd, MSA128DOpnd:$ws, MSA128DOpnd:$wt)>,
31790b57cec5SDimitry Andric              ISA_MIPS1, ASE_MSA, FPOP_FUSION_FAST;
31800b57cec5SDimitry Andric
31810b57cec5SDimitry Andricdef HADD_S_H : HADD_S_H_ENC, HADD_S_H_DESC;
31820b57cec5SDimitry Andricdef HADD_S_W : HADD_S_W_ENC, HADD_S_W_DESC;
31830b57cec5SDimitry Andricdef HADD_S_D : HADD_S_D_ENC, HADD_S_D_DESC;
31840b57cec5SDimitry Andric
31850b57cec5SDimitry Andricdef HADD_U_H : HADD_U_H_ENC, HADD_U_H_DESC;
31860b57cec5SDimitry Andricdef HADD_U_W : HADD_U_W_ENC, HADD_U_W_DESC;
31870b57cec5SDimitry Andricdef HADD_U_D : HADD_U_D_ENC, HADD_U_D_DESC;
31880b57cec5SDimitry Andric
31890b57cec5SDimitry Andricdef HSUB_S_H : HSUB_S_H_ENC, HSUB_S_H_DESC;
31900b57cec5SDimitry Andricdef HSUB_S_W : HSUB_S_W_ENC, HSUB_S_W_DESC;
31910b57cec5SDimitry Andricdef HSUB_S_D : HSUB_S_D_ENC, HSUB_S_D_DESC;
31920b57cec5SDimitry Andric
31930b57cec5SDimitry Andricdef HSUB_U_H : HSUB_U_H_ENC, HSUB_U_H_DESC;
31940b57cec5SDimitry Andricdef HSUB_U_W : HSUB_U_W_ENC, HSUB_U_W_DESC;
31950b57cec5SDimitry Andricdef HSUB_U_D : HSUB_U_D_ENC, HSUB_U_D_DESC;
31960b57cec5SDimitry Andric
31970b57cec5SDimitry Andricdef ILVEV_B : ILVEV_B_ENC, ILVEV_B_DESC;
31980b57cec5SDimitry Andricdef ILVEV_H : ILVEV_H_ENC, ILVEV_H_DESC;
31990b57cec5SDimitry Andricdef ILVEV_W : ILVEV_W_ENC, ILVEV_W_DESC;
32000b57cec5SDimitry Andricdef ILVEV_D : ILVEV_D_ENC, ILVEV_D_DESC;
32010b57cec5SDimitry Andric
32020b57cec5SDimitry Andricdef ILVL_B : ILVL_B_ENC, ILVL_B_DESC;
32030b57cec5SDimitry Andricdef ILVL_H : ILVL_H_ENC, ILVL_H_DESC;
32040b57cec5SDimitry Andricdef ILVL_W : ILVL_W_ENC, ILVL_W_DESC;
32050b57cec5SDimitry Andricdef ILVL_D : ILVL_D_ENC, ILVL_D_DESC;
32060b57cec5SDimitry Andric
32070b57cec5SDimitry Andricdef ILVOD_B : ILVOD_B_ENC, ILVOD_B_DESC;
32080b57cec5SDimitry Andricdef ILVOD_H : ILVOD_H_ENC, ILVOD_H_DESC;
32090b57cec5SDimitry Andricdef ILVOD_W : ILVOD_W_ENC, ILVOD_W_DESC;
32100b57cec5SDimitry Andricdef ILVOD_D : ILVOD_D_ENC, ILVOD_D_DESC;
32110b57cec5SDimitry Andric
32120b57cec5SDimitry Andricdef ILVR_B : ILVR_B_ENC, ILVR_B_DESC;
32130b57cec5SDimitry Andricdef ILVR_H : ILVR_H_ENC, ILVR_H_DESC;
32140b57cec5SDimitry Andricdef ILVR_W : ILVR_W_ENC, ILVR_W_DESC;
32150b57cec5SDimitry Andricdef ILVR_D : ILVR_D_ENC, ILVR_D_DESC;
32160b57cec5SDimitry Andric
32170b57cec5SDimitry Andricdef INSERT_B : INSERT_B_ENC, INSERT_B_DESC;
32180b57cec5SDimitry Andricdef INSERT_H : INSERT_H_ENC, INSERT_H_DESC;
32190b57cec5SDimitry Andricdef INSERT_W : INSERT_W_ENC, INSERT_W_DESC;
32200b57cec5SDimitry Andricdef INSERT_D : INSERT_D_ENC, INSERT_D_DESC, ASE_MSA64;
32210b57cec5SDimitry Andric
32220b57cec5SDimitry Andric// INSERT_FW_PSEUDO defined after INSVE_W
32230b57cec5SDimitry Andric// INSERT_FD_PSEUDO defined after INSVE_D
32240b57cec5SDimitry Andric
32250b57cec5SDimitry Andric// There is a fourth operand that is not present in the encoding. Use a
32260b57cec5SDimitry Andric// custom decoder to get a chance to add it.
32270b57cec5SDimitry Andriclet DecoderMethod = "DecodeINSVE_DF" in {
32280b57cec5SDimitry Andric  def INSVE_B : INSVE_B_ENC, INSVE_B_DESC;
32290b57cec5SDimitry Andric  def INSVE_H : INSVE_H_ENC, INSVE_H_DESC;
32300b57cec5SDimitry Andric  def INSVE_W : INSVE_W_ENC, INSVE_W_DESC;
32310b57cec5SDimitry Andric  def INSVE_D : INSVE_D_ENC, INSVE_D_DESC;
32320b57cec5SDimitry Andric}
32330b57cec5SDimitry Andric
32340b57cec5SDimitry Andricdef INSERT_FW_PSEUDO : INSERT_FW_PSEUDO_DESC;
32350b57cec5SDimitry Andricdef INSERT_FD_PSEUDO : INSERT_FD_PSEUDO_DESC;
32360b57cec5SDimitry Andric
32370b57cec5SDimitry Andricdef INSERT_B_VIDX_PSEUDO : INSERT_B_VIDX_PSEUDO_DESC;
32380b57cec5SDimitry Andricdef INSERT_H_VIDX_PSEUDO : INSERT_H_VIDX_PSEUDO_DESC;
32390b57cec5SDimitry Andricdef INSERT_W_VIDX_PSEUDO : INSERT_W_VIDX_PSEUDO_DESC;
32400b57cec5SDimitry Andricdef INSERT_D_VIDX_PSEUDO : INSERT_D_VIDX_PSEUDO_DESC;
32410b57cec5SDimitry Andricdef INSERT_FW_VIDX_PSEUDO : INSERT_FW_VIDX_PSEUDO_DESC;
32420b57cec5SDimitry Andricdef INSERT_FD_VIDX_PSEUDO : INSERT_FD_VIDX_PSEUDO_DESC;
32430b57cec5SDimitry Andric
32440b57cec5SDimitry Andricdef INSERT_B_VIDX64_PSEUDO : INSERT_B_VIDX64_PSEUDO_DESC;
32450b57cec5SDimitry Andricdef INSERT_H_VIDX64_PSEUDO : INSERT_H_VIDX64_PSEUDO_DESC;
32460b57cec5SDimitry Andricdef INSERT_W_VIDX64_PSEUDO : INSERT_W_VIDX64_PSEUDO_DESC;
32470b57cec5SDimitry Andricdef INSERT_D_VIDX64_PSEUDO : INSERT_D_VIDX64_PSEUDO_DESC;
32480b57cec5SDimitry Andricdef INSERT_FW_VIDX64_PSEUDO : INSERT_FW_VIDX64_PSEUDO_DESC;
32490b57cec5SDimitry Andricdef INSERT_FD_VIDX64_PSEUDO : INSERT_FD_VIDX64_PSEUDO_DESC;
32500b57cec5SDimitry Andric
32510b57cec5SDimitry Andricdef LD_B: LD_B_ENC, LD_B_DESC;
32520b57cec5SDimitry Andricdef LD_H: LD_H_ENC, LD_H_DESC;
32530b57cec5SDimitry Andricdef LD_W: LD_W_ENC, LD_W_DESC;
32540b57cec5SDimitry Andricdef LD_D: LD_D_ENC, LD_D_DESC;
32550b57cec5SDimitry Andric
32560b57cec5SDimitry Andricdef LDI_B : LDI_B_ENC, LDI_B_DESC;
32570b57cec5SDimitry Andricdef LDI_H : LDI_H_ENC, LDI_H_DESC;
32580b57cec5SDimitry Andricdef LDI_W : LDI_W_ENC, LDI_W_DESC;
32590b57cec5SDimitry Andricdef LDI_D : LDI_D_ENC, LDI_D_DESC;
32600b57cec5SDimitry Andric
32610b57cec5SDimitry Andricdef LSA : LSA_ENC, LSA_DESC;
32620b57cec5SDimitry Andricdef DLSA : DLSA_ENC, DLSA_DESC, ASE_MSA64;
32630b57cec5SDimitry Andric
32640b57cec5SDimitry Andricdef MADD_Q_H : MADD_Q_H_ENC, MADD_Q_H_DESC;
32650b57cec5SDimitry Andricdef MADD_Q_W : MADD_Q_W_ENC, MADD_Q_W_DESC;
32660b57cec5SDimitry Andric
32670b57cec5SDimitry Andricdef MADDR_Q_H : MADDR_Q_H_ENC, MADDR_Q_H_DESC;
32680b57cec5SDimitry Andricdef MADDR_Q_W : MADDR_Q_W_ENC, MADDR_Q_W_DESC;
32690b57cec5SDimitry Andric
32700b57cec5SDimitry Andricdef MADDV_B : MADDV_B_ENC, MADDV_B_DESC;
32710b57cec5SDimitry Andricdef MADDV_H : MADDV_H_ENC, MADDV_H_DESC;
32720b57cec5SDimitry Andricdef MADDV_W : MADDV_W_ENC, MADDV_W_DESC;
32730b57cec5SDimitry Andricdef MADDV_D : MADDV_D_ENC, MADDV_D_DESC;
32740b57cec5SDimitry Andric
32750b57cec5SDimitry Andricdef MAX_A_B : MAX_A_B_ENC, MAX_A_B_DESC;
32760b57cec5SDimitry Andricdef MAX_A_H : MAX_A_H_ENC, MAX_A_H_DESC;
32770b57cec5SDimitry Andricdef MAX_A_W : MAX_A_W_ENC, MAX_A_W_DESC;
32780b57cec5SDimitry Andricdef MAX_A_D : MAX_A_D_ENC, MAX_A_D_DESC;
32790b57cec5SDimitry Andric
32800b57cec5SDimitry Andricdef MAX_S_B : MAX_S_B_ENC, MAX_S_B_DESC;
32810b57cec5SDimitry Andricdef MAX_S_H : MAX_S_H_ENC, MAX_S_H_DESC;
32820b57cec5SDimitry Andricdef MAX_S_W : MAX_S_W_ENC, MAX_S_W_DESC;
32830b57cec5SDimitry Andricdef MAX_S_D : MAX_S_D_ENC, MAX_S_D_DESC;
32840b57cec5SDimitry Andric
32850b57cec5SDimitry Andricdef MAX_U_B : MAX_U_B_ENC, MAX_U_B_DESC;
32860b57cec5SDimitry Andricdef MAX_U_H : MAX_U_H_ENC, MAX_U_H_DESC;
32870b57cec5SDimitry Andricdef MAX_U_W : MAX_U_W_ENC, MAX_U_W_DESC;
32880b57cec5SDimitry Andricdef MAX_U_D : MAX_U_D_ENC, MAX_U_D_DESC;
32890b57cec5SDimitry Andric
32900b57cec5SDimitry Andricdef MAXI_S_B : MAXI_S_B_ENC, MAXI_S_B_DESC;
32910b57cec5SDimitry Andricdef MAXI_S_H : MAXI_S_H_ENC, MAXI_S_H_DESC;
32920b57cec5SDimitry Andricdef MAXI_S_W : MAXI_S_W_ENC, MAXI_S_W_DESC;
32930b57cec5SDimitry Andricdef MAXI_S_D : MAXI_S_D_ENC, MAXI_S_D_DESC;
32940b57cec5SDimitry Andric
32950b57cec5SDimitry Andricdef MAXI_U_B : MAXI_U_B_ENC, MAXI_U_B_DESC;
32960b57cec5SDimitry Andricdef MAXI_U_H : MAXI_U_H_ENC, MAXI_U_H_DESC;
32970b57cec5SDimitry Andricdef MAXI_U_W : MAXI_U_W_ENC, MAXI_U_W_DESC;
32980b57cec5SDimitry Andricdef MAXI_U_D : MAXI_U_D_ENC, MAXI_U_D_DESC;
32990b57cec5SDimitry Andric
33000b57cec5SDimitry Andricdef MIN_A_B : MIN_A_B_ENC, MIN_A_B_DESC;
33010b57cec5SDimitry Andricdef MIN_A_H : MIN_A_H_ENC, MIN_A_H_DESC;
33020b57cec5SDimitry Andricdef MIN_A_W : MIN_A_W_ENC, MIN_A_W_DESC;
33030b57cec5SDimitry Andricdef MIN_A_D : MIN_A_D_ENC, MIN_A_D_DESC;
33040b57cec5SDimitry Andric
33050b57cec5SDimitry Andricdef MIN_S_B : MIN_S_B_ENC, MIN_S_B_DESC;
33060b57cec5SDimitry Andricdef MIN_S_H : MIN_S_H_ENC, MIN_S_H_DESC;
33070b57cec5SDimitry Andricdef MIN_S_W : MIN_S_W_ENC, MIN_S_W_DESC;
33080b57cec5SDimitry Andricdef MIN_S_D : MIN_S_D_ENC, MIN_S_D_DESC;
33090b57cec5SDimitry Andric
33100b57cec5SDimitry Andricdef MIN_U_B : MIN_U_B_ENC, MIN_U_B_DESC;
33110b57cec5SDimitry Andricdef MIN_U_H : MIN_U_H_ENC, MIN_U_H_DESC;
33120b57cec5SDimitry Andricdef MIN_U_W : MIN_U_W_ENC, MIN_U_W_DESC;
33130b57cec5SDimitry Andricdef MIN_U_D : MIN_U_D_ENC, MIN_U_D_DESC;
33140b57cec5SDimitry Andric
33150b57cec5SDimitry Andricdef MINI_S_B : MINI_S_B_ENC, MINI_S_B_DESC;
33160b57cec5SDimitry Andricdef MINI_S_H : MINI_S_H_ENC, MINI_S_H_DESC;
33170b57cec5SDimitry Andricdef MINI_S_W : MINI_S_W_ENC, MINI_S_W_DESC;
33180b57cec5SDimitry Andricdef MINI_S_D : MINI_S_D_ENC, MINI_S_D_DESC;
33190b57cec5SDimitry Andric
33200b57cec5SDimitry Andricdef MINI_U_B : MINI_U_B_ENC, MINI_U_B_DESC;
33210b57cec5SDimitry Andricdef MINI_U_H : MINI_U_H_ENC, MINI_U_H_DESC;
33220b57cec5SDimitry Andricdef MINI_U_W : MINI_U_W_ENC, MINI_U_W_DESC;
33230b57cec5SDimitry Andricdef MINI_U_D : MINI_U_D_ENC, MINI_U_D_DESC;
33240b57cec5SDimitry Andric
33250b57cec5SDimitry Andricdef MOD_S_B : MOD_S_B_ENC, MOD_S_B_DESC;
33260b57cec5SDimitry Andricdef MOD_S_H : MOD_S_H_ENC, MOD_S_H_DESC;
33270b57cec5SDimitry Andricdef MOD_S_W : MOD_S_W_ENC, MOD_S_W_DESC;
33280b57cec5SDimitry Andricdef MOD_S_D : MOD_S_D_ENC, MOD_S_D_DESC;
33290b57cec5SDimitry Andric
33300b57cec5SDimitry Andricdef MOD_U_B : MOD_U_B_ENC, MOD_U_B_DESC;
33310b57cec5SDimitry Andricdef MOD_U_H : MOD_U_H_ENC, MOD_U_H_DESC;
33320b57cec5SDimitry Andricdef MOD_U_W : MOD_U_W_ENC, MOD_U_W_DESC;
33330b57cec5SDimitry Andricdef MOD_U_D : MOD_U_D_ENC, MOD_U_D_DESC;
33340b57cec5SDimitry Andric
33350b57cec5SDimitry Andricdef MOVE_V : MOVE_V_ENC, MOVE_V_DESC;
33360b57cec5SDimitry Andric
33370b57cec5SDimitry Andricdef MSUB_Q_H : MSUB_Q_H_ENC, MSUB_Q_H_DESC;
33380b57cec5SDimitry Andricdef MSUB_Q_W : MSUB_Q_W_ENC, MSUB_Q_W_DESC;
33390b57cec5SDimitry Andric
33400b57cec5SDimitry Andricdef MSUBR_Q_H : MSUBR_Q_H_ENC, MSUBR_Q_H_DESC;
33410b57cec5SDimitry Andricdef MSUBR_Q_W : MSUBR_Q_W_ENC, MSUBR_Q_W_DESC;
33420b57cec5SDimitry Andric
33430b57cec5SDimitry Andricdef MSUBV_B : MSUBV_B_ENC, MSUBV_B_DESC;
33440b57cec5SDimitry Andricdef MSUBV_H : MSUBV_H_ENC, MSUBV_H_DESC;
33450b57cec5SDimitry Andricdef MSUBV_W : MSUBV_W_ENC, MSUBV_W_DESC;
33460b57cec5SDimitry Andricdef MSUBV_D : MSUBV_D_ENC, MSUBV_D_DESC;
33470b57cec5SDimitry Andric
33480b57cec5SDimitry Andricdef MUL_Q_H : MUL_Q_H_ENC, MUL_Q_H_DESC;
33490b57cec5SDimitry Andricdef MUL_Q_W : MUL_Q_W_ENC, MUL_Q_W_DESC;
33500b57cec5SDimitry Andric
33510b57cec5SDimitry Andricdef MULR_Q_H : MULR_Q_H_ENC, MULR_Q_H_DESC;
33520b57cec5SDimitry Andricdef MULR_Q_W : MULR_Q_W_ENC, MULR_Q_W_DESC;
33530b57cec5SDimitry Andric
33540b57cec5SDimitry Andricdef MULV_B : MULV_B_ENC, MULV_B_DESC;
33550b57cec5SDimitry Andricdef MULV_H : MULV_H_ENC, MULV_H_DESC;
33560b57cec5SDimitry Andricdef MULV_W : MULV_W_ENC, MULV_W_DESC;
33570b57cec5SDimitry Andricdef MULV_D : MULV_D_ENC, MULV_D_DESC;
33580b57cec5SDimitry Andric
33590b57cec5SDimitry Andricdef NLOC_B : NLOC_B_ENC, NLOC_B_DESC;
33600b57cec5SDimitry Andricdef NLOC_H : NLOC_H_ENC, NLOC_H_DESC;
33610b57cec5SDimitry Andricdef NLOC_W : NLOC_W_ENC, NLOC_W_DESC;
33620b57cec5SDimitry Andricdef NLOC_D : NLOC_D_ENC, NLOC_D_DESC;
33630b57cec5SDimitry Andric
33640b57cec5SDimitry Andricdef NLZC_B : NLZC_B_ENC, NLZC_B_DESC;
33650b57cec5SDimitry Andricdef NLZC_H : NLZC_H_ENC, NLZC_H_DESC;
33660b57cec5SDimitry Andricdef NLZC_W : NLZC_W_ENC, NLZC_W_DESC;
33670b57cec5SDimitry Andricdef NLZC_D : NLZC_D_ENC, NLZC_D_DESC;
33680b57cec5SDimitry Andric
33690b57cec5SDimitry Andricdef NOR_V : NOR_V_ENC, NOR_V_DESC;
33700b57cec5SDimitry Andricdef NOR_V_H_PSEUDO : NOR_V_H_PSEUDO_DESC,
33710b57cec5SDimitry Andric                     PseudoInstExpansion<(NOR_V MSA128BOpnd:$wd,
33720b57cec5SDimitry Andric                                                MSA128BOpnd:$ws,
33730b57cec5SDimitry Andric                                                MSA128BOpnd:$wt)>;
33740b57cec5SDimitry Andricdef NOR_V_W_PSEUDO : NOR_V_W_PSEUDO_DESC,
33750b57cec5SDimitry Andric                     PseudoInstExpansion<(NOR_V MSA128BOpnd:$wd,
33760b57cec5SDimitry Andric                                                MSA128BOpnd:$ws,
33770b57cec5SDimitry Andric                                                MSA128BOpnd:$wt)>;
33780b57cec5SDimitry Andricdef NOR_V_D_PSEUDO : NOR_V_D_PSEUDO_DESC,
33790b57cec5SDimitry Andric                     PseudoInstExpansion<(NOR_V MSA128BOpnd:$wd,
33800b57cec5SDimitry Andric                                                MSA128BOpnd:$ws,
33810b57cec5SDimitry Andric                                                MSA128BOpnd:$wt)>;
33820b57cec5SDimitry Andric
33830b57cec5SDimitry Andricdef NORI_B : NORI_B_ENC, NORI_B_DESC;
33840b57cec5SDimitry Andric
33850b57cec5SDimitry Andricdef OR_V : OR_V_ENC, OR_V_DESC;
33860b57cec5SDimitry Andricdef OR_V_H_PSEUDO : OR_V_H_PSEUDO_DESC,
33870b57cec5SDimitry Andric                    PseudoInstExpansion<(OR_V MSA128BOpnd:$wd,
33880b57cec5SDimitry Andric                                              MSA128BOpnd:$ws,
33890b57cec5SDimitry Andric                                              MSA128BOpnd:$wt)>;
33900b57cec5SDimitry Andricdef OR_V_W_PSEUDO : OR_V_W_PSEUDO_DESC,
33910b57cec5SDimitry Andric                    PseudoInstExpansion<(OR_V MSA128BOpnd:$wd,
33920b57cec5SDimitry Andric                                              MSA128BOpnd:$ws,
33930b57cec5SDimitry Andric                                              MSA128BOpnd:$wt)>;
33940b57cec5SDimitry Andricdef OR_V_D_PSEUDO : OR_V_D_PSEUDO_DESC,
33950b57cec5SDimitry Andric                    PseudoInstExpansion<(OR_V MSA128BOpnd:$wd,
33960b57cec5SDimitry Andric                                              MSA128BOpnd:$ws,
33970b57cec5SDimitry Andric                                              MSA128BOpnd:$wt)>;
33980b57cec5SDimitry Andric
33990b57cec5SDimitry Andricdef ORI_B : ORI_B_ENC, ORI_B_DESC;
34000b57cec5SDimitry Andric
34010b57cec5SDimitry Andricdef PCKEV_B : PCKEV_B_ENC, PCKEV_B_DESC;
34020b57cec5SDimitry Andricdef PCKEV_H : PCKEV_H_ENC, PCKEV_H_DESC;
34030b57cec5SDimitry Andricdef PCKEV_W : PCKEV_W_ENC, PCKEV_W_DESC;
34040b57cec5SDimitry Andricdef PCKEV_D : PCKEV_D_ENC, PCKEV_D_DESC;
34050b57cec5SDimitry Andric
34060b57cec5SDimitry Andricdef PCKOD_B : PCKOD_B_ENC, PCKOD_B_DESC;
34070b57cec5SDimitry Andricdef PCKOD_H : PCKOD_H_ENC, PCKOD_H_DESC;
34080b57cec5SDimitry Andricdef PCKOD_W : PCKOD_W_ENC, PCKOD_W_DESC;
34090b57cec5SDimitry Andricdef PCKOD_D : PCKOD_D_ENC, PCKOD_D_DESC;
34100b57cec5SDimitry Andric
34110b57cec5SDimitry Andricdef PCNT_B : PCNT_B_ENC, PCNT_B_DESC;
34120b57cec5SDimitry Andricdef PCNT_H : PCNT_H_ENC, PCNT_H_DESC;
34130b57cec5SDimitry Andricdef PCNT_W : PCNT_W_ENC, PCNT_W_DESC;
34140b57cec5SDimitry Andricdef PCNT_D : PCNT_D_ENC, PCNT_D_DESC;
34150b57cec5SDimitry Andric
34160b57cec5SDimitry Andricdef SAT_S_B : SAT_S_B_ENC, SAT_S_B_DESC;
34170b57cec5SDimitry Andricdef SAT_S_H : SAT_S_H_ENC, SAT_S_H_DESC;
34180b57cec5SDimitry Andricdef SAT_S_W : SAT_S_W_ENC, SAT_S_W_DESC;
34190b57cec5SDimitry Andricdef SAT_S_D : SAT_S_D_ENC, SAT_S_D_DESC;
34200b57cec5SDimitry Andric
34210b57cec5SDimitry Andricdef SAT_U_B : SAT_U_B_ENC, SAT_U_B_DESC;
34220b57cec5SDimitry Andricdef SAT_U_H : SAT_U_H_ENC, SAT_U_H_DESC;
34230b57cec5SDimitry Andricdef SAT_U_W : SAT_U_W_ENC, SAT_U_W_DESC;
34240b57cec5SDimitry Andricdef SAT_U_D : SAT_U_D_ENC, SAT_U_D_DESC;
34250b57cec5SDimitry Andric
34260b57cec5SDimitry Andricdef SHF_B : SHF_B_ENC, SHF_B_DESC;
34270b57cec5SDimitry Andricdef SHF_H : SHF_H_ENC, SHF_H_DESC;
34280b57cec5SDimitry Andricdef SHF_W : SHF_W_ENC, SHF_W_DESC;
34290b57cec5SDimitry Andric
34300b57cec5SDimitry Andricdef SLD_B : SLD_B_ENC, SLD_B_DESC;
34310b57cec5SDimitry Andricdef SLD_H : SLD_H_ENC, SLD_H_DESC;
34320b57cec5SDimitry Andricdef SLD_W : SLD_W_ENC, SLD_W_DESC;
34330b57cec5SDimitry Andricdef SLD_D : SLD_D_ENC, SLD_D_DESC;
34340b57cec5SDimitry Andric
34350b57cec5SDimitry Andricdef SLDI_B : SLDI_B_ENC, SLDI_B_DESC;
34360b57cec5SDimitry Andricdef SLDI_H : SLDI_H_ENC, SLDI_H_DESC;
34370b57cec5SDimitry Andricdef SLDI_W : SLDI_W_ENC, SLDI_W_DESC;
34380b57cec5SDimitry Andricdef SLDI_D : SLDI_D_ENC, SLDI_D_DESC;
34390b57cec5SDimitry Andric
34400b57cec5SDimitry Andricdef SLL_B : SLL_B_ENC, SLL_B_DESC;
34410b57cec5SDimitry Andricdef SLL_H : SLL_H_ENC, SLL_H_DESC;
34420b57cec5SDimitry Andricdef SLL_W : SLL_W_ENC, SLL_W_DESC;
34430b57cec5SDimitry Andricdef SLL_D : SLL_D_ENC, SLL_D_DESC;
34440b57cec5SDimitry Andric
34450b57cec5SDimitry Andricdef SLLI_B : SLLI_B_ENC, SLLI_B_DESC;
34460b57cec5SDimitry Andricdef SLLI_H : SLLI_H_ENC, SLLI_H_DESC;
34470b57cec5SDimitry Andricdef SLLI_W : SLLI_W_ENC, SLLI_W_DESC;
34480b57cec5SDimitry Andricdef SLLI_D : SLLI_D_ENC, SLLI_D_DESC;
34490b57cec5SDimitry Andric
34500b57cec5SDimitry Andricdef SPLAT_B : SPLAT_B_ENC, SPLAT_B_DESC;
34510b57cec5SDimitry Andricdef SPLAT_H : SPLAT_H_ENC, SPLAT_H_DESC;
34520b57cec5SDimitry Andricdef SPLAT_W : SPLAT_W_ENC, SPLAT_W_DESC;
34530b57cec5SDimitry Andricdef SPLAT_D : SPLAT_D_ENC, SPLAT_D_DESC;
34540b57cec5SDimitry Andric
34550b57cec5SDimitry Andricdef SPLATI_B : SPLATI_B_ENC, SPLATI_B_DESC;
34560b57cec5SDimitry Andricdef SPLATI_H : SPLATI_H_ENC, SPLATI_H_DESC;
34570b57cec5SDimitry Andricdef SPLATI_W : SPLATI_W_ENC, SPLATI_W_DESC;
34580b57cec5SDimitry Andricdef SPLATI_D : SPLATI_D_ENC, SPLATI_D_DESC;
34590b57cec5SDimitry Andric
34600b57cec5SDimitry Andricdef SRA_B : SRA_B_ENC, SRA_B_DESC;
34610b57cec5SDimitry Andricdef SRA_H : SRA_H_ENC, SRA_H_DESC;
34620b57cec5SDimitry Andricdef SRA_W : SRA_W_ENC, SRA_W_DESC;
34630b57cec5SDimitry Andricdef SRA_D : SRA_D_ENC, SRA_D_DESC;
34640b57cec5SDimitry Andric
34650b57cec5SDimitry Andricdef SRAI_B : SRAI_B_ENC, SRAI_B_DESC;
34660b57cec5SDimitry Andricdef SRAI_H : SRAI_H_ENC, SRAI_H_DESC;
34670b57cec5SDimitry Andricdef SRAI_W : SRAI_W_ENC, SRAI_W_DESC;
34680b57cec5SDimitry Andricdef SRAI_D : SRAI_D_ENC, SRAI_D_DESC;
34690b57cec5SDimitry Andric
34700b57cec5SDimitry Andricdef SRAR_B : SRAR_B_ENC, SRAR_B_DESC;
34710b57cec5SDimitry Andricdef SRAR_H : SRAR_H_ENC, SRAR_H_DESC;
34720b57cec5SDimitry Andricdef SRAR_W : SRAR_W_ENC, SRAR_W_DESC;
34730b57cec5SDimitry Andricdef SRAR_D : SRAR_D_ENC, SRAR_D_DESC;
34740b57cec5SDimitry Andric
34750b57cec5SDimitry Andricdef SRARI_B : SRARI_B_ENC, SRARI_B_DESC;
34760b57cec5SDimitry Andricdef SRARI_H : SRARI_H_ENC, SRARI_H_DESC;
34770b57cec5SDimitry Andricdef SRARI_W : SRARI_W_ENC, SRARI_W_DESC;
34780b57cec5SDimitry Andricdef SRARI_D : SRARI_D_ENC, SRARI_D_DESC;
34790b57cec5SDimitry Andric
34800b57cec5SDimitry Andricdef SRL_B : SRL_B_ENC, SRL_B_DESC;
34810b57cec5SDimitry Andricdef SRL_H : SRL_H_ENC, SRL_H_DESC;
34820b57cec5SDimitry Andricdef SRL_W : SRL_W_ENC, SRL_W_DESC;
34830b57cec5SDimitry Andricdef SRL_D : SRL_D_ENC, SRL_D_DESC;
34840b57cec5SDimitry Andric
34850b57cec5SDimitry Andricdef SRLI_B : SRLI_B_ENC, SRLI_B_DESC;
34860b57cec5SDimitry Andricdef SRLI_H : SRLI_H_ENC, SRLI_H_DESC;
34870b57cec5SDimitry Andricdef SRLI_W : SRLI_W_ENC, SRLI_W_DESC;
34880b57cec5SDimitry Andricdef SRLI_D : SRLI_D_ENC, SRLI_D_DESC;
34890b57cec5SDimitry Andric
34900b57cec5SDimitry Andricdef SRLR_B : SRLR_B_ENC, SRLR_B_DESC;
34910b57cec5SDimitry Andricdef SRLR_H : SRLR_H_ENC, SRLR_H_DESC;
34920b57cec5SDimitry Andricdef SRLR_W : SRLR_W_ENC, SRLR_W_DESC;
34930b57cec5SDimitry Andricdef SRLR_D : SRLR_D_ENC, SRLR_D_DESC;
34940b57cec5SDimitry Andric
34950b57cec5SDimitry Andricdef SRLRI_B : SRLRI_B_ENC, SRLRI_B_DESC;
34960b57cec5SDimitry Andricdef SRLRI_H : SRLRI_H_ENC, SRLRI_H_DESC;
34970b57cec5SDimitry Andricdef SRLRI_W : SRLRI_W_ENC, SRLRI_W_DESC;
34980b57cec5SDimitry Andricdef SRLRI_D : SRLRI_D_ENC, SRLRI_D_DESC;
34990b57cec5SDimitry Andric
35000b57cec5SDimitry Andricdef ST_B: ST_B_ENC, ST_B_DESC;
35010b57cec5SDimitry Andricdef ST_H: ST_H_ENC, ST_H_DESC;
35020b57cec5SDimitry Andricdef ST_W: ST_W_ENC, ST_W_DESC;
35030b57cec5SDimitry Andricdef ST_D: ST_D_ENC, ST_D_DESC;
35040b57cec5SDimitry Andric
35050b57cec5SDimitry Andricdef SUBS_S_B : SUBS_S_B_ENC, SUBS_S_B_DESC;
35060b57cec5SDimitry Andricdef SUBS_S_H : SUBS_S_H_ENC, SUBS_S_H_DESC;
35070b57cec5SDimitry Andricdef SUBS_S_W : SUBS_S_W_ENC, SUBS_S_W_DESC;
35080b57cec5SDimitry Andricdef SUBS_S_D : SUBS_S_D_ENC, SUBS_S_D_DESC;
35090b57cec5SDimitry Andric
35100b57cec5SDimitry Andricdef SUBS_U_B : SUBS_U_B_ENC, SUBS_U_B_DESC;
35110b57cec5SDimitry Andricdef SUBS_U_H : SUBS_U_H_ENC, SUBS_U_H_DESC;
35120b57cec5SDimitry Andricdef SUBS_U_W : SUBS_U_W_ENC, SUBS_U_W_DESC;
35130b57cec5SDimitry Andricdef SUBS_U_D : SUBS_U_D_ENC, SUBS_U_D_DESC;
35140b57cec5SDimitry Andric
35150b57cec5SDimitry Andricdef SUBSUS_U_B : SUBSUS_U_B_ENC, SUBSUS_U_B_DESC;
35160b57cec5SDimitry Andricdef SUBSUS_U_H : SUBSUS_U_H_ENC, SUBSUS_U_H_DESC;
35170b57cec5SDimitry Andricdef SUBSUS_U_W : SUBSUS_U_W_ENC, SUBSUS_U_W_DESC;
35180b57cec5SDimitry Andricdef SUBSUS_U_D : SUBSUS_U_D_ENC, SUBSUS_U_D_DESC;
35190b57cec5SDimitry Andric
35200b57cec5SDimitry Andricdef SUBSUU_S_B : SUBSUU_S_B_ENC, SUBSUU_S_B_DESC;
35210b57cec5SDimitry Andricdef SUBSUU_S_H : SUBSUU_S_H_ENC, SUBSUU_S_H_DESC;
35220b57cec5SDimitry Andricdef SUBSUU_S_W : SUBSUU_S_W_ENC, SUBSUU_S_W_DESC;
35230b57cec5SDimitry Andricdef SUBSUU_S_D : SUBSUU_S_D_ENC, SUBSUU_S_D_DESC;
35240b57cec5SDimitry Andric
35250b57cec5SDimitry Andricdef SUBV_B : SUBV_B_ENC, SUBV_B_DESC;
35260b57cec5SDimitry Andricdef SUBV_H : SUBV_H_ENC, SUBV_H_DESC;
35270b57cec5SDimitry Andricdef SUBV_W : SUBV_W_ENC, SUBV_W_DESC;
35280b57cec5SDimitry Andricdef SUBV_D : SUBV_D_ENC, SUBV_D_DESC;
35290b57cec5SDimitry Andric
35300b57cec5SDimitry Andricdef SUBVI_B : SUBVI_B_ENC, SUBVI_B_DESC;
35310b57cec5SDimitry Andricdef SUBVI_H : SUBVI_H_ENC, SUBVI_H_DESC;
35320b57cec5SDimitry Andricdef SUBVI_W : SUBVI_W_ENC, SUBVI_W_DESC;
35330b57cec5SDimitry Andricdef SUBVI_D : SUBVI_D_ENC, SUBVI_D_DESC;
35340b57cec5SDimitry Andric
35350b57cec5SDimitry Andricdef VSHF_B : VSHF_B_ENC, VSHF_B_DESC;
35360b57cec5SDimitry Andricdef VSHF_H : VSHF_H_ENC, VSHF_H_DESC;
35370b57cec5SDimitry Andricdef VSHF_W : VSHF_W_ENC, VSHF_W_DESC;
35380b57cec5SDimitry Andricdef VSHF_D : VSHF_D_ENC, VSHF_D_DESC;
35390b57cec5SDimitry Andric
35400b57cec5SDimitry Andricdef XOR_V : XOR_V_ENC, XOR_V_DESC;
35410b57cec5SDimitry Andricdef XOR_V_H_PSEUDO : XOR_V_H_PSEUDO_DESC,
35420b57cec5SDimitry Andric                     PseudoInstExpansion<(XOR_V MSA128BOpnd:$wd,
35430b57cec5SDimitry Andric                                                MSA128BOpnd:$ws,
35440b57cec5SDimitry Andric                                                MSA128BOpnd:$wt)>;
35450b57cec5SDimitry Andricdef XOR_V_W_PSEUDO : XOR_V_W_PSEUDO_DESC,
35460b57cec5SDimitry Andric                     PseudoInstExpansion<(XOR_V MSA128BOpnd:$wd,
35470b57cec5SDimitry Andric                                                MSA128BOpnd:$ws,
35480b57cec5SDimitry Andric                                                MSA128BOpnd:$wt)>;
35490b57cec5SDimitry Andricdef XOR_V_D_PSEUDO : XOR_V_D_PSEUDO_DESC,
35500b57cec5SDimitry Andric                     PseudoInstExpansion<(XOR_V MSA128BOpnd:$wd,
35510b57cec5SDimitry Andric                                                MSA128BOpnd:$ws,
35520b57cec5SDimitry Andric                                                MSA128BOpnd:$wt)>;
35530b57cec5SDimitry Andric
35540b57cec5SDimitry Andricdef XORI_B : XORI_B_ENC, XORI_B_DESC;
35550b57cec5SDimitry Andric
35560b57cec5SDimitry Andric// Patterns.
35570b57cec5SDimitry Andricclass MSAPat<dag pattern, dag result, list<Predicate> pred = [HasMSA]> :
35580b57cec5SDimitry Andric  Pat<pattern, result>, Requires<pred>;
35590b57cec5SDimitry Andric
35600b57cec5SDimitry Andricdef : MSAPat<(extractelt (v4i32 MSA128W:$ws), immZExt4:$idx),
35610b57cec5SDimitry Andric             (COPY_S_W MSA128W:$ws, immZExt4:$idx)>;
35620b57cec5SDimitry Andric
35630b57cec5SDimitry Andricdef : MSAPat<(v8f16 (load addrimm10lsl1:$addr)), (LD_H addrimm10lsl1:$addr)>;
35640b57cec5SDimitry Andricdef : MSAPat<(v4f32 (load addrimm10lsl2:$addr)), (LD_W addrimm10lsl2:$addr)>;
35650b57cec5SDimitry Andricdef : MSAPat<(v2f64 (load addrimm10lsl3:$addr)), (LD_D addrimm10lsl3:$addr)>;
35660b57cec5SDimitry Andric
35670b57cec5SDimitry Andricdef ST_FH : MSAPat<(store (v8f16 MSA128H:$ws), addrimm10lsl1:$addr),
35680b57cec5SDimitry Andric                   (ST_H MSA128H:$ws, addrimm10lsl1:$addr)>;
35690b57cec5SDimitry Andricdef ST_FW : MSAPat<(store (v4f32 MSA128W:$ws), addrimm10lsl2:$addr),
35700b57cec5SDimitry Andric                   (ST_W MSA128W:$ws, addrimm10lsl2:$addr)>;
35710b57cec5SDimitry Andricdef ST_FD : MSAPat<(store (v2f64 MSA128D:$ws), addrimm10lsl3:$addr),
35720b57cec5SDimitry Andric                   (ST_D MSA128D:$ws, addrimm10lsl3:$addr)>;
35730b57cec5SDimitry Andric
35740b57cec5SDimitry Andricclass MSA_FABS_PSEUDO_DESC_BASE<RegisterOperand ROWD,
35750b57cec5SDimitry Andric                                RegisterOperand ROWS = ROWD,
35760b57cec5SDimitry Andric                                InstrItinClass itin = NoItinerary> :
35770b57cec5SDimitry Andric  MSAPseudo<(outs ROWD:$wd),
35780b57cec5SDimitry Andric            (ins ROWS:$ws),
35790b57cec5SDimitry Andric            [(set ROWD:$wd, (fabs ROWS:$ws))]> {
35800b57cec5SDimitry Andric  InstrItinClass Itinerary = itin;
35810b57cec5SDimitry Andric}
35820b57cec5SDimitry Andricdef FABS_W : MSA_FABS_PSEUDO_DESC_BASE<MSA128WOpnd>,
35830b57cec5SDimitry Andric             PseudoInstExpansion<(FMAX_A_W MSA128WOpnd:$wd, MSA128WOpnd:$ws,
35840b57cec5SDimitry Andric                                           MSA128WOpnd:$ws)>;
35850b57cec5SDimitry Andricdef FABS_D : MSA_FABS_PSEUDO_DESC_BASE<MSA128DOpnd>,
35860b57cec5SDimitry Andric             PseudoInstExpansion<(FMAX_A_D MSA128DOpnd:$wd, MSA128DOpnd:$ws,
35870b57cec5SDimitry Andric                                           MSA128DOpnd:$ws)>;
35880b57cec5SDimitry Andric
35890b57cec5SDimitry Andricclass MSABitconvertPat<ValueType DstVT, ValueType SrcVT,
35900b57cec5SDimitry Andric                       RegisterClass DstRC, list<Predicate> preds = [HasMSA]> :
35910b57cec5SDimitry Andric   MSAPat<(DstVT (bitconvert SrcVT:$src)),
35920b57cec5SDimitry Andric          (COPY_TO_REGCLASS SrcVT:$src, DstRC), preds>;
35930b57cec5SDimitry Andric
35940b57cec5SDimitry Andric// These are endian-independent because the element size doesnt change
35950b57cec5SDimitry Andricdef : MSABitconvertPat<v8i16, v8f16, MSA128H>;
35960b57cec5SDimitry Andricdef : MSABitconvertPat<v4i32, v4f32, MSA128W>;
35970b57cec5SDimitry Andricdef : MSABitconvertPat<v2i64, v2f64, MSA128D>;
35980b57cec5SDimitry Andricdef : MSABitconvertPat<v8f16, v8i16, MSA128H>;
35990b57cec5SDimitry Andricdef : MSABitconvertPat<v4f32, v4i32, MSA128W>;
36000b57cec5SDimitry Andricdef : MSABitconvertPat<v2f64, v2i64, MSA128D>;
36010b57cec5SDimitry Andric
36020b57cec5SDimitry Andric// Little endian bitcasts are always no-ops
36030b57cec5SDimitry Andricdef : MSABitconvertPat<v16i8, v8i16, MSA128B, [HasMSA, IsLE]>;
36040b57cec5SDimitry Andricdef : MSABitconvertPat<v16i8, v4i32, MSA128B, [HasMSA, IsLE]>;
36050b57cec5SDimitry Andricdef : MSABitconvertPat<v16i8, v2i64, MSA128B, [HasMSA, IsLE]>;
36060b57cec5SDimitry Andricdef : MSABitconvertPat<v16i8, v8f16, MSA128B, [HasMSA, IsLE]>;
36070b57cec5SDimitry Andricdef : MSABitconvertPat<v16i8, v4f32, MSA128B, [HasMSA, IsLE]>;
36080b57cec5SDimitry Andricdef : MSABitconvertPat<v16i8, v2f64, MSA128B, [HasMSA, IsLE]>;
36090b57cec5SDimitry Andric
36100b57cec5SDimitry Andricdef : MSABitconvertPat<v8i16, v16i8, MSA128H, [HasMSA, IsLE]>;
36110b57cec5SDimitry Andricdef : MSABitconvertPat<v8i16, v4i32, MSA128H, [HasMSA, IsLE]>;
36120b57cec5SDimitry Andricdef : MSABitconvertPat<v8i16, v2i64, MSA128H, [HasMSA, IsLE]>;
36130b57cec5SDimitry Andricdef : MSABitconvertPat<v8i16, v4f32, MSA128H, [HasMSA, IsLE]>;
36140b57cec5SDimitry Andricdef : MSABitconvertPat<v8i16, v2f64, MSA128H, [HasMSA, IsLE]>;
36150b57cec5SDimitry Andric
36160b57cec5SDimitry Andricdef : MSABitconvertPat<v4i32, v16i8, MSA128W, [HasMSA, IsLE]>;
36170b57cec5SDimitry Andricdef : MSABitconvertPat<v4i32, v8i16, MSA128W, [HasMSA, IsLE]>;
36180b57cec5SDimitry Andricdef : MSABitconvertPat<v4i32, v2i64, MSA128W, [HasMSA, IsLE]>;
36190b57cec5SDimitry Andricdef : MSABitconvertPat<v4i32, v8f16, MSA128W, [HasMSA, IsLE]>;
36200b57cec5SDimitry Andricdef : MSABitconvertPat<v4i32, v2f64, MSA128W, [HasMSA, IsLE]>;
36210b57cec5SDimitry Andric
36220b57cec5SDimitry Andricdef : MSABitconvertPat<v2i64, v16i8, MSA128D, [HasMSA, IsLE]>;
36230b57cec5SDimitry Andricdef : MSABitconvertPat<v2i64, v8i16, MSA128D, [HasMSA, IsLE]>;
36240b57cec5SDimitry Andricdef : MSABitconvertPat<v2i64, v4i32, MSA128D, [HasMSA, IsLE]>;
36250b57cec5SDimitry Andricdef : MSABitconvertPat<v2i64, v8f16, MSA128D, [HasMSA, IsLE]>;
36260b57cec5SDimitry Andricdef : MSABitconvertPat<v2i64, v4f32, MSA128D, [HasMSA, IsLE]>;
36270b57cec5SDimitry Andric
36280b57cec5SDimitry Andricdef : MSABitconvertPat<v4f32, v16i8, MSA128W, [HasMSA, IsLE]>;
36290b57cec5SDimitry Andricdef : MSABitconvertPat<v4f32, v8i16, MSA128W, [HasMSA, IsLE]>;
36300b57cec5SDimitry Andricdef : MSABitconvertPat<v4f32, v2i64, MSA128W, [HasMSA, IsLE]>;
36310b57cec5SDimitry Andricdef : MSABitconvertPat<v4f32, v8f16, MSA128W, [HasMSA, IsLE]>;
36320b57cec5SDimitry Andricdef : MSABitconvertPat<v4f32, v2f64, MSA128W, [HasMSA, IsLE]>;
36330b57cec5SDimitry Andric
36340b57cec5SDimitry Andricdef : MSABitconvertPat<v2f64, v16i8, MSA128D, [HasMSA, IsLE]>;
36350b57cec5SDimitry Andricdef : MSABitconvertPat<v2f64, v8i16, MSA128D, [HasMSA, IsLE]>;
36360b57cec5SDimitry Andricdef : MSABitconvertPat<v2f64, v4i32, MSA128D, [HasMSA, IsLE]>;
36370b57cec5SDimitry Andricdef : MSABitconvertPat<v2f64, v8f16, MSA128D, [HasMSA, IsLE]>;
36380b57cec5SDimitry Andricdef : MSABitconvertPat<v2f64, v4f32, MSA128D, [HasMSA, IsLE]>;
36390b57cec5SDimitry Andric
36400b57cec5SDimitry Andric// Big endian bitcasts expand to shuffle instructions.
36410b57cec5SDimitry Andric// This is because bitcast is defined to be a store/load sequence and the
36420b57cec5SDimitry Andric// vector store/load instructions are mixed-endian with respect to the vector
36430b57cec5SDimitry Andric// as a whole (little endian with respect to element order, but big endian
36440b57cec5SDimitry Andric// elements).
36450b57cec5SDimitry Andric
36460b57cec5SDimitry Andricclass MSABitconvertReverseQuartersPat<ValueType DstVT, ValueType SrcVT,
36470b57cec5SDimitry Andric                                      RegisterClass DstRC, MSAInst Insn,
36480b57cec5SDimitry Andric                                      RegisterClass ViaRC> :
36490b57cec5SDimitry Andric  MSAPat<(DstVT (bitconvert SrcVT:$src)),
36500b57cec5SDimitry Andric         (COPY_TO_REGCLASS (Insn (COPY_TO_REGCLASS SrcVT:$src, ViaRC), 27),
36510b57cec5SDimitry Andric                           DstRC),
36520b57cec5SDimitry Andric         [HasMSA, IsBE]>;
36530b57cec5SDimitry Andric
36540b57cec5SDimitry Andricclass MSABitconvertReverseHalvesPat<ValueType DstVT, ValueType SrcVT,
36550b57cec5SDimitry Andric                                    RegisterClass DstRC, MSAInst Insn,
36560b57cec5SDimitry Andric                                    RegisterClass ViaRC> :
36570b57cec5SDimitry Andric  MSAPat<(DstVT (bitconvert SrcVT:$src)),
36580b57cec5SDimitry Andric         (COPY_TO_REGCLASS (Insn (COPY_TO_REGCLASS SrcVT:$src, ViaRC), 177),
36590b57cec5SDimitry Andric                           DstRC),
36600b57cec5SDimitry Andric         [HasMSA, IsBE]>;
36610b57cec5SDimitry Andric
36620b57cec5SDimitry Andricclass MSABitconvertReverseBInHPat<ValueType DstVT, ValueType SrcVT,
36630b57cec5SDimitry Andric                                  RegisterClass DstRC> :
36640b57cec5SDimitry Andric  MSABitconvertReverseHalvesPat<DstVT, SrcVT, DstRC, SHF_B, MSA128B>;
36650b57cec5SDimitry Andric
36660b57cec5SDimitry Andricclass MSABitconvertReverseBInWPat<ValueType DstVT, ValueType SrcVT,
36670b57cec5SDimitry Andric                                  RegisterClass DstRC> :
36680b57cec5SDimitry Andric  MSABitconvertReverseQuartersPat<DstVT, SrcVT, DstRC, SHF_B, MSA128B>;
36690b57cec5SDimitry Andric
36700b57cec5SDimitry Andricclass MSABitconvertReverseBInDPat<ValueType DstVT, ValueType SrcVT,
36710b57cec5SDimitry Andric                                  RegisterClass DstRC> :
36720b57cec5SDimitry Andric  MSAPat<(DstVT (bitconvert SrcVT:$src)),
36730b57cec5SDimitry Andric         (COPY_TO_REGCLASS
36740b57cec5SDimitry Andric           (SHF_W
36750b57cec5SDimitry Andric             (COPY_TO_REGCLASS
36760b57cec5SDimitry Andric               (SHF_B (COPY_TO_REGCLASS SrcVT:$src, MSA128B), 27),
36770b57cec5SDimitry Andric               MSA128W), 177),
36780b57cec5SDimitry Andric           DstRC),
36790b57cec5SDimitry Andric         [HasMSA, IsBE]>;
36800b57cec5SDimitry Andric
36810b57cec5SDimitry Andricclass MSABitconvertReverseHInWPat<ValueType DstVT, ValueType SrcVT,
36820b57cec5SDimitry Andric                                  RegisterClass DstRC> :
36830b57cec5SDimitry Andric  MSABitconvertReverseHalvesPat<DstVT, SrcVT, DstRC, SHF_H, MSA128H>;
36840b57cec5SDimitry Andric
36850b57cec5SDimitry Andricclass MSABitconvertReverseHInDPat<ValueType DstVT, ValueType SrcVT,
36860b57cec5SDimitry Andric                                  RegisterClass DstRC> :
36870b57cec5SDimitry Andric  MSABitconvertReverseQuartersPat<DstVT, SrcVT, DstRC, SHF_H, MSA128H>;
36880b57cec5SDimitry Andric
36890b57cec5SDimitry Andricclass MSABitconvertReverseWInDPat<ValueType DstVT, ValueType SrcVT,
36900b57cec5SDimitry Andric                                  RegisterClass DstRC> :
36910b57cec5SDimitry Andric  MSABitconvertReverseHalvesPat<DstVT, SrcVT, DstRC, SHF_W, MSA128W>;
36920b57cec5SDimitry Andric
36930b57cec5SDimitry Andricdef : MSABitconvertReverseBInHPat<v8i16, v16i8, MSA128H>;
36940b57cec5SDimitry Andricdef : MSABitconvertReverseBInHPat<v8f16, v16i8, MSA128H>;
36950b57cec5SDimitry Andricdef : MSABitconvertReverseBInWPat<v4i32, v16i8, MSA128W>;
36960b57cec5SDimitry Andricdef : MSABitconvertReverseBInWPat<v4f32, v16i8, MSA128W>;
36970b57cec5SDimitry Andricdef : MSABitconvertReverseBInDPat<v2i64, v16i8, MSA128D>;
36980b57cec5SDimitry Andricdef : MSABitconvertReverseBInDPat<v2f64, v16i8, MSA128D>;
36990b57cec5SDimitry Andric
37000b57cec5SDimitry Andricdef : MSABitconvertReverseBInHPat<v16i8, v8i16, MSA128B>;
37010b57cec5SDimitry Andricdef : MSABitconvertReverseHInWPat<v4i32, v8i16, MSA128W>;
37020b57cec5SDimitry Andricdef : MSABitconvertReverseHInWPat<v4f32, v8i16, MSA128W>;
37030b57cec5SDimitry Andricdef : MSABitconvertReverseHInDPat<v2i64, v8i16, MSA128D>;
37040b57cec5SDimitry Andricdef : MSABitconvertReverseHInDPat<v2f64, v8i16, MSA128D>;
37050b57cec5SDimitry Andric
37060b57cec5SDimitry Andricdef : MSABitconvertReverseBInHPat<v16i8, v8f16, MSA128B>;
37070b57cec5SDimitry Andricdef : MSABitconvertReverseHInWPat<v4i32, v8f16, MSA128W>;
37080b57cec5SDimitry Andricdef : MSABitconvertReverseHInWPat<v4f32, v8f16, MSA128W>;
37090b57cec5SDimitry Andricdef : MSABitconvertReverseHInDPat<v2i64, v8f16, MSA128D>;
37100b57cec5SDimitry Andricdef : MSABitconvertReverseHInDPat<v2f64, v8f16, MSA128D>;
37110b57cec5SDimitry Andric
37120b57cec5SDimitry Andricdef : MSABitconvertReverseBInWPat<v16i8, v4i32, MSA128B>;
37130b57cec5SDimitry Andricdef : MSABitconvertReverseHInWPat<v8i16, v4i32, MSA128H>;
37140b57cec5SDimitry Andricdef : MSABitconvertReverseHInWPat<v8f16, v4i32, MSA128H>;
37150b57cec5SDimitry Andricdef : MSABitconvertReverseWInDPat<v2i64, v4i32, MSA128D>;
37160b57cec5SDimitry Andricdef : MSABitconvertReverseWInDPat<v2f64, v4i32, MSA128D>;
37170b57cec5SDimitry Andric
37180b57cec5SDimitry Andricdef : MSABitconvertReverseBInWPat<v16i8, v4f32, MSA128B>;
37190b57cec5SDimitry Andricdef : MSABitconvertReverseHInWPat<v8i16, v4f32, MSA128H>;
37200b57cec5SDimitry Andricdef : MSABitconvertReverseHInWPat<v8f16, v4f32, MSA128H>;
37210b57cec5SDimitry Andricdef : MSABitconvertReverseWInDPat<v2i64, v4f32, MSA128D>;
37220b57cec5SDimitry Andricdef : MSABitconvertReverseWInDPat<v2f64, v4f32, MSA128D>;
37230b57cec5SDimitry Andric
37240b57cec5SDimitry Andricdef : MSABitconvertReverseBInDPat<v16i8, v2i64, MSA128B>;
37250b57cec5SDimitry Andricdef : MSABitconvertReverseHInDPat<v8i16, v2i64, MSA128H>;
37260b57cec5SDimitry Andricdef : MSABitconvertReverseHInDPat<v8f16, v2i64, MSA128H>;
37270b57cec5SDimitry Andricdef : MSABitconvertReverseWInDPat<v4i32, v2i64, MSA128W>;
37280b57cec5SDimitry Andricdef : MSABitconvertReverseWInDPat<v4f32, v2i64, MSA128W>;
37290b57cec5SDimitry Andric
37300b57cec5SDimitry Andricdef : MSABitconvertReverseBInDPat<v16i8, v2f64, MSA128B>;
37310b57cec5SDimitry Andricdef : MSABitconvertReverseHInDPat<v8i16, v2f64, MSA128H>;
37320b57cec5SDimitry Andricdef : MSABitconvertReverseHInDPat<v8f16, v2f64, MSA128H>;
37330b57cec5SDimitry Andricdef : MSABitconvertReverseWInDPat<v4i32, v2f64, MSA128W>;
37340b57cec5SDimitry Andricdef : MSABitconvertReverseWInDPat<v4f32, v2f64, MSA128W>;
37350b57cec5SDimitry Andric
37360b57cec5SDimitry Andric// Pseudos used to implement BNZ.df, and BZ.df
37370b57cec5SDimitry Andric
37380b57cec5SDimitry Andricclass MSA_CBRANCH_PSEUDO_DESC_BASE<SDPatternOperator OpNode, ValueType TyNode,
3739349cc55cSDimitry Andric                                   RegisterClass RCWS> :
37400b57cec5SDimitry Andric  MipsPseudo<(outs GPR32:$dst),
37410b57cec5SDimitry Andric             (ins RCWS:$ws),
37420b57cec5SDimitry Andric             [(set GPR32:$dst, (OpNode (TyNode RCWS:$ws)))]> {
37430b57cec5SDimitry Andric  bit usesCustomInserter = 1;
37440b57cec5SDimitry Andric  bit hasNoSchedulingInfo = 1;
37450b57cec5SDimitry Andric}
37460b57cec5SDimitry Andric
3747349cc55cSDimitry Andricdef SNZ_B_PSEUDO
3748349cc55cSDimitry Andric    : MSA_CBRANCH_PSEUDO_DESC_BASE<MipsVAllNonZero, v16i8, MSA128B>;
3749349cc55cSDimitry Andricdef SNZ_H_PSEUDO
3750349cc55cSDimitry Andric    : MSA_CBRANCH_PSEUDO_DESC_BASE<MipsVAllNonZero, v8i16, MSA128H>;
3751349cc55cSDimitry Andricdef SNZ_W_PSEUDO
3752349cc55cSDimitry Andric    : MSA_CBRANCH_PSEUDO_DESC_BASE<MipsVAllNonZero, v4i32, MSA128W>;
3753349cc55cSDimitry Andricdef SNZ_D_PSEUDO
3754349cc55cSDimitry Andric    : MSA_CBRANCH_PSEUDO_DESC_BASE<MipsVAllNonZero, v2i64, MSA128D>;
3755349cc55cSDimitry Andricdef SNZ_V_PSEUDO
3756349cc55cSDimitry Andric    : MSA_CBRANCH_PSEUDO_DESC_BASE<MipsVAnyNonZero, v16i8, MSA128B>;
37570b57cec5SDimitry Andric
3758349cc55cSDimitry Andricdef SZ_B_PSEUDO : MSA_CBRANCH_PSEUDO_DESC_BASE<MipsVAllZero, v16i8, MSA128B>;
3759349cc55cSDimitry Andricdef SZ_H_PSEUDO : MSA_CBRANCH_PSEUDO_DESC_BASE<MipsVAllZero, v8i16, MSA128H>;
3760349cc55cSDimitry Andricdef SZ_W_PSEUDO : MSA_CBRANCH_PSEUDO_DESC_BASE<MipsVAllZero, v4i32, MSA128W>;
3761349cc55cSDimitry Andricdef SZ_D_PSEUDO : MSA_CBRANCH_PSEUDO_DESC_BASE<MipsVAllZero, v2i64, MSA128D>;
3762349cc55cSDimitry Andricdef SZ_V_PSEUDO : MSA_CBRANCH_PSEUDO_DESC_BASE<MipsVAnyZero, v16i8, MSA128B>;
37630b57cec5SDimitry Andric
37640b57cec5SDimitry Andric// Pseudoes used to implement transparent fp16 support.
37650b57cec5SDimitry Andric
37660b57cec5SDimitry Andriclet ASEPredicate = [HasMSA] in {
37670b57cec5SDimitry Andric  let usesCustomInserter = 1 in {
37680b57cec5SDimitry Andric    def ST_F16 :
37690b57cec5SDimitry Andric        MipsPseudo<(outs), (ins MSA128F16:$ws, mem_simm10:$addr),
37700b57cec5SDimitry Andric                   [(store (f16 MSA128F16:$ws), (addrimm10:$addr))]>;
37710b57cec5SDimitry Andric    def LD_F16 :
37720b57cec5SDimitry Andric        MipsPseudo<(outs MSA128F16:$ws), (ins mem_simm10:$addr),
37730b57cec5SDimitry Andric                   [(set MSA128F16:$ws, (f16 (load addrimm10:$addr)))]>;
37740b57cec5SDimitry Andric  }
37750b57cec5SDimitry Andric
37760b57cec5SDimitry Andric  let usesCustomInserter = 1, hasNoSchedulingInfo = 1 in {
37770b57cec5SDimitry Andric    def MSA_FP_EXTEND_W_PSEUDO :
37780b57cec5SDimitry Andric        MipsPseudo<(outs FGR32Opnd:$fd), (ins MSA128F16:$ws),
37790b57cec5SDimitry Andric                   [(set FGR32Opnd:$fd, (f32 (fpextend MSA128F16:$ws)))]>;
37800b57cec5SDimitry Andric    def MSA_FP_ROUND_W_PSEUDO :
37810b57cec5SDimitry Andric        MipsPseudo<(outs MSA128F16:$wd), (ins FGR32Opnd:$fs),
37820b57cec5SDimitry Andric                   [(set MSA128F16:$wd, (f16 (fpround FGR32Opnd:$fs)))]>;
37830b57cec5SDimitry Andric    def MSA_FP_EXTEND_D_PSEUDO :
37840b57cec5SDimitry Andric        MipsPseudo<(outs FGR64Opnd:$fd), (ins MSA128F16:$ws),
37850b57cec5SDimitry Andric                   [(set FGR64Opnd:$fd, (f64 (fpextend MSA128F16:$ws)))]>;
37860b57cec5SDimitry Andric    def MSA_FP_ROUND_D_PSEUDO :
37870b57cec5SDimitry Andric        MipsPseudo<(outs MSA128F16:$wd), (ins FGR64Opnd:$fs),
37880b57cec5SDimitry Andric                   [(set MSA128F16:$wd, (f16 (fpround FGR64Opnd:$fs)))]>;
37890b57cec5SDimitry Andric  }
37900b57cec5SDimitry Andric
37910b57cec5SDimitry Andric  def : MipsPat<(MipsTruncIntFP MSA128F16:$ws),
37920b57cec5SDimitry Andric                (TRUNC_W_D64 (MSA_FP_EXTEND_D_PSEUDO MSA128F16:$ws))>,
37930b57cec5SDimitry Andric        ISA_MIPS1, ASE_MSA;
37940b57cec5SDimitry Andric
37950b57cec5SDimitry Andric  def : MipsPat<(MipsFPCmp MSA128F16:$ws, MSA128F16:$wt, imm:$cond),
37960b57cec5SDimitry Andric                (FCMP_S32 (MSA_FP_EXTEND_W_PSEUDO MSA128F16:$ws),
37970b57cec5SDimitry Andric                          (MSA_FP_EXTEND_W_PSEUDO MSA128F16:$wt), imm:$cond)>,
37980b57cec5SDimitry Andric        ISA_MIPS1_NOT_32R6_64R6, ASE_MSA;
37990b57cec5SDimitry Andric}
38000b57cec5SDimitry Andric
38010b57cec5SDimitry Andricdef vsplati64_imm_eq_63 : PatLeaf<(bitconvert (v4i32 (build_vector))), [{
38020b57cec5SDimitry Andric  APInt Imm;
38030b57cec5SDimitry Andric  SDNode *BV = N->getOperand(0).getNode();
38040b57cec5SDimitry Andric  EVT EltTy = N->getValueType(0).getVectorElementType();
38050b57cec5SDimitry Andric
38060b57cec5SDimitry Andric  return selectVSplat(BV, Imm, EltTy.getSizeInBits()) &&
38070b57cec5SDimitry Andric         Imm.getBitWidth() == EltTy.getSizeInBits() && Imm == 63;
38080b57cec5SDimitry Andric}]>;
38090b57cec5SDimitry Andric
38100b57cec5SDimitry Andricdef immi32Cst7  : ImmLeaf<i32, [{return isUInt<32>(Imm) && Imm == 7;}]>;
38110b57cec5SDimitry Andricdef immi32Cst15 : ImmLeaf<i32, [{return isUInt<32>(Imm) && Imm == 15;}]>;
38120b57cec5SDimitry Andricdef immi32Cst31 : ImmLeaf<i32, [{return isUInt<32>(Imm) && Imm == 31;}]>;
38130b57cec5SDimitry Andric
38140b57cec5SDimitry Andricdef vsplati8imm7 :   PatFrag<(ops node:$wt),
38150b57cec5SDimitry Andric                             (and node:$wt, (vsplati8 immi32Cst7))>;
38160b57cec5SDimitry Andricdef vsplati16imm15 : PatFrag<(ops node:$wt),
38170b57cec5SDimitry Andric                             (and node:$wt, (vsplati16 immi32Cst15))>;
38180b57cec5SDimitry Andricdef vsplati32imm31 : PatFrag<(ops node:$wt),
38190b57cec5SDimitry Andric                             (and node:$wt, (vsplati32 immi32Cst31))>;
38200b57cec5SDimitry Andricdef vsplati64imm63 : PatFrag<(ops node:$wt),
38210b57cec5SDimitry Andric                             (and node:$wt, vsplati64_imm_eq_63)>;
38220b57cec5SDimitry Andric
38230b57cec5SDimitry Andricclass MSAShiftPat<SDNode Node, ValueType VT, MSAInst Insn, dag Vec> :
38240b57cec5SDimitry Andric  MSAPat<(VT (Node VT:$ws, (VT (and VT:$wt, Vec)))),
38250b57cec5SDimitry Andric         (VT (Insn VT:$ws, VT:$wt))>;
38260b57cec5SDimitry Andric
38270b57cec5SDimitry Andricclass MSABitPat<SDNode Node, ValueType VT, MSAInst Insn, PatFrag Frag> :
3828*71ac745dSDimitry Andric  MSAPat<(VT (Node VT:$ws, (shl (vsplat_imm_eq_1), (Frag VT:$wt)))),
38290b57cec5SDimitry Andric         (VT (Insn VT:$ws, VT:$wt))>;
38300b57cec5SDimitry Andric
38310b57cec5SDimitry Andricmulticlass MSAShiftPats<SDNode Node, string Insn> {
38320b57cec5SDimitry Andric  def : MSAShiftPat<Node, v16i8, !cast<MSAInst>(Insn#_B),
38330b57cec5SDimitry Andric                    (vsplati8 immi32Cst7)>;
38340b57cec5SDimitry Andric  def : MSAShiftPat<Node, v8i16, !cast<MSAInst>(Insn#_H),
38350b57cec5SDimitry Andric                    (vsplati16 immi32Cst15)>;
38360b57cec5SDimitry Andric  def : MSAShiftPat<Node, v4i32, !cast<MSAInst>(Insn#_W),
38370b57cec5SDimitry Andric                    (vsplati32 immi32Cst31)>;
38380b57cec5SDimitry Andric  def : MSAPat<(v2i64 (Node v2i64:$ws, (v2i64 (and v2i64:$wt,
38390b57cec5SDimitry Andric                                                   vsplati64_imm_eq_63)))),
38400b57cec5SDimitry Andric               (v2i64 (!cast<MSAInst>(Insn#_D) v2i64:$ws, v2i64:$wt))>;
38410b57cec5SDimitry Andric}
38420b57cec5SDimitry Andric
38430b57cec5SDimitry Andricmulticlass MSABitPats<SDNode Node, string Insn> {
38440b57cec5SDimitry Andric  def : MSABitPat<Node, v16i8, !cast<MSAInst>(Insn#_B), vsplati8imm7>;
38450b57cec5SDimitry Andric  def : MSABitPat<Node, v8i16, !cast<MSAInst>(Insn#_H), vsplati16imm15>;
38460b57cec5SDimitry Andric  def : MSABitPat<Node, v4i32, !cast<MSAInst>(Insn#_W), vsplati32imm31>;
3847*71ac745dSDimitry Andric  def : MSAPat<(Node v2i64:$ws, (shl (v2i64 (vsplat_imm_eq_1)),
38480b57cec5SDimitry Andric                                     (vsplati64imm63 v2i64:$wt))),
38490b57cec5SDimitry Andric               (v2i64 (!cast<MSAInst>(Insn#_D) v2i64:$ws, v2i64:$wt))>;
38500b57cec5SDimitry Andric}
38510b57cec5SDimitry Andric
38520b57cec5SDimitry Andricdefm : MSAShiftPats<shl, "SLL">;
38530b57cec5SDimitry Andricdefm : MSAShiftPats<srl, "SRL">;
38540b57cec5SDimitry Andricdefm : MSAShiftPats<sra, "SRA">;
38550b57cec5SDimitry Andricdefm : MSABitPats<xor, "BNEG">;
38560b57cec5SDimitry Andricdefm : MSABitPats<or, "BSET">;
38570b57cec5SDimitry Andric
3858*71ac745dSDimitry Andricdef : MSAPat<(and v16i8:$ws, (vnot (shl (vsplat_imm_eq_1),
3859fe6060f1SDimitry Andric                                        (vsplati8imm7 v16i8:$wt)))),
38600b57cec5SDimitry Andric             (v16i8 (BCLR_B v16i8:$ws, v16i8:$wt))>;
3861*71ac745dSDimitry Andricdef : MSAPat<(and v8i16:$ws, (vnot (shl (vsplat_imm_eq_1),
3862fe6060f1SDimitry Andric                                        (vsplati16imm15 v8i16:$wt)))),
38630b57cec5SDimitry Andric             (v8i16 (BCLR_H v8i16:$ws, v8i16:$wt))>;
3864*71ac745dSDimitry Andricdef : MSAPat<(and v4i32:$ws, (vnot (shl (vsplat_imm_eq_1),
3865fe6060f1SDimitry Andric                                        (vsplati32imm31 v4i32:$wt)))),
38660b57cec5SDimitry Andric             (v4i32 (BCLR_W v4i32:$ws, v4i32:$wt))>;
3867*71ac745dSDimitry Andricdef : MSAPat<(and v2i64:$ws, (vnot (shl (v2i64 (vsplat_imm_eq_1)),
3868fe6060f1SDimitry Andric                                        (vsplati64imm63 v2i64:$wt)))),
38690b57cec5SDimitry Andric             (v2i64 (BCLR_D v2i64:$ws, v2i64:$wt))>;
38700b57cec5SDimitry Andric
38710b57cec5SDimitry Andric// Vector extraction with fixed index.
38720b57cec5SDimitry Andric//
38730b57cec5SDimitry Andric// Extracting 32-bit values on MSA32 should always use COPY_S_W rather than
38740b57cec5SDimitry Andric// COPY_U_W, even for the zero-extended case. This is because our forward
38750b57cec5SDimitry Andric// compatibility strategy is to consider registers to be infinitely
38760b57cec5SDimitry Andric// sign-extended so that a MIPS64 can execute MIPS32 code without getting
38770b57cec5SDimitry Andric// different register values.
38780b57cec5SDimitry Andricdef : MSAPat<(vextract_zext_i32 (v4i32 MSA128W:$ws), immZExt2Ptr:$idx),
38790b57cec5SDimitry Andric             (COPY_S_W MSA128W:$ws, immZExt2:$idx)>, ASE_MSA_NOT_MSA64;
38800b57cec5SDimitry Andricdef : MSAPat<(vextract_zext_i32 (v4f32 MSA128W:$ws), immZExt2Ptr:$idx),
38810b57cec5SDimitry Andric             (COPY_S_W MSA128W:$ws, immZExt2:$idx)>, ASE_MSA_NOT_MSA64;
38820b57cec5SDimitry Andric
38830b57cec5SDimitry Andric// Extracting 64-bit values on MSA64 should always use COPY_S_D rather than
38840b57cec5SDimitry Andric// COPY_U_D, even for the zero-extended case. This is because our forward
38850b57cec5SDimitry Andric// compatibility strategy is to consider registers to be infinitely
38860b57cec5SDimitry Andric// sign-extended so that a hypothetical MIPS128 would be able to execute MIPS64
38870b57cec5SDimitry Andric// code without getting different register values.
38880b57cec5SDimitry Andricdef : MSAPat<(vextract_zext_i64 (v2i64 MSA128D:$ws), immZExt1Ptr:$idx),
38890b57cec5SDimitry Andric             (COPY_S_D MSA128D:$ws, immZExt1:$idx)>, ASE_MSA64;
38900b57cec5SDimitry Andricdef : MSAPat<(vextract_zext_i64 (v2f64 MSA128D:$ws), immZExt1Ptr:$idx),
38910b57cec5SDimitry Andric             (COPY_S_D MSA128D:$ws, immZExt1:$idx)>, ASE_MSA64;
38920b57cec5SDimitry Andric
38930b57cec5SDimitry Andric// Vector extraction with variable index
38940b57cec5SDimitry Andricdef : MSAPat<(i32 (vextract_sext_i8 v16i8:$ws, i32:$idx)),
38950b57cec5SDimitry Andric             (SRA (COPY_TO_REGCLASS (i32 (EXTRACT_SUBREG (SPLAT_B v16i8:$ws,
38960b57cec5SDimitry Andric                                                                  i32:$idx),
38970b57cec5SDimitry Andric                                                         sub_lo)),
38980b57cec5SDimitry Andric                                    GPR32), (i32 24))>;
38990b57cec5SDimitry Andricdef : MSAPat<(i32 (vextract_sext_i16 v8i16:$ws, i32:$idx)),
39000b57cec5SDimitry Andric             (SRA (COPY_TO_REGCLASS (i32 (EXTRACT_SUBREG (SPLAT_H v8i16:$ws,
39010b57cec5SDimitry Andric                                                                  i32:$idx),
39020b57cec5SDimitry Andric                                                         sub_lo)),
39030b57cec5SDimitry Andric                                    GPR32), (i32 16))>;
39040b57cec5SDimitry Andricdef : MSAPat<(i32 (vextract_sext_i32 v4i32:$ws, i32:$idx)),
39050b57cec5SDimitry Andric             (COPY_TO_REGCLASS (i32 (EXTRACT_SUBREG (SPLAT_W v4i32:$ws,
39060b57cec5SDimitry Andric                                                             i32:$idx),
39070b57cec5SDimitry Andric                                                    sub_lo)),
39080b57cec5SDimitry Andric                               GPR32)>;
39090b57cec5SDimitry Andricdef : MSAPat<(i64 (vextract_sext_i64 v2i64:$ws, i32:$idx)),
39100b57cec5SDimitry Andric             (COPY_TO_REGCLASS (i64 (EXTRACT_SUBREG (SPLAT_D v2i64:$ws,
39110b57cec5SDimitry Andric                                                             i32:$idx),
39120b57cec5SDimitry Andric                                                    sub_64)),
39130b57cec5SDimitry Andric                               GPR64), [HasMSA, IsGP64bit]>;
39140b57cec5SDimitry Andric
39150b57cec5SDimitry Andricdef : MSAPat<(i32 (vextract_zext_i8 v16i8:$ws, i32:$idx)),
39160b57cec5SDimitry Andric             (SRL (COPY_TO_REGCLASS (i32 (EXTRACT_SUBREG (SPLAT_B v16i8:$ws,
39170b57cec5SDimitry Andric                                                                  i32:$idx),
39180b57cec5SDimitry Andric                                                         sub_lo)),
39190b57cec5SDimitry Andric                                    GPR32), (i32 24))>;
39200b57cec5SDimitry Andricdef : MSAPat<(i32 (vextract_zext_i16 v8i16:$ws, i32:$idx)),
39210b57cec5SDimitry Andric             (SRL (COPY_TO_REGCLASS (i32 (EXTRACT_SUBREG (SPLAT_H v8i16:$ws,
39220b57cec5SDimitry Andric                                                                  i32:$idx),
39230b57cec5SDimitry Andric                                                         sub_lo)),
39240b57cec5SDimitry Andric                                    GPR32), (i32 16))>;
39250b57cec5SDimitry Andricdef : MSAPat<(i32 (vextract_zext_i32 v4i32:$ws, i32:$idx)),
39260b57cec5SDimitry Andric             (COPY_TO_REGCLASS (i32 (EXTRACT_SUBREG (SPLAT_W v4i32:$ws,
39270b57cec5SDimitry Andric                                                             i32:$idx),
39280b57cec5SDimitry Andric                                                    sub_lo)),
39290b57cec5SDimitry Andric                               GPR32)>;
39300b57cec5SDimitry Andricdef : MSAPat<(i64 (vextract_zext_i64 v2i64:$ws, i32:$idx)),
39310b57cec5SDimitry Andric             (COPY_TO_REGCLASS (i64 (EXTRACT_SUBREG (SPLAT_D v2i64:$ws,
39320b57cec5SDimitry Andric                                                             i32:$idx),
39330b57cec5SDimitry Andric                                                    sub_64)),
39340b57cec5SDimitry Andric                               GPR64), [HasMSA, IsGP64bit]>;
39350b57cec5SDimitry Andric
39360b57cec5SDimitry Andricdef : MSAPat<(f32 (vector_extract v4f32:$ws, i32:$idx)),
39370b57cec5SDimitry Andric             (f32 (EXTRACT_SUBREG (SPLAT_W v4f32:$ws,
39380b57cec5SDimitry Andric                                           i32:$idx),
39390b57cec5SDimitry Andric                                  sub_lo))>;
39400b57cec5SDimitry Andricdef : MSAPat<(f64 (vector_extract v2f64:$ws, i32:$idx)),
39410b57cec5SDimitry Andric             (f64 (EXTRACT_SUBREG (SPLAT_D v2f64:$ws,
39420b57cec5SDimitry Andric                                           i32:$idx),
39430b57cec5SDimitry Andric                                  sub_64))>;
39440b57cec5SDimitry Andric
39450b57cec5SDimitry Andric// Vector extraction with variable index (N64 ABI)
39460b57cec5SDimitry Andricdef : MSAPat<
39470b57cec5SDimitry Andric  (i32 (vextract_sext_i8 v16i8:$ws, i64:$idx)),
39480b57cec5SDimitry Andric  (SRA (COPY_TO_REGCLASS
39490b57cec5SDimitry Andric         (i32 (EXTRACT_SUBREG
39500b57cec5SDimitry Andric                (SPLAT_B v16i8:$ws,
39510b57cec5SDimitry Andric                  (COPY_TO_REGCLASS
39520b57cec5SDimitry Andric                    (i32 (EXTRACT_SUBREG i64:$idx, sub_32)), GPR32)),
39530b57cec5SDimitry Andric                sub_lo)),
39540b57cec5SDimitry Andric         GPR32),
39550b57cec5SDimitry Andric       (i32 24))>;
39560b57cec5SDimitry Andricdef : MSAPat<
39570b57cec5SDimitry Andric  (i32 (vextract_sext_i16 v8i16:$ws, i64:$idx)),
39580b57cec5SDimitry Andric  (SRA (COPY_TO_REGCLASS
39590b57cec5SDimitry Andric         (i32 (EXTRACT_SUBREG
39600b57cec5SDimitry Andric                (SPLAT_H v8i16:$ws,
39610b57cec5SDimitry Andric                  (COPY_TO_REGCLASS
39620b57cec5SDimitry Andric                    (i32 (EXTRACT_SUBREG i64:$idx, sub_32)), GPR32)),
39630b57cec5SDimitry Andric                sub_lo)),
39640b57cec5SDimitry Andric         GPR32),
39650b57cec5SDimitry Andric       (i32 16))>;
39660b57cec5SDimitry Andricdef : MSAPat<
39670b57cec5SDimitry Andric  (i32 (vextract_sext_i32 v4i32:$ws, i64:$idx)),
39680b57cec5SDimitry Andric  (COPY_TO_REGCLASS
39690b57cec5SDimitry Andric    (i32 (EXTRACT_SUBREG
39700b57cec5SDimitry Andric           (SPLAT_W v4i32:$ws,
39710b57cec5SDimitry Andric             (COPY_TO_REGCLASS
39720b57cec5SDimitry Andric               (i32 (EXTRACT_SUBREG i64:$idx, sub_32)), GPR32)),
39730b57cec5SDimitry Andric           sub_lo)),
39740b57cec5SDimitry Andric    GPR32)>;
39750b57cec5SDimitry Andricdef : MSAPat<
39760b57cec5SDimitry Andric  (i64 (vextract_sext_i64 v2i64:$ws, i64:$idx)),
39770b57cec5SDimitry Andric  (COPY_TO_REGCLASS
39780b57cec5SDimitry Andric    (i64 (EXTRACT_SUBREG
39790b57cec5SDimitry Andric           (SPLAT_D v2i64:$ws,
39800b57cec5SDimitry Andric             (COPY_TO_REGCLASS (i32 (EXTRACT_SUBREG i64:$idx, sub_32)), GPR32)),
39810b57cec5SDimitry Andric           sub_64)),
39820b57cec5SDimitry Andric    GPR64), [HasMSA, IsGP64bit]>;
39830b57cec5SDimitry Andric
39840b57cec5SDimitry Andricdef : MSAPat<
39850b57cec5SDimitry Andric  (i32 (vextract_zext_i8 v16i8:$ws, i64:$idx)),
39860b57cec5SDimitry Andric  (SRL (COPY_TO_REGCLASS
39870b57cec5SDimitry Andric         (i32 (EXTRACT_SUBREG
39880b57cec5SDimitry Andric                 (SPLAT_B v16i8:$ws,
39890b57cec5SDimitry Andric                   (COPY_TO_REGCLASS
39900b57cec5SDimitry Andric                     (i32 (EXTRACT_SUBREG i64:$idx, sub_32)), GPR32)),
39910b57cec5SDimitry Andric                 sub_lo)),
39920b57cec5SDimitry Andric         GPR32),
39930b57cec5SDimitry Andric       (i32 24))>;
39940b57cec5SDimitry Andricdef : MSAPat<
39950b57cec5SDimitry Andric  (i32 (vextract_zext_i16 v8i16:$ws, i64:$idx)),
39960b57cec5SDimitry Andric  (SRL (COPY_TO_REGCLASS
39970b57cec5SDimitry Andric         (i32 (EXTRACT_SUBREG
39980b57cec5SDimitry Andric                (SPLAT_H v8i16:$ws,
39990b57cec5SDimitry Andric                  (COPY_TO_REGCLASS
40000b57cec5SDimitry Andric                    (i32 (EXTRACT_SUBREG i64:$idx, sub_32)), GPR32)),
40010b57cec5SDimitry Andric                sub_lo)),
40020b57cec5SDimitry Andric         GPR32),
40030b57cec5SDimitry Andric       (i32 16))>;
40040b57cec5SDimitry Andricdef : MSAPat<
40050b57cec5SDimitry Andric  (i32 (vextract_zext_i32 v4i32:$ws, i64:$idx)),
40060b57cec5SDimitry Andric  (COPY_TO_REGCLASS
40070b57cec5SDimitry Andric    (i32 (EXTRACT_SUBREG
40080b57cec5SDimitry Andric           (SPLAT_W v4i32:$ws,
40090b57cec5SDimitry Andric             (COPY_TO_REGCLASS (i32 (EXTRACT_SUBREG i64:$idx, sub_32)), GPR32)),
40100b57cec5SDimitry Andric           sub_lo)),
40110b57cec5SDimitry Andric    GPR32)>;
40120b57cec5SDimitry Andricdef : MSAPat<
40130b57cec5SDimitry Andric  (i64 (vextract_zext_i64 v2i64:$ws, i64:$idx)),
40140b57cec5SDimitry Andric  (COPY_TO_REGCLASS
40150b57cec5SDimitry Andric    (i64 (EXTRACT_SUBREG
40160b57cec5SDimitry Andric           (SPLAT_D v2i64:$ws,
40170b57cec5SDimitry Andric             (COPY_TO_REGCLASS (i32 (EXTRACT_SUBREG i64:$idx, sub_32)), GPR32)),
40180b57cec5SDimitry Andric           sub_64)),
40190b57cec5SDimitry Andric    GPR64),
40200b57cec5SDimitry Andric  [HasMSA, IsGP64bit]>;
40210b57cec5SDimitry Andric
40220b57cec5SDimitry Andricdef : MSAPat<
40230b57cec5SDimitry Andric  (f32 (vector_extract v4f32:$ws, i64:$idx)),
40240b57cec5SDimitry Andric  (f32 (EXTRACT_SUBREG
40250b57cec5SDimitry Andric         (SPLAT_W v4f32:$ws,
40260b57cec5SDimitry Andric           (COPY_TO_REGCLASS (i32 (EXTRACT_SUBREG i64:$idx, sub_32)), GPR32)),
40270b57cec5SDimitry Andric         sub_lo))>;
40280b57cec5SDimitry Andricdef : MSAPat<
40290b57cec5SDimitry Andric  (f64 (vector_extract v2f64:$ws, i64:$idx)),
40300b57cec5SDimitry Andric  (f64 (EXTRACT_SUBREG
40310b57cec5SDimitry Andric         (SPLAT_D v2f64:$ws,
40320b57cec5SDimitry Andric           (COPY_TO_REGCLASS (i32 (EXTRACT_SUBREG i64:$idx, sub_32)), GPR32)),
40330b57cec5SDimitry Andric         sub_64))>;
40340b57cec5SDimitry Andric
40350b57cec5SDimitry Andricdef : MSAPat<(vfseteq_v4f32 MSA128WOpnd:$a, MSA128WOpnd:$b),
40360b57cec5SDimitry Andric             (FCEQ_W MSA128WOpnd:$a, MSA128WOpnd:$b)>;
40370b57cec5SDimitry Andricdef : MSAPat<(vfseteq_v2f64 MSA128DOpnd:$a, MSA128DOpnd:$b),
40380b57cec5SDimitry Andric             (FCEQ_D MSA128DOpnd:$a, MSA128DOpnd:$b)>;
40390b57cec5SDimitry Andricdef : MSAPat<(vfsetle_v4f32 MSA128WOpnd:$a, MSA128WOpnd:$b),
40400b57cec5SDimitry Andric             (FCLE_W MSA128WOpnd:$a, MSA128WOpnd:$b)>;
40410b57cec5SDimitry Andricdef : MSAPat<(vfsetle_v2f64 MSA128DOpnd:$a, MSA128DOpnd:$b),
40420b57cec5SDimitry Andric             (FCLE_D MSA128DOpnd:$a, MSA128DOpnd:$b)>;
40430b57cec5SDimitry Andricdef : MSAPat<(vfsetlt_v4f32 MSA128WOpnd:$a, MSA128WOpnd:$b),
40440b57cec5SDimitry Andric             (FCLT_W MSA128WOpnd:$a, MSA128WOpnd:$b)>;
40450b57cec5SDimitry Andricdef : MSAPat<(vfsetlt_v2f64 MSA128DOpnd:$a, MSA128DOpnd:$b),
40460b57cec5SDimitry Andric             (FCLT_D MSA128DOpnd:$a, MSA128DOpnd:$b)>;
40470b57cec5SDimitry Andricdef : MSAPat<(vfsetne_v4f32 MSA128WOpnd:$a, MSA128WOpnd:$b),
40480b57cec5SDimitry Andric             (FCNE_W MSA128WOpnd:$a, MSA128WOpnd:$b)>;
40490b57cec5SDimitry Andricdef : MSAPat<(vfsetne_v2f64 MSA128DOpnd:$a, MSA128DOpnd:$b),
40500b57cec5SDimitry Andric             (FCNE_D MSA128DOpnd:$a, MSA128DOpnd:$b)>;
4051