xref: /netbsd-src/external/apache2/llvm/dist/llvm/lib/Target/Mips/MipsScheduleGeneric.td (revision 82d56013d7b633d116a93943de88e08335357a7c)
17330f729Sjoerg//=- MipsScheduleGeneric.td - Generic Scheduling Definitions -*- tablegen -*-=//
27330f729Sjoerg//
37330f729Sjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47330f729Sjoerg// See https://llvm.org/LICENSE.txt for license information.
57330f729Sjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67330f729Sjoerg//
77330f729Sjoerg//===----------------------------------------------------------------------===//
87330f729Sjoerg//
97330f729Sjoerg// This file describes the interAptiv processor in a manner of speaking. It
107330f729Sjoerg// describes a hypothetical version of the in-order MIPS32R2 interAptiv with all
117330f729Sjoerg// branches of the MIPS ISAs, ASEs and ISA variants. The itinerary lists are
127330f729Sjoerg// broken down into per ISA lists, so that this file can be used to rapidly
137330f729Sjoerg// develop new schedule models.
147330f729Sjoerg//
157330f729Sjoerg//===----------------------------------------------------------------------===//
167330f729Sjoergdef MipsGenericModel : SchedMachineModel {
177330f729Sjoerg  int IssueWidth = 1;
187330f729Sjoerg  int MicroOpBufferSize = 0;
197330f729Sjoerg
207330f729Sjoerg  // These figures assume an L1 hit.
217330f729Sjoerg  int LoadLatency = 2;
227330f729Sjoerg  int MispredictPenalty = 4;
237330f729Sjoerg
247330f729Sjoerg  int HighLatency = 37;
257330f729Sjoerg  list<Predicate> UnsupportedFeatures = [];
267330f729Sjoerg
277330f729Sjoerg  let CompleteModel = 1;
287330f729Sjoerg  let PostRAScheduler = 1;
297330f729Sjoerg
307330f729Sjoerg  // FIXME: Remove when all errors have been fixed.
317330f729Sjoerg  let FullInstRWOverlapCheck = 1;
327330f729Sjoerg}
337330f729Sjoerg
347330f729Sjoerglet SchedModel = MipsGenericModel in {
357330f729Sjoerg
367330f729Sjoerg// ALU Pipeline
377330f729Sjoerg// ============
387330f729Sjoerg
397330f729Sjoergdef GenericALU : ProcResource<1> { let BufferSize = 1; }
407330f729Sjoergdef GenericIssueALU : ProcResource<1> { let Super = GenericALU; }
417330f729Sjoerg
427330f729Sjoergdef GenericWriteALU : SchedWriteRes<[GenericIssueALU]>;
437330f729Sjoerg
447330f729Sjoerg// add, addi, addiu, addu, and, andi, clo, clz, ext, ins, lui, nor, or, ori,
457330f729Sjoerg// rotr, rotrv, seb, seh, sll, sllv, slt, slti, sltiu, sltu, sra, srav, srl,
467330f729Sjoerg// srlv, ssnop, sub, subu, wsbh, xor, xori
477330f729Sjoergdef : InstRW<[GenericWriteALU], (instrs ADD, ADDi, ADDiu, ADDu, AND, ANDi,
487330f729Sjoerg                                 CLO, CLZ, EXT, INS, LEA_ADDiu, LUi, NOP,
497330f729Sjoerg                                 NOR, OR, ORi, ROTR, ROTRV, SEB, SEH, SLL,
507330f729Sjoerg                                 SLLV, SLT, SLTi, SLTiu, SLTu, SRA, SRAV, SRL,
517330f729Sjoerg                                 SRLV, SSNOP, SUB, SUBu, WSBH, XOR, XORi)>;
527330f729Sjoerg
537330f729Sjoergdef : InstRW<[GenericWriteALU], (instrs COPY)>;
547330f729Sjoerg
557330f729Sjoerg// MIPSR6
567330f729Sjoerg// ======
577330f729Sjoerg
587330f729Sjoerg// addiupc, align, aluipc, aui, auipc, bitswap, clo, clz, lsa, seleqz, selnez
597330f729Sjoergdef : InstRW<[GenericWriteALU], (instrs ADDIUPC, ALIGN, ALUIPC, AUI,
607330f729Sjoerg                                 AUIPC, BITSWAP, CLO_R6, CLZ_R6, LSA_R6,
617330f729Sjoerg                                 SELEQZ, SELNEZ)>;
627330f729Sjoerg
637330f729Sjoerg// MIPS16e
647330f729Sjoerg// =======
657330f729Sjoerg
667330f729Sjoergdef : InstRW<[GenericWriteALU], (instrs AddiuRxImmX16, AddiuRxRxImm16,
677330f729Sjoerg                                 AddiuRxRxImmX16, AddiuRxRyOffMemX16,
687330f729Sjoerg                                 AddiuRxPcImmX16, AddiuSpImm16, AddiuSpImmX16,
697330f729Sjoerg                                 AdduRxRyRz16, AndRxRxRy16, CmpRxRy16,
707330f729Sjoerg                                 CmpiRxImm16, CmpiRxImmX16, LiRxImm16,
717330f729Sjoerg                                 LiRxImmX16, LiRxImmAlignX16, Move32R16,
727330f729Sjoerg                                 MoveR3216, Mfhi16, Mflo16, NegRxRy16,
737330f729Sjoerg                                 NotRxRy16, OrRxRxRy16, SebRx16, SehRx16,
747330f729Sjoerg                                 SllX16, SllvRxRy16, SltiRxImm16,
757330f729Sjoerg                                 SltiRxImmX16, SltiCCRxImmX16,
767330f729Sjoerg                                 SltiuRxImm16, SltiuRxImmX16, SltiuCCRxImmX16,
777330f729Sjoerg                                 SltRxRy16, SltCCRxRy16, SltuRxRy16,
787330f729Sjoerg                                 SltuRxRyRz16, SltuCCRxRy16, SravRxRy16,
797330f729Sjoerg                                 SraX16, SrlvRxRy16, SrlX16, SubuRxRyRz16,
807330f729Sjoerg                                 XorRxRxRy16)>;
817330f729Sjoerg
827330f729Sjoergdef : InstRW<[GenericWriteALU], (instrs Constant32, LwConstant32,
837330f729Sjoerg                                 GotPrologue16, CONSTPOOL_ENTRY)>;
847330f729Sjoerg
857330f729Sjoerg// microMIPS
867330f729Sjoerg// =========
877330f729Sjoerg
887330f729Sjoergdef : InstRW<[GenericWriteALU], (instrs ADDIUPC_MM, ADDIUR1SP_MM, ADDIUR2_MM,
897330f729Sjoerg                                 ADDIUS5_MM, ADDIUSP_MM, ADDU16_MM, ADD_MM,
907330f729Sjoerg                                 ADDi_MM, ADDiu_MM, ADDu_MM, AND16_MM,
917330f729Sjoerg                                 ANDI16_MM, AND_MM, ANDi_MM, CLO_MM, CLZ_MM,
927330f729Sjoerg                                 EXT_MM, INS_MM, LEA_ADDiu_MM, LI16_MM,
937330f729Sjoerg                                 LUi_MM, MOVE16_MM, MOVEP_MM, NOR_MM,
947330f729Sjoerg                                 NOT16_MM, OR16_MM, OR_MM, ORi_MM, ROTRV_MM,
957330f729Sjoerg                                 ROTR_MM, SEB_MM, SEH_MM, SLL16_MM, SLLV_MM,
967330f729Sjoerg                                 SLL_MM, SLT_MM, SLTi_MM, SLTiu_MM, SLTu_MM,
977330f729Sjoerg                                 SRAV_MM, SRA_MM, SRL16_MM, SRLV_MM, SRL_MM,
987330f729Sjoerg                                 SSNOP_MM, SUBU16_MM, SUB_MM, SUBu_MM,
997330f729Sjoerg                                 WSBH_MM, XOR16_MM, XOR_MM, XORi_MM)>;
1007330f729Sjoerg
1017330f729Sjoerg// microMIPS32r6
1027330f729Sjoerg// =============
1037330f729Sjoerg
1047330f729Sjoergdef : InstRW<[GenericWriteALU], (instrs ADDIUPC_MMR6, ADDIU_MMR6, ADDU16_MMR6,
1057330f729Sjoerg                                 ADDU_MMR6, ADD_MMR6, ALIGN_MMR6, ALUIPC_MMR6,
1067330f729Sjoerg                                 AND16_MMR6, ANDI16_MMR6, ANDI_MMR6, AND_MMR6,
1077330f729Sjoerg                                 AUIPC_MMR6, AUI_MMR6, BITSWAP_MMR6, CLO_MMR6,
1087330f729Sjoerg                                 CLZ_MMR6, EXT_MMR6, INS_MMR6, LI16_MMR6,
1097330f729Sjoerg                                 LSA_MMR6, LUI_MMR6, MOVE16_MMR6, NOR_MMR6,
1107330f729Sjoerg                                 NOT16_MMR6, OR16_MMR6, ORI_MMR6, OR_MMR6,
1117330f729Sjoerg                                 SELEQZ_MMR6, SELNEZ_MMR6, SLL16_MMR6,
1127330f729Sjoerg                                 SLL_MMR6, SRL16_MMR6, SSNOP_MMR6, SUBU16_MMR6,
1137330f729Sjoerg                                 SUBU_MMR6, SUB_MMR6, WSBH_MMR6, XOR16_MMR6,
1147330f729Sjoerg										             XORI_MMR6, XOR_MMR6)>;
1157330f729Sjoerg
1167330f729Sjoerg// MIPS64
1177330f729Sjoerg// ======
1187330f729Sjoerg
1197330f729Sjoergdef : InstRW<[GenericWriteALU], (instrs AND64, ANDi64, DEXT64_32, DSLL64_32,
1207330f729Sjoerg                                 ORi64, SEB64, SEH64, SLL64_32, SLL64_64,
1217330f729Sjoerg                                 SLT64, SLTi64, SLTiu64, SLTu64, XOR64,
1227330f729Sjoerg                                 XORi64)>;
1237330f729Sjoerg
1247330f729Sjoergdef : InstRW<[GenericWriteALU], (instrs DADD, DADDi, DADDiu, DADDu, DCLO,
1257330f729Sjoerg                                 DCLZ, DEXT, DEXTM, DEXTU, DINS, DINSM, DINSU,
1267330f729Sjoerg                                 DROTR, DROTR32, DROTRV, DSBH, DSHD, DSLL,
1277330f729Sjoerg                                 DSLL32, DSLLV, DSRA, DSRA32, DSRAV, DSRL,
1287330f729Sjoerg                                 DSRL32, DSRLV, DSUB, DSUBu, LEA_ADDiu64,
1297330f729Sjoerg                                 LUi64, NOR64, OR64)>;
1307330f729Sjoerg
1317330f729Sjoerg// MIPS64R6
1327330f729Sjoerg// ========
1337330f729Sjoerg
1347330f729Sjoergdef : InstRW<[GenericWriteALU], (instrs DALIGN, DAHI, DATI, DAUI, DCLO_R6,
1357330f729Sjoerg                                 DCLZ_R6, DBITSWAP, DLSA, DLSA_R6, SELEQZ64,
1367330f729Sjoerg                                 SELNEZ64)>;
1377330f729Sjoerg
1387330f729Sjoerg
1397330f729Sjoergdef GenericMDU : ProcResource<1> { let BufferSize = 1; }
1407330f729Sjoergdef GenericIssueMDU : ProcResource<1> { let Super = GenericALU; }
1417330f729Sjoergdef GenericIssueDIV : ProcResource<1> { let Super = GenericMDU; }
1427330f729Sjoergdef GenericWriteHILO : SchedWriteRes<[GenericIssueMDU]>;
1437330f729Sjoergdef GenericWriteALULong : SchedWriteRes<[GenericIssueALU]> { let Latency = 5; }
1447330f729Sjoergdef GenericWriteMove : SchedWriteRes<[GenericIssueALU]> { let Latency = 2; }
1457330f729Sjoergdef GenericWriteMul : SchedWriteRes<[GenericIssueMDU]> { let Latency = 4; }
1467330f729Sjoerg
1477330f729Sjoergdef : InstRW<[GenericWriteHILO], (instrs MADD, MADDU, MSUB, MSUBU)>;
1487330f729Sjoerg
1497330f729Sjoergdef : InstRW<[GenericWriteHILO], (instrs PseudoMADD_MM, PseudoMADDU_MM,
1507330f729Sjoerg                                  PseudoMSUB_MM, PseudoMSUBU_MM,
1517330f729Sjoerg                                  PseudoMULT_MM, PseudoMULTu_MM)>;
1527330f729Sjoerg
1537330f729Sjoergdef : InstRW<[GenericWriteHILO], (instrs PseudoMADD, PseudoMADDU, PseudoMSUB,
1547330f729Sjoerg                                  PseudoMSUBU, PseudoMULT, PseudoMULTu)>;
1557330f729Sjoerg
1567330f729Sjoergdef GenericWriteMDUtoGPR : SchedWriteRes<[GenericIssueMDU]> {
1577330f729Sjoerg  let Latency = 5;
1587330f729Sjoerg}
1597330f729Sjoerg
1607330f729Sjoergdef GenericWriteDIV : SchedWriteRes<[GenericIssueDIV]> {
1617330f729Sjoerg  // Estimated worst case
1627330f729Sjoerg  let Latency = 33;
1637330f729Sjoerg  let ResourceCycles = [33];
1647330f729Sjoerg}
1657330f729Sjoergdef GenericWriteDIVU : SchedWriteRes<[GenericIssueDIV]> {
1667330f729Sjoerg  // Estimated worst case
1677330f729Sjoerg  let Latency = 31;
1687330f729Sjoerg  let ResourceCycles = [31];
1697330f729Sjoerg}
1707330f729Sjoerg
1717330f729Sjoerg// mul
1727330f729Sjoergdef : InstRW<[GenericWriteMDUtoGPR], (instrs MUL)>;
1737330f729Sjoerg
1747330f729Sjoerg// mult, multu
1757330f729Sjoergdef : InstRW<[GenericWriteMul], (instrs MULT, MULTu)>;
1767330f729Sjoerg
1777330f729Sjoerg// div, sdiv
1787330f729Sjoergdef : InstRW<[GenericWriteDIV], (instrs PseudoSDIV, SDIV)>;
1797330f729Sjoerg
1807330f729Sjoergdef : InstRW<[GenericWriteDIVU], (instrs PseudoUDIV, UDIV)>;
1817330f729Sjoerg
1827330f729Sjoerg// mfhi, mflo, movn, mthi, mtlo, rdwhr
1837330f729Sjoergdef : InstRW<[GenericWriteALULong], (instrs MFHI, MFLO, PseudoMFHI,
1847330f729Sjoerg                                     PseudoMFLO)>;
1857330f729Sjoerg
1867330f729Sjoergdef : InstRW<[GenericWriteALULong], (instrs PseudoMFHI_MM, PseudoMFLO_MM)>;
1877330f729Sjoerg
1887330f729Sjoergdef : InstRW<[GenericWriteMove], (instrs MTHI, MTLO, RDHWR, PseudoMTLOHI)>;
1897330f729Sjoergdef : InstRW<[GenericWriteMove], (instrs PseudoMTLOHI_MM)>;
1907330f729Sjoerg
1917330f729Sjoergdef : InstRW<[GenericWriteALU], (instrs MOVN_I_I, MOVZ_I_I)>;
1927330f729Sjoerg
1937330f729Sjoerg// MIPSR6
1947330f729Sjoerg// ======
1957330f729Sjoerg
1967330f729Sjoerg// muh, muhu, mulu, mul
1977330f729Sjoergdef : InstRW<[GenericWriteMul], (instrs MUH, MUHU, MULU, MUL_R6)>;
1987330f729Sjoerg
1997330f729Sjoerg// divu, udiv
2007330f729Sjoergdef : InstRW<[GenericWriteDIV], (instrs MOD, MODU, DIV, DIVU)>;
2017330f729Sjoerg
2027330f729Sjoerg
2037330f729Sjoerg// MIPS16e
2047330f729Sjoerg// =======
2057330f729Sjoerg
2067330f729Sjoergdef : InstRW<[GenericWriteHILO], (instrs MultRxRy16, MultuRxRy16,
2077330f729Sjoerg                                  MultRxRyRz16, MultuRxRyRz16)>;
2087330f729Sjoerg
2097330f729Sjoergdef : InstRW<[GenericWriteDIV], (instrs DivRxRy16)>;
2107330f729Sjoerg
2117330f729Sjoergdef : InstRW<[GenericWriteDIVU], (instrs DivuRxRy16)>;
2127330f729Sjoerg
2137330f729Sjoerg// microMIPS
2147330f729Sjoerg// =========
2157330f729Sjoerg
2167330f729Sjoergdef : InstRW<[GenericWriteMul], (instrs MULT_MM, MULTu_MM, MADD_MM, MADDU_MM,
2177330f729Sjoerg                                 MSUB_MM, MSUBU_MM)>;
2187330f729Sjoerg
2197330f729Sjoergdef : InstRW<[GenericWriteALULong], (instrs MUL_MM)>;
2207330f729Sjoerg
2217330f729Sjoergdef : InstRW<[GenericWriteDIV], (instrs SDIV_MM, SDIV_MM_Pseudo)>;
2227330f729Sjoerg
2237330f729Sjoergdef : InstRW<[GenericWriteDIVU], (instrs UDIV_MM, UDIV_MM_Pseudo)>;
2247330f729Sjoerg
2257330f729Sjoergdef : InstRW<[GenericWriteMove], (instrs MFHI16_MM, MFLO16_MM, MOVF_I_MM,
2267330f729Sjoerg                                  MOVT_I_MM, MFHI_MM, MFLO_MM, MTHI_MM,
2277330f729Sjoerg                                  MTLO_MM)>;
2287330f729Sjoerg
2297330f729Sjoergdef : InstRW<[GenericWriteMove], (instrs RDHWR_MM)>;
2307330f729Sjoerg
2317330f729Sjoerg// microMIPS32r6
2327330f729Sjoerg// =============
2337330f729Sjoerg
2347330f729Sjoergdef : InstRW<[GenericWriteMul], (instrs MUHU_MMR6, MUH_MMR6, MULU_MMR6,
2357330f729Sjoerg                                 MUL_MMR6)>;
2367330f729Sjoerg
2377330f729Sjoergdef : InstRW<[GenericWriteDIV], (instrs MODU_MMR6, MOD_MMR6, DIVU_MMR6,
2387330f729Sjoerg                                 DIV_MMR6)>;
2397330f729Sjoerg
2407330f729Sjoergdef : InstRW<[GenericWriteMove], (instrs RDHWR_MMR6)>;
2417330f729Sjoerg
2427330f729Sjoerg// MIPS64
2437330f729Sjoerg// ======
2447330f729Sjoerg
2457330f729Sjoergdef : InstRW<[GenericWriteHILO], (instrs DMULU, DMULT, DMULTu, PseudoDMULT,
2467330f729Sjoerg                                  PseudoDMULTu)>;
2477330f729Sjoerg
2487330f729Sjoergdef : InstRW<[GenericWriteDIV], (instrs DSDIV, PseudoDSDIV)>;
2497330f729Sjoerg
2507330f729Sjoergdef : InstRW<[GenericWriteDIVU], (instrs DUDIV, PseudoDUDIV)>;
2517330f729Sjoerg
2527330f729Sjoergdef : InstRW<[GenericWriteALULong], (instrs MFHI64, MFLO64, PseudoMFHI64,
2537330f729Sjoerg                                     PseudoMFLO64, PseudoMTLOHI64)>;
2547330f729Sjoerg
2557330f729Sjoergdef : InstRW<[GenericWriteMove], (instrs MTHI64, MTLO64, RDHWR64)>;
2567330f729Sjoerg
2577330f729Sjoerg// mov[zn]
2587330f729Sjoergdef : InstRW<[GenericWriteALU], (instrs MOVN_I_I64, MOVN_I64_I, MOVN_I64_I64,
2597330f729Sjoerg                                 MOVZ_I_I64, MOVZ_I64_I, MOVZ_I64_I64)>;
2607330f729Sjoerg
2617330f729Sjoerg
2627330f729Sjoerg// MIPS64R6
2637330f729Sjoerg// ========
2647330f729Sjoerg
2657330f729Sjoergdef : InstRW<[GenericWriteMDUtoGPR], (instrs DMUH, DMUHU, DMUL_R6)>;
2667330f729Sjoerg
2677330f729Sjoergdef : InstRW<[GenericWriteDIV], (instrs DDIV, DMOD)>;
2687330f729Sjoerg
2697330f729Sjoergdef : InstRW<[GenericWriteDIVU], (instrs DDIVU, DMODU)>;
2707330f729Sjoerg
2717330f729Sjoerg// CTISTD Pipeline
2727330f729Sjoerg// ---------------
2737330f729Sjoerg
2747330f729Sjoergdef GenericIssueCTISTD : ProcResource<1> { let Super = GenericALU; }
2757330f729Sjoerg
2767330f729Sjoergdef GenericLDST : ProcResource<1> { let BufferSize = 1; }
2777330f729Sjoergdef GenericIssueLDST : ProcResource<1> { let Super = GenericLDST; }
2787330f729Sjoerg
2797330f729Sjoergdef GenericWriteJump : SchedWriteRes<[GenericIssueCTISTD]>;
2807330f729Sjoergdef GenericWriteJumpAndLink : SchedWriteRes<[GenericIssueCTISTD]> {
2817330f729Sjoerg  let Latency = 2;
2827330f729Sjoerg}
2837330f729Sjoerg
2847330f729Sjoerg// b, beq, beql, bg[et]z, bl[et]z, bne, bnel, j, syscall, jal, bltzal, jalx,
2857330f729Sjoerg// jalr, jr.hb, jr, jalr.hb, jarlc, jialc
2867330f729Sjoergdef : InstRW<[GenericWriteJump], (instrs B, BAL, BAL_BR, BEQ, BNE, BGTZ, BGEZ,
2877330f729Sjoerg                                  BLEZ, BLTZ, BLTZAL, J, JALX, JR, JR_HB, ERET,
2887330f729Sjoerg                                  ERet, ERETNC, DERET)>;
2897330f729Sjoerg
2907330f729Sjoergdef : InstRW<[GenericWriteJump], (instrs BEQL, BNEL, BGEZL, BGTZL, BLEZL,
2917330f729Sjoerg                                  BLTZL)>;
2927330f729Sjoerg
2937330f729Sjoergdef : InstRW<[GenericWriteJump], (instrs TAILCALL, TAILCALLREG,
2947330f729Sjoerg                                  TAILCALLREGHB, PseudoIndirectBranch,
2957330f729Sjoerg                                  PseudoIndirectHazardBranch, PseudoReturn,
2967330f729Sjoerg                                  RetRA)>;
2977330f729Sjoerg
2987330f729Sjoergdef : InstRW<[GenericWriteJumpAndLink], (instrs BGEZAL, JAL, JALR, JALR_HB,
2997330f729Sjoerg                                         JALRHBPseudo, JALRPseudo)>;
3007330f729Sjoerg
3017330f729Sjoergdef : InstRW<[GenericWriteJumpAndLink], (instrs BGEZALL, BLTZALL)>;
3027330f729Sjoerg
3037330f729Sjoergdef GenericWriteTrap : SchedWriteRes<[GenericIssueCTISTD]>;
3047330f729Sjoerg
3057330f729Sjoergdef : InstRW<[GenericWriteTrap], (instrs BREAK, SYSCALL, TEQ, TEQI,
3067330f729Sjoerg                                  TGE, TGEI, TGEIU, TGEU, TNE,
3077330f729Sjoerg                                  TNEI, TLT, TLTI, TLTU, TTLTIU,
3087330f729Sjoerg                                  TRAP, SDBBP)>;
3097330f729Sjoerg
3107330f729Sjoerg// MIPSR6
3117330f729Sjoerg// ======
3127330f729Sjoerg
3137330f729Sjoergdef : InstRW<[GenericWriteJumpAndLink], (instrs BALC, BEQZALC, BGEZALC,
3147330f729Sjoerg                                         BGTZALC, BLEZALC, BLTZALC,
3157330f729Sjoerg                                         BNEZALC,
3167330f729Sjoerg                                         JIALC)>;
3177330f729Sjoerg
3187330f729Sjoergdef : InstRW<[GenericWriteJump], (instrs BC, BC2EQZ, BC2NEZ, BEQC, BEQZC, BGEC,
3197330f729Sjoerg                                  BGEUC, BGEZC, BGTZC, BLEZC, BLTC, BLTUC,
3207330f729Sjoerg                                  BLTZC, BNEC, BNEZC, BNVC, BOVC, JIC, JR_HB_R6,
3217330f729Sjoerg                                  SIGRIE, PseudoIndirectBranchR6,
3227330f729Sjoerg                                  PseudoIndrectHazardBranchR6)>;
3237330f729Sjoerg
3247330f729Sjoergdef : InstRW<[GenericWriteJump], (instrs TAILCALLR6REG, TAILCALLHBR6REG)>;
3257330f729Sjoerg
3267330f729Sjoergdef : InstRW<[GenericWriteTrap], (instrs SDBBP_R6)>;
3277330f729Sjoerg
3287330f729Sjoerg// MIPS16e
3297330f729Sjoerg// =======
3307330f729Sjoerg
3317330f729Sjoergdef : InstRW<[GenericWriteJump], (instrs Bimm16, BimmX16, BeqzRxImm16,
3327330f729Sjoerg                                  BeqzRxImmX16, BnezRxImm16, BnezRxImmX16,
3337330f729Sjoerg                                  Bteqz16, BteqzX16, BteqzT8CmpX16,
3347330f729Sjoerg                                  BteqzT8CmpiX16, BteqzT8SltX16,
3357330f729Sjoerg                                  BteqzT8SltuX16, BteqzT8SltiX16,
3367330f729Sjoerg                                  BteqzT8SltiuX16, Btnez16, BtnezX16,
3377330f729Sjoerg                                  BtnezT8CmpX16, BtnezT8CmpiX16,
3387330f729Sjoerg                                  BtnezT8SltX16, BtnezT8SltuX16,
3397330f729Sjoerg                                  BtnezT8SltiX16, BtnezT8SltiuX16, JrRa16,
3407330f729Sjoerg                                  JrcRa16, JrcRx16, RetRA16)>;
3417330f729Sjoerg
3427330f729Sjoergdef : InstRW<[GenericWriteJumpAndLink], (instrs Jal16, JalB16, JumpLinkReg16)>;
3437330f729Sjoerg
3447330f729Sjoergdef : InstRW<[GenericWriteTrap], (instrs Break16)>;
3457330f729Sjoerg
3467330f729Sjoergdef : InstRW<[GenericWriteALULong], (instrs SelBeqZ, SelTBteqZCmp,
3477330f729Sjoerg                                     SelTBteqZCmpi, SelTBteqZSlt,
3487330f729Sjoerg                                     SelTBteqZSlti, SelTBteqZSltu,
3497330f729Sjoerg                                     SelTBteqZSltiu, SelBneZ, SelTBtneZCmp,
3507330f729Sjoerg                                     SelTBtneZCmpi, SelTBtneZSlt,
3517330f729Sjoerg                                     SelTBtneZSlti, SelTBtneZSltu,
3527330f729Sjoerg                                     SelTBtneZSltiu)>;
3537330f729Sjoerg
3547330f729Sjoerg// microMIPS
3557330f729Sjoerg// =========
3567330f729Sjoerg
3577330f729Sjoergdef : InstRW<[GenericWriteJump], (instrs B16_MM, BAL_BR_MM, BC1F_MM, BC1T_MM,
3587330f729Sjoerg                                  BEQZ16_MM, BEQZC_MM, BEQ_MM, BGEZ_MM,
3597330f729Sjoerg                                  BGTZ_MM, BLEZ_MM, BLTZ_MM, BNEZ16_MM,
3607330f729Sjoerg                                  BNEZC_MM, BNE_MM, B_MM, DERET_MM, ERET_MM,
3617330f729Sjoerg                                  JR16_MM, JR_MM, J_MM, B_MM_Pseudo)>;
3627330f729Sjoerg
3637330f729Sjoergdef : InstRW<[GenericWriteJumpAndLink], (instrs BGEZALS_MM, BGEZAL_MM,
3647330f729Sjoerg                                         BLTZALS_MM, BLTZAL_MM, JALR16_MM,
3657330f729Sjoerg                                         JALRS16_MM, JALRS_MM, JALR_MM,
3667330f729Sjoerg                                         JALS_MM, JALX_MM, JAL_MM)>;
3677330f729Sjoerg
3687330f729Sjoergdef : InstRW<[GenericWriteJump], (instrs TAILCALLREG_MM, TAILCALL_MM,
3697330f729Sjoerg                                  PseudoIndirectBranch_MM)>;
3707330f729Sjoerg
3717330f729Sjoergdef : InstRW<[GenericWriteTrap], (instrs BREAK16_MM, BREAK_MM, SDBBP16_MM,
3727330f729Sjoerg                                  SDBBP_MM, SYSCALL_MM, TEQI_MM, TEQ_MM,
3737330f729Sjoerg                                  TGEIU_MM, TGEI_MM, TGEU_MM, TGE_MM, TLTIU_MM,
3747330f729Sjoerg                                  TLTI_MM, TLTU_MM, TLT_MM, TNEI_MM, TNE_MM,
3757330f729Sjoerg                                  TRAP_MM)>;
3767330f729Sjoerg
3777330f729Sjoerg// microMIPS32r6
3787330f729Sjoerg// =============
3797330f729Sjoerg
3807330f729Sjoergdef : InstRW<[GenericWriteJump], (instrs BC16_MMR6, BC1EQZC_MMR6, BC1NEZC_MMR6,
3817330f729Sjoerg                                  BC2EQZC_MMR6, BC2NEZC_MMR6, BC_MMR6,
3827330f729Sjoerg                                  BEQC_MMR6, BEQZC16_MMR6, BEQZC_MMR6,
3837330f729Sjoerg                                  BGEC_MMR6, BGEUC_MMR6, BGEZC_MMR6,
3847330f729Sjoerg                                  BGTZC_MMR6, BLEZC_MMR6, BLTC_MMR6,
3857330f729Sjoerg                                  BLTUC_MMR6, BLTZC_MMR6, BNEC_MMR6,
3867330f729Sjoerg                                  BNEZC16_MMR6, BNEZC_MMR6, BNVC_MMR6,
3877330f729Sjoerg                                  BOVC_MMR6, DERET_MMR6, ERETNC_MMR6, JAL_MMR6,
3887330f729Sjoerg                                  ERET_MMR6, JIC_MMR6, JRADDIUSP, JRC16_MM,
3897330f729Sjoerg                                  JRC16_MMR6, JRCADDIUSP_MMR6, SIGRIE_MMR6,
3907330f729Sjoerg                                  B_MMR6_Pseudo, PseudoIndirectBranch_MMR6)>;
3917330f729Sjoerg
3927330f729Sjoergdef : InstRW<[GenericWriteJumpAndLink], (instrs BALC_MMR6, BEQZALC_MMR6,
3937330f729Sjoerg                                         BGEZALC_MMR6, BGTZALC_MMR6,
3947330f729Sjoerg                                         BLEZALC_MMR6, BLTZALC_MMR6,
3957330f729Sjoerg                                         BNEZALC_MMR6, JALRC16_MMR6,
3967330f729Sjoerg                                         JALRC_HB_MMR6, JALRC_MMR6,
3977330f729Sjoerg                                         JIALC_MMR6)>;
3987330f729Sjoerg
3997330f729Sjoergdef : InstRW<[GenericWriteJump], (instrs TAILCALLREG_MMR6, TAILCALL_MMR6)>;
4007330f729Sjoerg
4017330f729Sjoergdef : InstRW<[GenericWriteTrap], (instrs BREAK16_MMR6, BREAK_MMR6, SDBBP_MMR6,
4027330f729Sjoerg                                  SDBBP16_MMR6)>;
4037330f729Sjoerg
4047330f729Sjoerg// MIPS64
4057330f729Sjoerg// ======
4067330f729Sjoerg
4077330f729Sjoergdef : InstRW<[GenericWriteJump], (instrs BEQ64, BGEZ64, BGTZ64, BLEZ64,
4087330f729Sjoerg                                  BLTZ64, BNE64, JR64)>;
4097330f729Sjoerg
4107330f729Sjoergdef : InstRW<[GenericWriteJumpAndLink], (instrs JALR64, JALR64Pseudo,
4117330f729Sjoerg                                         JALRHB64Pseudo, JALR_HB64)>;
4127330f729Sjoerg
4137330f729Sjoergdef : InstRW<[GenericWriteJump], (instrs JR_HB64, TAILCALLREG64,
4147330f729Sjoerg                                  TAILCALLREGHB64, PseudoReturn64)>;
4157330f729Sjoerg
4167330f729Sjoerg// MIPS64R6
4177330f729Sjoerg// ========
4187330f729Sjoerg
4197330f729Sjoergdef : InstRW<[GenericWriteJump], (instrs BEQC64, BEQZC64, BGEC64, BGEUC64,
4207330f729Sjoerg                                  BGEZC64, BGTZC64, BLEZC64, BLTC64, BLTUC64,
4217330f729Sjoerg                                  BLTZC64, BNEC64, BNEZC64, JIC64,
4227330f729Sjoerg                                  PseudoIndirectBranch64,
4237330f729Sjoerg                                  PseudoIndirectHazardBranch64)>;
4247330f729Sjoerg
4257330f729Sjoergdef : InstRW<[GenericWriteJumpAndLink], (instrs JIALC64)>;
4267330f729Sjoerg
4277330f729Sjoergdef : InstRW<[GenericWriteJump], (instrs JR_HB64_R6, TAILCALL64R6REG,
4287330f729Sjoerg                                  TAILCALLHB64R6REG, PseudoIndirectBranch64R6,
4297330f729Sjoerg                                  PseudoIndrectHazardBranch64R6)>;
4307330f729Sjoerg
4317330f729Sjoerg// COP0 Pipeline
4327330f729Sjoerg// =============
4337330f729Sjoerg
4347330f729Sjoergdef GenericCOP0 : ProcResource<1> { let BufferSize = 1; }
4357330f729Sjoerg
4367330f729Sjoergdef GenericIssueCOP0 : ProcResource<1> { let Super = GenericCOP0; }
4377330f729Sjoergdef GenericWriteCOP0TLB : SchedWriteRes<[GenericIssueCOP0]> { let Latency = 4; }
4387330f729Sjoergdef GenericWriteCOP0 : SchedWriteRes<[GenericIssueCOP0]> { let Latency = 3; }
4397330f729Sjoergdef GenericReadCOP0 : SchedWriteRes<[GenericIssueCOP0]> { let Latency = 2; }
4407330f729Sjoergdef GenericReadWritePGPR : SchedWriteRes<[GenericIssueCOP0]>;
4417330f729Sjoergdef GenericReadWriteCOP0Long : SchedWriteRes<[GenericIssueCOP0]> {
4427330f729Sjoerg  let Latency = 5;
4437330f729Sjoerg}
4447330f729Sjoergdef GenericWriteCOP0Short : SchedWriteRes<[GenericIssueCOP0]>;
4457330f729Sjoerg
4467330f729Sjoergdef : InstRW<[GenericWriteCOP0TLB], (instrs TLBP, TLBR, TLBWI, TLBWR)>;
4477330f729Sjoergdef : InstRW<[GenericWriteCOP0TLB], (instrs TLBINV, TLBINVF)>;
4487330f729Sjoerg
4497330f729Sjoergdef : InstRW<[GenericReadCOP0], (instrs MFC0)>;
4507330f729Sjoergdef : InstRW<[GenericWriteCOP0], (instrs MTC0)>;
4517330f729Sjoerg
4527330f729Sjoergdef : InstRW<[GenericWriteCOP0], (instrs EVP, DVP)>;
4537330f729Sjoerg
4547330f729Sjoergdef : InstRW<[GenericWriteCOP0], (instrs DI, EI)>;
4557330f729Sjoerg
4567330f729Sjoergdef : InstRW<[GenericWriteCOP0], (instrs EHB, PAUSE, WAIT)>;
4577330f729Sjoerg
4587330f729Sjoerg// microMIPS
4597330f729Sjoerg// =========
4607330f729Sjoerg
4617330f729Sjoergdef : InstRW<[GenericWriteCOP0TLB], (instrs TLBP_MM, TLBR_MM, TLBWI_MM,
4627330f729Sjoerg                                     TLBWR_MM)>;
4637330f729Sjoerg
4647330f729Sjoergdef : InstRW<[GenericWriteCOP0], (instrs DI_MM, EI_MM)>;
4657330f729Sjoerg
4667330f729Sjoergdef : InstRW<[GenericWriteCOP0], (instrs EHB_MM, PAUSE_MM, WAIT_MM)>;
4677330f729Sjoerg
4687330f729Sjoerg
4697330f729Sjoerg// microMIPS32R6
4707330f729Sjoerg// =============
4717330f729Sjoerg
4727330f729Sjoergdef : InstRW<[GenericWriteCOP0], (instrs RDPGPR_MMR6, WRPGPR_MMR6)>;
4737330f729Sjoerg
4747330f729Sjoergdef : InstRW<[GenericWriteCOP0TLB], (instrs TLBINV_MMR6, TLBINVF_MMR6)>;
4757330f729Sjoerg
4767330f729Sjoergdef : InstRW<[GenericReadCOP0], (instrs MFHC0_MMR6, MFC0_MMR6, MFHC2_MMR6,
4777330f729Sjoerg                                 MFC2_MMR6)>;
4787330f729Sjoerg
4797330f729Sjoergdef : InstRW<[GenericWriteCOP0], (instrs MTHC0_MMR6, MTC0_MMR6, MTHC2_MMR6,
4807330f729Sjoerg                                  MTC2_MMR6)>;
4817330f729Sjoerg
4827330f729Sjoergdef : InstRW<[GenericWriteCOP0], (instrs EVP_MMR6, DVP_MMR6)>;
4837330f729Sjoerg
4847330f729Sjoergdef : InstRW<[GenericWriteCOP0], (instrs DI_MMR6, EI_MMR6)>;
4857330f729Sjoerg
4867330f729Sjoergdef : InstRW<[GenericWriteCOP0], (instrs EHB_MMR6, PAUSE_MMR6, WAIT_MMR6)>;
4877330f729Sjoerg
4887330f729Sjoerg// MIPS64
4897330f729Sjoerg// ======
4907330f729Sjoerg
4917330f729Sjoergdef : InstRW<[GenericReadCOP0], (instrs DMFC0)>;
4927330f729Sjoerg
4937330f729Sjoergdef : InstRW<[GenericWriteCOP0], (instrs DMTC0)>;
4947330f729Sjoerg
4957330f729Sjoerg
4967330f729Sjoergdef GenericCOP2 : ProcResource<1> { let BufferSize = 1; }
4977330f729Sjoergdef GenericWriteCOPOther : SchedWriteRes<[GenericCOP2]>;
4987330f729Sjoerg
4997330f729Sjoergdef : InstRW<[GenericWriteCOPOther], (instrs MFC2, MTC2)>;
5007330f729Sjoerg
5017330f729Sjoergdef : InstRW<[GenericWriteCOPOther], (instrs DMFC2, DMTC2)>;
5027330f729Sjoerg
5037330f729Sjoerg// microMIPS32R6
5047330f729Sjoerg// =============
5057330f729Sjoerg
5067330f729Sjoerg// The latency and repeat rate of these instructions are implementation
5077330f729Sjoerg// dependant.
5087330f729Sjoergdef : InstRW<[GenericWriteMove], (instrs CFC2_MM, CTC2_MM)>;
5097330f729Sjoerg
5107330f729Sjoerg
5117330f729Sjoerg// MIPS MT ASE - hasMT
5127330f729Sjoerg// ====================
5137330f729Sjoerg
5147330f729Sjoergdef : InstRW<[GenericWriteMove], (instrs DMT, DVPE, EMT, EVPE, MFTR,
5157330f729Sjoerg                                  MTTR)>;
5167330f729Sjoerg
5177330f729Sjoergdef : InstRW<[GenericReadWriteCOP0Long], (instrs YIELD)>;
5187330f729Sjoerg
5197330f729Sjoergdef : InstRW<[GenericWriteCOP0Short], (instrs FORK)>;
5207330f729Sjoerg
5217330f729Sjoerg// MIPS Virtualization ASE
5227330f729Sjoerg// =======================
5237330f729Sjoerg
5247330f729Sjoergdef : InstRW<[GenericWriteCOP0Short], (instrs HYPCALL, TLBGINV, TLBGINVF, TLBGP,
5257330f729Sjoerg                                       TLBGR, TLBGWI, TLBGWR, MFGC0, MFHGC0,
5267330f729Sjoerg                                       MTGC0, MTHGC0)>;
5277330f729Sjoerg
5287330f729Sjoerg// MIPS64 Virtualization ASE
5297330f729Sjoerg// =========================
5307330f729Sjoerg
5317330f729Sjoergdef : InstRW<[GenericWriteCOP0Short], (instrs DMFGC0, DMTGC0)>;
5327330f729Sjoerg
5337330f729Sjoerg// microMIPS virtualization ASE
5347330f729Sjoerg// ============================
5357330f729Sjoerg
5367330f729Sjoergdef : InstRW<[GenericWriteCOP0Short], (instrs HYPCALL_MM, TLBGINVF_MM,
5377330f729Sjoerg                                       TLBGINV_MM, TLBGP_MM, TLBGR_MM,
5387330f729Sjoerg                                       TLBGWI_MM, TLBGWR_MM, MFGC0_MM,
5397330f729Sjoerg                                       MFHGC0_MM, MTGC0_MM, MTHGC0_MM)>;
5407330f729Sjoerg
5417330f729Sjoerg// LDST Pipeline
5427330f729Sjoerg// -------------
5437330f729Sjoerg
5447330f729Sjoergdef GenericWriteLoad : SchedWriteRes<[GenericIssueLDST]> {
5457330f729Sjoerg  let Latency = 2;
5467330f729Sjoerg}
5477330f729Sjoerg
5487330f729Sjoergdef GenericWritePref : SchedWriteRes<[GenericIssueLDST]>;
5497330f729Sjoergdef GenericWriteSync : SchedWriteRes<[GenericIssueLDST]>;
5507330f729Sjoergdef GenericWriteCache : SchedWriteRes<[GenericIssueLDST]> { let Latency = 5; }
5517330f729Sjoerg
5527330f729Sjoergdef GenericWriteStore : SchedWriteRes<[GenericIssueLDST]>;
5537330f729Sjoergdef GenericWriteStoreSC : SchedWriteRes<[GenericIssueLDST]> { let Latency = 2; }
5547330f729Sjoerg
5557330f729Sjoergdef GenericWriteGPRFromBypass : SchedWriteRes<[GenericIssueLDST]> {
5567330f729Sjoerg  let Latency = 2;
5577330f729Sjoerg}
5587330f729Sjoerg
5597330f729Sjoergdef GenericWriteStoreFromOtherUnits : SchedWriteRes<[GenericIssueLDST]>;
5607330f729Sjoergdef GenericWriteLoadToOtherUnits : SchedWriteRes<[GenericIssueLDST]> {
5617330f729Sjoerg  let Latency = 0;
5627330f729Sjoerg}
5637330f729Sjoerg
5647330f729Sjoerg// l[bhw], l[bh]u, ll
5657330f729Sjoergdef : InstRW<[GenericWriteLoad], (instrs LB, LBu, LH, LHu, LW, LL,
5667330f729Sjoerg                                  LWC2, LWC3, LDC2, LDC3)>;
5677330f729Sjoerg
5687330f729Sjoerg// lw[lr]
5697330f729Sjoergdef : InstRW<[GenericWriteLoad], (instrs LWL, LWR)>;
5707330f729Sjoerg
5717330f729Sjoerg// s[bhw], sc, s[dw]c[23]
5727330f729Sjoergdef : InstRW<[GenericWriteStore], (instrs SB, SH, SW, SWC2, SWC3,
5737330f729Sjoerg                                   SDC2, SDC3)>;
5747330f729Sjoerg
5757330f729Sjoerg// PreMIPSR6 sw[lr]
5767330f729Sjoergdef : InstRW<[GenericWriteStore], (instrs SWL, SWR)>;
5777330f729Sjoerg
5787330f729Sjoergdef : InstRW<[GenericWriteStoreSC], (instrs SC, SC_MMR6)>;
5797330f729Sjoerg
5807330f729Sjoerg// pref
5817330f729Sjoergdef : InstRW<[GenericWritePref], (instrs PREF)>;
5827330f729Sjoerg// cache
5837330f729Sjoergdef : InstRW<[GenericWriteCache], (instrs CACHE)>;
5847330f729Sjoerg
5857330f729Sjoerg// sync
5867330f729Sjoergdef : InstRW<[GenericWriteSync], (instrs SYNC, SYNCI)>;
5877330f729Sjoerg
5887330f729Sjoerg// MIPSR6
5897330f729Sjoerg// ======
5907330f729Sjoerg
5917330f729Sjoergdef : InstRW<[GenericWriteLoad], (instrs LDC2_R6, LL_R6, LWC2_R6, LWPC)>;
5927330f729Sjoerg
5937330f729Sjoergdef : InstRW<[GenericWriteStore], (instrs SWC2_R6,  SDC2_R6)>;
5947330f729Sjoerg
5957330f729Sjoergdef : InstRW<[GenericWriteStoreSC], (instrs SC_R6)>;
5967330f729Sjoerg
5977330f729Sjoergdef : InstRW<[GenericWritePref], (instrs PREF_R6)>;
5987330f729Sjoerg
5997330f729Sjoergdef : InstRW<[GenericWriteCache], (instrs CACHE_R6)>;
6007330f729Sjoerg
6017330f729Sjoergdef : InstRW<[GenericWriteSync], (instrs GINVI, GINVT)>;
6027330f729Sjoerg
6037330f729Sjoerg// MIPS32 EVA
6047330f729Sjoerg// ==========
6057330f729Sjoerg
6067330f729Sjoergdef : InstRW<[GenericWriteLoad], (instrs LBE, LBuE, LHE, LHuE, LWE,
6077330f729Sjoerg                                  LLE)>;
6087330f729Sjoerg
6097330f729Sjoergdef : InstRW<[GenericWriteStore], (instrs SBE, SHE, SWE, SCE)>;
6107330f729Sjoerg
6117330f729Sjoergdef : InstRW<[GenericWriteLoad], (instrs LWLE, LWRE)>;
6127330f729Sjoerg
6137330f729Sjoergdef : InstRW<[GenericWriteStore], (instrs SWLE, SWRE)>;
6147330f729Sjoerg
6157330f729Sjoergdef : InstRW<[GenericWritePref], (instrs PREFE)>;
6167330f729Sjoerg
6177330f729Sjoergdef : InstRW<[GenericWriteCache], (instrs CACHEE)>;
6187330f729Sjoerg
6197330f729Sjoerg// microMIPS EVA ASE - InMicroMipsMode, hasEVA
6207330f729Sjoerg// ===========================================
6217330f729Sjoerg
6227330f729Sjoergdef : InstRW<[GenericWriteLoad], (instrs LBE_MM, LBuE_MM, LHE_MM, LHuE_MM,
6237330f729Sjoerg                                  LWE_MM, LWLE_MM, LWRE_MM, LLE_MM)>;
6247330f729Sjoerg
6257330f729Sjoergdef : InstRW<[GenericWriteStore], (instrs SBE_MM, SB_MM, SHE_MM, SWE_MM,
6267330f729Sjoerg                                   SWLE_MM, SWRE_MM, SCE_MM)>;
6277330f729Sjoerg
6287330f729Sjoergdef : InstRW<[GenericWritePref], (instrs PREFE_MM)>;
6297330f729Sjoergdef : InstRW<[GenericWriteCache], (instrs CACHEE_MM)>;
6307330f729Sjoerg
6317330f729Sjoerg
6327330f729Sjoerg// MIPS16e
6337330f729Sjoerg// =======
6347330f729Sjoerg
6357330f729Sjoergdef : InstRW<[GenericWriteLoad], (instrs Restore16, RestoreX16,
6367330f729Sjoerg                                  LbRxRyOffMemX16,
6377330f729Sjoerg                                  LbuRxRyOffMemX16, LhRxRyOffMemX16,
6387330f729Sjoerg                                  LhuRxRyOffMemX16, LwRxRyOffMemX16,
6397330f729Sjoerg                                  LwRxSpImmX16, LwRxPcTcp16, LwRxPcTcpX16)>;
6407330f729Sjoerg
6417330f729Sjoergdef : InstRW<[GenericWriteStore], (instrs Save16, SaveX16, SbRxRyOffMemX16,
6427330f729Sjoerg                                   ShRxRyOffMemX16, SwRxRyOffMemX16,
6437330f729Sjoerg                                   SwRxSpImmX16)>;
6447330f729Sjoerg
6457330f729Sjoerg// microMIPS
6467330f729Sjoerg// =========
6477330f729Sjoerg
6487330f729Sjoergdef : InstRW<[GenericWriteLoad], (instrs LBU16_MM, LB_MM, LBu_MM, LHU16_MM,
6497330f729Sjoerg                                  LH_MM, LHu_MM, LL_MM, LW16_MM, LWGP_MM,
6507330f729Sjoerg                                  LWL_MM, LWM16_MM, LWM32_MM, LWP_MM, LWR_MM,
6517330f729Sjoerg                                  LWSP_MM, LWU_MM, LWXS_MM, LW_MM)>;
6527330f729Sjoerg
6537330f729Sjoergdef : InstRW<[GenericWriteStore], (instrs SB16_MM, SC_MM, SH16_MM, SH_MM,
6547330f729Sjoerg                                   SW16_MM, SWL_MM, SWM16_MM, SWM32_MM, SWM_MM,
6557330f729Sjoerg                                   SWP_MM, SWR_MM, SWSP_MM, SW_MM)>;
6567330f729Sjoerg
6577330f729Sjoerg
6587330f729Sjoergdef : InstRW<[GenericWritePref], (instrs PREF_MM, PREFX_MM)>;
6597330f729Sjoerg
6607330f729Sjoergdef : InstRW<[GenericWriteCache], (instrs CACHE_MM)>;
6617330f729Sjoerg
6627330f729Sjoergdef : InstRW<[GenericWriteSync], (instrs SYNC_MM, SYNCI_MM)>;
6637330f729Sjoergdef : InstRW<[GenericWriteSync], (instrs GINVI_MMR6, GINVT_MMR6)>;
6647330f729Sjoerg
6657330f729Sjoerg// microMIPS32r6
6667330f729Sjoerg// =============
6677330f729Sjoerg
6687330f729Sjoergdef : InstRW<[GenericWriteLoad], (instrs LBU_MMR6, LB_MMR6, LDC2_MMR6, LL_MMR6,
6697330f729Sjoerg                                  LWM16_MMR6, LWC2_MMR6, LWPC_MMR6, LW_MMR6)>;
6707330f729Sjoerg
6717330f729Sjoergdef : InstRW<[GenericWriteStore], (instrs SB16_MMR6, SB_MMR6, SDC2_MMR6,
6727330f729Sjoerg                                   SH16_MMR6, SH_MMR6, SW16_MMR6, SWC2_MMR6,
6737330f729Sjoerg                                   SWM16_MMR6, SWSP_MMR6, SW_MMR6)>;
6747330f729Sjoerg
6757330f729Sjoergdef : InstRW<[GenericWriteSync], (instrs SYNC_MMR6, SYNCI_MMR6)>;
6767330f729Sjoerg
6777330f729Sjoergdef : InstRW<[GenericWritePref], (instrs PREF_MMR6)>;
6787330f729Sjoerg
6797330f729Sjoergdef : InstRW<[GenericWriteCache], (instrs CACHE_MMR6)>;
6807330f729Sjoerg
6817330f729Sjoerg// MIPS64
6827330f729Sjoerg// ======
6837330f729Sjoerg
6847330f729Sjoergdef : InstRW<[GenericWriteLoad], (instrs LD, LL64, LLD, LWu, LB64, LBu64,
6857330f729Sjoerg                                  LH64, LHu64, LW64)>;
6867330f729Sjoerg
6877330f729Sjoerg// l[dw][lr]
6887330f729Sjoergdef : InstRW<[GenericWriteLoad], (instrs LWL64, LWR64, LDL, LDR)>;
6897330f729Sjoerg
6907330f729Sjoergdef : InstRW<[GenericWriteStore], (instrs SD, SC64, SCD, SB64, SH64, SW64,
6917330f729Sjoerg                                   SWL64, SWR64)>;
6927330f729Sjoerg
6937330f729Sjoergdef : InstRW<[GenericWriteStore], (instrs SDL, SDR)>;
6947330f729Sjoerg
6957330f729Sjoerg// MIPS64R6
6967330f729Sjoerg// ========
6977330f729Sjoerg
6987330f729Sjoergdef : InstRW<[GenericWriteLoad], (instrs LWUPC, LDPC)>;
6997330f729Sjoerg
7007330f729Sjoergdef : InstRW<[GenericWriteLoad], (instrs LLD_R6, LL64_R6)>;
7017330f729Sjoerg
7027330f729Sjoergdef : InstRW<[GenericWriteStoreSC], (instrs SC64_R6, SCD_R6)>;
7037330f729Sjoerg
7047330f729Sjoerg// MIPSR6 CRC ASE - hasCRC
7057330f729Sjoerg// =======================
7067330f729Sjoerg
7077330f729Sjoergdef : InstRW<[GenericWriteALU], (instrs CRC32B, CRC32H, CRC32W, CRC32CB,
7087330f729Sjoerg                                 CRC32CH, CRC32CW)>;
7097330f729Sjoerg
7107330f729Sjoerg// MIPS64R6 CRC ASE - hasCRC
7117330f729Sjoerg// -------------------------
7127330f729Sjoerg
7137330f729Sjoergdef : InstRW<[GenericWriteALU], (instrs CRC32D, CRC32CD)>;
7147330f729Sjoerg
7157330f729Sjoerg
7167330f729Sjoerg// Cavium Networks MIPS (cnMIPS) - Octeon, HasCnMips
7177330f729Sjoerg// =================================================
7187330f729Sjoerg
7197330f729Sjoergdef : InstRW<[GenericWriteALU], (instrs BADDu, BBIT0, BBIT032, BBIT1, BBIT132,
7207330f729Sjoerg                                 CINS, CINS32, CINS64_32, CINS_i32,
7217330f729Sjoerg                                 DMFC2_OCTEON, DMTC2_OCTEON, DPOP, EXTS,
7227330f729Sjoerg                                 EXTS32, MTM0, MTM1, MTM2, MTP0, MTP1, MTP2,
723*82d56013Sjoerg                                 POP, SEQ, SEQi, SNE, SNEi,
724*82d56013Sjoerg                                 V3MULU, VMM0, VMULU)>;
7257330f729Sjoerg
7267330f729Sjoergdef : InstRW<[GenericWriteMDUtoGPR], (instrs DMUL)>;
7277330f729Sjoerg
728*82d56013Sjoerg// Cavium Networks MIPS (cnMIPSP) - Octeon+, HasCnMipsP
729*82d56013Sjoerg// =================================================
730*82d56013Sjoerg
731*82d56013Sjoergdef : InstRW<[GenericWriteALU], (instrs SAA, SAAD)>;
732*82d56013Sjoerg
7337330f729Sjoerg// FPU Pipelines
7347330f729Sjoerg// =============
7357330f729Sjoerg
7367330f729Sjoergdef GenericFPQ : ProcResource<1> { let BufferSize = 1; }
7377330f729Sjoergdef GenericIssueFPUS : ProcResource<1> { let Super = GenericFPQ; }
7387330f729Sjoergdef GenericIssueFPUL : ProcResource<1> { let Super = GenericFPQ; }
7397330f729Sjoergdef GenericIssueFPULoad : ProcResource<1> { let Super = GenericFPQ; }
7407330f729Sjoergdef GenericIssueFPUStore : ProcResource<1> { let Super = GenericFPQ; }
7417330f729Sjoergdef GenericIssueFPUMove : ProcResource<1> { let Super = GenericFPQ; }
7427330f729Sjoergdef GenericFPUDivSqrt : ProcResource<1> { let Super = GenericFPQ; }
7437330f729Sjoerg
7447330f729Sjoerg// The floating point compare of the 24k series including interAptiv has a
7457330f729Sjoerg// listed latency of 1-2. Using the higher latency here.
7467330f729Sjoerg
7477330f729Sjoergdef GenericWriteFPUCmp : SchedWriteRes<[GenericIssueFPUS]> { let Latency = 2; }
7487330f729Sjoergdef GenericWriteFPUS : SchedWriteRes<[GenericIssueFPUS]> { let Latency = 4; }
7497330f729Sjoergdef GenericWriteFPUL : SchedWriteRes<[GenericIssueFPUL]> { let Latency = 5; }
7507330f729Sjoergdef GenericWriteFPUStore : SchedWriteRes<[GenericIssueFPUStore]> { let
7517330f729Sjoerg  Latency = 1;
7527330f729Sjoerg}
7537330f729Sjoergdef GenericWriteFPULoad : SchedWriteRes<[GenericIssueFPULoad]> {
7547330f729Sjoerg  let Latency = 2;
7557330f729Sjoerg}
7567330f729Sjoergdef GenericWriteFPUMoveFP : SchedWriteRes<[GenericIssueFPUMove]> {
7577330f729Sjoerg  let Latency = 4;
7587330f729Sjoerg}
7597330f729Sjoergdef GenericWriteFPUMoveGPRFPU : SchedWriteRes<[GenericIssueFPUMove]> {
7607330f729Sjoerg  let Latency = 2;
7617330f729Sjoerg}
7627330f729Sjoergdef GenericWriteFPUDivS : SchedWriteRes<[GenericFPUDivSqrt]> {
7637330f729Sjoerg  let Latency = 17;
7647330f729Sjoerg  let ResourceCycles = [ 14 ];
7657330f729Sjoerg}
7667330f729Sjoergdef GenericWriteFPUDivD : SchedWriteRes<[GenericFPUDivSqrt]> {
7677330f729Sjoerg  let Latency = 32;
7687330f729Sjoerg  let ResourceCycles = [ 29 ];
7697330f729Sjoerg}
7707330f729Sjoergdef GenericWriteFPURcpS : SchedWriteRes<[GenericFPUDivSqrt]> {
7717330f729Sjoerg  let Latency = 13;
7727330f729Sjoerg  let ResourceCycles = [ 10 ];
7737330f729Sjoerg}
7747330f729Sjoergdef GenericWriteFPURcpD : SchedWriteRes<[GenericFPUDivSqrt]> {
7757330f729Sjoerg  let Latency = 25;
7767330f729Sjoerg  let ResourceCycles = [ 21 ];
7777330f729Sjoerg}
7787330f729Sjoergdef GenericWriteFPURsqrtS : SchedWriteRes<[GenericFPUDivSqrt]> {
7797330f729Sjoerg  let Latency = 17;
7807330f729Sjoerg  let ResourceCycles = [ 14 ];
7817330f729Sjoerg}
7827330f729Sjoergdef GenericWriteFPURsqrtD : SchedWriteRes<[GenericFPUDivSqrt]> {
7837330f729Sjoerg  let Latency = 32;
7847330f729Sjoerg  let ResourceCycles = [ 29 ];
7857330f729Sjoerg}
7867330f729Sjoergdef GenericWriteFPUSqrtS : SchedWriteRes<[GenericFPUDivSqrt]> {
7877330f729Sjoerg  let Latency = 17;
7887330f729Sjoerg  let ResourceCycles = [ 14 ];
7897330f729Sjoerg}
7907330f729Sjoergdef GenericWriteFPUSqrtD : SchedWriteRes<[GenericFPUDivSqrt]> {
7917330f729Sjoerg  let Latency = 29;
7927330f729Sjoerg  let ResourceCycles = [ 29 ];
7937330f729Sjoerg}
7947330f729Sjoerg
7957330f729Sjoerg// Floating point compare and branch
7967330f729Sjoerg// ---------------------------------
7977330f729Sjoerg//
7987330f729Sjoerg// c.<cc>.[ds], bc1[tf], bc1[tf]l
7997330f729Sjoergdef : InstRW<[GenericWriteFPUCmp], (instrs FCMP_D32, FCMP_D64, FCMP_S32, BC1F,
8007330f729Sjoerg                                    BC1T, BC1FL, BC1TL)>;
8017330f729Sjoerg
8027330f729Sjoergdef : InstRW<[GenericWriteFPUCmp], (instregex "C_[A-Z]+_(S|D32|D64)$")>;
8037330f729Sjoerg
8047330f729Sjoerg// Short Pipe
8057330f729Sjoerg// ----------
8067330f729Sjoerg//
8077330f729Sjoerg// abs.[ds], abs.ps, add.[ds], neg.[ds], neg.ps, madd.s, msub.s, nmadd,s
8087330f729Sjoerg// nmsub.s, sub.[ds], mul.s
8097330f729Sjoerg
8107330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instrs FABS_S, FABS_D32, FABS_D64, FADD_D32,
8117330f729Sjoerg                                  FADD_D64, FADD_S, MADD_S, MSUB_S, FMUL_S,
8127330f729Sjoerg                                  FNEG_S, FNEG_D32, FNEG_D64, NMADD_S, NMSUB_S,
8137330f729Sjoerg                                  FSUB_S, FSUB_D32, FSUB_D64)>;
8147330f729Sjoerg
8157330f729Sjoerg// Long Pipe
8167330f729Sjoerg// ----------
8177330f729Sjoerg//
8187330f729Sjoerg// nmadd.d, nmsub.d, mul.[ds], mul.ps, ceil.[wl].[sd], cvt.d.[sw], cvt.s.[dw],
8197330f729Sjoerg// cvt.w.[sd], cvt.[sw].ps, trunc.w.[ds], trunc.w.ps, floor.[ds],
8207330f729Sjoerg// round.[lw].[ds], floor.[lw].ds
8217330f729Sjoerg
8227330f729Sjoerg// madd.d, msub.dm mul.d, mul.ps, nmadd.d, nmsub.d, ceil.[wl].[sd], cvt.d.[sw],
8237330f729Sjoerg// cvt.s.[dw], cvt.w.[sd], cvt.[sw].ps, round.[lw].[ds], floor.[lw].ds,
8247330f729Sjoerg// trunc.w.[ds], trunc.w.ps,
825*82d56013Sjoergdef : InstRW<[GenericWriteFPUL], (instrs ADDR_PS64,
826*82d56013Sjoerg                                  CEIL_L_D64, CEIL_L_S, CEIL_W_D32,
8277330f729Sjoerg                                  CEIL_W_D64, CEIL_W_S, CVT_D32_S, CVT_D32_W,
8287330f729Sjoerg                                  CVT_D64_L, CVT_D64_S, CVT_D64_W, CVT_L_D64,
8297330f729Sjoerg                                  CVT_L_S, CVT_S_D32, CVT_S_D64, CVT_S_L,
8307330f729Sjoerg                                  CVT_S_W, CVT_W_D32, CVT_W_D64, CVT_W_S,
8317330f729Sjoerg                                  CVT_PS_S64, CVT_S_PL64, CVT_S_PU64,
832*82d56013Sjoerg                                  CVT_PS_PW64, CVT_PW_PS64, FADD_PS64,
8337330f729Sjoerg                                  FLOOR_L_D64, FLOOR_L_S, FLOOR_W_D32,
8347330f729Sjoerg                                  FLOOR_W_D64, FLOOR_W_S, FMUL_D32, FMUL_D64,
835*82d56013Sjoerg                                  FMUL_PS64, FSUB_PS64, MADD_D32, MADD_D64,
836*82d56013Sjoerg                                  MSUB_D32, MSUB_D64, MULR_PS64,
8377330f729Sjoerg                                  NMADD_D32, NMADD_D64, NMSUB_D32, NMSUB_D64,
838*82d56013Sjoerg                                  PLL_PS64, PLU_PS64, PUL_PS64, PUU_PS64,
8397330f729Sjoerg                                  ROUND_L_D64, ROUND_L_S, ROUND_W_D32,
8407330f729Sjoerg                                  ROUND_W_D64, ROUND_W_S, TRUNC_L_D64,
8417330f729Sjoerg                                  TRUNC_L_S, TRUNC_W_D32, TRUNC_W_D64,
8427330f729Sjoerg                                  TRUNC_W_S, PseudoTRUNC_W_D,
8437330f729Sjoerg                                  PseudoTRUNC_W_D32, PseudoTRUNC_W_S)>;
8447330f729Sjoerg
8457330f729Sjoerg// Pseudo convert instruction
8467330f729Sjoergdef : InstRW<[GenericWriteFPUL], (instrs PseudoCVT_D32_W, PseudoCVT_D64_L,
8477330f729Sjoerg                                  PseudoCVT_D64_W, PseudoCVT_S_L,
8487330f729Sjoerg                                  PseudoCVT_S_W)>;
8497330f729Sjoerg
8507330f729Sjoerg// div.[ds], div.ps
8517330f729Sjoergdef : InstRW<[GenericWriteFPUDivS], (instrs FDIV_S)>;
8527330f729Sjoergdef : InstRW<[GenericWriteFPUDivD], (instrs FDIV_D32, FDIV_D64)>;
8537330f729Sjoerg
8547330f729Sjoerg// sqrt.[ds], sqrt.ps
8557330f729Sjoergdef : InstRW<[GenericWriteFPUSqrtS], (instrs FSQRT_S)>;
8567330f729Sjoergdef : InstRW<[GenericWriteFPUSqrtD], (instrs FSQRT_D32, FSQRT_D64)>;
8577330f729Sjoerg
8587330f729Sjoerg// rsqrt.[ds], recip.[ds]
8597330f729Sjoergdef : InstRW<[GenericWriteFPURcpS], (instrs RECIP_S, RSQRT_S)>;
8607330f729Sjoergdef : InstRW<[GenericWriteFPURcpD], (instrs RECIP_D32, RECIP_D64,
8617330f729Sjoerg                                     RSQRT_D32, RSQRT_D64)>;
8627330f729Sjoerg
8637330f729Sjoerg
8647330f729Sjoerg// Load Pipe
8657330f729Sjoerg// ---------
8667330f729Sjoerg
8677330f729Sjoerg// ctc1, mtc1, mthc1, cfc1, mfc1, mfhc1
8687330f729Sjoergdef : InstRW<[GenericWriteFPUMoveGPRFPU], (instrs BuildPairF64,
8697330f729Sjoerg                                           BuildPairF64_64, ExtractElementF64,
8707330f729Sjoerg                                           ExtractElementF64_64, CFC1, CTC1,
8717330f729Sjoerg                                           MFC1, MFC1_D64, MFHC1_D32,
8727330f729Sjoerg                                           MFHC1_D64, MTC1, MTC1_D64,
8737330f729Sjoerg                                           MTHC1_D32, MTHC1_D64)>;
8747330f729Sjoerg
8757330f729Sjoerg// swc1, swxc1
8767330f729Sjoergdef : InstRW<[GenericWriteFPUStore], (instrs SDC1, SDC164, SDXC1, SDXC164,
8777330f729Sjoerg                                      SUXC1, SUXC164, SWC1, SWXC1)>;
8787330f729Sjoerg
8797330f729Sjoergdef : InstRW<[GenericWriteFPUMoveFP], (instrs FMOV_D32, FMOV_D64, FMOV_S)>;
8807330f729Sjoerg
8817330f729Sjoerg
8827330f729Sjoerg// movn.[ds], movz.[ds]
8837330f729Sjoergdef : InstRW<[GenericWriteFPUMoveFP], (instrs MOVF_I, MOVF_D32, MOVF_D64,
8847330f729Sjoerg                                       MOVF_S, MOVT_I, MOVT_D32, MOVT_D64,
8857330f729Sjoerg                                       MOVT_S, MOVN_I_D32, MOVN_I_D64,
8867330f729Sjoerg                                       MOVN_I_S, MOVZ_I_D32, MOVZ_I_D64,
8877330f729Sjoerg                                       MOVZ_I_S)>;
8887330f729Sjoerg
8897330f729Sjoergdef : InstRW<[GenericWriteFPUMoveFP], (instrs MOVT_I64, MOVF_I64, MOVZ_I64_S,
8907330f729Sjoerg                                       MOVN_I64_D64, MOVN_I64_S,
8917330f729Sjoerg                                       MOVZ_I64_D64)>;
8927330f729Sjoerg
8937330f729Sjoerg// l[dw]x?c1
8947330f729Sjoergdef : InstRW<[GenericWriteFPULoad], (instrs LDC1, LDC164, LDXC1, LDXC164,
8957330f729Sjoerg                                     LUXC1, LUXC164, LWC1, LWXC1)>;
8967330f729Sjoerg
8977330f729Sjoerg// MIPSR6
8987330f729Sjoerg// ======
8997330f729Sjoerg
9007330f729Sjoerg// sel(eq|ne).[ds], max.[ds], maxa.[ds], min.[ds], mina.[ds], class.[ds]
9017330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instrs SELEQZ_S, SELNEZ_S, SELEQZ_D, SELNEZ_D,
9027330f729Sjoerg                                  MAX_S, MAX_D, MAXA_S, MAXA_D, MIN_S, MIN_D,
9037330f729Sjoerg                                  MINA_S, MINA_D, CLASS_S, CLASS_D)>;
9047330f729Sjoerg
9057330f729Sjoergdef : InstRW<[GenericWriteFPUL], (instrs RINT_S, RINT_D)>;
9067330f729Sjoerg
9077330f729Sjoergdef : InstRW<[GenericWriteFPUCmp], (instrs BC1EQZ, BC1NEZ, SEL_D, SEL_S)>;
9087330f729Sjoerg
9097330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instrs MADDF_S, MSUBF_S, MADDF_D, MSUBF_D)>;
9107330f729Sjoerg
9117330f729Sjoerg
9127330f729Sjoerg// microMIPS
9137330f729Sjoerg// =========
9147330f729Sjoerg
9157330f729Sjoergdef : InstRW<[GenericWriteFPUMoveFP], (instrs MOVF_D32_MM, MOVF_S_MM,
9167330f729Sjoerg                                       MOVN_I_D32_MM, MOVN_I_S_MM,
9177330f729Sjoerg                                       MOVT_D32_MM, MOVT_S_MM, MOVZ_I_D32_MM,
9187330f729Sjoerg                                       MOVZ_I_S_MM)>;
9197330f729Sjoerg
9207330f729Sjoerg
9217330f729Sjoerg//  cvt.?.?, ceil.?, floor.?, round.?, trunc.? (n)madd.? (n)msub.?
9227330f729Sjoergdef : InstRW<[GenericWriteFPUL], (instrs CVT_D32_S_MM, CVT_D32_W_MM,
9237330f729Sjoerg                                  CVT_D64_S_MM, CVT_D64_W_MM, CVT_L_D64_MM,
9247330f729Sjoerg                                  CVT_L_S_MM, CVT_S_D32_MM, CVT_S_D64_MM,
9257330f729Sjoerg                                  CVT_S_W_MM, CVT_W_D32_MM, CVT_W_D64_MM,
9267330f729Sjoerg                                  CVT_W_S_MM, CEIL_W_MM, CEIL_W_S_MM,
9277330f729Sjoerg                                  FLOOR_W_MM, FLOOR_W_S_MM, NMADD_S_MM,
9287330f729Sjoerg                                  NMADD_D32_MM, NMSUB_S_MM, NMSUB_D32_MM,
9297330f729Sjoerg                                  MADD_S_MM, MADD_D32_MM, ROUND_W_MM,
9307330f729Sjoerg                                  ROUND_W_S_MM, TRUNC_W_MM, TRUNC_W_S_MM)>;
9317330f729Sjoerg
9327330f729Sjoergdef : InstRW<[GenericWriteFPUCmp], (instregex "^C_[A-Z]_(S|D32|D64)_MM$")>;
9337330f729Sjoergdef : InstRW<[GenericWriteFPUCmp], (instregex "^C_[A-Z][A-Z]_(S|D32|D64)_MM$")>;
9347330f729Sjoergdef : InstRW<[GenericWriteFPUCmp], (instregex "^C_[A-Z][A-Z][A-Z]_(S|D32|D64)_MM$")>;
9357330f729Sjoergdef : InstRW<[GenericWriteFPUCmp], (instregex "^C_NGLE_(S|D32|D64)_MM$")>;
9367330f729Sjoergdef : InstRW<[GenericWriteFPUCmp], (instrs FCMP_S32_MM, FCMP_D32_MM)>;
9377330f729Sjoerg
9387330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instrs MFC1_MM, MFHC1_D32_MM, MFHC1_D64_MM,
9397330f729Sjoerg                                  MTC1_MM, MTC1_D64_MM,
9407330f729Sjoerg                                  MTHC1_D32_MM, MTHC1_D64_MM)>;
9417330f729Sjoerg
9427330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instrs FABS_D32_MM, FABS_D64_MM, FABS_S_MM,
9437330f729Sjoerg                                  FNEG_D32_MM, FNEG_D64_MM, FNEG_S_MM,
9447330f729Sjoerg                                  FADD_D32_MM, FADD_D64_MM, FADD_S_MM,
9457330f729Sjoerg                                  FMOV_D32_MM, FMOV_D64_MM, FMOV_S_MM,
9467330f729Sjoerg                                  FMUL_D32_MM, FMUL_D64_MM, FMUL_S_MM,
9477330f729Sjoerg                                  FSUB_D32_MM, FSUB_D64_MM, FSUB_S_MM,
9487330f729Sjoerg                                  MSUB_S_MM, MSUB_D32_MM)>;
9497330f729Sjoerg
9507330f729Sjoergdef : InstRW<[GenericWriteFPUDivS], (instrs FDIV_S_MM)>;
9517330f729Sjoergdef : InstRW<[GenericWriteFPUDivD], (instrs FDIV_D32_MM, FDIV_D64_MM)>;
9527330f729Sjoerg
9537330f729Sjoergdef : InstRW<[GenericWriteFPUSqrtS], (instrs FSQRT_S_MM)>;
9547330f729Sjoergdef : InstRW<[GenericWriteFPUSqrtD], (instrs FSQRT_D32_MM, FSQRT_D64_MM)>;
9557330f729Sjoerg
9567330f729Sjoergdef : InstRW<[GenericWriteFPURcpS], (instrs RECIP_S_MM, RSQRT_S_MM)>;
9577330f729Sjoergdef : InstRW<[GenericWriteFPURcpD], (instrs RECIP_D32_MM, RECIP_D64_MM,
9587330f729Sjoerg                                     RSQRT_D32_MM, RSQRT_D64_MM)>;
9597330f729Sjoerg
9607330f729Sjoergdef : InstRW<[GenericWriteFPUStore], (instrs SDC1_MM, SWC1_MM, SUXC1_MM,
9617330f729Sjoerg                                      SWXC1_MM)>;
9627330f729Sjoerg
9637330f729Sjoergdef : InstRW<[GenericWriteFPUMoveGPRFPU], (instrs CFC1_MM, CTC1_MM)>;
9647330f729Sjoerg
9657330f729Sjoergdef : InstRW<[GenericWriteFPULoad], (instrs LDC1_MM, LUXC1_MM, LWC1_MM,
9667330f729Sjoerg                                     LWXC1_MM)>;
9677330f729Sjoerg
9687330f729Sjoerg// microMIPS32r6
9697330f729Sjoerg// =============
9707330f729Sjoerg
9717330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instrs FNEG_S_MMR6)>;
9727330f729Sjoerg
9737330f729Sjoergdef : InstRW<[GenericWriteFPUCmp], (instregex "CMP_[A-Z][A-Z]_(S|D)_MMR6")>;
9747330f729Sjoergdef : InstRW<[GenericWriteFPUCmp],
9757330f729Sjoerg             (instregex "CMP_[A-Z][A-Z][A-Z]_(S|D)_MMR6")>;
9767330f729Sjoergdef : InstRW<[GenericWriteFPUCmp],
9777330f729Sjoerg             (instregex "CMP_[A-Z][A-Z][A-Z][A-Z]_(S|D)_MMR6")>;
9787330f729Sjoerg
9797330f729Sjoergdef : InstRW<[GenericWriteFPUL],
9807330f729Sjoerg             (instregex "CVT_(L|D|S|W)_(L|D|S|L|W)_MMR6")>;
9817330f729Sjoerg
9827330f729Sjoergdef : InstRW<[GenericWriteFPUL],
9837330f729Sjoerg             (instregex "TRUNC_(L|W)_(D|S)_MMR6")>;
9847330f729Sjoerg
9857330f729Sjoergdef : InstRW<[GenericWriteFPUL],
9867330f729Sjoerg             (instregex "ROUND_(L|W)_(D|S)_MMR6")>;
9877330f729Sjoerg
9887330f729Sjoergdef : InstRW<[GenericWriteFPUL],
9897330f729Sjoerg             (instregex "FLOOR_(L|W)_(D|S)_MMR6")>;
9907330f729Sjoerg
9917330f729Sjoergdef : InstRW<[GenericWriteFPUL],
9927330f729Sjoerg             (instregex "CEIL_(L|W)_(S|D)_MMR6")>;
9937330f729Sjoerg
9947330f729Sjoergdef : InstRW<[GenericWriteFPUS],
9957330f729Sjoerg             (instrs MFC1_MMR6, MTC1_MMR6, CLASS_S_MMR6, CLASS_D_MMR6,
9967330f729Sjoerg              FADD_S_MMR6)>;
9977330f729Sjoerg
9987330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "M(IN|AX)_(S|D)_MMR6")>;
9997330f729Sjoerg
10007330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "M(IN|AX)A_(S|D)_MMR6")>;
10017330f729Sjoerg
10027330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "SEL(EQ|NE)Z_(S|D)_MMR6")>;
10037330f729Sjoerg
10047330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "SEL_(S|D)_MMR6")>;
10057330f729Sjoerg
10067330f729Sjoergdef : InstRW<[GenericWriteFPUL], (instrs RINT_S_MMR6, RINT_D_MMR6)>;
10077330f729Sjoerg
10087330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "M(ADD|SUB)F_(S|D)_MMR6")>;
10097330f729Sjoerg
10107330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instrs FMOV_S_MMR6, FMUL_S_MMR6,
10117330f729Sjoerg                                  FSUB_S_MMR6, FMOV_D_MMR6)>;
10127330f729Sjoerg
10137330f729Sjoergdef : InstRW<[GenericWriteFPUL], (instrs FDIV_S_MMR6)>;
10147330f729Sjoerg
10157330f729Sjoergdef : InstRW<[GenericWriteFPUStore], (instrs SDC1_D64_MMR6)>;
10167330f729Sjoerg
10177330f729Sjoergdef : InstRW<[GenericWriteFPULoad], (instrs LDC1_D64_MMR6)>;
10187330f729Sjoerg
10197330f729Sjoerg// MIPS64
10207330f729Sjoerg// ======
10217330f729Sjoerg
10227330f729Sjoergdef : InstRW<[GenericWriteFPUMoveGPRFPU], (instrs DMFC1, DMTC1)>;
10237330f729Sjoerg
10247330f729Sjoerg// MIPS DSP ASE, HasDSP
10257330f729Sjoerg// ====================
10267330f729Sjoerg
10277330f729Sjoergdef : InstRW<[GenericWriteStore], (instrs SWDSP)>;
10287330f729Sjoerg
10297330f729Sjoergdef : InstRW<[GenericWriteLoad], (instrs LWDSP)>;
10307330f729Sjoerg
10317330f729Sjoergdef : InstRW<[GenericWriteMove], (instrs PseudoMTLOHI_DSP)>;
10327330f729Sjoerg
10337330f729Sjoergdef GenericDSP : ProcResource<1> { let BufferSize = 1; }
10347330f729Sjoergdef GenericDSPShort : SchedWriteRes<[GenericDSP]> { let Latency = 2; }
10357330f729Sjoergdef GenericDSPLong : SchedWriteRes<[GenericDSP]> { let Latency = 6; }
10367330f729Sjoergdef GenericDSPBypass : SchedWriteRes<[GenericDSP]> { let Latency = 1; }
10377330f729Sjoergdef GenericDSPMTHILO : SchedWriteRes<[GenericDSP]> { let Latency = 5; }
10387330f729Sjoergdef GenericDSPLoad : SchedWriteRes<[GenericDSP]> { let Latency = 4; }
10397330f729Sjoergdef GenericDSPMTHLIP : SchedWriteRes<[GenericDSP]> { let Latency = 5; }
10407330f729Sjoerg
10417330f729Sjoergdef : InstRW<[GenericDSPLong], (instregex "^EXTRV_RS_W$")>;
10427330f729Sjoergdef : InstRW<[GenericDSPLong], (instregex "^EXTRV_R_W$")>;
10437330f729Sjoergdef : InstRW<[GenericDSPLong], (instregex "^EXTRV_S_H$")>;
10447330f729Sjoergdef : InstRW<[GenericDSPLong], (instregex "^EXTRV_W$")>;
10457330f729Sjoergdef : InstRW<[GenericDSPLong], (instregex "^EXTR_RS_W$")>;
10467330f729Sjoergdef : InstRW<[GenericDSPLong], (instregex "^EXTR_R_W$")>;
10477330f729Sjoergdef : InstRW<[GenericDSPLong], (instregex "^EXTR_S_H$")>;
10487330f729Sjoergdef : InstRW<[GenericDSPLong], (instregex "^EXTR_W$")>;
10497330f729Sjoergdef : InstRW<[GenericDSPLong], (instregex "^INSV$")>;
10507330f729Sjoerg
10517330f729Sjoergdef : InstRW<[GenericDSPMTHLIP], (instregex "^MTHLIP$")>;
10527330f729Sjoergdef : InstRW<[GenericDSPMTHILO], (instregex "^MTHI_DSP$")>;
10537330f729Sjoergdef : InstRW<[GenericDSPMTHILO], (instregex "^MTLO_DSP$")>;
10547330f729Sjoerg
10557330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_PH$")>;
10567330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_W$")>;
10577330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDQ_PH$")>;
10587330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDQ_S_PH$")>;
10597330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDQ_S_W$")>;
10607330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDSC$")>;
10617330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDU_QB$")>;
10627330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDU_S_QB$")>;
10637330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDWC$")>;
10647330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^BITREV$")>;
10657330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^BPOSGE32$")>;
10667330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPGU_EQ_QB$")>;
10677330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPGU_LE_QB$")>;
10687330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPGU_LT_QB$")>;
10697330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPU_EQ_QB$")>;
10707330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPU_LE_QB$")>;
10717330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPU_LT_QB$")>;
10727330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMP_EQ_PH$")>;
10737330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMP_LE_PH$")>;
10747330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMP_LT_PH$")>;
10757330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPAQ_SA_L_W$")>;
10767330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPAQ_S_W_PH$")>;
10777330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPAU_H_QBL$")>;
10787330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPAU_H_QBR$")>;
10797330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPSQ_SA_L_W$")>;
10807330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPSQ_S_W_PH$")>;
10817330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPSU_H_QBL$")>;
10827330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPSU_H_QBR$")>;
10837330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^EXTPDPV$")>;
10847330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^EXTPDP$")>;
10857330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^EXTPV$")>;
10867330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^EXTP$")>;
10877330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^LBUX$")>;
10887330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^LHX$")>;
10897330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^LWX$")>;
10907330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MADDU_DSP$")>;
10917330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MADD_DSP$")>;
10927330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MAQ_SA_W_PHL$")>;
10937330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MAQ_SA_W_PHR$")>;
10947330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MAQ_S_W_PHL$")>;
10957330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MAQ_S_W_PHR$")>;
10967330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MFHI_DSP$")>;
10977330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MFLO_DSP$")>;
10987330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MODSUB$")>;
10997330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MSUBU_DSP$")>;
11007330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MSUB_DSP$")>;
11017330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULEQ_S_W_PHL$")>;
11027330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULEQ_S_W_PHR$")>;
11037330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULEU_S_PH_QBL$")>;
11047330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULEU_S_PH_QBR$")>;
11057330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULQ_RS_PH$")>;
11067330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULSAQ_S_W_PH$")>;
11077330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULTU_DSP$")>;
11087330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULT_DSP$")>;
11097330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PACKRL_PH$")>;
11107330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PICK_PH$")>;
11117330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PICK_QB$")>;
11127330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBLA$")>;
11137330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBL$")>;
11147330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBRA$")>;
11157330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBR$")>;
11167330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEQ_W_PHL$")>;
11177330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEQ_W_PHR$")>;
11187330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBLA$")>;
11197330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBL$")>;
11207330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBRA$")>;
11217330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBR$")>;
11227330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECRQU_S_QB_PH$")>;
11237330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECRQ_PH_W$")>;
11247330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECRQ_QB_PH$")>;
11257330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECRQ_RS_PH_W$")>;
11267330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^RADDU_W_QB$")>;
11277330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^RDDSP$")>;
11287330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^REPLV_PH$")>;
11297330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^REPLV_QB$")>;
11307330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^REPL_PH$")>;
11317330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^REPL_QB$")>;
11327330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHILOV$")>;
11337330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHILO$")>;
11347330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHLLV_PH$")>;
11357330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHLLV_QB$")>;
11367330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHLLV_S_PH$")>;
11377330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHLLV_S_W$")>;
11387330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHLL_PH$")>;
11397330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHLL_QB$")>;
11407330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHLL_S_PH$")>;
11417330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHLL_S_W$")>;
11427330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_PH$")>;
11437330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_PH$")>;
11447330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_W$")>;
11457330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRA_PH$")>;
11467330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRA_R_PH$")>;
11477330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRA_R_W$")>;
11487330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRLV_QB$")>;
11497330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRL_QB$")>;
11507330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBQ_PH$")>;
11517330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBQ_S_PH$")>;
11527330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBQ_S_W$")>;
11537330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBU_QB$")>;
11547330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBU_S_QB$")>;
11557330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^WRDSP$")>;
11567330f729Sjoerg
11577330f729Sjoergdef : InstRW<[GenericDSPShort],
11587330f729Sjoerg             (instregex "^Pseudo(CMP|CMPU)_(EQ|LE|LT)_(PH|QB)$")>;
11597330f729Sjoergdef : InstRW<[GenericDSPShort],
11607330f729Sjoerg						 (instregex "^PseudoPICK_(PH|QB)$")>;
11617330f729Sjoerg
11627330f729Sjoerg// MIPS DSP R2 - hasDSP, HasDSPR2, InMicroMips
11637330f729Sjoerg// ===========================================
11647330f729Sjoerg
11657330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_QB$")>;
11667330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDQH_PH$")>;
11677330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDQH_R_PH$")>;
11687330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDQH_R_W$")>;
11697330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDQH_W$")>;
11707330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDUH_QB$")>;
11717330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDUH_R_QB$")>;
11727330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDU_PH$")>;
11737330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDU_S_PH$")>;
11747330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^APPEND$")>;
11757330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^BALIGN$")>;
11767330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPGDU_EQ_QB$")>;
11777330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPGDU_LE_QB$")>;
11787330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPGDU_LT_QB$")>;
11797330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPA_W_PH$")>;
11807330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPAQX_SA_W_PH$")>;
11817330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPAQX_S_W_PH$")>;
11827330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPAX_W_PH$")>;
11837330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPS_W_PH$")>;
11847330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPSQX_S_W_PH$")>;
11857330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPSQX_SA_W_PH$")>;
11867330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPSX_W_PH$")>;
11877330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MUL_PH$")>;
11887330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MUL_S_PH$")>;
11897330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULQ_RS_W$")>;
11907330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULQ_S_PH$")>;
11917330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULQ_S_W$")>;
11927330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULSA_W_PH$")>;
11937330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECR_QB_PH$")>;
11947330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECR_SRA_PH_W$")>;
11957330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECR_SRA_R_PH_W$")>;
11967330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PREPEND$")>;
11977330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRA_QB$")>;
11987330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRA_R_QB$")>;
11997330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_QB$")>;
12007330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_QB$")>;
12017330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRL_PH$")>;
12027330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRLV_PH$")>;
12037330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBQH_PH$")>;
12047330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBQH_R_PH$")>;
12057330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBQH_W$")>;
12067330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBQH_R_W$")>;
12077330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBU_PH$")>;
12087330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBU_S_PH$")>;
12097330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBUH_QB$")>;
12107330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBUH_R_QB$")>;
12117330f729Sjoerg
12127330f729Sjoerg// microMIPS DSP R1 - HasDSP, InMicroMips
12137330f729Sjoerg// ======================================
12147330f729Sjoerg
12157330f729Sjoergdef : InstRW<[GenericWriteLoad], (instrs LWDSP_MM)>;
12167330f729Sjoerg
12177330f729Sjoergdef : InstRW<[GenericWriteStore], (instrs SWDSP_MM)>;
12187330f729Sjoerg
12197330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_PH_MM$")>;
12207330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_W_MM$")>;
12217330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDQ_PH_MM$")>;
12227330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDQ_S_PH_MM$")>;
12237330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDQ_S_W_MM$")>;
12247330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDSC_MM$")>;
12257330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDU_QB_MM$")>;
12267330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDU_S_QB_MM$")>;
12277330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDWC_MM$")>;
12287330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^BITREV_MM$")>;
12297330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^BPOSGE32_MM$")>;
12307330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPGU_EQ_QB_MM$")>;
12317330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPGU_LE_QB_MM$")>;
12327330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPGU_LT_QB_MM$")>;
12337330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPU_EQ_QB_MM$")>;
12347330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPU_LE_QB_MM$")>;
12357330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPU_LT_QB_MM$")>;
12367330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMP_EQ_PH_MM$")>;
12377330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMP_LE_PH_MM$")>;
12387330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMP_LT_PH_MM$")>;
12397330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPAQ_SA_L_W_MM$")>;
12407330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPAQ_S_W_PH_MM$")>;
12417330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPAU_H_QBL_MM$")>;
12427330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPAU_H_QBR_MM$")>;
12437330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPSQ_SA_L_W_MM$")>;
12447330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPSQ_S_W_PH_MM$")>;
12457330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPSU_H_QBL_MM$")>;
12467330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPSU_H_QBR_MM$")>;
12477330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^EXTPDPV_MM$")>;
12487330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^EXTPDP_MM$")>;
12497330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^EXTPV_MM$")>;
12507330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^EXTP_MM$")>;
12517330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^EXTRV_RS_W_MM$")>;
12527330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^EXTRV_R_W_MM$")>;
12537330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^EXTRV_S_H_MM$")>;
12547330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^EXTRV_W_MM$")>;
12557330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^EXTR_RS_W_MM$")>;
12567330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^EXTR_R_W_MM$")>;
12577330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^EXTR_S_H_MM$")>;
12587330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^EXTR_W_MM$")>;
12597330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^INSV_MM$")>;
12607330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^LBUX_MM$")>;
12617330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^LHX_MM$")>;
12627330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^LWX_MM$")>;
12637330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MADDU_DSP_MM$")>;
12647330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MADD_DSP_MM$")>;
12657330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MAQ_SA_W_PHL_MM$")>;
12667330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MAQ_SA_W_PHR_MM$")>;
12677330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MAQ_S_W_PHL_MM$")>;
12687330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MAQ_S_W_PHR_MM$")>;
12697330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MFHI_DSP_MM$")>;
12707330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MFLO_DSP_MM$")>;
12717330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MODSUB_MM$")>;
12727330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MOVEP_MMR6$")>;
12737330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MOVN_I_MM$")>;
12747330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MOVZ_I_MM$")>;
12757330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MSUBU_DSP_MM$")>;
12767330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MSUB_DSP_MM$")>;
12777330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MTHI_DSP_MM$")>;
12787330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MTHLIP_MM$")>;
12797330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MTLO_DSP_MM$")>;
12807330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULEQ_S_W_PHL_MM$")>;
12817330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULEQ_S_W_PHR_MM$")>;
12827330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULEU_S_PH_QBL_MM$")>;
12837330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULEU_S_PH_QBR_MM$")>;
12847330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULQ_RS_PH_MM$")>;
12857330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULSAQ_S_W_PH_MM$")>;
12867330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULTU_DSP_MM$")>;
12877330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULT_DSP_MM$")>;
12887330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PACKRL_PH_MM$")>;
12897330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PICK_PH_MM$")>;
12907330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PICK_QB_MM$")>;
12917330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBLA_MM$")>;
12927330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBL_MM$")>;
12937330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBRA_MM$")>;
12947330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBR_MM$")>;
12957330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEQ_W_PHL_MM$")>;
12967330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEQ_W_PHR_MM$")>;
12977330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBLA_MM$")>;
12987330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBL_MM$")>;
12997330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBRA_MM$")>;
13007330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBR_MM$")>;
13017330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECRQU_S_QB_PH_MM$")>;
13027330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECRQ_PH_W_MM$")>;
13037330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECRQ_QB_PH_MM$")>;
13047330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECRQ_RS_PH_W_MM$")>;
13057330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^RADDU_W_QB_MM$")>;
13067330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^RDDSP_MM$")>;
13077330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^REPLV_PH_MM$")>;
13087330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^REPLV_QB_MM$")>;
13097330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^REPL_PH_MM$")>;
13107330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^REPL_QB_MM$")>;
13117330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHILOV_MM$")>;
13127330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHILO_MM$")>;
13137330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHLLV_PH_MM$")>;
13147330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHLLV_QB_MM$")>;
13157330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHLLV_S_PH_MM$")>;
13167330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHLLV_S_W_MM$")>;
13177330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHLL_PH_MM$")>;
13187330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHLL_QB_MM$")>;
13197330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHLL_S_PH_MM$")>;
13207330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHLL_S_W_MM$")>;
13217330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_PH_MM$")>;
13227330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_PH_MM$")>;
13237330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_W_MM$")>;
13247330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRA_PH_MM$")>;
13257330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRA_R_PH_MM$")>;
13267330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRA_R_W_MM$")>;
13277330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRLV_QB_MM$")>;
13287330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRL_QB_MM$")>;
13297330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBQ_PH_MM$")>;
13307330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBQ_S_PH_MM$")>;
13317330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBQ_S_W_MM$")>;
13327330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBU_QB_MM$")>;
13337330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBU_S_QB_MM$")>;
13347330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^WRDSP_MM$")>;
13357330f729Sjoerg
13367330f729Sjoerg
13377330f729Sjoerg// microMIPS DSP R2 - hasDSP, HasDSPR2, InMicroMips
13387330f729Sjoerg// ================================================
13397330f729Sjoerg
13407330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_QB_MMR2$")>;
13417330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDQH_PH_MMR2$")>;
13427330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDQH_R_PH_MMR2$")>;
13437330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDQH_R_W_MMR2$")>;
13447330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDQH_W_MMR2$")>;
13457330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDUH_QB_MMR2$")>;
13467330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDUH_R_QB_MMR2$")>;
13477330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDU_PH_MMR2$")>;
13487330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^ADDU_S_PH_MMR2$")>;
13497330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^APPEND_MMR2$")>;
13507330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^BALIGN_MMR2$")>;
13517330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPGDU_EQ_QB_MMR2$")>;
13527330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPGDU_LE_QB_MMR2$")>;
13537330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^CMPGDU_LT_QB_MMR2$")>;
13547330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPA_W_PH_MMR2$")>;
13557330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPAQX_SA_W_PH_MMR2$")>;
13567330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPAQX_S_W_PH_MMR2$")>;
13577330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPAX_W_PH_MMR2$")>;
13587330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPS_W_PH_MMR2$")>;
13597330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPSQX_S_W_PH_MMR2$")>;
13607330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPSQX_SA_W_PH_MMR2$")>;
13617330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^DPSX_W_PH_MMR2$")>;
13627330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MUL_PH_MMR2$")>;
13637330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MUL_S_PH_MMR2$")>;
13647330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULQ_RS_W_MMR2$")>;
13657330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULQ_S_PH_MMR2$")>;
13667330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULQ_S_W_MMR2$")>;
13677330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^MULSA_W_PH_MMR2$")>;
13687330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECR_QB_PH_MMR2$")>;
13697330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECR_SRA_PH_W_MMR2$")>;
13707330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PRECR_SRA_R_PH_W_MMR2$")>;
13717330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^PREPEND_MMR2$")>;
13727330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRA_QB_MMR2$")>;
13737330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRA_R_QB_MMR2$")>;
13747330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_QB_MMR2$")>;
13757330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_QB_MMR2$")>;
13767330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRL_PH_MMR2$")>;
13777330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SHRLV_PH_MMR2$")>;
13787330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBQH_PH_MMR2$")>;
13797330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBQH_R_PH_MMR2$")>;
13807330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBQH_W_MMR2$")>;
13817330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBQH_R_W_MMR2$")>;
13827330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBU_PH_MMR2$")>;
13837330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBU_S_PH_MMR2$")>;
13847330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBUH_QB_MMR2$")>;
13857330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^SUBUH_R_QB_MMR2$")>;
13867330f729Sjoerg
13877330f729Sjoerg// microMIPS DSP R3 - hasDSP, hasDSPR2, hasDSPR3, InMicroMips
13887330f729Sjoerg// ==========================================================
13897330f729Sjoerg
13907330f729Sjoergdef : InstRW<[GenericDSPShort], (instregex "^BPOSGE32C_MMR3$")>;
13917330f729Sjoerg
13927330f729Sjoerg// MIPS MSA ASE - hasMSA
13937330f729Sjoerg// =====================
13947330f729Sjoerg
13957330f729Sjoergdef GenericWriteMSAShortLogic : SchedWriteRes<[GenericIssueFPUS]>;
13967330f729Sjoergdef GenericWriteMSAShortInt : SchedWriteRes<[GenericIssueFPUS]> {
13977330f729Sjoerglet Latency = 2;
13987330f729Sjoerg}
13997330f729Sjoergdef GenericWriteMoveOtherUnitsToFPU : SchedWriteRes<[GenericIssueFPUS]>;
14007330f729Sjoergdef GenericWriteMSAOther3 : SchedWriteRes<[GenericIssueFPUS]> {
14017330f729Sjoerglet Latency = 3;
14027330f729Sjoerg}
14037330f729Sjoergdef GenericWriteMSALongInt : SchedWriteRes<[GenericIssueFPUS]> {
14047330f729Sjoerglet Latency = 5;
14057330f729Sjoerg}
14067330f729Sjoergdef GenericWriteFPUDivI : SchedWriteRes<[GenericFPQ]> {
14077330f729Sjoerg  let Latency = 33;
14087330f729Sjoerg  let ResourceCycles = [ 33 ];
14097330f729Sjoerg}
14107330f729Sjoerg
14117330f729Sjoerg// FPUS is also used in moves from floating point and MSA registers to general
14127330f729Sjoerg// purpose registers.
14137330f729Sjoergdef GenericWriteMoveFPUSToOtherUnits : SchedWriteRes<[GenericIssueFPUS]> {
14147330f729Sjoerg  let Latency = 0;
14157330f729Sjoerg}
14167330f729Sjoerg
14177330f729Sjoerg// FPUL is also used in moves from floating point and MSA registers to general
14187330f729Sjoerg// purpose registers.
14197330f729Sjoergdef GenericWriteMoveFPULToOtherUnits : SchedWriteRes<[GenericIssueFPUL]>;
14207330f729Sjoerg
14217330f729Sjoerg
14227330f729Sjoerg// adds_a.[bhwd], adds_[asu].[bhwd], addvi?.[bhwd], asub_[us].[bhwd],
14237330f729Sjoerg// aver?_[us].[bhwd]
14247330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^ADD_A_[BHWD]$")>;
14257330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^ADDS_[ASU]_[BHWD]$")>;
14267330f729Sjoerg
14277330f729Sjoerg// TODO: ADDVI_[BHW] might be 1 cycle latency rather than 2. Need to confirm it.
14287330f729Sjoerg// add.[bhwd], addvi.[bhwd], asub_[us].[bhwd], ave.[bhwd], aver.[bhwd]
14297330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^ADDVI?_[BHWD]$")>;
14307330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^ASUB_[US].[BHWD]$")>;
14317330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^AVER?_[US].[BHWD]$")>;
14327330f729Sjoerg
14337330f729Sjoerg// and.v, andi.b, move.v, ldi.[bhwd], xor.v, nor.v, xori.b, nori.b, lsa
14347330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^MOVE_V$")>;
14357330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^LDI_[BHWD]$")>;
14367330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instrs LSA)>;
14377330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(AND|OR|[XN]OR)_V$")>;
14387330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(AND|OR|[XN]OR)I_B$")>;
14397330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic],
14407330f729Sjoerg             (instregex "^(AND|OR|[XN]OR)_V_[DHW]_PSEUDO$")>;
14417330f729Sjoerg
14427330f729Sjoerg// vshf.[bhwd], binsl.[bhwd], binsr.[bhwd], insert.[bhwd], sld?.[bhwd],
14437330f729Sjoerg// bset.[bhwd], bclr.[bhwd], bneg.[bhwd], bsel_v, bseli_b
14447330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^VSHF_[BHWD]$")>;
14457330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^(BINSL|BINSLI)_[BHWD]$")>;
14467330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^(BINSR|BINSRI)_[BHWD]$")>;
14477330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^INSERT_[BHWD]$")>;
14487330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^(SLD|SLDI)_[BHWD]$")>;
14497330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^(BSET|BSETI)_[BHWD]$")>;
14507330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^(BCLR|BCLRI)_[BHWD]$")>;
14517330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^(BNEG|BNEGI)_[BHWD]$")>;
14527330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^(BSEL_V|BSELI_B)$")>;
14537330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^BMN*Z.*$")>;
14547330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt],
14557330f729Sjoerg             (instregex "^BSEL_(H|W|D|FW|FD)_PSEUDO$")>;
14567330f729Sjoerg
14577330f729Sjoerg// pcnt.[bhwd], sat_s.[bhwd], sat_u.[bhwd]
14587330f729Sjoergdef : InstRW<[GenericWriteMSAOther3], (instregex "^PCNT_[BHWD]$")>;
14597330f729Sjoergdef : InstRW<[GenericWriteMSAOther3], (instregex "^SAT_(S|U)_[BHWD]$")>;
14607330f729Sjoerg
14617330f729Sjoerg// bnz.[bhwdv], cfcmsa, ctcmsa
14627330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(BNZ|BZ)_[BHWDV]$")>;
14637330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^C(F|T)CMSA$")>;
14647330f729Sjoerg
14657330f729Sjoerg// shf.[bhw], fill[bhwd], splat?.[bhwd]
14667330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^SHF_[BHW]$")>;
14677330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^FILL_[BHWD]$")>;
14687330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^(SPLAT|SPLATI)_[BHWD]$")>;
14697330f729Sjoerg
14707330f729Sjoerg// fexp2_w, fexp2_d
14717330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FEXP2_(W|D)$")>;
14727330f729Sjoerg
14737330f729Sjoerg// compare, converts, round to int, floating point truncate.
14747330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^(CLT|CLTI)_(S|U)_[BHWD]$")>;
14757330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^(CLE|CLEI)_(S|U)_[BHWD]$")>;
14767330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^(CEQ|CEQI)_[BHWD]$")>;
14777330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_UN_(S|D)$")>;
14787330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_UEQ_(S|D)$")>;
14797330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_EQ_(S|D)$")>;
14807330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_LT_(S|D)$")>;
14817330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_ULT_(S|D)$")>;
14827330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_LE_(S|D)$")>;
14837330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_ULE_(S|D)$")>;
14847330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_F_(D|S)$")>;
14857330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_SAF_(D|S)$")>;
14867330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_SEQ_(D|S)$")>;
14877330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_SLE_(D|S)$")>;
14887330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_SLT_(D|S)$")>;
14897330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_SUEQ_(D|S)$")>;
14907330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_SULE_(D|S)$")>;
14917330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_SULT_(D|S)$")>;
14927330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_SUN_(D|S)$")>;
14937330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FS(AF|EQ|LT|LE|NE|OR)_(W|D)$")>;
14947330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FSUEQ_(W|D)$")>;
14957330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FSULE_(W|D)$")>;
14967330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FSULT_(W|D)$")>;
14977330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FSUNE_(W|D)$")>;
14987330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FSUN_(W|D)$")>;
14997330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FCAF_(W|D)$")>;
15007330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FCEQ_(W|D)$")>;
15017330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FCLE_(W|D)$")>;
15027330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FCLT_(W|D)$")>;
15037330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FCNE_(W|D)$")>;
15047330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FCOR_(W|D)$")>;
15057330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FCUEQ_(W|D)$")>;
15067330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FCULE_(W|D)$")>;
15077330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FCULT_(W|D)$")>;
15087330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FCUNE_(W|D)$")>;
15097330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FCUN_(W|D)$")>;
15107330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FABS_(W|D)$")>;
15117330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FFINT_(U|S)_(W|D)$")>;
15127330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FFQL_(W|D)$")>;
15137330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FFQR_(W|D)$")>;
15147330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FTINT_(U|S)_(W|D)$")>;
15157330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FRINT_(W|D)$")>;
15167330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FTQ_(H|W)$")>;
15177330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FTRUNC_(U|S)_(W|D)$")>;
15187330f729Sjoerg
15197330f729Sjoerg// fexdo.[hw], fexupl.[wd], fexupr.[wd]
15207330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FEXDO_(H|W)$")>;
15217330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FEXUPL_(W|D)$")>;
15227330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FEXUPR_(W|D)$")>;
15237330f729Sjoerg
15247330f729Sjoerg// fclass.[wd], fmax.[wd], fmax_a.[wd], fmin.[wd], fmin_a.[wd], flog2.[wd]
15257330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FCLASS_(W|D)$")>;
15267330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FMAX_A_(W|D)$")>;
15277330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FMAX_(W|D)$")>;
15287330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FMIN_A_(W|D)$")>;
15297330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FMIN_(W|D)$")>;
15307330f729Sjoergdef : InstRW<[GenericWriteFPUS], (instregex "^FLOG2_(W|D)$")>;
15317330f729Sjoerg
15327330f729Sjoerg// interleave right/left, interleave even/odd, insert
15337330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(ILVR|ILVL)_[BHWD]$")>;
15347330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(ILVEV|ILVOD)_[BHWD]$")>;
15357330f729Sjoerg
15367330f729Sjoerg// subs_?.[bhwd], subsus_?.[bhwd], subsuu_?.[bhwd], subvi.[bhwd], subv.[bhwd],
15377330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^SUBS_(S|U)_[BHWD]$")>;
15387330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^SUBSUS_(S|U)_[BHWD]$")>;
15397330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^SUBSUU_(S|U)_[BHWD]$")>;
15407330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^SUBVI_[BHWD]$")>;
15417330f729Sjoergdef : InstRW<[GenericWriteMSAShortInt], (instregex "^SUBV_[BHWD]$")>;
15427330f729Sjoerg
15437330f729Sjoerg// mod_[su].[bhwd], div_[su].[bhwd]
15447330f729Sjoergdef : InstRW<[GenericWriteFPUDivI], (instregex "^MOD_(S|U)_[BHWD]$")>;
15457330f729Sjoergdef : InstRW<[GenericWriteFPUDivI], (instregex "^DIV_(S|U)_[BHWD]$")>;
15467330f729Sjoerg
15477330f729Sjoerg// hadd_[su].[bhwd], hsub_[su].[bhwd], max_[sua].[bhwd], min_[sua].[bhwd],
15487330f729Sjoerg// maxi_[su].[bhwd], mini_[su].[bhwd], sra?.[bhwd], srar?.[bhwd], srlr.[bhwd],
15497330f729Sjoerg// sll?.[bhwd], pckev.[bhwd], pckod.[bhwd], nloc.[bhwd], nlzc.[bhwd],
15507330f729Sjoerg// insve.[bhwd]
15517330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^HADD_(S|U)_[BHWD]$")>;
15527330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^HSUB_(S|U)_[BHWD]$")>;
15537330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(MAX|MIN)_S_[BHWD]$")>;
15547330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(MAX|MIN)_U_[BHWD]$")>;
15557330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(MAX|MIN)_A_[BHWD]$")>;
15567330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic],
15577330f729Sjoerg             (instregex "^(MAXI|MINI)_(S|U)_[BHWD]$")>;
15587330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(SRA|SRAI)_[BHWD]$")>;
15597330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(SRL|SRLI)_[BHWD]$")>;
15607330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(SRAR|SRARI)_[BHWD]$")>;
15617330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(SRLR|SRLRI)_[BHWD]$")>;
15627330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(SLL|SLLI)_[BHWD]$")>;
15637330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(PCKEV|PCKOD)_[BHWD]$")>;
15647330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(NLOC|NLZC)_[BHWD]$")>;
15657330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^INSVE_[BHWD]$")>;
15667330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^INSERT_F(D|W)_PSEUDO$")>;
15677330f729Sjoergdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^FILL_F(D|W)_PSEUDO$")>;
15687330f729Sjoerg
15697330f729Sjoerg// dpadd_?.[bhwd], dpsub_?.[bhwd], dotp_?.[bhwd], msubv.[bhwd], maddv.[bhwd]
15707330f729Sjoerg// mulv.[bhwd].
15717330f729Sjoergdef : InstRW<[GenericWriteMSALongInt], (instregex "^DPADD_(S|U)_[HWD]$")>;
15727330f729Sjoergdef : InstRW<[GenericWriteMSALongInt], (instregex "^DPSUB_(S|U)_[HWD]$")>;
15737330f729Sjoergdef : InstRW<[GenericWriteMSALongInt], (instregex "^DOTP_(S|U)_[HWD]$")>;
15747330f729Sjoergdef : InstRW<[GenericWriteMSALongInt], (instregex "^MSUBV_[BHWD]$")>;
15757330f729Sjoergdef : InstRW<[GenericWriteMSALongInt], (instregex "^MADDV_[BHWD]$")>;
15767330f729Sjoergdef : InstRW<[GenericWriteMSALongInt], (instregex "^MULV_[BHWD]$")>;
15777330f729Sjoerg
15787330f729Sjoerg// madd?.q.[hw], msub?.q.[hw], mul?.q.[hw]
15797330f729Sjoergdef : InstRW<[GenericWriteMSALongInt], (instregex "^MADDR_Q_[HW]$")>;
15807330f729Sjoergdef : InstRW<[GenericWriteMSALongInt], (instregex "^MADD_Q_[HW]$")>;
15817330f729Sjoergdef : InstRW<[GenericWriteMSALongInt], (instregex "^MSUBR_Q_[HW]$")>;
15827330f729Sjoergdef : InstRW<[GenericWriteMSALongInt], (instregex "^MSUB_Q_[HW]$")>;
15837330f729Sjoergdef : InstRW<[GenericWriteMSALongInt], (instregex "^MULR_Q_[HW]$")>;
15847330f729Sjoergdef : InstRW<[GenericWriteMSALongInt], (instregex "^MUL_Q_[HW]$")>;
15857330f729Sjoerg
15867330f729Sjoerg// fadd.[dw], fmadd.[dw], fmul.[dw], frcp.[dw], frsqrt.[dw], fsqrt.[dw]
15877330f729Sjoerg// fsub.[dw], fdiv.[dw]
15887330f729Sjoergdef : InstRW<[GenericWriteFPUL], (instregex "^FADD_[DW]$")>;
15897330f729Sjoergdef : InstRW<[GenericWriteFPUL], (instregex "^FMADD_[DW]$")>;
15907330f729Sjoergdef : InstRW<[GenericWriteFPUL], (instregex "^FMSUB_[DW]$")>;
15917330f729Sjoergdef : InstRW<[GenericWriteFPUL], (instregex "^FMUL_[DW]$")>;
15927330f729Sjoergdef : InstRW<[GenericWriteFPUL], (instregex "^FRCP_[DW]$")>;
15937330f729Sjoergdef : InstRW<[GenericWriteFPUL], (instregex "^FRSQRT_[DW]$")>;
15947330f729Sjoergdef : InstRW<[GenericWriteFPUL], (instregex "^FSQRT_[DW]$")>;
15957330f729Sjoergdef : InstRW<[GenericWriteFPUL], (instregex "^FSUB_[DW]$")>;
15967330f729Sjoergdef : InstRW<[GenericWriteFPUL], (instregex "^FDIV_[DW]$")>;
15977330f729Sjoerg
15987330f729Sjoerg// copy.[su]_[bhwd]
15997330f729Sjoergdef : InstRW<[GenericWriteFPUMoveGPRFPU], (instregex "^COPY_U_[BHW]$")>;
16007330f729Sjoergdef : InstRW<[GenericWriteFPUMoveGPRFPU], (instregex "^COPY_S_[BHWD]$")>;
16017330f729Sjoerg
16027330f729Sjoergdef : InstRW<[GenericWriteFPUStore], (instregex "^ST_[BHWD]$")>;
16037330f729Sjoergdef : InstRW<[GenericWriteFPUStore], (instrs ST_F16)>;
16047330f729Sjoergdef : InstRW<[GenericWriteFPULoad], (instregex "^LD_[BHWD]$")>;
16057330f729Sjoergdef : InstRW<[GenericWriteFPULoad], (instrs LD_F16)>;
16067330f729Sjoerg
16077330f729Sjoerg// Atomic instructions
16087330f729Sjoerg
16097330f729Sjoerg// FIXME: Define `WriteAtomic` in the MipsSchedule.td and
16107330f729Sjoerg// attach it to the Atomic2OpsPostRA, AtomicCmpSwapPostRA, ...
16117330f729Sjoerg// classes. Then just define resources for the `WriteAtomic` in each
16127330f729Sjoerg// machine models.
16137330f729Sjoergdef GenericAtomic : ProcResource<1> { let BufferSize = 1; }
16147330f729Sjoergdef GenericWriteAtomic : SchedWriteRes<[GenericAtomic]> { let Latency = 2; }
16157330f729Sjoerg
16167330f729Sjoergdef : InstRW<[GenericWriteAtomic],
16177330f729Sjoerg    (instregex "^ATOMIC_SWAP_I(8|16|32|64)_POSTRA$")>;
16187330f729Sjoergdef : InstRW<[GenericWriteAtomic],
16197330f729Sjoerg    (instregex "^ATOMIC_CMP_SWAP_I(8|16|32|64)_POSTRA$")>;
16207330f729Sjoergdef : InstRW<[GenericWriteAtomic],
1621*82d56013Sjoerg    (instregex "^ATOMIC_LOAD_(ADD|SUB|AND|OR|XOR|NAND|MIN|MAX|UMIN|UMAX)"
1622*82d56013Sjoerg               "_I(8|16|32|64)_POSTRA$")>;
16237330f729Sjoerg}
1624