10b57cec5SDimitry Andric//===-- PPCScheduleP7.td - PPC P7 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// 9*5f757f3fSDimitry Andric// This file defines the SchedModel for the POWER7 processor. 100b57cec5SDimitry Andric// 110b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andricdef P7Model : SchedMachineModel { 140b57cec5SDimitry Andric let IssueWidth = 6; // 4 (non-branch) instructions are dispatched per cycle. 150b57cec5SDimitry Andric // Note that the dispatch bundle size is 6 (including 160b57cec5SDimitry Andric // branches), but the total internal issue bandwidth per 170b57cec5SDimitry Andric // cycle (from all queues) is 8. 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric let LoadLatency = 3; // Optimistic load latency assuming bypass. 200b57cec5SDimitry Andric // This is overriden by OperandCycles if the 210b57cec5SDimitry Andric // Itineraries are queried instead. 220b57cec5SDimitry Andric let MispredictPenalty = 16; 230b57cec5SDimitry Andric 24*5f757f3fSDimitry Andric let MicroOpBufferSize = 44; 25*5f757f3fSDimitry Andric 260b57cec5SDimitry Andric // Try to make sure we have at least 10 dispatch groups in a loop. 270b57cec5SDimitry Andric let LoopMicroOpBufferSize = 40; 280b57cec5SDimitry Andric 290b57cec5SDimitry Andric let CompleteModel = 0; 300b57cec5SDimitry Andric 31*5f757f3fSDimitry Andric let UnsupportedFeatures = [HasSPE, PrefixInstrs, MMA, 32*5f757f3fSDimitry Andric PairedVectorMemops, IsISA3_0, IsISA2_07, 33*5f757f3fSDimitry Andric PCRelativeMemops, IsISA3_1, IsISAFuture]; 340b57cec5SDimitry Andric} 350b57cec5SDimitry Andric 36*5f757f3fSDimitry Andriclet SchedModel = P7Model in { 37*5f757f3fSDimitry Andric def P7_LSU_FXU: ProcResource<4>; 38*5f757f3fSDimitry Andric def P7_LSU: ProcResource<2> { 39*5f757f3fSDimitry Andric let Super = P7_LSU_FXU; 40*5f757f3fSDimitry Andric } 41*5f757f3fSDimitry Andric def P7_FXU: ProcResource<2> { 42*5f757f3fSDimitry Andric let Super = P7_LSU_FXU; 43*5f757f3fSDimitry Andric } 44*5f757f3fSDimitry Andric // Implemented as two 2-way SIMD operations for double- and single-precision. 45*5f757f3fSDimitry Andric def P7_FPU: ProcResource<4>; 46*5f757f3fSDimitry Andric // Scalar binary floating point instructions can only use two FPUs. 47*5f757f3fSDimitry Andric def P7_ScalarFPU: ProcResource<2> { 48*5f757f3fSDimitry Andric let Super = P7_FPU; 49*5f757f3fSDimitry Andric } 50*5f757f3fSDimitry Andric def P7_VectorFPU: ProcResource<2> { 51*5f757f3fSDimitry Andric let Super = P7_FPU; 52*5f757f3fSDimitry Andric } 53*5f757f3fSDimitry Andric // Executing simple FX, complex FX, permute and 4-way SIMD single-precision FP ops 54*5f757f3fSDimitry Andric def P7_VMX: ProcResource<1>; 55*5f757f3fSDimitry Andric def P7_VPM: ProcResource<1> { 56*5f757f3fSDimitry Andric let Super = P7_VMX; 57*5f757f3fSDimitry Andric let BufferSize = 1; 58*5f757f3fSDimitry Andric } 59*5f757f3fSDimitry Andric def P7_VXS: ProcResource<1> { 60*5f757f3fSDimitry Andric let Super = P7_VMX; 61*5f757f3fSDimitry Andric } 62*5f757f3fSDimitry Andric def P7_DFU: ProcResource<1>; 63*5f757f3fSDimitry Andric def P7_BRU: ProcResource<1>; 64*5f757f3fSDimitry Andric def P7_CRU: ProcResource<1>; 65*5f757f3fSDimitry Andric 66*5f757f3fSDimitry Andric def P7_PORT_LS : ProcResource<2>; 67*5f757f3fSDimitry Andric def P7_PORT_FX : ProcResource<2>; 68*5f757f3fSDimitry Andric def P7_PORT_FP : ProcResource<2>; 69*5f757f3fSDimitry Andric def P7_PORT_BR : ProcResource<1>; 70*5f757f3fSDimitry Andric def P7_PORT_CR : ProcResource<1>; 71*5f757f3fSDimitry Andric 72*5f757f3fSDimitry Andric def P7_DISP_LS : SchedWriteRes<[P7_PORT_LS]>; 73*5f757f3fSDimitry Andric def P7_DISP_FX : SchedWriteRes<[P7_PORT_FX]>; 74*5f757f3fSDimitry Andric def P7_DISP_FP : SchedWriteRes<[P7_PORT_FP]>; 75*5f757f3fSDimitry Andric def P7_DISP_BR : SchedWriteRes<[P7_PORT_BR]>; 76*5f757f3fSDimitry Andric def P7_DISP_CR : SchedWriteRes<[P7_PORT_CR]>; 77*5f757f3fSDimitry Andric 78*5f757f3fSDimitry Andric def P7_BRU_NONE : SchedWriteRes<[P7_BRU]>; 79*5f757f3fSDimitry Andric def P7_BRU_3C : SchedWriteRes<[P7_BRU]> { let Latency = 3; } 80*5f757f3fSDimitry Andric def P7_BRU_4C : SchedWriteRes<[P7_BRU]> { let Latency = 4; } 81*5f757f3fSDimitry Andric def P7_CRU_NONE : SchedWriteRes<[P7_CRU]>; 82*5f757f3fSDimitry Andric def P7_CRU_3C : SchedWriteRes<[P7_CRU]> { let Latency = 3; } 83*5f757f3fSDimitry Andric def P7_CRU_6C : SchedWriteRes<[P7_CRU]> { let Latency = 6; } 84*5f757f3fSDimitry Andric def P7_LSU_NONE : SchedWriteRes<[P7_LSU]>; 85*5f757f3fSDimitry Andric def P7_LSU_2C : SchedWriteRes<[P7_LSU]> { let Latency = 2; } 86*5f757f3fSDimitry Andric def P7_LSU_3C : SchedWriteRes<[P7_LSU]> { let Latency = 3; } 87*5f757f3fSDimitry Andric def P7_LSU_4C : SchedWriteRes<[P7_LSU]> { let Latency = 4; } 88*5f757f3fSDimitry Andric def P7_FXU_NONE : SchedWriteRes<[P7_FXU]>; 89*5f757f3fSDimitry Andric def P7_FXU_2C : SchedWriteRes<[P7_FXU]> { let Latency = 2; } 90*5f757f3fSDimitry Andric def P7_FXU_3C : SchedWriteRes<[P7_FXU]> { let Latency = 3; } 91*5f757f3fSDimitry Andric def P7_FXU_4C : SchedWriteRes<[P7_FXU]> { let Latency = 4; } 92*5f757f3fSDimitry Andric def P7_FXU_5C : SchedWriteRes<[P7_FXU]> { let Latency = 5; } 93*5f757f3fSDimitry Andric def P7_FXU_38C : SchedWriteRes<[P7_FXU]> { let Latency = 38; } 94*5f757f3fSDimitry Andric def P7_FXU_69C : SchedWriteRes<[P7_FXU]> { let Latency = 69; } 95*5f757f3fSDimitry Andric def P7_LSU_FXU_2C : SchedWriteRes<[P7_LSU_FXU]> { let Latency = 2; } 96*5f757f3fSDimitry Andric def P7_FPU_NONE : SchedWriteRes<[P7_FPU]>; 97*5f757f3fSDimitry Andric def P7_VectorFPU_6C : SchedWriteRes<[P7_VectorFPU]> { let Latency = 6; } 98*5f757f3fSDimitry Andric def P7_VectorFPU_25C : SchedWriteRes<[P7_VectorFPU]> { let Latency = 25; } 99*5f757f3fSDimitry Andric def P7_VectorFPU_30C : SchedWriteRes<[P7_VectorFPU]> { let Latency = 30; } 100*5f757f3fSDimitry Andric def P7_VectorFPU_31C : SchedWriteRes<[P7_VectorFPU]> { let Latency = 31; } 101*5f757f3fSDimitry Andric def P7_VectorFPU_42C : SchedWriteRes<[P7_VectorFPU]> { let Latency = 42; } 102*5f757f3fSDimitry Andric def P7_ScalarFPU_6C : SchedWriteRes<[P7_ScalarFPU]> { let Latency = 6; } 103*5f757f3fSDimitry Andric def P7_ScalarFPU_8C : SchedWriteRes<[P7_ScalarFPU]> { let Latency = 8; } 104*5f757f3fSDimitry Andric def P7_ScalarFPU_27C : SchedWriteRes<[P7_ScalarFPU]> { let Latency = 27; } 105*5f757f3fSDimitry Andric def P7_ScalarFPU_31C : SchedWriteRes<[P7_ScalarFPU]> { let Latency = 31; } 106*5f757f3fSDimitry Andric def P7_ScalarFPU_32C : SchedWriteRes<[P7_ScalarFPU]> { let Latency = 32; } 107*5f757f3fSDimitry Andric def P7_ScalarFPU_33C : SchedWriteRes<[P7_ScalarFPU]> { let Latency = 33; } 108*5f757f3fSDimitry Andric def P7_ScalarFPU_42C : SchedWriteRes<[P7_ScalarFPU]> { let Latency = 42; } 109*5f757f3fSDimitry Andric def P7_ScalarFPU_44C : SchedWriteRes<[P7_ScalarFPU]> { let Latency = 44; } 110*5f757f3fSDimitry Andric def P7_VXS_2C : SchedWriteRes<[P7_VXS]> { let Latency = 2; } 111*5f757f3fSDimitry Andric def P7_VPM_3C : SchedWriteRes<[P7_VPM]> { let Latency = 3; } 112*5f757f3fSDimitry Andric 113*5f757f3fSDimitry Andric // Instruction of BRU pipeline 114*5f757f3fSDimitry Andric 115*5f757f3fSDimitry Andric def : InstRW<[P7_BRU_NONE, P7_DISP_BR], 116*5f757f3fSDimitry Andric (instregex "^B(L)?(A)?(8)?(_NOP|_NOTOC)?(_TLS|_RM)?(_)?$")>; 117*5f757f3fSDimitry Andric 118*5f757f3fSDimitry Andric def : InstRW<[P7_BRU_3C, P7_DISP_BR], (instrs 119*5f757f3fSDimitry Andric BDZLRLp, BDZLRm, BDZLRp, BDZLm, BDZLp, BDZm, BDZp, 120*5f757f3fSDimitry Andric BDNZ, BDNZ8, BDNZA, BDNZAm, BDNZAp, BDNZL, BDNZLA, BDNZLAm, BDNZLAp, BDNZLR, 121*5f757f3fSDimitry Andric BDNZLR8, BDNZLRL, BDNZLRLm, BDNZLRLp, BDNZLRm, BDNZLRp, BDNZLm, BDNZLp, 122*5f757f3fSDimitry Andric BDNZm, BDNZp, BDZ, BDZ8, BDZA, BDZAm, BDZAp, BDZL, BDZLA, BDZLAm, BDZLAp, 123*5f757f3fSDimitry Andric BDZLR, BDZLR8, BDZLRL, BDZLRLm, BLR, BLR8, BLRL, BCL, BCLR, BCLRL, BCLRLn, 124*5f757f3fSDimitry Andric BCLRn, BCLalways, BCLn, BCTR, BCTR8, BCTRL, BCTRL8, BCTRL8_LDinto_toc, 125*5f757f3fSDimitry Andric BCTRL8_LDinto_toc_RM, BCTRL8_RM, BCTRL_LWZinto_toc, BCTRL_LWZinto_toc_RM, 126*5f757f3fSDimitry Andric BCTRL_RM, BCn, BC, BCC, BCCA, BCCCTR, BCCCTR8, BCCCTRL, BCCCTRL8, BCCL, 127*5f757f3fSDimitry Andric BCCLA, BCCLR, BCCLRL, BCCTR, BCCTR8, BCCTR8n, BCCTRL, BCCTRL8, 128*5f757f3fSDimitry Andric BCCCTR, BCCCTR8, BCCCTRL, BCCCTRL8, BCCL, BCCLA, BCCLR, BCCLRL, BCCTR, 129*5f757f3fSDimitry Andric BCCTR8, BCCTR8n, BCCTRL, BCCTRL8, BCCTRL8n, BCCTRLn, BCCTRn, gBC, gBCA, 130*5f757f3fSDimitry Andric gBCAat, gBCCTR, gBCCTRL, gBCL, gBCLA, gBCLAat, gBCLR, gBCLRL, gBCLat, gBCat, 131*5f757f3fSDimitry Andric MFCTR, MFCTR8, MFLR, MFLR8 132*5f757f3fSDimitry Andric )>; 133*5f757f3fSDimitry Andric 134*5f757f3fSDimitry Andric def : InstRW<[P7_BRU_4C], (instrs MTLR, MTLR8, MTCTR, MTCTR8, MTCTR8loop, MTCTRloop)>; 135*5f757f3fSDimitry Andric 136*5f757f3fSDimitry Andric // Instructions of CRU pipeline 137*5f757f3fSDimitry Andric 138*5f757f3fSDimitry Andric def : InstRW<[P7_CRU_NONE], (instrs MFCR, MFCR8)>; 139*5f757f3fSDimitry Andric def : InstRW<[P7_CRU_3C], (instrs MCRF)>; 140*5f757f3fSDimitry Andric def : InstRW<[P7_CRU_6C, P7_DISP_CR], (instrs 141*5f757f3fSDimitry Andric CR6SET, CR6UNSET, CRSET, CRUNSET, 142*5f757f3fSDimitry Andric CRAND, CRANDC, CREQV, CRNAND, CRNOR, CRNOT, CROR, CRORC 143*5f757f3fSDimitry Andric )>; 144*5f757f3fSDimitry Andric 145*5f757f3fSDimitry Andric // Instructions of LSU and FXU pipelines 146*5f757f3fSDimitry Andric 147*5f757f3fSDimitry Andric def : InstRW<[P7_LSU_NONE, P7_DISP_LS], (instrs LMW, LWARX, LWARXL, LDARX, LDARXL)>; 148*5f757f3fSDimitry Andric def : InstRW<[P7_LSU_2C, P7_DISP_LS], (instrs LHBRX, LHBRX8, LWBRX, LWBRX8)>; 149*5f757f3fSDimitry Andric def : InstRW<[P7_LSU_3C], (instrs MFSR, MFSRIN)>; 150*5f757f3fSDimitry Andric 151*5f757f3fSDimitry Andric def : InstRW<[P7_LSU_3C, P7_DISP_LS], (instrs 152*5f757f3fSDimitry Andric LFS, LFSX, LFSXTLS, LFSXTLS_, LFD, LFDX, LFDXTLS, LFDXTLS_, LXSDX, LXVD2X, 153*5f757f3fSDimitry Andric LXVW4X, LXVDSX 154*5f757f3fSDimitry Andric )>; 155*5f757f3fSDimitry Andric 156*5f757f3fSDimitry Andric def : InstRW<[P7_LSU_3C, P7_FXU_3C, P7_DISP_LS], (instrs 157*5f757f3fSDimitry Andric LFSU, LFSUX, LFDU, LFDUX)>; 158*5f757f3fSDimitry Andric 159*5f757f3fSDimitry Andric def : InstRW<[P7_LSU_NONE, P7_FPU_NONE, P7_DISP_LS], (instrs 160*5f757f3fSDimitry Andric STXSDX, STXVD2X, STXVW4X)>; 161*5f757f3fSDimitry Andric 162*5f757f3fSDimitry Andric def : InstRW<[P7_LSU_4C, P7_FXU_4C, P7_DISP_LS], (instrs 163*5f757f3fSDimitry Andric LBARX, LBZCIX, LDBRX, LDCIX, LFIWAX, LFIWZX, LHARX, LHZCIX, LSWI, LVEBX, 164*5f757f3fSDimitry Andric LVEHX, LVEWX, LVSL, LVSR, LVX, LVXL, LWZCIX, 165*5f757f3fSDimitry Andric STFD, STFDU, STFDUX, STFDX, STFIWX, STFS, STFSU, STFSUX, STFSX, 166*5f757f3fSDimitry Andric STHCIX, STSWI, STVEBX, STVEHX, STVEWX, STVX, STVXL, STWCIX, 167*5f757f3fSDimitry Andric LHA, LHA8, LHAX, LHAX8, LWA, LWAX, LWAX_32, LWA_32, LHAU, LHAU8, 168*5f757f3fSDimitry Andric LHAUX, LHAUX8, LWAUX 169*5f757f3fSDimitry Andric )>; 170*5f757f3fSDimitry Andric 171*5f757f3fSDimitry Andric def : InstRW<[P7_LSU_NONE, P7_FXU_NONE, P7_DISP_LS], (instrs 172*5f757f3fSDimitry Andric STB, STB8, STH, STH8, STW, STW8, STD, STBX, STBX8, STHX, STHX8, STWX, 173*5f757f3fSDimitry Andric STWX8, STDX, STHBRX, STWBRX, STMW, STWCX, STDCX, STDU, STHU, STHU8, 174*5f757f3fSDimitry Andric STBU, STBU8, STWU, STWU8, STDUX, STWUX, STWUX8, STHUX, STHUX8, STBUX, STBUX8 175*5f757f3fSDimitry Andric )>; 176*5f757f3fSDimitry Andric 177*5f757f3fSDimitry Andric def : InstRW<[P7_LSU_2C, P7_FXU_2C, P7_DISP_LS], (instrs 178*5f757f3fSDimitry Andric LWZU, LWZU8, LHZU, LHZU8, LBZU, LBZU8, LDU, 179*5f757f3fSDimitry Andric LWZUX, LWZUX8, LHZUX, LHZUX8, LBZUX, LBZUX8, LDUX 180*5f757f3fSDimitry Andric )>; 181*5f757f3fSDimitry Andric 182*5f757f3fSDimitry Andric def : InstRW<[P7_LSU_FXU_2C, P7_DISP_FX], (instrs 183*5f757f3fSDimitry Andric (instregex "^(ADD|L)I(S)?(8)?$"), 184*5f757f3fSDimitry Andric (instregex "^(ADD|SUBF)(4|8)(TLS)?(_)?(_rec)?$"), 185*5f757f3fSDimitry Andric (instregex "^(X)?ORI(S)?(8)?$"), 186*5f757f3fSDimitry Andric (instregex "^(X)OR(8)?(_rec)?$"), 187*5f757f3fSDimitry Andric ADDIC, ADDIC8, SUBFIC, SUBFIC8, SUBFZE, SUBFZE8, 188*5f757f3fSDimitry Andric ADDE, ADDE8, ADDME, ADDME8, SUBFME, SUBFME8, 189*5f757f3fSDimitry Andric NEG, NEG8, NEG8_rec, NEG_rec, NEG8O, NEGO, 190*5f757f3fSDimitry Andric ANDI_rec, ANDIS_rec, AND, AND8, AND_rec, AND8_rec, 191*5f757f3fSDimitry Andric NAND, NAND8, NAND_rec, NAND8_rec, NOR, NOR8, NOR_rec, NOR8_rec, 192*5f757f3fSDimitry Andric EQV, EQV8, EQV_rec, EQV8_rec, ANDC, ANDC8, ANDC_rec, ANDC8_rec, 193*5f757f3fSDimitry Andric ORC, ORC8, ORC_rec, ORC8_rec 194*5f757f3fSDimitry Andric )>; 195*5f757f3fSDimitry Andric 196*5f757f3fSDimitry Andric def : InstRW<[P7_FXU_2C, P7_DISP_FX], (instrs 197*5f757f3fSDimitry Andric CMPD, CMPDI, CMPLD, CMPLDI, CMPLW, CMPLWI, CMPW, CMPWI, 198*5f757f3fSDimitry Andric EXTSB8_32_64, EXTSB8_rec, EXTSH8_32_64, EXTSH8_rec, EXTSW_32, 199*5f757f3fSDimitry Andric EXTSW_32_64, EXTSW_32_64_rec, POPCNTB, POPCNTB8, POPCNTD, POPCNTW, 200*5f757f3fSDimitry Andric ADDPCIS, ANDI8_rec, ANDIS8_rec, SUBFUS, SUBFUS_rec, 201*5f757f3fSDimitry Andric ADD4O, ADD8O, ADDC, ADDC8, SUBFO, SUBF8O, SUBFC, SUBFC8, 202*5f757f3fSDimitry Andric ADDIC_rec, ADDE8_rec, ADDE_rec, SUBFE8_rec, SUBFE_rec, 203*5f757f3fSDimitry Andric ADDME8_rec, ADDME_rec, SUBFME8_rec, SUBFME_rec, ADDZE8_rec, ADDZE_rec, 204*5f757f3fSDimitry Andric SUBFZE_rec, SUBFZE8_rec, ADD8O_rec, SUBFO_rec, SUBF8O_rec, ADD4O_rec, 205*5f757f3fSDimitry Andric ADD8O_rec, SUBF8O_rec, SUBFO_rec, ADDE8O, ADDEO, SUBFE8O, SUBFEO, ADDME8O, 206*5f757f3fSDimitry Andric ADDMEO, SUBFME8O, SUBFMEO, ADDZE8O, ADDZEO, SUBFZE8O, SUBFZEO, NEG8O_rec, 207*5f757f3fSDimitry Andric NEGO_rec, ADDEO, ADDE8O, SUBFEO, SUBFE8O, ADDMEO, SUBFMEO, SUBFME8O, ADDME8O, 208*5f757f3fSDimitry Andric ADDZEO, ADDZE8O, SUBFZEO, SUBFZE8O, NEG8O_rec, NEGO_rec, 209*5f757f3fSDimitry Andric ADDE8O_rec, ADDEO_rec, ADDMEO_rec, ADDME8O_rec, SUBFMEO_rec, SUBFME8O_rec, 210*5f757f3fSDimitry Andric ADDZEO_rec, ADDZE8O_rec, SUBFZEO_rec, SUBFZE8O_rec, 211*5f757f3fSDimitry Andric ADDC8_rec, ADDC_rec, ADDCO, ADDCO_rec, ADDC8O, ADDC8O_rec, 212*5f757f3fSDimitry Andric SUBFC8_rec, SUBFC_rec, SUBFCO, SUBFC8O, SUBFCO_rec, SUBFC8O_rec, 213*5f757f3fSDimitry Andric EXTSB, EXTSB8, EXTSB_rec, EXTSH, EXTSH8, EXTSH_rec, EXTSW, EXTSW_rec, 214*5f757f3fSDimitry Andric RLDICL, RLDICL_rec, RLDICR, RLDICR_rec, RLDIC, RLDIC_rec, 215*5f757f3fSDimitry Andric RLWINM, RLWINM8, RLWINM_rec, RLDCL, RLDCL_rec, RLDCR, RLDCR_rec, 216*5f757f3fSDimitry Andric RLWNM, RLWNM8, RLWNM_rec, RLDIMI, RLDIMI_rec, 217*5f757f3fSDimitry Andric RLDICL_32, RLDICL_32_64, RLDICL_32_rec, RLDICR_32, RLWINM8_rec, RLWNM8_rec, 218*5f757f3fSDimitry Andric SLD, SLD_rec, SLW, SLW8, SLW_rec, SLW8_rec, SRD, SRD_rec, SRW, SRW8, SRW_rec, 219*5f757f3fSDimitry Andric SRW8_rec, SRADI, SRADI_rec, SRAWI, SRAWI_rec, SRAD, SRAD_rec, SRAW, SRAW_rec, 220*5f757f3fSDimitry Andric SRADI_32, SUBFE, SUBFE8, SUBFE8O_rec, SUBFEO_rec 221*5f757f3fSDimitry Andric )>; 222*5f757f3fSDimitry Andric 223*5f757f3fSDimitry Andric def : InstRW<[P7_FXU_3C, P7_DISP_FX], (instregex "^CNT(L|T)Z(D|W)(8)?(M)?(_rec)?$")>; 224*5f757f3fSDimitry Andric 225*5f757f3fSDimitry Andric def : InstRW<[P7_FXU_5C, P7_DISP_FX], (instrs 226*5f757f3fSDimitry Andric MULLI, MULLI8, MULLW, MULHW, MULHWU, MULLD, MULHD, MULHDU, MULLWO, MULLDO, 227*5f757f3fSDimitry Andric MULLW_rec, MULLD_rec, MULHD_rec, MULHW_rec, MULHDU_rec, MULHWU_rec, MULLWO_rec, 228*5f757f3fSDimitry Andric MULLDO_rec 229*5f757f3fSDimitry Andric )>; 230*5f757f3fSDimitry Andric 231*5f757f3fSDimitry Andric def : InstRW<[P7_FXU_38C, P7_DISP_FX], (instrs 232*5f757f3fSDimitry Andric DIVDE, DIVDEO, DIVDEO_rec, DIVDEU, DIVDEUO, DIVDEUO_rec, DIVDEU_rec, DIVDE_rec, 233*5f757f3fSDimitry Andric DIVWE, DIVWEO, DIVWEO_rec, DIVWEU, DIVWEUO, DIVWEUO_rec, DIVWEU_rec, DIVWE_rec, 234*5f757f3fSDimitry Andric DIVW, DIVWU, DIVWU_rec, DIVWO, DIVWO_rec, DIVWUO, DIVWUO_rec, DIVW_rec 235*5f757f3fSDimitry Andric )>; 236*5f757f3fSDimitry Andric 237*5f757f3fSDimitry Andric def : InstRW<[P7_FXU_69C, P7_DISP_FX], (instrs 238*5f757f3fSDimitry Andric DIVD, DIVDU, DIVDO, DIVDO_rec, DIVDUO, DIVDUO_rec, DIVDU_rec, DIVD_rec)>; 239*5f757f3fSDimitry Andric 240*5f757f3fSDimitry Andric // Instructions of FPU and VMX pipeline 241*5f757f3fSDimitry Andric 242*5f757f3fSDimitry Andric def : InstRW<[P7_ScalarFPU_6C, P7_DISP_FP], (instrs 243*5f757f3fSDimitry Andric (instregex "^F(N)?(M)?(R|ADD|SUB|ABS|NEG|NABS|UL)(D|S)?(_rec)?$"), 244*5f757f3fSDimitry Andric (instregex "^FC(T|F)I(D|W)(U)?(S)?(Z)?(_rec)?$"), 245*5f757f3fSDimitry Andric (instregex "^XS(N)?M(SUB|ADD)(A|M)(D|S)P$"), 246*5f757f3fSDimitry Andric (instregex "^XS(NEG|ABS|NABS|ADD|SUB|MUL)(D|S)P(s)?$"), 247*5f757f3fSDimitry Andric FRE, FRES_rec, FRE_rec, FRSP_rec, FTDIV, FTSQRT, 248*5f757f3fSDimitry Andric FRSP, FRES, FRSQRTE, FRSQRTES, FRSQRTES_rec, FRSQRTE_rec, FSELD, FSELS, 249*5f757f3fSDimitry Andric FSELD_rec, FSELS_rec, FCPSGND, FCPSGND_rec, FCPSGNS, FCPSGNS_rec, 250*5f757f3fSDimitry Andric FRIMD, FRIMD_rec, FRIMS, FRIMS_rec, FRIND, FRIND_rec, FRINS, FRINS_rec, 251*5f757f3fSDimitry Andric FRIPD, FRIPD_rec, FRIPS, FRIPS_rec, FRIZD, FRIZD_rec, FRIZS, FRIZS_rec, 252*5f757f3fSDimitry Andric XSCPSGNDP, XSCVDPSP, XSCVDPSXDS, XSCVDPSXDSs, XSCVDPSXWS, XSCVDPSXWSs, 253*5f757f3fSDimitry Andric XSCVDPUXDS, XSCVDPUXDSs, XSCVDPUXWS, XSCVDPUXWSs, XSCVSPDP, XSCVSXDDP, 254*5f757f3fSDimitry Andric XSCVUXDDP, XSMAXDP, XSMINDP, XSRDPI, XSRDPIC, XSRDPIM, XSRDPIP, XSRDPIZ, 255*5f757f3fSDimitry Andric XSREDP, XSRSQRTEDP, XSTDIVDP, XSTSQRTDP, XSCMPODP, XSCMPUDP 256*5f757f3fSDimitry Andric )>; 257*5f757f3fSDimitry Andric 258*5f757f3fSDimitry Andric def : InstRW<[P7_VectorFPU_6C, P7_DISP_FP], (instrs 259*5f757f3fSDimitry Andric (instregex "^XV(N)?(M)?(ADD|SUB)(A|M)?(D|S)P$"), 260*5f757f3fSDimitry Andric (instregex "^XV(MAX|MIN|MUL|NEG|ABS|ADD|NABS)(D|S)P$"), 261*5f757f3fSDimitry Andric XVCMPEQDP, XVCMPEQDP_rec, XVCMPGEDP, XVCMPGEDP_rec, XVCMPGTDP, XVCMPGTDP_rec, 262*5f757f3fSDimitry Andric XVCPSGNDP, XVCVDPSXDS, XVCVDPSXWS, XVCVDPUXDS, XVCVDPUXWS, XVCVSPSXDS, 263*5f757f3fSDimitry Andric XVCVSPSXWS, XVCVSPUXDS, XVCVSPUXWS, XVCVSXDDP, XVCVSXWDP, XVCVUXDDP, 264*5f757f3fSDimitry Andric XVCVUXWDP, XVRDPI, XVRDPIC, XVRDPIM, XVRDPIP, XVRDPIZ, XVREDP, 265*5f757f3fSDimitry Andric XVRSPI, XVRSPIC, XVRSPIM, XVRSPIP, XVRSPIZ, XVRSQRTEDP, XVTDIVDP, 266*5f757f3fSDimitry Andric XVTSQRTDP 267*5f757f3fSDimitry Andric )>; 268*5f757f3fSDimitry Andric 269*5f757f3fSDimitry Andric // TODO: Altivec instructions are not listed in Book IV. 270*5f757f3fSDimitry Andric def : InstRW<[P7_VPM_3C, P7_DISP_FP], (instrs 271*5f757f3fSDimitry Andric (instregex "^VPK(S|U)(H|W)(S|U)(S|M)$"), 272*5f757f3fSDimitry Andric (instregex "^VUPK(H|L)(S|P)(X|B|H)$"), 273*5f757f3fSDimitry Andric VPERM, XXMRGHW, XXMRGLW, XXPERMDI, XXPERMDIs, XXSLDWI, XXSLDWIs, 274*5f757f3fSDimitry Andric VSPLTB, VSPLTBs, VSPLTH, VSPLTHs, VSPLTISB, VSPLTISH, VSPLTISW, VSPLTW, 275*5f757f3fSDimitry Andric XXSPLTW, XXSPLTWs, VSEL, XXSEL, VPKPX 276*5f757f3fSDimitry Andric )>; 277*5f757f3fSDimitry Andric 278*5f757f3fSDimitry Andric def : InstRW<[P7_VXS_2C, P7_DISP_FP], (instrs 279*5f757f3fSDimitry Andric (instregex "^VADD(U|S)(B|H|W)(S|M)$"), 280*5f757f3fSDimitry Andric (instregex "^V(MAX|MIN)(S|U)(B|H|W)$"), 281*5f757f3fSDimitry Andric (instregex "^V(MRG)(L|H)(B|H|W)$"), 282*5f757f3fSDimitry Andric XXLORf, XXLXORdpz, XXLXORspz, XXLXORz, XVRSQRTESP, XVRESP, 283*5f757f3fSDimitry Andric XVTDIVSP, XVTSQRTSP, XVCMPEQSP, XVCMPEQSP_rec, XVCMPGESP, XVCMPGESP_rec, 284*5f757f3fSDimitry Andric XVCMPGTSP, XVCMPGTSP_rec, XVCVSXDSP, XVCVSXWSP, XVCVUXDSP, XVCVUXWSP, 285*5f757f3fSDimitry Andric XVCPSGNSP, XVCVDPSP, VADDCUW, VADDFP, VAND, VANDC, VAVGSB, VAVGSH, 286*5f757f3fSDimitry Andric VAVGSW, VAVGUB, VAVGUH, VAVGUW, VCFSX, VCFUX, VCMPBFP, VCMPBFP_rec, 287*5f757f3fSDimitry Andric VCMPEQFP, VCMPEQFP_rec, VCMPEQUB, VCMPEQUB_rec, VCMPEQUH, VCMPEQUH_rec, 288*5f757f3fSDimitry Andric VCMPEQUW, VCMPEQUW_rec, VCMPGEFP, VCMPGEFP_rec, VCMPGTFP, VCMPGTFP_rec, 289*5f757f3fSDimitry Andric VCMPGTSB, VCMPGTSB_rec, VCMPGTSH, VCMPGTSH_rec, VCMPGTSW, VCMPGTSW_rec, 290*5f757f3fSDimitry Andric VCMPGTUB, VCMPGTUB_rec, VCMPGTUH, VCMPGTUH_rec, VCMPGTUW, VCMPGTUW_rec, 291*5f757f3fSDimitry Andric VCTSXS, VCTUXS, VEXPTEFP, VLOGEFP, VNOR, VOR, 292*5f757f3fSDimitry Andric VMADDFP, VMHADDSHS, VMHRADDSHS, VMLADDUHM, VNMSUBFP, VMAXFP, VMINFP, 293*5f757f3fSDimitry Andric VMSUMMBM, VMSUMSHM, VMSUMSHS, VMSUMUBM, VMSUMUDM, VMSUMUHM, VMSUMUHS, 294*5f757f3fSDimitry Andric VMULESB, VMULESH, VMULEUB, VMULEUH, VMULOSB, VMULOSH, VMULOUB, VMULOUH, 295*5f757f3fSDimitry Andric VREFP, VRFIM, VRFIN, VRFIP, VRFIZ, VRLB, VRLH, VRLW, VRSQRTEFP, 296*5f757f3fSDimitry Andric VSR, VSRAB, VSRAH, VSRAW, VSRB, VSRH, VSRO, VSRW, VSUBCUW, VSL, VSLB, 297*5f757f3fSDimitry Andric VSLDOI, VSLH, VSLO, VSLW, VSUBFP, VSUBSBS, VSUBSHS, VSUBSWS, VSUBUBM, 298*5f757f3fSDimitry Andric VSUBUBS, VSUBUHM, VSUBUHS, VSUBUWM, VSUBUWS, VSUM2SWS, VSUM4SBS, VSUM4SHS, 299*5f757f3fSDimitry Andric VSUM4UBS, VSUMSWS, VXOR, XXLAND, XXLANDC, XXLNOR, XXLOR, XXLXOR 300*5f757f3fSDimitry Andric )>; 301*5f757f3fSDimitry Andric 302*5f757f3fSDimitry Andric def : InstRW<[P7_ScalarFPU_8C, P7_DISP_FP], 303*5f757f3fSDimitry Andric (instrs FCMPOD, FCMPOS, FCMPUD, FCMPUS)>; 304*5f757f3fSDimitry Andric def : InstRW<[P7_ScalarFPU_27C, P7_DISP_FP], (instrs FDIVS, FDIVS_rec)>; 305*5f757f3fSDimitry Andric def : InstRW<[P7_ScalarFPU_31C, P7_DISP_FP], (instrs XSDIVDP)>; 306*5f757f3fSDimitry Andric def : InstRW<[P7_ScalarFPU_32C, P7_DISP_FP], (instrs FSQRTS, XSSQRTSP, FSQRTS_rec)>; 307*5f757f3fSDimitry Andric def : InstRW<[P7_ScalarFPU_33C, P7_DISP_FP], (instrs FDIV, FDIV_rec)>; 308*5f757f3fSDimitry Andric def : InstRW<[P7_ScalarFPU_42C, P7_DISP_FP], (instrs XSSQRTDP)>; 309*5f757f3fSDimitry Andric def : InstRW<[P7_ScalarFPU_44C, P7_DISP_FP], (instrs FSQRT, FSQRT_rec)>; 310*5f757f3fSDimitry Andric 311*5f757f3fSDimitry Andric def : InstRW<[P7_VectorFPU_25C, P7_DISP_FP], (instrs XVDIVSP)>; 312*5f757f3fSDimitry Andric def : InstRW<[P7_VectorFPU_30C, P7_DISP_FP], (instrs XVSQRTSP)>; 313*5f757f3fSDimitry Andric def : InstRW<[P7_VectorFPU_31C, P7_DISP_FP], (instrs XVDIVDP)>; 314*5f757f3fSDimitry Andric def : InstRW<[P7_VectorFPU_42C, P7_DISP_FP], (instrs XVSQRTDP)>; 315*5f757f3fSDimitry Andric} 316