1//===-- PPCScheduleP9.td - PPC P9 Scheduling Definitions ---*- tablegen -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines the itinerary class data for the POWER9 processor. 11// 12//===----------------------------------------------------------------------===// 13include "PPCInstrInfo.td" 14 15def P9Model : SchedMachineModel { 16 let IssueWidth = 8; 17 18 let LoadLatency = 5; 19 20 let MispredictPenalty = 16; 21 22 // Try to make sure we have at least 10 dispatch groups in a loop. 23 let LoopMicroOpBufferSize = 60; 24 25 let CompleteModel = 0; 26 27 let UnsupportedFeatures = [HasQPX]; 28 29} 30 31let SchedModel = P9Model in { 32 33 // ***************** Processor Resources ***************** 34 35 //Dispatcher: 36 def DISPATCHER : ProcResource<12>; 37 38 // Issue Ports 39 def IP_AGEN : ProcResource<4>; 40 def IP_EXEC : ProcResource<4>; 41 def IP_EXECE : ProcResource<2> { 42 //Even Exec Ports 43 let Super = IP_EXEC; 44 } 45 def IP_EXECO : ProcResource<2> { 46 //Odd Exec Ports 47 let Super = IP_EXEC; 48 } 49 50 // Pipeline Groups 51 def ALU : ProcResource<4>; 52 def ALUE : ProcResource<2> { 53 //Even ALU pipelines 54 let Super = ALU; 55 } 56 def ALUO : ProcResource<2> { 57 //Odd ALU pipelines 58 let Super = ALU; 59 } 60 def DIV : ProcResource<2>; 61 def DP : ProcResource<4>; 62 def DPE : ProcResource<2> { 63 //Even DP pipelines 64 let Super = DP; 65 } 66 def DPO : ProcResource<2> { 67 //Odd DP pipelines 68 let Super = DP; 69 } 70 def LS : ProcResource<4>; 71 def PM : ProcResource<2>; 72 def DFU : ProcResource<1>; 73 def BR : ProcResource<1> { 74 let BufferSize = 16; 75 } 76 def CY : ProcResource<1>; 77 78 def TestGroup : ProcResGroup<[ALU, DP]>; 79 80 // ***************** SchedWriteRes Definitions ***************** 81 82 //Dispatcher 83 def DISP_1C : SchedWriteRes<[DISPATCHER]> { 84 let NumMicroOps = 0; 85 let Latency = 1; 86 } 87 88 // Issue Ports 89 def IP_AGEN_1C : SchedWriteRes<[IP_AGEN]> { 90 let NumMicroOps = 0; 91 let Latency = 1; 92 } 93 94 def IP_EXEC_1C : SchedWriteRes<[IP_EXEC]> { 95 let NumMicroOps = 0; 96 let Latency = 1; 97 } 98 99 def IP_EXECE_1C : SchedWriteRes<[IP_EXECE]> { 100 let NumMicroOps = 0; 101 let Latency = 1; 102 } 103 104 def IP_EXECO_1C : SchedWriteRes<[IP_EXECO]> { 105 let NumMicroOps = 0; 106 let Latency = 1; 107 } 108 109 //Pipeline Groups 110 def P9_ALU_2C : SchedWriteRes<[ALU]> { 111 let Latency = 2; 112 } 113 114 def P9_ALUE_2C : SchedWriteRes<[ALUE]> { 115 let Latency = 2; 116 } 117 118 def P9_ALUO_2C : SchedWriteRes<[ALUO]> { 119 let Latency = 2; 120 } 121 122 def P9_ALU_3C : SchedWriteRes<[ALU]> { 123 let Latency = 3; 124 } 125 126 def P9_ALUE_3C : SchedWriteRes<[ALUE]> { 127 let Latency = 3; 128 } 129 130 def P9_ALUO_3C : SchedWriteRes<[ALUO]> { 131 let Latency = 3; 132 } 133 134 def P9_ALU_4C : SchedWriteRes<[ALU]> { 135 let Latency = 4; 136 } 137 138 def P9_ALUE_4C : SchedWriteRes<[ALUE]> { 139 let Latency = 4; 140 } 141 142 def P9_ALUO_4C : SchedWriteRes<[ALUO]> { 143 let Latency = 4; 144 } 145 146 def P9_ALU_5C : SchedWriteRes<[ALU]> { 147 let Latency = 5; 148 } 149 150 def P9_ALU_6C : SchedWriteRes<[ALU]> { 151 let Latency = 6; 152 } 153 154 def P9_DIV_12C : SchedWriteRes<[DIV]> { 155 let Latency = 12; 156 } 157 158 def P9_DIV_16C_8 : SchedWriteRes<[DIV]> { 159 let ResourceCycles = [8]; 160 let Latency = 16; 161 } 162 163 def P9_DIV_24C_8 : SchedWriteRes<[DIV]> { 164 let ResourceCycles = [8]; 165 let Latency = 24; 166 } 167 168 def P9_DIV_40C_8 : SchedWriteRes<[DIV]> { 169 let ResourceCycles = [8]; 170 let Latency = 40; 171 } 172 173 def P9_DP_2C : SchedWriteRes<[DP]> { 174 let Latency = 2; 175 } 176 177 def P9_DP_5C : SchedWriteRes<[DP]> { 178 let Latency = 5; 179 } 180 181 def P9_DP_7C : SchedWriteRes<[DP]> { 182 let Latency = 7; 183 } 184 185 def P9_DPE_7C : SchedWriteRes<[DPE]> { 186 let Latency = 7; 187 } 188 189 def P9_DPO_7C : SchedWriteRes<[DPO]> { 190 let Latency = 7; 191 } 192 193 def P9_DP_22C_5 : SchedWriteRes<[DP]> { 194 let ResourceCycles = [5]; 195 let Latency = 22; 196 } 197 198 def P9_DP_24C_8 : SchedWriteRes<[DP]> { 199 let ResourceCycles = [8]; 200 let Latency = 24; 201 } 202 203 def P9_DPO_24C_8 : SchedWriteRes<[DPO]> { 204 let ResourceCycles = [8]; 205 let Latency = 24; 206 } 207 208 def P9_DPE_24C_8 : SchedWriteRes<[DPE]> { 209 let ResourceCycles = [8]; 210 let Latency = 24; 211 } 212 213 def P9_DP_26C_5 : SchedWriteRes<[DP]> { 214 let ResourceCycles = [5]; 215 let Latency = 22; 216 } 217 218 def P9_DP_27C_7 : SchedWriteRes<[DP]> { 219 let ResourceCycles = [7]; 220 let Latency = 27; 221 } 222 223 def P9_DP_33C_8 : SchedWriteRes<[DP]> { 224 let ResourceCycles = [8]; 225 let Latency = 33; 226 } 227 228 def P9_DPE_33C_8 : SchedWriteRes<[DPE]> { 229 let ResourceCycles = [8]; 230 let Latency = 33; 231 } 232 233 def P9_DPO_33C_8 : SchedWriteRes<[DPO]> { 234 let ResourceCycles = [8]; 235 let Latency = 33; 236 } 237 238 def P9_DP_36C_10 : SchedWriteRes<[DP]> { 239 let ResourceCycles = [10]; 240 let Latency = 36; 241 } 242 243 def P9_PM_3C : SchedWriteRes<[PM]> { 244 let Latency = 3; 245 } 246 247 def P9_PM_7C : SchedWriteRes<[PM]> { 248 let Latency = 3; 249 } 250 251 def P9_LS_1C : SchedWriteRes<[LS]> { 252 let Latency = 1; 253 } 254 255 def P9_LS_4C : SchedWriteRes<[LS]> { 256 let Latency = 4; 257 } 258 259 def P9_LS_5C : SchedWriteRes<[LS]> { 260 let Latency = 5; 261 } 262 263 def P9_DFU_12C : SchedWriteRes<[DFU]> { 264 let Latency = 12; 265 } 266 267 def P9_DFU_24C : SchedWriteRes<[DFU]> { 268 let Latency = 24; 269 let ResourceCycles = [12]; 270 } 271 272 def P9_DFU_58C : SchedWriteRes<[DFU]> { 273 let Latency = 58; 274 let ResourceCycles = [44]; 275 } 276 277 def P9_DFU_76C : SchedWriteRes<[TestGroup, DFU]> { 278 let Latency = 76; 279 let ResourceCycles = [62]; 280 } 281 282 def P9_BR_2C : SchedWriteRes<[BR]> { 283 let Latency = 2; 284 } 285 286 def P9_BR_5C : SchedWriteRes<[BR]> { 287 let Latency = 5; 288 } 289 290 def P9_CY_6C : SchedWriteRes<[CY]> { 291 let Latency = 6; 292 } 293 294 // ***************** WriteSeq Definitions ***************** 295 296 def P9_LoadAndALUOp_6C : WriteSequence<[P9_LS_4C, P9_ALU_2C]>; 297 def P9_LoadAndALUOp_7C : WriteSequence<[P9_LS_5C, P9_ALU_2C]>; 298 def P9_LoadAndPMOp_8C : WriteSequence<[P9_LS_5C, P9_PM_3C]>; 299 def P9_LoadAndLoadOp_8C : WriteSequence<[P9_LS_4C, P9_LS_4C]>; 300 def P9_IntDivAndALUOp_26C_8 : WriteSequence<[P9_DIV_24C_8, P9_ALU_2C]>; 301 def P9_IntDivAndALUOp_42C_8 : WriteSequence<[P9_DIV_40C_8, P9_ALU_2C]>; 302 def P9_StoreAndALUOp_4C : WriteSequence<[P9_LS_1C, P9_ALU_3C]>; 303 def P9_ALUOpAndALUOp_4C : WriteSequence<[P9_ALU_2C, P9_ALU_2C]>; 304 305 // ***************** Defining Itinerary Class Resources ***************** 306 307 // The following itineraries are fully covered by the InstRW definitions in 308 // P9InstrResources.td so aren't listed here. 309 // IIC_FPDivD, IIC_FPDivS, IIC_FPFused, IIC_IntDivD, IIC_LdStLFDU, 310 // IIC_LdStLFDUX 311 312 def : ItinRW<[P9_ALU_2C, IP_EXEC_1C, DISP_1C, DISP_1C], 313 [IIC_IntSimple, IIC_IntGeneral, IIC_IntRFID, 314 IIC_IntRotateD, IIC_IntRotateDI, IIC_IntTrapD, 315 IIC_SprRFI]>; 316 317 def : ItinRW<[P9_ALU_3C, IP_EXEC_1C, DISP_1C, DISP_1C], 318 [IIC_IntTrapW]>; 319 320 def : ItinRW<[P9_ALU_2C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C], 321 [IIC_IntISEL, IIC_IntRotate, IIC_IntShift]>; 322 323 def : ItinRW<[P9_ALU_2C, IP_EXEC_1C, DISP_1C, DISP_1C], [IIC_IntCompare]>; 324 325 def : ItinRW<[P9_ALUE_2C, P9_ALUO_2C, IP_EXECE_1C, IP_EXECO_1C, 326 DISP_1C, DISP_1C], [IIC_VecGeneral, IIC_FPCompare]>; 327 328 def : ItinRW<[P9_DP_5C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C], 329 [IIC_IntMulHW, IIC_IntMulHWU, IIC_IntMulLI, IIC_IntMulHD]>; 330 331 def : ItinRW<[P9_LS_5C, IP_EXEC_1C, DISP_1C, DISP_1C], 332 [IIC_LdStLoad, IIC_LdStLD, IIC_LdStLFD]>; 333 334 def : ItinRW<[P9_LS_4C, P9_ALU_2C, IP_EXEC_1C, IP_EXEC_1C, 335 DISP_1C, DISP_1C, DISP_1C, DISP_1C], 336 [IIC_LdStLoadUpd, IIC_LdStLDU]>; 337 338 def : ItinRW<[P9_LS_4C, P9_ALU_2C, IP_EXECE_1C, IP_EXECO_1C, 339 DISP_1C, DISP_1C, DISP_1C, DISP_1C], 340 [IIC_LdStLoadUpdX, IIC_LdStLDUX]>; 341 342 def : ItinRW<[P9_LS_1C, P9_ALU_2C, IP_EXEC_1C, IP_EXEC_1C, IP_AGEN_1C, 343 DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C], 344 [IIC_LdStSTFDU]>; 345 346 def : ItinRW<[P9_LoadAndALUOp_6C, 347 IP_AGEN_1C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C], 348 [IIC_LdStLHA, IIC_LdStLWA]>; 349 350 def : ItinRW<[P9_LoadAndALUOp_6C, P9_ALU_2C, 351 IP_AGEN_1C, IP_EXEC_1C, IP_EXEC_1C, 352 DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C], 353 [IIC_LdStLHAU, IIC_LdStLHAUX]>; 354 355 // IIC_LdStLMW contains two microcoded insns. This is not accurate, but 356 // those insns are not used that much, if at all. 357 def : ItinRW<[P9_LS_4C, IP_EXEC_1C, DISP_1C, DISP_1C], 358 [IIC_LdStLWARX, IIC_LdStLDARX, IIC_LdStLMW]>; 359 360 def : ItinRW<[P9_LS_4C, IP_EXEC_1C, DISP_1C, DISP_1C], 361 [IIC_LdStCOPY, IIC_SprABORT, IIC_LdStPASTE, IIC_LdStDCBF, 362 IIC_LdStICBI, IIC_LdStSync, IIC_SprISYNC, IIC_SprMSGSYNC, 363 IIC_SprSLBIA, IIC_SprSLBSYNC, IIC_SprTLBSYNC]>; 364 365 def : ItinRW<[P9_LS_1C, IP_EXEC_1C, IP_AGEN_1C, DISP_1C, DISP_1C, DISP_1C], 366 [IIC_LdStSTFD, IIC_LdStSTD, IIC_LdStStore]>; 367 368 def : ItinRW<[P9_LS_1C, P9_ALU_2C, IP_EXEC_1C, IP_EXEC_1C, IP_AGEN_1C, 369 DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C], 370 [IIC_LdStSTDU, IIC_LdStSTDUX, IIC_LdStStoreUpd, IIC_SprSLBIEG, 371 IIC_SprTLBIA, IIC_SprTLBIE]>; 372 373 def : ItinRW<[P9_StoreAndALUOp_4C, IP_EXEC_1C, IP_EXEC_1C, IP_AGEN_1C, 374 DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C], 375 [IIC_LdStSTDCX, IIC_LdStSTWCX]>; 376 377 def : ItinRW<[P9_ALU_5C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C], 378 [IIC_BrCR, IIC_IntMTFSB0]>; 379 380 def : ItinRW<[P9_ALUOpAndALUOp_4C, P9_ALU_2C, IP_EXEC_1C, IP_EXEC_1C, 381 IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C, 382 DISP_1C, DISP_1C, DISP_1C, DISP_1C], 383 [IIC_SprMFCR, IIC_SprMFCRF, IIC_BrMCR, IIC_BrMCRX, IIC_IntMFFS]>; 384 385 def : ItinRW<[P9_BR_2C, DISP_1C], [IIC_BrB]>; 386 def : ItinRW<[P9_BR_5C, DISP_1C], [IIC_SprMFSPR]>; 387 388 // This class should be broken down to instruction level, once some missing 389 // info is obtained. 390 def : ItinRW<[P9_LoadAndALUOp_6C, IP_EXEC_1C, IP_AGEN_1C, 391 DISP_1C, DISP_1C, DISP_1C], [IIC_SprMTSPR]>; 392 393 def : ItinRW<[P9_LoadAndLoadOp_8C, IP_EXEC_1C, DISP_1C, DISP_1C], 394 [IIC_SprSLBIE, IIC_SprSLBMFEE, IIC_SprSLBMFEV, IIC_SprSLBMTE, 395 IIC_SprTLBIEL]>; 396 397 // IIC_VecFP is added here although many instructions with that itinerary 398 // use very different resources. It would appear that instructions were 399 // given that itinerary rather carelessly over time. Specific instructions 400 // that use different resources are listed in various InstrRW classes. 401 def : ItinRW<[P9_DP_7C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C], 402 [IIC_FPGeneral, IIC_FPAddSub, IIC_VecFP]>; 403 404 def : ItinRW<[P9_ALUE_3C, P9_ALUO_3C, IP_EXECE_1C, IP_EXECO_1C, 405 DISP_1C, DISP_1C], [IIC_VecFPCompare]>; 406 407 def : ItinRW<[P9_PM_3C, IP_EXECO_1C, IP_EXECE_1C, DISP_1C, DISP_1C], 408 [IIC_VecPerm]>; 409 410 def : ItinRW<[P9_DP_36C_10, IP_EXEC_1C], [IIC_FPSqrtD]>; 411 def : ItinRW<[P9_DP_26C_5, P9_DP_26C_5, IP_EXEC_1C, IP_EXEC_1C], [IIC_FPSqrtS]>; 412 413 def : ItinRW<[P9_DIV_12C, IP_EXECE_1C, DISP_1C, DISP_1C], 414 [IIC_SprMFMSR, IIC_SprMFPMR, IIC_SprMFSR, IIC_SprMFTB, 415 IIC_SprMTMSR, IIC_SprMTMSRD, IIC_SprMTPMR, IIC_SprMTSR]>; 416 417 def : ItinRW<[], [IIC_SprSTOP]>; 418 419 include "P9InstrResources.td" 420 421} 422 423