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