xref: /netbsd-src/external/apache2/llvm/dist/llvm/lib/Target/X86/X86Schedule.td (revision 82d56013d7b633d116a93943de88e08335357a7c)
1//===-- X86Schedule.td - X86 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//===----------------------------------------------------------------------===//
10// InstrSchedModel annotations for out-of-order CPUs.
11
12// Instructions with folded loads need to read the memory operand immediately,
13// but other register operands don't have to be read until the load is ready.
14// These operands are marked with ReadAfterLd.
15def ReadAfterLd : SchedRead;
16def ReadAfterVecLd : SchedRead;
17def ReadAfterVecXLd : SchedRead;
18def ReadAfterVecYLd : SchedRead;
19
20// Instructions that move data between general purpose registers and vector
21// registers may be subject to extra latency due to data bypass delays.
22// This SchedRead describes a bypass delay caused by data being moved from the
23// integer unit to the floating point unit.
24def ReadInt2Fpu : SchedRead;
25
26// Instructions with both a load and a store folded are modeled as a folded
27// load + WriteRMW.
28def WriteRMW : SchedWrite;
29
30// Helper to set SchedWrite ExePorts/Latency/ResourceCycles/NumMicroOps.
31multiclass X86WriteRes<SchedWrite SchedRW,
32                       list<ProcResourceKind> ExePorts,
33                       int Lat, list<int> Res, int UOps> {
34  def : WriteRes<SchedRW, ExePorts> {
35    let Latency = Lat;
36    let ResourceCycles = Res;
37    let NumMicroOps = UOps;
38  }
39}
40
41// Most instructions can fold loads, so almost every SchedWrite comes in two
42// variants: With and without a folded load.
43// An X86FoldableSchedWrite holds a reference to the corresponding SchedWrite
44// with a folded load.
45class X86FoldableSchedWrite : SchedWrite {
46  // The SchedWrite to use when a load is folded into the instruction.
47  SchedWrite Folded;
48  // The SchedRead to tag register operands than don't need to be ready
49  // until the folded load has completed.
50  SchedRead ReadAfterFold;
51}
52
53// Multiclass that produces a linked pair of SchedWrites.
54multiclass X86SchedWritePair<SchedRead ReadAfter = ReadAfterLd> {
55  // Register-Memory operation.
56  def Ld : SchedWrite;
57  // Register-Register operation.
58  def NAME : X86FoldableSchedWrite {
59    let Folded = !cast<SchedWrite>(NAME#"Ld");
60    let ReadAfterFold = ReadAfter;
61  }
62}
63
64// Helpers to mark SchedWrites as unsupported.
65multiclass X86WriteResUnsupported<SchedWrite SchedRW> {
66  let Unsupported = 1 in {
67    def : WriteRes<SchedRW, []>;
68  }
69}
70multiclass X86WriteResPairUnsupported<X86FoldableSchedWrite SchedRW> {
71  let Unsupported = 1 in {
72    def : WriteRes<SchedRW, []>;
73    def : WriteRes<SchedRW.Folded, []>;
74  }
75}
76
77// Multiclass that wraps X86FoldableSchedWrite for each vector width.
78class X86SchedWriteWidths<X86FoldableSchedWrite sScl,
79                          X86FoldableSchedWrite s128,
80                          X86FoldableSchedWrite s256,
81                          X86FoldableSchedWrite s512> {
82  X86FoldableSchedWrite Scl = sScl; // Scalar float/double operations.
83  X86FoldableSchedWrite MMX = sScl; // MMX operations.
84  X86FoldableSchedWrite XMM = s128; // XMM operations.
85  X86FoldableSchedWrite YMM = s256; // YMM operations.
86  X86FoldableSchedWrite ZMM = s512; // ZMM operations.
87}
88
89// Multiclass that wraps X86SchedWriteWidths for each fp vector type.
90class X86SchedWriteSizes<X86SchedWriteWidths sPS,
91                         X86SchedWriteWidths sPD> {
92  X86SchedWriteWidths PS = sPS;
93  X86SchedWriteWidths PD = sPD;
94}
95
96// Multiclass that wraps move/load/store triple for a vector width.
97class X86SchedWriteMoveLS<SchedWrite MoveRR,
98                          SchedWrite LoadRM,
99                          SchedWrite StoreMR> {
100  SchedWrite RR = MoveRR;
101  SchedWrite RM = LoadRM;
102  SchedWrite MR = StoreMR;
103}
104
105// Multiclass that wraps masked load/store writes for a vector width.
106class X86SchedWriteMaskMove<SchedWrite LoadRM, SchedWrite StoreMR> {
107  SchedWrite RM = LoadRM;
108  SchedWrite MR = StoreMR;
109}
110
111// Multiclass that wraps X86SchedWriteMoveLS for each vector width.
112class X86SchedWriteMoveLSWidths<X86SchedWriteMoveLS sScl,
113                                X86SchedWriteMoveLS s128,
114                                X86SchedWriteMoveLS s256,
115                                X86SchedWriteMoveLS s512> {
116  X86SchedWriteMoveLS Scl = sScl; // Scalar float/double operations.
117  X86SchedWriteMoveLS MMX = sScl; // MMX operations.
118  X86SchedWriteMoveLS XMM = s128; // XMM operations.
119  X86SchedWriteMoveLS YMM = s256; // YMM operations.
120  X86SchedWriteMoveLS ZMM = s512; // ZMM operations.
121}
122
123// Loads, stores, and moves, not folded with other operations.
124def WriteLoad    : SchedWrite;
125def WriteStore   : SchedWrite;
126def WriteStoreNT : SchedWrite;
127def WriteMove    : SchedWrite;
128def WriteCopy    : WriteSequence<[WriteLoad, WriteStore]>; // mem->mem copy
129
130// Arithmetic.
131defm WriteALU    : X86SchedWritePair; // Simple integer ALU op.
132defm WriteADC    : X86SchedWritePair; // Integer ALU + flags op.
133def  WriteALURMW : WriteSequence<[WriteALULd, WriteRMW]>;
134def  WriteADCRMW : WriteSequence<[WriteADCLd, WriteRMW]>;
135def  WriteLEA    : SchedWrite;        // LEA instructions can't fold loads.
136
137// Integer multiplication
138defm WriteIMul8     : X86SchedWritePair; // Integer 8-bit multiplication.
139defm WriteIMul16    : X86SchedWritePair; // Integer 16-bit multiplication.
140defm WriteIMul16Imm : X86SchedWritePair; // Integer 16-bit multiplication by immediate.
141defm WriteIMul16Reg : X86SchedWritePair; // Integer 16-bit multiplication by register.
142defm WriteIMul32    : X86SchedWritePair; // Integer 32-bit multiplication.
143defm WriteIMul32Imm : X86SchedWritePair; // Integer 32-bit multiplication by immediate.
144defm WriteIMul32Reg : X86SchedWritePair; // Integer 32-bit multiplication by register.
145defm WriteIMul64    : X86SchedWritePair; // Integer 64-bit multiplication.
146defm WriteIMul64Imm : X86SchedWritePair; // Integer 64-bit multiplication by immediate.
147defm WriteIMul64Reg : X86SchedWritePair; // Integer 64-bit multiplication by register.
148def  WriteIMulH     : SchedWrite;        // Integer multiplication, high part.
149
150def  WriteBSWAP32 : SchedWrite; // Byte Order (Endianness) 32-bit Swap.
151def  WriteBSWAP64 : SchedWrite; // Byte Order (Endianness) 64-bit Swap.
152defm WriteCMPXCHG : X86SchedWritePair; // Compare and set, compare and swap.
153def  WriteCMPXCHGRMW : SchedWrite;     // Compare and set, compare and swap.
154def  WriteXCHG    : SchedWrite;        // Compare+Exchange - TODO RMW support.
155
156// Integer division.
157defm WriteDiv8   : X86SchedWritePair;
158defm WriteDiv16  : X86SchedWritePair;
159defm WriteDiv32  : X86SchedWritePair;
160defm WriteDiv64  : X86SchedWritePair;
161defm WriteIDiv8  : X86SchedWritePair;
162defm WriteIDiv16 : X86SchedWritePair;
163defm WriteIDiv32 : X86SchedWritePair;
164defm WriteIDiv64 : X86SchedWritePair;
165
166defm WriteBSF : X86SchedWritePair; // Bit scan forward.
167defm WriteBSR : X86SchedWritePair; // Bit scan reverse.
168defm WritePOPCNT : X86SchedWritePair; // Bit population count.
169defm WriteLZCNT : X86SchedWritePair; // Leading zero count.
170defm WriteTZCNT : X86SchedWritePair; // Trailing zero count.
171defm WriteCMOV  : X86SchedWritePair; // Conditional move.
172def  WriteFCMOV : SchedWrite; // X87 conditional move.
173def  WriteSETCC : SchedWrite; // Set register based on condition code.
174def  WriteSETCCStore : SchedWrite;
175def  WriteLAHFSAHF : SchedWrite; // Load/Store flags in AH.
176
177def  WriteBitTest      : SchedWrite; // Bit Test
178def  WriteBitTestImmLd : SchedWrite;
179def  WriteBitTestRegLd : SchedWrite;
180
181def  WriteBitTestSet       : SchedWrite; // Bit Test + Set
182def  WriteBitTestSetImmLd  : SchedWrite;
183def  WriteBitTestSetRegLd  : SchedWrite;
184def  WriteBitTestSetImmRMW : WriteSequence<[WriteBitTestSetImmLd, WriteRMW]>;
185def  WriteBitTestSetRegRMW : WriteSequence<[WriteBitTestSetRegLd, WriteRMW]>;
186
187// Integer shifts and rotates.
188defm WriteShift    : X86SchedWritePair;
189defm WriteShiftCL  : X86SchedWritePair;
190defm WriteRotate   : X86SchedWritePair;
191defm WriteRotateCL : X86SchedWritePair;
192
193// Double shift instructions.
194def  WriteSHDrri  : SchedWrite;
195def  WriteSHDrrcl : SchedWrite;
196def  WriteSHDmri  : SchedWrite;
197def  WriteSHDmrcl : SchedWrite;
198
199// BMI1 BEXTR/BLS, BMI2 BZHI
200defm WriteBEXTR : X86SchedWritePair;
201defm WriteBLS   : X86SchedWritePair;
202defm WriteBZHI  : X86SchedWritePair;
203
204// Idioms that clear a register, like xorps %xmm0, %xmm0.
205// These can often bypass execution ports completely.
206def WriteZero : SchedWrite;
207
208// Branches don't produce values, so they have no latency, but they still
209// consume resources. Indirect branches can fold loads.
210defm WriteJump : X86SchedWritePair;
211
212// Floating point. This covers both scalar and vector operations.
213def  WriteFLD0          : SchedWrite;
214def  WriteFLD1          : SchedWrite;
215def  WriteFLDC          : SchedWrite;
216def  WriteFLoad         : SchedWrite;
217def  WriteFLoadX        : SchedWrite;
218def  WriteFLoadY        : SchedWrite;
219def  WriteFMaskedLoad   : SchedWrite;
220def  WriteFMaskedLoadY  : SchedWrite;
221def  WriteFStore        : SchedWrite;
222def  WriteFStoreX       : SchedWrite;
223def  WriteFStoreY       : SchedWrite;
224def  WriteFStoreNT      : SchedWrite;
225def  WriteFStoreNTX     : SchedWrite;
226def  WriteFStoreNTY     : SchedWrite;
227
228def  WriteFMaskedStore32  : SchedWrite;
229def  WriteFMaskedStore64  : SchedWrite;
230def  WriteFMaskedStore32Y : SchedWrite;
231def  WriteFMaskedStore64Y : SchedWrite;
232
233def  WriteFMove         : SchedWrite;
234def  WriteFMoveX        : SchedWrite;
235def  WriteFMoveY        : SchedWrite;
236
237defm WriteFAdd    : X86SchedWritePair<ReadAfterVecLd>;  // Floating point add/sub.
238defm WriteFAddX   : X86SchedWritePair<ReadAfterVecXLd>; // Floating point add/sub (XMM).
239defm WriteFAddY   : X86SchedWritePair<ReadAfterVecYLd>; // Floating point add/sub (YMM).
240defm WriteFAddZ   : X86SchedWritePair<ReadAfterVecYLd>; // Floating point add/sub (ZMM).
241defm WriteFAdd64  : X86SchedWritePair<ReadAfterVecLd>;  // Floating point double add/sub.
242defm WriteFAdd64X : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double add/sub (XMM).
243defm WriteFAdd64Y : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double add/sub (YMM).
244defm WriteFAdd64Z : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double add/sub (ZMM).
245defm WriteFCmp    : X86SchedWritePair<ReadAfterVecLd>;  // Floating point compare.
246defm WriteFCmpX   : X86SchedWritePair<ReadAfterVecXLd>; // Floating point compare (XMM).
247defm WriteFCmpY   : X86SchedWritePair<ReadAfterVecYLd>; // Floating point compare (YMM).
248defm WriteFCmpZ   : X86SchedWritePair<ReadAfterVecYLd>; // Floating point compare (ZMM).
249defm WriteFCmp64  : X86SchedWritePair<ReadAfterVecLd>;  // Floating point double compare.
250defm WriteFCmp64X : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double compare (XMM).
251defm WriteFCmp64Y : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double compare (YMM).
252defm WriteFCmp64Z : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double compare (ZMM).
253defm WriteFCom    : X86SchedWritePair<ReadAfterVecLd>;  // Floating point compare to flags (X87).
254defm WriteFComX   : X86SchedWritePair<ReadAfterVecLd>;  // Floating point compare to flags (SSE).
255defm WriteFMul    : X86SchedWritePair<ReadAfterVecLd>;  // Floating point multiplication.
256defm WriteFMulX   : X86SchedWritePair<ReadAfterVecXLd>; // Floating point multiplication (XMM).
257defm WriteFMulY   : X86SchedWritePair<ReadAfterVecYLd>; // Floating point multiplication (YMM).
258defm WriteFMulZ   : X86SchedWritePair<ReadAfterVecYLd>; // Floating point multiplication (YMM).
259defm WriteFMul64  : X86SchedWritePair<ReadAfterVecLd>;  // Floating point double multiplication.
260defm WriteFMul64X : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double multiplication (XMM).
261defm WriteFMul64Y : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double multiplication (YMM).
262defm WriteFMul64Z : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double multiplication (ZMM).
263defm WriteFDiv    : X86SchedWritePair<ReadAfterVecLd>;  // Floating point division.
264defm WriteFDivX   : X86SchedWritePair<ReadAfterVecXLd>; // Floating point division (XMM).
265defm WriteFDivY   : X86SchedWritePair<ReadAfterVecYLd>; // Floating point division (YMM).
266defm WriteFDivZ   : X86SchedWritePair<ReadAfterVecYLd>; // Floating point division (ZMM).
267defm WriteFDiv64  : X86SchedWritePair<ReadAfterVecLd>;  // Floating point double division.
268defm WriteFDiv64X : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double division (XMM).
269defm WriteFDiv64Y : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double division (YMM).
270defm WriteFDiv64Z : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double division (ZMM).
271defm WriteFSqrt  : X86SchedWritePair<ReadAfterVecLd>;   // Floating point square root.
272defm WriteFSqrtX : X86SchedWritePair<ReadAfterVecXLd>;  // Floating point square root (XMM).
273defm WriteFSqrtY : X86SchedWritePair<ReadAfterVecYLd>;  // Floating point square root (YMM).
274defm WriteFSqrtZ : X86SchedWritePair<ReadAfterVecYLd>;  // Floating point square root (ZMM).
275defm WriteFSqrt64  : X86SchedWritePair<ReadAfterVecLd>;  // Floating point double square root.
276defm WriteFSqrt64X : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double square root (XMM).
277defm WriteFSqrt64Y : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double square root (YMM).
278defm WriteFSqrt64Z : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double square root (ZMM).
279defm WriteFSqrt80  : X86SchedWritePair<ReadAfterVecLd>;  // Floating point long double square root.
280defm WriteFRcp   : X86SchedWritePair<ReadAfterVecLd>;  // Floating point reciprocal estimate.
281defm WriteFRcpX  : X86SchedWritePair<ReadAfterVecXLd>; // Floating point reciprocal estimate (XMM).
282defm WriteFRcpY  : X86SchedWritePair<ReadAfterVecYLd>; // Floating point reciprocal estimate (YMM).
283defm WriteFRcpZ  : X86SchedWritePair<ReadAfterVecYLd>; // Floating point reciprocal estimate (ZMM).
284defm WriteFRsqrt : X86SchedWritePair<ReadAfterVecLd>;  // Floating point reciprocal square root estimate.
285defm WriteFRsqrtX: X86SchedWritePair<ReadAfterVecXLd>; // Floating point reciprocal square root estimate (XMM).
286defm WriteFRsqrtY: X86SchedWritePair<ReadAfterVecYLd>; // Floating point reciprocal square root estimate (YMM).
287defm WriteFRsqrtZ: X86SchedWritePair<ReadAfterVecYLd>; // Floating point reciprocal square root estimate (ZMM).
288defm WriteFMA    : X86SchedWritePair<ReadAfterVecLd>;  // Fused Multiply Add.
289defm WriteFMAX   : X86SchedWritePair<ReadAfterVecXLd>; // Fused Multiply Add (XMM).
290defm WriteFMAY   : X86SchedWritePair<ReadAfterVecYLd>; // Fused Multiply Add (YMM).
291defm WriteFMAZ   : X86SchedWritePair<ReadAfterVecYLd>; // Fused Multiply Add (ZMM).
292defm WriteDPPD   : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double dot product.
293defm WriteDPPS   : X86SchedWritePair<ReadAfterVecXLd>; // Floating point single dot product.
294defm WriteDPPSY  : X86SchedWritePair<ReadAfterVecYLd>; // Floating point single dot product (YMM).
295defm WriteDPPSZ  : X86SchedWritePair<ReadAfterVecYLd>; // Floating point single dot product (ZMM).
296defm WriteFSign  : X86SchedWritePair<ReadAfterVecLd>;  // Floating point fabs/fchs.
297defm WriteFRnd   : X86SchedWritePair<ReadAfterVecXLd>; // Floating point rounding.
298defm WriteFRndY  : X86SchedWritePair<ReadAfterVecYLd>; // Floating point rounding (YMM).
299defm WriteFRndZ  : X86SchedWritePair<ReadAfterVecYLd>; // Floating point rounding (ZMM).
300defm WriteFLogic  : X86SchedWritePair<ReadAfterVecXLd>; // Floating point and/or/xor logicals.
301defm WriteFLogicY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point and/or/xor logicals (YMM).
302defm WriteFLogicZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point and/or/xor logicals (ZMM).
303defm WriteFTest   : X86SchedWritePair<ReadAfterVecXLd>; // Floating point TEST instructions.
304defm WriteFTestY  : X86SchedWritePair<ReadAfterVecYLd>; // Floating point TEST instructions (YMM).
305defm WriteFTestZ  : X86SchedWritePair<ReadAfterVecYLd>; // Floating point TEST instructions (ZMM).
306defm WriteFShuffle  : X86SchedWritePair<ReadAfterVecXLd>; // Floating point vector shuffles.
307defm WriteFShuffleY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector shuffles (YMM).
308defm WriteFShuffleZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector shuffles (ZMM).
309defm WriteFVarShuffle  : X86SchedWritePair<ReadAfterVecXLd>; // Floating point vector variable shuffles.
310defm WriteFVarShuffleY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector variable shuffles (YMM).
311defm WriteFVarShuffleZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector variable shuffles (ZMM).
312defm WriteFBlend  : X86SchedWritePair<ReadAfterVecXLd>; // Floating point vector blends.
313defm WriteFBlendY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector blends (YMM).
314defm WriteFBlendZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector blends (ZMM).
315defm WriteFVarBlend  : X86SchedWritePair<ReadAfterVecXLd>; // Fp vector variable blends.
316defm WriteFVarBlendY : X86SchedWritePair<ReadAfterVecYLd>; // Fp vector variable blends (YMM).
317defm WriteFVarBlendZ : X86SchedWritePair<ReadAfterVecYLd>; // Fp vector variable blends (YMZMM).
318
319// FMA Scheduling helper class.
320class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
321
322// Horizontal Add/Sub (float and integer)
323defm WriteFHAdd  : X86SchedWritePair<ReadAfterVecXLd>;
324defm WriteFHAddY : X86SchedWritePair<ReadAfterVecYLd>;
325defm WriteFHAddZ : X86SchedWritePair<ReadAfterVecYLd>;
326defm WritePHAdd  : X86SchedWritePair<ReadAfterVecLd>;
327defm WritePHAddX : X86SchedWritePair<ReadAfterVecXLd>;
328defm WritePHAddY : X86SchedWritePair<ReadAfterVecYLd>;
329defm WritePHAddZ : X86SchedWritePair<ReadAfterVecYLd>;
330
331// Vector integer operations.
332def  WriteVecLoad         : SchedWrite;
333def  WriteVecLoadX        : SchedWrite;
334def  WriteVecLoadY        : SchedWrite;
335def  WriteVecLoadNT       : SchedWrite;
336def  WriteVecLoadNTY      : SchedWrite;
337def  WriteVecMaskedLoad   : SchedWrite;
338def  WriteVecMaskedLoadY  : SchedWrite;
339def  WriteVecStore        : SchedWrite;
340def  WriteVecStoreX       : SchedWrite;
341def  WriteVecStoreY       : SchedWrite;
342def  WriteVecStoreNT      : SchedWrite;
343def  WriteVecStoreNTY     : SchedWrite;
344def  WriteVecMaskedStore32  : SchedWrite;
345def  WriteVecMaskedStore64  : SchedWrite;
346def  WriteVecMaskedStore32Y : SchedWrite;
347def  WriteVecMaskedStore64Y : SchedWrite;
348def  WriteVecMove         : SchedWrite;
349def  WriteVecMoveX        : SchedWrite;
350def  WriteVecMoveY        : SchedWrite;
351def  WriteVecMoveToGpr    : SchedWrite;
352def  WriteVecMoveFromGpr  : SchedWrite;
353
354defm WriteVecALU    : X86SchedWritePair<ReadAfterVecLd>;  // Vector integer ALU op, no logicals.
355defm WriteVecALUX   : X86SchedWritePair<ReadAfterVecXLd>; // Vector integer ALU op, no logicals (XMM).
356defm WriteVecALUY   : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer ALU op, no logicals (YMM).
357defm WriteVecALUZ   : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer ALU op, no logicals (ZMM).
358defm WriteVecLogic  : X86SchedWritePair<ReadAfterVecLd>;  // Vector integer and/or/xor logicals.
359defm WriteVecLogicX : X86SchedWritePair<ReadAfterVecXLd>; // Vector integer and/or/xor logicals (XMM).
360defm WriteVecLogicY : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer and/or/xor logicals (YMM).
361defm WriteVecLogicZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer and/or/xor logicals (ZMM).
362defm WriteVecTest  : X86SchedWritePair<ReadAfterVecXLd>;  // Vector integer TEST instructions.
363defm WriteVecTestY : X86SchedWritePair<ReadAfterVecYLd>;  // Vector integer TEST instructions (YMM).
364defm WriteVecTestZ : X86SchedWritePair<ReadAfterVecYLd>;  // Vector integer TEST instructions (ZMM).
365defm WriteVecShift  : X86SchedWritePair<ReadAfterVecLd>;  // Vector integer shifts (default).
366defm WriteVecShiftX : X86SchedWritePair<ReadAfterVecXLd>; // Vector integer shifts (XMM).
367defm WriteVecShiftY : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer shifts (YMM).
368defm WriteVecShiftZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer shifts (ZMM).
369defm WriteVecShiftImm : X86SchedWritePair<ReadAfterVecLd>;  // Vector integer immediate shifts (default).
370defm WriteVecShiftImmX: X86SchedWritePair<ReadAfterVecXLd>; // Vector integer immediate shifts (XMM).
371defm WriteVecShiftImmY: X86SchedWritePair<ReadAfterVecYLd>; // Vector integer immediate shifts (YMM).
372defm WriteVecShiftImmZ: X86SchedWritePair<ReadAfterVecYLd>; // Vector integer immediate shifts (ZMM).
373defm WriteVecIMul  : X86SchedWritePair<ReadAfterVecLd>;  // Vector integer multiply (default).
374defm WriteVecIMulX : X86SchedWritePair<ReadAfterVecXLd>; // Vector integer multiply (XMM).
375defm WriteVecIMulY : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer multiply (YMM).
376defm WriteVecIMulZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer multiply (ZMM).
377defm WritePMULLD   : X86SchedWritePair<ReadAfterVecXLd>; // Vector PMULLD.
378defm WritePMULLDY  : X86SchedWritePair<ReadAfterVecYLd>; // Vector PMULLD (YMM).
379defm WritePMULLDZ  : X86SchedWritePair<ReadAfterVecYLd>; // Vector PMULLD (ZMM).
380defm WriteShuffle  : X86SchedWritePair<ReadAfterVecLd>;  // Vector shuffles.
381defm WriteShuffleX : X86SchedWritePair<ReadAfterVecXLd>; // Vector shuffles (XMM).
382defm WriteShuffleY : X86SchedWritePair<ReadAfterVecYLd>; // Vector shuffles (YMM).
383defm WriteShuffleZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector shuffles (ZMM).
384defm WriteVarShuffle  : X86SchedWritePair<ReadAfterVecLd>;  // Vector variable shuffles.
385defm WriteVarShuffleX : X86SchedWritePair<ReadAfterVecXLd>; // Vector variable shuffles (XMM).
386defm WriteVarShuffleY : X86SchedWritePair<ReadAfterVecYLd>; // Vector variable shuffles (YMM).
387defm WriteVarShuffleZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector variable shuffles (ZMM).
388defm WriteBlend  : X86SchedWritePair<ReadAfterVecXLd>; // Vector blends.
389defm WriteBlendY : X86SchedWritePair<ReadAfterVecYLd>; // Vector blends (YMM).
390defm WriteBlendZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector blends (ZMM).
391defm WriteVarBlend  : X86SchedWritePair<ReadAfterVecXLd>; // Vector variable blends.
392defm WriteVarBlendY : X86SchedWritePair<ReadAfterVecYLd>; // Vector variable blends (YMM).
393defm WriteVarBlendZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector variable blends (ZMM).
394defm WritePSADBW  : X86SchedWritePair<ReadAfterVecLd>;  // Vector PSADBW.
395defm WritePSADBWX : X86SchedWritePair<ReadAfterVecXLd>; // Vector PSADBW (XMM).
396defm WritePSADBWY : X86SchedWritePair<ReadAfterVecYLd>; // Vector PSADBW (YMM).
397defm WritePSADBWZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector PSADBW (ZMM).
398defm WriteMPSAD  : X86SchedWritePair<ReadAfterVecXLd>; // Vector MPSAD.
399defm WriteMPSADY : X86SchedWritePair<ReadAfterVecYLd>; // Vector MPSAD (YMM).
400defm WriteMPSADZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector MPSAD (ZMM).
401defm WritePHMINPOS : X86SchedWritePair<ReadAfterVecXLd>;  // Vector PHMINPOS.
402
403// Vector insert/extract operations.
404defm WriteVecInsert : X86SchedWritePair; // Insert gpr to vector element.
405def  WriteVecExtract : SchedWrite; // Extract vector element to gpr.
406def  WriteVecExtractSt : SchedWrite; // Extract vector element and store.
407
408// MOVMSK operations.
409def WriteFMOVMSK    : SchedWrite;
410def WriteVecMOVMSK  : SchedWrite;
411def WriteVecMOVMSKY : SchedWrite;
412def WriteMMXMOVMSK  : SchedWrite;
413
414// Conversion between integer and float.
415defm WriteCvtSD2I  : X86SchedWritePair<ReadAfterVecLd>;  // Double -> Integer.
416defm WriteCvtPD2I  : X86SchedWritePair<ReadAfterVecXLd>; // Double -> Integer (XMM).
417defm WriteCvtPD2IY : X86SchedWritePair<ReadAfterVecYLd>; // Double -> Integer (YMM).
418defm WriteCvtPD2IZ : X86SchedWritePair<ReadAfterVecYLd>; // Double -> Integer (ZMM).
419
420defm WriteCvtSS2I  : X86SchedWritePair<ReadAfterVecLd>;  // Float -> Integer.
421defm WriteCvtPS2I  : X86SchedWritePair<ReadAfterVecXLd>; // Float -> Integer (XMM).
422defm WriteCvtPS2IY : X86SchedWritePair<ReadAfterVecYLd>; // Float -> Integer (YMM).
423defm WriteCvtPS2IZ : X86SchedWritePair<ReadAfterVecYLd>; // Float -> Integer (ZMM).
424
425defm WriteCvtI2SD  : X86SchedWritePair<ReadAfterVecLd>;  // Integer -> Double.
426defm WriteCvtI2PD  : X86SchedWritePair<ReadAfterVecXLd>; // Integer -> Double (XMM).
427defm WriteCvtI2PDY : X86SchedWritePair<ReadAfterVecYLd>; // Integer -> Double (YMM).
428defm WriteCvtI2PDZ : X86SchedWritePair<ReadAfterVecYLd>; // Integer -> Double (ZMM).
429
430defm WriteCvtI2SS  : X86SchedWritePair<ReadAfterVecLd>;  // Integer -> Float.
431defm WriteCvtI2PS  : X86SchedWritePair<ReadAfterVecXLd>; // Integer -> Float (XMM).
432defm WriteCvtI2PSY : X86SchedWritePair<ReadAfterVecYLd>; // Integer -> Float (YMM).
433defm WriteCvtI2PSZ : X86SchedWritePair<ReadAfterVecYLd>; // Integer -> Float (ZMM).
434
435defm WriteCvtSS2SD  : X86SchedWritePair<ReadAfterVecLd>;  // Float -> Double size conversion.
436defm WriteCvtPS2PD  : X86SchedWritePair<ReadAfterVecXLd>; // Float -> Double size conversion (XMM).
437defm WriteCvtPS2PDY : X86SchedWritePair<ReadAfterVecYLd>; // Float -> Double size conversion (YMM).
438defm WriteCvtPS2PDZ : X86SchedWritePair<ReadAfterVecYLd>; // Float -> Double size conversion (ZMM).
439
440defm WriteCvtSD2SS  : X86SchedWritePair<ReadAfterVecLd>;  // Double -> Float size conversion.
441defm WriteCvtPD2PS  : X86SchedWritePair<ReadAfterVecXLd>; // Double -> Float size conversion (XMM).
442defm WriteCvtPD2PSY : X86SchedWritePair<ReadAfterVecYLd>; // Double -> Float size conversion (YMM).
443defm WriteCvtPD2PSZ : X86SchedWritePair<ReadAfterVecYLd>; // Double -> Float size conversion (ZMM).
444
445defm WriteCvtPH2PS  : X86SchedWritePair<ReadAfterVecXLd>; // Half -> Float size conversion.
446defm WriteCvtPH2PSY : X86SchedWritePair<ReadAfterVecYLd>; // Half -> Float size conversion (YMM).
447defm WriteCvtPH2PSZ : X86SchedWritePair<ReadAfterVecYLd>; // Half -> Float size conversion (ZMM).
448
449def  WriteCvtPS2PH    : SchedWrite; // // Float -> Half size conversion.
450def  WriteCvtPS2PHY   : SchedWrite; // // Float -> Half size conversion (YMM).
451def  WriteCvtPS2PHZ   : SchedWrite; // // Float -> Half size conversion (ZMM).
452def  WriteCvtPS2PHSt  : SchedWrite; // // Float -> Half + store size conversion.
453def  WriteCvtPS2PHYSt : SchedWrite; // // Float -> Half + store size conversion (YMM).
454def  WriteCvtPS2PHZSt : SchedWrite; // // Float -> Half + store size conversion (ZMM).
455
456// CRC32 instruction.
457defm WriteCRC32 : X86SchedWritePair<ReadAfterLd>;
458
459// Strings instructions.
460// Packed Compare Implicit Length Strings, Return Mask
461defm WritePCmpIStrM : X86SchedWritePair<ReadAfterVecXLd>;
462// Packed Compare Explicit Length Strings, Return Mask
463defm WritePCmpEStrM : X86SchedWritePair<ReadAfterVecXLd>;
464// Packed Compare Implicit Length Strings, Return Index
465defm WritePCmpIStrI : X86SchedWritePair<ReadAfterVecXLd>;
466// Packed Compare Explicit Length Strings, Return Index
467defm WritePCmpEStrI : X86SchedWritePair<ReadAfterVecXLd>;
468
469// AES instructions.
470defm WriteAESDecEnc : X86SchedWritePair<ReadAfterVecXLd>; // Decryption, encryption.
471defm WriteAESIMC : X86SchedWritePair<ReadAfterVecXLd>; // InvMixColumn.
472defm WriteAESKeyGen : X86SchedWritePair<ReadAfterVecXLd>; // Key Generation.
473
474// Carry-less multiplication instructions.
475defm WriteCLMul : X86SchedWritePair<ReadAfterVecXLd>;
476
477// EMMS/FEMMS
478def WriteEMMS : SchedWrite;
479
480// Load/store MXCSR
481def WriteLDMXCSR : SchedWrite;
482def WriteSTMXCSR : SchedWrite;
483
484// Catch-all for expensive system instructions.
485def WriteSystem : SchedWrite;
486
487// AVX2.
488defm WriteFShuffle256 : X86SchedWritePair<ReadAfterVecYLd>; // Fp 256-bit width vector shuffles.
489defm WriteFVarShuffle256 : X86SchedWritePair<ReadAfterVecYLd>; // Fp 256-bit width variable shuffles.
490defm WriteShuffle256 : X86SchedWritePair<ReadAfterVecYLd>; // 256-bit width vector shuffles.
491defm WriteVPMOV256 : X86SchedWritePair<ReadAfterVecYLd>; // 256-bit width packed vector width-changing move.
492defm WriteVarShuffle256 : X86SchedWritePair<ReadAfterVecYLd>; // 256-bit width vector variable shuffles.
493defm WriteVarVecShift  : X86SchedWritePair<ReadAfterVecXLd>; // Variable vector shifts.
494defm WriteVarVecShiftY : X86SchedWritePair<ReadAfterVecYLd>; // Variable vector shifts (YMM).
495defm WriteVarVecShiftZ : X86SchedWritePair<ReadAfterVecYLd>; // Variable vector shifts (ZMM).
496
497// Old microcoded instructions that nobody use.
498def WriteMicrocoded : SchedWrite;
499
500// Fence instructions.
501def WriteFence : SchedWrite;
502
503// Nop, not very useful expect it provides a model for nops!
504def WriteNop : SchedWrite;
505
506// Move/Load/Store wrappers.
507def WriteFMoveLS
508 : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStore>;
509def WriteFMoveLSX
510 : X86SchedWriteMoveLS<WriteFMoveX, WriteFLoadX, WriteFStoreX>;
511def WriteFMoveLSY
512 : X86SchedWriteMoveLS<WriteFMoveY, WriteFLoadY, WriteFStoreY>;
513def SchedWriteFMoveLS
514  : X86SchedWriteMoveLSWidths<WriteFMoveLS, WriteFMoveLSX,
515                              WriteFMoveLSY, WriteFMoveLSY>;
516
517def WriteFMoveLSNT
518 : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStoreNT>;
519def WriteFMoveLSNTX
520 : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStoreNTX>;
521def WriteFMoveLSNTY
522 : X86SchedWriteMoveLS<WriteFMoveY, WriteFLoadY, WriteFStoreNTY>;
523def SchedWriteFMoveLSNT
524  : X86SchedWriteMoveLSWidths<WriteFMoveLSNT, WriteFMoveLSNTX,
525                              WriteFMoveLSNTY, WriteFMoveLSNTY>;
526
527def WriteVecMoveLS
528 : X86SchedWriteMoveLS<WriteVecMove, WriteVecLoad, WriteVecStore>;
529def WriteVecMoveLSX
530 : X86SchedWriteMoveLS<WriteVecMoveX, WriteVecLoadX, WriteVecStoreX>;
531def WriteVecMoveLSY
532 : X86SchedWriteMoveLS<WriteVecMoveY, WriteVecLoadY, WriteVecStoreY>;
533def SchedWriteVecMoveLS
534  : X86SchedWriteMoveLSWidths<WriteVecMoveLS, WriteVecMoveLSX,
535                              WriteVecMoveLSY, WriteVecMoveLSY>;
536
537def WriteVecMoveLSNT
538 : X86SchedWriteMoveLS<WriteVecMove, WriteVecLoadNT, WriteVecStoreNT>;
539def WriteVecMoveLSNTX
540 : X86SchedWriteMoveLS<WriteVecMoveX, WriteVecLoadNT, WriteVecStoreNT>;
541def WriteVecMoveLSNTY
542 : X86SchedWriteMoveLS<WriteVecMoveY, WriteVecLoadNTY, WriteVecStoreNTY>;
543def SchedWriteVecMoveLSNT
544  : X86SchedWriteMoveLSWidths<WriteVecMoveLSNT, WriteVecMoveLSNTX,
545                              WriteVecMoveLSNTY, WriteVecMoveLSNTY>;
546
547// Conditional SIMD Packed Loads and Stores wrappers.
548def WriteFMaskMove32
549  : X86SchedWriteMaskMove<WriteFMaskedLoad, WriteFMaskedStore32>;
550def WriteFMaskMove64
551  : X86SchedWriteMaskMove<WriteFMaskedLoad, WriteFMaskedStore64>;
552def WriteFMaskMove32Y
553  : X86SchedWriteMaskMove<WriteFMaskedLoadY, WriteFMaskedStore32Y>;
554def WriteFMaskMove64Y
555  : X86SchedWriteMaskMove<WriteFMaskedLoadY, WriteFMaskedStore64Y>;
556def WriteVecMaskMove32
557  : X86SchedWriteMaskMove<WriteVecMaskedLoad, WriteVecMaskedStore32>;
558def WriteVecMaskMove64
559  : X86SchedWriteMaskMove<WriteVecMaskedLoad, WriteVecMaskedStore64>;
560def WriteVecMaskMove32Y
561  : X86SchedWriteMaskMove<WriteVecMaskedLoadY, WriteVecMaskedStore32Y>;
562def WriteVecMaskMove64Y
563  : X86SchedWriteMaskMove<WriteVecMaskedLoadY, WriteVecMaskedStore64Y>;
564
565// Vector width wrappers.
566def SchedWriteFAdd
567 : X86SchedWriteWidths<WriteFAdd, WriteFAddX, WriteFAddY, WriteFAddZ>;
568def SchedWriteFAdd64
569 : X86SchedWriteWidths<WriteFAdd64, WriteFAdd64X, WriteFAdd64Y, WriteFAdd64Z>;
570def SchedWriteFHAdd
571 : X86SchedWriteWidths<WriteFHAdd, WriteFHAdd, WriteFHAddY, WriteFHAddZ>;
572def SchedWriteFCmp
573 : X86SchedWriteWidths<WriteFCmp, WriteFCmpX, WriteFCmpY, WriteFCmpZ>;
574def SchedWriteFCmp64
575 : X86SchedWriteWidths<WriteFCmp64, WriteFCmp64X, WriteFCmp64Y, WriteFCmp64Z>;
576def SchedWriteFMul
577 : X86SchedWriteWidths<WriteFMul, WriteFMulX, WriteFMulY, WriteFMulZ>;
578def SchedWriteFMul64
579 : X86SchedWriteWidths<WriteFMul64, WriteFMul64X, WriteFMul64Y, WriteFMul64Z>;
580def SchedWriteFMA
581 : X86SchedWriteWidths<WriteFMA, WriteFMAX, WriteFMAY, WriteFMAZ>;
582def SchedWriteDPPD
583 : X86SchedWriteWidths<WriteDPPD, WriteDPPD, WriteDPPD, WriteDPPD>;
584def SchedWriteDPPS
585 : X86SchedWriteWidths<WriteDPPS, WriteDPPS, WriteDPPSY, WriteDPPSZ>;
586def SchedWriteFDiv
587 : X86SchedWriteWidths<WriteFDiv, WriteFDivX, WriteFDivY, WriteFDivZ>;
588def SchedWriteFDiv64
589 : X86SchedWriteWidths<WriteFDiv64, WriteFDiv64X, WriteFDiv64Y, WriteFDiv64Z>;
590def SchedWriteFSqrt
591 : X86SchedWriteWidths<WriteFSqrt, WriteFSqrtX,
592                       WriteFSqrtY, WriteFSqrtZ>;
593def SchedWriteFSqrt64
594 : X86SchedWriteWidths<WriteFSqrt64, WriteFSqrt64X,
595                       WriteFSqrt64Y, WriteFSqrt64Z>;
596def SchedWriteFRcp
597 : X86SchedWriteWidths<WriteFRcp, WriteFRcpX, WriteFRcpY, WriteFRcpZ>;
598def SchedWriteFRsqrt
599 : X86SchedWriteWidths<WriteFRsqrt, WriteFRsqrtX, WriteFRsqrtY, WriteFRsqrtZ>;
600def SchedWriteFRnd
601 : X86SchedWriteWidths<WriteFRnd, WriteFRnd, WriteFRndY, WriteFRndZ>;
602def SchedWriteFLogic
603 : X86SchedWriteWidths<WriteFLogic, WriteFLogic, WriteFLogicY, WriteFLogicZ>;
604def SchedWriteFTest
605 : X86SchedWriteWidths<WriteFTest, WriteFTest, WriteFTestY, WriteFTestZ>;
606
607def SchedWriteFShuffle
608 : X86SchedWriteWidths<WriteFShuffle, WriteFShuffle,
609                       WriteFShuffleY, WriteFShuffleZ>;
610def SchedWriteFVarShuffle
611 : X86SchedWriteWidths<WriteFVarShuffle, WriteFVarShuffle,
612                       WriteFVarShuffleY, WriteFVarShuffleZ>;
613def SchedWriteFBlend
614 : X86SchedWriteWidths<WriteFBlend, WriteFBlend, WriteFBlendY, WriteFBlendZ>;
615def SchedWriteFVarBlend
616 : X86SchedWriteWidths<WriteFVarBlend, WriteFVarBlend,
617                       WriteFVarBlendY, WriteFVarBlendZ>;
618
619def SchedWriteCvtDQ2PD
620 : X86SchedWriteWidths<WriteCvtI2SD, WriteCvtI2PD,
621                       WriteCvtI2PDY, WriteCvtI2PDZ>;
622def SchedWriteCvtDQ2PS
623 : X86SchedWriteWidths<WriteCvtI2SS, WriteCvtI2PS,
624                       WriteCvtI2PSY, WriteCvtI2PSZ>;
625def SchedWriteCvtPD2DQ
626 : X86SchedWriteWidths<WriteCvtSD2I, WriteCvtPD2I,
627                       WriteCvtPD2IY, WriteCvtPD2IZ>;
628def SchedWriteCvtPS2DQ
629 : X86SchedWriteWidths<WriteCvtSS2I, WriteCvtPS2I,
630                       WriteCvtPS2IY, WriteCvtPS2IZ>;
631def SchedWriteCvtPS2PD
632 : X86SchedWriteWidths<WriteCvtSS2SD, WriteCvtPS2PD,
633                       WriteCvtPS2PDY, WriteCvtPS2PDZ>;
634def SchedWriteCvtPD2PS
635 : X86SchedWriteWidths<WriteCvtSD2SS, WriteCvtPD2PS,
636                       WriteCvtPD2PSY, WriteCvtPD2PSZ>;
637
638def SchedWriteVecALU
639 : X86SchedWriteWidths<WriteVecALU, WriteVecALUX, WriteVecALUY, WriteVecALUZ>;
640def SchedWritePHAdd
641 : X86SchedWriteWidths<WritePHAdd, WritePHAddX, WritePHAddY, WritePHAddZ>;
642def SchedWriteVecLogic
643 : X86SchedWriteWidths<WriteVecLogic, WriteVecLogicX,
644                       WriteVecLogicY, WriteVecLogicZ>;
645def SchedWriteVecTest
646 : X86SchedWriteWidths<WriteVecTest, WriteVecTest,
647                       WriteVecTestY, WriteVecTestZ>;
648def SchedWriteVecShift
649 : X86SchedWriteWidths<WriteVecShift, WriteVecShiftX,
650                       WriteVecShiftY, WriteVecShiftZ>;
651def SchedWriteVecShiftImm
652 : X86SchedWriteWidths<WriteVecShiftImm, WriteVecShiftImmX,
653                       WriteVecShiftImmY, WriteVecShiftImmZ>;
654def SchedWriteVarVecShift
655 : X86SchedWriteWidths<WriteVarVecShift, WriteVarVecShift,
656                       WriteVarVecShiftY, WriteVarVecShiftZ>;
657def SchedWriteVecIMul
658 : X86SchedWriteWidths<WriteVecIMul, WriteVecIMulX,
659                       WriteVecIMulY, WriteVecIMulZ>;
660def SchedWritePMULLD
661 : X86SchedWriteWidths<WritePMULLD, WritePMULLD,
662                       WritePMULLDY, WritePMULLDZ>;
663def SchedWriteMPSAD
664 : X86SchedWriteWidths<WriteMPSAD, WriteMPSAD,
665                       WriteMPSADY, WriteMPSADZ>;
666def SchedWritePSADBW
667 : X86SchedWriteWidths<WritePSADBW, WritePSADBWX,
668                       WritePSADBWY, WritePSADBWZ>;
669
670def SchedWriteShuffle
671 : X86SchedWriteWidths<WriteShuffle, WriteShuffleX,
672                       WriteShuffleY, WriteShuffleZ>;
673def SchedWriteVarShuffle
674 : X86SchedWriteWidths<WriteVarShuffle, WriteVarShuffleX,
675                       WriteVarShuffleY, WriteVarShuffleZ>;
676def SchedWriteBlend
677 : X86SchedWriteWidths<WriteBlend, WriteBlend, WriteBlendY, WriteBlendZ>;
678def SchedWriteVarBlend
679 : X86SchedWriteWidths<WriteVarBlend, WriteVarBlend,
680                       WriteVarBlendY, WriteVarBlendZ>;
681
682// Vector size wrappers.
683def SchedWriteFAddSizes
684 : X86SchedWriteSizes<SchedWriteFAdd, SchedWriteFAdd64>;
685def SchedWriteFCmpSizes
686 : X86SchedWriteSizes<SchedWriteFCmp, SchedWriteFCmp64>;
687def SchedWriteFMulSizes
688 : X86SchedWriteSizes<SchedWriteFMul, SchedWriteFMul64>;
689def SchedWriteFDivSizes
690 : X86SchedWriteSizes<SchedWriteFDiv, SchedWriteFDiv64>;
691def SchedWriteFSqrtSizes
692 : X86SchedWriteSizes<SchedWriteFSqrt, SchedWriteFSqrt64>;
693def SchedWriteFLogicSizes
694 : X86SchedWriteSizes<SchedWriteFLogic, SchedWriteFLogic>;
695def SchedWriteFShuffleSizes
696 : X86SchedWriteSizes<SchedWriteFShuffle, SchedWriteFShuffle>;
697
698//===----------------------------------------------------------------------===//
699// Generic Processor Scheduler Models.
700
701// IssueWidth is analogous to the number of decode units. Core and its
702// descendents, including Nehalem and SandyBridge have 4 decoders.
703// Resources beyond the decoder operate on micro-ops and are bufferred
704// so adjacent micro-ops don't directly compete.
705//
706// MicroOpBufferSize > 1 indicates that RAW dependencies can be
707// decoded in the same cycle. The value 32 is a reasonably arbitrary
708// number of in-flight instructions.
709//
710// HighLatency=10 is optimistic. X86InstrInfo::isHighLatencyDef
711// indicates high latency opcodes. Alternatively, InstrItinData
712// entries may be included here to define specific operand
713// latencies. Since these latencies are not used for pipeline hazards,
714// they do not need to be exact.
715//
716// The GenericX86Model contains no instruction schedules
717// and disables PostRAScheduler.
718class GenericX86Model : SchedMachineModel {
719  let IssueWidth = 4;
720  let MicroOpBufferSize = 32;
721  let LoadLatency = 4;
722  let HighLatency = 10;
723  let PostRAScheduler = 0;
724  let CompleteModel = 0;
725}
726
727def GenericModel : GenericX86Model;
728
729// Define a model with the PostRAScheduler enabled.
730def GenericPostRAModel : GenericX86Model {
731  let PostRAScheduler = 1;
732}
733