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