xref: /aosp_15_r20/external/llvm/lib/Target/X86/X86ScheduleBtVer2.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//=- X86ScheduleBtVer2.td - X86 BtVer2 (Jaguar) Scheduling ---*- 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 machine model for AMD btver2 (Jaguar) to support
11*9880d681SAndroid Build Coastguard Worker// instruction scheduling and other instruction cost heuristics. Based off AMD Software
12*9880d681SAndroid Build Coastguard Worker// Optimization Guide for AMD Family 16h Processors & Instruction Latency appendix.
13*9880d681SAndroid Build Coastguard Worker//
14*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdef BtVer2Model : SchedMachineModel {
17*9880d681SAndroid Build Coastguard Worker  // All x86 instructions are modeled as a single micro-op, and btver2 can
18*9880d681SAndroid Build Coastguard Worker  // decode 2 instructions per cycle.
19*9880d681SAndroid Build Coastguard Worker  let IssueWidth = 2;
20*9880d681SAndroid Build Coastguard Worker  let MicroOpBufferSize = 64; // Retire Control Unit
21*9880d681SAndroid Build Coastguard Worker  let LoadLatency = 5; // FPU latency (worse case cf Integer 3 cycle latency)
22*9880d681SAndroid Build Coastguard Worker  let HighLatency = 25;
23*9880d681SAndroid Build Coastguard Worker  let MispredictPenalty = 14; // Minimum branch misdirection penalty
24*9880d681SAndroid Build Coastguard Worker  let PostRAScheduler = 1;
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker  // FIXME: SSE4/AVX is unimplemented. This flag is set to allow
27*9880d681SAndroid Build Coastguard Worker  // the scheduler to assign a default model to unrecognized opcodes.
28*9880d681SAndroid Build Coastguard Worker  let CompleteModel = 0;
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerlet SchedModel = BtVer2Model in {
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker// Jaguar can issue up to 6 micro-ops in one cycle
34*9880d681SAndroid Build Coastguard Workerdef JALU0 : ProcResource<1>; // Integer Pipe0: integer ALU0 (also handle FP->INT jam)
35*9880d681SAndroid Build Coastguard Workerdef JALU1 : ProcResource<1>; // Integer Pipe1: integer ALU1/MUL/DIV
36*9880d681SAndroid Build Coastguard Workerdef JLAGU : ProcResource<1>; // Integer Pipe2: LAGU
37*9880d681SAndroid Build Coastguard Workerdef JSAGU : ProcResource<1>; // Integer Pipe3: SAGU (also handles 3-operand LEA)
38*9880d681SAndroid Build Coastguard Workerdef JFPU0 : ProcResource<1>; // Vector/FPU Pipe0: VALU0/VIMUL/FPA
39*9880d681SAndroid Build Coastguard Workerdef JFPU1 : ProcResource<1>; // Vector/FPU Pipe1: VALU1/STC/FPM
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker// Any pipe - FIXME we need this until we can discriminate between int/fpu load/store/moves properly
42*9880d681SAndroid Build Coastguard Workerdef JAny : ProcResGroup<[JALU0, JALU1, JLAGU, JSAGU, JFPU0, JFPU1]>;
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker// Integer Pipe Scheduler
45*9880d681SAndroid Build Coastguard Workerdef JALU01 : ProcResGroup<[JALU0, JALU1]> {
46*9880d681SAndroid Build Coastguard Worker  let BufferSize=20;
47*9880d681SAndroid Build Coastguard Worker}
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker// AGU Pipe Scheduler
50*9880d681SAndroid Build Coastguard Workerdef JLSAGU : ProcResGroup<[JLAGU, JSAGU]> {
51*9880d681SAndroid Build Coastguard Worker  let BufferSize=12;
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker// Fpu Pipe Scheduler
55*9880d681SAndroid Build Coastguard Workerdef JFPU01 : ProcResGroup<[JFPU0, JFPU1]> {
56*9880d681SAndroid Build Coastguard Worker  let BufferSize=18;
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdef JDiv    : ProcResource<1>; // integer division
60*9880d681SAndroid Build Coastguard Workerdef JMul    : ProcResource<1>; // integer multiplication
61*9880d681SAndroid Build Coastguard Workerdef JVALU0  : ProcResource<1>; // vector integer
62*9880d681SAndroid Build Coastguard Workerdef JVALU1  : ProcResource<1>; // vector integer
63*9880d681SAndroid Build Coastguard Workerdef JVIMUL  : ProcResource<1>; // vector integer multiplication
64*9880d681SAndroid Build Coastguard Workerdef JSTC    : ProcResource<1>; // vector store/convert
65*9880d681SAndroid Build Coastguard Workerdef JFPM    : ProcResource<1>; // FP multiplication
66*9880d681SAndroid Build Coastguard Workerdef JFPA    : ProcResource<1>; // FP addition
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker// Integer loads are 3 cycles, so ReadAfterLd registers needn't be available until 3
69*9880d681SAndroid Build Coastguard Worker// cycles after the memory operand.
70*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadAfterLd, 3>;
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker// Many SchedWrites are defined in pairs with and without a folded load.
73*9880d681SAndroid Build Coastguard Worker// Instructions with folded loads are usually micro-fused, so they only appear
74*9880d681SAndroid Build Coastguard Worker// as two micro-ops when dispatched by the schedulers.
75*9880d681SAndroid Build Coastguard Worker// This multiclass defines the resource usage for variants with and without
76*9880d681SAndroid Build Coastguard Worker// folded loads.
77*9880d681SAndroid Build Coastguard Workermulticlass JWriteResIntPair<X86FoldableSchedWrite SchedRW,
78*9880d681SAndroid Build Coastguard Worker                          ProcResourceKind ExePort,
79*9880d681SAndroid Build Coastguard Worker                          int Lat> {
80*9880d681SAndroid Build Coastguard Worker  // Register variant is using a single cycle on ExePort.
81*9880d681SAndroid Build Coastguard Worker  def : WriteRes<SchedRW, [ExePort]> { let Latency = Lat; }
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker  // Memory variant also uses a cycle on JLAGU and adds 3 cycles to the
84*9880d681SAndroid Build Coastguard Worker  // latency.
85*9880d681SAndroid Build Coastguard Worker  def : WriteRes<SchedRW.Folded, [JLAGU, ExePort]> {
86*9880d681SAndroid Build Coastguard Worker     let Latency = !add(Lat, 3);
87*9880d681SAndroid Build Coastguard Worker  }
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workermulticlass JWriteResFpuPair<X86FoldableSchedWrite SchedRW,
91*9880d681SAndroid Build Coastguard Worker                          ProcResourceKind ExePort,
92*9880d681SAndroid Build Coastguard Worker                          int Lat> {
93*9880d681SAndroid Build Coastguard Worker  // Register variant is using a single cycle on ExePort.
94*9880d681SAndroid Build Coastguard Worker  def : WriteRes<SchedRW, [ExePort]> { let Latency = Lat; }
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker  // Memory variant also uses a cycle on JLAGU and adds 5 cycles to the
97*9880d681SAndroid Build Coastguard Worker  // latency.
98*9880d681SAndroid Build Coastguard Worker  def : WriteRes<SchedRW.Folded, [JLAGU, ExePort]> {
99*9880d681SAndroid Build Coastguard Worker     let Latency = !add(Lat, 5);
100*9880d681SAndroid Build Coastguard Worker  }
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker// A folded store needs a cycle on the SAGU for the store data.
104*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteRMW, [JSAGU]>;
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
107*9880d681SAndroid Build Coastguard Worker// Arithmetic.
108*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerdefm : JWriteResIntPair<WriteALU,   JALU01, 1>;
111*9880d681SAndroid Build Coastguard Workerdefm : JWriteResIntPair<WriteIMul,  JALU1,  3>;
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerdef  : WriteRes<WriteIMulH, [JALU1]> {
114*9880d681SAndroid Build Coastguard Worker  let Latency = 6;
115*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [4];
116*9880d681SAndroid Build Coastguard Worker}
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker// FIXME 8/16 bit divisions
119*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIDiv, [JALU1, JDiv]> {
120*9880d681SAndroid Build Coastguard Worker  let Latency = 25;
121*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 25];
122*9880d681SAndroid Build Coastguard Worker}
123*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIDivLd, [JALU1, JLAGU, JDiv]> {
124*9880d681SAndroid Build Coastguard Worker  let Latency = 41;
125*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 1, 25];
126*9880d681SAndroid Build Coastguard Worker}
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker// This is for simple LEAs with one or two input operands.
129*9880d681SAndroid Build Coastguard Worker// FIXME: SAGU 3-operand LEA
130*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLEA, [JALU01]>;
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
133*9880d681SAndroid Build Coastguard Worker// Integer shifts and rotates.
134*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workerdefm : JWriteResIntPair<WriteShift, JALU01, 1>;
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
139*9880d681SAndroid Build Coastguard Worker// Loads, stores, and moves, not folded with other operations.
140*9880d681SAndroid Build Coastguard Worker// FIXME: Split x86 and SSE load/store/moves
141*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLoad,  [JLAGU]> { let Latency = 5; }
144*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteStore, [JSAGU]>;
145*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteMove,  [JAny]>;
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
148*9880d681SAndroid Build Coastguard Worker// Idioms that clear a register, like xorps %xmm0, %xmm0.
149*9880d681SAndroid Build Coastguard Worker// These can often bypass execution ports completely.
150*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteZero,  []>;
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
155*9880d681SAndroid Build Coastguard Worker// Branches don't produce values, so they have no latency, but they still
156*9880d681SAndroid Build Coastguard Worker// consume resources. Indirect branches can fold loads.
157*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Workerdefm : JWriteResIntPair<WriteJump,  JALU01, 1>;
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
162*9880d681SAndroid Build Coastguard Worker// Floating point. This covers both scalar and vector operations.
163*9880d681SAndroid Build Coastguard Worker// FIXME: should we bother splitting JFPU pipe + unit stages for fast instructions?
164*9880d681SAndroid Build Coastguard Worker// FIXME: Double precision latencies
165*9880d681SAndroid Build Coastguard Worker// FIXME: SS vs PS latencies
166*9880d681SAndroid Build Coastguard Worker// FIXME: ymm latencies
167*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteFAdd,        JFPU0,  3>;
170*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteFMul,        JFPU1,  2>;
171*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteFRcp,        JFPU1,  2>;
172*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteFRsqrt,      JFPU1,  2>;
173*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteFShuffle,   JFPU01,  1>;
174*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteFBlend,     JFPU01,  1>;
175*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteFShuffle256, JFPU01, 1>;
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFSqrt, [JFPU1, JLAGU, JFPM]> {
178*9880d681SAndroid Build Coastguard Worker  let Latency = 21;
179*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 1, 21];
180*9880d681SAndroid Build Coastguard Worker}
181*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFSqrtLd, [JFPU1, JLAGU, JFPM]> {
182*9880d681SAndroid Build Coastguard Worker  let Latency = 26;
183*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 1, 21];
184*9880d681SAndroid Build Coastguard Worker}
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFDiv, [JFPU1, JLAGU, JFPM]> {
187*9880d681SAndroid Build Coastguard Worker  let Latency = 19;
188*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 1, 19];
189*9880d681SAndroid Build Coastguard Worker}
190*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFDivLd, [JFPU1, JLAGU, JFPM]> {
191*9880d681SAndroid Build Coastguard Worker  let Latency = 24;
192*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 1, 19];
193*9880d681SAndroid Build Coastguard Worker}
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Worker// FIXME: integer pipes
196*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteCvtF2I,    JFPU1,  3>; // Float -> Integer.
197*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteCvtI2F,    JFPU1,  3>; // Integer -> Float.
198*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteCvtF2F,    JFPU1,  3>; // Float -> Float size conversion.
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFVarBlend, [JFPU01]> {
201*9880d681SAndroid Build Coastguard Worker  let Latency = 2;
202*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [2];
203*9880d681SAndroid Build Coastguard Worker}
204*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFVarBlendLd, [JLAGU, JFPU01]> {
205*9880d681SAndroid Build Coastguard Worker  let Latency = 7;
206*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 2];
207*9880d681SAndroid Build Coastguard Worker}
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Worker// Vector integer operations.
210*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteVecALU,   JFPU01,  1>;
211*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteVecShift, JFPU01,  1>;
212*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteVecIMul,  JFPU0,   2>;
213*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteShuffle,  JFPU01,  1>;
214*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteBlend,    JFPU01,  1>;
215*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteVecLogic, JFPU01,  1>;
216*9880d681SAndroid Build Coastguard Workerdefm : JWriteResFpuPair<WriteShuffle256, JFPU01, 1>;
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVarBlend, [JFPU01]> {
219*9880d681SAndroid Build Coastguard Worker  let Latency = 2;
220*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [2];
221*9880d681SAndroid Build Coastguard Worker}
222*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVarBlendLd, [JLAGU, JFPU01]> {
223*9880d681SAndroid Build Coastguard Worker  let Latency = 7;
224*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 2];
225*9880d681SAndroid Build Coastguard Worker}
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Worker// FIXME: why do we need to define AVX2 resource on CPU that doesn't have AVX2?
228*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVarVecShift, [JFPU01]> {
229*9880d681SAndroid Build Coastguard Worker  let Latency = 1;
230*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1];
231*9880d681SAndroid Build Coastguard Worker}
232*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteVarVecShiftLd, [JLAGU, JFPU01]> {
233*9880d681SAndroid Build Coastguard Worker  let Latency = 6;
234*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 1];
235*9880d681SAndroid Build Coastguard Worker}
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteMPSAD, [JFPU0]> {
238*9880d681SAndroid Build Coastguard Worker  let Latency = 3;
239*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [2];
240*9880d681SAndroid Build Coastguard Worker}
241*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteMPSADLd, [JLAGU, JFPU0]> {
242*9880d681SAndroid Build Coastguard Worker  let Latency = 8;
243*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 2];
244*9880d681SAndroid Build Coastguard Worker}
245*9880d681SAndroid Build Coastguard Worker
246*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
247*9880d681SAndroid Build Coastguard Worker// String instructions.
248*9880d681SAndroid Build Coastguard Worker// Packed Compare Implicit Length Strings, Return Mask
249*9880d681SAndroid Build Coastguard Worker// FIXME: approximate latencies + pipe dependencies
250*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpIStrM, [JFPU01]> {
253*9880d681SAndroid Build Coastguard Worker  let Latency = 7;
254*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [2];
255*9880d681SAndroid Build Coastguard Worker}
256*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpIStrMLd, [JLAGU, JFPU01]> {
257*9880d681SAndroid Build Coastguard Worker  let Latency = 12;
258*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 2];
259*9880d681SAndroid Build Coastguard Worker}
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Worker// Packed Compare Explicit Length Strings, Return Mask
262*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpEStrM, [JFPU01]> {
263*9880d681SAndroid Build Coastguard Worker  let Latency = 13;
264*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [5];
265*9880d681SAndroid Build Coastguard Worker}
266*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpEStrMLd, [JLAGU, JFPU01]> {
267*9880d681SAndroid Build Coastguard Worker  let Latency = 18;
268*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 5];
269*9880d681SAndroid Build Coastguard Worker}
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker// Packed Compare Implicit Length Strings, Return Index
272*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpIStrI, [JFPU01]> {
273*9880d681SAndroid Build Coastguard Worker  let Latency = 6;
274*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [2];
275*9880d681SAndroid Build Coastguard Worker}
276*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpIStrILd, [JLAGU, JFPU01]> {
277*9880d681SAndroid Build Coastguard Worker  let Latency = 11;
278*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 2];
279*9880d681SAndroid Build Coastguard Worker}
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Worker// Packed Compare Explicit Length Strings, Return Index
282*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpEStrI, [JFPU01]> {
283*9880d681SAndroid Build Coastguard Worker  let Latency = 13;
284*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [5];
285*9880d681SAndroid Build Coastguard Worker}
286*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WritePCmpEStrILd, [JLAGU, JFPU01]> {
287*9880d681SAndroid Build Coastguard Worker  let Latency = 18;
288*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 5];
289*9880d681SAndroid Build Coastguard Worker}
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
292*9880d681SAndroid Build Coastguard Worker// AES Instructions.
293*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESDecEnc, [JFPU01, JVIMUL]> {
296*9880d681SAndroid Build Coastguard Worker  let Latency = 3;
297*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 1];
298*9880d681SAndroid Build Coastguard Worker}
299*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESDecEncLd, [JFPU01, JLAGU, JVIMUL]> {
300*9880d681SAndroid Build Coastguard Worker  let Latency = 8;
301*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 1, 1];
302*9880d681SAndroid Build Coastguard Worker}
303*9880d681SAndroid Build Coastguard Worker
304*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESIMC, [JVIMUL]> {
305*9880d681SAndroid Build Coastguard Worker  let Latency = 2;
306*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1];
307*9880d681SAndroid Build Coastguard Worker}
308*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESIMCLd, [JLAGU, JVIMUL]> {
309*9880d681SAndroid Build Coastguard Worker  let Latency = 7;
310*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 1];
311*9880d681SAndroid Build Coastguard Worker}
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESKeyGen, [JVIMUL]> {
314*9880d681SAndroid Build Coastguard Worker  let Latency = 2;
315*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1];
316*9880d681SAndroid Build Coastguard Worker}
317*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAESKeyGenLd, [JLAGU, JVIMUL]> {
318*9880d681SAndroid Build Coastguard Worker  let Latency = 7;
319*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 1];
320*9880d681SAndroid Build Coastguard Worker}
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
323*9880d681SAndroid Build Coastguard Worker// Carry-less multiplication instructions.
324*9880d681SAndroid Build Coastguard Worker////////////////////////////////////////////////////////////////////////////////
325*9880d681SAndroid Build Coastguard Worker
326*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteCLMul, [JVIMUL]> {
327*9880d681SAndroid Build Coastguard Worker  let Latency = 2;
328*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1];
329*9880d681SAndroid Build Coastguard Worker}
330*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteCLMulLd, [JLAGU, JVIMUL]> {
331*9880d681SAndroid Build Coastguard Worker  let Latency = 7;
332*9880d681SAndroid Build Coastguard Worker  let ResourceCycles = [1, 1];
333*9880d681SAndroid Build Coastguard Worker}
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Worker// FIXME: pipe for system/microcode?
336*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSystem,     [JAny]> { let Latency = 100; }
337*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteMicrocoded, [JAny]> { let Latency = 100; }
338*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFence,  [JSAGU]>;
339*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteNop, []>;
340*9880d681SAndroid Build Coastguard Worker} // SchedModel
341*9880d681SAndroid Build Coastguard Worker
342