//===-- TriCoreInstrInfo.td - Target Description for TriCore ---*- tablegen -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file describes the TriCore instructions in TableGen format. // //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // Instruction format superclass. //===----------------------------------------------------------------------===// include "TriCoreInstrFormats.td" //===----------------------------------------------------------------------===// // TriCore specific DAG Nodes. // // Call def SDT_TriCoreCmp : SDTypeProfile<1, 3, [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, SDTCisVT<3, i32>]>; def SDT_TriCoreImask : SDTypeProfile<1, 3, [SDTCisVT<0, i64>, SDTCisVT<1, i32>, SDTCisVT<2, i32>, SDTCisVT<3, i32>]>; def SDT_TriCoreExtract : SDTypeProfile<1, 3, [SDTCisVT<0, i32>, SDTCisVT<1, i32>, SDTCisVT<2, i32>, SDTCisVT<3, i32>]>; def SDT_TriCoreLCmp : SDTypeProfile<1, 4, [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, SDTCisSameAs<2, 3>, SDTCisVT<4, i32>]>; def SDT_TriCoreBrCC : SDTypeProfile<0, 3, [SDTCisVT<0, OtherVT>, SDTCisVT<1, i32>, SDTCisVT<2, i32>]>; def SDT_TriCoreCall : SDTypeProfile<0, -1, [SDTCisPtrTy<0>]>; def SDT_TriCoreSelectCC : SDTypeProfile<1, 4, [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, SDTCisVT<3, i32>, SDTCisVT<4, i32>]>; def SDT_TriCoreWrapper : SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, SDTCisPtrTy<0>]>; def SDT_TriCoreShift : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisVT<1, i32>, SDTCisVT<2, i32>]>; def SDT_TriCoreMovei32 : SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, SDTCisVT<0, i32>]>; def SDT_TriCoreMovei64 : SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, SDTCisVT<0, i64>]>; def TriCoreAbs : SDNode<"TriCoreISD::ABS", SDTIntUnaryOp>; def TriCoreAbsDif : SDNode<"TriCoreISD::ABSDIF", SDTIntBinOp>; def TriCoreBrCC : SDNode<"TriCoreISD::BR_CC", SDT_TriCoreBrCC, [SDNPHasChain, SDNPInGlue]>; def TriCoreCall : SDNode<"TriCoreISD::CALL", SDT_TriCoreCall, [ SDNPHasChain, SDNPOptInGlue, SDNPOutGlue, SDNPVariadic ]>; def TriCoreCmp : SDNode<"TriCoreISD::CMP", SDT_TriCoreCmp, [SDNPOutGlue]>; def TriCoreLogicCmp: SDNode<"TriCoreISD::LOGICCMP", SDT_TriCoreLCmp, [SDNPInGlue, SDNPOutGlue]>; def TriCoreWrapper : SDNode<"TriCoreISD::Wrapper", SDT_TriCoreWrapper>; def TriCoreImask : SDNode<"TriCoreISD::IMASK", SDT_TriCoreImask>; def TriCoreSh : SDNode<"TriCoreISD::SH", SDT_TriCoreShift>; def TriCoreSha : SDNode<"TriCoreISD::SHA", SDT_TriCoreShift>; def TriCoreExtr : SDNode<"TriCoreISD::EXTR", SDT_TriCoreExtract>; def TriCoreSelectCC: SDNode<"TriCoreISD::SELECT_CC", SDT_TriCoreSelectCC, []>; def load_sym : SDNode<"TriCoreISD::LOAD_SYM", SDTIntUnaryOp>; def movei32 : SDNode<"TriCoreISD::MOVEi32", SDT_TriCoreMovei32>; def jmptarget : Operand { let PrintMethod = "printPCRelImmOperand"; } // Operand for printing out a condition code. def cc : Operand { let PrintMethod = "printCCOperand"; } def isPointer : Predicate<"isPointer() == true">; def isnotPointer : Predicate<"isPointer() == false">; // TriCore Condition Codes def TriCore_COND_EQ : PatLeaf<(i32 0)>; def TriCore_COND_NE : PatLeaf<(i32 1)>; def TriCore_COND_GE : PatLeaf<(i32 2)>; def TriCore_COND_LT : PatLeaf<(i32 3)>; // TriCore Logic Codes def TriCore_LOGIC_AND_EQ : PatLeaf<(i32 0)>; def TriCore_LOGIC_AND_NE : PatLeaf<(i32 1)>; def TriCore_LOGIC_AND_GE : PatLeaf<(i32 2)>; def TriCore_LOGIC_AND_LT : PatLeaf<(i32 3)>; def TriCore_LOGIC_OR_EQ : PatLeaf<(i32 0)>; def TriCore_LOGIC_OR_NE : PatLeaf<(i32 1)>; def TriCore_LOGIC_OR_GE : PatLeaf<(i32 12)>; def TriCore_LOGIC_OR_LT : PatLeaf<(i32 13)>; // These are target-independent nodes, but have target-specific formats. def SDT_TriCoreCallSeqStart : SDCallSeqStart<[ SDTCisVT<0, i32> ]>; def SDT_TriCoreCallSeqEnd : SDCallSeqEnd<[ SDTCisVT<0, i32>, SDTCisVT<1, i32> ]>; def TriCoreRetFlag : SDNode<"TriCoreISD::RET_FLAG", SDTNone, [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]>; def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_TriCoreCallSeqStart, [SDNPHasChain, SDNPOutGlue, SDNPSideEffect]>; def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_TriCoreCallSeqEnd, [SDNPHasChain, SDNPOptInGlue, SDNPOutGlue, SDNPSideEffect]>; //===----------------------------------------------------------------------===// // Instruction Pattern Stuff //===----------------------------------------------------------------------===// // Lower 32 bits of a 64-bit word def LO32 : SDNodeXFormgetTargetConstant((uint32_t) N->getZExtValue(), SDLoc(N), MVT::i32); }]>; // Higher 32 bits of a 64-bit word def HI32 : SDNodeXFormgetTargetConstant((uint32_t) (N->getZExtValue()>>32), SDLoc(N), MVT::i32); }]>; def INVERT_VAL : SDNodeXFormgetZExtValue() <<"\n"; return CurDAG->getTargetConstant(-N->getZExtValue(), SDLoc(N), MVT::i32); }]>; def SHIFTAMT : SDNodeXFormgetZExtValue() <<"\n"; return CurDAG->getTargetConstant(N->getZExtValue() - 32, SDLoc(N), MVT::i32); }]>; def SHIFTAMT_POS : SDNodeXFormgetZExtValue() <<"\n"; return CurDAG->getTargetConstant((32 - N->getZExtValue()), SDLoc(N), MVT::i32); }]>; def SHIFTAMT_NEG : SDNodeXFormgetTargetConstant(-(N->getZExtValue() - 32), SDLoc(N), MVT::i32); }]>; def imm32_64 : PatLeaf<(imm), [{ uint64_t val = N->getZExtValue(); return val >= 32 && val < 64; }]>; def imm0_31 : PatLeaf<(imm), [{ uint64_t val = N->getZExtValue(); outs() <<"imm0_31: " << val << "\n"; return val > 0 && val < 32; }]>; //Operands def s4imm : Operand { let PrintMethod = "printSExtImm<4>"; } def s6imm : Operand { let PrintMethod = "printSExtImm<6>"; } def s8imm : Operand { let PrintMethod = "printSExtImm<8>"; } def s9imm : Operand { let PrintMethod = "printSExtImm<9>"; } def s10imm : Operand { let PrintMethod = "printSExtImm<10>"; } def s16imm : Operand { let PrintMethod = "printSExtImm<16>"; } def s24imm : Operand { let PrintMethod = "printSExtImm<24>"; } def u8imm : Operand { let PrintMethod = "printZExtImm<8>"; } def u4imm : Operand { let PrintMethod = "printZExtImm<4>"; } def u2imm : Operand { let PrintMethod = "printZExtImm<2>"; } def u9imm : Operand { let PrintMethod = "printZExtImm<9>"; } def u16imm : Operand { let PrintMethod = "printZExtImm<16>"; } def oext4imm: Operand { let PrintMethod = "printOExtImm<4>"; } def off18imm : Operand { let PrintMethod = "printOff18Imm"; } def disp24imm : Operand { let PrintMethod = "printDisp24Imm"; } def disp15imm : Operand { let PrintMethod = "printDisp15Imm"; } def disp8imm : Operand { let PrintMethod = "printDisp8Imm"; } def disp4imm : Operand { let PrintMethod = "printDisp4Imm"; } def PairAddrRegsOp : RegisterOperand; //Nodes def immSExt4 : PatLeaf<(imm), [{ return isInt<4>(N->getSExtValue()); }]>; def immSExt6 : PatLeaf<(imm), [{ return isInt<6>(N->getSExtValue()); }]>; def immSExt9 : PatLeaf<(imm), [{ return isInt<9>(N->getSExtValue()); }]>; def immSExt10 : PatLeaf<(imm), [{ return isInt<10>(N->getSExtValue()); }]>; def immSExt16 : PatLeaf<(imm), [{ return isInt<16>(N->getSExtValue()); }]>; def immSExt24 : PatLeaf<(imm), [{ return isInt<24>(N->getSExtValue()); }]>; def immZExt2 : ImmLeaf; def immZExt4 : ImmLeaf; def immZExt8 : ImmLeaf; def immZExt9 : ImmLeaf; def immZExt16 : ImmLeaf; /// 16-Bit Opcode Formats class ISC_D15C op1, string asmstr, Operand TypeC=u8imm> : SC; class ISC_A10C op1, string asmstr, Operand TypeC=u8imm> : SC; class ISC_A15A10C op1, string asmstr, Operand TypeC=u8imm> : SC; class ISC_D15A10C op1, string asmstr, Operand TypeC=u8imm> : SC; class ISC_A10CA15 op1, string asmstr, Operand TypeC=u8imm> : SC; class ISC_A10CD15 op1, string asmstr, Operand TypeC=u8imm> : SC; class ISC_C op1, string asmstr, Operand TypeC=u8imm> : SC; class ISRC_dC op1, string asmstr, RegisterClass RCd=RD, Operand TypeC=s4imm> : SRC; class ISRC_dD15C op1, string asmstr, RegisterClass RCd=RD, Operand TypeC=s4imm> : SRC; class ISRC_D15dC op1, string asmstr, RegisterClass RCd=RD, Operand TypeC=s4imm> : SRC; multiclass mISRR_SRC op_srr, bits<8> op_src, string asmstr, RegisterClass RCd=RD, RegisterClass RC2=RD, Operand Oc=u4imm, string posfix="">{ def _srr#posfix: SRR; def _src#posfix: SRC; } multiclass mISRC_a15a op1, bits<8> op2, bits<8> op3, string asmstr> { def _src : ISRC_dC; def _src_a15 : ISRC_dD15C, Requires<[HasV120_UP]>; def _src_15a : ISRC_D15dC; } /// 32-Bit Opcode Formats /// RC class IRC_C op1, bits<7> op2, string asmstr> : RC; class IRC op1, bits<7> op2, string asmstr, RegisterClass RCd=RD, RegisterClass RC1=RD, Operand TypeC=s9imm> : RC; /// RR class IRR_0 op1, bits<8> op2, string asmstr>: RR; class IRR_R1 op1, bits<8> op2, string asmstr, RegisterClass RC=RD> : RR; class IRR_R2 op1, bits<8> op2, string asmstr, RegisterClass RC=RD> : RR; /// op R[c], R[a] class IRR_a op1, bits<8> op2, string asmstr, RegisterClass cd=RD, RegisterClass c1=RD> : RR; /// op R[c], R[b] class IRR_b op1, bits<8> op2, string asmstr, RegisterClass cd=RD, RegisterClass c2=RD> : RR; /// R[c], R[a], R[b] class IRR_2 op1, bits<8> op2, string asmstr , RegisterClass cd=RD, RegisterClass c1=RD, RegisterClass c2=RD> : RR; class IRR_dab op1, bits<8> op2, string asmstr, RegisterClass RCd=RD, RegisterClass RC1=RD, RegisterClass RC2=RD> : IRR_2; class IRR_dba op1, bits<8> op2, string asmstr, RegisterClass RCd=RD, RegisterClass RC1=RD, RegisterClass RC2=RD> : IRR_2; class IRR_dabn op1, bits<8> op2, string asmstr, RegisterClass RCd=RD, RegisterClass RC1=RD, RegisterClass RC2=RD, Operand TypeC=u2imm> : RR; class IRR_dban op1, bits<8> op2, string asmstr, RegisterClass RCd=RD, RegisterClass RC1=RD, RegisterClass RC2=RD, Operand TypeC=u2imm> : RR; multiclass mIRR_RC rr1, bits<8> rr2, bits<8> rc1, bits<7> rc2, string asmstr, RegisterClass RCd=RD, RegisterClass RC1=RD, Operand TypeC=s9imm> { def _rr : IRR_dab; def _rc : IRC; } class IRLC op1, string asmstr, Operand TypeC=s16imm, RegisterClass RCd=RD, RegisterClass RC1=RD> : RLC; class ISRR_db op1, string asmstr, RegisterClass RCd=RD, RegisterClass RC2=RD> : SRR; class ISRR_dD15b op1, string asmstr, RegisterClass RCd=RD, RegisterClass RC2=RD> : SRR; class ISRR_D15db op1, string asmstr, RegisterClass RCd=RD, RegisterClass RC2=RD> : SRR; multiclass mISRR_s op1, string asmstr>{ def _srr : ISRR_db; } multiclass mISRR_a15a op1, bits<8> op2, bits<8> op3, string asmstr>{ def _srr : ISRR_db; def _srr_a15 : ISRR_dD15b, Requires<[HasV120_UP]>; def _srr_15a : ISRR_D15db; } class IBIT op1, bits<2> op2, string asmstr> : BIT; class NsRequires Ps> : Requires { string DecoderNamespace = !cond(!eq(HasV110, !head(Ps)): "v110", !eq(HasV120, !head(Ps)): "v120", !eq(HasV130, !head(Ps)): "v130", !eq(HasV131, !head(Ps)): "v131", !eq(HasV160, !head(Ps)): "v160", !eq(HasV161, !head(Ps)): "v161", !eq(HasV162, !head(Ps)): "v162", true: ""); } //===----------------------------------------------------------------------===// // Pseudo Instructions //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // Instructions //===----------------------------------------------------------------------===// // Arithmetic Instructions // Absolute Value Instructions let Defs = [PSW] in { def ABS_rr : RR<0x0B, 0x1C, (outs RD:$d), (ins RD:$s2), "abs $d, $s2", [(set RD:$d, (TriCoreAbs RD:$s2))]>; def ABS_B_rr : RR<0x0B, 0x5C, (outs RD:$d), (ins RD:$s2), "abs.b $d, $s2", [(set RD:$d, (TriCoreAbs RD:$s2))]>; def ABS_H_rr : RR<0x0B, 0x7C, (outs RD:$d), (ins RD:$s2), "abs.h $d, $s2", [(set RD:$d, (TriCoreAbs RD:$s2))]>; def ABSDIF_rc : RC<0x8B, 0x0E, (outs RD:$d), (ins RD:$s1, s9imm:$const9), "absdif $d, $s1, $const9", [(set RD:$d, (TriCoreAbsDif RD:$s1, immSExt9:$const9))]>; def ABSDIF_rr : RR<0x0B, 0x0E, (outs RD:$d), (ins RD:$s1, RD:$s2), "absdif $d, $s1, $s2", [(set RD:$d, (TriCoreAbsDif RD:$s1, RD:$s2))]>; def ABSDIF_B_rr : RR<0x0B, 0x4E, (outs RD:$d), (ins RD:$s1, RD:$s2), "absdif.b $d, $s1, $s2", [(set RD:$d, (TriCoreAbsDif RD:$s1, RD:$s2))]>; def ABSDIF_H_rr : RR<0x0B, 0x6E, (outs RD:$d), (ins RD:$s1, RD:$s2), "absdif.h $d, $s1, $s2", [(set RD:$d, (TriCoreAbsDif RD:$s1, RD:$s2))]>; def ABSDIFS_rc : RC<0x8B, 0x0F, (outs RD:$d), (ins RD:$s1, RD:$s2), "absdifs $d, $s1, $s2", [(set RD:$d, (TriCoreAbsDif RD:$s1, RD:$s2))]>; def ABSDIFS_rr : RR<0x0B, 0x0F, (outs RD:$d), (ins RD:$s1, RD:$s2), "absdifs $d, $s1, $s2", [(set RD:$d, (TriCoreAbsDif RD:$s1, RD:$s2))]>; def ABSDIFS_B_rr_v110 : RR<0x0B, 0x4F, (outs RD:$d), (ins RD:$s1, RD:$s2), "absdifs.b $d, $s1, $s2", [(set RD:$d, (TriCoreAbsDif RD:$s1, RD:$s2))]> , NsRequires<[HasV110]>; def ABSDIFS_H_rr : RR<0x0B, 0x6F, (outs RD:$d), (ins RD:$s1, RD:$s2), "absdifs.h $d, $s1, $s2", [(set RD:$d, (TriCoreAbsDif RD:$s1, RD:$s2))]>; def ABSS_rr : RR<0x0B, 0x1D, (outs RD:$d), (ins RD:$s1, RD:$s2), "abss $d, $s2", [(set RD:$d, (TriCoreAbsDif RD:$s1, RD:$s2))]>; def ABSS_B_rr_v110 : RR<0x0B, 0x5D, (outs RD:$d), (ins RD:$s1, RD:$s2), "abss.b $d, $s2", [(set RD:$d, (TriCoreAbsDif RD:$s1, RD:$s2))]> , NsRequires<[HasV110]>; def ABSS_H_rr : RR<0x0B, 0x7D, (outs RD:$d), (ins RD:$s1, RD:$s2), "abss.h $d, $s2", [(set RD:$d, (TriCoreAbsDif RD:$s1, RD:$s2))]>; } multiclass mIB_H brr1, bits<8> brr2, bits<8> hrr1, bits<8> hrr2, string asmstr> { def _B_rr : IRR_dab; def _H_rr : IRR_dab; } // - ADD Instructions defm ADD : mIRR_RC<0x0B, 0x00, 0x8B, 0x00, "add">, mISRC_a15a<0xC2, 0x92, 0x9A, "add">, mISRR_a15a<0x42, 0x12, 0x1A, "add">, mIB_H<0x0B, 0x40, 0x0B, 0x60, "add">; multiclass mIRR_SRC_SRR__A rr1, bits<8> rr2, bits<8> src1, bits<8> srr1, string asmstr> { def _rr : IRR_dab; def _src : ISRC_dC, Requires<[HasV120_UP]>; def _srr : ISRR_db, Requires<[HasV120_UP]>; } defm ADD_A : mIRR_SRC_SRR__A<0x01, 0x01, 0xB0, 0x30, "add.a">; defm ADDC : mIRR_RC<0x0B, 0x05, 0x8B, 0x05, "addc">; multiclass mIRLC op1, bits<8> op2, bits<8> op3, string asmstr>{ def _rlc : IRLC; def H_rlc : IRLC; def H_A_rlc : IRLC; } defm ADDI : mIRLC<0x1B, 0x9B, 0x11, "addi">; multiclass mIH_HU_U h1, bits<8> h2, bits<8> hu1, bits<8> hu2, bits<8> u1, bits<8> u2, string asmstr>{ def _H : IRR_dab; def _HU : IRR_dab; def _U : IRR_dab; } defm ADDS : mIRR_RC<0x0B, 0x02, 0x8B, 0x02, "adds">, mISRR_s<0x22, "adds">, mIH_HU_U<0x0B, 0x62, 0x0B, 0x63, 0x0B, 0x03, "adds">; def ADDS_U_rc : IRC<0x8B, 0x03, "adds.u">; def ADDS_B_rr : IRR_dab<0x0B, 0x42, "adds.b">, NsRequires<[HasV110]>; def ADDSC_A_srrs_v110 : SRRS<0x10, (outs RA:$d), (ins RD:$s2, u2imm:$n), "addsc.a $d, $s2, $n", []> , NsRequires<[HasV110]>; def ADDSC_A_srrs: SRRS<0x10, (outs RA:$d), (ins RA:$s2, u2imm:$n), "addsc.a $d, $s2, d15, $n", []> , Requires<[HasV120_UP]>; def ADDSC_A_rr_v110: IRR_dabn<0x01, 0x60, "addsc.a", RA, RA, RD>, NsRequires<[HasV110]>; def ADDSC_A_rr : IRR_dban<0x01, 0x60, "addsc.a", RA, RD, RA>, Requires<[HasV120_UP]>; def ADDSC_AT_rr_v110 : IRR_dab<0x01, 0x62, "addsc.at", RA, RA>, NsRequires<[HasV110]>; def ADDSC_AT_rr : IRR_dba<0x01, 0x62, "addsc.at", RA, RD, RA>, Requires<[HasV120_UP]>; def ADDS_BU_rr_v110 : IRR_dab<0x0B, 0x43, "adds.bu">, Requires<[HasV110]>; defm ADDX : mIRR_RC<0x0B, 0x04, 0x8B, 0x04, "addx">; /// AND Instructions defm AND : mIRR_RC<0x0F, 0x08, 0x8F, 0x08, "and">; def AND_srr : ISRR_db<0x26, "and">, Requires<[HasV120_UP]>; def AND_srr_v110 : ISRR_db<0x16, "and">, NsRequires<[HasV110]>; def AND_sc : ISC_D15C<0x16, "and">, Requires<[HasV120_UP]>; def AND_sc_v110 : ISC_D15C<0x96, "and">, NsRequires<[HasV110]>; def AND_AND_T : IBIT<0x47, 0x00, "and.and.t">; def AND_ANDN_T : IBIT<0x47, 0x03, "and.andn.t">; def AND_NOR_T : IBIT<0x47, 0x02, "and.nor.t">; def AND_OR_T : IBIT<0x47, 0x01, "and.or.t">; def AND_T : IBIT<0x87, 0x00, "and.t">; def ANDN_T : IBIT<0x87, 0x03, "andn.t">; defm AND_EQ : mIRR_RC<0x0B, 0x20, 0x8B, 0x20, "and.eq">; defm AND_GE : mIRR_RC<0x0B, 0x24, 0x8B, 0x24, "and.ge">; defm AND_GE_U : mIRR_RC<0x0B, 0x25, 0x8B, 0x25, "and.ge.u">; defm AND_LT : mIRR_RC<0x0B, 0x22, 0x8B, 0x22, "and.lt">; defm AND_LT_U : mIRR_RC<0x0B, 0x23, 0x8B, 0x23, "and.lt.u">; defm AND_NE : mIRR_RC<0x0B, 0x21, 0x8B, 0x21, "and.ne">; defm ANDN : mIRR_RC<0x0F, 0x0E, 0x8F, 0x0E, "andn">; /// BISR def BISR_rc : IRC_C<0xAD, 0x00, "bisr">; def BISR_rc_v161 : IRC_C<0xAD, 0x01, "bisr">, NsRequires<[HasV161]>; def BISR_sc_v110 : ISC_C<0xC0, "bisr">, NsRequires<[HasV110]>; def BISR_sc : ISC_C<0xE0, "bisr">, Requires<[HasV120_UP]>; /// Multiple Instructions (RR) def BMERGAE_rr_v110 : IRR_dab<0x4B, 0x00, "bmerge">, NsRequires<[HasV110]>; def BMERGE_rr : IRR_dab<0x4B, 0x01, "bmerge">, Requires<[HasV120_UP]>; def BSPLIT_rr_v110: IRR_a<0x4B, 0x60, "bsplit", RE>, NsRequires<[HasV110]>; def BSPLIT_rr : IRR_a<0x4B, 0x09, "bsplit", RE>, Requires<[HasV120_UP]>; /// BO Opcode Formats // A[b], off10 (BO) (Base + Short Offset Addressing Mode) class IBO_bso op1, bits<6> op2, string asmstr> : BO; // P[b] (BO) (Bit Reverse Addressing Mode) class IBO_r op1, bits<6> op2, string asmstr> : BO; // P[b], off10 (BO) (Circular Addressing Mode) class IBO_c op1, bits<6> op2, string asmstr> : BO; // A[b], off10 (BO) (Post-increment Addressing Mode) class IBO_pos op1, bits<6> op2, string asmstr> : BO; // A[b], off10 (BO) (Pre-increment Addressing Mode) class IBO_pre op1, bits<6> op2, string asmstr> : BO; multiclass mI_CACHEI_ prefix, bits<6> op12, bits<6> op22, bits<6> op32, string asmstr> { def _bo_bso : IBO_bso; def _bo_pos : IBO_pos; def _bo_pre : IBO_pre; } multiclass mI_CACHE_ prefixi, bits<8> prefix_r_c, bits<6> bso, bits<6> pos_r, bits<6> pre_c, string asmstr>{ defm "" : mI_CACHEI_; def _bo_r: IBO_r; def _bo_c: IBO_c; } /// CACHEA.* Instructions defm CACHEA_I : mI_CACHE_<0x89, 0xA9, 0x2E, 0x0E, 0x1E, "cachea.i">, Requires<[HasV120_UP]>; defm CACHEA_W : mI_CACHE_<0x89, 0xA9, 0x2C, 0x0C, 0x1C, "cachea.w">, Requires<[HasV120_UP]>; defm CACHEA_WI: mI_CACHE_<0x89, 0xA9, 0x2D, 0x0D, 0x1D, "cachea.wi">, Requires<[HasV120_UP]>; defm CACHEI_W : mI_CACHEI_<0x89, 0x2B, 0x0B, 0x1B, "cachei.w">, Requires<[HasV131_UP]>; defm CACHEI_I : mI_CACHEI_<0x89, 0x2A, 0x0A, 0x1A, "cachei.i">, Requires<[HasV160_UP]>; defm CACHEI_WI: mI_CACHEI_<0x89, 0x2F, 0x0F, 0x1F, "cachei.wi">, Requires<[HasV131_UP]>; /// RRR Opcodes Formats class IRRRop1, bits<4> op2, string asmstr, RegisterClass RCd=RD, RegisterClass RC1=RD, RegisterClass RC2=RD, RegisterClass RC3=RD> : RRR; class IRRR_d31op1, bits<4> op2, string asmstr, RegisterClass RCd=RD, RegisterClass RC1=RD, RegisterClass RC2=RD, RegisterClass RC3=RD> : RRR; class IRRR_d32op1, bits<4> op2, string asmstr, RegisterClass RCd=RD, RegisterClass RC1=RD, RegisterClass RC2=RD, RegisterClass RC3=RD> : RRR; /// RCR Opcodes Formats class IRCR op1, bits<3> op2, string asmstr, RegisterClass RCd=RD, RegisterClass RC1=RD, RegisterClass RC3=RD, Operand TypeC=s9imm> : RCR; multiclass mIRCRop1, bits<3> op2, bits<8>op3, bits<3> op4, string asmstr>{ def _rcr : IRCR; def _rcr_e : IRCR, Requires<[HasV120_UP]>; } /// CADD Instructions def CADD_srr_v110 : ISRR_dD15b<0x0A, "cadd">, NsRequires<[HasV110]>; def CADD_rcr : IRCR<0xAB, 0x00, "cadd">; def CADD_rrr : IRRR<0x2B, 0x00, "cadd">; def CADD_src : ISRC_dD15C<0x8A, "cadd">; multiclass mI_CADDnA_CSUBnA_v110_ rrr1, bits<4> rrr2, bits<8> rcr1, bits<3> rcr2, string asmstr>{ def _rrr_v110: IRRR, NsRequires<[HasV110]>; if !or(!eq(asmstr, "cadd.a"), !eq(asmstr, "caddn.a")) then { def _rcr_v110: RCR , NsRequires<[HasV110]>; } } defm CADD_A: mI_CADDnA_CSUBnA_v110_<0x21, 0x00, 0xA1, 0x00, "cadd.a">; def CADDN_srr_v110 : ISRR_dD15b<0x4A, "caddn"> , NsRequires<[HasV110]>; def CADDN_rcr : IRCR<0xAB, 0x01, "caddn">; def CADDN_rrr : IRRR<0x2B, 0x01, "caddn">; def CADDN_src : ISRC_dD15C<0xCA, "caddn">; defm CADDN_A: mI_CADDnA_CSUBnA_v110_<0x21, 0x01, 0xA1, 0x01, "caddn.a">; // Call Instructions class IB op1, string asmstr> : B; // The target of a 24-bit call instruction. def call_target : Operand { let EncoderMethod = "encodeCallTarget"; } class ISB op1, string asmstr> : SB; class ISB_D15D op1, string asmstr> : SB; let isCall = 1, Defs = [A11], Uses = [A10] in { def CALL_b : IB<0x6D, "call">; def CALL_sb : ISB<0x5C, "call">, Requires<[HasV120_UP]>; def CALLA_b : IB<0xED, "calla">; def CALLI_rr_v110: IRR_R2<0x2D, 0x00, "calli", RA>, NsRequires<[HasV110]>; def CALLI_rr : IRR_R1<0x2D, 0x00, "calli", RA>, Requires<[HasV120_UP]>; } multiclass mI_H op1,bits<8> op2,bits<8> op3, bits<8> op4, string asmstr> { def _rr : IRR_a; def _H_rr : IRR_a; } defm CLO : mI_H<0x0F, 0x1C, 0x0F, 0x7D, "clo">; def CLO_B_rr_v110 : IRR_a<0x0F, 0x3D, "clo.b">, NsRequires<[HasV110]>; defm CLS : mI_H<0x0F, 0x1D, 0x0F, 0x7E, "cls">; def CLS_B_rr_v110 : IRR_a<0x0F, 0x3E, "cls.b">, NsRequires<[HasV110]>; defm CLZ : mI_H<0x0F, 0x1B, 0x0F, 0x7C, "clz">; def CLZ_B_rr_v110 : IRR_a<0x0F, 0x3C, "clz.b">, NsRequires<[HasV110]>; def CMOV_src : ISRC_dD15C<0xAA, "cmov">; def CMOV_srr : ISRR_dD15b<0x2A, "cmov">; def CMOVN_src : ISRC_dD15C<0xEA, "cmovn">; def CMOVN_srr : ISRR_dD15b<0x6A, "cmovn">; // A[b], off10, E[a] (BO)(Base + Short Offset Addressing Mode) class IBO_bsoAbOEa op1, bits<6> op2, string asmstr> : BO; // P[b], E[a] (BO)(Bit-reverse Addressing Mode) class IBO_rPbEa op1, bits<6> op2, string asmstr> : BO; // P[b], off10, E[a] (BO)(Circular Addressing Mode) class IBO_cPbOEa op1, bits<6> op2, string asmstr> : BO; // A[b], off10, E[a] (BO)(Post-increment Addressing Mode) class IBO_posAbOEa op1, bits<6> op2, string asmstr> : BO; // A[b], off10, E[a] (BO)(Pre-increment Addressing Mode) class IBO_preAbOEa op1, bits<6> op2, string asmstr> : BO; multiclass mIBO_Ea bso1, bits<6> bso2, ///_bso bits<8> r1, bits<6> r2, ///_r bits<8> c1, bits<6> c2, ///_c bits<8> pos1, bits<6> pos_r, ///_post bits<8> pre1, bits<6> pre_c, ///_pre string asmstr>{ def _bo_bso : IBO_bsoAbOEa; def _bo_pos : IBO_posAbOEa; def _bo_pre : IBO_preAbOEa; def _bo_r : IBO_rPbEa; def _bo_c : IBO_cPbOEa; } defm CMPSWAP_W : mIBO_Ea<0x49, 0x23, 0x69, 0x03, 0x69, 0x13, 0x49,0x03, 0x49, 0x13, "cmpswap.w"> , Requires<[HasV161_UP]>; def CRC32_B_rr : IRR_dba<0x4B, 0x06, "crc32.b">, Requires<[HasV162]>; def CRC32B_W_rr : IRR_dba<0x4B, 0x03, "crc32b.w">, Requires<[HasV162]>; def CRC32L_W_rr : IRR_dba<0x4B, 0x07, "crc32l.w">, Requires<[HasV162]>; def CRCN_rrr : IRRR<0x6B, 0x01, "crcn">, Requires<[HasV162]>; def CSUB_rrr : IRRR<0x2B, 0x02, "csub">; def CSUBN_rrr : IRRR<0x2B, 0x03, "csubn">; defm CSUB_A_: mI_CADDnA_CSUBnA_v110_<0x21, 0x02, 0, 0, "csub.a">; defm CSUBN_A_: mI_CADDnA_CSUBnA_v110_<0x21, 0x03, 0, 0, "csubn.a">; class ISR_0 op1, bits<4> op2, string asmstr> : SR; class ISR_1 op1, bits<4> op2, string asmstr, RegisterClass RC1=RD> : SR; class ISYS_0 op1, bits<6> op2, string asmstr> : SYS; class ISYS_1 op1, bits<6> op2, string asmstr, RegisterClass RC1=RD> : SYS; def DEBUG_sr : ISR_0<0x00, 0x0A, "debug">; def DEBUG_sys : ISYS_0<0x0D, 0x04, "debug">; /// RRRR Instruction Formats /// op D[c], D[a], D[b], D[d] class IRRRR op1, bits<3> op2, string asmstr> : RRRR; /// op D[c], D[a], D[d] class IRRRR_ad op1, bits<3> op2, string asmstr, RegisterClass RC3=RD> : RRRR; /// op D[c], D[a], D[b], D[d], width class IRRRW_cabdw op1, bits<3> op2, string asmstr> : RRRW; /// op D[c], D[a], D[d], width class IRRRW_cadw op1, bits<3> op2, string asmstr> : RRRW; /// op E[c], D[b], D[d], width class IRRRW_cEbdw op1, bits<3> op2, string asmstr> : RRRW; def DEXTR_rrpw : RRPW<0x77, 0x00, (outs RD:$d), (ins RD:$s1, RD:$s2, i32imm:$pos, i32imm:$width), "dextr $d, $s1, $s2, $pos", []>; def DEXTR_rrrr : IRRRR<0x17, 0x04, "dextr">; def DIFSC_A_rr_v110 : IRR_dabn<0x01, 0x50, "difsc.a", RD, RA, RA>, NsRequires<[HasV110]>; def DISABLE_sys : ISYS_0<0x0D, 0x0D, "disable">; def DISABLE_sys_1 : ISYS_1<0x0D, 0x0F, "disable">, Requires<[HasV160_UP]>; def DSYNC_sys : ISYS_0<0x0D, 0x12, "dsync">; def DVADJ_srr_v110 : ISRR_db<0x72, "dvadj", RE, RD>, NsRequires<[HasV110]>; def DVADJ_rrr_v110 : IRRR_d32<0x2B, 0x08, "dvadj", RE, RD, RD, RE>, NsRequires<[HasV110]>; def DVADJ_rrr : IRRR_d32<0x6B, 0x0D, "dvadj", RE, RD, RD, RE>, Requires<[HasV120_UP]>; multiclass mI_U_RR_Eab op1, bits<8> op2, bits<8> op3, bits<8> op4, string asmstr, string posfix = ""> { def _rr # posfix : IRR_dab; def _U_rr # posfix : IRR_dab; } multiclass mIU_RR_Eab op1, bits<8> op2, bits<8> op3, bits<8> op4, string asmstr, string posfix = ""> { def _rr # posfix : IRR_dab; def U_rr # posfix : IRR_dab; } multiclass mI_DVINIT_ oprefix, bits<8> op, bits<8> op_u, bits<8> opb, bits<8> opbu, bits<8> oph, bits<8> ophu, string asmstr, string posfix = ""> { defm "": mI_U_RR_Eab; defm _B: mIU_RR_Eab ; defm _H: mIU_RR_Eab ; } defm DIV : mI_U_RR_Eab<0x4B, 0x20, 0x4B, 0x21, "div">, Requires<[HasV160_UP]>; defm DVINIT : mI_DVINIT_<0x4F, 0x00, 0x01, 0x04, 0x05, 0x02, 0x03, "dvinit", "_v110">, NsRequires<[HasV110]>; defm DVINIT : mI_DVINIT_<0x4B, 0x1A, 0x0A, 0x5A, 0x4A, 0x3A, 0x2A, "dvinit">, Requires<[HasV120_UP]>; multiclass mI_U_RRR_EEdb op1, bits<4> op2, bits<8> op3, bits<4> op4, string asmstr, string posfix = ""> { def _rrr # posfix : IRRR_d32; def _U_rrr # posfix: IRRR_d32; } multiclass mI_U_SRR_sds2 op1, bits<8> op2, string asmstr, string posfix = "", RegisterClass RC1, RegisterClass RC2>{ def "" # posfix: ISRR_db; def _U # posfix: ISRR_db; } defm DVSTEP : mI_U_SRR_sds2<0x32, 0xB2, "dvstep", "v110", RE, RD>, NsRequires<[HasV110]>; defm DVSTEP : mI_U_RRR_EEdb<0x2B, 0x09, 0x2B, 0x0A, "dvstep", "v110">, NsRequires<[HasV110]>; defm DVSTEP : mI_U_RRR_EEdb<0x6B, 0x0F, 0x6B, 0x0E, "dvstep">, Requires<[HasV120_UP]>; def ENABLE_sys : ISYS_0<0x0D, 0x0C, "enable">; multiclass mIB_H_W brr1, bits<8> brr2, bits<8> hrr1, bits<8> hrr2, bits<8> wrr1, bits<8> wrr2, string asmstr> : mIB_H{ def _W_rr : IRR_dab; } defm EQ : mIRR_RC<0x0B, 0x10, 0x8B, 0x10, "eq"> , mIB_H_W<0x0B, 0x50, 0x0B, 0x70, 0x0B, 0x90, "eq">; def EQ_src : ISRC_D15dC<0xBA, "eq">; def EQ_srr : ISRR_D15db<0x3A, "eq">; def EQ_A_rr: IRR_dab<0x01, 0x40, "eq.a", RD, RA, RA>; defm EQANY_B : mIRR_RC<0x0B, 0x56, 0x8B, 0x56, "eqany.b">; defm EQANY_H : mIRR_RC<0x0B, 0x76, 0x8B, 0x76, "eqany.h">; def EQZ_A_rr : IRR_a<0x01, 0x48, "eqz.a", RD, RA>; def EXTR_rrpw : RRPW<0x37, 0x02, (outs RD:$d), (ins RD:$s1, RD:$s2, i32imm:$pos, i32imm:$width), "extr $d, $s1, $pos, $width", []>; def EXTR_rrrr : IRRRR_ad<0x17, 0x02, "extr", RE>; def EXTR_rrrw : IRRRW_cadw<0x57, 0x02, "extr">; def EXTR_U_rrpw : RRPW<0x37, 0x03, (outs RD:$d), (ins RD:$s1, RD:$s2, i32imm:$pos, i32imm:$width), "extr.u $d, $s1, $pos, $width", []>; def EXTR_U_rrrr : IRRRR_ad<0x17, 0x03, "extr.u", RE>; def EXTR_U_rrrw : IRRRW_cadw<0x57, 0x03, "extr.u">; def FCALL_b : IB<0x61, "fcall">, Requires<[HasV160_UP]>; def FCALLA_b : IB<0xE1, "fcalla">, Requires<[HasV160_UP]>; def FCALLA_i : IRR_R1<0x2D, 0x01, "fcalli", RA>, Requires<[HasV160_UP]>; def FRET_sr : ISR_0<0x00, 0x07, "fret">, Requires<[HasV160_UP]>; def FRET_sys : ISYS_0<0x0D, 0x03, "fret">, Requires<[HasV160_UP]>; multiclass mI_U__RR_RC op1, bits<8> op2, bits<8> op3, bits<7> op4, bits<8> uop1, bits<8> uop2, bits<8> uop3, bits<7> uop4, string asmstr> { defm "" : mIRR_RC; defm _U : mIRR_RC; } defm GE : mI_U__RR_RC<0x0B, 0x14, 0x8B, 0x14, 0x0B, 0x15, 0x8B, 0x15, "ge">; def GE_A_rr : IRR_dab<0x01, 0x43, "ge.a", RD, RA, RA>; def IMASK_rcpw : RCPW<0xB7, 0x01, (outs RE:$d), (ins RD:$s1, i32imm:$const4, i32imm:$pos, i32imm:$width), "imask $d, $const4, $pos, $width", []>; def IMASK_rcrw : RCRW<0xD7, 0x01, (outs RE:$d), (ins RD:$s1, RD:$s3, i32imm:$const4, i32imm:$width), "imask $d, $const4, $s3, $width", []>; def IMASK_rrpw : RRPW<0x37, 0x01, (outs RE:$d), (ins RD:$s1, RD:$s2, i32imm:$pos, i32imm:$width), "imask $d, $s2, $pos, $width", []>; def IMASK_rrrw : IRRRW_cEbdw<0x57, 0x01, "imask">; def INS_T : IBIT<0x67, 0x00, "ins.t">; def INSN_T : IBIT<0x67, 0x01, "insn.t">; def INSERT_rcpw : RCPW<0xB7, 0x00, (outs RD:$d), (ins RD:$s1, i32imm:$const4, i32imm:$pos, i32imm:$width), "insert $d, $s1, $const4, $pos, $width", []>; def INSERT_rcrr : RCRR<0x97, 0x00, (outs RD:$d), (ins RD:$s1, i32imm:$const4, RE:$s3), "insert $d, $s1, $const4, $s3", []>; def INSERT_rcrw : RCRW<0xD7, 0x00, (outs RD:$d), (ins RD:$s1, RD:$s3, i32imm:$const4, i32imm:$width), "insert $d, $s1, $const4, $s3, $width", []>; def INSERT_rrpw : RRPW<0x37, 0x00, (outs RD:$d), (ins RD:$s1, RD:$s2, i32imm:$pos, i32imm:$width), "insert $d, $s1, $s2, $pos, $width", []>; def INSERT_rrrr : RRRW<0x17, 0x00, (outs RD:$d), (ins RD:$s1, RD:$s2, RE:$s3), "insert $d, $s1, $s2, $s3", []>; def INSERT_rrrw : IRRRW_cabdw<0x57, 0x00, "insert">; def ISYNC_sys : ISYS_0<0x0D, 0x13, "isync">; defm IXMAX : mI_U_RRR_EEdb<0x6B, 0x0A, 0x6B, 0x0B, "ixmax">, Requires<[HasV130_UP]>; defm IXMIN : mI_U_RRR_EEdb<0x6B, 0x08, 0x6B, 0x09, "ixmin">, Requires<[HasV130_UP]>; def J_b : IB<0x1D, "j">; def J_sb_v110 : ISB<0x5C, "j">, NsRequires<[HasV110]>; def J_sb : ISB<0x3C, "j">, Requires<[HasV120_UP]>; def JA_b : IB<0x9D, "ja">; // disp15 class IBRR_0 op1, bits<1> op2, string asmstr> : BRR; // A[a], disp15 class IBRR_1 op1, bits<1> op2, string asmstr> : BRR; // D[a], D[b], disp15 class IBRR op1, bits<1> op2, string asmstr, RegisterClass RC1=RD, RegisterClass RC2=RD> : BRR; class IBRC op1, bits<1> op2, string asmstr, Operand TypeC=u4imm> : BRC; class ISBC op1, string asmstr> : SBC; // D[15], D[b], disp4 (SBR) class ISBR_15b op1, string asmstr> : SBR; // D[b], disp4 (SBR) class ISBR_b op1, string asmstr, RegisterClass RC2=RD> : SBR; // D[b](SBR) class ISBR op1, string asmstr, RegisterClass RC2=RD> : SBR; multiclass mIBRC_BRR c1, bits<1> c2, bits<8> r1, bits<1> r2, string asmstr, Operand TypeC=u4imm>{ def _brc : IBRC; def _brr : IBRR; } multiclass mI_JnEq_ c1, bits<1> c2, bits<8> r1, bits<1> r2, bits<8> x1, bits<8> x2, bits<8> x3, bits<8> x4, bits<8> x5, bits<1> x6, bits<8> v1, bits<8> v2, string asmstr>{ defm "": mIBRC_BRR; def _sbr_v110 : ISBR_15b, NsRequires<[HasV110]>; def _sbc_v110 : ISBC, NsRequires<[HasV110]>; def _sbc1 : ISBC, Requires<[HasV120_UP]>; def _sbc2 : ISBC, Requires<[HasV160_UP]>; if !eq(asmstr, "jne") then def _sbr1 : ISBR_15b, Requires<[HasV120_UP]>; if !eq(asmstr, "jeq") then def _sbr1 : ISBR_15b, Requires<[HasV130_UP]>; def _sbr2 : ISBR_15b, Requires<[HasV160_UP]>; def _A_brr: IBRR; } defm JEQ : mI_JnEq_<0xDF, 0x00, 0x5F, 0x00, 0x1E, 0x9E, 0x3E, 0xBE, 0x7D, 0x00, 0x1E, 0x6E, "jeq">; defm JGE : mIBRC_BRR<0xFF, 0x00, 0x7F, 0x00, "jge", s4imm>; defm JGE_U : mIBRC_BRR<0xFF, 0x01, 0x7F, 0x01, "jge.u">; def JGEZ_sbr_v110 : ISBR_b<0xFE, "jgez">, NsRequires<[HasV110]>; def JGEZ_sbr : ISBR_b<0xCE, "jgez">, Requires<[HasV120_UP]>; def JGTZ_sbr_v110 : ISBR_b<0x7E, "jgtz">, NsRequires<[HasV110]>; def JGTZ_sbr : ISBR_b<0x4E, "jgtz">, Requires<[HasV120_UP]>; def JI_sbr_v110 : ISBR<0x3C, "ji", RA>, NsRequires<[HasV110]>; def JI_rr_v110 : IRR_R1<0x2D, 0x03, "ji", RA>, NsRequires<[HasV110]>; def JI_rr : IRR_R1<0x2D, 0x03, "ji", RA>, Requires<[HasV120_UP]>; def JI_sr : SR<0xDC, 0x00, (outs), (ins RA:$s1), "ji $s1", []>, Requires<[HasV120_UP]>; def JL_b : IB<0x5D, "jl">; def JLA_b : IB<0xDD, "jla">; def JLEZ_sbr_v110 : ISBR_b<0xBE, "jlez">, NsRequires<[HasV110]>; def JLEZ_sbr : ISBR_b<0x8E, "jlez">, Requires<[HasV120_UP]>; def JLI_rr_v110 : IRR_R1<0x2D, 0x02, "jli", RA>, NsRequires<[HasV110]>; def JLI_rr : IRR_R1<0x2D, 0x02, "jli", RA>, Requires<[HasV120_UP]>; defm JLT : mIBRC_BRR<0xBF, 0x00, 0x3F, 0x00, "jlt">; defm JLT_U : mIBRC_BRR<0xBF, 0x01, 0x3F, 0x01, "jlt.u">; def JLTZ_sbr_v110 : ISBR_b<0x3E, "jltz">, NsRequires<[HasV110]>; def JLTZ_sbr : ISBR_b<0x0E, "jltz">, Requires<[HasV120_UP]>; defm JNE : mI_JnEq_<0xDF, 0x01, 0x5F, 0x01, 0x5E, 0xDE, 0x7E, 0xFE, 0x7D, 0x01, 0x9E, 0xEE, "jne">; defm JNED : mIBRC_BRR<0x9F, 0x01, 0x1F, 0x01, "jned">; defm JNEI : mIBRC_BRR<0x9F, 0x00, 0x1F, 0x00, "jnei">; multiclass mI_JnZ_ sb, bits<8> sbr, bits<8> abrr1, bits<1> abrr2, bits<8> asbr, bits<7> brn1, bits<1> brn2, bits<8> sbrn, bits<8> sbv, bits<8> sbrv, bits<8> sbrnv, string asmstr> { def _sb_v110 : ISB_D15D, NsRequires<[HasV110]>; def _sbr_v110 : ISBR_b, NsRequires<[HasV110]>; def _T_sbrn_v110: SBRN , NsRequires<[HasV110]>; def _sb : ISB_D15D, Requires<[HasV120_UP]>; def _sbr : ISBR_b, Requires<[HasV120_UP]>; def _A_brr : IBRR_1; def _A_sbr : ISBR_b; def _T_brn : BRN; def _T_sbrn: SBRN , Requires<[HasV120_UP]>; } defm JNZ : mI_JnZ_<0xEE, 0xF6, 0xBD, 0x01, 0x7C, 0x6F, 0x01, 0xAE, 0xAE, 0xDE, 0x4E, "jnz">; defm JZ : mI_JnZ_<0x6E, 0x76, 0xBD, 0x00, 0xBC, 0x6F, 0x00, 0x2E, 0x2E, 0x5E, 0x0E, "jz">; class IABS_off18 op1, bits<2> op2, string asmstr> : ABS; class IABS_RO op1, bits<2> op2, string asmstr, RegisterClass dc> : ABS; class IABS_OR op1, bits<2> op2, string asmstr, RegisterClass s1c> : ABS; class IBOL_RAaO op1, string asmstr, RegisterClass RC> : BOL; class IBOL_AbOR op1, string asmstr, RegisterClass RC> : BOL; class ISLR op1, string asmstr, RegisterClass dc> : SLR; class ISLR_pos op1, string asmstr, RegisterClass dc> : SLR; class ISLRO op1, string asmstr, RegisterClass dc> : SLRO; class ISRO_A15RO op1, string asmstr, RegisterClass s2c> : SRO; class ISRO_ROA15 op1, string asmstr, RegisterClass s2c> : SRO; class ISRO_D15RO op1, string asmstr, RegisterClass s2c> : SRO; class ISRO_ROD15 op1, string asmstr, RegisterClass s2c> : SRO; // A|D[a], A[b], off10 (BO) (Base + Short Offset Addressing Mode) class IBO_RAbso op1, bits<6> op2, string asmstr, RegisterClass dc> : BO; // A|D[a], P[b] (BO) (Bit Reverse Addressing Mode) class IBO_RPr op1, bits<6> op2, string asmstr, RegisterClass dc> : BO; // A|D[a], P[b], off10 (BO) (Circular Addressing Mode) class IBO_RPc op1, bits<6> op2, string asmstr, RegisterClass dc> : BO; // A|D[a], A[b], off10 (BO)(Post-increment Addressing Mode) class IBO_RApos op1, bits<6> op2, string asmstr, RegisterClass dc> : BO; // A|D[a], A[b], off10 (BO) (Pre-increment Addressing Mode) class IBO_RApre op1, bits<6> op2, string asmstr, RegisterClass dc> : BO; multiclass mI_LD_ abs1, bits<2> abs2, ///_abs bits<8> prefix1, bits<8> prefix2, bits<6> bso2, ///_bso bits<6> pos_r, ///_pos|_r bits<6> pre_c, ///_pre|_c string asmstr, RegisterClass RC>{ def _abs : IABS_RO; def _bo_bso : IBO_RAbso; def _bo_pos : IBO_RApos; def _bo_pre : IBO_RApre; def _bo_r : IBO_RPr; def _bo_c : IBO_RPc; } multiclass mI_LD_2_ slr, bits<8> slrp, bits<8> slro, bits<8> sro, string asmstr, RegisterClass RC, string posfix="">{ def _slr # posfix: ISLR; def _slr_post # posfix: ISLR_pos; def _slro # posfix: ISLRO; if !eq(RC, RD) then def _sro # posfix: ISRO_D15RO; if !eq(RC, RA) then def _sro # posfix: ISRO_A15RO; } defm LD_A: mI_LD_<0x85, 0x02, 0x09, 0x29, 0x26, 0x06, 0x16, "ld.a", RA>; defm LD_A: mI_LD_2_<0xB8, 0x64, 0x0C, 0x28, "ld.a", RA, "_v110">, NsRequires<[HasV110]>; defm LD_A: mI_LD_2_<0xD4, 0xC4, 0xC8, 0xCC, "ld.a", RA>, Requires<[HasV120_UP]>; def LD_A_bol : IBOL_RAaO<0x99, "ld.a", RA>; def LD_A_sc : ISC_A15A10C<0xD8, "ld.a">, Requires<[HasV120_UP]>; defm LD_B: mI_LD_2_<0x98, 0x44, 0x34, 0x08, "ld.b", RD, "_v110">, NsRequires<[HasV110]>; defm LD_B: mI_LD_<0x05, 0x00, 0x09, 0x29, 0x20, 0x00, 0x10,"ld.b", RD>; def LD_B_bol : IBOL_RAaO<0x79, "ld.b", RD>, Requires<[HasV160_UP]>; defm LD_BU: mI_LD_<0x05, 0x01, 0x09, 0x29, 0x21, 0x01, 0x11, "ld.bu", RD>; defm LD_BU: mI_LD_2_<0x58, 0xC4, 0xB4, 0x88, "ld.bu", RD, "_v110">, NsRequires<[HasV110]>; defm LD_BU: mI_LD_2_<0x14, 0x04, 0x08, 0x0C, "ld.bu", RD>, Requires<[HasV120_UP]>; def LD_BU_bol : IBOL_RAaO<0x39, "ld.bu", RD>, Requires<[HasV160_UP]>; defm LD_D : mI_LD_<0x85, 0x01, 0x09, 0x29, 0x25, 0x05, 0x15, "ld.d", RE>; defm LD_DA : mI_LD_<0x85, 0x03, 0x09, 0x29, 0x27, 0x07, 0x17, "ld.da", RP>; defm LD_H : mI_LD_<0x05, 0x02, 0x09, 0x29, 0x22, 0x02, 0x12, "ld.h", RD>; defm LD_H: mI_LD_2_<0xD8, 0x24, 0x74, 0x48, "ld.h", RD, "_v110">, NsRequires<[HasV110]>; defm LD_H: mI_LD_2_<0x94, 0x84, 0x88, 0x8C, "ld.h", RD>, Requires<[HasV120_UP]>; def LD_H_bol : IBOL_RAaO<0xC9, "ld.h", RD>, Requires<[HasV160_UP]>; defm LD_HU : mI_LD_<0x05, 0x03, 0x09, 0x29, 0x23, 0x03, 0x13, "ld.hu", RD>; def LD_HU_bol : IBOL_RAaO<0xB9, "ld.hu", RD>, Requires<[HasV160_UP]>; defm LD_Q : mI_LD_<0x45, 0x00, 0x09, 0x29, 0x28, 0x08, 0x18, "ld.q", RD>; defm LD_W: mI_LD_<0x85, 0x00, 0x09, 0x29, 0x24, 0x04, 0x14, "ld.w", RD>; defm LD_W: mI_LD_2_<0x38, 0xA4, 0xF4, 0xC8, "ld.w", RD, "_v110">, NsRequires<[HasV110]>; defm LD_W: mI_LD_2_<0x54, 0x44, 0x48, 0x4C, "ld.w", RD>, Requires<[HasV120_UP]>; def LD_W_bol : IBOL_RAaO<0x19, "ld.w", RD>; def LD_W_sc : ISC_D15A10C<0x58, "ld.w">, Requires<[HasV120_UP]>; def LDLCX_abs : IABS_off18<0x15, 0x02, "ldlcx">; def LDLCX_bo_bso : IBO_bso<0x49, 0x24, "ldlcx">; def LDMST_abs : IABS_OR<0xE5, 0x01, "ldmst", RE>; defm LDMST : mIBO_Ea<0x49, 0x21, 0x69, 0x01, 0x69, 0x11, 0x49, 0x01, 0x49, 0x11, "ldmst">; def LDUCX_abs : IABS_off18<0x15, 0x03, "lducx">; def LDUCX_bo_bso : IBO_bso<0x49, 0x25, "lducx">; def LEA_abs : IABS_RO<0xC5, 0x00, "lea", RA>; def LEA_bo_bso : IBO_RAbso<0x49, 0x28, "lea", RA>; def LEA_bol : IBOL_RAaO<0xD9, "lea", RA>; def LHA_abs : IABS_RO<0xC5, 0x01, "lha", RA>, Requires<[HasV162_UP]>; def LOOP_brr : IBRR_1<0xFD, 0x00, "loop">; def LOOP_sbr : SBR<0xFC, (outs), (ins RA:$s2, oext4imm:$disp4), "loop $s2, $disp4", []>; def LOOPU_brr : IBRR_0<0xFD, 0x01, "loopu">, Requires<[HasV120_UP]>; defm LT : mIRR_RC<0x0B, 0x12, 0x8B, 0x12, "lt">; defm LT : mISRR_SRC<0x7A, 0xFA, "lt", RD, RD, s4imm>; defm LT_U : mIRR_RC<0x0B, 0x13, 0x8B, 0x13, "lt.u">; defm LT_U : mISRR_SRC<0x06, 0x86, "lt.u", RD, RD, u4imm, "v110">, NsRequires<[HasV110]>; def LT_A_rr : IRR_dab<0x01, 0x42, "lt.a", RD, RA, RA>; multiclass mIU__RR_ab op1, bits<8> op2, bits<8> uop1, bits<8> uop2, string asmstr> { def "" : IRR_dab; def U : IRR_dab; } defm LT_B : mIU__RR_ab<0x0B, 0x52, 0x0B, 0x53, "lt.b">; defm LT_H : mIU__RR_ab<0x0B, 0x72, 0x0B, 0x73, "lt.h">; defm LT_W : mIU__RR_ab<0x0B, 0x92, 0x0B, 0x93, "lt.w">; class IRRR1_label op1, bits<6> op2, string asmstr, RegisterClass RC, string label> : RRR1; class IRRR1_label2 op1, bits<6> op2, string asmstr, RegisterClass RC, string label1, string label2> : RRR1; class IRRR1_n op1, bits<6> op2, string asmstr, RegisterClass RC=RD> : RRR1; class IRRR1 op1, bits<6> op2, string asmstr, RegisterClass RC=RD> : RRR1; class IRRR2 op1, bits<8> op2, string asmstr, RegisterClass RC> : RRR2; multiclass mIRRR2 op1, bits<8> op2, bits<8> op3, bits<8> op4, string asmstr>{ def _rrr2 : IRRR2; def _rrr2_e : IRRR2, Requires<[HasV120_UP]>; } multiclass mIRCR_RRR2 op_rcr1, bits<3> op_rcr2, bits<8> op_rrr21, bits<8> op_rrr22, string asmstr, string posfix="", Operand Type3=s9imm, RegisterClass RC1=RE, RegisterClass RC2=RD>{ def _rcr#posfix: IRCR; def _rrr2#posfix: IRRR2; } multiclass mIRRR1_LU2 prefix, bits<6> ll, bits<6> lu, bits<6> ul, bits<6> uu, string asmstr, RegisterClass RC>{ def _rrr1_LL : IRRR1_label; def _rrr1_LU : IRRR1_label; def _rrr1_UL : IRRR1_label; def _rrr1_UU : IRRR1_label; } multiclass mI_MADD_H_MSUB_H_ pre, bits<6> ll, bits<6> lu, bits<6> ul, bits<6> uu, string asmstr, bit hasv110=true, RegisterClass RC=RE>{ if hasv110 then { if !or(!eq("maddm.h", asmstr), !eq("msubm.h", asmstr)) then def _rrr1_v110 : IRRR1, NsRequires<[HasV110]>; else def _rrr1_v110 : IRRR1_n, NsRequires<[HasV110]>; } defm "" : mIRRR1_LU2, Requires<[HasV120_UP]>; } multiclass mI_MADDRsH_MSUBRsH_ pre2, bits<6> ul2, bits<8> pre1, bits<6> ll, bits<6> lu, bits<6> ul, bits<6> uu, string asmstr>{ def _rrr1_v110: RRR1, NsRequires<[HasV110]>; def _rrr1_UL_2: RRR1, Requires<[HasV120_UP]>; defm "" : mIRRR1_LU2, Requires<[HasV120_UP]>; } multiclass mI_MADDsQ_MSUBsQ_ prefix, bits<6> op, bits<6> eop, bits<6> l, bits<6> el, bits<6> u, bits<6> eu, bits<6> ll, bits<6> ell, bits<6> uu, bits<6> euu, string asmstr>{ def _rrr1_UU2_v110: IRRR1_n, NsRequires<[HasV110]>; def _rrr1: IRRR1_n, Requires<[HasV120_UP]>; def _rrr1_e: IRRR1_n, Requires<[HasV120_UP]>; def _rrr1_L: IRRR1_label, Requires<[HasV120_UP]>; def _rrr1_e_L: IRRR1_label, Requires<[HasV120_UP]>; def _rrr1_U: IRRR1_label, Requires<[HasV120_UP]>; def _rrr1_e_U: IRRR1_label, Requires<[HasV120_UP]>; def _rrr1_L_L: IRRR1_label2, Requires<[HasV120_UP]>; def _rrr1_e_L_L: IRRR1_label2, Requires<[HasV120_UP]>; def _rrr1_U_U: IRRR1_label2, Requires<[HasV120_UP]>; def _rrr1_e_U_U: IRRR1_label2, Requires<[HasV120_UP]>; } defm MADD : mIRCR<0x13, 0x01, 0x13, 0x03, "madd"> , mIRRR2<0x03, 0x0A, 0x03, 0x6A, "madd">; defm MADDS : mIRCR<0x13, 0x05, 0x13, 0x07, "madds"> , mIRRR2<0x03, 0x8A, 0x03, 0xEA, "madds">; defm MADD_H : mI_MADD_H_MSUB_H_<0x83, 0x1A, 0x19, 0x18, 0x1B, "madd.h">; defm MADDS_H : mI_MADD_H_MSUB_H_<0x83, 0x3A, 0x39, 0x38, 0x3B, "madds.h">; defm MADD_Q : mI_MADDsQ_MSUBsQ_<0x43, 0x02, 0x1B, 0x01, 0x19, 0x00, 0x18, 0x05, 0x1D, 0x04, 0x1C, "madd.q">; defm MADDS_Q : mI_MADDsQ_MSUBsQ_<0x43, 0x22, 0x3B, 0x21, 0x39, 0x20, 0x38, 0x25, 0x3D, 0x24, 0x3C, "madds.q">; defm MADD_U: mIRCR_RRR2<0x13, 0x02, 0x03, 0x68, "madd.u", "", u9imm>, Requires<[HasV120_UP]>; defm MADDS_U: mIRCR<0x13, 0x04, 0x13, 0x06, "madds.u"> , mIRRR2<0x03, 0x88, 0x03, 0xE8, "madds.u">; defm MADDM: mIRCR_RRR2<0x13, 0x03, 0x03, 0x6A, "maddm", "_v110">, NsRequires<[HasV110]>; def MADDM_Q_rrr1_v110: IRRR1<0x43, 0x70, "maddm.q", RE>, NsRequires<[HasV110]>; defm MADDM_U: mIRCR_RRR2<0x13, 0x02, 0x03, 0x68, "maddm.u", "_v110", u9imm>, NsRequires<[HasV110]>; defm MADDM_H : mI_MADD_H_MSUB_H_<0x83, 0x1E, 0x1D, 0x1C, 0x1F, "maddm.h">; defm MADDMS: mIRCR_RRR2<0x13, 0x07, 0x03, 0xEA, "maddms", "_v110">, NsRequires<[HasV110]>; defm MADDMS_U: mIRCR_RRR2<0x13, 0x06, 0x03, 0xE8, "maddms.u", "_v110", u9imm>, NsRequires<[HasV110]>; defm MADDMS_H : mI_MADD_H_MSUB_H_<0x83, 0x3E, 0x3D, 0x3C, 0x3F, "maddms.h", false>; defm MADDR_H : mI_MADDRsH_MSUBRsH_<0x43, 0x1E, 0x83, 0x0E, 0x0D, 0x0C, 0x0F, "maddr.h">; defm MADDRS_H : mI_MADDRsH_MSUBRsH_<0x43, 0x3E, 0x83, 0x2E, 0x2D, 0x2C, 0x2F, "maddrs.h">; multiclass mI_MADDRsQ_MSUBRsQ_ prefix, bits<6> op, bits<6> eop, string asmstr> { def _rrr1_L_L : IRRR1_label2, Requires<[HasV120_UP]>; def _rrr1_U_U : IRRR1_label2, Requires<[HasV120_UP]>; def _rrr1_v110: IRRR1_n, NsRequires<[HasV110]>; } defm MADDR_Q : mI_MADDRsQ_MSUBRsQ_<0x43, 0x07, 0x06, "maddr.q">; defm MADDRS_Q: mI_MADDRsQ_MSUBRsQ_<0x43, 0x27, 0x26, "maddrs.q">; defm MADDSU_H : mI_MADD_H_MSUB_H_<0xC3, 0x1A, 0x19, 0x18, 0x1B, "maddsu.h", false>; defm MADDSUS_H : mI_MADD_H_MSUB_H_<0xC3, 0x3A, 0x39, 0x38, 0x3B, "maddsus.h", false>; defm MADDSUM_H : mI_MADD_H_MSUB_H_<0xC3, 0x1E, 0x1D, 0x1C, 0x1F, "maddsum.h", false>; defm MADDSUMS_H : mI_MADD_H_MSUB_H_<0xC3, 0x3E, 0x3D, 0x3C, 0x3F, "maddsums.h", false>; defm MADDSUR_H : mI_MADD_H_MSUB_H_<0xC3, 0x0E, 0x0D, 0x0C, 0x0F, "maddsur.h", false, RD>; defm MADDSURS_H : mI_MADD_H_MSUB_H_<0xC3, 0x2E, 0x2D, 0x2C, 0x2F, "maddsurs.h", false, RD>; defm MAX : mIRR_RC<0x0B, 0x1A, 0x8B, 0x1A, "max">; defm MAX_U : mIRR_RC<0x0B, 0x1B, 0x8B, 0x1B, "max.u">; defm MAX_B : mIU__RR_ab<0x0B, 0x5A, 0x0B, 0x5B, "max.b">; defm MAX_H : mIU__RR_ab<0x0B, 0x7A, 0x0B, 0x7B, "max.h">; defm MIN : mIRR_RC<0x0B, 0x18, 0x8B, 0x18, "min">; defm MIN_U : mIRR_RC<0x0B, 0x19, 0x8B, 0x19, "min.u">; defm MIN_B : mIU__RR_ab<0x0B, 0x58, 0x0B, 0x59, "min.b">; defm MIN_H : mIU__RR_ab<0x0B, 0x78, 0x0B, 0x79, "min.h">; class IRLC_1 op1, string asmstr, RegisterClass RC=RD, Operand TypeC=u16imm> : RLC; class ISRC_1 op1, string asmstr, RegisterClass RC=RD> : SRC; def MOV_rlc : IRLC_1<0x3B, "mov", RD, s16imm>; def MOV_rlc_e: IRLC_1<0xFB, "mov", RE>, Requires<[HasV160_UP]>; def MOV_rr : IRR_b<0x0B, 0x1F, "mov">; def MOV_rr_e: IRR_b<0x0B, 0x80, "mov", RE>, Requires<[HasV160_UP]>; def MOV_rr_eab : IRR_dab<0x0B, 0x81, "mov", RE>, Requires<[HasV160_UP]>; def MOV_sc_v110: ISC_D15C<0xC6, "mov">, NsRequires<[HasV110]>; def MOV_sc : ISC_D15C<0xDA, "mov">, Requires<[HasV120_UP]>; def MOV_src: ISRC_dC<0x82, "mov">; def MOV_src_e: ISRC_1<0xD2, "mov", RE>, Requires<[HasV160_UP]>; def MOV_srr : ISRR_db<0x02, "mov">; multiclass mI_MOV_srr srr110,bits<8> srr1, string asmstr, RegisterClass RCd=RA, RegisterClass RC1=RD>{ def _srr_v110: ISRR_db, NsRequires<[HasV110]>; def _srr: ISRR_db, Requires<[HasV120_UP]>; } multiclass mI_MOVA_ rr1, bits<8> rr2, bits<8> src1, bits<8> srr110,bits<8> srr1, string asmstr> { def _rr : IRR_b; def _src: ISRC_dC, Requires<[HasV120_UP]>; defm "" : mI_MOV_srr; } defm MOV_A : mI_MOVA_<0x01, 0x63, 0xA0, 0x30, 0x60, "mov.a">; def MOV_AA_rr : IRR_b<0x01, 0x00, "mov.aa", RA, RA>; defm MOV_AA_srr: mI_MOV_srr<0x80, 0x40, "mov.aa", RA, RA>; def MOV_D_rr : IRR_b<0x01, 0x4C, "mov.d", RD, RA>; defm MOV_D_srr : mI_MOV_srr<0x20, 0x80, "mov.d", RD, RA>; def MOV_U_rlc : IRLC_1<0xBB, "mov.u">; def MOVH_rlc : IRLC_1<0x7B, "movh", RD, u16imm>; def MOVH_A_rlc : IRLC_1<0x91, "movh.a", RA, u16imm>; def MOVZ_A_sr: ISR_1<0x00, 0x01, "movz.a", RA>, NsRequires<[HasV110]>; defm MSUB : mIRCR<0x33, 0x01, 0x33, 0x03, "msub"> , mIRRR2<0x23, 0x0A, 0x23, 0x6A, "msub">; defm MSUBS: mIRCR<0x33, 0x05, 0x33, 0x07, "msubs"> , mIRRR2<0x23, 0x8A, 0x23, 0xEA, "msubs">; defm MSUB_H : mI_MADD_H_MSUB_H_<0xA3, 0x1A, 0x19, 0x18, 0x1B, "msub.h">; defm MSUBS_H : mI_MADD_H_MSUB_H_<0xA3, 0x3A, 0x39, 0x38, 0x3B, "msubs.h">; defm MSUB_Q : mI_MADDsQ_MSUBsQ_<0x63, 0x02, 0x1B, 0x01, 0x19, 0x00, 0x18, 0x05, 0x1D, 0x04, 0x1C, "msub.q">; defm MSUBS_Q : mI_MADDsQ_MSUBsQ_<0x63, 0x22, 0x3B, 0x21, 0x39, 0x20, 0x38, 0x25, 0x3D, 0x24, 0x3C, "msubs.q">; defm MSUB_U: mIRCR_RRR2<0x33, 0x02, 0x23, 0x68, "msub.u", "", u9imm>, Requires<[HasV120_UP]>; defm MSUBS_U : mIRCR<0x33, 0x04, 0x33, 0x06, "msubs.u"> , mIRRR2<0x23, 0x88, 0x23, 0xE8, "msubs.u">; defm MSUBAD_H : mI_MADD_H_MSUB_H_<0xE3, 0x1A, 0x19, 0x18, 0x1B, "msubad.h", false>; defm MSUBADS_H : mI_MADD_H_MSUB_H_<0xE3, 0x3A, 0x39, 0x38, 0x3B, "msubads.h", false>; defm MSUBADM_H : mI_MADD_H_MSUB_H_<0xE3, 0x1E, 0x1D, 0x1C, 0x1F, "msubadm.h", false>; defm MSUBADMS_H : mI_MADD_H_MSUB_H_<0xE3, 0x3E, 0x3D, 0x3C, 0x3F, "msubadms.h", false>; defm MSUBADR_H : mI_MADD_H_MSUB_H_<0xE3, 0x0E, 0x0D, 0x0C, 0x0F, "msubadr.h", true, RD>; defm MSUBADRS_H : mI_MADD_H_MSUB_H_<0xE3, 0x2E, 0x2D, 0x2C, 0x2F, "msubadrs.h", true, RD>; defm MSUBM: mIRCR_RRR2<0x33, 0x03, 0x23, 0x6A, "msubm", "v110">, NsRequires<[HasV110]>; def MSUBM_Q_rrr1_v110: IRRR1<0x63, 0x1C, "msubm.q", RE>, NsRequires<[HasV110]>; defm MSUBM_U: mIRCR_RRR2<0x33, 0x02, 0x23, 0x68, "msubm.u", "v110">, NsRequires<[HasV110]>; defm MSUBMS: mIRCR_RRR2<0x33, 0x07, 0x23, 0xEA, "msubms", "v110">, NsRequires<[HasV110]>; defm MSUBMS_U: mIRCR_RRR2<0x33, 0x06, 0x23, 0xE8, "msubms.u", "v110">, NsRequires<[HasV110]>; defm MSUBM_H : mI_MADD_H_MSUB_H_<0xA3, 0x1E, 0x1D, 0x1C, 0x1F, "msubm.h">; defm MSUBMS_H : mI_MADD_H_MSUB_H_<0xA3, 0x3E, 0x3D, 0x3C, 0x3F, "msubms.h", false>; defm MSUBR_H : mI_MADDRsH_MSUBRsH_<0x63, 0x1E, 0xA3, 0x0E, 0x0D, 0x0C, 0x0F, "msubr.h">; defm MSUBRS_H: mI_MADDRsH_MSUBRsH_<0x63, 0x3E, 0xA3, 0x2E, 0x2D, 0x2C, 0x2F, "msubrs.h">; defm MSUBR_Q : mI_MADDRsQ_MSUBRsQ_<0x63, 0x07, 0x06, "msubr.q">; defm MSUBRS_Q: mI_MADDRsQ_MSUBRsQ_<0x63, 0x27, 0x26, "msubrs.q">; class IRLC_CR op1, string asmstr, RegisterClass RC=RD> : RLC; def MTCR_rlc : IRLC_CR<0xCD, "mtcr">; def MFCR_rlc : IRLC_1 <0x4D, "mfcr">; class IRR2 op1, bits<12> op2, string asmstr, RegisterClass RCd=RD, RegisterClass RCa=RD, RegisterClass RCb=RD> : RR2; def MUL_rc : RC<0x53, 0x01, (outs RD:$d), (ins RD:$s1, s9imm:$const9), "mul $d, $s1, $const9", []>; def MUL_rc_e: RC<0x53, 0x03, (outs RE:$d), (ins RD:$s1, s9imm:$const9), "mul $d, $s1, $const9", []> , Requires<[HasV120_UP]>; def MUL_rr2 : IRR2<0x73, 0x0A, "mul">, Requires<[HasV120_UP]>; def MUL_rr2_e: IRR2<0x73, 0x6A, "mul", RE>, Requires<[HasV120_UP]>; def MUL_srr : ISRR_db<0xE2, "mul">; def MUL_rr_v110: IRR_dab<0x73, 0x0A, "mul">, NsRequires<[HasV110]>; multiclass mI_MUL_ rc1, bits<7> rc2, bits<8> oprr1, bits<12> oprr2, string asmstr, RegisterClass RCd=RD>{ if !eq(asmstr, "mul.u") then def _rc : IRC, Requires<[HasV120_UP]>; else{ def _rc : IRC; def _rr_v110: IRR_dab, NsRequires<[HasV110]>; } def _rr2 : IRR2, Requires<[HasV120_UP]>; } defm MULS : mI_MUL_<0x53, 0x05, 0x73, 0x8A, "muls", RD>; class IRR1 op1, bits<10> op2, string asmstr, RegisterClass RCd, string labela, string labelb> : RR1; multiclass mI_MUL_H_ pre, bits<10> ll, bits<10> lu, bits<10> ul, bits<10> uu, string asmstr , bit hasv110=false, bits<8> rr=0, RegisterClass RCd=RE>{ if hasv110 then def _rr_v110 : IRR_dabn, NsRequires<[HasV110]>; def _rr1_LL2e : IRR1, Requires<[HasV120_UP]>; def _rr1_LU2e : IRR1, Requires<[HasV120_UP]>; def _rr1_UL2e : IRR1, Requires<[HasV120_UP]>; def _rr1_UU2e : IRR1, Requires<[HasV120_UP]>; } defm MUL_H : mI_MUL_H_<0xB3, 0x1A, 0x19, 0x18, 0x1B, "mul.h", true, 0x18>; multiclass mI_MULQ_ pre, bits<8> rr, bits<10> op1, bits<10> op2, bits<10> op3, bits<10> op4, bits<10> op5, bits<10> op6, bits<10> op7, bits<10> op8, string asmstr>{ def _rr_v110 : IRR_dabn, NsRequires<[HasV110]>; def _rr1_2 : IRR1, Requires<[HasV120_UP]>; def _rr1_2__e: IRR1, Requires<[HasV120_UP]>; def _rr1_2_L : IRR1, Requires<[HasV120_UP]>; def _rr1_2_Le: IRR1, Requires<[HasV120_UP]>; def _rr1_2_U : IRR1, Requires<[HasV120_UP]>; def _rr1_2_Ue: IRR1, Requires<[HasV120_UP]>; def _rr1_2LL : IRR1, Requires<[HasV120_UP]>; def _rr1_2UU : IRR1, Requires<[HasV120_UP]>; } defm MUL_Q : mI_MULQ_<0x93, 0x04, 0x02, 0x1B, 0x01, 0x19, 0x00, 0x18, 0x05, 0x04, "mul.q">; defm MUL_U : mI_MUL_<0x53, 0x02, 0x73, 0x68, "mul.u", RE>; defm MULS_U : mI_MUL_<0x53, 0x04, 0x73, 0x88, "muls.u", RD>; defm MULM: mIRR_RC<0x73, 0x6A, 0x53, 0x03, "mulm", RE>, NsRequires<[HasV110]>; defm MULM_U: mIRR_RC<0x73, 0x68, 0x53, 0x02, "mulm.u", RE>, NsRequires<[HasV110]>; defm MULMS_H: mI_MUL_H_<0xB3, 0x3E,0x3D, 0x3C, 0x3F, "mulms.h">; defm MULM_H : mI_MUL_H_<0xB3, 0x1E, 0x1D, 0x1C, 0x1F, "mulm.h">; defm MULR_H : mI_MUL_H_<0xB3, 0x0E, 0x0D, 0x0C, 0x0F, "mulr.h", true, 0x0C, RD>; def MULR_Q_rr_v110 : IRR_dabn<0x93, 0x06, "mulr.q">, NsRequires<[HasV110]>; def MULR_Q_rr1_2LL : IRR1<0x93, 0x07, "mulr.q", RD, "l", "l">, Requires<[HasV120_UP]>; def MULR_Q_rr1_2UU : IRR1<0x93, 0x06, "mulr.q", RD, "u", "u">, Requires<[HasV120_UP]>; defm NAND : mIRR_RC<0x0F, 0x09, 0x8F, 0x09, "nand">; def NAND_T : IBIT<0x07, 0x00, "nand.t">; defm NE : mIRR_RC<0x0B, 0x11, 0x8B, 0x11, "ne">; def NE_A : IRR_dab<0x01, 0x41, "ne.a", RD, RA, RA>; def NEZ_A : IRR_a<0x01, 0x49, "nez.a", RD, RA>; def NOP_sr : ISR_0<0x00, 0x00, "nop">; def NOP_sys : ISYS_0<0x0D, 0x00, "nop">; multiclass mISR_1 sr1op1, bits<4> sr1op2, bits<8> sr2op1, bits<4> sr2op2, string asmstr>{ def _sr : ISR_1, Requires<[HasV120_UP]>; def _sr_v110 : ISR_1, NsRequires<[HasV110]>; } defm NOR : mIRR_RC<0x0F, 0x0B, 0x8F, 0x0B, "nor">; def NOR_T : IBIT<0x87, 0x02, "nor.t">; defm NOR : mISR_1<0x46, 0x00, 0x36, 0x00, "nor">; def NOT_sr_v162 : ISR_1<0x46, 0x00, "not">, NsRequires<[HasV162]>; defm OR : mIRR_RC<0x0F, 0x0A, 0x8F, 0x0A, "or", RD, RD, u9imm>; def OR_sc : ISC_D15C<0x96, "or">, Requires<[HasV120_UP]>; def OR_srr : ISRR_db<0xA6, "or">, Requires<[HasV120_UP]>; def OR_sc_v110 : ISC_D15C<0xD6, "or">, NsRequires<[HasV110]>; def OR_srr_v110 : ISRR_db<0x56, "or">, NsRequires<[HasV110]>; def OR_AND_T : IBIT<0xC7, 0x00, "or.and.t">; def OR_ANDN_T : IBIT<0xC7, 0x03, "or.andn.t">; def OR_NOR_T : IBIT<0xC7, 0x02, "or.nor.t">; def OR_OR_T : IBIT<0xC7, 0x01, "or.or.t">; defm OR_EQ : mIRR_RC<0x0B, 0x27, 0x8B, 0x27, "or.eq">; defm OR_GE : mIRR_RC<0x0B, 0x2B, 0x8B, 0x2B, "or.ge">; defm OR_GE_U : mIRR_RC<0x0B, 0x2C, 0x8B, 0x2C, "or.ge.u">; defm OR_LT : mIRR_RC<0x0B, 0x29, 0x8B, 0x29, "or.lt">; defm OR_LT_U : mIRR_RC<0x0B, 0x2A, 0x8B, 0x2A, "or.lt.u">; defm OR_NE : mIRR_RC<0x0B, 0x28, 0x8B, 0x28, "or.ne">; def OR_T : IBIT<0x87, 0x01, "or.t">; defm ORN : mIRR_RC<0x0F, 0x0F, 0x8F, 0x0F, "orn">; def ORN_T : IBIT<0x07, 0x01, "orn.t">; def PACK_rrr : IRRR_d31<0x6B, 0x00, "pack", RD, RD, RD, RE>; multiclass mISYS_0 sys1op1, bits<6> sys1op2, bits<8> sys2op1, bits<6> sys2op2, string asmstr>{ def _sys : ISYS_0, Requires<[HasV120_UP]>; def _sys_v110 : ISYS_0, NsRequires<[HasV110]>; } def PARITY_rr : IRR_a<0x4B, 0x02, "parity">, Requires<[HasV120_UP]>; def PARITY_rr_v110 : IRR_a<0x4B, 0x08, "parity">, NsRequires<[HasV110]>; def POPCNT_W_rr : IRR_a<0x4B, 0x22, "popcnt.w">, NsRequires<[HasV162]>; def RESTORE_sys : ISYS_1<0x0D, 0x0E, "restore">, Requires<[HasV160_UP]>; def RET_sr : ISR_0<0x00, 0x09, "ret">; defm RET : mISYS_0<0x0D, 0x06, 0x0D, 0x05, "ret">; def RFE_sr : ISR_0<0x00, 0x08, "rfe">; defm RFE_sys : mISYS_0<0x0D, 0x07, 0x0D, 0x06, "rfe">; def RFM_sys : ISYS_0<0x0D, 0x05, "rfm">; def RSLCX_sys : ISYS_0<0x0D, 0x09, "rslcx">; def RSTV_sys : ISYS_0<0x2F, 0x00, "rstv">; def RSUB_rc : IRC<0x8B, 0x08, "rsub">; defm RSUB_sr : mISR_1<0x32, 0x05, 0xD2, 0x05, "rsub">; def RSUBS_rc : IRC<0x8B, 0x0A, "rsubs">; def RSUBS_U_rc : IRC<0x8B, 0x0B, "rsubs.u">; multiclass mI_SAT_ r1, bits<8> r2, bits<8> s1, bits<4> s2, bits<8> vs1, bits<4> vs2, string asmstr>{ def _rr : IRR_a; defm "" : mISR_1; } defm SAT_B : mI_SAT_<0x0B, 0x5E, 0x32, 0x00, 0xD2, 0x00, "sat.b">; defm SAT_BU : mI_SAT_<0x0B, 0x5F, 0x32, 0x01, 0xD2, 0x01, "sat.bu">; defm SAT_H : mI_SAT_<0x0B, 0x7E, 0x32, 0x02, 0xD2, 0x02, "sat.h">; defm SAT_HU : mI_SAT_<0x0B, 0x7F, 0x32, 0x03, 0xD2, 0x03, "sat.hu">; def SEL_rcr : IRCR<0xAB, 0x04, "sel">; def SEL_rrr : IRRR<0x2B, 0x04, "sel">; def SEL_A_rcr_v110: IRCR<0xA1, 0x04, "sel.a", RA, RA>, NsRequires<[HasV110]>; def SEL_A_rrr_v110: IRRR<0x21, 0x04, "sel.a", RA, RA, RA>, NsRequires<[HasV110]>; def SELN_rcr : IRCR<0xAB, 0x05, "seln">; def SELN_rrr : IRRR<0x2B, 0x05, "seln">; def SELN_A_rcr_v110: IRCR<0xA1, 0x05, "seln.a", RA, RA>, NsRequires<[HasV110]>; def SELN_A_rrr_v110: IRRR<0x21, 0x05, "seln.a", RA, RA, RA>, NsRequires<[HasV110]>; multiclass mISRC_1 op1, bits<8> op2, string asmstr>{ def _src: ISRC_1, Requires<[HasV120_UP]>; def _src_v110: ISRC_1, NsRequires<[HasV110]>; } defm SH : mISRC_1<0x06, 0x26, "sh">; defm SH : mIRR_RC<0x0F, 0x00, 0x8F, 0x00, "sh">; defm SH_B : mIRR_RC<0x0F, 0x20, 0x8F, 0x20, "sh.b">, NsRequires<[HasV110]>; defm SH_H : mIRR_RC<0x0F, 0x40, 0x8F, 0x40, "sh.h">; defm SH_EQ : mIRR_RC<0x0B, 0x37, 0x8B, 0x37, "sh.eq">; defm SH_NE : mIRR_RC<0x0B, 0x38, 0x8B, 0x38, "sh.ne">; defm SH_GE : mIRR_RC<0x0B, 0x3B, 0x8B, 0x3B, "sh.ge">; defm SH_GE_U : mIRR_RC<0x0B, 0x3C, 0x8B, 0x3C, "sh.ge.u">; defm SH_LT : mIRR_RC<0x0B, 0x39, 0x8B, 0x39, "sh.lt">; defm SH_LT_U : mIRR_RC<0x0B, 0x3A, 0x8B, 0x3A, "sh.lt.u">; def SH_AND_T : IBIT<0x27, 0x00, "sh.and.t">; def SH_ANDN_T : IBIT<0x27, 0x03, "sh.andn.t">; def SH_NAND_T : IBIT<0xA7, 0x00, "sh.nand.t">; def SH_NOR_T : IBIT<0x27, 0x02, "sh.nor.t">; def SH_OR_T : IBIT<0x27, 0x01, "sh.or.t">; def SH_ORN_T : IBIT<0xA7, 0x01, "sh.orn.t">; def SH_XNOR_T : IBIT<0xA7, 0x02, "sh.xnor.t">; def SH_XOR_T : IBIT<0xA7, 0x03, "sh.xor.t">; defm SHA : mISRC_1<0x86, 0xA6, "sha">; defm SHA : mIRR_RC<0x0F, 0x01, 0x8F, 0x01, "sha">; defm SHA_B : mIRR_RC<0x0F, 0x21, 0x8F, 0x21, "sha.b">, NsRequires<[HasV110]>; defm SHA_H : mIRR_RC<0x0F, 0x41, 0x8F, 0x41, "sha.h">; defm SHAS : mIRR_RC<0x0F, 0x02, 0x8F, 0x02, "shas">; def SHUFFLE_rc : IRC<0x8F, 0x07, "shuffle">, Requires<[HasV162]>; // A[b], off10, A[a] (BO)(Base + Short Offset Addressing Mode) class IBO_bso_st op1, bits<6> op2, string asmstr, RegisterClass RC> : BO; // P[b], A[a] (BO)(Bit-reverse Addressing Mode) class IBO_r_st op1, bits<6> op2, string asmstr, RegisterClass RC> : BO; // P[b], off10, A[a] (BO)(Circular Addressing Mode) class IBO_c_st op1, bits<6> op2, string asmstr, RegisterClass RC> : BO; // A[b], off10, A[a] (BO)(Post-increment Addressing Mode) class IBO_pos_st op1, bits<6> op2, string asmstr, RegisterClass RC> : BO; // A[b], off10, A[a] (BO)(Pre-increment Addressing Mode) class IBO_pre_st op1, bits<6> op2, string asmstr, RegisterClass RC> : BO; multiclass mIBO_st prefix1, bits<8> prefix2, bits<6> bso2, ///_bso bits<6> pos_r, ///_pos|_r bits<6> pre_c, ///_pre|_c string asmstr, RegisterClass RC>{ def _bo_bso : IBO_bso_st; def _bo_pos : IBO_pos_st; def _bo_pre : IBO_pre_st; def _bo_r : IBO_r_st; def _bo_c : IBO_c_st; } multiclass mI_ST_ abs1, bits<2> abs2, ///_abs bits<8> prefix1, bits<8> prefix2, bits<6> bso, ///_bso bits<6> pos_r, ///_pos|_r bits<6> pre_c, ///_pre|_c string asmstr, RegisterClass RC> : mIBO_st{ def _abs : IABS_OR; } defm ST_A : mI_ST_<0xA5, 0x02, 0x89, 0xA9, 0x26, 0x06, 0x16, "st.a", RA>; defm ST_B : mI_ST_<0x25, 0x00, 0x89, 0xA9, 0x20, 0x00, 0x10, "st.b", RD>; defm ST_D : mI_ST_<0xA5, 0x01, 0x89, 0xA9, 0x25, 0x05, 0x15, "st.d", RE>; defm ST_DA : mI_ST_<0xA5, 0x03, 0x89, 0xA9, 0x27, 0x07, 0x17, "st.da", RP>; defm ST_H : mI_ST_<0x25, 0x02, 0x89, 0xA9, 0x22, 0x02, 0x12, "st.h", RD>; defm ST_Q : mI_ST_<0x65, 0x00, 0x89, 0xA9, 0x28, 0x08, 0x18, "st.q", RD>; multiclass mI_ST_2_ sro, bits<8> ssr, bits<8> ssrpos, bits<8> ssro, bits<8> srov, bits<8> ssrv, bits<8> ssrposv, bits<8> ssrov, string asmstr, RegisterClass RC>{ if !eq(RC,RD) then { def _sro_v110: ISRO_ROD15, NsRequires<[HasV110]>; def _sro : ISRO_ROD15, Requires<[HasV120_UP]>; } else if !eq(RC,RA) then { def _sro_v110: ISRO_ROA15, NsRequires<[HasV110]>; def _sro : ISRO_ROA15, Requires<[HasV120_UP]>; } def _ssr_v110 : SSR , NsRequires<[HasV110]>; def _ssr_pos_v110: SSR , NsRequires<[HasV110]>; def _ssro_v110: SSRO , NsRequires<[HasV110]>; def _ssr : SSR , Requires<[HasV120_UP]>; def _ssr_pos : SSR , Requires<[HasV120_UP]>; def _ssro : SSRO , Requires<[HasV120_UP]>; } def ST_A_bol : IBOL_AbOR<0xB5, "st.a", RA>, Requires<[HasV160_UP]>; def ST_A_sc : ISC_A10CA15<0xF8, "st.a">, Requires<[HasV120_UP]>; defm ST_A : mI_ST_2_<0xEC, 0xF4, 0xE4, 0xE8, 0x18, 0x84, 0x54, 0x2C, "st.a", RA>; def ST_B_bol : IBOL_AbOR<0xE9, "st.b", RD>, Requires<[HasV160_UP]>; defm ST_B : mI_ST_2_<0x2C, 0x34, 0x24, 0x28, 0xA8, 0x78, 0xE4, 0x8C, "st.b", RD>; def ST_H_bol : IBOL_AbOR<0xF9, "st.h", RD>, Requires<[HasV160_UP]>; defm ST_H : mI_ST_2_<0xAC, 0xB4, 0xA4, 0xA8, 0x68, 0xF8, 0x14, 0x4C, "st.h", RD>; def ST_T : ABSB<0xD5, 0x00, (outs), (ins off18imm:$off18, i32imm:$bpos3, i32imm:$b), "st.t $off18, $bpos3, $b", []>; defm ST_W : mI_ST_<0xA5, 0x00, 0x89, 0xA9, 0x24, 0x04, 0x14, "st.w", RD> , mI_ST_2_<0x6C, 0x74, 0x64, 0x68, 0xE8, 0x04, 0x94, 0xCC, "st.w", RD>; def ST_W_bol : IBOL_AbOR<0x59, "st.w", RD>; def ST_W_sc : ISC_A10CD15<0x78, "st.w">, Requires<[HasV120_UP]>; def STLCX_abs : IABS_off18<0x15, 0x00, "stlcx">; def STLCX_bo_bso : IBO_bso<0x49, 0x26, "stlcx">; def STUCX_abs : IABS_off18<0x15, 0x01, "stucx">; def STUCX_bo_bso : IBO_bso<0x49, 0x27, "stucx">; def SUB_rr : IRR_dab<0x0B, 0x08, "sub">; defm SUB : mISRR_a15a<0xA2, 0x52, 0x5A, "sub"> , mIB_H<0x0B, 0x48, 0x0B, 0x68, "sub">; multiclass mISC_A10C scv, bits<8> sc, string asmstr>{ def _sc_v110: ISC_A10C, NsRequires<[HasV110]>; def _sc : ISC_A10C, Requires<[HasV120_UP]>; } def SUB_A_rr : IRR_dab<0x01, 0x02, "sub.a", RA, RA, RA>; defm SUB_A : mISC_A10C<0x40, 0x20, "sub.a">; def SUBSC_A_rr: IRR_dabn<0x01, 0x61, "subsc.a", RA, RA, RD>, NsRequires<[HasV110]>; def SUBC_rr : IRR_dab<0x0B, 0x0D, "subc">; def SUBS_rr : IRR_dab<0x0B, 0x0A, "subs">; def SUBS_srr : ISRR_db<0x62, "subs">; def SUBS_U_rr : IRR_dab<0x0B, 0x0B, "subs.u">; def SUBS_B_rr : IRR_dab<0x0B, 0x4A, "subs.b">, NsRequires<[HasV110]>; def SUBS_BU_rr: IRR_dab<0x0B, 0x4B, "subs.bu">, NsRequires<[HasV110]>; def SUBS_H_rr : IRR_dab<0x0B, 0x6A, "subs.h">; def SUBS_HU_rr: IRR_dab<0x0B, 0x6B, "subs.hu">; def SUBX_rr : IRR_dab<0x0B, 0x0C, "subx">; def SVLCX_sys : ISYS_0<0x0D, 0x08, "svlcx">; multiclass mI_SWAP_1 prefix_bso_pos_pre, bits<8> prefix_r_c, bits<6> bso, ///_bso bits<6> pos_r, ///_pos|_r bits<6> pre_c, ///_pre|_c string asmstr, RegisterClass RC=RA>{ def _bo_bso: BO; def _bo_pos: BO; def _bo_pre: BO; def _bo_r : BO; def _bo_c : BO; } multiclass mI_SWAP_ abs1, bits<2> abs2, ///_abs bits<8> prefix_bso_pos_pre, bits<8> prefix_r_c, bits<6> bso, ///_bso bits<6> pos_r, ///_pos|_r bits<6> pre_c, ///_pre|_c string asmstr, RegisterClass RC=RA>{ def _abs: IABS_OR; defm "" : mI_SWAP_1; } defm SWAP_A : mI_SWAP_<0xE5, 0x02, 0x49, 0x69, 0x22, 0x02, 0x12, "swap.a">, NsRequires<[HasV110]>; defm SWAP_W : mI_SWAP_<0xE5, 0x00, 0x49, 0x69, 0x20, 0x00, 0x10, "swap.w", RD>; def SWAP_W_bo_i: BO<0x69, 0x20, (outs RD:$d), (ins RP:$s1, s10imm:$off10), "swap.w [${s1}+i], $d", []>, Requires<[HasV160_UP]>; defm SWAPMSK_W : mI_SWAP_1<0x49, 0x69, 0x22, 0x02, 0x12, "swapmsk.w", RE>, Requires<[HasV161_UP]>; def SWAPMSK_W_bo_i: BO<0x69, 0x22, (outs RE:$d), (ins RP:$s1, s10imm:$off10), "swapmsk.w [${s1}+i], $d", []>, Requires<[HasV161_UP]>; def SYSCALL_rc : IRC_C<0xAD, 0x04, "syscall">; def TLBDEMAP_rr : IRR_R1<0x75, 0x00, "tlbdemap">, Requires<[HasV130_UP]>; def TLBFLUSH_A_rr: IRR_0<0x75, 0x04, "tlbflush.a">, Requires<[HasV130_UP]>; def TLBFLUSH_B_rr: IRR_0<0x75, 0x05, "tlbflush.b">, Requires<[HasV130_UP]>; def TLBMAP_rr : IRR_R1<0x75, 0x40, "tlbmap", RE>, Requires<[HasV130_UP]>; def TLBPROBE_A_rr: IRR_R1<0x75, 0x08, "tlbprobe.a">, Requires<[HasV130_UP]>; def TLBPROBE_I_rr: IRR_R1<0x75, 0x09, "tlbprobe.i">, Requires<[HasV130_UP]>; def TRAPSV_sys : ISYS_0<0x0D, 0x15, "trapsv">; def TRAPV_sys : ISYS_0<0x0D, 0x14, "trapv">; multiclass mIRR_a pre, bits<8> op1, bits<8> op2, string asmstr, RegisterClass RC=RD>{ def _rr_v110: IRR_a, NsRequires<[HasV110]>; def _rr : IRR_a, Requires<[HasV120_UP]>; } defm UNPACK_rr : mIRR_a<0x4B, 0x50, 0x08, "unpack", RE>; def WAIT_sys : ISYS_0<0x0D, 0x16, "wait">, Requires<[HasV161_UP]>; defm XNOR : mIRR_RC<0x0F, 0x0D, 0x8F, 0x0D, "xnor">; def XNOR_T : IBIT<0x07, 0x02, "xnor.t">; defm XOR : mIRR_RC<0x0F, 0x0C, 0x8F, 0x0C, "xor">; def XOR_srr : ISRR_db<0xC6, "xor">, Requires<[HasV120_UP]>; def XOR_T : IBIT<0x07, 0x03, "xor.t">; defm XOR_EQ : mIRR_RC<0x0B, 0x2F, 0x8B, 0x2F, "xor.eq">; defm XOR_NE : mIRR_RC<0x0B, 0x30, 0x8B, 0x30, "xor.ne">; defm XOR_GE : mIRR_RC<0x0B, 0x33, 0x8B, 0x33, "xor.ge">; defm XOR_GE_U : mIRR_RC<0x0B, 0x34, 0x8B, 0x34, "xor.ge.u">; defm XOR_LT : mIRR_RC<0x0B, 0x31, 0x8B, 0x31, "xor.lt">; defm XOR_LT_U : mIRR_RC<0x0B, 0x32, 0x8B, 0x32, "xor.lt.u">; /// FPU Instructions def MADD_F_rrr : IRRR<0x6B, 0x06, "madd.f">, Requires<[HasV130_UP]>; def MSUB_F_rrr : IRRR<0x6B, 0x07, "msub.f">, Requires<[HasV130_UP]>; def ADD_F_rrr : IRRR_d31<0x6B, 0x02, "add.f">, Requires<[HasV130_UP]>; def SUB_F_rrr : IRRR_d31<0x6B, 0x03, "sub.f">, Requires<[HasV130_UP]>; def MUL_F_rrr : IRR_dab<0x4B, 0x04, "mul.f">, Requires<[HasV130_UP]>; def DIV_F_rr : IRR_dab<0x4B, 0x05, "div.f">, Requires<[HasV130_UP]>; def CMP_F_rr : IRR_dab<0x4B, 0x00, "cmp.f">, Requires<[HasV130_UP]>; def FTOI_rr : IRR_a<0x4B, 0x10, "ftoi">, Requires<[HasV130_UP]>; def FTOIZ_rr : IRR_a<0x4B, 0x13, "ftoiz">, Requires<[HasV131_UP]>; def FTOQ31_rr : IRR_dab<0x4B, 0x11, "ftoq31">, Requires<[HasV130_UP]>; def FTOQ31Z_rr: IRR_dab<0x4B, 0x18, "ftoq31z">, Requires<[HasV131_UP]>; def FTOU_rr : IRR_a<0x4B, 0x12, "ftou">, Requires<[HasV130_UP]>; def FTOUZ_rr : IRR_a<0x4B, 0x17, "ftouz">, Requires<[HasV131_UP]>; def FTOHP_rr : IRR_a<0x4B, 0x25, "ftohp">, Requires<[HasV162_UP]>; def HPTOF_rr : IRR_a<0x4B, 0x24, "hptof">, Requires<[HasV162_UP]>; def ITOF_rr : IRR_a<0x4B, 0x14, "itof">, Requires<[HasV130_UP]>; def Q31TOF_rr : IRR_dab<0x4B, 0x15, "q31tof">, Requires<[HasV130_UP]>; def QSEED_F_rr : IRR_a<0x4B, 0x19, "qseed.f">, Requires<[HasV130_UP]>; def UPDFL_rr : IRR_R1<0x4B, 0x0C, "updfl">, Requires<[HasV130_UP]>; def UTOF_rr : IRR_a<0x4B, 0x16, "utof">, Requires<[HasV130_UP]>;