xref: /freebsd/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCScheduleP10.td (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
1349cc55cSDimitry Andric//===--- PPCScheduleP10.td - P10 Scheduling Definitions -*- tablegen -*-===//
2349cc55cSDimitry Andric//
3349cc55cSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4349cc55cSDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5349cc55cSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6349cc55cSDimitry Andric//
7349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
8349cc55cSDimitry Andric// Automatically generated file, do not edit!
9349cc55cSDimitry Andric//
10349cc55cSDimitry Andric// This file defines the resources required by P10 instructions.
11349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
12349cc55cSDimitry Andric// Modeling pipeline forwarding logic.
13349cc55cSDimitry Andricdef P10BR_Read : SchedRead;
14349cc55cSDimitry Andricdef P10DF_Read : SchedRead;
15349cc55cSDimitry Andricdef P10DV_Read : SchedRead;
16349cc55cSDimitry Andricdef P10DX_Read : SchedRead;
17349cc55cSDimitry Andricdef P10F2_Read : SchedRead;
18349cc55cSDimitry Andricdef P10FX_Read : SchedRead;
19349cc55cSDimitry Andricdef P10LD_Read : SchedRead;
20349cc55cSDimitry Andricdef P10MU_Read : SchedRead;
21349cc55cSDimitry Andricdef P10PM_Read : SchedRead;
22349cc55cSDimitry Andricdef P10ST_Read : SchedRead;
23349cc55cSDimitry Andricdef P10SX_Read : SchedRead;
24349cc55cSDimitry Andricdef P10vMU_Read : SchedRead;
25349cc55cSDimitry Andric
26349cc55cSDimitry Andricdef P10Model : SchedMachineModel {
27349cc55cSDimitry Andric  let IssueWidth = 8;
28349cc55cSDimitry Andric  let MicroOpBufferSize = 44;
29349cc55cSDimitry Andric  let LoopMicroOpBufferSize = 60;
30349cc55cSDimitry Andric  let CompleteModel = 1;
31349cc55cSDimitry Andric
32*5f757f3fSDimitry Andric  // Power 10 does not support instructions from SPE, Book E and HTM.
33*5f757f3fSDimitry Andric  let UnsupportedFeatures = [HasSPE, IsE500, IsBookE, IsISAFuture, HasHTM];
34349cc55cSDimitry Andric}
35349cc55cSDimitry Andric
36349cc55cSDimitry Andriclet SchedModel = P10Model in {
37349cc55cSDimitry Andric
38349cc55cSDimitry Andric  // ***************** Processor Resources *****************
39349cc55cSDimitry Andric
40349cc55cSDimitry Andric  // Pipeline Groups
41349cc55cSDimitry Andric
42349cc55cSDimitry Andric  def P10_BF : ProcResource<4>; // Four Binary Floating Point pipelines.
43349cc55cSDimitry Andric  def P10_BR : ProcResource<2>; // Two Branch pipelines.
44349cc55cSDimitry Andric  def P10_CY : ProcResource<4>; // Four Crypto pipelines.
45349cc55cSDimitry Andric  def P10_DF : ProcResource<1>; // One Decimal Floating Point pipelines.
46349cc55cSDimitry Andric  def P10_DV : ProcResource<2>; // Two Fixed-point divide (DIV) pipelines.
47349cc55cSDimitry Andric  def P10_DX : ProcResource<2>; // Two 128-bit fixed-point and BCD pipelines.
48349cc55cSDimitry Andric  def P10_FX : ProcResource<4>; // Four ALU pipelines.
49349cc55cSDimitry Andric  def P10_LD : ProcResource<2>; // Two Load pipelines.
50349cc55cSDimitry Andric  def P10_MM : ProcResource<2>; // Two 512-bit SIMD matrix multiply engine pipelines.
51349cc55cSDimitry Andric  def P10_PM : ProcResource<4>; // Four 128-bit permute (PM) pipelines.
52349cc55cSDimitry Andric  def P10_ST : ProcResource<2>; // Two ST-D pipelines.
53349cc55cSDimitry Andric  def P10_SX : ProcResource<2>; // Two Simple Fixed-point (SFX) pipelines.
54349cc55cSDimitry Andric
55349cc55cSDimitry Andric  // Dispatch Groups
56349cc55cSDimitry Andric
57349cc55cSDimitry Andric  // Dispatch to any slots
58349cc55cSDimitry Andric  def P10_ANY_SLOT : ProcResource<8>;
59349cc55cSDimitry Andric
60349cc55cSDimitry Andric  let Super = P10_ANY_SLOT in {
61349cc55cSDimitry Andric
62349cc55cSDimitry Andric    // Dispatch to even slots
63349cc55cSDimitry Andric    def P10_EVEN_SLOT : ProcResource<4>;
64349cc55cSDimitry Andric
65349cc55cSDimitry Andric    // Dispatch to odd slots
66349cc55cSDimitry Andric    def P10_ODD_SLOT : ProcResource<4>;
67349cc55cSDimitry Andric  }
68349cc55cSDimitry Andric
69349cc55cSDimitry Andric  // Dispatch Rules
70349cc55cSDimitry Andric  let NumMicroOps = 0, Latency = 1 in {
71349cc55cSDimitry Andric    // Dispatch Rule '-'
72349cc55cSDimitry Andric    def P10W_DISP_ANY : SchedWriteRes<[P10_ANY_SLOT]>;
73349cc55cSDimitry Andric
74349cc55cSDimitry Andric    // Dispatch Rule '-', even slot
75349cc55cSDimitry Andric    def P10W_DISP_EVEN : SchedWriteRes<[P10_EVEN_SLOT]>;
76349cc55cSDimitry Andric
77349cc55cSDimitry Andric    // Dispatch Rule 'P'
78349cc55cSDimitry Andric    def P10W_DISP_PAIR : SchedWriteRes<[P10_EVEN_SLOT, P10_ODD_SLOT]>;
79349cc55cSDimitry Andric  }
80349cc55cSDimitry Andric
81349cc55cSDimitry Andric  // ***************** SchedWriteRes Definitions *****************
82349cc55cSDimitry Andric
83349cc55cSDimitry Andric  // A BF pipeline may take from 7 to 36 cycles to complete.
84349cc55cSDimitry Andric  // Some BF operations may keep the pipeline busy for up to 10 cycles.
85349cc55cSDimitry Andric  def P10W_BF_7C : SchedWriteRes<[P10_BF]> {
86349cc55cSDimitry Andric    let Latency = 7;
87349cc55cSDimitry Andric  }
88349cc55cSDimitry Andric
89349cc55cSDimitry Andric  def P10W_BF_22C : SchedWriteRes<[P10_BF]> {
90*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 5 ];
91349cc55cSDimitry Andric    let Latency = 22;
92349cc55cSDimitry Andric  }
93349cc55cSDimitry Andric
94349cc55cSDimitry Andric  def P10W_BF_24C : SchedWriteRes<[P10_BF]> {
95*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 8 ];
96349cc55cSDimitry Andric    let Latency = 24;
97349cc55cSDimitry Andric  }
98349cc55cSDimitry Andric
99349cc55cSDimitry Andric  def P10W_BF_26C : SchedWriteRes<[P10_BF]> {
100*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 5 ];
101349cc55cSDimitry Andric    let Latency = 26;
102349cc55cSDimitry Andric  }
103349cc55cSDimitry Andric
104349cc55cSDimitry Andric  def P10W_BF_27C : SchedWriteRes<[P10_BF]> {
105*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 7 ];
106349cc55cSDimitry Andric    let Latency = 27;
107349cc55cSDimitry Andric  }
108349cc55cSDimitry Andric
109349cc55cSDimitry Andric  def P10W_BF_36C : SchedWriteRes<[P10_BF]> {
110*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 10 ];
111349cc55cSDimitry Andric    let Latency = 36;
112349cc55cSDimitry Andric  }
113349cc55cSDimitry Andric
114349cc55cSDimitry Andric  // A BR pipeline may take 2 cycles to complete.
115349cc55cSDimitry Andric  def P10W_BR_2C : SchedWriteRes<[P10_BR]> {
116349cc55cSDimitry Andric    let Latency = 2;
117349cc55cSDimitry Andric  }
118349cc55cSDimitry Andric
119349cc55cSDimitry Andric  // A CY pipeline may take 7 cycles to complete.
120349cc55cSDimitry Andric  def P10W_CY_7C : SchedWriteRes<[P10_CY]> {
121349cc55cSDimitry Andric    let Latency = 7;
122349cc55cSDimitry Andric  }
123349cc55cSDimitry Andric
124349cc55cSDimitry Andric  // A DF pipeline may take from 13 to 174 cycles to complete.
125349cc55cSDimitry Andric  // Some DF operations may keep the pipeline busy for up to 67 cycles.
126349cc55cSDimitry Andric  def P10W_DF_13C : SchedWriteRes<[P10_DF]> {
127349cc55cSDimitry Andric    let Latency = 13;
128349cc55cSDimitry Andric  }
129349cc55cSDimitry Andric
130349cc55cSDimitry Andric  def P10W_DF_24C : SchedWriteRes<[P10_DF]> {
131*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 16 ];
132349cc55cSDimitry Andric    let Latency = 24;
133349cc55cSDimitry Andric  }
134349cc55cSDimitry Andric
135349cc55cSDimitry Andric  def P10W_DF_25C : SchedWriteRes<[P10_DF]> {
136*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 17 ];
137349cc55cSDimitry Andric    let Latency = 25;
138349cc55cSDimitry Andric  }
139349cc55cSDimitry Andric
140349cc55cSDimitry Andric  def P10W_DF_26C : SchedWriteRes<[P10_DF]> {
141*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 18 ];
142349cc55cSDimitry Andric    let Latency = 26;
143349cc55cSDimitry Andric  }
144349cc55cSDimitry Andric
145349cc55cSDimitry Andric  def P10W_DF_32C : SchedWriteRes<[P10_DF]> {
146*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 22 ];
147349cc55cSDimitry Andric    let Latency = 32;
148349cc55cSDimitry Andric  }
149349cc55cSDimitry Andric
150349cc55cSDimitry Andric  def P10W_DF_33C : SchedWriteRes<[P10_DF]> {
151*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 25 ];
152349cc55cSDimitry Andric    let Latency = 33;
153349cc55cSDimitry Andric  }
154349cc55cSDimitry Andric
155349cc55cSDimitry Andric  def P10W_DF_34C : SchedWriteRes<[P10_DF]> {
156*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 25 ];
157349cc55cSDimitry Andric    let Latency = 34;
158349cc55cSDimitry Andric  }
159349cc55cSDimitry Andric
160349cc55cSDimitry Andric  def P10W_DF_38C : SchedWriteRes<[P10_DF]> {
161*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 30 ];
162349cc55cSDimitry Andric    let Latency = 38;
163349cc55cSDimitry Andric  }
164349cc55cSDimitry Andric
165349cc55cSDimitry Andric  def P10W_DF_40C : SchedWriteRes<[P10_DF]> {
166*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 17 ];
167349cc55cSDimitry Andric    let Latency = 40;
168349cc55cSDimitry Andric  }
169349cc55cSDimitry Andric
170349cc55cSDimitry Andric  def P10W_DF_43C : SchedWriteRes<[P10_DF]> {
171*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 34 ];
172349cc55cSDimitry Andric    let Latency = 43;
173349cc55cSDimitry Andric  }
174349cc55cSDimitry Andric
175349cc55cSDimitry Andric  def P10W_DF_59C : SchedWriteRes<[P10_DF]> {
176*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 49 ];
177349cc55cSDimitry Andric    let Latency = 59;
178349cc55cSDimitry Andric  }
179349cc55cSDimitry Andric
180349cc55cSDimitry Andric  def P10W_DF_61C : SchedWriteRes<[P10_DF]> {
181*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 12 ];
182349cc55cSDimitry Andric    let Latency = 61;
183349cc55cSDimitry Andric  }
184349cc55cSDimitry Andric
185349cc55cSDimitry Andric  def P10W_DF_68C : SchedWriteRes<[P10_DF]> {
186*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 15 ];
187349cc55cSDimitry Andric    let Latency = 68;
188349cc55cSDimitry Andric  }
189349cc55cSDimitry Andric
190349cc55cSDimitry Andric  def P10W_DF_77C : SchedWriteRes<[P10_DF]> {
191*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 67 ];
192349cc55cSDimitry Andric    let Latency = 77;
193349cc55cSDimitry Andric  }
194349cc55cSDimitry Andric
195349cc55cSDimitry Andric  def P10W_DF_87C : SchedWriteRes<[P10_DF]> {
196*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 12 ];
197349cc55cSDimitry Andric    let Latency = 87;
198349cc55cSDimitry Andric  }
199349cc55cSDimitry Andric
200349cc55cSDimitry Andric  def P10W_DF_100C : SchedWriteRes<[P10_DF]> {
201*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 32 ];
202349cc55cSDimitry Andric    let Latency = 100;
203349cc55cSDimitry Andric  }
204349cc55cSDimitry Andric
205349cc55cSDimitry Andric  def P10W_DF_174C : SchedWriteRes<[P10_DF]> {
206*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 33 ];
207349cc55cSDimitry Andric    let Latency = 174;
208349cc55cSDimitry Andric  }
209349cc55cSDimitry Andric
210349cc55cSDimitry Andric  // A DV pipeline may take from 20 to 83 cycles to complete.
211349cc55cSDimitry Andric  // Some DV operations may keep the pipeline busy for up to 33 cycles.
212349cc55cSDimitry Andric  def P10W_DV_20C : SchedWriteRes<[P10_DV]> {
213*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 10 ];
214349cc55cSDimitry Andric    let Latency = 20;
215349cc55cSDimitry Andric  }
216349cc55cSDimitry Andric
217349cc55cSDimitry Andric  def P10W_DV_25C : SchedWriteRes<[P10_DV]> {
218*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 10 ];
219349cc55cSDimitry Andric    let Latency = 25;
220349cc55cSDimitry Andric  }
221349cc55cSDimitry Andric
222349cc55cSDimitry Andric  def P10W_DV_27C : SchedWriteRes<[P10_DV]> {
223*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 10 ];
224349cc55cSDimitry Andric    let Latency = 27;
225349cc55cSDimitry Andric  }
226349cc55cSDimitry Andric
227349cc55cSDimitry Andric  def P10W_DV_41C : SchedWriteRes<[P10_DV]> {
228*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 10 ];
229349cc55cSDimitry Andric    let Latency = 41;
230349cc55cSDimitry Andric  }
231349cc55cSDimitry Andric
232349cc55cSDimitry Andric  def P10W_DV_43C : SchedWriteRes<[P10_DV]> {
233*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 21 ];
234349cc55cSDimitry Andric    let Latency = 43;
235349cc55cSDimitry Andric  }
236349cc55cSDimitry Andric
237349cc55cSDimitry Andric  def P10W_DV_47C : SchedWriteRes<[P10_DV]> {
238*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 21 ];
239349cc55cSDimitry Andric    let Latency = 47;
240349cc55cSDimitry Andric  }
241349cc55cSDimitry Andric
242349cc55cSDimitry Andric  def P10W_DV_54C : SchedWriteRes<[P10_DV]> {
243*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 33 ];
244349cc55cSDimitry Andric    let Latency = 54;
245349cc55cSDimitry Andric  }
246349cc55cSDimitry Andric
247349cc55cSDimitry Andric  def P10W_DV_60C : SchedWriteRes<[P10_DV]> {
248*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 33 ];
249349cc55cSDimitry Andric    let Latency = 60;
250349cc55cSDimitry Andric  }
251349cc55cSDimitry Andric
252349cc55cSDimitry Andric  def P10W_DV_75C : SchedWriteRes<[P10_DV]> {
253*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 21 ];
254349cc55cSDimitry Andric    let Latency = 75;
255349cc55cSDimitry Andric  }
256349cc55cSDimitry Andric
257349cc55cSDimitry Andric  def P10W_DV_83C : SchedWriteRes<[P10_DV]> {
258*5f757f3fSDimitry Andric    let ReleaseAtCycles = [ 33 ];
259349cc55cSDimitry Andric    let Latency = 83;
260349cc55cSDimitry Andric  }
261349cc55cSDimitry Andric
262349cc55cSDimitry Andric  // A DX pipeline may take 5 cycles to complete.
263349cc55cSDimitry Andric  def P10W_DX_5C : SchedWriteRes<[P10_DX]> {
264349cc55cSDimitry Andric    let Latency = 5;
265349cc55cSDimitry Andric  }
266349cc55cSDimitry Andric
267349cc55cSDimitry Andric  // A F2 pipeline may take 4 cycles to complete.
268349cc55cSDimitry Andric  def P10W_F2_4C : SchedWriteRes<[P10_FX]> {
269349cc55cSDimitry Andric    let Latency = 4;
270349cc55cSDimitry Andric  }
271349cc55cSDimitry Andric
272349cc55cSDimitry Andric  // A FX pipeline may take from 2 to 3 cycles to complete.
273349cc55cSDimitry Andric  def P10W_FX_2C : SchedWriteRes<[P10_FX]> {
274349cc55cSDimitry Andric    let Latency = 2;
275349cc55cSDimitry Andric  }
276349cc55cSDimitry Andric
277349cc55cSDimitry Andric  def P10W_FX_3C : SchedWriteRes<[P10_FX]> {
278349cc55cSDimitry Andric    let Latency = 3;
279349cc55cSDimitry Andric  }
280349cc55cSDimitry Andric
281349cc55cSDimitry Andric  // A LD pipeline may take 6 cycles to complete.
282349cc55cSDimitry Andric  def P10W_LD_6C : SchedWriteRes<[P10_LD]> {
283349cc55cSDimitry Andric    let Latency = 6;
284349cc55cSDimitry Andric  }
285349cc55cSDimitry Andric
286349cc55cSDimitry Andric  // A MF pipeline may take 13 cycles to complete.
287349cc55cSDimitry Andric  def P10W_MF_13C : SchedWriteRes<[P10_SX]> {
288349cc55cSDimitry Andric    let Latency = 13;
289349cc55cSDimitry Andric  }
290349cc55cSDimitry Andric
291349cc55cSDimitry Andric  // A MFL pipeline may take 13 cycles to complete.
292349cc55cSDimitry Andric  def P10W_MFL_13C : SchedWriteRes<[P10_SX]> {
293349cc55cSDimitry Andric    let Latency = 13;
294349cc55cSDimitry Andric  }
295349cc55cSDimitry Andric
296349cc55cSDimitry Andric  // A MM pipeline may take 10 cycles to complete.
297349cc55cSDimitry Andric  def P10W_MM_10C : SchedWriteRes<[P10_MM]> {
298349cc55cSDimitry Andric    let Latency = 10;
299349cc55cSDimitry Andric  }
300349cc55cSDimitry Andric
301349cc55cSDimitry Andric  // A MU pipeline may take 5 cycles to complete.
302349cc55cSDimitry Andric  def P10W_MU_5C : SchedWriteRes<[P10_BF]> {
303349cc55cSDimitry Andric    let Latency = 5;
304349cc55cSDimitry Andric  }
305349cc55cSDimitry Andric
306349cc55cSDimitry Andric  // A PM pipeline may take 4 cycles to complete.
307349cc55cSDimitry Andric  def P10W_PM_4C : SchedWriteRes<[P10_PM]> {
308349cc55cSDimitry Andric    let Latency = 4;
309349cc55cSDimitry Andric  }
310349cc55cSDimitry Andric
311349cc55cSDimitry Andric  // A ST pipeline may take 3 cycles to complete.
312349cc55cSDimitry Andric  def P10W_ST_3C : SchedWriteRes<[P10_ST]> {
313349cc55cSDimitry Andric    let Latency = 3;
314349cc55cSDimitry Andric  }
315349cc55cSDimitry Andric
316349cc55cSDimitry Andric  // A SX pipeline may take from 0 to 3 cycles to complete.
317349cc55cSDimitry Andric  def P10W_SX : SchedWriteRes<[P10_SX]> {
318349cc55cSDimitry Andric    let Latency = 0;
319349cc55cSDimitry Andric  }
320349cc55cSDimitry Andric
321349cc55cSDimitry Andric  def P10W_SX_3C : SchedWriteRes<[P10_SX]> {
322349cc55cSDimitry Andric    let Latency = 3;
323349cc55cSDimitry Andric  }
324349cc55cSDimitry Andric
325349cc55cSDimitry Andric  // A vMU pipeline may take 7 cycles to complete.
326349cc55cSDimitry Andric  def P10W_vMU_7C : SchedWriteRes<[P10_BF]> {
327349cc55cSDimitry Andric    let Latency = 7;
328349cc55cSDimitry Andric  }
329349cc55cSDimitry Andric
330349cc55cSDimitry Andric  // ***************** Read Advance Definitions *****************
331349cc55cSDimitry Andric
332349cc55cSDimitry Andric  // Modeling pipeline forwarding logic.
333349cc55cSDimitry Andric  def P10BF_Read_1C : SchedReadAdvance<1, [P10W_DX_5C, P10W_MU_5C, P10W_vMU_7C, P10W_CY_7C, P10W_DF_13C, P10W_MM_10C]>;
334349cc55cSDimitry Andric  def P10BF_Read_2C : SchedReadAdvance<2, [P10W_BF_7C]>;
335349cc55cSDimitry Andric  def P10BR_Read_1C : SchedReadAdvance<1, [P10W_FX_3C, P10W_F2_4C]>;
336349cc55cSDimitry Andric  def P10CY_Read_1C : SchedReadAdvance<1, [P10W_DX_5C, P10W_MU_5C, P10W_vMU_7C, P10W_BF_7C, P10W_DF_13C, P10W_MM_10C]>;
337349cc55cSDimitry Andric  def P10CY_Read_3C : SchedReadAdvance<3, [P10W_CY_7C]>;
338349cc55cSDimitry Andric  def P10DF_Read_1C : SchedReadAdvance<1, [P10W_DX_5C, P10W_MU_5C, P10W_vMU_7C, P10W_BF_7C, P10W_CY_7C, P10W_DF_13C, P10W_MM_10C]>;
339349cc55cSDimitry Andric  def P10DV_Read_1C : SchedReadAdvance<1, [P10W_DX_5C, P10W_MU_5C, P10W_vMU_7C, P10W_BF_7C, P10W_CY_7C, P10W_DF_13C, P10W_MM_10C]>;
340349cc55cSDimitry Andric  def P10DX_Read_1C : SchedReadAdvance<1, [P10W_DX_5C, P10W_MU_5C, P10W_vMU_7C, P10W_BF_7C, P10W_CY_7C, P10W_DF_13C, P10W_MM_10C]>;
341349cc55cSDimitry Andric  def P10F2_Read_1C : SchedReadAdvance<1, [P10W_ST_3C, P10W_SX_3C, P10W_FX_3C, P10W_F2_4C, P10W_PM_4C]>;
342349cc55cSDimitry Andric  def P10FX_Read_1C : SchedReadAdvance<1, [P10W_ST_3C, P10W_SX_3C, P10W_FX_3C, P10W_F2_4C, P10W_PM_4C]>;
343349cc55cSDimitry Andric  def P10LD_Read_1C : SchedReadAdvance<1, [P10W_ST_3C, P10W_SX_3C, P10W_FX_3C, P10W_F2_4C]>;
344349cc55cSDimitry Andric  def P10MM_Read_1C : SchedReadAdvance<1, [P10W_DX_5C, P10W_MU_5C, P10W_vMU_7C, P10W_BF_7C, P10W_CY_7C, P10W_DF_13C]>;
345349cc55cSDimitry Andric  def P10MM_Read_6C : SchedReadAdvance<6, [P10W_MM_10C]>;
346349cc55cSDimitry Andric  def P10MU_Read_1C : SchedReadAdvance<1, [P10W_DX_5C, P10W_MU_5C, P10W_DF_13C]>;
347349cc55cSDimitry Andric  def P10PM_Read_1C : SchedReadAdvance<1, [P10W_ST_3C, P10W_SX_3C, P10W_FX_3C, P10W_F2_4C, P10W_PM_4C]>;
348349cc55cSDimitry Andric  def P10ST_Read_1C : SchedReadAdvance<1, [P10W_ST_3C, P10W_SX_3C, P10W_FX_3C, P10W_F2_4C, P10W_PM_4C]>;
349349cc55cSDimitry Andric  def P10SX_Read_1C : SchedReadAdvance<1, [P10W_ST_3C, P10W_SX_3C, P10W_FX_3C, P10W_F2_4C, P10W_PM_4C, P10W_MM_10C]>;
350349cc55cSDimitry Andric  def P10vMU_Read_1C : SchedReadAdvance<1, [P10W_DX_5C, P10W_MU_5C, P10W_vMU_7C, P10W_BF_7C, P10W_CY_7C, P10W_DF_13C, P10W_MM_10C]>;
351349cc55cSDimitry Andric
352349cc55cSDimitry Andric  // Save 1 cycles if pipeline BF reads the data from pipelines DX, MU, vMU, CY, DF, MM.
353349cc55cSDimitry Andric  // Save 2 cycles if pipeline BF reads the data from pipelines BF.
354349cc55cSDimitry Andric  def P10BF_Read : SchedReadVariant<[
355349cc55cSDimitry Andric        SchedVar<P10W_BF_7C_Pred, [P10BF_Read_2C]>,
356349cc55cSDimitry Andric        SchedVar<NoSchedPred,     [P10BF_Read_1C]>
357349cc55cSDimitry Andric  ]>;
358349cc55cSDimitry Andric
359349cc55cSDimitry Andric  // Save 1 cycles if pipeline CY reads the data from pipelines DX, MU, vMU, BF, DF, MM.
360349cc55cSDimitry Andric  // Save 3 cycles if pipeline CY reads the data from pipelines CY.
361349cc55cSDimitry Andric  def P10CY_Read : SchedReadVariant<[
362349cc55cSDimitry Andric        SchedVar<P10W_CY_7C_Pred, [P10CY_Read_3C]>,
363349cc55cSDimitry Andric        SchedVar<NoSchedPred,     [P10CY_Read_1C]>
364349cc55cSDimitry Andric  ]>;
365349cc55cSDimitry Andric
366349cc55cSDimitry Andric  // Save 1 cycles if pipeline MM reads the data from pipelines DX, MU, vMU, BF, CY, DF.
367349cc55cSDimitry Andric  // Save 6 cycles if pipeline MM reads the data from pipelines MM.
368349cc55cSDimitry Andric  def P10MM_Read : SchedReadVariant<[
369349cc55cSDimitry Andric        SchedVar<P10W_MM_10C_Pred, [P10MM_Read_6C]>,
370349cc55cSDimitry Andric        SchedVar<NoSchedPred,     [P10MM_Read_1C]>
371349cc55cSDimitry Andric  ]>;
372349cc55cSDimitry Andric
373349cc55cSDimitry Andric  // Save 1 cycles if pipeline BR reads the data from pipelines FX, F2.
374349cc55cSDimitry Andric  def : SchedAlias<P10BR_Read, P10BR_Read_1C>;
375349cc55cSDimitry Andric
376349cc55cSDimitry Andric  // Save 1 cycles if pipeline DF reads the data from pipelines DX, MU, vMU, BF, CY, DF, MM.
377349cc55cSDimitry Andric  def : SchedAlias<P10DF_Read, P10DF_Read_1C>;
378349cc55cSDimitry Andric
379349cc55cSDimitry Andric  // Save 1 cycles if pipeline DV reads the data from pipelines DX, MU, vMU, BF, CY, DF, MM.
380349cc55cSDimitry Andric  def : SchedAlias<P10DV_Read, P10DV_Read_1C>;
381349cc55cSDimitry Andric
382349cc55cSDimitry Andric  // Save 1 cycles if pipeline DX reads the data from pipelines DX, MU, vMU, BF, CY, DF, MM.
383349cc55cSDimitry Andric  def : SchedAlias<P10DX_Read, P10DX_Read_1C>;
384349cc55cSDimitry Andric
385349cc55cSDimitry Andric  // Save 1 cycles if pipeline F2 reads the data from pipelines ST, SX, FX, F2, PM.
386349cc55cSDimitry Andric  def : SchedAlias<P10F2_Read, P10F2_Read_1C>;
387349cc55cSDimitry Andric
388349cc55cSDimitry Andric  // Save 1 cycles if pipeline FX reads the data from pipelines ST, SX, FX, F2, PM.
389349cc55cSDimitry Andric  def : SchedAlias<P10FX_Read, P10FX_Read_1C>;
390349cc55cSDimitry Andric
391349cc55cSDimitry Andric  // Save 1 cycles if pipeline LD reads the data from pipelines ST, SX, FX, F2.
392349cc55cSDimitry Andric  def : SchedAlias<P10LD_Read, P10LD_Read_1C>;
393349cc55cSDimitry Andric
394349cc55cSDimitry Andric  // Save 1 cycles if pipeline MU reads the data from pipelines DX, MU, DF.
395349cc55cSDimitry Andric  def : SchedAlias<P10MU_Read, P10MU_Read_1C>;
396349cc55cSDimitry Andric
397349cc55cSDimitry Andric  // Save 1 cycles if pipeline PM reads the data from pipelines ST, SX, FX, F2, PM.
398349cc55cSDimitry Andric  def : SchedAlias<P10PM_Read, P10PM_Read_1C>;
399349cc55cSDimitry Andric
400349cc55cSDimitry Andric  // Save 1 cycles if pipeline ST reads the data from pipelines ST, SX, FX, F2, PM.
401349cc55cSDimitry Andric  def : SchedAlias<P10ST_Read, P10ST_Read_1C>;
402349cc55cSDimitry Andric
403349cc55cSDimitry Andric  // Save 1 cycles if pipeline SX reads the data from pipelines ST, SX, FX, F2, PM, MM.
404349cc55cSDimitry Andric  def : SchedAlias<P10SX_Read, P10SX_Read_1C>;
405349cc55cSDimitry Andric
406349cc55cSDimitry Andric  // Save 1 cycles if pipeline vMU reads the data from pipelines DX, MU, vMU, BF, CY, DF, MM.
407349cc55cSDimitry Andric  def : SchedAlias<P10vMU_Read, P10vMU_Read_1C>;
408349cc55cSDimitry Andric
409349cc55cSDimitry Andric  include "P10InstrResources.td"
410349cc55cSDimitry Andric}
411