]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Target/PowerPC/PPCScheduleP9.td
Upgrade our copies of clang, llvm, lld, lldb, compiler-rt and libc++ to
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Target / PowerPC / PPCScheduleP9.td
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 //===----------------------------------------------------------------------===//
13 include "PPCInstrInfo.td"
14
15 def 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 = 1;
26
27   let UnsupportedFeatures = [HasQPX];
28
29 }
30
31 let 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   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]>;
307
308   // ***************** Defining Itinerary Class Resources *****************
309
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,
313   // IIC_LdStLFDUX
314
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,
318                 IIC_SprRFI]>;
319
320   def : ItinRW<[P9_ALU_3C, IP_EXEC_1C, DISP_1C, DISP_1C],
321                [IIC_IntTrapW]>;
322
323   def : ItinRW<[P9_ALU_2C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C],
324                [IIC_IntISEL, IIC_IntRotate, IIC_IntShift]>;
325
326   def : ItinRW<[P9_ALU_2C, IP_EXEC_1C, DISP_1C, DISP_1C], [IIC_IntCompare]>;
327
328   def : ItinRW<[P9_ALUE_2C, P9_ALUO_2C, IP_EXECE_1C, IP_EXECO_1C,
329                 DISP_1C, DISP_1C], [IIC_VecGeneral, IIC_FPCompare]>;
330
331   def : ItinRW<[P9_DP_5C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C],
332                [IIC_IntMulHW, IIC_IntMulHWU, IIC_IntMulLI, IIC_IntMulHD]>;
333
334   def : ItinRW<[P9_LS_5C, IP_EXEC_1C, DISP_1C, DISP_1C],
335                [IIC_LdStLoad, IIC_LdStLD, IIC_LdStLFD]>;
336
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]>;
340
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]>;
344
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],
347                [IIC_LdStSTFDU]>;
348
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]>;
352
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]>;
357
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]>;
362
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]>;
367
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]>;
370
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]>;
375
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]>;
379
380   def : ItinRW<[P9_ALU_5C, IP_EXEC_1C, DISP_1C, DISP_1C, DISP_1C],
381                [IIC_BrCR, IIC_IntMTFSB0]>;
382
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]>;
387
388   def : ItinRW<[P9_BR_2C, DISP_1C], [IIC_BrB]>;
389   def : ItinRW<[P9_BR_5C, DISP_1C], [IIC_SprMFSPR]>;
390
391   // This class should be broken down to instruction level, once some missing
392   // info is obtained.
393   def : ItinRW<[P9_LoadAndALUOp_6C, IP_EXEC_1C, IP_AGEN_1C,
394                 DISP_1C, DISP_1C, DISP_1C], [IIC_SprMTSPR]>;
395
396   def : ItinRW<[P9_LoadAndLoadOp_8C, IP_EXEC_1C, DISP_1C, DISP_1C],
397                [IIC_SprSLBIE, IIC_SprSLBMFEE, IIC_SprSLBMFEV, IIC_SprSLBMTE,
398                 IIC_SprTLBIEL]>;
399
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]>;
406
407   def : ItinRW<[P9_ALUE_3C, P9_ALUO_3C, IP_EXECE_1C, IP_EXECO_1C,
408                 DISP_1C, DISP_1C], [IIC_VecFPCompare]>;
409
410   def : ItinRW<[P9_PM_3C, IP_EXECO_1C, IP_EXECE_1C, DISP_1C, DISP_1C],
411                [IIC_VecPerm]>;
412
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]>;
415
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]>;
419
420   def : ItinRW<[], [IIC_SprSTOP]>;
421
422   include "P9InstrResources.td"
423
424 }
425