1 //===-- PPCScheduleP9.td - PPC P9 Scheduling Definitions ---*- tablegen -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the itinerary class data for the POWER9 processor.
12 //===----------------------------------------------------------------------===//
13 include "PPCInstrInfo.td"
15 def P9Model : SchedMachineModel {
20 let MispredictPenalty = 16;
22 // Try to make sure we have at least 10 dispatch groups in a loop.
23 let LoopMicroOpBufferSize = 60;
25 let CompleteModel = 1;
27 let UnsupportedFeatures = [HasQPX];
31 let SchedModel = P9Model in {
33 // ***************** Processor Resources *****************
36 def DISPATCHER : ProcResource<12>;
39 def IP_AGEN : ProcResource<4>;
40 def IP_EXEC : ProcResource<4>;
41 def IP_EXECE : ProcResource<2> {
45 def IP_EXECO : ProcResource<2> {
51 def ALU : ProcResource<4>;
52 def ALUE : ProcResource<2> {
56 def ALUO : ProcResource<2> {
60 def DIV : ProcResource<2>;
61 def DP : ProcResource<4>;
62 def DPE : ProcResource<2> {
66 def DPO : ProcResource<2> {
70 def LS : ProcResource<4>;
71 def PM : ProcResource<2>;
72 def DFU : ProcResource<1>;
73 def BR : ProcResource<1> {
76 def CY : ProcResource<1>;
78 def TestGroup : ProcResGroup<[ALU, DP]>;
80 // ***************** SchedWriteRes Definitions *****************
83 def DISP_1C : SchedWriteRes<[DISPATCHER]> {
89 def IP_AGEN_1C : SchedWriteRes<[IP_AGEN]> {
94 def IP_EXEC_1C : SchedWriteRes<[IP_EXEC]> {
99 def IP_EXECE_1C : SchedWriteRes<[IP_EXECE]> {
104 def IP_EXECO_1C : SchedWriteRes<[IP_EXECO]> {
110 def P9_ALU_2C : SchedWriteRes<[ALU]> {
114 def P9_ALUE_2C : SchedWriteRes<[ALUE]> {
118 def P9_ALUO_2C : SchedWriteRes<[ALUO]> {
122 def P9_ALU_3C : SchedWriteRes<[ALU]> {
126 def P9_ALUE_3C : SchedWriteRes<[ALUE]> {
130 def P9_ALUO_3C : SchedWriteRes<[ALUO]> {
134 def P9_ALU_4C : SchedWriteRes<[ALU]> {
138 def P9_ALUE_4C : SchedWriteRes<[ALUE]> {
142 def P9_ALUO_4C : SchedWriteRes<[ALUO]> {
146 def P9_ALU_5C : SchedWriteRes<[ALU]> {
150 def P9_ALU_6C : SchedWriteRes<[ALU]> {
154 def P9_DIV_12C : SchedWriteRes<[DIV]> {
158 def P9_DIV_16C_8 : SchedWriteRes<[DIV]> {
159 let ResourceCycles = [8];
163 def P9_DIV_24C_8 : SchedWriteRes<[DIV]> {
164 let ResourceCycles = [8];
168 def P9_DIV_40C_8 : SchedWriteRes<[DIV]> {
169 let ResourceCycles = [8];
173 def P9_DP_2C : SchedWriteRes<[DP]> {
177 def P9_DP_5C : SchedWriteRes<[DP]> {
181 def P9_DP_7C : SchedWriteRes<[DP]> {
185 def P9_DPE_7C : SchedWriteRes<[DPE]> {
189 def P9_DPO_7C : SchedWriteRes<[DPO]> {
193 def P9_DP_22C_5 : SchedWriteRes<[DP]> {
194 let ResourceCycles = [5];
198 def P9_DP_24C_8 : SchedWriteRes<[DP]> {
199 let ResourceCycles = [8];
203 def P9_DPO_24C_8 : SchedWriteRes<[DPO]> {
204 let ResourceCycles = [8];
208 def P9_DPE_24C_8 : SchedWriteRes<[DPE]> {
209 let ResourceCycles = [8];
213 def P9_DP_26C_5 : SchedWriteRes<[DP]> {
214 let ResourceCycles = [5];
218 def P9_DP_27C_7 : SchedWriteRes<[DP]> {
219 let ResourceCycles = [7];
223 def P9_DP_33C_8 : SchedWriteRes<[DP]> {
224 let ResourceCycles = [8];
228 def P9_DPE_33C_8 : SchedWriteRes<[DPE]> {
229 let ResourceCycles = [8];
233 def P9_DPO_33C_8 : SchedWriteRes<[DPO]> {
234 let ResourceCycles = [8];
238 def P9_DP_36C_10 : SchedWriteRes<[DP]> {
239 let ResourceCycles = [10];
243 def P9_PM_3C : SchedWriteRes<[PM]> {
247 def P9_PM_7C : SchedWriteRes<[PM]> {
251 def P9_LS_1C : SchedWriteRes<[LS]> {
255 def P9_LS_4C : SchedWriteRes<[LS]> {
259 def P9_LS_5C : SchedWriteRes<[LS]> {
263 def P9_DFU_12C : SchedWriteRes<[DFU]> {
267 def P9_DFU_24C : SchedWriteRes<[DFU]> {
269 let ResourceCycles = [12];
272 def P9_DFU_58C : SchedWriteRes<[DFU]> {
274 let ResourceCycles = [44];
277 def P9_DFU_76C : SchedWriteRes<[TestGroup, DFU]> {
279 let ResourceCycles = [62];
282 def P9_BR_2C : SchedWriteRes<[BR]> {
286 def P9_BR_5C : SchedWriteRes<[BR]> {
290 def P9_CY_6C : SchedWriteRes<[CY]> {
294 // ***************** WriteSeq Definitions *****************
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 def P9_DPOpAndALUOp_9C : WriteSequence<[P9_DP_7C, P9_ALU_2C]>;
305 def P9_DPOpAndALUOp_24C_5 : WriteSequence<[P9_DP_22C_5, P9_ALU_2C]>;
306 def P9_DPOpAndALUOp_35C_8 : WriteSequence<[P9_DP_33C_8, P9_ALU_2C]>;
308 // ***************** Defining Itinerary Class Resources *****************
310 // The following itineraries are fully covered by the InstRW definitions in
311 // P9InstrResources.td so aren't listed here.
312 // IIC_FPDivD, IIC_FPDivS, IIC_FPFused, IIC_IntDivD, IIC_LdStLFDU,
315 def : ItinRW<[P9_ALU_2C, IP_EXEC_1C, DISP_1C, DISP_1C],
316 [IIC_IntSimple, IIC_IntGeneral, IIC_IntRFID,
317 IIC_IntRotateD, IIC_IntRotateDI, IIC_IntTrapD,
320 def : ItinRW<[P9_ALU_3C, IP_EXEC_1C, DISP_1C, DISP_1C],
323 def : ItinRW<[P9_ALU_2C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C],
324 [IIC_IntISEL, IIC_IntRotate, IIC_IntShift]>;
326 def : ItinRW<[P9_ALU_2C, IP_EXEC_1C, DISP_1C, DISP_1C], [IIC_IntCompare]>;
328 def : ItinRW<[P9_ALUE_2C, P9_ALUO_2C, IP_EXECE_1C, IP_EXECO_1C,
329 DISP_1C, DISP_1C], [IIC_VecGeneral, IIC_FPCompare]>;
331 def : ItinRW<[P9_DP_5C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C],
332 [IIC_IntMulHW, IIC_IntMulHWU, IIC_IntMulLI, IIC_IntMulHD]>;
334 def : ItinRW<[P9_LS_5C, IP_EXEC_1C, DISP_1C, DISP_1C],
335 [IIC_LdStLoad, IIC_LdStLD, IIC_LdStLFD]>;
337 def : ItinRW<[P9_LS_4C, P9_ALU_2C, IP_EXEC_1C, IP_EXEC_1C,
338 DISP_1C, DISP_1C, DISP_1C, DISP_1C],
339 [IIC_LdStLoadUpd, IIC_LdStLDU]>;
341 def : ItinRW<[P9_LS_4C, P9_ALU_2C, IP_EXECE_1C, IP_EXECO_1C,
342 DISP_1C, DISP_1C, DISP_1C, DISP_1C],
343 [IIC_LdStLoadUpdX, IIC_LdStLDUX]>;
345 def : ItinRW<[P9_LS_1C, P9_ALU_2C, IP_EXEC_1C, IP_EXEC_1C, IP_AGEN_1C,
346 DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C],
349 def : ItinRW<[P9_LoadAndALUOp_6C,
350 IP_AGEN_1C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C],
351 [IIC_LdStLHA, IIC_LdStLWA]>;
353 def : ItinRW<[P9_LoadAndALUOp_6C, P9_ALU_2C,
354 IP_AGEN_1C, IP_EXEC_1C, IP_EXEC_1C,
355 DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C],
356 [IIC_LdStLHAU, IIC_LdStLHAUX]>;
358 // IIC_LdStLMW contains two microcoded insns. This is not accurate, but
359 // those insns are not used that much, if at all.
360 def : ItinRW<[P9_LS_4C, IP_EXEC_1C, DISP_1C, DISP_1C],
361 [IIC_LdStLWARX, IIC_LdStLDARX, IIC_LdStLMW]>;
363 def : ItinRW<[P9_LS_4C, IP_EXEC_1C, DISP_1C, DISP_1C],
364 [IIC_LdStCOPY, IIC_SprABORT, IIC_LdStPASTE, IIC_LdStDCBF,
365 IIC_LdStICBI, IIC_LdStSync, IIC_SprISYNC, IIC_SprMSGSYNC,
366 IIC_SprSLBIA, IIC_SprSLBSYNC, IIC_SprTLBSYNC]>;
368 def : ItinRW<[P9_LS_1C, IP_EXEC_1C, IP_AGEN_1C, DISP_1C, DISP_1C, DISP_1C],
369 [IIC_LdStSTFD, IIC_LdStSTD, IIC_LdStStore]>;
371 def : ItinRW<[P9_LS_1C, P9_ALU_2C, IP_EXEC_1C, IP_EXEC_1C, IP_AGEN_1C,
372 DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C],
373 [IIC_LdStSTDU, IIC_LdStSTDUX, IIC_LdStStoreUpd, IIC_SprSLBIEG,
374 IIC_SprTLBIA, IIC_SprTLBIE]>;
376 def : ItinRW<[P9_StoreAndALUOp_4C, IP_EXEC_1C, IP_EXEC_1C, IP_AGEN_1C,
377 DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C],
378 [IIC_LdStSTDCX, IIC_LdStSTWCX]>;
380 def : ItinRW<[P9_ALU_5C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C],
381 [IIC_BrCR, IIC_IntMTFSB0]>;
383 def : ItinRW<[P9_ALUOpAndALUOp_4C, P9_ALU_2C, IP_EXEC_1C, IP_EXEC_1C,
384 IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C, DISP_1C,
385 DISP_1C, DISP_1C, DISP_1C, DISP_1C],
386 [IIC_SprMFCR, IIC_SprMFCRF, IIC_BrMCR, IIC_BrMCRX, IIC_IntMFFS]>;
388 def : ItinRW<[P9_BR_2C, DISP_1C], [IIC_BrB]>;
389 def : ItinRW<[P9_BR_5C, DISP_1C], [IIC_SprMFSPR]>;
391 // This class should be broken down to instruction level, once some missing
393 def : ItinRW<[P9_LoadAndALUOp_6C, IP_EXEC_1C, IP_AGEN_1C,
394 DISP_1C, DISP_1C, DISP_1C], [IIC_SprMTSPR]>;
396 def : ItinRW<[P9_LoadAndLoadOp_8C, IP_EXEC_1C, DISP_1C, DISP_1C],
397 [IIC_SprSLBIE, IIC_SprSLBMFEE, IIC_SprSLBMFEV, IIC_SprSLBMTE,
400 // IIC_VecFP is added here although many instructions with that itinerary
401 // use very different resources. It would appear that instructions were
402 // given that itinerary rather carelessly over time. Specific instructions
403 // that use different resources are listed in various InstrRW classes.
404 def : ItinRW<[P9_DP_7C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C],
405 [IIC_FPGeneral, IIC_FPAddSub, IIC_VecFP]>;
407 def : ItinRW<[P9_ALUE_3C, P9_ALUO_3C, IP_EXECE_1C, IP_EXECO_1C,
408 DISP_1C, DISP_1C], [IIC_VecFPCompare]>;
410 def : ItinRW<[P9_PM_3C, IP_EXECO_1C, IP_EXECE_1C, DISP_1C, DISP_1C],
413 def : ItinRW<[P9_DP_36C_10, IP_EXEC_1C], [IIC_FPSqrtD]>;
414 def : ItinRW<[P9_DP_26C_5, P9_DP_26C_5, IP_EXEC_1C, IP_EXEC_1C], [IIC_FPSqrtS]>;
416 def : ItinRW<[P9_DIV_12C, IP_EXECE_1C, DISP_1C, DISP_1C],
417 [IIC_SprMFMSR, IIC_SprMFPMR, IIC_SprMFSR, IIC_SprMFTB,
418 IIC_SprMTMSR, IIC_SprMTMSRD, IIC_SprMTPMR, IIC_SprMTSR]>;
420 def : ItinRW<[], [IIC_SprSTOP]>;
422 include "P9InstrResources.td"