| //=- MipsScheduleGeneric.td - Generic Scheduling Definitions -*- tablegen -*-=// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file describes the interAptiv processor in a manner of speaking. It |
| // describes a hypothetical version of the in-order MIPS32R2 interAptiv with all |
| // branches of the MIPS ISAs, ASEs and ISA variants. The itinerary lists are |
| // broken down into per ISA lists, so that this file can be used to rapidly |
| // develop new schedule models. |
| // |
| //===----------------------------------------------------------------------===// |
| def MipsGenericModel : SchedMachineModel { |
| int IssueWidth = 1; |
| int MicroOpBufferSize = 0; |
| |
| // These figures assume an L1 hit. |
| int LoadLatency = 2; |
| int MispredictPenalty = 4; |
| |
| int HighLatency = 37; |
| list<Predicate> UnsupportedFeatures = []; |
| |
| let CompleteModel = 1; |
| let PostRAScheduler = 1; |
| |
| // FIXME: Remove when all errors have been fixed. |
| let FullInstRWOverlapCheck = 1; |
| } |
| |
| let SchedModel = MipsGenericModel in { |
| |
| // ALU Pipeline |
| // ============ |
| |
| def GenericALU : ProcResource<1> { let BufferSize = 1; } |
| def GenericIssueALU : ProcResource<1> { let Super = GenericALU; } |
| |
| def GenericWriteALU : SchedWriteRes<[GenericIssueALU]>; |
| |
| // add, addi, addiu, addu, and, andi, clo, clz, ext, ins, lui, nor, or, ori, |
| // rotr, rotrv, seb, seh, sll, sllv, slt, slti, sltiu, sltu, sra, srav, srl, |
| // srlv, ssnop, sub, subu, wsbh, xor, xori |
| def : InstRW<[GenericWriteALU], (instrs ADD, ADDi, ADDiu, ADDu, AND, ANDi, |
| CLO, CLZ, EXT, INS, LEA_ADDiu, LUi, NOP, |
| NOR, OR, ORi, ROTR, ROTRV, SEB, SEH, SLL, |
| SLLV, SLT, SLTi, SLTiu, SLTu, SRA, SRAV, SRL, |
| SRLV, SSNOP, SUB, SUBu, WSBH, XOR, XORi)>; |
| |
| def : InstRW<[GenericWriteALU], (instrs COPY)>; |
| |
| // MIPSR6 |
| // ====== |
| |
| // addiupc, align, aluipc, aui, auipc, bitswap, clo, clz, lsa, seleqz, selnez |
| def : InstRW<[GenericWriteALU], (instrs ADDIUPC, ALIGN, ALUIPC, AUI, |
| AUIPC, BITSWAP, CLO_R6, CLZ_R6, LSA_R6, |
| SELEQZ, SELNEZ)>; |
| |
| // MIPS16e |
| // ======= |
| |
| def : InstRW<[GenericWriteALU], (instrs AddiuRxImmX16, AddiuRxRxImm16, |
| AddiuRxRxImmX16, AddiuRxRyOffMemX16, |
| AddiuRxPcImmX16, AddiuSpImm16, AddiuSpImmX16, |
| AdduRxRyRz16, AndRxRxRy16, CmpRxRy16, |
| CmpiRxImm16, CmpiRxImmX16, LiRxImm16, |
| LiRxImmX16, LiRxImmAlignX16, Move32R16, |
| MoveR3216, Mfhi16, Mflo16, NegRxRy16, |
| NotRxRy16, OrRxRxRy16, SebRx16, SehRx16, |
| SllX16, SllvRxRy16, SltiRxImm16, |
| SltiRxImmX16, SltiCCRxImmX16, |
| SltiuRxImm16, SltiuRxImmX16, SltiuCCRxImmX16, |
| SltRxRy16, SltCCRxRy16, SltuRxRy16, |
| SltuRxRyRz16, SltuCCRxRy16, SravRxRy16, |
| SraX16, SrlvRxRy16, SrlX16, SubuRxRyRz16, |
| XorRxRxRy16)>; |
| |
| def : InstRW<[GenericWriteALU], (instrs Constant32, LwConstant32, |
| GotPrologue16, CONSTPOOL_ENTRY)>; |
| |
| // microMIPS |
| // ========= |
| |
| def : InstRW<[GenericWriteALU], (instrs ADDIUPC_MM, ADDIUR1SP_MM, ADDIUR2_MM, |
| ADDIUS5_MM, ADDIUSP_MM, ADDU16_MM, ADD_MM, |
| ADDi_MM, ADDiu_MM, ADDu_MM, AND16_MM, |
| ANDI16_MM, AND_MM, ANDi_MM, CLO_MM, CLZ_MM, |
| EXT_MM, INS_MM, LEA_ADDiu_MM, LI16_MM, |
| LUi_MM, MOVE16_MM, MOVEP_MM, NOR_MM, |
| NOT16_MM, OR16_MM, OR_MM, ORi_MM, ROTRV_MM, |
| ROTR_MM, SEB_MM, SEH_MM, SLL16_MM, SLLV_MM, |
| SLL_MM, SLT_MM, SLTi_MM, SLTiu_MM, SLTu_MM, |
| SRAV_MM, SRA_MM, SRL16_MM, SRLV_MM, SRL_MM, |
| SSNOP_MM, SUBU16_MM, SUB_MM, SUBu_MM, |
| WSBH_MM, XOR16_MM, XOR_MM, XORi_MM)>; |
| |
| // microMIPS32r6 |
| // ============= |
| |
| def : InstRW<[GenericWriteALU], (instrs ADDIUPC_MMR6, ADDIU_MMR6, ADDU16_MMR6, |
| ADDU_MMR6, ADD_MMR6, ALIGN_MMR6, ALUIPC_MMR6, |
| AND16_MMR6, ANDI16_MMR6, ANDI_MMR6, AND_MMR6, |
| AUIPC_MMR6, AUI_MMR6, BITSWAP_MMR6, CLO_MMR6, |
| CLZ_MMR6, EXT_MMR6, INS_MMR6, LI16_MMR6, |
| LSA_MMR6, LUI_MMR6, MOVE16_MMR6, NOR_MMR6, |
| NOT16_MMR6, OR16_MMR6, ORI_MMR6, OR_MMR6, |
| SELEQZ_MMR6, SELNEZ_MMR6, SLL16_MMR6, |
| SLL_MMR6, SRL16_MMR6, SSNOP_MMR6, SUBU16_MMR6, |
| SUBU_MMR6, SUB_MMR6, WSBH_MMR6, XOR16_MMR6, |
| XORI_MMR6, XOR_MMR6)>; |
| |
| // MIPS64 |
| // ====== |
| |
| def : InstRW<[GenericWriteALU], (instrs AND64, ANDi64, DEXT64_32, DSLL64_32, |
| ORi64, SEB64, SEH64, SLL64_32, SLL64_64, |
| SLT64, SLTi64, SLTiu64, SLTu64, XOR64, |
| XORi64)>; |
| |
| def : InstRW<[GenericWriteALU], (instrs DADD, DADDi, DADDiu, DADDu, DCLO, |
| DCLZ, DEXT, DEXTM, DEXTU, DINS, DINSM, DINSU, |
| DROTR, DROTR32, DROTRV, DSBH, DSHD, DSLL, |
| DSLL32, DSLLV, DSRA, DSRA32, DSRAV, DSRL, |
| DSRL32, DSRLV, DSUB, DSUBu, LEA_ADDiu64, |
| LUi64, NOR64, OR64)>; |
| |
| // MIPS64R6 |
| // ======== |
| |
| def : InstRW<[GenericWriteALU], (instrs DALIGN, DAHI, DATI, DAUI, DCLO_R6, |
| DCLZ_R6, DBITSWAP, DLSA, DLSA_R6, SELEQZ64, |
| SELNEZ64)>; |
| |
| |
| def GenericMDU : ProcResource<1> { let BufferSize = 1; } |
| def GenericIssueMDU : ProcResource<1> { let Super = GenericALU; } |
| def GenericIssueDIV : ProcResource<1> { let Super = GenericMDU; } |
| def GenericWriteHILO : SchedWriteRes<[GenericIssueMDU]>; |
| def GenericWriteALULong : SchedWriteRes<[GenericIssueALU]> { let Latency = 5; } |
| def GenericWriteMove : SchedWriteRes<[GenericIssueALU]> { let Latency = 2; } |
| def GenericWriteMul : SchedWriteRes<[GenericIssueMDU]> { let Latency = 4; } |
| |
| def : InstRW<[GenericWriteHILO], (instrs MADD, MADDU, MSUB, MSUBU)>; |
| |
| def : InstRW<[GenericWriteHILO], (instrs PseudoMADD_MM, PseudoMADDU_MM, |
| PseudoMSUB_MM, PseudoMSUBU_MM, |
| PseudoMULT_MM, PseudoMULTu_MM)>; |
| |
| def : InstRW<[GenericWriteHILO], (instrs PseudoMADD, PseudoMADDU, PseudoMSUB, |
| PseudoMSUBU, PseudoMULT, PseudoMULTu)>; |
| |
| def GenericWriteMDUtoGPR : SchedWriteRes<[GenericIssueMDU]> { |
| let Latency = 5; |
| } |
| |
| def GenericWriteDIV : SchedWriteRes<[GenericIssueDIV]> { |
| // Estimated worst case |
| let Latency = 33; |
| let ResourceCycles = [33]; |
| } |
| def GenericWriteDIVU : SchedWriteRes<[GenericIssueDIV]> { |
| // Estimated worst case |
| let Latency = 31; |
| let ResourceCycles = [31]; |
| } |
| |
| // mul |
| def : InstRW<[GenericWriteMDUtoGPR], (instrs MUL)>; |
| |
| // mult, multu |
| def : InstRW<[GenericWriteMul], (instrs MULT, MULTu)>; |
| |
| // div, sdiv |
| def : InstRW<[GenericWriteDIV], (instrs PseudoSDIV, SDIV)>; |
| |
| def : InstRW<[GenericWriteDIVU], (instrs PseudoUDIV, UDIV)>; |
| |
| // mfhi, mflo, movn, mthi, mtlo, rdwhr |
| def : InstRW<[GenericWriteALULong], (instrs MFHI, MFLO, PseudoMFHI, |
| PseudoMFLO)>; |
| |
| def : InstRW<[GenericWriteALULong], (instrs PseudoMFHI_MM, PseudoMFLO_MM)>; |
| |
| def : InstRW<[GenericWriteMove], (instrs MTHI, MTLO, RDHWR, PseudoMTLOHI)>; |
| def : InstRW<[GenericWriteMove], (instrs PseudoMTLOHI_MM)>; |
| |
| def : InstRW<[GenericWriteALU], (instrs MOVN_I_I, MOVZ_I_I)>; |
| |
| // MIPSR6 |
| // ====== |
| |
| // muh, muhu, mulu, mul |
| def : InstRW<[GenericWriteMul], (instrs MUH, MUHU, MULU, MUL_R6)>; |
| |
| // divu, udiv |
| def : InstRW<[GenericWriteDIV], (instrs MOD, MODU, DIV, DIVU)>; |
| |
| |
| // MIPS16e |
| // ======= |
| |
| def : InstRW<[GenericWriteHILO], (instrs MultRxRy16, MultuRxRy16, |
| MultRxRyRz16, MultuRxRyRz16)>; |
| |
| def : InstRW<[GenericWriteDIV], (instrs DivRxRy16)>; |
| |
| def : InstRW<[GenericWriteDIVU], (instrs DivuRxRy16)>; |
| |
| // microMIPS |
| // ========= |
| |
| def : InstRW<[GenericWriteMul], (instrs MULT_MM, MULTu_MM, MADD_MM, MADDU_MM, |
| MSUB_MM, MSUBU_MM)>; |
| |
| def : InstRW<[GenericWriteALULong], (instrs MUL_MM)>; |
| |
| def : InstRW<[GenericWriteDIV], (instrs SDIV_MM, SDIV_MM_Pseudo)>; |
| |
| def : InstRW<[GenericWriteDIVU], (instrs UDIV_MM, UDIV_MM_Pseudo)>; |
| |
| def : InstRW<[GenericWriteMove], (instrs MFHI16_MM, MFLO16_MM, MOVF_I_MM, |
| MOVT_I_MM, MFHI_MM, MFLO_MM, MTHI_MM, |
| MTLO_MM)>; |
| |
| def : InstRW<[GenericWriteMove], (instrs RDHWR_MM)>; |
| |
| // microMIPS32r6 |
| // ============= |
| |
| def : InstRW<[GenericWriteMul], (instrs MUHU_MMR6, MUH_MMR6, MULU_MMR6, |
| MUL_MMR6)>; |
| |
| def : InstRW<[GenericWriteDIV], (instrs MODU_MMR6, MOD_MMR6, DIVU_MMR6, |
| DIV_MMR6)>; |
| |
| def : InstRW<[GenericWriteMove], (instrs RDHWR_MMR6)>; |
| |
| // MIPS64 |
| // ====== |
| |
| def : InstRW<[GenericWriteHILO], (instrs DMULU, DMULT, DMULTu, PseudoDMULT, |
| PseudoDMULTu)>; |
| |
| def : InstRW<[GenericWriteDIV], (instrs DSDIV, PseudoDSDIV)>; |
| |
| def : InstRW<[GenericWriteDIVU], (instrs DUDIV, PseudoDUDIV)>; |
| |
| def : InstRW<[GenericWriteALULong], (instrs MFHI64, MFLO64, PseudoMFHI64, |
| PseudoMFLO64, PseudoMTLOHI64)>; |
| |
| def : InstRW<[GenericWriteMove], (instrs MTHI64, MTLO64, RDHWR64)>; |
| |
| // mov[zn] |
| def : InstRW<[GenericWriteALU], (instrs MOVN_I_I64, MOVN_I64_I, MOVN_I64_I64, |
| MOVZ_I_I64, MOVZ_I64_I, MOVZ_I64_I64)>; |
| |
| |
| // MIPS64R6 |
| // ======== |
| |
| def : InstRW<[GenericWriteMDUtoGPR], (instrs DMUH, DMUHU, DMUL_R6)>; |
| |
| def : InstRW<[GenericWriteDIV], (instrs DDIV, DMOD)>; |
| |
| def : InstRW<[GenericWriteDIVU], (instrs DDIVU, DMODU)>; |
| |
| // CTISTD Pipeline |
| // --------------- |
| |
| def GenericIssueCTISTD : ProcResource<1> { let Super = GenericALU; } |
| |
| def GenericLDST : ProcResource<1> { let BufferSize = 1; } |
| def GenericIssueLDST : ProcResource<1> { let Super = GenericLDST; } |
| |
| def GenericWriteJump : SchedWriteRes<[GenericIssueCTISTD]>; |
| def GenericWriteJumpAndLink : SchedWriteRes<[GenericIssueCTISTD]> { |
| let Latency = 2; |
| } |
| |
| // b, beq, beql, bg[et]z, bl[et]z, bne, bnel, j, syscall, jal, bltzal, jalx, |
| // jalr, jr.hb, jr, jalr.hb, jarlc, jialc |
| def : InstRW<[GenericWriteJump], (instrs B, BAL, BAL_BR, BEQ, BNE, BGTZ, BGEZ, |
| BLEZ, BLTZ, BLTZAL, J, JALX, JR, JR_HB, ERET, |
| ERet, ERETNC, DERET)>; |
| |
| def : InstRW<[GenericWriteJump], (instrs BEQL, BNEL, BGEZL, BGTZL, BLEZL, |
| BLTZL)>; |
| |
| def : InstRW<[GenericWriteJump], (instrs TAILCALL, TAILCALLREG, |
| TAILCALLREGHB, PseudoIndirectBranch, |
| PseudoIndirectHazardBranch, PseudoReturn, |
| RetRA)>; |
| |
| def : InstRW<[GenericWriteJumpAndLink], (instrs BGEZAL, JAL, JALR, JALR_HB, |
| JALRHBPseudo, JALRPseudo)>; |
| |
| def : InstRW<[GenericWriteJumpAndLink], (instrs BGEZALL, BLTZALL)>; |
| |
| def GenericWriteTrap : SchedWriteRes<[GenericIssueCTISTD]>; |
| |
| def : InstRW<[GenericWriteTrap], (instrs BREAK, SYSCALL, TEQ, TEQI, |
| TGE, TGEI, TGEIU, TGEU, TNE, |
| TNEI, TLT, TLTI, TLTU, TTLTIU, |
| TRAP, SDBBP)>; |
| |
| // MIPSR6 |
| // ====== |
| |
| def : InstRW<[GenericWriteJumpAndLink], (instrs BALC, BEQZALC, BGEZALC, |
| BGTZALC, BLEZALC, BLTZALC, |
| BNEZALC, |
| JIALC)>; |
| |
| def : InstRW<[GenericWriteJump], (instrs BC, BC2EQZ, BC2NEZ, BEQC, BEQZC, BGEC, |
| BGEUC, BGEZC, BGTZC, BLEZC, BLTC, BLTUC, |
| BLTZC, BNEC, BNEZC, BNVC, BOVC, JIC, JR_HB_R6, |
| SIGRIE, PseudoIndirectBranchR6, |
| PseudoIndrectHazardBranchR6)>; |
| |
| def : InstRW<[GenericWriteJump], (instrs TAILCALLR6REG, TAILCALLHBR6REG)>; |
| |
| def : InstRW<[GenericWriteTrap], (instrs SDBBP_R6)>; |
| |
| // MIPS16e |
| // ======= |
| |
| def : InstRW<[GenericWriteJump], (instrs Bimm16, BimmX16, BeqzRxImm16, |
| BeqzRxImmX16, BnezRxImm16, BnezRxImmX16, |
| Bteqz16, BteqzX16, BteqzT8CmpX16, |
| BteqzT8CmpiX16, BteqzT8SltX16, |
| BteqzT8SltuX16, BteqzT8SltiX16, |
| BteqzT8SltiuX16, Btnez16, BtnezX16, |
| BtnezT8CmpX16, BtnezT8CmpiX16, |
| BtnezT8SltX16, BtnezT8SltuX16, |
| BtnezT8SltiX16, BtnezT8SltiuX16, JrRa16, |
| JrcRa16, JrcRx16, RetRA16)>; |
| |
| def : InstRW<[GenericWriteJumpAndLink], (instrs Jal16, JalB16, JumpLinkReg16)>; |
| |
| def : InstRW<[GenericWriteTrap], (instrs Break16)>; |
| |
| def : InstRW<[GenericWriteALULong], (instrs SelBeqZ, SelTBteqZCmp, |
| SelTBteqZCmpi, SelTBteqZSlt, |
| SelTBteqZSlti, SelTBteqZSltu, |
| SelTBteqZSltiu, SelBneZ, SelTBtneZCmp, |
| SelTBtneZCmpi, SelTBtneZSlt, |
| SelTBtneZSlti, SelTBtneZSltu, |
| SelTBtneZSltiu)>; |
| |
| // microMIPS |
| // ========= |
| |
| def : InstRW<[GenericWriteJump], (instrs B16_MM, BAL_BR_MM, BC1F_MM, BC1T_MM, |
| BEQZ16_MM, BEQZC_MM, BEQ_MM, BGEZ_MM, |
| BGTZ_MM, BLEZ_MM, BLTZ_MM, BNEZ16_MM, |
| BNEZC_MM, BNE_MM, B_MM, DERET_MM, ERET_MM, |
| JR16_MM, JR_MM, J_MM, B_MM_Pseudo)>; |
| |
| def : InstRW<[GenericWriteJumpAndLink], (instrs BGEZALS_MM, BGEZAL_MM, |
| BLTZALS_MM, BLTZAL_MM, JALR16_MM, |
| JALRS16_MM, JALRS_MM, JALR_MM, |
| JALS_MM, JALX_MM, JAL_MM)>; |
| |
| def : InstRW<[GenericWriteJump], (instrs TAILCALLREG_MM, TAILCALL_MM, |
| PseudoIndirectBranch_MM)>; |
| |
| def : InstRW<[GenericWriteTrap], (instrs BREAK16_MM, BREAK_MM, SDBBP16_MM, |
| SDBBP_MM, SYSCALL_MM, TEQI_MM, TEQ_MM, |
| TGEIU_MM, TGEI_MM, TGEU_MM, TGE_MM, TLTIU_MM, |
| TLTI_MM, TLTU_MM, TLT_MM, TNEI_MM, TNE_MM, |
| TRAP_MM)>; |
| |
| // microMIPS32r6 |
| // ============= |
| |
| def : InstRW<[GenericWriteJump], (instrs BC16_MMR6, BC1EQZC_MMR6, BC1NEZC_MMR6, |
| BC2EQZC_MMR6, BC2NEZC_MMR6, BC_MMR6, |
| BEQC_MMR6, BEQZC16_MMR6, BEQZC_MMR6, |
| BGEC_MMR6, BGEUC_MMR6, BGEZC_MMR6, |
| BGTZC_MMR6, BLEZC_MMR6, BLTC_MMR6, |
| BLTUC_MMR6, BLTZC_MMR6, BNEC_MMR6, |
| BNEZC16_MMR6, BNEZC_MMR6, BNVC_MMR6, |
| BOVC_MMR6, DERET_MMR6, ERETNC_MMR6, JAL_MMR6, |
| ERET_MMR6, JIC_MMR6, JRADDIUSP, JRC16_MM, |
| JRC16_MMR6, JRCADDIUSP_MMR6, SIGRIE_MMR6, |
| B_MMR6_Pseudo, PseudoIndirectBranch_MMR6)>; |
| |
| def : InstRW<[GenericWriteJumpAndLink], (instrs BALC_MMR6, BEQZALC_MMR6, |
| BGEZALC_MMR6, BGTZALC_MMR6, |
| BLEZALC_MMR6, BLTZALC_MMR6, |
| BNEZALC_MMR6, JALRC16_MMR6, |
| JALRC_HB_MMR6, JALRC_MMR6, |
| JIALC_MMR6)>; |
| |
| def : InstRW<[GenericWriteJump], (instrs TAILCALLREG_MMR6, TAILCALL_MMR6)>; |
| |
| def : InstRW<[GenericWriteTrap], (instrs BREAK16_MMR6, BREAK_MMR6, SDBBP_MMR6, |
| SDBBP16_MMR6)>; |
| |
| // MIPS64 |
| // ====== |
| |
| def : InstRW<[GenericWriteJump], (instrs BEQ64, BGEZ64, BGTZ64, BLEZ64, |
| BLTZ64, BNE64, JR64)>; |
| |
| def : InstRW<[GenericWriteJumpAndLink], (instrs JALR64, JALR64Pseudo, |
| JALRHB64Pseudo, JALR_HB64)>; |
| |
| def : InstRW<[GenericWriteJump], (instrs JR_HB64, TAILCALLREG64, |
| TAILCALLREGHB64, PseudoReturn64)>; |
| |
| // MIPS64R6 |
| // ======== |
| |
| def : InstRW<[GenericWriteJump], (instrs BEQC64, BEQZC64, BGEC64, BGEUC64, |
| BGEZC64, BGTZC64, BLEZC64, BLTC64, BLTUC64, |
| BLTZC64, BNEC64, BNEZC64, JIC64, |
| PseudoIndirectBranch64, |
| PseudoIndirectHazardBranch64)>; |
| |
| def : InstRW<[GenericWriteJumpAndLink], (instrs JIALC64)>; |
| |
| def : InstRW<[GenericWriteJump], (instrs JR_HB64_R6, TAILCALL64R6REG, |
| TAILCALLHB64R6REG, PseudoIndirectBranch64R6, |
| PseudoIndrectHazardBranch64R6)>; |
| |
| // COP0 Pipeline |
| // ============= |
| |
| def GenericCOP0 : ProcResource<1> { let BufferSize = 1; } |
| |
| def GenericIssueCOP0 : ProcResource<1> { let Super = GenericCOP0; } |
| def GenericWriteCOP0TLB : SchedWriteRes<[GenericIssueCOP0]> { let Latency = 4; } |
| def GenericWriteCOP0 : SchedWriteRes<[GenericIssueCOP0]> { let Latency = 3; } |
| def GenericReadCOP0 : SchedWriteRes<[GenericIssueCOP0]> { let Latency = 2; } |
| def GenericReadWritePGPR : SchedWriteRes<[GenericIssueCOP0]>; |
| def GenericReadWriteCOP0Long : SchedWriteRes<[GenericIssueCOP0]> { |
| let Latency = 5; |
| } |
| def GenericWriteCOP0Short : SchedWriteRes<[GenericIssueCOP0]>; |
| |
| def : InstRW<[GenericWriteCOP0TLB], (instrs TLBP, TLBR, TLBWI, TLBWR)>; |
| def : InstRW<[GenericWriteCOP0TLB], (instrs TLBINV, TLBINVF)>; |
| |
| def : InstRW<[GenericReadCOP0], (instrs MFC0)>; |
| def : InstRW<[GenericWriteCOP0], (instrs MTC0)>; |
| |
| def : InstRW<[GenericWriteCOP0], (instrs EVP, DVP)>; |
| |
| def : InstRW<[GenericWriteCOP0], (instrs DI, EI)>; |
| |
| def : InstRW<[GenericWriteCOP0], (instrs EHB, PAUSE, WAIT)>; |
| |
| // microMIPS |
| // ========= |
| |
| def : InstRW<[GenericWriteCOP0TLB], (instrs TLBP_MM, TLBR_MM, TLBWI_MM, |
| TLBWR_MM)>; |
| |
| def : InstRW<[GenericWriteCOP0], (instrs DI_MM, EI_MM)>; |
| |
| def : InstRW<[GenericWriteCOP0], (instrs EHB_MM, PAUSE_MM, WAIT_MM)>; |
| |
| |
| // microMIPS32R6 |
| // ============= |
| |
| def : InstRW<[GenericWriteCOP0], (instrs RDPGPR_MMR6, WRPGPR_MMR6)>; |
| |
| def : InstRW<[GenericWriteCOP0TLB], (instrs TLBINV_MMR6, TLBINVF_MMR6)>; |
| |
| def : InstRW<[GenericReadCOP0], (instrs MFHC0_MMR6, MFC0_MMR6, MFHC2_MMR6, |
| MFC2_MMR6)>; |
| |
| def : InstRW<[GenericWriteCOP0], (instrs MTHC0_MMR6, MTC0_MMR6, MTHC2_MMR6, |
| MTC2_MMR6)>; |
| |
| def : InstRW<[GenericWriteCOP0], (instrs EVP_MMR6, DVP_MMR6)>; |
| |
| def : InstRW<[GenericWriteCOP0], (instrs DI_MMR6, EI_MMR6)>; |
| |
| def : InstRW<[GenericWriteCOP0], (instrs EHB_MMR6, PAUSE_MMR6, WAIT_MMR6)>; |
| |
| // MIPS64 |
| // ====== |
| |
| def : InstRW<[GenericReadCOP0], (instrs DMFC0)>; |
| |
| def : InstRW<[GenericWriteCOP0], (instrs DMTC0)>; |
| |
| |
| def GenericCOP2 : ProcResource<1> { let BufferSize = 1; } |
| def GenericWriteCOPOther : SchedWriteRes<[GenericCOP2]>; |
| |
| def : InstRW<[GenericWriteCOPOther], (instrs MFC2, MTC2)>; |
| |
| def : InstRW<[GenericWriteCOPOther], (instrs DMFC2, DMTC2)>; |
| |
| // microMIPS32R6 |
| // ============= |
| |
| // The latency and repeat rate of these instructions are implementation |
| // dependant. |
| def : InstRW<[GenericWriteMove], (instrs CFC2_MM, CTC2_MM)>; |
| |
| |
| // MIPS MT ASE - hasMT |
| // ==================== |
| |
| def : InstRW<[GenericWriteMove], (instrs DMT, DVPE, EMT, EVPE, MFTR, |
| MTTR)>; |
| |
| def : InstRW<[GenericReadWriteCOP0Long], (instrs YIELD)>; |
| |
| def : InstRW<[GenericWriteCOP0Short], (instrs FORK)>; |
| |
| // MIPS Virtualization ASE |
| // ======================= |
| |
| def : InstRW<[GenericWriteCOP0Short], (instrs HYPCALL, TLBGINV, TLBGINVF, TLBGP, |
| TLBGR, TLBGWI, TLBGWR, MFGC0, MFHGC0, |
| MTGC0, MTHGC0)>; |
| |
| // MIPS64 Virtualization ASE |
| // ========================= |
| |
| def : InstRW<[GenericWriteCOP0Short], (instrs DMFGC0, DMTGC0)>; |
| |
| // microMIPS virtualization ASE |
| // ============================ |
| |
| def : InstRW<[GenericWriteCOP0Short], (instrs HYPCALL_MM, TLBGINVF_MM, |
| TLBGINV_MM, TLBGP_MM, TLBGR_MM, |
| TLBGWI_MM, TLBGWR_MM, MFGC0_MM, |
| MFHGC0_MM, MTGC0_MM, MTHGC0_MM)>; |
| |
| // LDST Pipeline |
| // ------------- |
| |
| def GenericWriteLoad : SchedWriteRes<[GenericIssueLDST]> { |
| let Latency = 2; |
| } |
| |
| def GenericWritePref : SchedWriteRes<[GenericIssueLDST]>; |
| def GenericWriteSync : SchedWriteRes<[GenericIssueLDST]>; |
| def GenericWriteCache : SchedWriteRes<[GenericIssueLDST]> { let Latency = 5; } |
| |
| def GenericWriteStore : SchedWriteRes<[GenericIssueLDST]>; |
| def GenericWriteStoreSC : SchedWriteRes<[GenericIssueLDST]> { let Latency = 2; } |
| |
| def GenericWriteGPRFromBypass : SchedWriteRes<[GenericIssueLDST]> { |
| let Latency = 2; |
| } |
| |
| def GenericWriteStoreFromOtherUnits : SchedWriteRes<[GenericIssueLDST]>; |
| def GenericWriteLoadToOtherUnits : SchedWriteRes<[GenericIssueLDST]> { |
| let Latency = 0; |
| } |
| |
| // l[bhw], l[bh]u, ll |
| def : InstRW<[GenericWriteLoad], (instrs LB, LBu, LH, LHu, LW, LL, |
| LWC2, LWC3, LDC2, LDC3)>; |
| |
| // lw[lr] |
| def : InstRW<[GenericWriteLoad], (instrs LWL, LWR)>; |
| |
| // s[bhw], sc, s[dw]c[23] |
| def : InstRW<[GenericWriteStore], (instrs SB, SH, SW, SWC2, SWC3, |
| SDC2, SDC3)>; |
| |
| // PreMIPSR6 sw[lr] |
| def : InstRW<[GenericWriteStore], (instrs SWL, SWR)>; |
| |
| def : InstRW<[GenericWriteStoreSC], (instrs SC, SC_MMR6)>; |
| |
| // pref |
| def : InstRW<[GenericWritePref], (instrs PREF)>; |
| // cache |
| def : InstRW<[GenericWriteCache], (instrs CACHE)>; |
| |
| // sync |
| def : InstRW<[GenericWriteSync], (instrs SYNC, SYNCI)>; |
| |
| // MIPSR6 |
| // ====== |
| |
| def : InstRW<[GenericWriteLoad], (instrs LDC2_R6, LL_R6, LWC2_R6, LWPC)>; |
| |
| def : InstRW<[GenericWriteStore], (instrs SWC2_R6, SDC2_R6)>; |
| |
| def : InstRW<[GenericWriteStoreSC], (instrs SC_R6)>; |
| |
| def : InstRW<[GenericWritePref], (instrs PREF_R6)>; |
| |
| def : InstRW<[GenericWriteCache], (instrs CACHE_R6)>; |
| |
| def : InstRW<[GenericWriteSync], (instrs GINVI, GINVT)>; |
| |
| // MIPS32 EVA |
| // ========== |
| |
| def : InstRW<[GenericWriteLoad], (instrs LBE, LBuE, LHE, LHuE, LWE, |
| LLE)>; |
| |
| def : InstRW<[GenericWriteStore], (instrs SBE, SHE, SWE, SCE)>; |
| |
| def : InstRW<[GenericWriteLoad], (instrs LWLE, LWRE)>; |
| |
| def : InstRW<[GenericWriteStore], (instrs SWLE, SWRE)>; |
| |
| def : InstRW<[GenericWritePref], (instrs PREFE)>; |
| |
| def : InstRW<[GenericWriteCache], (instrs CACHEE)>; |
| |
| // microMIPS EVA ASE - InMicroMipsMode, hasEVA |
| // =========================================== |
| |
| def : InstRW<[GenericWriteLoad], (instrs LBE_MM, LBuE_MM, LHE_MM, LHuE_MM, |
| LWE_MM, LWLE_MM, LWRE_MM, LLE_MM)>; |
| |
| def : InstRW<[GenericWriteStore], (instrs SBE_MM, SB_MM, SHE_MM, SWE_MM, |
| SWLE_MM, SWRE_MM, SCE_MM)>; |
| |
| def : InstRW<[GenericWritePref], (instrs PREFE_MM)>; |
| def : InstRW<[GenericWriteCache], (instrs CACHEE_MM)>; |
| |
| |
| // MIPS16e |
| // ======= |
| |
| def : InstRW<[GenericWriteLoad], (instrs Restore16, RestoreX16, |
| LbRxRyOffMemX16, |
| LbuRxRyOffMemX16, LhRxRyOffMemX16, |
| LhuRxRyOffMemX16, LwRxRyOffMemX16, |
| LwRxSpImmX16, LwRxPcTcp16, LwRxPcTcpX16)>; |
| |
| def : InstRW<[GenericWriteStore], (instrs Save16, SaveX16, SbRxRyOffMemX16, |
| ShRxRyOffMemX16, SwRxRyOffMemX16, |
| SwRxSpImmX16)>; |
| |
| // microMIPS |
| // ========= |
| |
| def : InstRW<[GenericWriteLoad], (instrs LBU16_MM, LB_MM, LBu_MM, LHU16_MM, |
| LH_MM, LHu_MM, LL_MM, LW16_MM, LWGP_MM, |
| LWL_MM, LWM16_MM, LWM32_MM, LWP_MM, LWR_MM, |
| LWSP_MM, LWU_MM, LWXS_MM, LW_MM)>; |
| |
| def : InstRW<[GenericWriteStore], (instrs SB16_MM, SC_MM, SH16_MM, SH_MM, |
| SW16_MM, SWL_MM, SWM16_MM, SWM32_MM, SWM_MM, |
| SWP_MM, SWR_MM, SWSP_MM, SW_MM)>; |
| |
| |
| def : InstRW<[GenericWritePref], (instrs PREF_MM, PREFX_MM)>; |
| |
| def : InstRW<[GenericWriteCache], (instrs CACHE_MM)>; |
| |
| def : InstRW<[GenericWriteSync], (instrs SYNC_MM, SYNCI_MM)>; |
| def : InstRW<[GenericWriteSync], (instrs GINVI_MMR6, GINVT_MMR6)>; |
| |
| // microMIPS32r6 |
| // ============= |
| |
| def : InstRW<[GenericWriteLoad], (instrs LBU_MMR6, LB_MMR6, LDC2_MMR6, LL_MMR6, |
| LWM16_MMR6, LWC2_MMR6, LWPC_MMR6, LW_MMR6)>; |
| |
| def : InstRW<[GenericWriteStore], (instrs SB16_MMR6, SB_MMR6, SDC2_MMR6, |
| SH16_MMR6, SH_MMR6, SW16_MMR6, SWC2_MMR6, |
| SWM16_MMR6, SWSP_MMR6, SW_MMR6)>; |
| |
| def : InstRW<[GenericWriteSync], (instrs SYNC_MMR6, SYNCI_MMR6)>; |
| |
| def : InstRW<[GenericWritePref], (instrs PREF_MMR6)>; |
| |
| def : InstRW<[GenericWriteCache], (instrs CACHE_MMR6)>; |
| |
| // MIPS64 |
| // ====== |
| |
| def : InstRW<[GenericWriteLoad], (instrs LD, LL64, LLD, LWu, LB64, LBu64, |
| LH64, LHu64, LW64)>; |
| |
| // l[dw][lr] |
| def : InstRW<[GenericWriteLoad], (instrs LWL64, LWR64, LDL, LDR)>; |
| |
| def : InstRW<[GenericWriteStore], (instrs SD, SC64, SCD, SB64, SH64, SW64, |
| SWL64, SWR64)>; |
| |
| def : InstRW<[GenericWriteStore], (instrs SDL, SDR)>; |
| |
| // MIPS64R6 |
| // ======== |
| |
| def : InstRW<[GenericWriteLoad], (instrs LWUPC, LDPC)>; |
| |
| def : InstRW<[GenericWriteLoad], (instrs LLD_R6, LL64_R6)>; |
| |
| def : InstRW<[GenericWriteStoreSC], (instrs SC64_R6, SCD_R6)>; |
| |
| // MIPSR6 CRC ASE - hasCRC |
| // ======================= |
| |
| def : InstRW<[GenericWriteALU], (instrs CRC32B, CRC32H, CRC32W, CRC32CB, |
| CRC32CH, CRC32CW)>; |
| |
| // MIPS64R6 CRC ASE - hasCRC |
| // ------------------------- |
| |
| def : InstRW<[GenericWriteALU], (instrs CRC32D, CRC32CD)>; |
| |
| |
| // Cavium Networks MIPS (cnMIPS) - Octeon, HasCnMips |
| // ================================================= |
| |
| def : InstRW<[GenericWriteALU], (instrs BADDu, BBIT0, BBIT032, BBIT1, BBIT132, |
| CINS, CINS32, CINS64_32, CINS_i32, |
| DMFC2_OCTEON, DMTC2_OCTEON, DPOP, EXTS, |
| EXTS32, MTM0, MTM1, MTM2, MTP0, MTP1, MTP2, |
| POP, SEQ, SEQi, SNE, SNEi, |
| V3MULU, VMM0, VMULU)>; |
| |
| def : InstRW<[GenericWriteMDUtoGPR], (instrs DMUL)>; |
| |
| // Cavium Networks MIPS (cnMIPSP) - Octeon+, HasCnMipsP |
| // ================================================= |
| |
| def : InstRW<[GenericWriteALU], (instrs SAA, SAAD)>; |
| |
| // FPU Pipelines |
| // ============= |
| |
| def GenericFPQ : ProcResource<1> { let BufferSize = 1; } |
| def GenericIssueFPUS : ProcResource<1> { let Super = GenericFPQ; } |
| def GenericIssueFPUL : ProcResource<1> { let Super = GenericFPQ; } |
| def GenericIssueFPULoad : ProcResource<1> { let Super = GenericFPQ; } |
| def GenericIssueFPUStore : ProcResource<1> { let Super = GenericFPQ; } |
| def GenericIssueFPUMove : ProcResource<1> { let Super = GenericFPQ; } |
| def GenericFPUDivSqrt : ProcResource<1> { let Super = GenericFPQ; } |
| |
| // The floating point compare of the 24k series including interAptiv has a |
| // listed latency of 1-2. Using the higher latency here. |
| |
| def GenericWriteFPUCmp : SchedWriteRes<[GenericIssueFPUS]> { let Latency = 2; } |
| def GenericWriteFPUS : SchedWriteRes<[GenericIssueFPUS]> { let Latency = 4; } |
| def GenericWriteFPUL : SchedWriteRes<[GenericIssueFPUL]> { let Latency = 5; } |
| def GenericWriteFPUStore : SchedWriteRes<[GenericIssueFPUStore]> { let |
| Latency = 1; |
| } |
| def GenericWriteFPULoad : SchedWriteRes<[GenericIssueFPULoad]> { |
| let Latency = 2; |
| } |
| def GenericWriteFPUMoveFP : SchedWriteRes<[GenericIssueFPUMove]> { |
| let Latency = 4; |
| } |
| def GenericWriteFPUMoveGPRFPU : SchedWriteRes<[GenericIssueFPUMove]> { |
| let Latency = 2; |
| } |
| def GenericWriteFPUDivS : SchedWriteRes<[GenericFPUDivSqrt]> { |
| let Latency = 17; |
| let ResourceCycles = [ 14 ]; |
| } |
| def GenericWriteFPUDivD : SchedWriteRes<[GenericFPUDivSqrt]> { |
| let Latency = 32; |
| let ResourceCycles = [ 29 ]; |
| } |
| def GenericWriteFPURcpS : SchedWriteRes<[GenericFPUDivSqrt]> { |
| let Latency = 13; |
| let ResourceCycles = [ 10 ]; |
| } |
| def GenericWriteFPURcpD : SchedWriteRes<[GenericFPUDivSqrt]> { |
| let Latency = 25; |
| let ResourceCycles = [ 21 ]; |
| } |
| def GenericWriteFPURsqrtS : SchedWriteRes<[GenericFPUDivSqrt]> { |
| let Latency = 17; |
| let ResourceCycles = [ 14 ]; |
| } |
| def GenericWriteFPURsqrtD : SchedWriteRes<[GenericFPUDivSqrt]> { |
| let Latency = 32; |
| let ResourceCycles = [ 29 ]; |
| } |
| def GenericWriteFPUSqrtS : SchedWriteRes<[GenericFPUDivSqrt]> { |
| let Latency = 17; |
| let ResourceCycles = [ 14 ]; |
| } |
| def GenericWriteFPUSqrtD : SchedWriteRes<[GenericFPUDivSqrt]> { |
| let Latency = 29; |
| let ResourceCycles = [ 29 ]; |
| } |
| |
| // Floating point compare and branch |
| // --------------------------------- |
| // |
| // c.<cc>.[ds], bc1[tf], bc1[tf]l |
| def : InstRW<[GenericWriteFPUCmp], (instrs FCMP_D32, FCMP_D64, FCMP_S32, BC1F, |
| BC1T, BC1FL, BC1TL)>; |
| |
| def : InstRW<[GenericWriteFPUCmp], (instregex "C_[A-Z]+_(S|D32|D64)$")>; |
| |
| // Short Pipe |
| // ---------- |
| // |
| // abs.[ds], abs.ps, add.[ds], neg.[ds], neg.ps, madd.s, msub.s, nmadd,s |
| // nmsub.s, sub.[ds], mul.s |
| |
| def : InstRW<[GenericWriteFPUS], (instrs FABS_S, FABS_D32, FABS_D64, FADD_D32, |
| FADD_D64, FADD_S, MADD_S, MSUB_S, FMUL_S, |
| FNEG_S, FNEG_D32, FNEG_D64, NMADD_S, NMSUB_S, |
| FSUB_S, FSUB_D32, FSUB_D64)>; |
| |
| // Long Pipe |
| // ---------- |
| // |
| // nmadd.d, nmsub.d, mul.[ds], mul.ps, ceil.[wl].[sd], cvt.d.[sw], cvt.s.[dw], |
| // cvt.w.[sd], cvt.[sw].ps, trunc.w.[ds], trunc.w.ps, floor.[ds], |
| // round.[lw].[ds], floor.[lw].ds |
| |
| // madd.d, msub.dm mul.d, mul.ps, nmadd.d, nmsub.d, ceil.[wl].[sd], cvt.d.[sw], |
| // cvt.s.[dw], cvt.w.[sd], cvt.[sw].ps, round.[lw].[ds], floor.[lw].ds, |
| // trunc.w.[ds], trunc.w.ps, |
| def : InstRW<[GenericWriteFPUL], (instrs ADDR_PS64, |
| CEIL_L_D64, CEIL_L_S, CEIL_W_D32, |
| CEIL_W_D64, CEIL_W_S, CVT_D32_S, CVT_D32_W, |
| CVT_D64_L, CVT_D64_S, CVT_D64_W, CVT_L_D64, |
| CVT_L_S, CVT_S_D32, CVT_S_D64, CVT_S_L, |
| CVT_S_W, CVT_W_D32, CVT_W_D64, CVT_W_S, |
| CVT_PS_S64, CVT_S_PL64, CVT_S_PU64, |
| CVT_PS_PW64, CVT_PW_PS64, FADD_PS64, |
| FLOOR_L_D64, FLOOR_L_S, FLOOR_W_D32, |
| FLOOR_W_D64, FLOOR_W_S, FMUL_D32, FMUL_D64, |
| FMUL_PS64, FSUB_PS64, MADD_D32, MADD_D64, |
| MSUB_D32, MSUB_D64, MULR_PS64, |
| NMADD_D32, NMADD_D64, NMSUB_D32, NMSUB_D64, |
| PLL_PS64, PLU_PS64, PUL_PS64, PUU_PS64, |
| ROUND_L_D64, ROUND_L_S, ROUND_W_D32, |
| ROUND_W_D64, ROUND_W_S, TRUNC_L_D64, |
| TRUNC_L_S, TRUNC_W_D32, TRUNC_W_D64, |
| TRUNC_W_S, PseudoTRUNC_W_D, |
| PseudoTRUNC_W_D32, PseudoTRUNC_W_S)>; |
| |
| // Pseudo convert instruction |
| def : InstRW<[GenericWriteFPUL], (instrs PseudoCVT_D32_W, PseudoCVT_D64_L, |
| PseudoCVT_D64_W, PseudoCVT_S_L, |
| PseudoCVT_S_W)>; |
| |
| // div.[ds], div.ps |
| def : InstRW<[GenericWriteFPUDivS], (instrs FDIV_S)>; |
| def : InstRW<[GenericWriteFPUDivD], (instrs FDIV_D32, FDIV_D64)>; |
| |
| // sqrt.[ds], sqrt.ps |
| def : InstRW<[GenericWriteFPUSqrtS], (instrs FSQRT_S)>; |
| def : InstRW<[GenericWriteFPUSqrtD], (instrs FSQRT_D32, FSQRT_D64)>; |
| |
| // rsqrt.[ds], recip.[ds] |
| def : InstRW<[GenericWriteFPURcpS], (instrs RECIP_S, RSQRT_S)>; |
| def : InstRW<[GenericWriteFPURcpD], (instrs RECIP_D32, RECIP_D64, |
| RSQRT_D32, RSQRT_D64)>; |
| |
| |
| // Load Pipe |
| // --------- |
| |
| // ctc1, mtc1, mthc1, cfc1, mfc1, mfhc1 |
| def : InstRW<[GenericWriteFPUMoveGPRFPU], (instrs BuildPairF64, |
| BuildPairF64_64, ExtractElementF64, |
| ExtractElementF64_64, CFC1, CTC1, |
| MFC1, MFC1_D64, MFHC1_D32, |
| MFHC1_D64, MTC1, MTC1_D64, |
| MTHC1_D32, MTHC1_D64)>; |
| |
| // swc1, swxc1 |
| def : InstRW<[GenericWriteFPUStore], (instrs SDC1, SDC164, SDXC1, SDXC164, |
| SUXC1, SUXC164, SWC1, SWXC1)>; |
| |
| def : InstRW<[GenericWriteFPUMoveFP], (instrs FMOV_D32, FMOV_D64, FMOV_S)>; |
| |
| |
| // movn.[ds], movz.[ds] |
| def : InstRW<[GenericWriteFPUMoveFP], (instrs MOVF_I, MOVF_D32, MOVF_D64, |
| MOVF_S, MOVT_I, MOVT_D32, MOVT_D64, |
| MOVT_S, MOVN_I_D32, MOVN_I_D64, |
| MOVN_I_S, MOVZ_I_D32, MOVZ_I_D64, |
| MOVZ_I_S)>; |
| |
| def : InstRW<[GenericWriteFPUMoveFP], (instrs MOVT_I64, MOVF_I64, MOVZ_I64_S, |
| MOVN_I64_D64, MOVN_I64_S, |
| MOVZ_I64_D64)>; |
| |
| // l[dw]x?c1 |
| def : InstRW<[GenericWriteFPULoad], (instrs LDC1, LDC164, LDXC1, LDXC164, |
| LUXC1, LUXC164, LWC1, LWXC1)>; |
| |
| // MIPSR6 |
| // ====== |
| |
| // sel(eq|ne).[ds], max.[ds], maxa.[ds], min.[ds], mina.[ds], class.[ds] |
| def : InstRW<[GenericWriteFPUS], (instrs SELEQZ_S, SELNEZ_S, SELEQZ_D, SELNEZ_D, |
| MAX_S, MAX_D, MAXA_S, MAXA_D, MIN_S, MIN_D, |
| MINA_S, MINA_D, CLASS_S, CLASS_D)>; |
| |
| def : InstRW<[GenericWriteFPUL], (instrs RINT_S, RINT_D)>; |
| |
| def : InstRW<[GenericWriteFPUCmp], (instrs BC1EQZ, BC1NEZ, SEL_D, SEL_S)>; |
| |
| def : InstRW<[GenericWriteFPUS], (instrs MADDF_S, MSUBF_S, MADDF_D, MSUBF_D)>; |
| |
| |
| // microMIPS |
| // ========= |
| |
| def : InstRW<[GenericWriteFPUMoveFP], (instrs MOVF_D32_MM, MOVF_S_MM, |
| MOVN_I_D32_MM, MOVN_I_S_MM, |
| MOVT_D32_MM, MOVT_S_MM, MOVZ_I_D32_MM, |
| MOVZ_I_S_MM)>; |
| |
| |
| // cvt.?.?, ceil.?, floor.?, round.?, trunc.? (n)madd.? (n)msub.? |
| def : InstRW<[GenericWriteFPUL], (instrs CVT_D32_S_MM, CVT_D32_W_MM, |
| CVT_D64_S_MM, CVT_D64_W_MM, CVT_L_D64_MM, |
| CVT_L_S_MM, CVT_S_D32_MM, CVT_S_D64_MM, |
| CVT_S_W_MM, CVT_W_D32_MM, CVT_W_D64_MM, |
| CVT_W_S_MM, CEIL_W_MM, CEIL_W_S_MM, |
| FLOOR_W_MM, FLOOR_W_S_MM, NMADD_S_MM, |
| NMADD_D32_MM, NMSUB_S_MM, NMSUB_D32_MM, |
| MADD_S_MM, MADD_D32_MM, ROUND_W_MM, |
| ROUND_W_S_MM, TRUNC_W_MM, TRUNC_W_S_MM)>; |
| |
| def : InstRW<[GenericWriteFPUCmp], (instregex "^C_[A-Z]_(S|D32|D64)_MM$")>; |
| def : InstRW<[GenericWriteFPUCmp], (instregex "^C_[A-Z][A-Z]_(S|D32|D64)_MM$")>; |
| def : InstRW<[GenericWriteFPUCmp], (instregex "^C_[A-Z][A-Z][A-Z]_(S|D32|D64)_MM$")>; |
| def : InstRW<[GenericWriteFPUCmp], (instregex "^C_NGLE_(S|D32|D64)_MM$")>; |
| def : InstRW<[GenericWriteFPUCmp], (instrs FCMP_S32_MM, FCMP_D32_MM)>; |
| |
| def : InstRW<[GenericWriteFPUS], (instrs MFC1_MM, MFHC1_D32_MM, MFHC1_D64_MM, |
| MTC1_MM, MTC1_D64_MM, |
| MTHC1_D32_MM, MTHC1_D64_MM)>; |
| |
| def : InstRW<[GenericWriteFPUS], (instrs FABS_D32_MM, FABS_D64_MM, FABS_S_MM, |
| FNEG_D32_MM, FNEG_D64_MM, FNEG_S_MM, |
| FADD_D32_MM, FADD_D64_MM, FADD_S_MM, |
| FMOV_D32_MM, FMOV_D64_MM, FMOV_S_MM, |
| FMUL_D32_MM, FMUL_D64_MM, FMUL_S_MM, |
| FSUB_D32_MM, FSUB_D64_MM, FSUB_S_MM, |
| MSUB_S_MM, MSUB_D32_MM)>; |
| |
| def : InstRW<[GenericWriteFPUDivS], (instrs FDIV_S_MM)>; |
| def : InstRW<[GenericWriteFPUDivD], (instrs FDIV_D32_MM, FDIV_D64_MM)>; |
| |
| def : InstRW<[GenericWriteFPUSqrtS], (instrs FSQRT_S_MM)>; |
| def : InstRW<[GenericWriteFPUSqrtD], (instrs FSQRT_D32_MM, FSQRT_D64_MM)>; |
| |
| def : InstRW<[GenericWriteFPURcpS], (instrs RECIP_S_MM, RSQRT_S_MM)>; |
| def : InstRW<[GenericWriteFPURcpD], (instrs RECIP_D32_MM, RECIP_D64_MM, |
| RSQRT_D32_MM, RSQRT_D64_MM)>; |
| |
| def : InstRW<[GenericWriteFPUStore], (instrs SDC1_MM, SWC1_MM, SUXC1_MM, |
| SWXC1_MM)>; |
| |
| def : InstRW<[GenericWriteFPUMoveGPRFPU], (instrs CFC1_MM, CTC1_MM)>; |
| |
| def : InstRW<[GenericWriteFPULoad], (instrs LDC1_MM, LUXC1_MM, LWC1_MM, |
| LWXC1_MM)>; |
| |
| // microMIPS32r6 |
| // ============= |
| |
| def : InstRW<[GenericWriteFPUS], (instrs FNEG_S_MMR6)>; |
| |
| def : InstRW<[GenericWriteFPUCmp], (instregex "CMP_[A-Z][A-Z]_(S|D)_MMR6")>; |
| def : InstRW<[GenericWriteFPUCmp], |
| (instregex "CMP_[A-Z][A-Z][A-Z]_(S|D)_MMR6")>; |
| def : InstRW<[GenericWriteFPUCmp], |
| (instregex "CMP_[A-Z][A-Z][A-Z][A-Z]_(S|D)_MMR6")>; |
| |
| def : InstRW<[GenericWriteFPUL], |
| (instregex "CVT_(L|D|S|W)_(L|D|S|L|W)_MMR6")>; |
| |
| def : InstRW<[GenericWriteFPUL], |
| (instregex "TRUNC_(L|W)_(D|S)_MMR6")>; |
| |
| def : InstRW<[GenericWriteFPUL], |
| (instregex "ROUND_(L|W)_(D|S)_MMR6")>; |
| |
| def : InstRW<[GenericWriteFPUL], |
| (instregex "FLOOR_(L|W)_(D|S)_MMR6")>; |
| |
| def : InstRW<[GenericWriteFPUL], |
| (instregex "CEIL_(L|W)_(S|D)_MMR6")>; |
| |
| def : InstRW<[GenericWriteFPUS], |
| (instrs MFC1_MMR6, MTC1_MMR6, CLASS_S_MMR6, CLASS_D_MMR6, |
| FADD_S_MMR6)>; |
| |
| def : InstRW<[GenericWriteFPUS], (instregex "M(IN|AX)_(S|D)_MMR6")>; |
| |
| def : InstRW<[GenericWriteFPUS], (instregex "M(IN|AX)A_(S|D)_MMR6")>; |
| |
| def : InstRW<[GenericWriteFPUS], (instregex "SEL(EQ|NE)Z_(S|D)_MMR6")>; |
| |
| def : InstRW<[GenericWriteFPUS], (instregex "SEL_(S|D)_MMR6")>; |
| |
| def : InstRW<[GenericWriteFPUL], (instrs RINT_S_MMR6, RINT_D_MMR6)>; |
| |
| def : InstRW<[GenericWriteFPUS], (instregex "M(ADD|SUB)F_(S|D)_MMR6")>; |
| |
| def : InstRW<[GenericWriteFPUS], (instrs FMOV_S_MMR6, FMUL_S_MMR6, |
| FSUB_S_MMR6, FMOV_D_MMR6)>; |
| |
| def : InstRW<[GenericWriteFPUL], (instrs FDIV_S_MMR6)>; |
| |
| def : InstRW<[GenericWriteFPUStore], (instrs SDC1_D64_MMR6)>; |
| |
| def : InstRW<[GenericWriteFPULoad], (instrs LDC1_D64_MMR6)>; |
| |
| // MIPS64 |
| // ====== |
| |
| def : InstRW<[GenericWriteFPUMoveGPRFPU], (instrs DMFC1, DMTC1)>; |
| |
| // MIPS DSP ASE, HasDSP |
| // ==================== |
| |
| def : InstRW<[GenericWriteStore], (instrs SWDSP)>; |
| |
| def : InstRW<[GenericWriteLoad], (instrs LWDSP)>; |
| |
| def : InstRW<[GenericWriteMove], (instrs PseudoMTLOHI_DSP)>; |
| |
| def GenericDSP : ProcResource<1> { let BufferSize = 1; } |
| def GenericDSPShort : SchedWriteRes<[GenericDSP]> { let Latency = 2; } |
| def GenericDSPLong : SchedWriteRes<[GenericDSP]> { let Latency = 6; } |
| def GenericDSPBypass : SchedWriteRes<[GenericDSP]> { let Latency = 1; } |
| def GenericDSPMTHILO : SchedWriteRes<[GenericDSP]> { let Latency = 5; } |
| def GenericDSPLoad : SchedWriteRes<[GenericDSP]> { let Latency = 4; } |
| def GenericDSPMTHLIP : SchedWriteRes<[GenericDSP]> { let Latency = 5; } |
| |
| def : InstRW<[GenericDSPLong], (instregex "^EXTRV_RS_W$")>; |
| def : InstRW<[GenericDSPLong], (instregex "^EXTRV_R_W$")>; |
| def : InstRW<[GenericDSPLong], (instregex "^EXTRV_S_H$")>; |
| def : InstRW<[GenericDSPLong], (instregex "^EXTRV_W$")>; |
| def : InstRW<[GenericDSPLong], (instregex "^EXTR_RS_W$")>; |
| def : InstRW<[GenericDSPLong], (instregex "^EXTR_R_W$")>; |
| def : InstRW<[GenericDSPLong], (instregex "^EXTR_S_H$")>; |
| def : InstRW<[GenericDSPLong], (instregex "^EXTR_W$")>; |
| def : InstRW<[GenericDSPLong], (instregex "^INSV$")>; |
| |
| def : InstRW<[GenericDSPMTHLIP], (instregex "^MTHLIP$")>; |
| def : InstRW<[GenericDSPMTHILO], (instregex "^MTHI_DSP$")>; |
| def : InstRW<[GenericDSPMTHILO], (instregex "^MTLO_DSP$")>; |
| |
| def : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDQ_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDQ_S_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDQ_S_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDSC$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDU_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDU_S_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDWC$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^BITREV$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^BPOSGE32$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPGU_EQ_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPGU_LE_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPGU_LT_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPU_EQ_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPU_LE_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPU_LT_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMP_EQ_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMP_LE_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMP_LT_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPAQ_SA_L_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPAQ_S_W_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPAU_H_QBL$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPAU_H_QBR$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPSQ_SA_L_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPSQ_S_W_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPSU_H_QBL$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPSU_H_QBR$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^EXTPDPV$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^EXTPDP$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^EXTPV$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^EXTP$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^LBUX$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^LHX$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^LWX$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MADDU_DSP$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MADD_DSP$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MAQ_SA_W_PHL$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MAQ_SA_W_PHR$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MAQ_S_W_PHL$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MAQ_S_W_PHR$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MFHI_DSP$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MFLO_DSP$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MODSUB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MSUBU_DSP$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MSUB_DSP$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULEQ_S_W_PHL$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULEQ_S_W_PHR$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULEU_S_PH_QBL$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULEU_S_PH_QBR$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULQ_RS_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULSAQ_S_W_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULTU_DSP$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULT_DSP$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PACKRL_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PICK_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PICK_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBLA$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBL$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBRA$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBR$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEQ_W_PHL$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEQ_W_PHR$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBLA$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBL$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBRA$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBR$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECRQU_S_QB_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECRQ_PH_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECRQ_QB_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECRQ_RS_PH_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^RADDU_W_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^RDDSP$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^REPLV_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^REPLV_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^REPL_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^REPL_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHILOV$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHILO$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHLLV_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHLLV_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHLLV_S_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHLLV_S_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHLL_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHLL_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHLL_S_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHLL_S_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRAV_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRA_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRA_R_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRA_R_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRLV_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRL_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBQ_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBQ_S_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBQ_S_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBU_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBU_S_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^WRDSP$")>; |
| |
| def : InstRW<[GenericDSPShort], |
| (instregex "^Pseudo(CMP|CMPU)_(EQ|LE|LT)_(PH|QB)$")>; |
| def : InstRW<[GenericDSPShort], |
| (instregex "^PseudoPICK_(PH|QB)$")>; |
| |
| // MIPS DSP R2 - hasDSP, HasDSPR2, InMicroMips |
| // =========================================== |
| |
| def : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDQH_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDQH_R_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDQH_R_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDQH_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDUH_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDUH_R_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDU_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDU_S_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^APPEND$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^BALIGN$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPGDU_EQ_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPGDU_LE_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPGDU_LT_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPA_W_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPAQX_SA_W_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPAQX_S_W_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPAX_W_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPS_W_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPSQX_S_W_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPSQX_SA_W_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPSX_W_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MUL_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MUL_S_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULQ_RS_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULQ_S_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULQ_S_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULSA_W_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECR_QB_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECR_SRA_PH_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECR_SRA_R_PH_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PREPEND$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRA_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRA_R_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRAV_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRL_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRLV_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBQH_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBQH_R_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBQH_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBQH_R_W$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBU_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBU_S_PH$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBUH_QB$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBUH_R_QB$")>; |
| |
| // microMIPS DSP R1 - HasDSP, InMicroMips |
| // ====================================== |
| |
| def : InstRW<[GenericWriteLoad], (instrs LWDSP_MM)>; |
| |
| def : InstRW<[GenericWriteStore], (instrs SWDSP_MM)>; |
| |
| def : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDQ_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDQ_S_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDQ_S_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDSC_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDU_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDU_S_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDWC_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^BITREV_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^BPOSGE32_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPGU_EQ_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPGU_LE_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPGU_LT_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPU_EQ_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPU_LE_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPU_LT_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMP_EQ_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMP_LE_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMP_LT_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPAQ_SA_L_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPAQ_S_W_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPAU_H_QBL_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPAU_H_QBR_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPSQ_SA_L_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPSQ_S_W_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPSU_H_QBL_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPSU_H_QBR_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^EXTPDPV_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^EXTPDP_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^EXTPV_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^EXTP_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^EXTRV_RS_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^EXTRV_R_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^EXTRV_S_H_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^EXTRV_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^EXTR_RS_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^EXTR_R_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^EXTR_S_H_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^EXTR_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^INSV_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^LBUX_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^LHX_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^LWX_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MADDU_DSP_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MADD_DSP_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MAQ_SA_W_PHL_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MAQ_SA_W_PHR_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MAQ_S_W_PHL_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MAQ_S_W_PHR_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MFHI_DSP_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MFLO_DSP_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MODSUB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MOVEP_MMR6$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MOVN_I_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MOVZ_I_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MSUBU_DSP_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MSUB_DSP_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MTHI_DSP_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MTHLIP_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MTLO_DSP_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULEQ_S_W_PHL_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULEQ_S_W_PHR_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULEU_S_PH_QBL_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULEU_S_PH_QBR_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULQ_RS_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULSAQ_S_W_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULTU_DSP_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULT_DSP_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PACKRL_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PICK_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PICK_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBLA_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBL_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBRA_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBR_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEQ_W_PHL_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEQ_W_PHR_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBLA_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBL_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBRA_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBR_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECRQU_S_QB_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECRQ_PH_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECRQ_QB_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECRQ_RS_PH_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^RADDU_W_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^RDDSP_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^REPLV_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^REPLV_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^REPL_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^REPL_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHILOV_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHILO_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHLLV_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHLLV_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHLLV_S_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHLLV_S_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHLL_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHLL_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHLL_S_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHLL_S_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRAV_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRA_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRA_R_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRA_R_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRLV_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRL_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBQ_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBQ_S_PH_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBQ_S_W_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBU_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBU_S_QB_MM$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^WRDSP_MM$")>; |
| |
| |
| // microMIPS DSP R2 - hasDSP, HasDSPR2, InMicroMips |
| // ================================================ |
| |
| def : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_QB_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDQH_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDQH_R_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDQH_R_W_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDQH_W_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDUH_QB_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDUH_R_QB_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDU_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^ADDU_S_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^APPEND_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^BALIGN_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPGDU_EQ_QB_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPGDU_LE_QB_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^CMPGDU_LT_QB_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPA_W_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPAQX_SA_W_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPAQX_S_W_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPAX_W_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPS_W_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPSQX_S_W_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPSQX_SA_W_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^DPSX_W_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MUL_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MUL_S_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULQ_RS_W_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULQ_S_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULQ_S_W_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^MULSA_W_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECR_QB_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECR_SRA_PH_W_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PRECR_SRA_R_PH_W_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^PREPEND_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRA_QB_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRA_R_QB_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRAV_QB_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_QB_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRL_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SHRLV_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBQH_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBQH_R_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBQH_W_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBQH_R_W_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBU_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBU_S_PH_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBUH_QB_MMR2$")>; |
| def : InstRW<[GenericDSPShort], (instregex "^SUBUH_R_QB_MMR2$")>; |
| |
| // microMIPS DSP R3 - hasDSP, hasDSPR2, hasDSPR3, InMicroMips |
| // ========================================================== |
| |
| def : InstRW<[GenericDSPShort], (instregex "^BPOSGE32C_MMR3$")>; |
| |
| // MIPS MSA ASE - hasMSA |
| // ===================== |
| |
| def GenericWriteMSAShortLogic : SchedWriteRes<[GenericIssueFPUS]>; |
| def GenericWriteMSAShortInt : SchedWriteRes<[GenericIssueFPUS]> { |
| let Latency = 2; |
| } |
| def GenericWriteMoveOtherUnitsToFPU : SchedWriteRes<[GenericIssueFPUS]>; |
| def GenericWriteMSAOther3 : SchedWriteRes<[GenericIssueFPUS]> { |
| let Latency = 3; |
| } |
| def GenericWriteMSALongInt : SchedWriteRes<[GenericIssueFPUS]> { |
| let Latency = 5; |
| } |
| def GenericWriteFPUDivI : SchedWriteRes<[GenericFPQ]> { |
| let Latency = 33; |
| let ResourceCycles = [ 33 ]; |
| } |
| |
| // FPUS is also used in moves from floating point and MSA registers to general |
| // purpose registers. |
| def GenericWriteMoveFPUSToOtherUnits : SchedWriteRes<[GenericIssueFPUS]> { |
| let Latency = 0; |
| } |
| |
| // FPUL is also used in moves from floating point and MSA registers to general |
| // purpose registers. |
| def GenericWriteMoveFPULToOtherUnits : SchedWriteRes<[GenericIssueFPUL]>; |
| |
| |
| // adds_a.[bhwd], adds_[asu].[bhwd], addvi?.[bhwd], asub_[us].[bhwd], |
| // aver?_[us].[bhwd] |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^ADD_A_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^ADDS_[ASU]_[BHWD]$")>; |
| |
| // TODO: ADDVI_[BHW] might be 1 cycle latency rather than 2. Need to confirm it. |
| // add.[bhwd], addvi.[bhwd], asub_[us].[bhwd], ave.[bhwd], aver.[bhwd] |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^ADDVI?_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^ASUB_[US].[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^AVER?_[US].[BHWD]$")>; |
| |
| // and.v, andi.b, move.v, ldi.[bhwd], xor.v, nor.v, xori.b, nori.b, lsa |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^MOVE_V$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^LDI_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instrs LSA)>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^(AND|OR|[XN]OR)_V$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^(AND|OR|[XN]OR)I_B$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], |
| (instregex "^(AND|OR|[XN]OR)_V_[DHW]_PSEUDO$")>; |
| |
| // vshf.[bhwd], binsl.[bhwd], binsr.[bhwd], insert.[bhwd], sld?.[bhwd], |
| // bset.[bhwd], bclr.[bhwd], bneg.[bhwd], bsel_v, bseli_b |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^VSHF_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^(BINSL|BINSLI)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^(BINSR|BINSRI)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^INSERT_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^(SLD|SLDI)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^(BSET|BSETI)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^(BCLR|BCLRI)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^(BNEG|BNEGI)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^(BSEL_V|BSELI_B)$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^BMN*Z.*$")>; |
| def : InstRW<[GenericWriteMSAShortInt], |
| (instregex "^BSEL_(H|W|D|FW|FD)_PSEUDO$")>; |
| |
| // pcnt.[bhwd], sat_s.[bhwd], sat_u.[bhwd] |
| def : InstRW<[GenericWriteMSAOther3], (instregex "^PCNT_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAOther3], (instregex "^SAT_(S|U)_[BHWD]$")>; |
| |
| // bnz.[bhwdv], cfcmsa, ctcmsa |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^(BNZ|BZ)_[BHWDV]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^C(F|T)CMSA$")>; |
| |
| // shf.[bhw], fill[bhwd], splat?.[bhwd] |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^SHF_[BHW]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^FILL_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^(SPLAT|SPLATI)_[BHWD]$")>; |
| |
| // fexp2_w, fexp2_d |
| def : InstRW<[GenericWriteFPUS], (instregex "^FEXP2_(W|D)$")>; |
| |
| // compare, converts, round to int, floating point truncate. |
| def : InstRW<[GenericWriteFPUS], (instregex "^(CLT|CLTI)_(S|U)_[BHWD]$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^(CLE|CLEI)_(S|U)_[BHWD]$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^(CEQ|CEQI)_[BHWD]$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^CMP_UN_(S|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^CMP_UEQ_(S|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^CMP_EQ_(S|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^CMP_LT_(S|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^CMP_ULT_(S|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^CMP_LE_(S|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^CMP_ULE_(S|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^CMP_F_(D|S)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^CMP_SAF_(D|S)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^CMP_SEQ_(D|S)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^CMP_SLE_(D|S)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^CMP_SLT_(D|S)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^CMP_SUEQ_(D|S)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^CMP_SULE_(D|S)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^CMP_SULT_(D|S)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^CMP_SUN_(D|S)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FS(AF|EQ|LT|LE|NE|OR)_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FSUEQ_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FSULE_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FSULT_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FSUNE_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FSUN_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FCAF_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FCEQ_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FCLE_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FCLT_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FCNE_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FCOR_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FCUEQ_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FCULE_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FCULT_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FCUNE_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FCUN_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FABS_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FFINT_(U|S)_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FFQL_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FFQR_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FTINT_(U|S)_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FRINT_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FTQ_(H|W)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FTRUNC_(U|S)_(W|D)$")>; |
| |
| // fexdo.[hw], fexupl.[wd], fexupr.[wd] |
| def : InstRW<[GenericWriteFPUS], (instregex "^FEXDO_(H|W)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FEXUPL_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FEXUPR_(W|D)$")>; |
| |
| // fclass.[wd], fmax.[wd], fmax_a.[wd], fmin.[wd], fmin_a.[wd], flog2.[wd] |
| def : InstRW<[GenericWriteFPUS], (instregex "^FCLASS_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FMAX_A_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FMAX_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FMIN_A_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FMIN_(W|D)$")>; |
| def : InstRW<[GenericWriteFPUS], (instregex "^FLOG2_(W|D)$")>; |
| |
| // interleave right/left, interleave even/odd, insert |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^(ILVR|ILVL)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^(ILVEV|ILVOD)_[BHWD]$")>; |
| |
| // subs_?.[bhwd], subsus_?.[bhwd], subsuu_?.[bhwd], subvi.[bhwd], subv.[bhwd], |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^SUBS_(S|U)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^SUBSUS_(S|U)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^SUBSUU_(S|U)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^SUBVI_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortInt], (instregex "^SUBV_[BHWD]$")>; |
| |
| // mod_[su].[bhwd], div_[su].[bhwd] |
| def : InstRW<[GenericWriteFPUDivI], (instregex "^MOD_(S|U)_[BHWD]$")>; |
| def : InstRW<[GenericWriteFPUDivI], (instregex "^DIV_(S|U)_[BHWD]$")>; |
| |
| // hadd_[su].[bhwd], hsub_[su].[bhwd], max_[sua].[bhwd], min_[sua].[bhwd], |
| // maxi_[su].[bhwd], mini_[su].[bhwd], sra?.[bhwd], srar?.[bhwd], srlr.[bhwd], |
| // sll?.[bhwd], pckev.[bhwd], pckod.[bhwd], nloc.[bhwd], nlzc.[bhwd], |
| // insve.[bhwd] |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^HADD_(S|U)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^HSUB_(S|U)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^(MAX|MIN)_S_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^(MAX|MIN)_U_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^(MAX|MIN)_A_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], |
| (instregex "^(MAXI|MINI)_(S|U)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^(SRA|SRAI)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^(SRL|SRLI)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^(SRAR|SRARI)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^(SRLR|SRLRI)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^(SLL|SLLI)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^(PCKEV|PCKOD)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^(NLOC|NLZC)_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^INSVE_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^INSERT_F(D|W)_PSEUDO$")>; |
| def : InstRW<[GenericWriteMSAShortLogic], (instregex "^FILL_F(D|W)_PSEUDO$")>; |
| |
| // dpadd_?.[bhwd], dpsub_?.[bhwd], dotp_?.[bhwd], msubv.[bhwd], maddv.[bhwd] |
| // mulv.[bhwd]. |
| def : InstRW<[GenericWriteMSALongInt], (instregex "^DPADD_(S|U)_[HWD]$")>; |
| def : InstRW<[GenericWriteMSALongInt], (instregex "^DPSUB_(S|U)_[HWD]$")>; |
| def : InstRW<[GenericWriteMSALongInt], (instregex "^DOTP_(S|U)_[HWD]$")>; |
| def : InstRW<[GenericWriteMSALongInt], (instregex "^MSUBV_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSALongInt], (instregex "^MADDV_[BHWD]$")>; |
| def : InstRW<[GenericWriteMSALongInt], (instregex "^MULV_[BHWD]$")>; |
| |
| // madd?.q.[hw], msub?.q.[hw], mul?.q.[hw] |
| def : InstRW<[GenericWriteMSALongInt], (instregex "^MADDR_Q_[HW]$")>; |
| def : InstRW<[GenericWriteMSALongInt], (instregex "^MADD_Q_[HW]$")>; |
| def : InstRW<[GenericWriteMSALongInt], (instregex "^MSUBR_Q_[HW]$")>; |
| def : InstRW<[GenericWriteMSALongInt], (instregex "^MSUB_Q_[HW]$")>; |
| def : InstRW<[GenericWriteMSALongInt], (instregex "^MULR_Q_[HW]$")>; |
| def : InstRW<[GenericWriteMSALongInt], (instregex "^MUL_Q_[HW]$")>; |
| |
| // fadd.[dw], fmadd.[dw], fmul.[dw], frcp.[dw], frsqrt.[dw], fsqrt.[dw] |
| // fsub.[dw], fdiv.[dw] |
| def : InstRW<[GenericWriteFPUL], (instregex "^FADD_[DW]$")>; |
| def : InstRW<[GenericWriteFPUL], (instregex "^FMADD_[DW]$")>; |
| def : InstRW<[GenericWriteFPUL], (instregex "^FMSUB_[DW]$")>; |
| def : InstRW<[GenericWriteFPUL], (instregex "^FMUL_[DW]$")>; |
| def : InstRW<[GenericWriteFPUL], (instregex "^FRCP_[DW]$")>; |
| def : InstRW<[GenericWriteFPUL], (instregex "^FRSQRT_[DW]$")>; |
| def : InstRW<[GenericWriteFPUL], (instregex "^FSQRT_[DW]$")>; |
| def : InstRW<[GenericWriteFPUL], (instregex "^FSUB_[DW]$")>; |
| def : InstRW<[GenericWriteFPUL], (instregex "^FDIV_[DW]$")>; |
| |
| // copy.[su]_[bhwd] |
| def : InstRW<[GenericWriteFPUMoveGPRFPU], (instregex "^COPY_U_[BHW]$")>; |
| def : InstRW<[GenericWriteFPUMoveGPRFPU], (instregex "^COPY_S_[BHWD]$")>; |
| |
| def : InstRW<[GenericWriteFPUStore], (instregex "^ST_[BHWD]$")>; |
| def : InstRW<[GenericWriteFPUStore], (instrs ST_F16)>; |
| def : InstRW<[GenericWriteFPULoad], (instregex "^LD_[BHWD]$")>; |
| def : InstRW<[GenericWriteFPULoad], (instrs LD_F16)>; |
| |
| // Atomic instructions |
| |
| // FIXME: Define `WriteAtomic` in the MipsSchedule.td and |
| // attach it to the Atomic2OpsPostRA, AtomicCmpSwapPostRA, ... |
| // classes. Then just define resources for the `WriteAtomic` in each |
| // machine models. |
| def GenericAtomic : ProcResource<1> { let BufferSize = 1; } |
| def GenericWriteAtomic : SchedWriteRes<[GenericAtomic]> { let Latency = 2; } |
| |
| def : InstRW<[GenericWriteAtomic], |
| (instregex "^ATOMIC_SWAP_I(8|16|32|64)_POSTRA$")>; |
| def : InstRW<[GenericWriteAtomic], |
| (instregex "^ATOMIC_CMP_SWAP_I(8|16|32|64)_POSTRA$")>; |
| def : InstRW<[GenericWriteAtomic], |
| (instregex "^ATOMIC_LOAD_(ADD|SUB|AND|OR|XOR|NAND|MIN|MAX|UMIN|UMAX)" |
| "_I(8|16|32|64)_POSTRA$")>; |
| } |