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