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