1*9880d681SAndroid Build Coastguard Worker//===-- PPCScheduleP8.td - PPC P8 Scheduling Definitions ---*- tablegen -*-===// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 10*9880d681SAndroid Build Coastguard Worker// This file defines the itinerary class data for the POWER8 processor. 11*9880d681SAndroid Build Coastguard Worker// 12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker// Scheduling for the P8 involves tracking two types of resources: 15*9880d681SAndroid Build Coastguard Worker// 1. The dispatch bundle slots 16*9880d681SAndroid Build Coastguard Worker// 2. The functional unit resources 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker// Dispatch units: 19*9880d681SAndroid Build Coastguard Workerdef P8_DU1 : FuncUnit; 20*9880d681SAndroid Build Coastguard Workerdef P8_DU2 : FuncUnit; 21*9880d681SAndroid Build Coastguard Workerdef P8_DU3 : FuncUnit; 22*9880d681SAndroid Build Coastguard Workerdef P8_DU4 : FuncUnit; 23*9880d681SAndroid Build Coastguard Workerdef P8_DU5 : FuncUnit; 24*9880d681SAndroid Build Coastguard Workerdef P8_DU6 : FuncUnit; 25*9880d681SAndroid Build Coastguard Workerdef P8_DU7 : FuncUnit; // Only branch instructions will use DU7,DU8 26*9880d681SAndroid Build Coastguard Workerdef P8_DU8 : FuncUnit; 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker// 10 insns per cycle (2-LU, 2-LSU, 2-FXU, 2-FPU, 1-CRU, 1-BRU). 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdef P8_LU1 : FuncUnit; // Loads or fixed-point operations 1 31*9880d681SAndroid Build Coastguard Workerdef P8_LU2 : FuncUnit; // Loads or fixed-point operations 2 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker// Load/Store pipelines can handle Stores, fixed-point loads, and simple 34*9880d681SAndroid Build Coastguard Worker// fixed-point operations. 35*9880d681SAndroid Build Coastguard Workerdef P8_LSU1 : FuncUnit; // Load/Store pipeline 1 36*9880d681SAndroid Build Coastguard Workerdef P8_LSU2 : FuncUnit; // Load/Store pipeline 2 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker// Fixed Point unit 39*9880d681SAndroid Build Coastguard Workerdef P8_FXU1 : FuncUnit; // FX pipeline 1 40*9880d681SAndroid Build Coastguard Workerdef P8_FXU2 : FuncUnit; // FX pipeline 2 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker// The Floating-Point Unit (FPU) and Vector Media Extension (VMX) units 43*9880d681SAndroid Build Coastguard Worker// are combined on P7 and newer into a Vector Scalar Unit (VSU). 44*9880d681SAndroid Build Coastguard Worker// The P8 Instruction latency documents still refers to the unit as the 45*9880d681SAndroid Build Coastguard Worker// FPU, so keep in mind that FPU==VSU. 46*9880d681SAndroid Build Coastguard Worker// In contrast to the P7, the VMX units on P8 are symmetric, so no need to 47*9880d681SAndroid Build Coastguard Worker// split vector integer ops or 128-bit load/store/perms to the specific units. 48*9880d681SAndroid Build Coastguard Workerdef P8_FPU1 : FuncUnit; // VS pipeline 1 49*9880d681SAndroid Build Coastguard Workerdef P8_FPU2 : FuncUnit; // VS pipeline 2 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdef P8_CRU : FuncUnit; // CR unit (CR logicals and move-from-SPRs) 52*9880d681SAndroid Build Coastguard Workerdef P8_BRU : FuncUnit; // BR unit 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdef P8Itineraries : ProcessorItineraries< 55*9880d681SAndroid Build Coastguard Worker [P8_DU1, P8_DU2, P8_DU3, P8_DU4, P8_DU5, P8_DU6, P8_DU7, P8_DU8, 56*9880d681SAndroid Build Coastguard Worker P8_LU1, P8_LU2, P8_LSU1, P8_LSU2, P8_FXU1, P8_FXU2, 57*9880d681SAndroid Build Coastguard Worker P8_FPU1, P8_FPU2, P8_CRU, P8_BRU], [], [ 58*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_IntSimple , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 59*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 60*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2, 61*9880d681SAndroid Build Coastguard Worker P8_LU1, P8_LU2, 62*9880d681SAndroid Build Coastguard Worker P8_LSU1, P8_LSU2]>], 63*9880d681SAndroid Build Coastguard Worker [1, 1, 1]>, 64*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_IntGeneral , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 65*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 66*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2, P8_LU1, 67*9880d681SAndroid Build Coastguard Worker P8_LU2, P8_LSU1, P8_LSU2]>], 68*9880d681SAndroid Build Coastguard Worker [1, 1, 1]>, 69*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_IntISEL, [InstrStage<1, [P8_DU1], 0>, 70*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2], 0>, 71*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_BRU]>], 72*9880d681SAndroid Build Coastguard Worker [1, 1, 1, 1]>, 73*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_IntCompare , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 74*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 75*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 76*9880d681SAndroid Build Coastguard Worker [1, 1, 1]>, 77*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_IntDivW , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 78*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 79*9880d681SAndroid Build Coastguard Worker InstrStage<15, [P8_FXU1, P8_FXU2]>], 80*9880d681SAndroid Build Coastguard Worker [15, 1, 1]>, 81*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_IntDivD , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 82*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 83*9880d681SAndroid Build Coastguard Worker InstrStage<23, [P8_FXU1, P8_FXU2]>], 84*9880d681SAndroid Build Coastguard Worker [23, 1, 1]>, 85*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_IntMulHW , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 86*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 87*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 88*9880d681SAndroid Build Coastguard Worker [4, 1, 1]>, 89*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_IntMulHWU , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 90*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 91*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 92*9880d681SAndroid Build Coastguard Worker [4, 1, 1]>, 93*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_IntMulLI , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 94*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 95*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 96*9880d681SAndroid Build Coastguard Worker [4, 1, 1]>, 97*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_IntRotate , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 98*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 99*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 100*9880d681SAndroid Build Coastguard Worker [1, 1, 1]>, 101*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_IntRotateD , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 102*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 103*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 104*9880d681SAndroid Build Coastguard Worker [1, 1, 1]>, 105*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_IntShift , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 106*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 107*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 108*9880d681SAndroid Build Coastguard Worker [1, 1, 1]>, 109*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_IntTrapW , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 110*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 111*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 112*9880d681SAndroid Build Coastguard Worker [1, 1]>, 113*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_IntTrapD , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 114*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 115*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 116*9880d681SAndroid Build Coastguard Worker [1, 1]>, 117*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_BrB , [InstrStage<1, [P8_DU7, P8_DU8], 0>, 118*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_BRU]>], 119*9880d681SAndroid Build Coastguard Worker [3, 1, 1]>, 120*9880d681SAndroid Build Coastguard Worker // FIXME - the Br* groups below are not branch related, so should probably 121*9880d681SAndroid Build Coastguard Worker // be renamed. 122*9880d681SAndroid Build Coastguard Worker // IIC_BrCR consists of the cr* instructions. (crand,crnor,creqv, etc). 123*9880d681SAndroid Build Coastguard Worker // and should be 'First' in dispatch. 124*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_BrCR , [InstrStage<1, [P8_DU1], 0>, 125*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_CRU]>], 126*9880d681SAndroid Build Coastguard Worker [3, 1, 1]>, 127*9880d681SAndroid Build Coastguard Worker // IIC_BrMCR consists of the mcrf instruction. 128*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_BrMCR , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 129*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 130*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_CRU]>], 131*9880d681SAndroid Build Coastguard Worker [3, 1, 1]>, 132*9880d681SAndroid Build Coastguard Worker // IIC_BrMCRX consists of mcrxr (obsolete instruction) and mtcrf, which 133*9880d681SAndroid Build Coastguard Worker // should be first in the dispatch group. 134*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_BrMCRX , [InstrStage<1, [P8_DU1], 0>, 135*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 136*9880d681SAndroid Build Coastguard Worker [3, 1, 1]>, 137*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_BrMCRX , [InstrStage<1, [P8_DU1], 0>, 138*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 139*9880d681SAndroid Build Coastguard Worker [3, 1]>, 140*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLoad , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 141*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 142*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2, 143*9880d681SAndroid Build Coastguard Worker P8_LU1, P8_LU2]>], 144*9880d681SAndroid Build Coastguard Worker [2, 1, 1]>, 145*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLoadUpd , [InstrStage<1, [P8_DU1], 0>, 146*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 147*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2, 148*9880d681SAndroid Build Coastguard Worker P8_LU1, P8_LU2 ], 0>, 149*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 150*9880d681SAndroid Build Coastguard Worker [2, 2, 1, 1]>, 151*9880d681SAndroid Build Coastguard Worker // Update-Indexed form loads/stores are no longer first and last in the 152*9880d681SAndroid Build Coastguard Worker // dispatch group. They are simply cracked, so require DU1,DU2. 153*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLoadUpdX, [InstrStage<1, [P8_DU1], 0>, 154*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 155*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2, 156*9880d681SAndroid Build Coastguard Worker P8_LU1, P8_LU2], 0>, 157*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 158*9880d681SAndroid Build Coastguard Worker [3, 3, 1, 1]>, 159*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLD , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 160*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 161*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2, 162*9880d681SAndroid Build Coastguard Worker P8_LU1, P8_LU2]>], 163*9880d681SAndroid Build Coastguard Worker [2, 1, 1]>, 164*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLDU , [InstrStage<1, [P8_DU1], 0>, 165*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 166*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2, 167*9880d681SAndroid Build Coastguard Worker P8_LU1, P8_LU2], 0>, 168*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 169*9880d681SAndroid Build Coastguard Worker [2, 2, 1, 1]>, 170*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLDUX , [InstrStage<1, [P8_DU1], 0>, 171*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 172*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2, 173*9880d681SAndroid Build Coastguard Worker P8_LU1, P8_LU2], 0>, 174*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 175*9880d681SAndroid Build Coastguard Worker [3, 3, 1, 1]>, 176*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLFD , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 177*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 178*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LU1, P8_LU2]>], 179*9880d681SAndroid Build Coastguard Worker [3, 1, 1]>, 180*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLVecX , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 181*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 182*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LU1, P8_LU2]>], 183*9880d681SAndroid Build Coastguard Worker [3, 1, 1]>, 184*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLFDU , [InstrStage<1, [P8_DU1], 0>, 185*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 186*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LU1, P8_LU2], 0>, 187*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 188*9880d681SAndroid Build Coastguard Worker [3, 3, 1, 1]>, 189*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLFDUX , [InstrStage<1, [P8_DU1], 0>, 190*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 191*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LU1, P8_LU2], 0>, 192*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 193*9880d681SAndroid Build Coastguard Worker [3, 3, 1, 1]>, 194*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLHA , [InstrStage<1, [P8_DU1], 0>, 195*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 196*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2, 197*9880d681SAndroid Build Coastguard Worker P8_LU1, P8_LU2], 0>, 198*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2, 199*9880d681SAndroid Build Coastguard Worker P8_LU1, P8_LU2]>], 200*9880d681SAndroid Build Coastguard Worker [3, 1, 1]>, 201*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLHAU , [InstrStage<1, [P8_DU1], 0>, 202*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 203*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2, 204*9880d681SAndroid Build Coastguard Worker P8_LU1, P8_LU2], 0>, 205*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>, 206*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 207*9880d681SAndroid Build Coastguard Worker [4, 4, 1, 1]>, 208*9880d681SAndroid Build Coastguard Worker // first+last in dispatch group. 209*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLHAUX , [InstrStage<1, [P8_DU1], 0>, 210*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 211*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU3], 0>, 212*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU4], 0>, 213*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU5], 0>, 214*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU6], 0>, 215*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2, 216*9880d681SAndroid Build Coastguard Worker P8_LU1, P8_LU2], 0>, 217*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>, 218*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 219*9880d681SAndroid Build Coastguard Worker [4, 4, 1, 1]>, 220*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLWA , [InstrStage<1, [P8_DU1], 0>, 221*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 222*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2, 223*9880d681SAndroid Build Coastguard Worker P8_LU1, P8_LU2]>, 224*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 225*9880d681SAndroid Build Coastguard Worker [3, 1, 1]>, 226*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLWARX, [InstrStage<1, [P8_DU1], 0>, 227*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 228*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU3], 0>, 229*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU4], 0>, 230*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2, 231*9880d681SAndroid Build Coastguard Worker P8_LU1, P8_LU2]>], 232*9880d681SAndroid Build Coastguard Worker [3, 1, 1]>, 233*9880d681SAndroid Build Coastguard Worker // first+last 234*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLDARX, [InstrStage<1, [P8_DU1], 0>, 235*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 236*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU3], 0>, 237*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU4], 0>, 238*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU5], 0>, 239*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU6], 0>, 240*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2, 241*9880d681SAndroid Build Coastguard Worker P8_LU1, P8_LU2]>], 242*9880d681SAndroid Build Coastguard Worker [3, 1, 1]>, 243*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStLMW , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 244*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 245*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2, 246*9880d681SAndroid Build Coastguard Worker P8_LU1, P8_LU2]>], 247*9880d681SAndroid Build Coastguard Worker [2, 1, 1]>, 248*9880d681SAndroid Build Coastguard Worker// Stores are dual-issued from the issue queue, so may only take up one 249*9880d681SAndroid Build Coastguard Worker// dispatch slot. The instruction will be broken into two IOPS. The agen 250*9880d681SAndroid Build Coastguard Worker// op is issued to the LSU, and the data op (register fetch) is issued 251*9880d681SAndroid Build Coastguard Worker// to either the LU (GPR store) or the VSU (FPR store). 252*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStStore , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 253*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 254*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2]>, 255*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LU1, P8_LU2]>], 256*9880d681SAndroid Build Coastguard Worker [1, 1, 1]>, 257*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStSTD , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 258*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 259*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LU1, P8_LU2, 260*9880d681SAndroid Build Coastguard Worker P8_LSU1, P8_LSU2]>] 261*9880d681SAndroid Build Coastguard Worker [1, 1, 1]>, 262*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStSTDU , [InstrStage<1, [P8_DU1], 0>, 263*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 264*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LU1, P8_LU2, 265*9880d681SAndroid Build Coastguard Worker P8_LSU1, P8_LSU2], 0>, 266*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 267*9880d681SAndroid Build Coastguard Worker [2, 1, 1, 1]>, 268*9880d681SAndroid Build Coastguard Worker // First+last 269*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStSTDUX , [InstrStage<1, [P8_DU1], 0>, 270*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 271*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU3], 0>, 272*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU4], 0>, 273*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU5], 0>, 274*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU6], 0>, 275*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2], 0>, 276*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>, 277*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 278*9880d681SAndroid Build Coastguard Worker [2, 1, 1, 1]>, 279*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStSTFD , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 280*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 281*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2], 0>, 282*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 283*9880d681SAndroid Build Coastguard Worker [1, 1, 1]>, 284*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStSTFDU , [InstrStage<1, [P8_DU1], 0>, 285*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 286*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2], 0>, 287*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2], 0>, 288*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 289*9880d681SAndroid Build Coastguard Worker [2, 1, 1, 1]>, 290*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStSTVEBX , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 291*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 292*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2], 0>, 293*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 294*9880d681SAndroid Build Coastguard Worker [1, 1, 1]>, 295*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStSTDCX , [InstrStage<1, [P8_DU1], 0>, 296*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 297*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU3], 0>, 298*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU4], 0>, 299*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU5], 0>, 300*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU6], 0>, 301*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2], 0>, 302*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LU1, P8_LU2]>], 303*9880d681SAndroid Build Coastguard Worker [1, 1, 1]>, 304*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_LdStSTWCX , [InstrStage<1, [P8_DU1], 0>, 305*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU2], 0>, 306*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU3], 0>, 307*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU4], 0>, 308*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU5], 0>, 309*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_DU6], 0>, 310*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LSU1, P8_LSU2], 0>, 311*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_LU1, P8_LU2]>], 312*9880d681SAndroid Build Coastguard Worker [1, 1, 1]>, 313*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_SprMFCR , [InstrStage<1, [P8_DU1], 0>, 314*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_CRU]>], 315*9880d681SAndroid Build Coastguard Worker [6, 1]>, 316*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_SprMFCRF , [InstrStage<1, [P8_DU1], 0>, 317*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_CRU]>], 318*9880d681SAndroid Build Coastguard Worker [3, 1]>, 319*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_SprMTSPR , [InstrStage<1, [P8_DU1], 0>, 320*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FXU1, P8_FXU2]>], 321*9880d681SAndroid Build Coastguard Worker [4, 1]>, // mtctr 322*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_FPGeneral , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 323*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 324*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 325*9880d681SAndroid Build Coastguard Worker [5, 1, 1]>, 326*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_FPAddSub , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 327*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 328*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 329*9880d681SAndroid Build Coastguard Worker [5, 1, 1]>, 330*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_FPCompare , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 331*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 332*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 333*9880d681SAndroid Build Coastguard Worker [8, 1, 1]>, 334*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_FPDivD , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 335*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 336*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 337*9880d681SAndroid Build Coastguard Worker [33, 1, 1]>, 338*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_FPDivS , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 339*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 340*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 341*9880d681SAndroid Build Coastguard Worker [27, 1, 1]>, 342*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_FPSqrtD , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 343*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 344*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 345*9880d681SAndroid Build Coastguard Worker [44, 1, 1]>, 346*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_FPSqrtS , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 347*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 348*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 349*9880d681SAndroid Build Coastguard Worker [32, 1, 1]>, 350*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_FPFused , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 351*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 352*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 353*9880d681SAndroid Build Coastguard Worker [5, 1, 1, 1]>, 354*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_FPRes , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3, 355*9880d681SAndroid Build Coastguard Worker P8_DU4, P8_DU5, P8_DU6], 0>, 356*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 357*9880d681SAndroid Build Coastguard Worker [5, 1, 1]>, 358*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_VecGeneral , [InstrStage<1, [P8_DU1], 0>, 359*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 360*9880d681SAndroid Build Coastguard Worker [2, 1, 1]>, 361*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_VecVSL , [InstrStage<1, [P8_DU1], 0>, 362*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 363*9880d681SAndroid Build Coastguard Worker [2, 1, 1]>, 364*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_VecVSR , [InstrStage<1, [P8_DU1], 0>, 365*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 366*9880d681SAndroid Build Coastguard Worker [2, 1, 1]>, 367*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_VecFP , [InstrStage<1, [P8_DU1], 0>, 368*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 369*9880d681SAndroid Build Coastguard Worker [6, 1, 1]>, 370*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_VecFPCompare, [InstrStage<1, [P8_DU1], 0>, 371*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 372*9880d681SAndroid Build Coastguard Worker [6, 1, 1]>, 373*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_VecFPRound , [InstrStage<1, [P8_DU1], 0>, 374*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 375*9880d681SAndroid Build Coastguard Worker [6, 1, 1]>, 376*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_VecComplex , [InstrStage<1, [P8_DU1], 0>, 377*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU1, P8_FPU2]>], 378*9880d681SAndroid Build Coastguard Worker [7, 1, 1]>, 379*9880d681SAndroid Build Coastguard Worker InstrItinData<IIC_VecPerm , [InstrStage<1, [P8_DU1, P8_DU2], 0>, 380*9880d681SAndroid Build Coastguard Worker InstrStage<1, [P8_FPU2, P8_FPU2]>], 381*9880d681SAndroid Build Coastguard Worker [3, 1, 1]> 382*9880d681SAndroid Build Coastguard Worker]>; 383*9880d681SAndroid Build Coastguard Worker 384*9880d681SAndroid Build Coastguard Worker// ===---------------------------------------------------------------------===// 385*9880d681SAndroid Build Coastguard Worker// P8 machine model for scheduling and other instruction cost heuristics. 386*9880d681SAndroid Build Coastguard Worker// P8 has an 8 insn dispatch group (6 non-branch, 2 branch) and can issue up 387*9880d681SAndroid Build Coastguard Worker// to 10 insns per cycle (2-LU, 2-LSU, 2-FXU, 2-FPU, 1-CRU, 1-BRU). 388*9880d681SAndroid Build Coastguard Worker 389*9880d681SAndroid Build Coastguard Workerdef P8Model : SchedMachineModel { 390*9880d681SAndroid Build Coastguard Worker let IssueWidth = 8; // up to 8 instructions dispatched per cycle. 391*9880d681SAndroid Build Coastguard Worker // up to six non-branch instructions. 392*9880d681SAndroid Build Coastguard Worker // up to two branches in a dispatch group. 393*9880d681SAndroid Build Coastguard Worker 394*9880d681SAndroid Build Coastguard Worker let LoadLatency = 3; // Optimistic load latency assuming bypass. 395*9880d681SAndroid Build Coastguard Worker // This is overriden by OperandCycles if the 396*9880d681SAndroid Build Coastguard Worker // Itineraries are queried instead. 397*9880d681SAndroid Build Coastguard Worker let MispredictPenalty = 16; 398*9880d681SAndroid Build Coastguard Worker 399*9880d681SAndroid Build Coastguard Worker // Try to make sure we have at least 10 dispatch groups in a loop. 400*9880d681SAndroid Build Coastguard Worker let LoopMicroOpBufferSize = 60; 401*9880d681SAndroid Build Coastguard Worker 402*9880d681SAndroid Build Coastguard Worker let CompleteModel = 0; 403*9880d681SAndroid Build Coastguard Worker 404*9880d681SAndroid Build Coastguard Worker let Itineraries = P8Itineraries; 405*9880d681SAndroid Build Coastguard Worker} 406*9880d681SAndroid Build Coastguard Worker 407