10b57cec5SDimitry Andric//=- MipsScheduleGeneric.td - Generic Scheduling Definitions -*- tablegen -*-=// 20b57cec5SDimitry Andric// 30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric// 70b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric// 90b57cec5SDimitry Andric// This file describes the interAptiv processor in a manner of speaking. It 100b57cec5SDimitry Andric// describes a hypothetical version of the in-order MIPS32R2 interAptiv with all 110b57cec5SDimitry Andric// branches of the MIPS ISAs, ASEs and ISA variants. The itinerary lists are 120b57cec5SDimitry Andric// broken down into per ISA lists, so that this file can be used to rapidly 130b57cec5SDimitry Andric// develop new schedule models. 140b57cec5SDimitry Andric// 150b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 160b57cec5SDimitry Andricdef MipsGenericModel : SchedMachineModel { 170b57cec5SDimitry Andric int IssueWidth = 1; 180b57cec5SDimitry Andric int MicroOpBufferSize = 0; 190b57cec5SDimitry Andric 200b57cec5SDimitry Andric // These figures assume an L1 hit. 210b57cec5SDimitry Andric int LoadLatency = 2; 220b57cec5SDimitry Andric int MispredictPenalty = 4; 230b57cec5SDimitry Andric 240b57cec5SDimitry Andric int HighLatency = 37; 250b57cec5SDimitry Andric list<Predicate> UnsupportedFeatures = []; 260b57cec5SDimitry Andric 270b57cec5SDimitry Andric let CompleteModel = 1; 280b57cec5SDimitry Andric let PostRAScheduler = 1; 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric // FIXME: Remove when all errors have been fixed. 310b57cec5SDimitry Andric let FullInstRWOverlapCheck = 1; 320b57cec5SDimitry Andric} 330b57cec5SDimitry Andric 340b57cec5SDimitry Andriclet SchedModel = MipsGenericModel in { 350b57cec5SDimitry Andric 360b57cec5SDimitry Andric// ALU Pipeline 370b57cec5SDimitry Andric// ============ 380b57cec5SDimitry Andric 390b57cec5SDimitry Andricdef GenericALU : ProcResource<1> { let BufferSize = 1; } 400b57cec5SDimitry Andricdef GenericIssueALU : ProcResource<1> { let Super = GenericALU; } 410b57cec5SDimitry Andric 420b57cec5SDimitry Andricdef GenericWriteALU : SchedWriteRes<[GenericIssueALU]>; 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric// add, addi, addiu, addu, and, andi, clo, clz, ext, ins, lui, nor, or, ori, 450b57cec5SDimitry Andric// rotr, rotrv, seb, seh, sll, sllv, slt, slti, sltiu, sltu, sra, srav, srl, 460b57cec5SDimitry Andric// srlv, ssnop, sub, subu, wsbh, xor, xori 470b57cec5SDimitry Andricdef : InstRW<[GenericWriteALU], (instrs ADD, ADDi, ADDiu, ADDu, AND, ANDi, 480b57cec5SDimitry Andric CLO, CLZ, EXT, INS, LEA_ADDiu, LUi, NOP, 490b57cec5SDimitry Andric NOR, OR, ORi, ROTR, ROTRV, SEB, SEH, SLL, 500b57cec5SDimitry Andric SLLV, SLT, SLTi, SLTiu, SLTu, SRA, SRAV, SRL, 510b57cec5SDimitry Andric SRLV, SSNOP, SUB, SUBu, WSBH, XOR, XORi)>; 520b57cec5SDimitry Andric 530b57cec5SDimitry Andricdef : InstRW<[GenericWriteALU], (instrs COPY)>; 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric// MIPSR6 560b57cec5SDimitry Andric// ====== 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric// addiupc, align, aluipc, aui, auipc, bitswap, clo, clz, lsa, seleqz, selnez 590b57cec5SDimitry Andricdef : InstRW<[GenericWriteALU], (instrs ADDIUPC, ALIGN, ALUIPC, AUI, 600b57cec5SDimitry Andric AUIPC, BITSWAP, CLO_R6, CLZ_R6, LSA_R6, 610b57cec5SDimitry Andric SELEQZ, SELNEZ)>; 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric// MIPS16e 640b57cec5SDimitry Andric// ======= 650b57cec5SDimitry Andric 660b57cec5SDimitry Andricdef : InstRW<[GenericWriteALU], (instrs AddiuRxImmX16, AddiuRxRxImm16, 670b57cec5SDimitry Andric AddiuRxRxImmX16, AddiuRxRyOffMemX16, 680b57cec5SDimitry Andric AddiuRxPcImmX16, AddiuSpImm16, AddiuSpImmX16, 690b57cec5SDimitry Andric AdduRxRyRz16, AndRxRxRy16, CmpRxRy16, 700b57cec5SDimitry Andric CmpiRxImm16, CmpiRxImmX16, LiRxImm16, 710b57cec5SDimitry Andric LiRxImmX16, LiRxImmAlignX16, Move32R16, 720b57cec5SDimitry Andric MoveR3216, Mfhi16, Mflo16, NegRxRy16, 730b57cec5SDimitry Andric NotRxRy16, OrRxRxRy16, SebRx16, SehRx16, 740b57cec5SDimitry Andric SllX16, SllvRxRy16, SltiRxImm16, 750b57cec5SDimitry Andric SltiRxImmX16, SltiCCRxImmX16, 760b57cec5SDimitry Andric SltiuRxImm16, SltiuRxImmX16, SltiuCCRxImmX16, 770b57cec5SDimitry Andric SltRxRy16, SltCCRxRy16, SltuRxRy16, 780b57cec5SDimitry Andric SltuRxRyRz16, SltuCCRxRy16, SravRxRy16, 790b57cec5SDimitry Andric SraX16, SrlvRxRy16, SrlX16, SubuRxRyRz16, 800b57cec5SDimitry Andric XorRxRxRy16)>; 810b57cec5SDimitry Andric 820b57cec5SDimitry Andricdef : InstRW<[GenericWriteALU], (instrs Constant32, LwConstant32, 830b57cec5SDimitry Andric GotPrologue16, CONSTPOOL_ENTRY)>; 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric// microMIPS 860b57cec5SDimitry Andric// ========= 870b57cec5SDimitry Andric 880b57cec5SDimitry Andricdef : InstRW<[GenericWriteALU], (instrs ADDIUPC_MM, ADDIUR1SP_MM, ADDIUR2_MM, 890b57cec5SDimitry Andric ADDIUS5_MM, ADDIUSP_MM, ADDU16_MM, ADD_MM, 900b57cec5SDimitry Andric ADDi_MM, ADDiu_MM, ADDu_MM, AND16_MM, 910b57cec5SDimitry Andric ANDI16_MM, AND_MM, ANDi_MM, CLO_MM, CLZ_MM, 920b57cec5SDimitry Andric EXT_MM, INS_MM, LEA_ADDiu_MM, LI16_MM, 930b57cec5SDimitry Andric LUi_MM, MOVE16_MM, MOVEP_MM, NOR_MM, 940b57cec5SDimitry Andric NOT16_MM, OR16_MM, OR_MM, ORi_MM, ROTRV_MM, 950b57cec5SDimitry Andric ROTR_MM, SEB_MM, SEH_MM, SLL16_MM, SLLV_MM, 960b57cec5SDimitry Andric SLL_MM, SLT_MM, SLTi_MM, SLTiu_MM, SLTu_MM, 970b57cec5SDimitry Andric SRAV_MM, SRA_MM, SRL16_MM, SRLV_MM, SRL_MM, 980b57cec5SDimitry Andric SSNOP_MM, SUBU16_MM, SUB_MM, SUBu_MM, 990b57cec5SDimitry Andric WSBH_MM, XOR16_MM, XOR_MM, XORi_MM)>; 1000b57cec5SDimitry Andric 1010b57cec5SDimitry Andric// microMIPS32r6 1020b57cec5SDimitry Andric// ============= 1030b57cec5SDimitry Andric 1040b57cec5SDimitry Andricdef : InstRW<[GenericWriteALU], (instrs ADDIUPC_MMR6, ADDIU_MMR6, ADDU16_MMR6, 1050b57cec5SDimitry Andric ADDU_MMR6, ADD_MMR6, ALIGN_MMR6, ALUIPC_MMR6, 1060b57cec5SDimitry Andric AND16_MMR6, ANDI16_MMR6, ANDI_MMR6, AND_MMR6, 1070b57cec5SDimitry Andric AUIPC_MMR6, AUI_MMR6, BITSWAP_MMR6, CLO_MMR6, 1080b57cec5SDimitry Andric CLZ_MMR6, EXT_MMR6, INS_MMR6, LI16_MMR6, 1090b57cec5SDimitry Andric LSA_MMR6, LUI_MMR6, MOVE16_MMR6, NOR_MMR6, 1100b57cec5SDimitry Andric NOT16_MMR6, OR16_MMR6, ORI_MMR6, OR_MMR6, 1110b57cec5SDimitry Andric SELEQZ_MMR6, SELNEZ_MMR6, SLL16_MMR6, 1120b57cec5SDimitry Andric SLL_MMR6, SRL16_MMR6, SSNOP_MMR6, SUBU16_MMR6, 1130b57cec5SDimitry Andric SUBU_MMR6, SUB_MMR6, WSBH_MMR6, XOR16_MMR6, 1140b57cec5SDimitry Andric XORI_MMR6, XOR_MMR6)>; 1150b57cec5SDimitry Andric 1160b57cec5SDimitry Andric// MIPS64 1170b57cec5SDimitry Andric// ====== 1180b57cec5SDimitry Andric 1190b57cec5SDimitry Andricdef : InstRW<[GenericWriteALU], (instrs AND64, ANDi64, DEXT64_32, DSLL64_32, 1200b57cec5SDimitry Andric ORi64, SEB64, SEH64, SLL64_32, SLL64_64, 1210b57cec5SDimitry Andric SLT64, SLTi64, SLTiu64, SLTu64, XOR64, 1220b57cec5SDimitry Andric XORi64)>; 1230b57cec5SDimitry Andric 1240b57cec5SDimitry Andricdef : InstRW<[GenericWriteALU], (instrs DADD, DADDi, DADDiu, DADDu, DCLO, 1250b57cec5SDimitry Andric DCLZ, DEXT, DEXTM, DEXTU, DINS, DINSM, DINSU, 1260b57cec5SDimitry Andric DROTR, DROTR32, DROTRV, DSBH, DSHD, DSLL, 1270b57cec5SDimitry Andric DSLL32, DSLLV, DSRA, DSRA32, DSRAV, DSRL, 1280b57cec5SDimitry Andric DSRL32, DSRLV, DSUB, DSUBu, LEA_ADDiu64, 1290b57cec5SDimitry Andric LUi64, NOR64, OR64)>; 1300b57cec5SDimitry Andric 1310b57cec5SDimitry Andric// MIPS64R6 1320b57cec5SDimitry Andric// ======== 1330b57cec5SDimitry Andric 1340b57cec5SDimitry Andricdef : InstRW<[GenericWriteALU], (instrs DALIGN, DAHI, DATI, DAUI, DCLO_R6, 1350b57cec5SDimitry Andric DCLZ_R6, DBITSWAP, DLSA, DLSA_R6, SELEQZ64, 1360b57cec5SDimitry Andric SELNEZ64)>; 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric 1390b57cec5SDimitry Andricdef GenericMDU : ProcResource<1> { let BufferSize = 1; } 1400b57cec5SDimitry Andricdef GenericIssueMDU : ProcResource<1> { let Super = GenericALU; } 1410b57cec5SDimitry Andricdef GenericIssueDIV : ProcResource<1> { let Super = GenericMDU; } 1420b57cec5SDimitry Andricdef GenericWriteHILO : SchedWriteRes<[GenericIssueMDU]>; 1430b57cec5SDimitry Andricdef GenericWriteALULong : SchedWriteRes<[GenericIssueALU]> { let Latency = 5; } 1440b57cec5SDimitry Andricdef GenericWriteMove : SchedWriteRes<[GenericIssueALU]> { let Latency = 2; } 1450b57cec5SDimitry Andricdef GenericWriteMul : SchedWriteRes<[GenericIssueMDU]> { let Latency = 4; } 1460b57cec5SDimitry Andric 1470b57cec5SDimitry Andricdef : InstRW<[GenericWriteHILO], (instrs MADD, MADDU, MSUB, MSUBU)>; 1480b57cec5SDimitry Andric 1490b57cec5SDimitry Andricdef : InstRW<[GenericWriteHILO], (instrs PseudoMADD_MM, PseudoMADDU_MM, 1500b57cec5SDimitry Andric PseudoMSUB_MM, PseudoMSUBU_MM, 1510b57cec5SDimitry Andric PseudoMULT_MM, PseudoMULTu_MM)>; 1520b57cec5SDimitry Andric 1530b57cec5SDimitry Andricdef : InstRW<[GenericWriteHILO], (instrs PseudoMADD, PseudoMADDU, PseudoMSUB, 1540b57cec5SDimitry Andric PseudoMSUBU, PseudoMULT, PseudoMULTu)>; 1550b57cec5SDimitry Andric 1560b57cec5SDimitry Andricdef GenericWriteMDUtoGPR : SchedWriteRes<[GenericIssueMDU]> { 1570b57cec5SDimitry Andric let Latency = 5; 1580b57cec5SDimitry Andric} 1590b57cec5SDimitry Andric 1600b57cec5SDimitry Andricdef GenericWriteDIV : SchedWriteRes<[GenericIssueDIV]> { 1610b57cec5SDimitry Andric // Estimated worst case 1620b57cec5SDimitry Andric let Latency = 33; 1635f757f3fSDimitry Andric let ReleaseAtCycles = [33]; 1640b57cec5SDimitry Andric} 1650b57cec5SDimitry Andricdef GenericWriteDIVU : SchedWriteRes<[GenericIssueDIV]> { 1660b57cec5SDimitry Andric // Estimated worst case 1670b57cec5SDimitry Andric let Latency = 31; 1685f757f3fSDimitry Andric let ReleaseAtCycles = [31]; 1690b57cec5SDimitry Andric} 1700b57cec5SDimitry Andric 1710b57cec5SDimitry Andric// mul 1720b57cec5SDimitry Andricdef : InstRW<[GenericWriteMDUtoGPR], (instrs MUL)>; 1730b57cec5SDimitry Andric 1740b57cec5SDimitry Andric// mult, multu 1750b57cec5SDimitry Andricdef : InstRW<[GenericWriteMul], (instrs MULT, MULTu)>; 1760b57cec5SDimitry Andric 1770b57cec5SDimitry Andric// div, sdiv 1780b57cec5SDimitry Andricdef : InstRW<[GenericWriteDIV], (instrs PseudoSDIV, SDIV)>; 1790b57cec5SDimitry Andric 1800b57cec5SDimitry Andricdef : InstRW<[GenericWriteDIVU], (instrs PseudoUDIV, UDIV)>; 1810b57cec5SDimitry Andric 1820b57cec5SDimitry Andric// mfhi, mflo, movn, mthi, mtlo, rdwhr 1830b57cec5SDimitry Andricdef : InstRW<[GenericWriteALULong], (instrs MFHI, MFLO, PseudoMFHI, 1840b57cec5SDimitry Andric PseudoMFLO)>; 1850b57cec5SDimitry Andric 1860b57cec5SDimitry Andricdef : InstRW<[GenericWriteALULong], (instrs PseudoMFHI_MM, PseudoMFLO_MM)>; 1870b57cec5SDimitry Andric 1880b57cec5SDimitry Andricdef : InstRW<[GenericWriteMove], (instrs MTHI, MTLO, RDHWR, PseudoMTLOHI)>; 1890b57cec5SDimitry Andricdef : InstRW<[GenericWriteMove], (instrs PseudoMTLOHI_MM)>; 1900b57cec5SDimitry Andric 1910b57cec5SDimitry Andricdef : InstRW<[GenericWriteALU], (instrs MOVN_I_I, MOVZ_I_I)>; 1920b57cec5SDimitry Andric 1930b57cec5SDimitry Andric// MIPSR6 1940b57cec5SDimitry Andric// ====== 1950b57cec5SDimitry Andric 1960b57cec5SDimitry Andric// muh, muhu, mulu, mul 1970b57cec5SDimitry Andricdef : InstRW<[GenericWriteMul], (instrs MUH, MUHU, MULU, MUL_R6)>; 1980b57cec5SDimitry Andric 1990b57cec5SDimitry Andric// divu, udiv 2000b57cec5SDimitry Andricdef : InstRW<[GenericWriteDIV], (instrs MOD, MODU, DIV, DIVU)>; 2010b57cec5SDimitry Andric 2020b57cec5SDimitry Andric 2030b57cec5SDimitry Andric// MIPS16e 2040b57cec5SDimitry Andric// ======= 2050b57cec5SDimitry Andric 2060b57cec5SDimitry Andricdef : InstRW<[GenericWriteHILO], (instrs MultRxRy16, MultuRxRy16, 2070b57cec5SDimitry Andric MultRxRyRz16, MultuRxRyRz16)>; 2080b57cec5SDimitry Andric 2090b57cec5SDimitry Andricdef : InstRW<[GenericWriteDIV], (instrs DivRxRy16)>; 2100b57cec5SDimitry Andric 2110b57cec5SDimitry Andricdef : InstRW<[GenericWriteDIVU], (instrs DivuRxRy16)>; 2120b57cec5SDimitry Andric 2130b57cec5SDimitry Andric// microMIPS 2140b57cec5SDimitry Andric// ========= 2150b57cec5SDimitry Andric 2160b57cec5SDimitry Andricdef : InstRW<[GenericWriteMul], (instrs MULT_MM, MULTu_MM, MADD_MM, MADDU_MM, 2170b57cec5SDimitry Andric MSUB_MM, MSUBU_MM)>; 2180b57cec5SDimitry Andric 2190b57cec5SDimitry Andricdef : InstRW<[GenericWriteALULong], (instrs MUL_MM)>; 2200b57cec5SDimitry Andric 2210b57cec5SDimitry Andricdef : InstRW<[GenericWriteDIV], (instrs SDIV_MM, SDIV_MM_Pseudo)>; 2220b57cec5SDimitry Andric 2230b57cec5SDimitry Andricdef : InstRW<[GenericWriteDIVU], (instrs UDIV_MM, UDIV_MM_Pseudo)>; 2240b57cec5SDimitry Andric 2250b57cec5SDimitry Andricdef : InstRW<[GenericWriteMove], (instrs MFHI16_MM, MFLO16_MM, MOVF_I_MM, 2260b57cec5SDimitry Andric MOVT_I_MM, MFHI_MM, MFLO_MM, MTHI_MM, 2270b57cec5SDimitry Andric MTLO_MM)>; 2280b57cec5SDimitry Andric 2290b57cec5SDimitry Andricdef : InstRW<[GenericWriteMove], (instrs RDHWR_MM)>; 2300b57cec5SDimitry Andric 2310b57cec5SDimitry Andric// microMIPS32r6 2320b57cec5SDimitry Andric// ============= 2330b57cec5SDimitry Andric 2340b57cec5SDimitry Andricdef : InstRW<[GenericWriteMul], (instrs MUHU_MMR6, MUH_MMR6, MULU_MMR6, 2350b57cec5SDimitry Andric MUL_MMR6)>; 2360b57cec5SDimitry Andric 2370b57cec5SDimitry Andricdef : InstRW<[GenericWriteDIV], (instrs MODU_MMR6, MOD_MMR6, DIVU_MMR6, 2380b57cec5SDimitry Andric DIV_MMR6)>; 2390b57cec5SDimitry Andric 2400b57cec5SDimitry Andricdef : InstRW<[GenericWriteMove], (instrs RDHWR_MMR6)>; 2410b57cec5SDimitry Andric 2420b57cec5SDimitry Andric// MIPS64 2430b57cec5SDimitry Andric// ====== 2440b57cec5SDimitry Andric 2450b57cec5SDimitry Andricdef : InstRW<[GenericWriteHILO], (instrs DMULU, DMULT, DMULTu, PseudoDMULT, 2460b57cec5SDimitry Andric PseudoDMULTu)>; 2470b57cec5SDimitry Andric 2480b57cec5SDimitry Andricdef : InstRW<[GenericWriteDIV], (instrs DSDIV, PseudoDSDIV)>; 2490b57cec5SDimitry Andric 2500b57cec5SDimitry Andricdef : InstRW<[GenericWriteDIVU], (instrs DUDIV, PseudoDUDIV)>; 2510b57cec5SDimitry Andric 2520b57cec5SDimitry Andricdef : InstRW<[GenericWriteALULong], (instrs MFHI64, MFLO64, PseudoMFHI64, 2530b57cec5SDimitry Andric PseudoMFLO64, PseudoMTLOHI64)>; 2540b57cec5SDimitry Andric 2550b57cec5SDimitry Andricdef : InstRW<[GenericWriteMove], (instrs MTHI64, MTLO64, RDHWR64)>; 2560b57cec5SDimitry Andric 2570b57cec5SDimitry Andric// mov[zn] 2580b57cec5SDimitry Andricdef : InstRW<[GenericWriteALU], (instrs MOVN_I_I64, MOVN_I64_I, MOVN_I64_I64, 2590b57cec5SDimitry Andric MOVZ_I_I64, MOVZ_I64_I, MOVZ_I64_I64)>; 2600b57cec5SDimitry Andric 2610b57cec5SDimitry Andric 2620b57cec5SDimitry Andric// MIPS64R6 2630b57cec5SDimitry Andric// ======== 2640b57cec5SDimitry Andric 2650b57cec5SDimitry Andricdef : InstRW<[GenericWriteMDUtoGPR], (instrs DMUH, DMUHU, DMUL_R6)>; 2660b57cec5SDimitry Andric 2670b57cec5SDimitry Andricdef : InstRW<[GenericWriteDIV], (instrs DDIV, DMOD)>; 2680b57cec5SDimitry Andric 2690b57cec5SDimitry Andricdef : InstRW<[GenericWriteDIVU], (instrs DDIVU, DMODU)>; 2700b57cec5SDimitry Andric 2710b57cec5SDimitry Andric// CTISTD Pipeline 2720b57cec5SDimitry Andric// --------------- 2730b57cec5SDimitry Andric 2740b57cec5SDimitry Andricdef GenericIssueCTISTD : ProcResource<1> { let Super = GenericALU; } 2750b57cec5SDimitry Andric 2760b57cec5SDimitry Andricdef GenericLDST : ProcResource<1> { let BufferSize = 1; } 2770b57cec5SDimitry Andricdef GenericIssueLDST : ProcResource<1> { let Super = GenericLDST; } 2780b57cec5SDimitry Andric 2790b57cec5SDimitry Andricdef GenericWriteJump : SchedWriteRes<[GenericIssueCTISTD]>; 2800b57cec5SDimitry Andricdef GenericWriteJumpAndLink : SchedWriteRes<[GenericIssueCTISTD]> { 2810b57cec5SDimitry Andric let Latency = 2; 2820b57cec5SDimitry Andric} 2830b57cec5SDimitry Andric 2840b57cec5SDimitry Andric// b, beq, beql, bg[et]z, bl[et]z, bne, bnel, j, syscall, jal, bltzal, jalx, 2850b57cec5SDimitry Andric// jalr, jr.hb, jr, jalr.hb, jarlc, jialc 2860b57cec5SDimitry Andricdef : InstRW<[GenericWriteJump], (instrs B, BAL, BAL_BR, BEQ, BNE, BGTZ, BGEZ, 2870b57cec5SDimitry Andric BLEZ, BLTZ, BLTZAL, J, JALX, JR, JR_HB, ERET, 288*0fca6ea1SDimitry Andric ERet, ERETNC, DERET, NAL)>; 2890b57cec5SDimitry Andric 2900b57cec5SDimitry Andricdef : InstRW<[GenericWriteJump], (instrs BEQL, BNEL, BGEZL, BGTZL, BLEZL, 2910b57cec5SDimitry Andric BLTZL)>; 2920b57cec5SDimitry Andric 2930b57cec5SDimitry Andricdef : InstRW<[GenericWriteJump], (instrs TAILCALL, TAILCALLREG, 2940b57cec5SDimitry Andric TAILCALLREGHB, PseudoIndirectBranch, 2950b57cec5SDimitry Andric PseudoIndirectHazardBranch, PseudoReturn, 2960b57cec5SDimitry Andric RetRA)>; 2970b57cec5SDimitry Andric 2980b57cec5SDimitry Andricdef : InstRW<[GenericWriteJumpAndLink], (instrs BGEZAL, JAL, JALR, JALR_HB, 2990b57cec5SDimitry Andric JALRHBPseudo, JALRPseudo)>; 3000b57cec5SDimitry Andric 3010b57cec5SDimitry Andricdef : InstRW<[GenericWriteJumpAndLink], (instrs BGEZALL, BLTZALL)>; 3020b57cec5SDimitry Andric 3030b57cec5SDimitry Andricdef GenericWriteTrap : SchedWriteRes<[GenericIssueCTISTD]>; 3040b57cec5SDimitry Andric 3050b57cec5SDimitry Andricdef : InstRW<[GenericWriteTrap], (instrs BREAK, SYSCALL, TEQ, TEQI, 3060b57cec5SDimitry Andric TGE, TGEI, TGEIU, TGEU, TNE, 3070b57cec5SDimitry Andric TNEI, TLT, TLTI, TLTU, TTLTIU, 3080b57cec5SDimitry Andric TRAP, SDBBP)>; 3090b57cec5SDimitry Andric 3100b57cec5SDimitry Andric// MIPSR6 3110b57cec5SDimitry Andric// ====== 3120b57cec5SDimitry Andric 3130b57cec5SDimitry Andricdef : InstRW<[GenericWriteJumpAndLink], (instrs BALC, BEQZALC, BGEZALC, 3140b57cec5SDimitry Andric BGTZALC, BLEZALC, BLTZALC, 3150b57cec5SDimitry Andric BNEZALC, 3160b57cec5SDimitry Andric JIALC)>; 3170b57cec5SDimitry Andric 3180b57cec5SDimitry Andricdef : InstRW<[GenericWriteJump], (instrs BC, BC2EQZ, BC2NEZ, BEQC, BEQZC, BGEC, 3190b57cec5SDimitry Andric BGEUC, BGEZC, BGTZC, BLEZC, BLTC, BLTUC, 3200b57cec5SDimitry Andric BLTZC, BNEC, BNEZC, BNVC, BOVC, JIC, JR_HB_R6, 3210b57cec5SDimitry Andric SIGRIE, PseudoIndirectBranchR6, 3220b57cec5SDimitry Andric PseudoIndrectHazardBranchR6)>; 3230b57cec5SDimitry Andric 3240b57cec5SDimitry Andricdef : InstRW<[GenericWriteJump], (instrs TAILCALLR6REG, TAILCALLHBR6REG)>; 3250b57cec5SDimitry Andric 3260b57cec5SDimitry Andricdef : InstRW<[GenericWriteTrap], (instrs SDBBP_R6)>; 3270b57cec5SDimitry Andric 3280b57cec5SDimitry Andric// MIPS16e 3290b57cec5SDimitry Andric// ======= 3300b57cec5SDimitry Andric 3310b57cec5SDimitry Andricdef : InstRW<[GenericWriteJump], (instrs Bimm16, BimmX16, BeqzRxImm16, 3320b57cec5SDimitry Andric BeqzRxImmX16, BnezRxImm16, BnezRxImmX16, 3330b57cec5SDimitry Andric Bteqz16, BteqzX16, BteqzT8CmpX16, 3340b57cec5SDimitry Andric BteqzT8CmpiX16, BteqzT8SltX16, 3350b57cec5SDimitry Andric BteqzT8SltuX16, BteqzT8SltiX16, 3360b57cec5SDimitry Andric BteqzT8SltiuX16, Btnez16, BtnezX16, 3370b57cec5SDimitry Andric BtnezT8CmpX16, BtnezT8CmpiX16, 3380b57cec5SDimitry Andric BtnezT8SltX16, BtnezT8SltuX16, 3390b57cec5SDimitry Andric BtnezT8SltiX16, BtnezT8SltiuX16, JrRa16, 3400b57cec5SDimitry Andric JrcRa16, JrcRx16, RetRA16)>; 3410b57cec5SDimitry Andric 3420b57cec5SDimitry Andricdef : InstRW<[GenericWriteJumpAndLink], (instrs Jal16, JalB16, JumpLinkReg16)>; 3430b57cec5SDimitry Andric 3440b57cec5SDimitry Andricdef : InstRW<[GenericWriteTrap], (instrs Break16)>; 3450b57cec5SDimitry Andric 3460b57cec5SDimitry Andricdef : InstRW<[GenericWriteALULong], (instrs SelBeqZ, SelTBteqZCmp, 3470b57cec5SDimitry Andric SelTBteqZCmpi, SelTBteqZSlt, 3480b57cec5SDimitry Andric SelTBteqZSlti, SelTBteqZSltu, 3490b57cec5SDimitry Andric SelTBteqZSltiu, SelBneZ, SelTBtneZCmp, 3500b57cec5SDimitry Andric SelTBtneZCmpi, SelTBtneZSlt, 3510b57cec5SDimitry Andric SelTBtneZSlti, SelTBtneZSltu, 3520b57cec5SDimitry Andric SelTBtneZSltiu)>; 3530b57cec5SDimitry Andric 3540b57cec5SDimitry Andric// microMIPS 3550b57cec5SDimitry Andric// ========= 3560b57cec5SDimitry Andric 3570b57cec5SDimitry Andricdef : InstRW<[GenericWriteJump], (instrs B16_MM, BAL_BR_MM, BC1F_MM, BC1T_MM, 3580b57cec5SDimitry Andric BEQZ16_MM, BEQZC_MM, BEQ_MM, BGEZ_MM, 3590b57cec5SDimitry Andric BGTZ_MM, BLEZ_MM, BLTZ_MM, BNEZ16_MM, 3600b57cec5SDimitry Andric BNEZC_MM, BNE_MM, B_MM, DERET_MM, ERET_MM, 3610b57cec5SDimitry Andric JR16_MM, JR_MM, J_MM, B_MM_Pseudo)>; 3620b57cec5SDimitry Andric 3630b57cec5SDimitry Andricdef : InstRW<[GenericWriteJumpAndLink], (instrs BGEZALS_MM, BGEZAL_MM, 3640b57cec5SDimitry Andric BLTZALS_MM, BLTZAL_MM, JALR16_MM, 3650b57cec5SDimitry Andric JALRS16_MM, JALRS_MM, JALR_MM, 3660b57cec5SDimitry Andric JALS_MM, JALX_MM, JAL_MM)>; 3670b57cec5SDimitry Andric 3680b57cec5SDimitry Andricdef : InstRW<[GenericWriteJump], (instrs TAILCALLREG_MM, TAILCALL_MM, 3690b57cec5SDimitry Andric PseudoIndirectBranch_MM)>; 3700b57cec5SDimitry Andric 3710b57cec5SDimitry Andricdef : InstRW<[GenericWriteTrap], (instrs BREAK16_MM, BREAK_MM, SDBBP16_MM, 3720b57cec5SDimitry Andric SDBBP_MM, SYSCALL_MM, TEQI_MM, TEQ_MM, 3730b57cec5SDimitry Andric TGEIU_MM, TGEI_MM, TGEU_MM, TGE_MM, TLTIU_MM, 3740b57cec5SDimitry Andric TLTI_MM, TLTU_MM, TLT_MM, TNEI_MM, TNE_MM, 3750b57cec5SDimitry Andric TRAP_MM)>; 3760b57cec5SDimitry Andric 3770b57cec5SDimitry Andric// microMIPS32r6 3780b57cec5SDimitry Andric// ============= 3790b57cec5SDimitry Andric 3800b57cec5SDimitry Andricdef : InstRW<[GenericWriteJump], (instrs BC16_MMR6, BC1EQZC_MMR6, BC1NEZC_MMR6, 3810b57cec5SDimitry Andric BC2EQZC_MMR6, BC2NEZC_MMR6, BC_MMR6, 3820b57cec5SDimitry Andric BEQC_MMR6, BEQZC16_MMR6, BEQZC_MMR6, 3830b57cec5SDimitry Andric BGEC_MMR6, BGEUC_MMR6, BGEZC_MMR6, 3840b57cec5SDimitry Andric BGTZC_MMR6, BLEZC_MMR6, BLTC_MMR6, 3850b57cec5SDimitry Andric BLTUC_MMR6, BLTZC_MMR6, BNEC_MMR6, 3860b57cec5SDimitry Andric BNEZC16_MMR6, BNEZC_MMR6, BNVC_MMR6, 3870b57cec5SDimitry Andric BOVC_MMR6, DERET_MMR6, ERETNC_MMR6, JAL_MMR6, 3880b57cec5SDimitry Andric ERET_MMR6, JIC_MMR6, JRADDIUSP, JRC16_MM, 3890b57cec5SDimitry Andric JRC16_MMR6, JRCADDIUSP_MMR6, SIGRIE_MMR6, 3900b57cec5SDimitry Andric B_MMR6_Pseudo, PseudoIndirectBranch_MMR6)>; 3910b57cec5SDimitry Andric 3920b57cec5SDimitry Andricdef : InstRW<[GenericWriteJumpAndLink], (instrs BALC_MMR6, BEQZALC_MMR6, 3930b57cec5SDimitry Andric BGEZALC_MMR6, BGTZALC_MMR6, 3940b57cec5SDimitry Andric BLEZALC_MMR6, BLTZALC_MMR6, 3950b57cec5SDimitry Andric BNEZALC_MMR6, JALRC16_MMR6, 3960b57cec5SDimitry Andric JALRC_HB_MMR6, JALRC_MMR6, 3970b57cec5SDimitry Andric JIALC_MMR6)>; 3980b57cec5SDimitry Andric 3990b57cec5SDimitry Andricdef : InstRW<[GenericWriteJump], (instrs TAILCALLREG_MMR6, TAILCALL_MMR6)>; 4000b57cec5SDimitry Andric 4010b57cec5SDimitry Andricdef : InstRW<[GenericWriteTrap], (instrs BREAK16_MMR6, BREAK_MMR6, SDBBP_MMR6, 4020b57cec5SDimitry Andric SDBBP16_MMR6)>; 4030b57cec5SDimitry Andric 4040b57cec5SDimitry Andric// MIPS64 4050b57cec5SDimitry Andric// ====== 4060b57cec5SDimitry Andric 4070b57cec5SDimitry Andricdef : InstRW<[GenericWriteJump], (instrs BEQ64, BGEZ64, BGTZ64, BLEZ64, 4080b57cec5SDimitry Andric BLTZ64, BNE64, JR64)>; 4090b57cec5SDimitry Andric 4100b57cec5SDimitry Andricdef : InstRW<[GenericWriteJumpAndLink], (instrs JALR64, JALR64Pseudo, 4110b57cec5SDimitry Andric JALRHB64Pseudo, JALR_HB64)>; 4120b57cec5SDimitry Andric 4130b57cec5SDimitry Andricdef : InstRW<[GenericWriteJump], (instrs JR_HB64, TAILCALLREG64, 4140b57cec5SDimitry Andric TAILCALLREGHB64, PseudoReturn64)>; 4150b57cec5SDimitry Andric 4160b57cec5SDimitry Andric// MIPS64R6 4170b57cec5SDimitry Andric// ======== 4180b57cec5SDimitry Andric 4190b57cec5SDimitry Andricdef : InstRW<[GenericWriteJump], (instrs BEQC64, BEQZC64, BGEC64, BGEUC64, 4200b57cec5SDimitry Andric BGEZC64, BGTZC64, BLEZC64, BLTC64, BLTUC64, 4210b57cec5SDimitry Andric BLTZC64, BNEC64, BNEZC64, JIC64, 4220b57cec5SDimitry Andric PseudoIndirectBranch64, 4230b57cec5SDimitry Andric PseudoIndirectHazardBranch64)>; 4240b57cec5SDimitry Andric 4250b57cec5SDimitry Andricdef : InstRW<[GenericWriteJumpAndLink], (instrs JIALC64)>; 4260b57cec5SDimitry Andric 4270b57cec5SDimitry Andricdef : InstRW<[GenericWriteJump], (instrs JR_HB64_R6, TAILCALL64R6REG, 4280b57cec5SDimitry Andric TAILCALLHB64R6REG, PseudoIndirectBranch64R6, 4290b57cec5SDimitry Andric PseudoIndrectHazardBranch64R6)>; 4300b57cec5SDimitry Andric 4310b57cec5SDimitry Andric// COP0 Pipeline 4320b57cec5SDimitry Andric// ============= 4330b57cec5SDimitry Andric 4340b57cec5SDimitry Andricdef GenericCOP0 : ProcResource<1> { let BufferSize = 1; } 4350b57cec5SDimitry Andric 4360b57cec5SDimitry Andricdef GenericIssueCOP0 : ProcResource<1> { let Super = GenericCOP0; } 4370b57cec5SDimitry Andricdef GenericWriteCOP0TLB : SchedWriteRes<[GenericIssueCOP0]> { let Latency = 4; } 4380b57cec5SDimitry Andricdef GenericWriteCOP0 : SchedWriteRes<[GenericIssueCOP0]> { let Latency = 3; } 4390b57cec5SDimitry Andricdef GenericReadCOP0 : SchedWriteRes<[GenericIssueCOP0]> { let Latency = 2; } 4400b57cec5SDimitry Andricdef GenericReadWritePGPR : SchedWriteRes<[GenericIssueCOP0]>; 4410b57cec5SDimitry Andricdef GenericReadWriteCOP0Long : SchedWriteRes<[GenericIssueCOP0]> { 4420b57cec5SDimitry Andric let Latency = 5; 4430b57cec5SDimitry Andric} 4440b57cec5SDimitry Andricdef GenericWriteCOP0Short : SchedWriteRes<[GenericIssueCOP0]>; 4450b57cec5SDimitry Andric 4460b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0TLB], (instrs TLBP, TLBR, TLBWI, TLBWR)>; 4470b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0TLB], (instrs TLBINV, TLBINVF)>; 4480b57cec5SDimitry Andric 4490b57cec5SDimitry Andricdef : InstRW<[GenericReadCOP0], (instrs MFC0)>; 4500b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0], (instrs MTC0)>; 4510b57cec5SDimitry Andric 4520b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0], (instrs EVP, DVP)>; 4530b57cec5SDimitry Andric 4540b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0], (instrs DI, EI)>; 4550b57cec5SDimitry Andric 4560b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0], (instrs EHB, PAUSE, WAIT)>; 4570b57cec5SDimitry Andric 4580b57cec5SDimitry Andric// microMIPS 4590b57cec5SDimitry Andric// ========= 4600b57cec5SDimitry Andric 4610b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0TLB], (instrs TLBP_MM, TLBR_MM, TLBWI_MM, 4620b57cec5SDimitry Andric TLBWR_MM)>; 4630b57cec5SDimitry Andric 4640b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0], (instrs DI_MM, EI_MM)>; 4650b57cec5SDimitry Andric 4660b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0], (instrs EHB_MM, PAUSE_MM, WAIT_MM)>; 4670b57cec5SDimitry Andric 4680b57cec5SDimitry Andric 4690b57cec5SDimitry Andric// microMIPS32R6 4700b57cec5SDimitry Andric// ============= 4710b57cec5SDimitry Andric 4720b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0], (instrs RDPGPR_MMR6, WRPGPR_MMR6)>; 4730b57cec5SDimitry Andric 4740b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0TLB], (instrs TLBINV_MMR6, TLBINVF_MMR6)>; 4750b57cec5SDimitry Andric 4760b57cec5SDimitry Andricdef : InstRW<[GenericReadCOP0], (instrs MFHC0_MMR6, MFC0_MMR6, MFHC2_MMR6, 4770b57cec5SDimitry Andric MFC2_MMR6)>; 4780b57cec5SDimitry Andric 4790b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0], (instrs MTHC0_MMR6, MTC0_MMR6, MTHC2_MMR6, 4800b57cec5SDimitry Andric MTC2_MMR6)>; 4810b57cec5SDimitry Andric 4820b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0], (instrs EVP_MMR6, DVP_MMR6)>; 4830b57cec5SDimitry Andric 4840b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0], (instrs DI_MMR6, EI_MMR6)>; 4850b57cec5SDimitry Andric 4860b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0], (instrs EHB_MMR6, PAUSE_MMR6, WAIT_MMR6)>; 4870b57cec5SDimitry Andric 4880b57cec5SDimitry Andric// MIPS64 4890b57cec5SDimitry Andric// ====== 4900b57cec5SDimitry Andric 4910b57cec5SDimitry Andricdef : InstRW<[GenericReadCOP0], (instrs DMFC0)>; 4920b57cec5SDimitry Andric 4930b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0], (instrs DMTC0)>; 4940b57cec5SDimitry Andric 4950b57cec5SDimitry Andric 4960b57cec5SDimitry Andricdef GenericCOP2 : ProcResource<1> { let BufferSize = 1; } 4970b57cec5SDimitry Andricdef GenericWriteCOPOther : SchedWriteRes<[GenericCOP2]>; 4980b57cec5SDimitry Andric 4990b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOPOther], (instrs MFC2, MTC2)>; 5000b57cec5SDimitry Andric 5010b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOPOther], (instrs DMFC2, DMTC2)>; 5020b57cec5SDimitry Andric 5030b57cec5SDimitry Andric// microMIPS32R6 5040b57cec5SDimitry Andric// ============= 5050b57cec5SDimitry Andric 5060b57cec5SDimitry Andric// The latency and repeat rate of these instructions are implementation 5070b57cec5SDimitry Andric// dependant. 5080b57cec5SDimitry Andricdef : InstRW<[GenericWriteMove], (instrs CFC2_MM, CTC2_MM)>; 5090b57cec5SDimitry Andric 5100b57cec5SDimitry Andric 5110b57cec5SDimitry Andric// MIPS MT ASE - hasMT 5120b57cec5SDimitry Andric// ==================== 5130b57cec5SDimitry Andric 5140b57cec5SDimitry Andricdef : InstRW<[GenericWriteMove], (instrs DMT, DVPE, EMT, EVPE, MFTR, 5150b57cec5SDimitry Andric MTTR)>; 5160b57cec5SDimitry Andric 5170b57cec5SDimitry Andricdef : InstRW<[GenericReadWriteCOP0Long], (instrs YIELD)>; 5180b57cec5SDimitry Andric 5190b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0Short], (instrs FORK)>; 5200b57cec5SDimitry Andric 5210b57cec5SDimitry Andric// MIPS Virtualization ASE 5220b57cec5SDimitry Andric// ======================= 5230b57cec5SDimitry Andric 5240b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0Short], (instrs HYPCALL, TLBGINV, TLBGINVF, TLBGP, 5250b57cec5SDimitry Andric TLBGR, TLBGWI, TLBGWR, MFGC0, MFHGC0, 5260b57cec5SDimitry Andric MTGC0, MTHGC0)>; 5270b57cec5SDimitry Andric 5280b57cec5SDimitry Andric// MIPS64 Virtualization ASE 5290b57cec5SDimitry Andric// ========================= 5300b57cec5SDimitry Andric 5310b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0Short], (instrs DMFGC0, DMTGC0)>; 5320b57cec5SDimitry Andric 5330b57cec5SDimitry Andric// microMIPS virtualization ASE 5340b57cec5SDimitry Andric// ============================ 5350b57cec5SDimitry Andric 5360b57cec5SDimitry Andricdef : InstRW<[GenericWriteCOP0Short], (instrs HYPCALL_MM, TLBGINVF_MM, 5370b57cec5SDimitry Andric TLBGINV_MM, TLBGP_MM, TLBGR_MM, 5380b57cec5SDimitry Andric TLBGWI_MM, TLBGWR_MM, MFGC0_MM, 5390b57cec5SDimitry Andric MFHGC0_MM, MTGC0_MM, MTHGC0_MM)>; 5400b57cec5SDimitry Andric 5410b57cec5SDimitry Andric// LDST Pipeline 5420b57cec5SDimitry Andric// ------------- 5430b57cec5SDimitry Andric 5440b57cec5SDimitry Andricdef GenericWriteLoad : SchedWriteRes<[GenericIssueLDST]> { 5450b57cec5SDimitry Andric let Latency = 2; 5460b57cec5SDimitry Andric} 5470b57cec5SDimitry Andric 5480b57cec5SDimitry Andricdef GenericWritePref : SchedWriteRes<[GenericIssueLDST]>; 5490b57cec5SDimitry Andricdef GenericWriteSync : SchedWriteRes<[GenericIssueLDST]>; 5500b57cec5SDimitry Andricdef GenericWriteCache : SchedWriteRes<[GenericIssueLDST]> { let Latency = 5; } 5510b57cec5SDimitry Andric 5520b57cec5SDimitry Andricdef GenericWriteStore : SchedWriteRes<[GenericIssueLDST]>; 5530b57cec5SDimitry Andricdef GenericWriteStoreSC : SchedWriteRes<[GenericIssueLDST]> { let Latency = 2; } 5540b57cec5SDimitry Andric 5550b57cec5SDimitry Andricdef GenericWriteGPRFromBypass : SchedWriteRes<[GenericIssueLDST]> { 5560b57cec5SDimitry Andric let Latency = 2; 5570b57cec5SDimitry Andric} 5580b57cec5SDimitry Andric 5590b57cec5SDimitry Andricdef GenericWriteStoreFromOtherUnits : SchedWriteRes<[GenericIssueLDST]>; 5600b57cec5SDimitry Andricdef GenericWriteLoadToOtherUnits : SchedWriteRes<[GenericIssueLDST]> { 5610b57cec5SDimitry Andric let Latency = 0; 5620b57cec5SDimitry Andric} 5630b57cec5SDimitry Andric 5640b57cec5SDimitry Andric// l[bhw], l[bh]u, ll 5650b57cec5SDimitry Andricdef : InstRW<[GenericWriteLoad], (instrs LB, LBu, LH, LHu, LW, LL, 5660b57cec5SDimitry Andric LWC2, LWC3, LDC2, LDC3)>; 5670b57cec5SDimitry Andric 5680b57cec5SDimitry Andric// lw[lr] 5690b57cec5SDimitry Andricdef : InstRW<[GenericWriteLoad], (instrs LWL, LWR)>; 5700b57cec5SDimitry Andric 5710b57cec5SDimitry Andric// s[bhw], sc, s[dw]c[23] 5720b57cec5SDimitry Andricdef : InstRW<[GenericWriteStore], (instrs SB, SH, SW, SWC2, SWC3, 5730b57cec5SDimitry Andric SDC2, SDC3)>; 5740b57cec5SDimitry Andric 5750b57cec5SDimitry Andric// PreMIPSR6 sw[lr] 5760b57cec5SDimitry Andricdef : InstRW<[GenericWriteStore], (instrs SWL, SWR)>; 5770b57cec5SDimitry Andric 5780b57cec5SDimitry Andricdef : InstRW<[GenericWriteStoreSC], (instrs SC, SC_MMR6)>; 5790b57cec5SDimitry Andric 5800b57cec5SDimitry Andric// pref 5810b57cec5SDimitry Andricdef : InstRW<[GenericWritePref], (instrs PREF)>; 5820b57cec5SDimitry Andric// cache 5830b57cec5SDimitry Andricdef : InstRW<[GenericWriteCache], (instrs CACHE)>; 5840b57cec5SDimitry Andric 5850b57cec5SDimitry Andric// sync 5860b57cec5SDimitry Andricdef : InstRW<[GenericWriteSync], (instrs SYNC, SYNCI)>; 5870b57cec5SDimitry Andric 5880b57cec5SDimitry Andric// MIPSR6 5890b57cec5SDimitry Andric// ====== 5900b57cec5SDimitry Andric 5910b57cec5SDimitry Andricdef : InstRW<[GenericWriteLoad], (instrs LDC2_R6, LL_R6, LWC2_R6, LWPC)>; 5920b57cec5SDimitry Andric 5930b57cec5SDimitry Andricdef : InstRW<[GenericWriteStore], (instrs SWC2_R6, SDC2_R6)>; 5940b57cec5SDimitry Andric 5950b57cec5SDimitry Andricdef : InstRW<[GenericWriteStoreSC], (instrs SC_R6)>; 5960b57cec5SDimitry Andric 5970b57cec5SDimitry Andricdef : InstRW<[GenericWritePref], (instrs PREF_R6)>; 5980b57cec5SDimitry Andric 5990b57cec5SDimitry Andricdef : InstRW<[GenericWriteCache], (instrs CACHE_R6)>; 6000b57cec5SDimitry Andric 6010b57cec5SDimitry Andricdef : InstRW<[GenericWriteSync], (instrs GINVI, GINVT)>; 6020b57cec5SDimitry Andric 6030b57cec5SDimitry Andric// MIPS32 EVA 6040b57cec5SDimitry Andric// ========== 6050b57cec5SDimitry Andric 6060b57cec5SDimitry Andricdef : InstRW<[GenericWriteLoad], (instrs LBE, LBuE, LHE, LHuE, LWE, 6070b57cec5SDimitry Andric LLE)>; 6080b57cec5SDimitry Andric 6090b57cec5SDimitry Andricdef : InstRW<[GenericWriteStore], (instrs SBE, SHE, SWE, SCE)>; 6100b57cec5SDimitry Andric 6110b57cec5SDimitry Andricdef : InstRW<[GenericWriteLoad], (instrs LWLE, LWRE)>; 6120b57cec5SDimitry Andric 6130b57cec5SDimitry Andricdef : InstRW<[GenericWriteStore], (instrs SWLE, SWRE)>; 6140b57cec5SDimitry Andric 6150b57cec5SDimitry Andricdef : InstRW<[GenericWritePref], (instrs PREFE)>; 6160b57cec5SDimitry Andric 6170b57cec5SDimitry Andricdef : InstRW<[GenericWriteCache], (instrs CACHEE)>; 6180b57cec5SDimitry Andric 6190b57cec5SDimitry Andric// microMIPS EVA ASE - InMicroMipsMode, hasEVA 6200b57cec5SDimitry Andric// =========================================== 6210b57cec5SDimitry Andric 6220b57cec5SDimitry Andricdef : InstRW<[GenericWriteLoad], (instrs LBE_MM, LBuE_MM, LHE_MM, LHuE_MM, 6230b57cec5SDimitry Andric LWE_MM, LWLE_MM, LWRE_MM, LLE_MM)>; 6240b57cec5SDimitry Andric 6250b57cec5SDimitry Andricdef : InstRW<[GenericWriteStore], (instrs SBE_MM, SB_MM, SHE_MM, SWE_MM, 6260b57cec5SDimitry Andric SWLE_MM, SWRE_MM, SCE_MM)>; 6270b57cec5SDimitry Andric 6280b57cec5SDimitry Andricdef : InstRW<[GenericWritePref], (instrs PREFE_MM)>; 6290b57cec5SDimitry Andricdef : InstRW<[GenericWriteCache], (instrs CACHEE_MM)>; 6300b57cec5SDimitry Andric 6310b57cec5SDimitry Andric 6320b57cec5SDimitry Andric// MIPS16e 6330b57cec5SDimitry Andric// ======= 6340b57cec5SDimitry Andric 6350b57cec5SDimitry Andricdef : InstRW<[GenericWriteLoad], (instrs Restore16, RestoreX16, 6360b57cec5SDimitry Andric LbRxRyOffMemX16, 6370b57cec5SDimitry Andric LbuRxRyOffMemX16, LhRxRyOffMemX16, 6380b57cec5SDimitry Andric LhuRxRyOffMemX16, LwRxRyOffMemX16, 6390b57cec5SDimitry Andric LwRxSpImmX16, LwRxPcTcp16, LwRxPcTcpX16)>; 6400b57cec5SDimitry Andric 6410b57cec5SDimitry Andricdef : InstRW<[GenericWriteStore], (instrs Save16, SaveX16, SbRxRyOffMemX16, 6420b57cec5SDimitry Andric ShRxRyOffMemX16, SwRxRyOffMemX16, 6430b57cec5SDimitry Andric SwRxSpImmX16)>; 6440b57cec5SDimitry Andric 6450b57cec5SDimitry Andric// microMIPS 6460b57cec5SDimitry Andric// ========= 6470b57cec5SDimitry Andric 6480b57cec5SDimitry Andricdef : InstRW<[GenericWriteLoad], (instrs LBU16_MM, LB_MM, LBu_MM, LHU16_MM, 6490b57cec5SDimitry Andric LH_MM, LHu_MM, LL_MM, LW16_MM, LWGP_MM, 6500b57cec5SDimitry Andric LWL_MM, LWM16_MM, LWM32_MM, LWP_MM, LWR_MM, 6510b57cec5SDimitry Andric LWSP_MM, LWU_MM, LWXS_MM, LW_MM)>; 6520b57cec5SDimitry Andric 6530b57cec5SDimitry Andricdef : InstRW<[GenericWriteStore], (instrs SB16_MM, SC_MM, SH16_MM, SH_MM, 6540b57cec5SDimitry Andric SW16_MM, SWL_MM, SWM16_MM, SWM32_MM, SWM_MM, 6550b57cec5SDimitry Andric SWP_MM, SWR_MM, SWSP_MM, SW_MM)>; 6560b57cec5SDimitry Andric 6570b57cec5SDimitry Andric 6580b57cec5SDimitry Andricdef : InstRW<[GenericWritePref], (instrs PREF_MM, PREFX_MM)>; 6590b57cec5SDimitry Andric 6600b57cec5SDimitry Andricdef : InstRW<[GenericWriteCache], (instrs CACHE_MM)>; 6610b57cec5SDimitry Andric 6620b57cec5SDimitry Andricdef : InstRW<[GenericWriteSync], (instrs SYNC_MM, SYNCI_MM)>; 6630b57cec5SDimitry Andricdef : InstRW<[GenericWriteSync], (instrs GINVI_MMR6, GINVT_MMR6)>; 6640b57cec5SDimitry Andric 6650b57cec5SDimitry Andric// microMIPS32r6 6660b57cec5SDimitry Andric// ============= 6670b57cec5SDimitry Andric 6680b57cec5SDimitry Andricdef : InstRW<[GenericWriteLoad], (instrs LBU_MMR6, LB_MMR6, LDC2_MMR6, LL_MMR6, 6690b57cec5SDimitry Andric LWM16_MMR6, LWC2_MMR6, LWPC_MMR6, LW_MMR6)>; 6700b57cec5SDimitry Andric 6710b57cec5SDimitry Andricdef : InstRW<[GenericWriteStore], (instrs SB16_MMR6, SB_MMR6, SDC2_MMR6, 6720b57cec5SDimitry Andric SH16_MMR6, SH_MMR6, SW16_MMR6, SWC2_MMR6, 6730b57cec5SDimitry Andric SWM16_MMR6, SWSP_MMR6, SW_MMR6)>; 6740b57cec5SDimitry Andric 6750b57cec5SDimitry Andricdef : InstRW<[GenericWriteSync], (instrs SYNC_MMR6, SYNCI_MMR6)>; 6760b57cec5SDimitry Andric 6770b57cec5SDimitry Andricdef : InstRW<[GenericWritePref], (instrs PREF_MMR6)>; 6780b57cec5SDimitry Andric 6790b57cec5SDimitry Andricdef : InstRW<[GenericWriteCache], (instrs CACHE_MMR6)>; 6800b57cec5SDimitry Andric 6810b57cec5SDimitry Andric// MIPS64 6820b57cec5SDimitry Andric// ====== 6830b57cec5SDimitry Andric 6840b57cec5SDimitry Andricdef : InstRW<[GenericWriteLoad], (instrs LD, LL64, LLD, LWu, LB64, LBu64, 6850b57cec5SDimitry Andric LH64, LHu64, LW64)>; 6860b57cec5SDimitry Andric 6870b57cec5SDimitry Andric// l[dw][lr] 6880b57cec5SDimitry Andricdef : InstRW<[GenericWriteLoad], (instrs LWL64, LWR64, LDL, LDR)>; 6890b57cec5SDimitry Andric 6900b57cec5SDimitry Andricdef : InstRW<[GenericWriteStore], (instrs SD, SC64, SCD, SB64, SH64, SW64, 6910b57cec5SDimitry Andric SWL64, SWR64)>; 6920b57cec5SDimitry Andric 6930b57cec5SDimitry Andricdef : InstRW<[GenericWriteStore], (instrs SDL, SDR)>; 6940b57cec5SDimitry Andric 6950b57cec5SDimitry Andric// MIPS64R6 6960b57cec5SDimitry Andric// ======== 6970b57cec5SDimitry Andric 6980b57cec5SDimitry Andricdef : InstRW<[GenericWriteLoad], (instrs LWUPC, LDPC)>; 6990b57cec5SDimitry Andric 7000b57cec5SDimitry Andricdef : InstRW<[GenericWriteLoad], (instrs LLD_R6, LL64_R6)>; 7010b57cec5SDimitry Andric 7020b57cec5SDimitry Andricdef : InstRW<[GenericWriteStoreSC], (instrs SC64_R6, SCD_R6)>; 7030b57cec5SDimitry Andric 7040b57cec5SDimitry Andric// MIPSR6 CRC ASE - hasCRC 7050b57cec5SDimitry Andric// ======================= 7060b57cec5SDimitry Andric 7070b57cec5SDimitry Andricdef : InstRW<[GenericWriteALU], (instrs CRC32B, CRC32H, CRC32W, CRC32CB, 7080b57cec5SDimitry Andric CRC32CH, CRC32CW)>; 7090b57cec5SDimitry Andric 7100b57cec5SDimitry Andric// MIPS64R6 CRC ASE - hasCRC 7110b57cec5SDimitry Andric// ------------------------- 7120b57cec5SDimitry Andric 7130b57cec5SDimitry Andricdef : InstRW<[GenericWriteALU], (instrs CRC32D, CRC32CD)>; 7140b57cec5SDimitry Andric 7150b57cec5SDimitry Andric 7160b57cec5SDimitry Andric// Cavium Networks MIPS (cnMIPS) - Octeon, HasCnMips 7170b57cec5SDimitry Andric// ================================================= 7180b57cec5SDimitry Andric 7190b57cec5SDimitry Andricdef : InstRW<[GenericWriteALU], (instrs BADDu, BBIT0, BBIT032, BBIT1, BBIT132, 7200b57cec5SDimitry Andric CINS, CINS32, CINS64_32, CINS_i32, 7210b57cec5SDimitry Andric DMFC2_OCTEON, DMTC2_OCTEON, DPOP, EXTS, 7220b57cec5SDimitry Andric EXTS32, MTM0, MTM1, MTM2, MTP0, MTP1, MTP2, 7230b57cec5SDimitry Andric POP, SEQ, SEQi, SNE, SNEi, 7240b57cec5SDimitry Andric V3MULU, VMM0, VMULU)>; 7250b57cec5SDimitry Andric 7260b57cec5SDimitry Andricdef : InstRW<[GenericWriteMDUtoGPR], (instrs DMUL)>; 7270b57cec5SDimitry Andric 7280b57cec5SDimitry Andric// Cavium Networks MIPS (cnMIPSP) - Octeon+, HasCnMipsP 7290b57cec5SDimitry Andric// ================================================= 7300b57cec5SDimitry Andric 7310b57cec5SDimitry Andricdef : InstRW<[GenericWriteALU], (instrs SAA, SAAD)>; 7320b57cec5SDimitry Andric 7330b57cec5SDimitry Andric// FPU Pipelines 7340b57cec5SDimitry Andric// ============= 7350b57cec5SDimitry Andric 7360b57cec5SDimitry Andricdef GenericFPQ : ProcResource<1> { let BufferSize = 1; } 7370b57cec5SDimitry Andricdef GenericIssueFPUS : ProcResource<1> { let Super = GenericFPQ; } 7380b57cec5SDimitry Andricdef GenericIssueFPUL : ProcResource<1> { let Super = GenericFPQ; } 7390b57cec5SDimitry Andricdef GenericIssueFPULoad : ProcResource<1> { let Super = GenericFPQ; } 7400b57cec5SDimitry Andricdef GenericIssueFPUStore : ProcResource<1> { let Super = GenericFPQ; } 7410b57cec5SDimitry Andricdef GenericIssueFPUMove : ProcResource<1> { let Super = GenericFPQ; } 7420b57cec5SDimitry Andricdef GenericFPUDivSqrt : ProcResource<1> { let Super = GenericFPQ; } 7430b57cec5SDimitry Andric 7440b57cec5SDimitry Andric// The floating point compare of the 24k series including interAptiv has a 7450b57cec5SDimitry Andric// listed latency of 1-2. Using the higher latency here. 7460b57cec5SDimitry Andric 7470b57cec5SDimitry Andricdef GenericWriteFPUCmp : SchedWriteRes<[GenericIssueFPUS]> { let Latency = 2; } 7480b57cec5SDimitry Andricdef GenericWriteFPUS : SchedWriteRes<[GenericIssueFPUS]> { let Latency = 4; } 7490b57cec5SDimitry Andricdef GenericWriteFPUL : SchedWriteRes<[GenericIssueFPUL]> { let Latency = 5; } 7500b57cec5SDimitry Andricdef GenericWriteFPUStore : SchedWriteRes<[GenericIssueFPUStore]> { let 7510b57cec5SDimitry Andric Latency = 1; 7520b57cec5SDimitry Andric} 7530b57cec5SDimitry Andricdef GenericWriteFPULoad : SchedWriteRes<[GenericIssueFPULoad]> { 7540b57cec5SDimitry Andric let Latency = 2; 7550b57cec5SDimitry Andric} 7560b57cec5SDimitry Andricdef GenericWriteFPUMoveFP : SchedWriteRes<[GenericIssueFPUMove]> { 7570b57cec5SDimitry Andric let Latency = 4; 7580b57cec5SDimitry Andric} 7590b57cec5SDimitry Andricdef GenericWriteFPUMoveGPRFPU : SchedWriteRes<[GenericIssueFPUMove]> { 7600b57cec5SDimitry Andric let Latency = 2; 7610b57cec5SDimitry Andric} 7620b57cec5SDimitry Andricdef GenericWriteFPUDivS : SchedWriteRes<[GenericFPUDivSqrt]> { 7630b57cec5SDimitry Andric let Latency = 17; 7645f757f3fSDimitry Andric let ReleaseAtCycles = [ 14 ]; 7650b57cec5SDimitry Andric} 7660b57cec5SDimitry Andricdef GenericWriteFPUDivD : SchedWriteRes<[GenericFPUDivSqrt]> { 7670b57cec5SDimitry Andric let Latency = 32; 7685f757f3fSDimitry Andric let ReleaseAtCycles = [ 29 ]; 7690b57cec5SDimitry Andric} 7700b57cec5SDimitry Andricdef GenericWriteFPURcpS : SchedWriteRes<[GenericFPUDivSqrt]> { 7710b57cec5SDimitry Andric let Latency = 13; 7725f757f3fSDimitry Andric let ReleaseAtCycles = [ 10 ]; 7730b57cec5SDimitry Andric} 7740b57cec5SDimitry Andricdef GenericWriteFPURcpD : SchedWriteRes<[GenericFPUDivSqrt]> { 7750b57cec5SDimitry Andric let Latency = 25; 7765f757f3fSDimitry Andric let ReleaseAtCycles = [ 21 ]; 7770b57cec5SDimitry Andric} 7780b57cec5SDimitry Andricdef GenericWriteFPURsqrtS : SchedWriteRes<[GenericFPUDivSqrt]> { 7790b57cec5SDimitry Andric let Latency = 17; 7805f757f3fSDimitry Andric let ReleaseAtCycles = [ 14 ]; 7810b57cec5SDimitry Andric} 7820b57cec5SDimitry Andricdef GenericWriteFPURsqrtD : SchedWriteRes<[GenericFPUDivSqrt]> { 7830b57cec5SDimitry Andric let Latency = 32; 7845f757f3fSDimitry Andric let ReleaseAtCycles = [ 29 ]; 7850b57cec5SDimitry Andric} 7860b57cec5SDimitry Andricdef GenericWriteFPUSqrtS : SchedWriteRes<[GenericFPUDivSqrt]> { 7870b57cec5SDimitry Andric let Latency = 17; 7885f757f3fSDimitry Andric let ReleaseAtCycles = [ 14 ]; 7890b57cec5SDimitry Andric} 7900b57cec5SDimitry Andricdef GenericWriteFPUSqrtD : SchedWriteRes<[GenericFPUDivSqrt]> { 7910b57cec5SDimitry Andric let Latency = 29; 7925f757f3fSDimitry Andric let ReleaseAtCycles = [ 29 ]; 7930b57cec5SDimitry Andric} 7940b57cec5SDimitry Andric 7950b57cec5SDimitry Andric// Floating point compare and branch 7960b57cec5SDimitry Andric// --------------------------------- 7970b57cec5SDimitry Andric// 7980b57cec5SDimitry Andric// c.<cc>.[ds], bc1[tf], bc1[tf]l 7990b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUCmp], (instrs FCMP_D32, FCMP_D64, FCMP_S32, BC1F, 8000b57cec5SDimitry Andric BC1T, BC1FL, BC1TL)>; 8010b57cec5SDimitry Andric 8020b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUCmp], (instregex "C_[A-Z]+_(S|D32|D64)$")>; 8030b57cec5SDimitry Andric 8040b57cec5SDimitry Andric// Short Pipe 8050b57cec5SDimitry Andric// ---------- 8060b57cec5SDimitry Andric// 8070b57cec5SDimitry Andric// abs.[ds], abs.ps, add.[ds], neg.[ds], neg.ps, madd.s, msub.s, nmadd,s 8080b57cec5SDimitry Andric// nmsub.s, sub.[ds], mul.s 8090b57cec5SDimitry Andric 8100b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instrs FABS_S, FABS_D32, FABS_D64, FADD_D32, 8110b57cec5SDimitry Andric FADD_D64, FADD_S, MADD_S, MSUB_S, FMUL_S, 8120b57cec5SDimitry Andric FNEG_S, FNEG_D32, FNEG_D64, NMADD_S, NMSUB_S, 8130b57cec5SDimitry Andric FSUB_S, FSUB_D32, FSUB_D64)>; 8140b57cec5SDimitry Andric 8150b57cec5SDimitry Andric// Long Pipe 8160b57cec5SDimitry Andric// ---------- 8170b57cec5SDimitry Andric// 8180b57cec5SDimitry Andric// nmadd.d, nmsub.d, mul.[ds], mul.ps, ceil.[wl].[sd], cvt.d.[sw], cvt.s.[dw], 8190b57cec5SDimitry Andric// cvt.w.[sd], cvt.[sw].ps, trunc.w.[ds], trunc.w.ps, floor.[ds], 8200b57cec5SDimitry Andric// round.[lw].[ds], floor.[lw].ds 8210b57cec5SDimitry Andric 8220b57cec5SDimitry Andric// madd.d, msub.dm mul.d, mul.ps, nmadd.d, nmsub.d, ceil.[wl].[sd], cvt.d.[sw], 8230b57cec5SDimitry Andric// cvt.s.[dw], cvt.w.[sd], cvt.[sw].ps, round.[lw].[ds], floor.[lw].ds, 8240b57cec5SDimitry Andric// trunc.w.[ds], trunc.w.ps, 8255ffd83dbSDimitry Andricdef : InstRW<[GenericWriteFPUL], (instrs ADDR_PS64, 8265ffd83dbSDimitry Andric CEIL_L_D64, CEIL_L_S, CEIL_W_D32, 8270b57cec5SDimitry Andric CEIL_W_D64, CEIL_W_S, CVT_D32_S, CVT_D32_W, 8280b57cec5SDimitry Andric CVT_D64_L, CVT_D64_S, CVT_D64_W, CVT_L_D64, 8290b57cec5SDimitry Andric CVT_L_S, CVT_S_D32, CVT_S_D64, CVT_S_L, 8300b57cec5SDimitry Andric CVT_S_W, CVT_W_D32, CVT_W_D64, CVT_W_S, 8310b57cec5SDimitry Andric CVT_PS_S64, CVT_S_PL64, CVT_S_PU64, 832e8d8bef9SDimitry Andric CVT_PS_PW64, CVT_PW_PS64, FADD_PS64, 8330b57cec5SDimitry Andric FLOOR_L_D64, FLOOR_L_S, FLOOR_W_D32, 8340b57cec5SDimitry Andric FLOOR_W_D64, FLOOR_W_S, FMUL_D32, FMUL_D64, 835e8d8bef9SDimitry Andric FMUL_PS64, FSUB_PS64, MADD_D32, MADD_D64, 836e8d8bef9SDimitry Andric MSUB_D32, MSUB_D64, MULR_PS64, 8370b57cec5SDimitry Andric NMADD_D32, NMADD_D64, NMSUB_D32, NMSUB_D64, 8385ffd83dbSDimitry Andric PLL_PS64, PLU_PS64, PUL_PS64, PUU_PS64, 8390b57cec5SDimitry Andric ROUND_L_D64, ROUND_L_S, ROUND_W_D32, 8400b57cec5SDimitry Andric ROUND_W_D64, ROUND_W_S, TRUNC_L_D64, 8410b57cec5SDimitry Andric TRUNC_L_S, TRUNC_W_D32, TRUNC_W_D64, 8420b57cec5SDimitry Andric TRUNC_W_S, PseudoTRUNC_W_D, 8430b57cec5SDimitry Andric PseudoTRUNC_W_D32, PseudoTRUNC_W_S)>; 8440b57cec5SDimitry Andric 8450b57cec5SDimitry Andric// Pseudo convert instruction 8460b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], (instrs PseudoCVT_D32_W, PseudoCVT_D64_L, 8470b57cec5SDimitry Andric PseudoCVT_D64_W, PseudoCVT_S_L, 8480b57cec5SDimitry Andric PseudoCVT_S_W)>; 8490b57cec5SDimitry Andric 8500b57cec5SDimitry Andric// div.[ds], div.ps 8510b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUDivS], (instrs FDIV_S)>; 8520b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUDivD], (instrs FDIV_D32, FDIV_D64)>; 8530b57cec5SDimitry Andric 8540b57cec5SDimitry Andric// sqrt.[ds], sqrt.ps 8550b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUSqrtS], (instrs FSQRT_S)>; 8560b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUSqrtD], (instrs FSQRT_D32, FSQRT_D64)>; 8570b57cec5SDimitry Andric 8580b57cec5SDimitry Andric// rsqrt.[ds], recip.[ds] 8590b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPURcpS], (instrs RECIP_S, RSQRT_S)>; 8600b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPURcpD], (instrs RECIP_D32, RECIP_D64, 8610b57cec5SDimitry Andric RSQRT_D32, RSQRT_D64)>; 8620b57cec5SDimitry Andric 8630b57cec5SDimitry Andric 8640b57cec5SDimitry Andric// Load Pipe 8650b57cec5SDimitry Andric// --------- 8660b57cec5SDimitry Andric 8670b57cec5SDimitry Andric// ctc1, mtc1, mthc1, cfc1, mfc1, mfhc1 8680b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUMoveGPRFPU], (instrs BuildPairF64, 8690b57cec5SDimitry Andric BuildPairF64_64, ExtractElementF64, 8700b57cec5SDimitry Andric ExtractElementF64_64, CFC1, CTC1, 8710b57cec5SDimitry Andric MFC1, MFC1_D64, MFHC1_D32, 8720b57cec5SDimitry Andric MFHC1_D64, MTC1, MTC1_D64, 8730b57cec5SDimitry Andric MTHC1_D32, MTHC1_D64)>; 8740b57cec5SDimitry Andric 8750b57cec5SDimitry Andric// swc1, swxc1 8760b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUStore], (instrs SDC1, SDC164, SDXC1, SDXC164, 8770b57cec5SDimitry Andric SUXC1, SUXC164, SWC1, SWXC1)>; 8780b57cec5SDimitry Andric 8790b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUMoveFP], (instrs FMOV_D32, FMOV_D64, FMOV_S)>; 8800b57cec5SDimitry Andric 8810b57cec5SDimitry Andric 8820b57cec5SDimitry Andric// movn.[ds], movz.[ds] 8830b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUMoveFP], (instrs MOVF_I, MOVF_D32, MOVF_D64, 8840b57cec5SDimitry Andric MOVF_S, MOVT_I, MOVT_D32, MOVT_D64, 8850b57cec5SDimitry Andric MOVT_S, MOVN_I_D32, MOVN_I_D64, 8860b57cec5SDimitry Andric MOVN_I_S, MOVZ_I_D32, MOVZ_I_D64, 8870b57cec5SDimitry Andric MOVZ_I_S)>; 8880b57cec5SDimitry Andric 8890b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUMoveFP], (instrs MOVT_I64, MOVF_I64, MOVZ_I64_S, 8900b57cec5SDimitry Andric MOVN_I64_D64, MOVN_I64_S, 8910b57cec5SDimitry Andric MOVZ_I64_D64)>; 8920b57cec5SDimitry Andric 8930b57cec5SDimitry Andric// l[dw]x?c1 8940b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPULoad], (instrs LDC1, LDC164, LDXC1, LDXC164, 8950b57cec5SDimitry Andric LUXC1, LUXC164, LWC1, LWXC1)>; 8960b57cec5SDimitry Andric 8970b57cec5SDimitry Andric// MIPSR6 8980b57cec5SDimitry Andric// ====== 8990b57cec5SDimitry Andric 9000b57cec5SDimitry Andric// sel(eq|ne).[ds], max.[ds], maxa.[ds], min.[ds], mina.[ds], class.[ds] 9010b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instrs SELEQZ_S, SELNEZ_S, SELEQZ_D, SELNEZ_D, 9020b57cec5SDimitry Andric MAX_S, MAX_D, MAXA_S, MAXA_D, MIN_S, MIN_D, 9030b57cec5SDimitry Andric MINA_S, MINA_D, CLASS_S, CLASS_D)>; 9040b57cec5SDimitry Andric 9050b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], (instrs RINT_S, RINT_D)>; 9060b57cec5SDimitry Andric 9070b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUCmp], (instrs BC1EQZ, BC1NEZ, SEL_D, SEL_S)>; 9080b57cec5SDimitry Andric 9090b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instrs MADDF_S, MSUBF_S, MADDF_D, MSUBF_D)>; 9100b57cec5SDimitry Andric 9110b57cec5SDimitry Andric 9120b57cec5SDimitry Andric// microMIPS 9130b57cec5SDimitry Andric// ========= 9140b57cec5SDimitry Andric 9150b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUMoveFP], (instrs MOVF_D32_MM, MOVF_S_MM, 9160b57cec5SDimitry Andric MOVN_I_D32_MM, MOVN_I_S_MM, 9170b57cec5SDimitry Andric MOVT_D32_MM, MOVT_S_MM, MOVZ_I_D32_MM, 9180b57cec5SDimitry Andric MOVZ_I_S_MM)>; 9190b57cec5SDimitry Andric 9200b57cec5SDimitry Andric 9210b57cec5SDimitry Andric// cvt.?.?, ceil.?, floor.?, round.?, trunc.? (n)madd.? (n)msub.? 9220b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], (instrs CVT_D32_S_MM, CVT_D32_W_MM, 9230b57cec5SDimitry Andric CVT_D64_S_MM, CVT_D64_W_MM, CVT_L_D64_MM, 9240b57cec5SDimitry Andric CVT_L_S_MM, CVT_S_D32_MM, CVT_S_D64_MM, 9250b57cec5SDimitry Andric CVT_S_W_MM, CVT_W_D32_MM, CVT_W_D64_MM, 9260b57cec5SDimitry Andric CVT_W_S_MM, CEIL_W_MM, CEIL_W_S_MM, 9270b57cec5SDimitry Andric FLOOR_W_MM, FLOOR_W_S_MM, NMADD_S_MM, 9280b57cec5SDimitry Andric NMADD_D32_MM, NMSUB_S_MM, NMSUB_D32_MM, 9290b57cec5SDimitry Andric MADD_S_MM, MADD_D32_MM, ROUND_W_MM, 9300b57cec5SDimitry Andric ROUND_W_S_MM, TRUNC_W_MM, TRUNC_W_S_MM)>; 9310b57cec5SDimitry Andric 9320b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUCmp], (instregex "^C_[A-Z]_(S|D32|D64)_MM$")>; 9330b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUCmp], (instregex "^C_[A-Z][A-Z]_(S|D32|D64)_MM$")>; 9340b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUCmp], (instregex "^C_[A-Z][A-Z][A-Z]_(S|D32|D64)_MM$")>; 9350b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUCmp], (instregex "^C_NGLE_(S|D32|D64)_MM$")>; 9360b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUCmp], (instrs FCMP_S32_MM, FCMP_D32_MM)>; 9370b57cec5SDimitry Andric 9380b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instrs MFC1_MM, MFHC1_D32_MM, MFHC1_D64_MM, 9390b57cec5SDimitry Andric MTC1_MM, MTC1_D64_MM, 9400b57cec5SDimitry Andric MTHC1_D32_MM, MTHC1_D64_MM)>; 9410b57cec5SDimitry Andric 9420b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instrs FABS_D32_MM, FABS_D64_MM, FABS_S_MM, 9430b57cec5SDimitry Andric FNEG_D32_MM, FNEG_D64_MM, FNEG_S_MM, 9440b57cec5SDimitry Andric FADD_D32_MM, FADD_D64_MM, FADD_S_MM, 9450b57cec5SDimitry Andric FMOV_D32_MM, FMOV_D64_MM, FMOV_S_MM, 9460b57cec5SDimitry Andric FMUL_D32_MM, FMUL_D64_MM, FMUL_S_MM, 9470b57cec5SDimitry Andric FSUB_D32_MM, FSUB_D64_MM, FSUB_S_MM, 9480b57cec5SDimitry Andric MSUB_S_MM, MSUB_D32_MM)>; 9490b57cec5SDimitry Andric 9500b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUDivS], (instrs FDIV_S_MM)>; 9510b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUDivD], (instrs FDIV_D32_MM, FDIV_D64_MM)>; 9520b57cec5SDimitry Andric 9530b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUSqrtS], (instrs FSQRT_S_MM)>; 9540b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUSqrtD], (instrs FSQRT_D32_MM, FSQRT_D64_MM)>; 9550b57cec5SDimitry Andric 9560b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPURcpS], (instrs RECIP_S_MM, RSQRT_S_MM)>; 9570b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPURcpD], (instrs RECIP_D32_MM, RECIP_D64_MM, 9580b57cec5SDimitry Andric RSQRT_D32_MM, RSQRT_D64_MM)>; 9590b57cec5SDimitry Andric 96081ad6265SDimitry Andricdef : InstRW<[GenericWriteFPUStore], (instrs SDC1_MM_D32, SDC1_MM_D64, SWC1_MM, 96181ad6265SDimitry Andric SUXC1_MM, SWXC1_MM)>; 9620b57cec5SDimitry Andric 9630b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUMoveGPRFPU], (instrs CFC1_MM, CTC1_MM)>; 9640b57cec5SDimitry Andric 96581ad6265SDimitry Andricdef : InstRW<[GenericWriteFPULoad], (instrs LDC1_MM_D32, LDC1_MM_D64, LUXC1_MM, 96681ad6265SDimitry Andric LWC1_MM, LWXC1_MM)>; 9670b57cec5SDimitry Andric 9680b57cec5SDimitry Andric// microMIPS32r6 9690b57cec5SDimitry Andric// ============= 9700b57cec5SDimitry Andric 9710b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instrs FNEG_S_MMR6)>; 9720b57cec5SDimitry Andric 9730b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUCmp], (instregex "CMP_[A-Z][A-Z]_(S|D)_MMR6")>; 9740b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUCmp], 9750b57cec5SDimitry Andric (instregex "CMP_[A-Z][A-Z][A-Z]_(S|D)_MMR6")>; 9760b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUCmp], 9770b57cec5SDimitry Andric (instregex "CMP_[A-Z][A-Z][A-Z][A-Z]_(S|D)_MMR6")>; 9780b57cec5SDimitry Andric 9790b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], 9800b57cec5SDimitry Andric (instregex "CVT_(L|D|S|W)_(L|D|S|L|W)_MMR6")>; 9810b57cec5SDimitry Andric 9820b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], 9830b57cec5SDimitry Andric (instregex "TRUNC_(L|W)_(D|S)_MMR6")>; 9840b57cec5SDimitry Andric 9850b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], 9860b57cec5SDimitry Andric (instregex "ROUND_(L|W)_(D|S)_MMR6")>; 9870b57cec5SDimitry Andric 9880b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], 9890b57cec5SDimitry Andric (instregex "FLOOR_(L|W)_(D|S)_MMR6")>; 9900b57cec5SDimitry Andric 9910b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], 9920b57cec5SDimitry Andric (instregex "CEIL_(L|W)_(S|D)_MMR6")>; 9930b57cec5SDimitry Andric 9940b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], 9950b57cec5SDimitry Andric (instrs MFC1_MMR6, MTC1_MMR6, CLASS_S_MMR6, CLASS_D_MMR6, 9960b57cec5SDimitry Andric FADD_S_MMR6)>; 9970b57cec5SDimitry Andric 9980b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "M(IN|AX)_(S|D)_MMR6")>; 9990b57cec5SDimitry Andric 10000b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "M(IN|AX)A_(S|D)_MMR6")>; 10010b57cec5SDimitry Andric 10020b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "SEL(EQ|NE)Z_(S|D)_MMR6")>; 10030b57cec5SDimitry Andric 10040b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "SEL_(S|D)_MMR6")>; 10050b57cec5SDimitry Andric 10060b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], (instrs RINT_S_MMR6, RINT_D_MMR6)>; 10070b57cec5SDimitry Andric 10080b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "M(ADD|SUB)F_(S|D)_MMR6")>; 10090b57cec5SDimitry Andric 10100b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instrs FMOV_S_MMR6, FMUL_S_MMR6, 10110b57cec5SDimitry Andric FSUB_S_MMR6, FMOV_D_MMR6)>; 10120b57cec5SDimitry Andric 10130b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], (instrs FDIV_S_MMR6)>; 10140b57cec5SDimitry Andric 10150b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUStore], (instrs SDC1_D64_MMR6)>; 10160b57cec5SDimitry Andric 10170b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPULoad], (instrs LDC1_D64_MMR6)>; 10180b57cec5SDimitry Andric 10190b57cec5SDimitry Andric// MIPS64 10200b57cec5SDimitry Andric// ====== 10210b57cec5SDimitry Andric 10220b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUMoveGPRFPU], (instrs DMFC1, DMTC1)>; 10230b57cec5SDimitry Andric 10240b57cec5SDimitry Andric// MIPS DSP ASE, HasDSP 10250b57cec5SDimitry Andric// ==================== 10260b57cec5SDimitry Andric 10270b57cec5SDimitry Andricdef : InstRW<[GenericWriteStore], (instrs SWDSP)>; 10280b57cec5SDimitry Andric 10290b57cec5SDimitry Andricdef : InstRW<[GenericWriteLoad], (instrs LWDSP)>; 10300b57cec5SDimitry Andric 10310b57cec5SDimitry Andricdef : InstRW<[GenericWriteMove], (instrs PseudoMTLOHI_DSP)>; 10320b57cec5SDimitry Andric 10330b57cec5SDimitry Andricdef GenericDSP : ProcResource<1> { let BufferSize = 1; } 10340b57cec5SDimitry Andricdef GenericDSPShort : SchedWriteRes<[GenericDSP]> { let Latency = 2; } 10350b57cec5SDimitry Andricdef GenericDSPLong : SchedWriteRes<[GenericDSP]> { let Latency = 6; } 10360b57cec5SDimitry Andricdef GenericDSPBypass : SchedWriteRes<[GenericDSP]> { let Latency = 1; } 10370b57cec5SDimitry Andricdef GenericDSPMTHILO : SchedWriteRes<[GenericDSP]> { let Latency = 5; } 10380b57cec5SDimitry Andricdef GenericDSPLoad : SchedWriteRes<[GenericDSP]> { let Latency = 4; } 10390b57cec5SDimitry Andricdef GenericDSPMTHLIP : SchedWriteRes<[GenericDSP]> { let Latency = 5; } 10400b57cec5SDimitry Andric 10410b57cec5SDimitry Andricdef : InstRW<[GenericDSPLong], (instregex "^EXTRV_RS_W$")>; 10420b57cec5SDimitry Andricdef : InstRW<[GenericDSPLong], (instregex "^EXTRV_R_W$")>; 10430b57cec5SDimitry Andricdef : InstRW<[GenericDSPLong], (instregex "^EXTRV_S_H$")>; 10440b57cec5SDimitry Andricdef : InstRW<[GenericDSPLong], (instregex "^EXTRV_W$")>; 10450b57cec5SDimitry Andricdef : InstRW<[GenericDSPLong], (instregex "^EXTR_RS_W$")>; 10460b57cec5SDimitry Andricdef : InstRW<[GenericDSPLong], (instregex "^EXTR_R_W$")>; 10470b57cec5SDimitry Andricdef : InstRW<[GenericDSPLong], (instregex "^EXTR_S_H$")>; 10480b57cec5SDimitry Andricdef : InstRW<[GenericDSPLong], (instregex "^EXTR_W$")>; 10490b57cec5SDimitry Andricdef : InstRW<[GenericDSPLong], (instregex "^INSV$")>; 10500b57cec5SDimitry Andric 10510b57cec5SDimitry Andricdef : InstRW<[GenericDSPMTHLIP], (instregex "^MTHLIP$")>; 10520b57cec5SDimitry Andricdef : InstRW<[GenericDSPMTHILO], (instregex "^MTHI_DSP$")>; 10530b57cec5SDimitry Andricdef : InstRW<[GenericDSPMTHILO], (instregex "^MTLO_DSP$")>; 10540b57cec5SDimitry Andric 10550b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_PH$")>; 10560b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_W$")>; 10570b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDQ_PH$")>; 10580b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDQ_S_PH$")>; 10590b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDQ_S_W$")>; 10600b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDSC$")>; 10610b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDU_QB$")>; 10620b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDU_S_QB$")>; 10630b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDWC$")>; 10640b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^BITREV$")>; 10650b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^BPOSGE32$")>; 10660b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPGU_EQ_QB$")>; 10670b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPGU_LE_QB$")>; 10680b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPGU_LT_QB$")>; 10690b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPU_EQ_QB$")>; 10700b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPU_LE_QB$")>; 10710b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPU_LT_QB$")>; 10720b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMP_EQ_PH$")>; 10730b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMP_LE_PH$")>; 10740b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMP_LT_PH$")>; 10750b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPAQ_SA_L_W$")>; 10760b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPAQ_S_W_PH$")>; 10770b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPAU_H_QBL$")>; 10780b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPAU_H_QBR$")>; 10790b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPSQ_SA_L_W$")>; 10800b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPSQ_S_W_PH$")>; 10810b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPSU_H_QBL$")>; 10820b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPSU_H_QBR$")>; 10830b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^EXTPDPV$")>; 10840b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^EXTPDP$")>; 10850b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^EXTPV$")>; 10860b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^EXTP$")>; 10870b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^LBUX$")>; 10880b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^LHX$")>; 10890b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^LWX$")>; 10900b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MADDU_DSP$")>; 10910b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MADD_DSP$")>; 10920b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MAQ_SA_W_PHL$")>; 10930b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MAQ_SA_W_PHR$")>; 10940b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MAQ_S_W_PHL$")>; 10950b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MAQ_S_W_PHR$")>; 10960b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MFHI_DSP$")>; 10970b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MFLO_DSP$")>; 10980b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MODSUB$")>; 10990b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MSUBU_DSP$")>; 11000b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MSUB_DSP$")>; 11010b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULEQ_S_W_PHL$")>; 11020b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULEQ_S_W_PHR$")>; 11030b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULEU_S_PH_QBL$")>; 11040b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULEU_S_PH_QBR$")>; 11050b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULQ_RS_PH$")>; 11060b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULSAQ_S_W_PH$")>; 11070b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULTU_DSP$")>; 11080b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULT_DSP$")>; 11090b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PACKRL_PH$")>; 11100b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PICK_PH$")>; 11110b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PICK_QB$")>; 11120b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBLA$")>; 11130b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBL$")>; 11140b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBRA$")>; 11150b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBR$")>; 11160b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEQ_W_PHL$")>; 11170b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEQ_W_PHR$")>; 11180b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBLA$")>; 11190b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBL$")>; 11200b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBRA$")>; 11210b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBR$")>; 11220b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECRQU_S_QB_PH$")>; 11230b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECRQ_PH_W$")>; 11240b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECRQ_QB_PH$")>; 11250b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECRQ_RS_PH_W$")>; 11260b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^RADDU_W_QB$")>; 11270b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^RDDSP$")>; 11280b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^REPLV_PH$")>; 11290b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^REPLV_QB$")>; 11300b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^REPL_PH$")>; 11310b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^REPL_QB$")>; 11320b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHILOV$")>; 11330b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHILO$")>; 11340b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHLLV_PH$")>; 11350b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHLLV_QB$")>; 11360b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHLLV_S_PH$")>; 11370b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHLLV_S_W$")>; 11380b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHLL_PH$")>; 11390b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHLL_QB$")>; 11400b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHLL_S_PH$")>; 11410b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHLL_S_W$")>; 11420b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_PH$")>; 11430b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_PH$")>; 11440b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_W$")>; 11450b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRA_PH$")>; 11460b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRA_R_PH$")>; 11470b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRA_R_W$")>; 11480b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRLV_QB$")>; 11490b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRL_QB$")>; 11500b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBQ_PH$")>; 11510b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBQ_S_PH$")>; 11520b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBQ_S_W$")>; 11530b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBU_QB$")>; 11540b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBU_S_QB$")>; 11550b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^WRDSP$")>; 11560b57cec5SDimitry Andric 11570b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], 11580b57cec5SDimitry Andric (instregex "^Pseudo(CMP|CMPU)_(EQ|LE|LT)_(PH|QB)$")>; 11590b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], 11600b57cec5SDimitry Andric (instregex "^PseudoPICK_(PH|QB)$")>; 11610b57cec5SDimitry Andric 11620b57cec5SDimitry Andric// MIPS DSP R2 - hasDSP, HasDSPR2, InMicroMips 11630b57cec5SDimitry Andric// =========================================== 11640b57cec5SDimitry Andric 11650b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_QB$")>; 11660b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDQH_PH$")>; 11670b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDQH_R_PH$")>; 11680b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDQH_R_W$")>; 11690b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDQH_W$")>; 11700b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDUH_QB$")>; 11710b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDUH_R_QB$")>; 11720b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDU_PH$")>; 11730b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDU_S_PH$")>; 11740b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^APPEND$")>; 11750b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^BALIGN$")>; 11760b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPGDU_EQ_QB$")>; 11770b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPGDU_LE_QB$")>; 11780b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPGDU_LT_QB$")>; 11790b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPA_W_PH$")>; 11800b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPAQX_SA_W_PH$")>; 11810b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPAQX_S_W_PH$")>; 11820b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPAX_W_PH$")>; 11830b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPS_W_PH$")>; 11840b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPSQX_S_W_PH$")>; 11850b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPSQX_SA_W_PH$")>; 11860b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPSX_W_PH$")>; 11870b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MUL_PH$")>; 11880b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MUL_S_PH$")>; 11890b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULQ_RS_W$")>; 11900b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULQ_S_PH$")>; 11910b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULQ_S_W$")>; 11920b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULSA_W_PH$")>; 11930b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECR_QB_PH$")>; 11940b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECR_SRA_PH_W$")>; 11950b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECR_SRA_R_PH_W$")>; 11960b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PREPEND$")>; 11970b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRA_QB$")>; 11980b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRA_R_QB$")>; 11990b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_QB$")>; 12000b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_QB$")>; 12010b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRL_PH$")>; 12020b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRLV_PH$")>; 12030b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBQH_PH$")>; 12040b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBQH_R_PH$")>; 12050b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBQH_W$")>; 12060b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBQH_R_W$")>; 12070b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBU_PH$")>; 12080b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBU_S_PH$")>; 12090b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBUH_QB$")>; 12100b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBUH_R_QB$")>; 12110b57cec5SDimitry Andric 12120b57cec5SDimitry Andric// microMIPS DSP R1 - HasDSP, InMicroMips 12130b57cec5SDimitry Andric// ====================================== 12140b57cec5SDimitry Andric 12150b57cec5SDimitry Andricdef : InstRW<[GenericWriteLoad], (instrs LWDSP_MM)>; 12160b57cec5SDimitry Andric 12170b57cec5SDimitry Andricdef : InstRW<[GenericWriteStore], (instrs SWDSP_MM)>; 12180b57cec5SDimitry Andric 12190b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_PH_MM$")>; 12200b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_W_MM$")>; 12210b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDQ_PH_MM$")>; 12220b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDQ_S_PH_MM$")>; 12230b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDQ_S_W_MM$")>; 12240b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDSC_MM$")>; 12250b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDU_QB_MM$")>; 12260b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDU_S_QB_MM$")>; 12270b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDWC_MM$")>; 12280b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^BITREV_MM$")>; 12290b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^BPOSGE32_MM$")>; 12300b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPGU_EQ_QB_MM$")>; 12310b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPGU_LE_QB_MM$")>; 12320b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPGU_LT_QB_MM$")>; 12330b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPU_EQ_QB_MM$")>; 12340b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPU_LE_QB_MM$")>; 12350b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPU_LT_QB_MM$")>; 12360b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMP_EQ_PH_MM$")>; 12370b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMP_LE_PH_MM$")>; 12380b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMP_LT_PH_MM$")>; 12390b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPAQ_SA_L_W_MM$")>; 12400b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPAQ_S_W_PH_MM$")>; 12410b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPAU_H_QBL_MM$")>; 12420b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPAU_H_QBR_MM$")>; 12430b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPSQ_SA_L_W_MM$")>; 12440b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPSQ_S_W_PH_MM$")>; 12450b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPSU_H_QBL_MM$")>; 12460b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPSU_H_QBR_MM$")>; 12470b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^EXTPDPV_MM$")>; 12480b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^EXTPDP_MM$")>; 12490b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^EXTPV_MM$")>; 12500b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^EXTP_MM$")>; 12510b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^EXTRV_RS_W_MM$")>; 12520b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^EXTRV_R_W_MM$")>; 12530b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^EXTRV_S_H_MM$")>; 12540b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^EXTRV_W_MM$")>; 12550b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^EXTR_RS_W_MM$")>; 12560b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^EXTR_R_W_MM$")>; 12570b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^EXTR_S_H_MM$")>; 12580b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^EXTR_W_MM$")>; 12590b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^INSV_MM$")>; 12600b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^LBUX_MM$")>; 12610b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^LHX_MM$")>; 12620b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^LWX_MM$")>; 12630b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MADDU_DSP_MM$")>; 12640b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MADD_DSP_MM$")>; 12650b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MAQ_SA_W_PHL_MM$")>; 12660b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MAQ_SA_W_PHR_MM$")>; 12670b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MAQ_S_W_PHL_MM$")>; 12680b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MAQ_S_W_PHR_MM$")>; 12690b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MFHI_DSP_MM$")>; 12700b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MFLO_DSP_MM$")>; 12710b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MODSUB_MM$")>; 12720b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MOVEP_MMR6$")>; 12730b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MOVN_I_MM$")>; 12740b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MOVZ_I_MM$")>; 12750b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MSUBU_DSP_MM$")>; 12760b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MSUB_DSP_MM$")>; 12770b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MTHI_DSP_MM$")>; 12780b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MTHLIP_MM$")>; 12790b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MTLO_DSP_MM$")>; 12800b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULEQ_S_W_PHL_MM$")>; 12810b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULEQ_S_W_PHR_MM$")>; 12820b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULEU_S_PH_QBL_MM$")>; 12830b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULEU_S_PH_QBR_MM$")>; 12840b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULQ_RS_PH_MM$")>; 12850b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULSAQ_S_W_PH_MM$")>; 12860b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULTU_DSP_MM$")>; 12870b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULT_DSP_MM$")>; 12880b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PACKRL_PH_MM$")>; 12890b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PICK_PH_MM$")>; 12900b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PICK_QB_MM$")>; 12910b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBLA_MM$")>; 12920b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBL_MM$")>; 12930b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBRA_MM$")>; 12940b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEQU_PH_QBR_MM$")>; 12950b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEQ_W_PHL_MM$")>; 12960b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEQ_W_PHR_MM$")>; 12970b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBLA_MM$")>; 12980b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBL_MM$")>; 12990b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBRA_MM$")>; 13000b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECEU_PH_QBR_MM$")>; 13010b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECRQU_S_QB_PH_MM$")>; 13020b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECRQ_PH_W_MM$")>; 13030b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECRQ_QB_PH_MM$")>; 13040b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECRQ_RS_PH_W_MM$")>; 13050b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^RADDU_W_QB_MM$")>; 13060b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^RDDSP_MM$")>; 13070b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^REPLV_PH_MM$")>; 13080b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^REPLV_QB_MM$")>; 13090b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^REPL_PH_MM$")>; 13100b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^REPL_QB_MM$")>; 13110b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHILOV_MM$")>; 13120b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHILO_MM$")>; 13130b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHLLV_PH_MM$")>; 13140b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHLLV_QB_MM$")>; 13150b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHLLV_S_PH_MM$")>; 13160b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHLLV_S_W_MM$")>; 13170b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHLL_PH_MM$")>; 13180b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHLL_QB_MM$")>; 13190b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHLL_S_PH_MM$")>; 13200b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHLL_S_W_MM$")>; 13210b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_PH_MM$")>; 13220b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_PH_MM$")>; 13230b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_W_MM$")>; 13240b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRA_PH_MM$")>; 13250b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRA_R_PH_MM$")>; 13260b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRA_R_W_MM$")>; 13270b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRLV_QB_MM$")>; 13280b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRL_QB_MM$")>; 13290b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBQ_PH_MM$")>; 13300b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBQ_S_PH_MM$")>; 13310b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBQ_S_W_MM$")>; 13320b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBU_QB_MM$")>; 13330b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBU_S_QB_MM$")>; 13340b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^WRDSP_MM$")>; 13350b57cec5SDimitry Andric 13360b57cec5SDimitry Andric 13370b57cec5SDimitry Andric// microMIPS DSP R2 - hasDSP, HasDSPR2, InMicroMips 13380b57cec5SDimitry Andric// ================================================ 13390b57cec5SDimitry Andric 13400b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ABSQ_S_QB_MMR2$")>; 13410b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDQH_PH_MMR2$")>; 13420b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDQH_R_PH_MMR2$")>; 13430b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDQH_R_W_MMR2$")>; 13440b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDQH_W_MMR2$")>; 13450b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDUH_QB_MMR2$")>; 13460b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDUH_R_QB_MMR2$")>; 13470b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDU_PH_MMR2$")>; 13480b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^ADDU_S_PH_MMR2$")>; 13490b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^APPEND_MMR2$")>; 13500b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^BALIGN_MMR2$")>; 13510b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPGDU_EQ_QB_MMR2$")>; 13520b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPGDU_LE_QB_MMR2$")>; 13530b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^CMPGDU_LT_QB_MMR2$")>; 13540b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPA_W_PH_MMR2$")>; 13550b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPAQX_SA_W_PH_MMR2$")>; 13560b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPAQX_S_W_PH_MMR2$")>; 13570b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPAX_W_PH_MMR2$")>; 13580b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPS_W_PH_MMR2$")>; 13590b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPSQX_S_W_PH_MMR2$")>; 13600b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPSQX_SA_W_PH_MMR2$")>; 13610b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^DPSX_W_PH_MMR2$")>; 13620b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MUL_PH_MMR2$")>; 13630b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MUL_S_PH_MMR2$")>; 13640b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULQ_RS_W_MMR2$")>; 13650b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULQ_S_PH_MMR2$")>; 13660b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULQ_S_W_MMR2$")>; 13670b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^MULSA_W_PH_MMR2$")>; 13680b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECR_QB_PH_MMR2$")>; 13690b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECR_SRA_PH_W_MMR2$")>; 13700b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PRECR_SRA_R_PH_W_MMR2$")>; 13710b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^PREPEND_MMR2$")>; 13720b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRA_QB_MMR2$")>; 13730b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRA_R_QB_MMR2$")>; 13740b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_QB_MMR2$")>; 13750b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRAV_R_QB_MMR2$")>; 13760b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRL_PH_MMR2$")>; 13770b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SHRLV_PH_MMR2$")>; 13780b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBQH_PH_MMR2$")>; 13790b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBQH_R_PH_MMR2$")>; 13800b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBQH_W_MMR2$")>; 13810b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBQH_R_W_MMR2$")>; 13820b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBU_PH_MMR2$")>; 13830b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBU_S_PH_MMR2$")>; 13840b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBUH_QB_MMR2$")>; 13850b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^SUBUH_R_QB_MMR2$")>; 13860b57cec5SDimitry Andric 13870b57cec5SDimitry Andric// microMIPS DSP R3 - hasDSP, hasDSPR2, hasDSPR3, InMicroMips 13880b57cec5SDimitry Andric// ========================================================== 13890b57cec5SDimitry Andric 13900b57cec5SDimitry Andricdef : InstRW<[GenericDSPShort], (instregex "^BPOSGE32C_MMR3$")>; 13910b57cec5SDimitry Andric 13920b57cec5SDimitry Andric// MIPS MSA ASE - hasMSA 13930b57cec5SDimitry Andric// ===================== 13940b57cec5SDimitry Andric 13950b57cec5SDimitry Andricdef GenericWriteMSAShortLogic : SchedWriteRes<[GenericIssueFPUS]>; 13960b57cec5SDimitry Andricdef GenericWriteMSAShortInt : SchedWriteRes<[GenericIssueFPUS]> { 13970b57cec5SDimitry Andriclet Latency = 2; 13980b57cec5SDimitry Andric} 13990b57cec5SDimitry Andricdef GenericWriteMoveOtherUnitsToFPU : SchedWriteRes<[GenericIssueFPUS]>; 14000b57cec5SDimitry Andricdef GenericWriteMSAOther3 : SchedWriteRes<[GenericIssueFPUS]> { 14010b57cec5SDimitry Andriclet Latency = 3; 14020b57cec5SDimitry Andric} 14030b57cec5SDimitry Andricdef GenericWriteMSALongInt : SchedWriteRes<[GenericIssueFPUS]> { 14040b57cec5SDimitry Andriclet Latency = 5; 14050b57cec5SDimitry Andric} 14060b57cec5SDimitry Andricdef GenericWriteFPUDivI : SchedWriteRes<[GenericFPQ]> { 14070b57cec5SDimitry Andric let Latency = 33; 14085f757f3fSDimitry Andric let ReleaseAtCycles = [ 33 ]; 14090b57cec5SDimitry Andric} 14100b57cec5SDimitry Andric 14110b57cec5SDimitry Andric// FPUS is also used in moves from floating point and MSA registers to general 14120b57cec5SDimitry Andric// purpose registers. 14130b57cec5SDimitry Andricdef GenericWriteMoveFPUSToOtherUnits : SchedWriteRes<[GenericIssueFPUS]> { 14140b57cec5SDimitry Andric let Latency = 0; 14150b57cec5SDimitry Andric} 14160b57cec5SDimitry Andric 14170b57cec5SDimitry Andric// FPUL is also used in moves from floating point and MSA registers to general 14180b57cec5SDimitry Andric// purpose registers. 14190b57cec5SDimitry Andricdef GenericWriteMoveFPULToOtherUnits : SchedWriteRes<[GenericIssueFPUL]>; 14200b57cec5SDimitry Andric 14210b57cec5SDimitry Andric 14220b57cec5SDimitry Andric// adds_a.[bhwd], adds_[asu].[bhwd], addvi?.[bhwd], asub_[us].[bhwd], 14230b57cec5SDimitry Andric// aver?_[us].[bhwd] 14240b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^ADD_A_[BHWD]$")>; 14250b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^ADDS_[ASU]_[BHWD]$")>; 14260b57cec5SDimitry Andric 14270b57cec5SDimitry Andric// TODO: ADDVI_[BHW] might be 1 cycle latency rather than 2. Need to confirm it. 14280b57cec5SDimitry Andric// add.[bhwd], addvi.[bhwd], asub_[us].[bhwd], ave.[bhwd], aver.[bhwd] 14290b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^ADDVI?_[BHWD]$")>; 14300b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^ASUB_[US].[BHWD]$")>; 14310b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^AVER?_[US].[BHWD]$")>; 14320b57cec5SDimitry Andric 14330b57cec5SDimitry Andric// and.v, andi.b, move.v, ldi.[bhwd], xor.v, nor.v, xori.b, nori.b, lsa 14340b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^MOVE_V$")>; 14350b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^LDI_[BHWD]$")>; 14360b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instrs LSA)>; 14370b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(AND|OR|[XN]OR)_V$")>; 14380b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(AND|OR|[XN]OR)I_B$")>; 14390b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], 14400b57cec5SDimitry Andric (instregex "^(AND|OR|[XN]OR)_V_[DHW]_PSEUDO$")>; 14410b57cec5SDimitry Andric 14420b57cec5SDimitry Andric// vshf.[bhwd], binsl.[bhwd], binsr.[bhwd], insert.[bhwd], sld?.[bhwd], 14430b57cec5SDimitry Andric// bset.[bhwd], bclr.[bhwd], bneg.[bhwd], bsel_v, bseli_b 14440b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^VSHF_[BHWD]$")>; 14450b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^(BINSL|BINSLI)_[BHWD]$")>; 14460b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^(BINSR|BINSRI)_[BHWD]$")>; 14470b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^INSERT_[BHWD]$")>; 14480b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^(SLD|SLDI)_[BHWD]$")>; 14490b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^(BSET|BSETI)_[BHWD]$")>; 14500b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^(BCLR|BCLRI)_[BHWD]$")>; 14510b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^(BNEG|BNEGI)_[BHWD]$")>; 14520b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^(BSEL_V|BSELI_B)$")>; 14530b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^BMN*Z.*$")>; 14540b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], 14550b57cec5SDimitry Andric (instregex "^BSEL_(H|W|D|FW|FD)_PSEUDO$")>; 14560b57cec5SDimitry Andric 14570b57cec5SDimitry Andric// pcnt.[bhwd], sat_s.[bhwd], sat_u.[bhwd] 14580b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAOther3], (instregex "^PCNT_[BHWD]$")>; 14590b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAOther3], (instregex "^SAT_(S|U)_[BHWD]$")>; 14600b57cec5SDimitry Andric 14610b57cec5SDimitry Andric// bnz.[bhwdv], cfcmsa, ctcmsa 14620b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(BNZ|BZ)_[BHWDV]$")>; 14630b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^C(F|T)CMSA$")>; 14640b57cec5SDimitry Andric 14650b57cec5SDimitry Andric// shf.[bhw], fill[bhwd], splat?.[bhwd] 14660b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^SHF_[BHW]$")>; 14670b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^FILL_[BHWD]$")>; 14680b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^(SPLAT|SPLATI)_[BHWD]$")>; 14690b57cec5SDimitry Andric 14700b57cec5SDimitry Andric// fexp2_w, fexp2_d 14710b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FEXP2_(W|D)$")>; 14720b57cec5SDimitry Andric 14730b57cec5SDimitry Andric// compare, converts, round to int, floating point truncate. 14740b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^(CLT|CLTI)_(S|U)_[BHWD]$")>; 14750b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^(CLE|CLEI)_(S|U)_[BHWD]$")>; 14760b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^(CEQ|CEQI)_[BHWD]$")>; 14770b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_UN_(S|D)$")>; 14780b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_UEQ_(S|D)$")>; 14790b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_EQ_(S|D)$")>; 14800b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_LT_(S|D)$")>; 14810b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_ULT_(S|D)$")>; 14820b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_LE_(S|D)$")>; 14830b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_ULE_(S|D)$")>; 14840b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_F_(D|S)$")>; 14850b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_SAF_(D|S)$")>; 14860b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_SEQ_(D|S)$")>; 14870b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_SLE_(D|S)$")>; 14880b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_SLT_(D|S)$")>; 14890b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_SUEQ_(D|S)$")>; 14900b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_SULE_(D|S)$")>; 14910b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_SULT_(D|S)$")>; 14920b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^CMP_SUN_(D|S)$")>; 14930b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FS(AF|EQ|LT|LE|NE|OR)_(W|D)$")>; 14940b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FSUEQ_(W|D)$")>; 14950b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FSULE_(W|D)$")>; 14960b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FSULT_(W|D)$")>; 14970b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FSUNE_(W|D)$")>; 14980b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FSUN_(W|D)$")>; 14990b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FCAF_(W|D)$")>; 15000b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FCEQ_(W|D)$")>; 15010b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FCLE_(W|D)$")>; 15020b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FCLT_(W|D)$")>; 15030b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FCNE_(W|D)$")>; 15040b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FCOR_(W|D)$")>; 15050b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FCUEQ_(W|D)$")>; 15060b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FCULE_(W|D)$")>; 15070b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FCULT_(W|D)$")>; 15080b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FCUNE_(W|D)$")>; 15090b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FCUN_(W|D)$")>; 15100b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FABS_(W|D)$")>; 15110b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FFINT_(U|S)_(W|D)$")>; 15120b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FFQL_(W|D)$")>; 15130b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FFQR_(W|D)$")>; 15140b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FTINT_(U|S)_(W|D)$")>; 15150b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FRINT_(W|D)$")>; 15160b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FTQ_(H|W)$")>; 15170b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FTRUNC_(U|S)_(W|D)$")>; 15180b57cec5SDimitry Andric 15190b57cec5SDimitry Andric// fexdo.[hw], fexupl.[wd], fexupr.[wd] 15200b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FEXDO_(H|W)$")>; 15210b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FEXUPL_(W|D)$")>; 15220b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FEXUPR_(W|D)$")>; 15230b57cec5SDimitry Andric 15240b57cec5SDimitry Andric// fclass.[wd], fmax.[wd], fmax_a.[wd], fmin.[wd], fmin_a.[wd], flog2.[wd] 15250b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FCLASS_(W|D)$")>; 15260b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FMAX_A_(W|D)$")>; 15270b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FMAX_(W|D)$")>; 15280b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FMIN_A_(W|D)$")>; 15290b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FMIN_(W|D)$")>; 15300b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUS], (instregex "^FLOG2_(W|D)$")>; 15310b57cec5SDimitry Andric 15320b57cec5SDimitry Andric// interleave right/left, interleave even/odd, insert 15330b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(ILVR|ILVL)_[BHWD]$")>; 15340b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(ILVEV|ILVOD)_[BHWD]$")>; 15350b57cec5SDimitry Andric 15360b57cec5SDimitry Andric// subs_?.[bhwd], subsus_?.[bhwd], subsuu_?.[bhwd], subvi.[bhwd], subv.[bhwd], 15370b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^SUBS_(S|U)_[BHWD]$")>; 15380b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^SUBSUS_(S|U)_[BHWD]$")>; 15390b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^SUBSUU_(S|U)_[BHWD]$")>; 15400b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^SUBVI_[BHWD]$")>; 15410b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortInt], (instregex "^SUBV_[BHWD]$")>; 15420b57cec5SDimitry Andric 15430b57cec5SDimitry Andric// mod_[su].[bhwd], div_[su].[bhwd] 15440b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUDivI], (instregex "^MOD_(S|U)_[BHWD]$")>; 15450b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUDivI], (instregex "^DIV_(S|U)_[BHWD]$")>; 15460b57cec5SDimitry Andric 15470b57cec5SDimitry Andric// hadd_[su].[bhwd], hsub_[su].[bhwd], max_[sua].[bhwd], min_[sua].[bhwd], 15480b57cec5SDimitry Andric// maxi_[su].[bhwd], mini_[su].[bhwd], sra?.[bhwd], srar?.[bhwd], srlr.[bhwd], 15490b57cec5SDimitry Andric// sll?.[bhwd], pckev.[bhwd], pckod.[bhwd], nloc.[bhwd], nlzc.[bhwd], 15500b57cec5SDimitry Andric// insve.[bhwd] 15510b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^HADD_(S|U)_[BHWD]$")>; 15520b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^HSUB_(S|U)_[BHWD]$")>; 15530b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(MAX|MIN)_S_[BHWD]$")>; 15540b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(MAX|MIN)_U_[BHWD]$")>; 15550b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(MAX|MIN)_A_[BHWD]$")>; 15560b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], 15570b57cec5SDimitry Andric (instregex "^(MAXI|MINI)_(S|U)_[BHWD]$")>; 15580b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(SRA|SRAI)_[BHWD]$")>; 15590b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(SRL|SRLI)_[BHWD]$")>; 15600b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(SRAR|SRARI)_[BHWD]$")>; 15610b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(SRLR|SRLRI)_[BHWD]$")>; 15620b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(SLL|SLLI)_[BHWD]$")>; 15630b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(PCKEV|PCKOD)_[BHWD]$")>; 15640b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^(NLOC|NLZC)_[BHWD]$")>; 15650b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^INSVE_[BHWD]$")>; 15660b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^INSERT_F(D|W)_PSEUDO$")>; 15670b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSAShortLogic], (instregex "^FILL_F(D|W)_PSEUDO$")>; 15680b57cec5SDimitry Andric 15690b57cec5SDimitry Andric// dpadd_?.[bhwd], dpsub_?.[bhwd], dotp_?.[bhwd], msubv.[bhwd], maddv.[bhwd] 15700b57cec5SDimitry Andric// mulv.[bhwd]. 15710b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSALongInt], (instregex "^DPADD_(S|U)_[HWD]$")>; 15720b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSALongInt], (instregex "^DPSUB_(S|U)_[HWD]$")>; 15730b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSALongInt], (instregex "^DOTP_(S|U)_[HWD]$")>; 15740b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSALongInt], (instregex "^MSUBV_[BHWD]$")>; 15750b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSALongInt], (instregex "^MADDV_[BHWD]$")>; 15760b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSALongInt], (instregex "^MULV_[BHWD]$")>; 15770b57cec5SDimitry Andric 15780b57cec5SDimitry Andric// madd?.q.[hw], msub?.q.[hw], mul?.q.[hw] 15790b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSALongInt], (instregex "^MADDR_Q_[HW]$")>; 15800b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSALongInt], (instregex "^MADD_Q_[HW]$")>; 15810b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSALongInt], (instregex "^MSUBR_Q_[HW]$")>; 15820b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSALongInt], (instregex "^MSUB_Q_[HW]$")>; 15830b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSALongInt], (instregex "^MULR_Q_[HW]$")>; 15840b57cec5SDimitry Andricdef : InstRW<[GenericWriteMSALongInt], (instregex "^MUL_Q_[HW]$")>; 15850b57cec5SDimitry Andric 15860b57cec5SDimitry Andric// fadd.[dw], fmadd.[dw], fmul.[dw], frcp.[dw], frsqrt.[dw], fsqrt.[dw] 15870b57cec5SDimitry Andric// fsub.[dw], fdiv.[dw] 15880b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], (instregex "^FADD_[DW]$")>; 15890b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], (instregex "^FMADD_[DW]$")>; 15900b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], (instregex "^FMSUB_[DW]$")>; 15910b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], (instregex "^FMUL_[DW]$")>; 15920b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], (instregex "^FRCP_[DW]$")>; 15930b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], (instregex "^FRSQRT_[DW]$")>; 15940b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], (instregex "^FSQRT_[DW]$")>; 15950b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], (instregex "^FSUB_[DW]$")>; 15960b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUL], (instregex "^FDIV_[DW]$")>; 15970b57cec5SDimitry Andric 15980b57cec5SDimitry Andric// copy.[su]_[bhwd] 15990b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUMoveGPRFPU], (instregex "^COPY_U_[BHW]$")>; 16000b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUMoveGPRFPU], (instregex "^COPY_S_[BHWD]$")>; 16010b57cec5SDimitry Andric 16020b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUStore], (instregex "^ST_[BHWD]$")>; 16030b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPUStore], (instrs ST_F16)>; 16040b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPULoad], (instregex "^LD_[BHWD]$")>; 16050b57cec5SDimitry Andricdef : InstRW<[GenericWriteFPULoad], (instrs LD_F16)>; 16060b57cec5SDimitry Andric 16070b57cec5SDimitry Andric// Atomic instructions 16080b57cec5SDimitry Andric 16090b57cec5SDimitry Andric// FIXME: Define `WriteAtomic` in the MipsSchedule.td and 16100b57cec5SDimitry Andric// attach it to the Atomic2OpsPostRA, AtomicCmpSwapPostRA, ... 16110b57cec5SDimitry Andric// classes. Then just define resources for the `WriteAtomic` in each 16120b57cec5SDimitry Andric// machine models. 16130b57cec5SDimitry Andricdef GenericAtomic : ProcResource<1> { let BufferSize = 1; } 16140b57cec5SDimitry Andricdef GenericWriteAtomic : SchedWriteRes<[GenericAtomic]> { let Latency = 2; } 16150b57cec5SDimitry Andric 16160b57cec5SDimitry Andricdef : InstRW<[GenericWriteAtomic], 16170b57cec5SDimitry Andric (instregex "^ATOMIC_SWAP_I(8|16|32|64)_POSTRA$")>; 16180b57cec5SDimitry Andricdef : InstRW<[GenericWriteAtomic], 16190b57cec5SDimitry Andric (instregex "^ATOMIC_CMP_SWAP_I(8|16|32|64)_POSTRA$")>; 16200b57cec5SDimitry Andricdef : InstRW<[GenericWriteAtomic], 1621480093f4SDimitry Andric (instregex "^ATOMIC_LOAD_(ADD|SUB|AND|OR|XOR|NAND|MIN|MAX|UMIN|UMAX)" 1622480093f4SDimitry Andric "_I(8|16|32|64)_POSTRA$")>; 16230b57cec5SDimitry Andric} 1624