10b57cec5SDimitry Andric//===-- PPCScheduleP8.td - PPC P8 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 POWER8 processor. 100b57cec5SDimitry Andric// 110b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andricdef P8Model : SchedMachineModel { 14*5f757f3fSDimitry Andric let IssueWidth = 8; 15*5f757f3fSDimitry Andric let LoadLatency = 3; 160b57cec5SDimitry Andric let MispredictPenalty = 16; 170b57cec5SDimitry Andric let LoopMicroOpBufferSize = 60; 18*5f757f3fSDimitry Andric let MicroOpBufferSize = 64; 19*5f757f3fSDimitry Andric // TODO: Due to limitation of instruction definitions, non-P8 instructions 20*5f757f3fSDimitry Andric // are required to be listed here. Change this after it got fixed. 210b57cec5SDimitry Andric let CompleteModel = 0; 22*5f757f3fSDimitry Andric let UnsupportedFeatures = [HasSPE, PrefixInstrs, MMA, 23*5f757f3fSDimitry Andric PairedVectorMemops, PCRelativeMemops, 24*5f757f3fSDimitry Andric IsISA3_0, IsISA3_1, IsISAFuture]; 250b57cec5SDimitry Andric} 260b57cec5SDimitry Andric 27*5f757f3fSDimitry Andriclet SchedModel = P8Model in { 28*5f757f3fSDimitry Andric // Power8 Pipeline Units: 29*5f757f3fSDimitry Andric 30*5f757f3fSDimitry Andric def P8_LU_LS_FX : ProcResource<6>; 31*5f757f3fSDimitry Andric def P8_LU_LS : ProcResource<4> { let Super = P8_LU_LS_FX; } 32*5f757f3fSDimitry Andric def P8_LS : ProcResource<2> { let Super = P8_LU_LS; } 33*5f757f3fSDimitry Andric def P8_LU : ProcResource<2> { let Super = P8_LU_LS; } 34*5f757f3fSDimitry Andric def P8_FX : ProcResource<2> { let Super = P8_LU_LS_FX; } 35*5f757f3fSDimitry Andric def P8_DFU : ProcResource<1>; 36*5f757f3fSDimitry Andric def P8_BR : ProcResource<1> { let BufferSize = 16; } 37*5f757f3fSDimitry Andric def P8_CY : ProcResource<1>; 38*5f757f3fSDimitry Andric def P8_CRL : ProcResource<1>; 39*5f757f3fSDimitry Andric def P8_VMX : ProcResource<2>; 40*5f757f3fSDimitry Andric def P8_PM : ProcResource<2> { 41*5f757f3fSDimitry Andric // This is workaround for scheduler to respect latency of long permute chain. 42*5f757f3fSDimitry Andric let BufferSize = 1; 43*5f757f3fSDimitry Andric let Super = P8_VMX; 44*5f757f3fSDimitry Andric } 45*5f757f3fSDimitry Andric def P8_XS : ProcResource<2> { let Super = P8_VMX; } 46*5f757f3fSDimitry Andric def P8_VX : ProcResource<2> { let Super = P8_VMX; } 47*5f757f3fSDimitry Andric def P8_FPU : ProcResource<4>; 48*5f757f3fSDimitry Andric // Units for scalar, 2xDouble and 4xSingle 49*5f757f3fSDimitry Andric def P8_FP_Scal : ProcResource<2> { let Super = P8_FPU; } 50*5f757f3fSDimitry Andric def P8_FP_2x64 : ProcResource<2> { let Super = P8_FPU; } 51*5f757f3fSDimitry Andric def P8_FP_4x32 : ProcResource<2> { let Super = P8_FPU; } 52*5f757f3fSDimitry Andric 53*5f757f3fSDimitry Andric // Power8 Dispatch Ports: 54*5f757f3fSDimitry Andric // Two ports to do loads or fixed-point operations. 55*5f757f3fSDimitry Andric // Two ports to do stores, fixed-point loads, or fixed-point operations. 56*5f757f3fSDimitry Andric // Two ports for fixed-point operations. 57*5f757f3fSDimitry Andric // Two issue ports shared by 2 DFP/2 VSX/2 VMX/1 CY/1 DFP operations. 58*5f757f3fSDimitry Andric // One for branch operations. 59*5f757f3fSDimitry Andric // One for condition register operations. 60*5f757f3fSDimitry Andric 61*5f757f3fSDimitry Andric // TODO: Model dispatch of cracked instructions. 62*5f757f3fSDimitry Andric 63*5f757f3fSDimitry Andric // Six ports in total are available for fixed-point operations. 64*5f757f3fSDimitry Andric def P8_PORT_ALLFX : ProcResource<6>; 65*5f757f3fSDimitry Andric // Four ports in total are available for fixed-point load operations. 66*5f757f3fSDimitry Andric def P8_PORT_FXLD : ProcResource<4> { let Super = P8_PORT_ALLFX; } 67*5f757f3fSDimitry Andric // Two ports to do loads or fixed-point operations. 68*5f757f3fSDimitry Andric def P8_PORT_LD_FX : ProcResource<2> { let Super = P8_PORT_FXLD; } 69*5f757f3fSDimitry Andric // Two ports to do stores, fixed-point loads, or fixed-point operations. 70*5f757f3fSDimitry Andric def P8_PORT_ST_FXLD_FX : ProcResource<2> { let Super = P8_PORT_FXLD; } 71*5f757f3fSDimitry Andric // Two issue ports shared by two floating-point, two VSX, two VMX, one crypto, 72*5f757f3fSDimitry Andric // and one DFP operations. 73*5f757f3fSDimitry Andric def P8_PORT_VMX_FP : ProcResource<2>; 74*5f757f3fSDimitry Andric // One port for branch operation. 75*5f757f3fSDimitry Andric def P8_PORT_BR : ProcResource<1>; 76*5f757f3fSDimitry Andric // One port for condition register operation. 77*5f757f3fSDimitry Andric def P8_PORT_CR : ProcResource<1>; 78*5f757f3fSDimitry Andric 79*5f757f3fSDimitry Andric def P8_ISSUE_FX : SchedWriteRes<[P8_PORT_ALLFX]>; 80*5f757f3fSDimitry Andric def P8_ISSUE_FXLD : SchedWriteRes<[P8_PORT_FXLD]>; 81*5f757f3fSDimitry Andric def P8_ISSUE_LD : SchedWriteRes<[P8_PORT_LD_FX]>; 82*5f757f3fSDimitry Andric def P8_ISSUE_ST : SchedWriteRes<[P8_PORT_ST_FXLD_FX]>; 83*5f757f3fSDimitry Andric def P8_ISSUE_VSX : SchedWriteRes<[P8_PORT_VMX_FP]>; 84*5f757f3fSDimitry Andric def P8_ISSUE_BR : SchedWriteRes<[P8_PORT_BR]>; 85*5f757f3fSDimitry Andric def P8_ISSUE_CR : SchedWriteRes<[P8_PORT_CR]>; 86*5f757f3fSDimitry Andric 87*5f757f3fSDimitry Andric // Power8 Instruction Latency & Port Groups: 88*5f757f3fSDimitry Andric 89*5f757f3fSDimitry Andric def P8_LS_LU_NONE : SchedWriteRes<[P8_LU, P8_LS]>; 90*5f757f3fSDimitry Andric def P8_LS_FP_NONE : SchedWriteRes<[P8_LS, P8_FPU]>; 91*5f757f3fSDimitry Andric def P8_LU_or_LS_3C : SchedWriteRes<[P8_LU_LS]> { let Latency = 3; } 92*5f757f3fSDimitry Andric def P8_LS_FX_3C : SchedWriteRes<[P8_LS, P8_FX]> { let Latency = 3; } 93*5f757f3fSDimitry Andric def P8_LU_or_LS_or_FX_2C : SchedWriteRes<[P8_LU_LS_FX]> { let Latency = 2; } 94*5f757f3fSDimitry Andric def P8_LU_or_LS_FX_3C : SchedWriteRes<[P8_LU_LS, P8_FX]> { let Latency = 3; } 95*5f757f3fSDimitry Andric def P8_FX_NONE : SchedWriteRes<[P8_FX]>; 96*5f757f3fSDimitry Andric def P8_FX_1C : SchedWriteRes<[P8_FX]> { let Latency = 1; } 97*5f757f3fSDimitry Andric def P8_FX_2C : SchedWriteRes<[P8_FX]> { let Latency = 2; } 98*5f757f3fSDimitry Andric def P8_FX_3C : SchedWriteRes<[P8_FX]> { let Latency = 3; } 99*5f757f3fSDimitry Andric def P8_FX_5C : SchedWriteRes<[P8_FX]> { let Latency = 5; } 100*5f757f3fSDimitry Andric def P8_FX_10C : SchedWriteRes<[P8_FX]> { let Latency = 10; } 101*5f757f3fSDimitry Andric def P8_FX_23C : SchedWriteRes<[P8_FX]> { let Latency = 23; } 102*5f757f3fSDimitry Andric def P8_FX_15C : SchedWriteRes<[P8_FX]> { let Latency = 15; } 103*5f757f3fSDimitry Andric def P8_FX_41C : SchedWriteRes<[P8_FX]> { let Latency = 41; } 104*5f757f3fSDimitry Andric def P8_BR_2C : SchedWriteRes<[P8_BR]> { let Latency = 2; } 105*5f757f3fSDimitry Andric def P8_CR_NONE : SchedWriteRes<[P8_CRL]>; 106*5f757f3fSDimitry Andric def P8_CR_3C : SchedWriteRes<[P8_CRL]> { let Latency = 3; } 107*5f757f3fSDimitry Andric def P8_CR_5C : SchedWriteRes<[P8_CRL]> { let Latency = 5; } 108*5f757f3fSDimitry Andric def P8_LU_5C : SchedWriteRes<[P8_LU]> { let Latency = 5; } 109*5f757f3fSDimitry Andric def P8_LU_FX_5C : SchedWriteRes<[P8_LU, P8_FX]> { let Latency = 5; } 110*5f757f3fSDimitry Andric def P8_LS_FP_FX_2C : SchedWriteRes<[P8_LS, P8_FPU, P8_FX]> { let Latency = 2; } 111*5f757f3fSDimitry Andric def P8_LS_FP_FX_3C : SchedWriteRes<[P8_LS, P8_FPU, P8_FX]> { let Latency = 3; } 112*5f757f3fSDimitry Andric def P8_LS_3C : SchedWriteRes<[P8_LS]> { let Latency = 3; } 113*5f757f3fSDimitry Andric def P8_FP_3C : SchedWriteRes<[P8_FPU]> { let Latency = 3; } 114*5f757f3fSDimitry Andric def P8_FP_Scal_6C : SchedWriteRes<[P8_FP_Scal]> { let Latency = 6; } 115*5f757f3fSDimitry Andric def P8_FP_4x32_6C : SchedWriteRes<[P8_FP_4x32]> { let Latency = 6; } 116*5f757f3fSDimitry Andric def P8_FP_2x64_6C : SchedWriteRes<[P8_FP_2x64]> { let Latency = 6; } 117*5f757f3fSDimitry Andric def P8_FP_26C : SchedWriteRes<[P8_FP_Scal]> { let Latency = 26; } 118*5f757f3fSDimitry Andric def P8_FP_28C : SchedWriteRes<[P8_FP_4x32]> { let Latency = 28; } 119*5f757f3fSDimitry Andric def P8_FP_31C : SchedWriteRes<[P8_FP_Scal]> { let Latency = 31; } 120*5f757f3fSDimitry Andric def P8_FP_Scal_32C : SchedWriteRes<[P8_FP_Scal]> { let Latency = 32; } 121*5f757f3fSDimitry Andric def P8_FP_2x64_32C : SchedWriteRes<[P8_FP_2x64]> { let Latency = 32; } 122*5f757f3fSDimitry Andric def P8_FP_4x32_32C : SchedWriteRes<[P8_FP_4x32]> { let Latency = 32; } 123*5f757f3fSDimitry Andric def P8_FP_Scal_43C : SchedWriteRes<[P8_FP_Scal]> { let Latency = 43; } 124*5f757f3fSDimitry Andric def P8_FP_2x64_43C : SchedWriteRes<[P8_FP_2x64]> { let Latency = 43; } 125*5f757f3fSDimitry Andric def P8_XS_2C : SchedWriteRes<[P8_XS]> { let Latency = 2; } 126*5f757f3fSDimitry Andric def P8_PM_2C : SchedWriteRes<[P8_PM]> { let Latency = 2; } 127*5f757f3fSDimitry Andric def P8_XS_4C : SchedWriteRes<[P8_XS]> { let Latency = 4; } 128*5f757f3fSDimitry Andric def P8_VX_7C : SchedWriteRes<[P8_VX]> { let Latency = 7; } 129*5f757f3fSDimitry Andric def P8_XS_9C : SchedWriteRes<[P8_XS]> { let Latency = 9; } 130*5f757f3fSDimitry Andric def P8_CY_6C : SchedWriteRes<[P8_CY]> { let Latency = 6; } 131*5f757f3fSDimitry Andric def P8_DFU_13C : SchedWriteRes<[P8_DFU]> { let Latency = 13; } 132*5f757f3fSDimitry Andric def P8_DFU_15C : SchedWriteRes<[P8_DFU]> { let Latency = 15; } 133*5f757f3fSDimitry Andric def P8_DFU_17C : SchedWriteRes<[P8_DFU]> { let Latency = 17; } 134*5f757f3fSDimitry Andric def P8_DFU_25C : SchedWriteRes<[P8_DFU]> { let Latency = 25; } 135*5f757f3fSDimitry Andric def P8_DFU_32C : SchedWriteRes<[P8_DFU]> { let Latency = 32; } 136*5f757f3fSDimitry Andric def P8_DFU_34C : SchedWriteRes<[P8_DFU]> { let Latency = 34; } 137*5f757f3fSDimitry Andric def P8_DFU_40C : SchedWriteRes<[P8_DFU]> { let Latency = 40; } 138*5f757f3fSDimitry Andric def P8_DFU_90C : SchedWriteRes<[P8_DFU]> { let Latency = 90; } 139*5f757f3fSDimitry Andric def P8_DFU_96C : SchedWriteRes<[P8_DFU]> { let Latency = 96; } 140*5f757f3fSDimitry Andric def P8_DFU_172C : SchedWriteRes<[P8_DFU]> { let Latency = 172; } 141*5f757f3fSDimitry Andric // Direct move instructions 142*5f757f3fSDimitry Andric def P8_DM_5C : SchedWriteRes<[]> { let Latency = 5; } 143*5f757f3fSDimitry Andric 144*5f757f3fSDimitry Andric // Instructions of CR pipeline 145*5f757f3fSDimitry Andric 146*5f757f3fSDimitry Andric def : InstRW<[P8_CR_NONE, P8_ISSUE_CR], (instrs MFCR, MFCR8)>; 147*5f757f3fSDimitry Andric def : InstRW<[P8_CR_3C, P8_ISSUE_CR], (instrs MFOCRF, MFOCRF8)>; 148*5f757f3fSDimitry Andric def : InstRW<[P8_CR_5C, P8_ISSUE_CR], (instrs MFLR, MFLR8, MFCTR, MFCTR8)>; 149*5f757f3fSDimitry Andric 150*5f757f3fSDimitry Andric // Instructions of CY pipeline 151*5f757f3fSDimitry Andric 152*5f757f3fSDimitry Andric def : InstRW<[P8_CY_6C, P8_ISSUE_VSX], (instrs 153*5f757f3fSDimitry Andric VCIPHER, VCIPHERLAST, VNCIPHER, VNCIPHERLAST, VPMSUMB, VPMSUMD, VPMSUMH, VPMSUMW, VSBOX)>; 154*5f757f3fSDimitry Andric 155*5f757f3fSDimitry Andric // Instructions of FPU pipeline 156*5f757f3fSDimitry Andric 157*5f757f3fSDimitry Andric def : InstRW<[P8_FP_26C, P8_ISSUE_VSX], (instrs (instregex "^FDIVS(_rec)?$"), XSDIVSP)>; 158*5f757f3fSDimitry Andric def : InstRW<[P8_FP_28C, P8_ISSUE_VSX], (instrs XVDIVSP)>; 159*5f757f3fSDimitry Andric def : InstRW<[P8_FP_31C, P8_ISSUE_VSX], (instregex "^FSQRTS(_rec)?$")>; 160*5f757f3fSDimitry Andric def : InstRW<[P8_FP_Scal_32C, P8_ISSUE_VSX], (instrs FDIV, FDIV_rec, XSDIVDP)>; 161*5f757f3fSDimitry Andric def : InstRW<[P8_FP_2x64_32C, P8_ISSUE_VSX], (instrs XVDIVDP)>; 162*5f757f3fSDimitry Andric def : InstRW<[P8_FP_4x32_32C, P8_ISSUE_VSX], (instrs XVSQRTSP)>; 163*5f757f3fSDimitry Andric def : InstRW<[P8_FP_Scal_43C, P8_ISSUE_VSX], (instrs FSQRT, FSQRT_rec, XSSQRTDP)>; 164*5f757f3fSDimitry Andric def : InstRW<[P8_FP_2x64_43C, P8_ISSUE_VSX], (instrs XVSQRTDP)>; 165*5f757f3fSDimitry Andric 166*5f757f3fSDimitry Andric def : InstRW<[P8_FP_3C, P8_ISSUE_VSX], (instrs 167*5f757f3fSDimitry Andric MTFSFI_rec, MTFSF_rec, MTFSFI, MTFSFIb, MTFSF, MTFSFb, MTFSB0, MTFSB1)>; 168*5f757f3fSDimitry Andric 169*5f757f3fSDimitry Andric def : InstRW<[P8_FP_Scal_6C, P8_ISSUE_VSX], (instrs 170*5f757f3fSDimitry Andric (instregex "^F(N)?M(ADD|SUB)(S)?(_rec)?$"), 171*5f757f3fSDimitry Andric (instregex "^XS(N)?M(ADD|SUB)(A|M)(D|S)P$"), 172*5f757f3fSDimitry Andric (instregex "^FC(F|T)I(D|W)(U)?(S|Z)?(_rec)?$"), 173*5f757f3fSDimitry Andric (instregex "^(F|XS)(ABS|CPSGN|ADD|MUL|NABS|RE|NEG|SUB|SEL|RSQRTE)(D|S)?(P)?(s)?(_rec)?$"), 174*5f757f3fSDimitry Andric (instregex "^FRI(M|N|P|Z)(D|S)(_rec)?$"), 175*5f757f3fSDimitry Andric (instregex "^XSCVDP(S|U)X(W|D)S(s)?$"), 176*5f757f3fSDimitry Andric (instregex "^XSCV(S|U)XD(D|S)P$"), 177*5f757f3fSDimitry Andric (instregex "^XSCV(D|S)P(S|D)P(N)?$"), 178*5f757f3fSDimitry Andric (instregex "^XSRDPI(C|M|P|Z)?$"), 179*5f757f3fSDimitry Andric FMR, FRSP, FMR_rec, FRSP_rec, XSRSP)>; 180*5f757f3fSDimitry Andric 181*5f757f3fSDimitry Andric def : InstRW<[P8_FP_4x32_6C, P8_ISSUE_VSX], (instrs 182*5f757f3fSDimitry Andric (instregex "^XV(N)?M(ADD|SUB)(A|M)SP$"), 183*5f757f3fSDimitry Andric (instregex "^VRFI(M|N|P|Z)$"), 184*5f757f3fSDimitry Andric XVRSQRTESP, XVSUBSP, VADDFP, VEXPTEFP, VLOGEFP, VMADDFP, VNMSUBFP, VREFP, 185*5f757f3fSDimitry Andric VRSQRTEFP, VSUBFP, XVCVSXWSP, XVCVUXWSP, XVMULSP, XVNABSSP, XVNEGSP, XVRESP, 186*5f757f3fSDimitry Andric XVCVDPSP, XVCVSXDSP, XVCVUXDSP, XVABSSP, XVADDSP, XVCPSGNSP)>; 187*5f757f3fSDimitry Andric 188*5f757f3fSDimitry Andric def : InstRW<[P8_FP_2x64_6C, P8_ISSUE_VSX], (instrs 189*5f757f3fSDimitry Andric (instregex "^XVR(D|S)PI(C|M|P|Z)?$"), 190*5f757f3fSDimitry Andric (instregex "^XVCV(S|U)X(D|W)DP$"), 191*5f757f3fSDimitry Andric (instregex "^XVCV(D|W|S)P(S|U)X(D|W)S$"), 192*5f757f3fSDimitry Andric (instregex "^XV(N)?(M)?(RSQRTE|CPSGN|SUB|ADD|ABS|UL|NEG|RE)(A|M)?DP$"), 193*5f757f3fSDimitry Andric XVCVSPDP)>; 194*5f757f3fSDimitry Andric 195*5f757f3fSDimitry Andric // Instructions of FX, LU or LS pipeline 196*5f757f3fSDimitry Andric 197*5f757f3fSDimitry Andric def : InstRW<[P8_FX_NONE, P8_ISSUE_FX], (instrs TDI, TWI, TD, TW, MTCRF, MTCRF8, MTOCRF, MTOCRF8)>; 198*5f757f3fSDimitry Andric def : InstRW<[P8_FX_1C, P8_ISSUE_FX], (instregex "^RLWIMI(8)?$")>; 199*5f757f3fSDimitry Andric // TODO: Pipeline of logical instructions might be LS or FX 200*5f757f3fSDimitry Andric def : InstRW<[P8_FX_2C, P8_ISSUE_FX], (instrs 201*5f757f3fSDimitry Andric (instregex "^(N|X)?(EQV|AND|OR)(I)?(S|C)?(8)?(_rec)?$"), 202*5f757f3fSDimitry Andric (instregex "^EXTS(B|H|W)(8)?(_32)?(_64)?(_rec)?$"), 203*5f757f3fSDimitry Andric (instregex "^RL(D|W)(I)?(NM|C)(L|R)?(8)?(_32)?(_64)?(_rec)?$"), 204*5f757f3fSDimitry Andric (instregex "^S(L|R)(A)?(W|D)(I)?(8)?(_rec|_32)?$"), 205*5f757f3fSDimitry Andric (instregex "^(ADD|SUBF)(M|Z)?(C|E)?(4|8)?O(_rec)?$"), 206*5f757f3fSDimitry Andric (instregex "^(ADD|SUBF)(M|Z)?E(8)?_rec$"), 207*5f757f3fSDimitry Andric (instregex "^(ADD|SUBF|NEG)(4|8)?_rec$"), 208*5f757f3fSDimitry Andric NOP, ADDG6S, ADDG6S8, ADDZE, ADDZE8, ADDIC_rec, NEGO_rec, ADDC, ADDC8, SUBFC, SUBFC8, 209*5f757f3fSDimitry Andric ADDC_rec, ADDC8_rec, SUBFC_rec, SUBFC8_rec, COPY, NEG8O_rec, 210*5f757f3fSDimitry Andric RLDIMI, RLDIMI_rec, RLWIMI8_rec, RLWIMI_rec)>; 211*5f757f3fSDimitry Andric 212*5f757f3fSDimitry Andric def : InstRW<[P8_FX_3C], (instregex "^(POP)?CNT(LZ)?(B|W|D)(8)?(_rec)?$")>; 213*5f757f3fSDimitry Andric def : InstRW<[P8_FX_5C, P8_ISSUE_FX], (instrs 214*5f757f3fSDimitry Andric (instregex "^MUL(H|L)(I|W|D)(8)?(U|O)?(_rec)?$"), 215*5f757f3fSDimitry Andric CMPDI,CMPWI,CMPD,CMPW,CMPLDI,CMPLWI,CMPLD,CMPLW, 216*5f757f3fSDimitry Andric ISEL, ISEL8, MTLR, MTLR8, MTCTR, MTCTR8, MTCTR8loop, MTCTRloop)>; 217*5f757f3fSDimitry Andric 218*5f757f3fSDimitry Andric def : InstRW<[P8_FX_10C, P8_ISSUE_VSX], (instregex "^MFTB(8)?$")>; 219*5f757f3fSDimitry Andric def : InstRW<[P8_FX_15C, P8_ISSUE_FX], (instregex "^DIVW(U)?$")>; 220*5f757f3fSDimitry Andric 221*5f757f3fSDimitry Andric def : InstRW<[P8_FX_23C, P8_ISSUE_FX], (instregex "^DIV(D|WE)(U)?$")>; 222*5f757f3fSDimitry Andric def : InstRW<[P8_FX_41C], (instrs 223*5f757f3fSDimitry Andric (instregex "^DIV(D|W)(E)?(U)?O(_rec)?$"), 224*5f757f3fSDimitry Andric (instregex "^DIV(D|W)(E)?(U)?_rec$"), 225*5f757f3fSDimitry Andric DIVDE, DIVDEU)>; 226*5f757f3fSDimitry Andric 227*5f757f3fSDimitry Andric def : InstRW<[P8_LS_3C, P8_ISSUE_FX], (instrs MFSR, MFSRIN)>; 228*5f757f3fSDimitry Andric 229*5f757f3fSDimitry Andric def : InstRW<[P8_LU_5C, P8_ISSUE_LD], (instrs 230*5f757f3fSDimitry Andric LFS, LFSX, LFD, LFDX, LFDXTLS, LFDXTLS_, LXVD2X, LXVW4X, LXVDSX, LVEBX, LVEHX, LVEWX, 231*5f757f3fSDimitry Andric LVX, LVXL, LXSDX, LFIWAX, LFIWZX, LFSXTLS, LFSXTLS_, LXVB16X, LXVD2X, LXSIWZX, 232*5f757f3fSDimitry Andric DFLOADf64, XFLOADf64, LIWZX)>; 233*5f757f3fSDimitry Andric 234*5f757f3fSDimitry Andric def : InstRW<[P8_LS_FX_3C, P8_ISSUE_FXLD], (instrs LQ)>; 235*5f757f3fSDimitry Andric def : InstRW<[P8_LU_FX_5C, P8_ISSUE_LD], (instregex "^LF(D|S)U(X)?$")>; 236*5f757f3fSDimitry Andric 237*5f757f3fSDimitry Andric def : InstRW<[P8_LS_FP_NONE, P8_ISSUE_ST], (instrs 238*5f757f3fSDimitry Andric STXSDX, STXVD2X, STXVW4X, STFIWX, STFS, STFSX, STFD, STFDX, 239*5f757f3fSDimitry Andric STFDEPX, STFDXTLS, STFDXTLS_, STFSXTLS, STFSXTLS_, STXSIWX, STXSSP, STXSSPX)>; 240*5f757f3fSDimitry Andric 241*5f757f3fSDimitry Andric def : InstRW<[P8_LS_FP_FX_2C, P8_ISSUE_ST], (instrs STVEBX, STVEHX, STVEWX, STVX, STVXL)>; 242*5f757f3fSDimitry Andric def : InstRW<[P8_LS_FP_FX_3C, P8_ISSUE_ST], (instregex "^STF(D|S)U(X)?$")>; 243*5f757f3fSDimitry Andric 244*5f757f3fSDimitry Andric def : InstRW<[P8_LS_LU_NONE, P8_ISSUE_ST], (instrs 245*5f757f3fSDimitry Andric (instregex "^ST(B|H|W|D)(U)?(X)?(8|TLS)?(_)?(32)?$"), 246*5f757f3fSDimitry Andric STBCIX, STBCX, STBEPX, STDBRX, STDCIX, STDCX, STHBRX, STHCIX, STHCX, STHEPX, 247*5f757f3fSDimitry Andric STMW, STSWI, STWBRX, STWCIX, STWCX, STWEPX)>; 248*5f757f3fSDimitry Andric 249*5f757f3fSDimitry Andric def : InstRW<[P8_LU_or_LS_FX_3C, P8_ISSUE_FXLD], 250*5f757f3fSDimitry Andric (instregex "^L(B|H|W|D)(A|Z)?(U)?(X)?(8|TLS)?(_)?(32)?$")>; 251*5f757f3fSDimitry Andric 252*5f757f3fSDimitry Andric def : InstRW<[P8_LU_or_LS_3C, P8_ISSUE_FXLD], (instrs 253*5f757f3fSDimitry Andric LBARX, LBARXL, LBEPX, LBZCIX, LDARX, LDARXL, LDBRX, LDCIX, LFDEPX, LHARX, LHARXL, LHBRX, LXSIWAX, 254*5f757f3fSDimitry Andric LHBRX8, LHEPX, LHZCIX, LMW, LSWI, LVSL, LVSR, LWARX, LWARXL, LWBRX, LWBRX8, LWEPX, LWZCIX)>; 255*5f757f3fSDimitry Andric 256*5f757f3fSDimitry Andric def : InstRW<[P8_LU_or_LS_or_FX_2C, P8_ISSUE_FX], (instrs 257*5f757f3fSDimitry Andric (instregex "^ADDI(C)?(dtprel|tlsgd|toc)?(L)?(ADDR)?(32|8)?$"), 258*5f757f3fSDimitry Andric (instregex "^ADDIS(dtprel|tlsgd|toc|gotTprel)?(HA)?(32|8)?$"), 259*5f757f3fSDimitry Andric (instregex "^LI(S)?(8)?$"), 260*5f757f3fSDimitry Andric (instregex "^ADD(M)?(E)?(4|8)?(TLS)?(_)?$"), 261*5f757f3fSDimitry Andric (instregex "^SUBF(M|Z)?(E)?(IC)?(4|8)?$"), 262*5f757f3fSDimitry Andric (instregex "^NEG(8)?(O)?$"))>; 263*5f757f3fSDimitry Andric 264*5f757f3fSDimitry Andric // Instructions of PM pipeline 265*5f757f3fSDimitry Andric 266*5f757f3fSDimitry Andric def : InstRW<[P8_PM_2C, P8_ISSUE_VSX], (instrs 267*5f757f3fSDimitry Andric (instregex "^VPK(S|U)(H|W|D)(S|U)(M|S)$"), 268*5f757f3fSDimitry Andric (instregex "^VUPK(H|L)(P|S)(H|B|W|X)$"), 269*5f757f3fSDimitry Andric (instregex "^VSPLT(IS)?(B|H|W)(s)?$"), 270*5f757f3fSDimitry Andric (instregex "^(XX|V)MRG(E|O|H|L)(B|H|W)$"), 271*5f757f3fSDimitry Andric XXPERMDI, XXPERMDIs, XXSEL, XXSLDWI, XXSLDWIs, XXSPLTW, XXSPLTWs, VPERMXOR, 272*5f757f3fSDimitry Andric VPKPX, VPERM, VBPERMQ, VGBBD, VSEL, VSL, VSLDOI, VSLO, VSR, VSRO)>; 273*5f757f3fSDimitry Andric 274*5f757f3fSDimitry Andric def : InstRW<[P8_XS_2C, P8_ISSUE_VSX], (instrs 275*5f757f3fSDimitry Andric (instregex "^V(ADD|SUB)(S|U)(B|H|W|D)(M|S)$"), 276*5f757f3fSDimitry Andric (instregex "^X(S|V)(MAX|MIN)(D|S)P$"), 277*5f757f3fSDimitry Andric (instregex "^V(S)?(R)?(L)?(A)?(B|D|H|W)$"), 278*5f757f3fSDimitry Andric (instregex "^VAVG(S|U)(B|H|W)$"), 279*5f757f3fSDimitry Andric (instregex "^VM(AX|IN)(S|U)(B|H|W|D)$"), 280*5f757f3fSDimitry Andric (instregex "^(XX|V)(L)?(N)?(X)?(AND|OR|EQV)(C)?$"), 281*5f757f3fSDimitry Andric (instregex "^(X)?VCMP(EQ|GT|GE|B)(F|S|U)?(B|H|W|D|P|S)(P)?(_rec)?$"), 282*5f757f3fSDimitry Andric (instregex "^VCLZ(B|H|W|D)$"), 283*5f757f3fSDimitry Andric (instregex "^VPOPCNT(B|H|W)$"), 284*5f757f3fSDimitry Andric XXLORf, XXLXORdpz, XXLXORspz, XXLXORz, VEQV, VMAXFP, VMINFP, 285*5f757f3fSDimitry Andric VSHASIGMAD, VSHASIGMAW, VSUBCUW, VADDCUW, MFVSCR, MTVSCR)>; 286*5f757f3fSDimitry Andric 287*5f757f3fSDimitry Andric def : InstRW<[P8_XS_4C, P8_ISSUE_VSX], (instrs 288*5f757f3fSDimitry Andric (instregex "^V(ADD|SUB)(E)?(C)?UQ(M)?$"), 289*5f757f3fSDimitry Andric VPOPCNTD)>; 290*5f757f3fSDimitry Andric 291*5f757f3fSDimitry Andric def : InstRW<[P8_XS_9C, P8_ISSUE_CR], (instrs 292*5f757f3fSDimitry Andric (instregex "^(F|XS)CMP(O|U)(D|S)(P)?$"), 293*5f757f3fSDimitry Andric (instregex "^(F|XS|XV)T(DIV|SQRT)((D|S)P)?$"))>; 294*5f757f3fSDimitry Andric 295*5f757f3fSDimitry Andric // Instructions of VX pipeline 296*5f757f3fSDimitry Andric 297*5f757f3fSDimitry Andric def : InstRW<[P8_VX_7C, P8_ISSUE_VSX], (instrs 298*5f757f3fSDimitry Andric (instregex "^V(M)?SUM(2|4)?(M|S|U)(B|H|W)(M|S)$"), 299*5f757f3fSDimitry Andric (instregex "^VMUL(E|O)?(S|U)(B|H|W)(M)?$"), 300*5f757f3fSDimitry Andric VMHADDSHS, VMHRADDSHS, VMLADDUHM)>; 301*5f757f3fSDimitry Andric 302*5f757f3fSDimitry Andric // Instructions of BR pipeline 303*5f757f3fSDimitry Andric 304*5f757f3fSDimitry Andric def : InstRW<[P8_BR_2C, P8_ISSUE_BR], (instrs 305*5f757f3fSDimitry Andric (instregex "^(g)?B(C)?(C)?(CTR)?(L)?(A)?(R)?(L)?(8)?(_LD|_LWZ)?(always|into_toc|at)?(_RM)?(n)?$"), 306*5f757f3fSDimitry Andric (instregex "^BD(N)?Z(L)?(R|A)?(L)?(m|p|8)?$"), 307*5f757f3fSDimitry Andric (instregex "^BL(R|A)?(8)?(_NOP)?(_TLS)?(_)?(RM)?$"))>; 308*5f757f3fSDimitry Andric 309*5f757f3fSDimitry Andric // Instructions of DFP pipeline 310*5f757f3fSDimitry Andric // DFP operations also use float/vector/crypto issue ports. 311*5f757f3fSDimitry Andric def : InstRW<[P8_DFU_13C, P8_ISSUE_VSX], (instrs 312*5f757f3fSDimitry Andric (instregex "^DTST(D|S)(C|F|G)(Q)?$"), 313*5f757f3fSDimitry Andric (instregex "^D(Q|X)EX(Q)?(_rec)?$"), 314*5f757f3fSDimitry Andric (instregex "^D(ADD|SUB|IEX|QUA|RRND|RINTX|RINTN|CTDP|DEDPD|ENBCD)(_rec)?$"), 315*5f757f3fSDimitry Andric (instregex "^DSC(L|R)I(_rec)?$"), 316*5f757f3fSDimitry Andric BCDADD_rec, BCDSUB_rec, DCMPO, DCMPU, DTSTEX, DQUAI)>; 317*5f757f3fSDimitry Andric 318*5f757f3fSDimitry Andric def : InstRW<[P8_DFU_15C, P8_ISSUE_VSX], (instrs 319*5f757f3fSDimitry Andric (instregex "^DRINT(N|X)Q(_rec)?$"), 320*5f757f3fSDimitry Andric DCMPOQ, DCMPUQ, DRRNDQ, DRRNDQ_rec, DIEXQ, DIEXQ_rec, DQUAIQ, DQUAIQ_rec, 321*5f757f3fSDimitry Andric DTSTEXQ, DDEDPDQ, DDEDPDQ_rec, DENBCDQ, DENBCDQ_rec, DSCLIQ, DSCLIQ_rec, 322*5f757f3fSDimitry Andric DSCRIQ, DSCRIQ_rec, DCTQPQ, DCTQPQ_rec)>; 323*5f757f3fSDimitry Andric 324*5f757f3fSDimitry Andric def : InstRW<[P8_DFU_17C, P8_ISSUE_VSX], (instregex "^D(ADD|SUB|QUA)Q(_rec)?$")>; 325*5f757f3fSDimitry Andric def : InstRW<[P8_DFU_25C, P8_ISSUE_VSX], (instrs DRSP, DRSP_rec, DCTFIX, DCTFIX_rec)>; 326*5f757f3fSDimitry Andric def : InstRW<[P8_DFU_32C, P8_ISSUE_VSX], (instrs DCFFIX, DCFFIX_rec)>; 327*5f757f3fSDimitry Andric def : InstRW<[P8_DFU_34C, P8_ISSUE_VSX], (instrs DCFFIXQ, DCFFIXQ_rec)>; 328*5f757f3fSDimitry Andric def : InstRW<[P8_DFU_40C, P8_ISSUE_VSX], (instrs DMUL, DMUL_rec)>; 329*5f757f3fSDimitry Andric def : InstRW<[P8_DFU_90C, P8_ISSUE_VSX], (instrs DMULQ, DMULQ_rec)>; 330*5f757f3fSDimitry Andric def : InstRW<[P8_DFU_96C, P8_ISSUE_VSX], (instrs DDIV, DDIV_rec)>; 331*5f757f3fSDimitry Andric def : InstRW<[P8_DFU_172C, P8_ISSUE_VSX], (instrs DDIVQ, DDIVQ_rec)>; 332*5f757f3fSDimitry Andric 333*5f757f3fSDimitry Andric // Direct move instructions 334*5f757f3fSDimitry Andric 335*5f757f3fSDimitry Andric def : InstRW<[P8_DM_5C, P8_ISSUE_VSX], (instrs 336*5f757f3fSDimitry Andric MFVRD, MFVSRD, MFVRWZ, MFVSRWZ, MTVRD, MTVSRD, MTVRWA, MTVSRWA, MTVRWZ, MTVSRWZ)>; 337*5f757f3fSDimitry Andric} 338