1//===-- PPCScheduleP8.td - PPC P8 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 POWER8 processor.
11//
12//===----------------------------------------------------------------------===//
13
14// Scheduling for the P8 involves tracking two types of resources:
15//  1. The dispatch bundle slots
16//  2. The functional unit resources
17
18// Dispatch units:
19def P8_DU1    : FuncUnit;
20def P8_DU2    : FuncUnit;
21def P8_DU3    : FuncUnit;
22def P8_DU4    : FuncUnit;
23def P8_DU5    : FuncUnit;
24def P8_DU6    : FuncUnit;
25def P8_DU7    : FuncUnit; // Only branch instructions will use DU7,DU8
26def P8_DU8    : FuncUnit;
27
28// 10 insns per cycle (2-LU, 2-LSU, 2-FXU, 2-FPU, 1-CRU, 1-BRU).
29
30def P8_LU1     : FuncUnit; // Loads or fixed-point operations 1
31def P8_LU2     : FuncUnit; // Loads or fixed-point operations 2
32
33// Load/Store pipelines can handle Stores, fixed-point loads, and simple
34// fixed-point operations.
35def P8_LSU1    : FuncUnit; // Load/Store pipeline 1
36def P8_LSU2    : FuncUnit; // Load/Store pipeline 2
37
38// Fixed Point unit
39def P8_FXU1    : FuncUnit; // FX pipeline 1
40def P8_FXU2    : FuncUnit; // FX pipeline 2
41
42// The Floating-Point Unit (FPU) and Vector Media Extension (VMX) units
43// are combined on P7 and newer into a Vector Scalar Unit (VSU).
44// The P8 Instruction latency documents still refers to the unit as the
45// FPU, so keep in mind that FPU==VSU.
46// In contrast to the P7, the VMX units on P8 are symmetric, so no need to
47// split vector integer ops or 128-bit load/store/perms to the specific units.
48def P8_FPU1    : FuncUnit; // VS pipeline 1
49def P8_FPU2    : FuncUnit; // VS pipeline 2
50
51def P8_CRU    : FuncUnit; // CR unit (CR logicals and move-from-SPRs)
52def P8_BRU    : FuncUnit; // BR unit
53
54def P8Itineraries : ProcessorItineraries<
55  [P8_DU1, P8_DU2, P8_DU3, P8_DU4, P8_DU5, P8_DU6, P8_DU7, P8_DU8,
56   P8_LU1, P8_LU2, P8_LSU1, P8_LSU2, P8_FXU1, P8_FXU2,
57   P8_FPU1, P8_FPU2, P8_CRU, P8_BRU], [], [
58  InstrItinData<IIC_IntSimple   , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
59                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
60                                   InstrStage<1, [P8_FXU1, P8_FXU2,
61                                                  P8_LU1, P8_LU2,
62                                                  P8_LSU1, P8_LSU2]>],
63                                  [1, 1, 1]>,
64  InstrItinData<IIC_IntGeneral  , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
65                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
66                                   InstrStage<1, [P8_FXU1, P8_FXU2, P8_LU1,
67                                                  P8_LU2, P8_LSU1, P8_LSU2]>],
68                                  [1, 1, 1]>,
69  InstrItinData<IIC_IntISEL,      [InstrStage<1, [P8_DU1], 0>,
70                                   InstrStage<1, [P8_FXU1, P8_FXU2], 0>,
71                                   InstrStage<1, [P8_BRU]>],
72                                  [1, 1, 1, 1]>,
73  InstrItinData<IIC_IntCompare  , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
74                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
75                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
76                                  [1, 1, 1]>,
77  InstrItinData<IIC_IntDivW     , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
78                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
79                                   InstrStage<15, [P8_FXU1, P8_FXU2]>],
80                                  [15, 1, 1]>,
81  InstrItinData<IIC_IntDivD     , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
82                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
83                                   InstrStage<23, [P8_FXU1, P8_FXU2]>],
84                                  [23, 1, 1]>,
85  InstrItinData<IIC_IntMulHW    , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
86                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
87                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
88                                  [4, 1, 1]>,
89  InstrItinData<IIC_IntMulHWU   , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
90                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
91                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
92                                  [4, 1, 1]>,
93  InstrItinData<IIC_IntMulHD    , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
94                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
95                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
96                                  [4, 1, 1]>,
97  InstrItinData<IIC_IntMulLI    , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
98                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
99                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
100                                  [4, 1, 1]>,
101  InstrItinData<IIC_IntRotate   , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
102                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
103                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
104                                   [1, 1, 1]>,
105  InstrItinData<IIC_IntRotateD  , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
106                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
107                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
108                                   [1, 1, 1]>,
109  InstrItinData<IIC_IntRotateDI , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
110                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
111                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
112                                   [1, 1, 1]>,
113  InstrItinData<IIC_IntShift    , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
114                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
115                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
116                                  [1, 1, 1]>,
117  InstrItinData<IIC_IntTrapW    , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
118                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
119                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
120                                  [1, 1]>,
121  InstrItinData<IIC_IntTrapD    , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
122                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
123                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
124                                  [1, 1]>,
125  InstrItinData<IIC_BrB         , [InstrStage<1, [P8_DU7, P8_DU8], 0>,
126                                   InstrStage<1, [P8_BRU]>],
127                                  [3, 1, 1]>,
128  // FIXME - the Br* groups below are not branch related, so should probably
129  // be renamed.
130  // IIC_BrCR consists of the cr* instructions.  (crand,crnor,creqv, etc).
131  // and should be 'First' in dispatch.
132  InstrItinData<IIC_BrCR        , [InstrStage<1, [P8_DU1], 0>,
133                                   InstrStage<1, [P8_CRU]>],
134                                  [3, 1, 1]>,
135  // IIC_BrMCR consists of the mcrf instruction.
136  InstrItinData<IIC_BrMCR       , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
137                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
138                                   InstrStage<1, [P8_CRU]>],
139                                  [3, 1, 1]>,
140  // IIC_BrMCRX consists of mcrxr (obsolete instruction) and mtcrf, which
141  // should be first in the dispatch group.
142  InstrItinData<IIC_BrMCRX      , [InstrStage<1, [P8_DU1], 0>,
143                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
144                                  [3, 1, 1]>,
145  InstrItinData<IIC_BrMCRX      , [InstrStage<1, [P8_DU1], 0>,
146                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
147                                  [3, 1]>,
148  InstrItinData<IIC_LdStLoad    , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
149                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
150                                   InstrStage<1, [P8_LSU1, P8_LSU2,
151                                                  P8_LU1, P8_LU2]>],
152                                  [2, 1, 1]>,
153  InstrItinData<IIC_LdStLoadUpd , [InstrStage<1, [P8_DU1], 0>,
154                                   InstrStage<1, [P8_DU2], 0>,
155                                   InstrStage<1, [P8_LSU1, P8_LSU2,
156                                                  P8_LU1, P8_LU2 ], 0>,
157                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
158                                  [2, 2, 1, 1]>,
159  // Update-Indexed form loads/stores are no longer first and last in the
160  // dispatch group.  They are simply cracked, so require DU1,DU2.
161  InstrItinData<IIC_LdStLoadUpdX, [InstrStage<1, [P8_DU1], 0>,
162                                   InstrStage<1, [P8_DU2], 0>,
163                                   InstrStage<1, [P8_LSU1, P8_LSU2,
164                                                  P8_LU1, P8_LU2], 0>,
165                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
166                                  [3, 3, 1, 1]>,
167  InstrItinData<IIC_LdStLD      , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
168                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
169                                   InstrStage<1, [P8_LSU1, P8_LSU2,
170                                                  P8_LU1, P8_LU2]>],
171                                  [2, 1, 1]>,
172  InstrItinData<IIC_LdStLDU     , [InstrStage<1, [P8_DU1], 0>,
173                                   InstrStage<1, [P8_DU2], 0>,
174                                   InstrStage<1, [P8_LSU1, P8_LSU2,
175                                                  P8_LU1, P8_LU2], 0>,
176                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
177                                  [2, 2, 1, 1]>,
178  InstrItinData<IIC_LdStLDUX    , [InstrStage<1, [P8_DU1], 0>,
179                                   InstrStage<1, [P8_DU2], 0>,
180                                   InstrStage<1, [P8_LSU1, P8_LSU2,
181                                                  P8_LU1, P8_LU2], 0>,
182                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
183                                  [3, 3, 1, 1]>,
184  InstrItinData<IIC_LdStLFD     , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
185                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
186                                   InstrStage<1, [P8_LU1, P8_LU2]>],
187                                  [3, 1, 1]>,
188  InstrItinData<IIC_LdStLVecX   , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
189                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
190                                   InstrStage<1, [P8_LU1, P8_LU2]>],
191                                  [3, 1, 1]>,
192  InstrItinData<IIC_LdStLFDU    , [InstrStage<1, [P8_DU1], 0>,
193                                   InstrStage<1, [P8_DU2], 0>,
194                                   InstrStage<1, [P8_LU1, P8_LU2], 0>,
195                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
196                                  [3, 3, 1, 1]>,
197  InstrItinData<IIC_LdStLFDUX   , [InstrStage<1, [P8_DU1], 0>,
198                                   InstrStage<1, [P8_DU2], 0>,
199                                   InstrStage<1, [P8_LU1, P8_LU2], 0>,
200                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
201                                  [3, 3, 1, 1]>,
202  InstrItinData<IIC_LdStLHA     , [InstrStage<1, [P8_DU1], 0>,
203                                   InstrStage<1, [P8_DU2], 0>,
204                                   InstrStage<1, [P8_LSU1, P8_LSU2,
205                                                  P8_LU1, P8_LU2], 0>,
206                                   InstrStage<1, [P8_FXU1, P8_FXU2,
207                                                  P8_LU1, P8_LU2]>],
208                                  [3, 1, 1]>,
209  InstrItinData<IIC_LdStLHAU    , [InstrStage<1, [P8_DU1], 0>,
210                                   InstrStage<1, [P8_DU2], 0>,
211                                   InstrStage<1, [P8_LSU1, P8_LSU2,
212                                                  P8_LU1, P8_LU2], 0>,
213                                   InstrStage<1, [P8_FXU1, P8_FXU2]>,
214                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
215                                  [4, 4, 1, 1]>,
216  // first+last in dispatch group.
217  InstrItinData<IIC_LdStLHAUX   , [InstrStage<1, [P8_DU1], 0>,
218                                   InstrStage<1, [P8_DU2], 0>,
219                                   InstrStage<1, [P8_DU3], 0>,
220                                   InstrStage<1, [P8_DU4], 0>,
221                                   InstrStage<1, [P8_DU5], 0>,
222                                   InstrStage<1, [P8_DU6], 0>,
223                                   InstrStage<1, [P8_LSU1, P8_LSU2,
224                                                  P8_LU1, P8_LU2], 0>,
225                                   InstrStage<1, [P8_FXU1, P8_FXU2]>,
226                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
227                                  [4, 4, 1, 1]>,
228  InstrItinData<IIC_LdStLWA     , [InstrStage<1, [P8_DU1], 0>,
229                                   InstrStage<1, [P8_DU2], 0>,
230                                   InstrStage<1, [P8_LSU1, P8_LSU2,
231                                                  P8_LU1, P8_LU2]>,
232                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
233                                  [3, 1, 1]>,
234  InstrItinData<IIC_LdStLWARX,    [InstrStage<1, [P8_DU1], 0>,
235                                   InstrStage<1, [P8_DU2], 0>,
236                                   InstrStage<1, [P8_DU3], 0>,
237                                   InstrStage<1, [P8_DU4], 0>,
238                                   InstrStage<1, [P8_LSU1, P8_LSU2,
239                                                  P8_LU1, P8_LU2]>],
240                                  [3, 1, 1]>,
241  // first+last
242  InstrItinData<IIC_LdStLDARX,    [InstrStage<1, [P8_DU1], 0>,
243                                   InstrStage<1, [P8_DU2], 0>,
244                                   InstrStage<1, [P8_DU3], 0>,
245                                   InstrStage<1, [P8_DU4], 0>,
246                                   InstrStage<1, [P8_DU5], 0>,
247                                   InstrStage<1, [P8_DU6], 0>,
248                                   InstrStage<1, [P8_LSU1, P8_LSU2,
249                                                  P8_LU1, P8_LU2]>],
250                                  [3, 1, 1]>,
251  InstrItinData<IIC_LdStLMW     , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
252                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
253                                   InstrStage<1, [P8_LSU1, P8_LSU2,
254                                                  P8_LU1, P8_LU2]>],
255                                  [2, 1, 1]>,
256// Stores are dual-issued from the issue queue, so may only take up one
257// dispatch slot.  The instruction will be broken into two IOPS. The agen
258// op is issued to the LSU, and the data op (register fetch) is issued
259// to either the LU (GPR store) or the VSU (FPR store).
260  InstrItinData<IIC_LdStStore   , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
261                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
262                                   InstrStage<1, [P8_LSU1, P8_LSU2]>,
263                                   InstrStage<1, [P8_LU1, P8_LU2]>],
264                                  [1, 1, 1]>,
265  InstrItinData<IIC_LdStSTD     , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
266                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
267                                   InstrStage<1, [P8_LU1, P8_LU2,
268                                                  P8_LSU1, P8_LSU2]>]
269                                  [1, 1, 1]>,
270  InstrItinData<IIC_LdStSTDU    , [InstrStage<1, [P8_DU1], 0>,
271                                   InstrStage<1, [P8_DU2], 0>,
272                                   InstrStage<1, [P8_LU1, P8_LU2,
273                                                  P8_LSU1, P8_LSU2], 0>,
274                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
275                                  [2, 1, 1, 1]>,
276  // First+last
277  InstrItinData<IIC_LdStSTDUX   , [InstrStage<1, [P8_DU1], 0>,
278                                   InstrStage<1, [P8_DU2], 0>,
279                                   InstrStage<1, [P8_DU3], 0>,
280                                   InstrStage<1, [P8_DU4], 0>,
281                                   InstrStage<1, [P8_DU5], 0>,
282                                   InstrStage<1, [P8_DU6], 0>,
283                                   InstrStage<1, [P8_LSU1, P8_LSU2], 0>,
284                                   InstrStage<1, [P8_FXU1, P8_FXU2]>,
285                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
286                                  [2, 1, 1, 1]>,
287  InstrItinData<IIC_LdStSTFD    , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
288                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
289                                   InstrStage<1, [P8_LSU1, P8_LSU2], 0>,
290                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
291                                  [1, 1, 1]>,
292  InstrItinData<IIC_LdStSTFDU   , [InstrStage<1, [P8_DU1], 0>,
293                                   InstrStage<1, [P8_DU2], 0>,
294                                   InstrStage<1, [P8_LSU1, P8_LSU2], 0>,
295                                   InstrStage<1, [P8_FXU1, P8_FXU2], 0>,
296                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
297                                  [2, 1, 1, 1]>,
298  InstrItinData<IIC_LdStSTVEBX  , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
299                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
300                                   InstrStage<1, [P8_LSU1, P8_LSU2], 0>,
301                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
302                                  [1, 1, 1]>,
303  InstrItinData<IIC_LdStSTDCX   , [InstrStage<1, [P8_DU1], 0>,
304                                   InstrStage<1, [P8_DU2], 0>,
305                                   InstrStage<1, [P8_DU3], 0>,
306                                   InstrStage<1, [P8_DU4], 0>,
307                                   InstrStage<1, [P8_DU5], 0>,
308                                   InstrStage<1, [P8_DU6], 0>,
309                                   InstrStage<1, [P8_LSU1, P8_LSU2], 0>,
310                                   InstrStage<1, [P8_LU1, P8_LU2]>],
311                                  [1, 1, 1]>,
312  InstrItinData<IIC_LdStSTWCX   , [InstrStage<1, [P8_DU1], 0>,
313                                   InstrStage<1, [P8_DU2], 0>,
314                                   InstrStage<1, [P8_DU3], 0>,
315                                   InstrStage<1, [P8_DU4], 0>,
316                                   InstrStage<1, [P8_DU5], 0>,
317                                   InstrStage<1, [P8_DU6], 0>,
318                                   InstrStage<1, [P8_LSU1, P8_LSU2], 0>,
319                                   InstrStage<1, [P8_LU1, P8_LU2]>],
320                                  [1, 1, 1]>,
321  InstrItinData<IIC_SprMFCR     , [InstrStage<1, [P8_DU1], 0>,
322                                   InstrStage<1, [P8_CRU]>],
323                                  [6, 1]>,
324  InstrItinData<IIC_SprMFCRF    , [InstrStage<1, [P8_DU1], 0>,
325                                   InstrStage<1, [P8_CRU]>],
326                                  [3, 1]>,
327  InstrItinData<IIC_SprMTSPR    , [InstrStage<1, [P8_DU1], 0>,
328                                   InstrStage<1, [P8_FXU1, P8_FXU2]>],
329                                  [4, 1]>, // mtctr
330  InstrItinData<IIC_FPGeneral   , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
331                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
332                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
333                                  [5, 1, 1]>,
334  InstrItinData<IIC_FPAddSub    , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
335                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
336                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
337                                  [5, 1, 1]>,
338  InstrItinData<IIC_FPCompare   , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
339                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
340                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
341                                  [8, 1, 1]>,
342  InstrItinData<IIC_FPDivD      , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
343                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
344                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
345                                  [33, 1, 1]>,
346  InstrItinData<IIC_FPDivS      , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
347                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
348                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
349                                  [27, 1, 1]>,
350  InstrItinData<IIC_FPSqrtD     , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
351                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
352                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
353                                  [44, 1, 1]>,
354  InstrItinData<IIC_FPSqrtS     , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
355                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
356                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
357                                  [32, 1, 1]>,
358  InstrItinData<IIC_FPFused     , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
359                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
360                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
361                                  [5, 1, 1, 1]>,
362  InstrItinData<IIC_FPRes       , [InstrStage<1, [P8_DU1, P8_DU2, P8_DU3,
363                                                  P8_DU4, P8_DU5, P8_DU6], 0>,
364                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
365                                  [5, 1, 1]>,
366  InstrItinData<IIC_VecGeneral  , [InstrStage<1, [P8_DU1], 0>,
367                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
368                                  [2, 1, 1]>,
369  InstrItinData<IIC_VecVSL      , [InstrStage<1, [P8_DU1], 0>,
370                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
371                                  [2, 1, 1]>,
372  InstrItinData<IIC_VecVSR      , [InstrStage<1, [P8_DU1], 0>,
373                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
374                                  [2, 1, 1]>,
375  InstrItinData<IIC_VecFP       , [InstrStage<1, [P8_DU1], 0>,
376                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
377                                  [6, 1, 1]>,
378  InstrItinData<IIC_VecFPCompare, [InstrStage<1, [P8_DU1], 0>,
379                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
380                                  [6, 1, 1]>,
381  InstrItinData<IIC_VecFPRound  , [InstrStage<1, [P8_DU1], 0>,
382                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
383                                  [6, 1, 1]>,
384  InstrItinData<IIC_VecComplex  , [InstrStage<1, [P8_DU1], 0>,
385                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
386                                  [7, 1, 1]>,
387  InstrItinData<IIC_VecPerm     , [InstrStage<1, [P8_DU1, P8_DU2], 0>,
388                                   InstrStage<1, [P8_FPU1, P8_FPU2]>],
389                                  [3, 1, 1]>
390]>;
391
392// ===---------------------------------------------------------------------===//
393// P8 machine model for scheduling and other instruction cost heuristics.
394// P8 has an 8 insn dispatch group (6 non-branch, 2 branch) and can issue up
395// to 10 insns per cycle (2-LU, 2-LSU, 2-FXU, 2-FPU, 1-CRU, 1-BRU).
396
397def P8Model : SchedMachineModel {
398  let IssueWidth = 8;  // up to 8 instructions dispatched per cycle.
399                       // up to six non-branch instructions.
400                       // up to two branches in a dispatch group.
401
402  let LoadLatency = 3; // Optimistic load latency assuming bypass.
403                       // This is overriden by OperandCycles if the
404                       // Itineraries are queried instead.
405  let MispredictPenalty = 16;
406
407  // Try to make sure we have at least 10 dispatch groups in a loop.
408  let LoopMicroOpBufferSize = 60;
409
410  let CompleteModel = 0;
411
412  let Itineraries = P8Itineraries;
413}
414
415