blob: bc76bb48848e1c355ced09e4782ad76a9559d7b2 [file] [log] [blame]
Simon Pilgrima271c542017-05-03 15:42:29 +00001//===-- X86Schedule.td - X86 Scheduling Definitions --------*- tablegen -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Simon Pilgrim963bf4d2018-04-13 14:24:06 +000010//===----------------------------------------------------------------------===//
Simon Pilgrima271c542017-05-03 15:42:29 +000011// InstrSchedModel annotations for out-of-order CPUs.
Simon Pilgrima271c542017-05-03 15:42:29 +000012
13// Instructions with folded loads need to read the memory operand immediately,
14// but other register operands don't have to be read until the load is ready.
15// These operands are marked with ReadAfterLd.
16def ReadAfterLd : SchedRead;
17
18// Instructions with both a load and a store folded are modeled as a folded
19// load + WriteRMW.
20def WriteRMW : SchedWrite;
21
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +000022// Helper to set SchedWrite ExePorts/Latency/ResourceCycles/NumMicroOps.
23multiclass X86WriteRes<SchedWrite SchedRW,
24 list<ProcResourceKind> ExePorts,
25 int Lat, list<int> Res, int UOps> {
26 def : WriteRes<SchedRW, ExePorts> {
27 let Latency = Lat;
28 let ResourceCycles = Res;
29 let NumMicroOps = UOps;
30 }
31}
32
Simon Pilgrima271c542017-05-03 15:42:29 +000033// Most instructions can fold loads, so almost every SchedWrite comes in two
34// variants: With and without a folded load.
35// An X86FoldableSchedWrite holds a reference to the corresponding SchedWrite
36// with a folded load.
37class X86FoldableSchedWrite : SchedWrite {
38 // The SchedWrite to use when a load is folded into the instruction.
39 SchedWrite Folded;
40}
41
42// Multiclass that produces a linked pair of SchedWrites.
43multiclass X86SchedWritePair {
44 // Register-Memory operation.
45 def Ld : SchedWrite;
46 // Register-Register operation.
47 def NAME : X86FoldableSchedWrite {
48 let Folded = !cast<SchedWrite>(NAME#"Ld");
49 }
50}
51
Simon Pilgrim3c354082018-04-30 18:18:38 +000052// Multiclass that wraps X86FoldableSchedWrite for each vector width.
53class X86SchedWriteWidths<X86FoldableSchedWrite sScl,
54 X86FoldableSchedWrite s128,
55 X86FoldableSchedWrite s256,
56 X86FoldableSchedWrite s512> {
57 X86FoldableSchedWrite Scl = sScl; // Scalar float/double operations.
58 X86FoldableSchedWrite MMX = sScl; // MMX operations.
59 X86FoldableSchedWrite XMM = s128; // XMM operations.
60 X86FoldableSchedWrite YMM = s256; // YMM operations.
61 X86FoldableSchedWrite ZMM = s512; // ZMM operations.
62}
63
Craig Topperb7baa352018-04-08 17:53:18 +000064// Loads, stores, and moves, not folded with other operations.
65def WriteLoad : SchedWrite;
66def WriteStore : SchedWrite;
67def WriteMove : SchedWrite;
68
Simon Pilgrima271c542017-05-03 15:42:29 +000069// Arithmetic.
70defm WriteALU : X86SchedWritePair; // Simple integer ALU op.
Craig Topperb7baa352018-04-08 17:53:18 +000071def WriteALURMW : WriteSequence<[WriteALULd, WriteStore]>;
Simon Pilgrima271c542017-05-03 15:42:29 +000072defm WriteIMul : X86SchedWritePair; // Integer multiplication.
73def WriteIMulH : SchedWrite; // Integer multiplication, high part.
74defm WriteIDiv : X86SchedWritePair; // Integer division.
75def WriteLEA : SchedWrite; // LEA instructions can't fold loads.
76
Simon Pilgrimf33d9052018-03-26 18:19:28 +000077defm WriteBitScan : X86SchedWritePair; // Bit scan forward/reverse.
78defm WritePOPCNT : X86SchedWritePair; // Bit population count.
79defm WriteLZCNT : X86SchedWritePair; // Leading zero count.
80defm WriteTZCNT : X86SchedWritePair; // Trailing zero count.
Craig Topperb7baa352018-04-08 17:53:18 +000081defm WriteCMOV : X86SchedWritePair; // Conditional move.
82def WriteSETCC : SchedWrite; // Set register based on condition code.
83def WriteSETCCStore : SchedWrite;
Simon Pilgrimf33d9052018-03-26 18:19:28 +000084
Simon Pilgrima271c542017-05-03 15:42:29 +000085// Integer shifts and rotates.
86defm WriteShift : X86SchedWritePair;
87
Craig Topper89310f52018-03-29 20:41:39 +000088// BMI1 BEXTR, BMI2 BZHI
89defm WriteBEXTR : X86SchedWritePair;
90defm WriteBZHI : X86SchedWritePair;
91
Simon Pilgrima271c542017-05-03 15:42:29 +000092// Idioms that clear a register, like xorps %xmm0, %xmm0.
93// These can often bypass execution ports completely.
94def WriteZero : SchedWrite;
95
96// Branches don't produce values, so they have no latency, but they still
97// consume resources. Indirect branches can fold loads.
98defm WriteJump : X86SchedWritePair;
99
100// Floating point. This covers both scalar and vector operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000101def WriteFLoad : SchedWrite;
102def WriteFStore : SchedWrite;
103def WriteFMove : SchedWrite;
Simon Pilgrim86e3c2692018-04-17 07:22:44 +0000104defm WriteFAdd : X86SchedWritePair; // Floating point add/sub.
Simon Pilgrim5269167f2018-05-01 16:13:42 +0000105defm WriteFAddY : X86SchedWritePair; // Floating point add/sub (YMM/ZMM).
Simon Pilgrim86e3c2692018-04-17 07:22:44 +0000106defm WriteFCmp : X86SchedWritePair; // Floating point compare.
Simon Pilgrimc546f942018-05-01 16:50:16 +0000107defm WriteFCmpY : X86SchedWritePair; // Floating point compare (YMM/ZMM).
Simon Pilgrim86e3c2692018-04-17 07:22:44 +0000108defm WriteFCom : X86SchedWritePair; // Floating point compare to flags.
Simon Pilgrima271c542017-05-03 15:42:29 +0000109defm WriteFMul : X86SchedWritePair; // Floating point multiplication.
Simon Pilgrim21caf012018-05-01 18:22:53 +0000110defm WriteFMulY : X86SchedWritePair; // Floating point multiplication (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000111defm WriteFDiv : X86SchedWritePair; // Floating point division.
Simon Pilgrim21caf012018-05-01 18:22:53 +0000112defm WriteFDivY : X86SchedWritePair; // Floating point division (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000113defm WriteFSqrt : X86SchedWritePair; // Floating point square root.
Simon Pilgrimc7088682018-05-01 18:06:07 +0000114defm WriteFSqrtY : X86SchedWritePair; // Floating point square root (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000115defm WriteFRcp : X86SchedWritePair; // Floating point reciprocal estimate.
Simon Pilgrimc7088682018-05-01 18:06:07 +0000116defm WriteFRcpY : X86SchedWritePair; // Floating point reciprocal estimate (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000117defm WriteFRsqrt : X86SchedWritePair; // Floating point reciprocal square root estimate.
Simon Pilgrimc7088682018-05-01 18:06:07 +0000118defm WriteFRsqrtY: X86SchedWritePair; // Floating point reciprocal square root estimate (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000119defm WriteFMA : X86SchedWritePair; // Fused Multiply Add.
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000120defm WriteFMAS : X86SchedWritePair; // Fused Multiply Add (Scalar).
121defm WriteFMAY : X86SchedWritePair; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000122defm WriteDPPD : X86SchedWritePair; // Floating point double dot product.
123defm WriteDPPS : X86SchedWritePair; // Floating point single dot product.
124defm WriteDPPSY : X86SchedWritePair; // Floating point single dot product (YMM).
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000125defm WriteFSign : X86SchedWritePair; // Floating point fabs/fchs.
126defm WriteFLogic : X86SchedWritePair; // Floating point and/or/xor logicals.
127defm WriteFLogicY : X86SchedWritePair; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000128defm WriteFShuffle : X86SchedWritePair; // Floating point vector shuffles.
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000129defm WriteFShuffleY : X86SchedWritePair; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000130defm WriteFVarShuffle : X86SchedWritePair; // Floating point vector variable shuffles.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000131defm WriteFVarShuffleY : X86SchedWritePair; // Floating point vector variable shuffles (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000132defm WriteFBlend : X86SchedWritePair; // Floating point vector blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000133defm WriteFBlendY : X86SchedWritePair; // Floating point vector blends (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000134defm WriteFVarBlend : X86SchedWritePair; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000135defm WriteFVarBlendY : X86SchedWritePair; // Fp vector variable blends (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000136
137// FMA Scheduling helper class.
138class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
139
Andrew V. Tischenko8cb1d092017-06-08 16:44:13 +0000140// Horizontal Add/Sub (float and integer)
141defm WriteFHAdd : X86SchedWritePair;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000142defm WriteFHAddY : X86SchedWritePair; // YMM/ZMM.
143defm WritePHAdd : X86SchedWritePair;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000144defm WritePHAddY : X86SchedWritePair; // YMM/ZMM.
Andrew V. Tischenko8cb1d092017-06-08 16:44:13 +0000145
Simon Pilgrima271c542017-05-03 15:42:29 +0000146// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000147def WriteVecLoad : SchedWrite;
148def WriteVecStore : SchedWrite;
149def WriteVecMove : SchedWrite;
Simon Pilgrima271c542017-05-03 15:42:29 +0000150defm WriteVecALU : X86SchedWritePair; // Vector integer ALU op, no logicals.
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000151defm WriteVecALUY : X86SchedWritePair; // Vector integer ALU op, no logicals (YMM/ZMM).
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000152defm WriteVecLogic : X86SchedWritePair; // Vector integer and/or/xor logicals.
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000153defm WriteVecLogicY: X86SchedWritePair; // Vector integer and/or/xor logicals (YMM/ZMM).
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000154defm WriteVecShift : X86SchedWritePair; // Vector integer shifts (default).
155defm WriteVecShiftX : X86SchedWritePair; // Vector integer shifts (XMM).
156defm WriteVecShiftY : X86SchedWritePair; // Vector integer shifts (YMM/ZMM).
157defm WriteVecShiftImmX: X86SchedWritePair; // Vector integer immediate shifts (XMM).
158defm WriteVecShiftImmY: X86SchedWritePair; // Vector integer immediate shifts (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000159defm WriteVecIMul : X86SchedWritePair; // Vector integer multiply.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000160defm WriteVecIMulY : X86SchedWritePair; // Vector integer multiply (YMM/ZMM).
161defm WritePMULLD : X86SchedWritePair; // Vector PMULLD.
162defm WritePMULLDY : X86SchedWritePair; // Vector PMULLD (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000163defm WriteShuffle : X86SchedWritePair; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000164defm WriteShuffleY : X86SchedWritePair; // Vector shuffles (YMM/ZMM).
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000165defm WriteVarShuffle : X86SchedWritePair; // Vector variable shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000166defm WriteVarShuffleY : X86SchedWritePair; // Vector variable shuffles (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000167defm WriteBlend : X86SchedWritePair; // Vector blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000168defm WriteBlendY : X86SchedWritePair; // Vector blends (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000169defm WriteVarBlend : X86SchedWritePair; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000170defm WriteVarBlendY : X86SchedWritePair; // Vector variable blends (YMM/ZMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000171defm WritePSADBW : X86SchedWritePair; // Vector PSADBW.
172defm WritePSADBWY : X86SchedWritePair; // Vector PSADBW (YMM/ZMM).
173defm WriteMPSAD : X86SchedWritePair; // Vector MPSAD.
174defm WriteMPSADY : X86SchedWritePair; // Vector MPSAD (YMM/ZMM).
Simon Pilgrim27bc83e2018-04-24 18:49:25 +0000175defm WritePHMINPOS : X86SchedWritePair; // Vector PHMINPOS.
Simon Pilgrima271c542017-05-03 15:42:29 +0000176
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000177// Vector insert/extract operations.
178defm WriteVecInsert : X86SchedWritePair; // Insert gpr to vector element.
179def WriteVecExtract : SchedWrite; // Extract vector element to gpr.
180def WriteVecExtractSt : SchedWrite; // Extract vector element and store.
181
Simon Pilgrima2f26782018-03-27 20:38:54 +0000182// MOVMSK operations.
183def WriteFMOVMSK : SchedWrite;
184def WriteVecMOVMSK : SchedWrite;
185def WriteMMXMOVMSK : SchedWrite;
186
Simon Pilgrima271c542017-05-03 15:42:29 +0000187// Conversion between integer and float.
188defm WriteCvtF2I : X86SchedWritePair; // Float -> Integer.
189defm WriteCvtI2F : X86SchedWritePair; // Integer -> Float.
190defm WriteCvtF2F : X86SchedWritePair; // Float -> Float size conversion.
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000191def WriteCvtF2FSt : SchedWrite; // // Float -> Float + store size conversion.
Simon Pilgrima271c542017-05-03 15:42:29 +0000192
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000193// CRC32 instruction.
194defm WriteCRC32 : X86SchedWritePair;
195
Simon Pilgrima271c542017-05-03 15:42:29 +0000196// Strings instructions.
197// Packed Compare Implicit Length Strings, Return Mask
198defm WritePCmpIStrM : X86SchedWritePair;
199// Packed Compare Explicit Length Strings, Return Mask
200defm WritePCmpEStrM : X86SchedWritePair;
201// Packed Compare Implicit Length Strings, Return Index
202defm WritePCmpIStrI : X86SchedWritePair;
203// Packed Compare Explicit Length Strings, Return Index
204defm WritePCmpEStrI : X86SchedWritePair;
205
206// AES instructions.
207defm WriteAESDecEnc : X86SchedWritePair; // Decryption, encryption.
208defm WriteAESIMC : X86SchedWritePair; // InvMixColumn.
209defm WriteAESKeyGen : X86SchedWritePair; // Key Generation.
210
211// Carry-less multiplication instructions.
212defm WriteCLMul : X86SchedWritePair;
213
Craig Topper05242bf2018-04-21 18:07:36 +0000214// Load/store MXCSR
215def WriteLDMXCSR : SchedWrite;
216def WriteSTMXCSR : SchedWrite;
217
Simon Pilgrima271c542017-05-03 15:42:29 +0000218// Catch-all for expensive system instructions.
219def WriteSystem : SchedWrite;
220
221// AVX2.
222defm WriteFShuffle256 : X86SchedWritePair; // Fp 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000223defm WriteFVarShuffle256 : X86SchedWritePair; // Fp 256-bit width variable shuffles.
Simon Pilgrima271c542017-05-03 15:42:29 +0000224defm WriteShuffle256 : X86SchedWritePair; // 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000225defm WriteVarShuffle256 : X86SchedWritePair; // 256-bit width vector variable shuffles.
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000226defm WriteVarVecShift : X86SchedWritePair; // Variable vector shifts.
227defm WriteVarVecShiftY : X86SchedWritePair; // Variable vector shifts (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000228
229// Old microcoded instructions that nobody use.
230def WriteMicrocoded : SchedWrite;
231
232// Fence instructions.
233def WriteFence : SchedWrite;
234
235// Nop, not very useful expect it provides a model for nops!
236def WriteNop : SchedWrite;
237
Simon Pilgrim3c354082018-04-30 18:18:38 +0000238// Vector width wrappers.
239def SchedWriteFAdd
Simon Pilgrim5269167f2018-05-01 16:13:42 +0000240 : X86SchedWriteWidths<WriteFAdd, WriteFAdd, WriteFAddY, WriteFAddY>;
Simon Pilgrim342ac8c2018-05-03 09:11:32 +0000241def SchedWriteFHAdd
242 : X86SchedWriteWidths<WriteFHAdd, WriteFHAdd, WriteFHAddY, WriteFHAddY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000243def SchedWriteFCmp
Simon Pilgrimc546f942018-05-01 16:50:16 +0000244 : X86SchedWriteWidths<WriteFCmp, WriteFCmp, WriteFCmpY, WriteFCmpY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000245def SchedWriteFMul
Simon Pilgrim21caf012018-05-01 18:22:53 +0000246 : X86SchedWriteWidths<WriteFMul, WriteFMul, WriteFMulY, WriteFMulY>;
Simon Pilgrima1f1a3b2018-05-02 13:32:56 +0000247def SchedWriteFMA
248 : X86SchedWriteWidths<WriteFMAS, WriteFMA, WriteFMAY, WriteFMAY>;
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000249def SchedWriteDPPD
250 : X86SchedWriteWidths<WriteDPPD, WriteDPPD, WriteDPPD, WriteDPPD>;
251def SchedWriteDPPS
252 : X86SchedWriteWidths<WriteDPPS, WriteDPPS, WriteDPPSY, WriteDPPSY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000253def SchedWriteFDiv
Simon Pilgrim21caf012018-05-01 18:22:53 +0000254 : X86SchedWriteWidths<WriteFDiv, WriteFDiv, WriteFDivY, WriteFDivY>;
Simon Pilgrimc7088682018-05-01 18:06:07 +0000255def SchedWriteFSqrt
256 : X86SchedWriteWidths<WriteFSqrt, WriteFSqrt, WriteFSqrtY, WriteFSqrtY>;
Simon Pilgrim1b7a80d2018-05-01 15:57:17 +0000257def SchedWriteFRcp
Simon Pilgrimc7088682018-05-01 18:06:07 +0000258 : X86SchedWriteWidths<WriteFRcp, WriteFRcp, WriteFRcpY, WriteFRcpY>;
Simon Pilgrim1b7a80d2018-05-01 15:57:17 +0000259def SchedWriteFRsqrt
Simon Pilgrimc7088682018-05-01 18:06:07 +0000260 : X86SchedWriteWidths<WriteFRsqrt, WriteFRsqrt, WriteFRsqrtY, WriteFRsqrtY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000261def SchedWriteFLogic
262 : X86SchedWriteWidths<WriteFLogic, WriteFLogic, WriteFLogicY, WriteFLogicY>;
263
264def SchedWriteFShuffle
265 : X86SchedWriteWidths<WriteFShuffle, WriteFShuffle,
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000266 WriteFShuffleY, WriteFShuffleY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000267def SchedWriteFVarShuffle
268 : X86SchedWriteWidths<WriteFVarShuffle, WriteFVarShuffle,
269 WriteFVarShuffleY, WriteFVarShuffleY>;
270def SchedWriteFBlend
271 : X86SchedWriteWidths<WriteFBlend, WriteFBlend, WriteFBlendY, WriteFBlendY>;
272def SchedWriteFVarBlend
273 : X86SchedWriteWidths<WriteFVarBlend, WriteFVarBlend,
274 WriteFVarBlendY, WriteFVarBlendY>;
275
276def SchedWriteVecALU
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000277 : X86SchedWriteWidths<WriteVecALU, WriteVecALU, WriteVecALUY, WriteVecALUY>;
Simon Pilgrim342ac8c2018-05-03 09:11:32 +0000278def SchedWritePHAdd
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000279 : X86SchedWriteWidths<WritePHAdd, WritePHAdd, WritePHAddY, WritePHAddY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000280def SchedWriteVecLogic
281 : X86SchedWriteWidths<WriteVecLogic, WriteVecLogic,
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000282 WriteVecLogicY, WriteVecLogicY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000283def SchedWriteVecShift
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000284 : X86SchedWriteWidths<WriteVecShift, WriteVecShiftX,
285 WriteVecShiftY, WriteVecShiftY>;
286def SchedWriteVecShiftImm
287 : X86SchedWriteWidths<WriteVecShift, WriteVecShiftImmX,
288 WriteVecShiftImmY, WriteVecShiftImmY>;
Simon Pilgrime8671ef2018-05-02 12:27:54 +0000289def SchedWriteVarVecShift
290 : X86SchedWriteWidths<WriteVarVecShift, WriteVarVecShift,
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000291 WriteVarVecShiftY, WriteVarVecShiftY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000292def SchedWriteVecIMul
293 : X86SchedWriteWidths<WriteVecIMul, WriteVecIMul,
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000294 WriteVecIMulY, WriteVecIMulY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000295def SchedWritePMULLD
296 : X86SchedWriteWidths<WritePMULLD, WritePMULLD,
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000297 WritePMULLDY, WritePMULLDY>;
Simon Pilgrime8671ef2018-05-02 12:27:54 +0000298def SchedWriteMPSAD
299 : X86SchedWriteWidths<WriteMPSAD, WriteMPSAD,
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000300 WriteMPSADY, WriteMPSADY>;
Simon Pilgrime8671ef2018-05-02 12:27:54 +0000301def SchedWritePSADBW
302 : X86SchedWriteWidths<WritePSADBW, WritePSADBW,
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000303 WritePSADBWY, WritePSADBWY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000304
305def SchedWriteShuffle
306 : X86SchedWriteWidths<WriteShuffle, WriteShuffle,
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000307 WriteShuffleY, WriteShuffleY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000308def SchedWriteVarShuffle
309 : X86SchedWriteWidths<WriteVarShuffle, WriteVarShuffle,
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000310 WriteVarShuffleY, WriteVarShuffleY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000311def SchedWriteBlend
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000312 : X86SchedWriteWidths<WriteBlend, WriteBlend, WriteBlendY, WriteBlendY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000313def SchedWriteVarBlend
314 : X86SchedWriteWidths<WriteVarBlend, WriteVarBlend,
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000315 WriteVarBlendY, WriteVarBlendY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000316
Simon Pilgrima271c542017-05-03 15:42:29 +0000317//===----------------------------------------------------------------------===//
Simon Pilgrim35935c02018-04-12 18:46:15 +0000318// Generic Processor Scheduler Models.
Simon Pilgrima271c542017-05-03 15:42:29 +0000319
320// IssueWidth is analogous to the number of decode units. Core and its
321// descendents, including Nehalem and SandyBridge have 4 decoders.
322// Resources beyond the decoder operate on micro-ops and are bufferred
323// so adjacent micro-ops don't directly compete.
324//
325// MicroOpBufferSize > 1 indicates that RAW dependencies can be
326// decoded in the same cycle. The value 32 is a reasonably arbitrary
327// number of in-flight instructions.
328//
329// HighLatency=10 is optimistic. X86InstrInfo::isHighLatencyDef
330// indicates high latency opcodes. Alternatively, InstrItinData
331// entries may be included here to define specific operand
332// latencies. Since these latencies are not used for pipeline hazards,
333// they do not need to be exact.
334//
Simon Pilgrime0c78682018-04-13 14:31:57 +0000335// The GenericX86Model contains no instruction schedules
Simon Pilgrima271c542017-05-03 15:42:29 +0000336// and disables PostRAScheduler.
337class GenericX86Model : SchedMachineModel {
338 let IssueWidth = 4;
339 let MicroOpBufferSize = 32;
340 let LoadLatency = 4;
341 let HighLatency = 10;
342 let PostRAScheduler = 0;
343 let CompleteModel = 0;
344}
345
346def GenericModel : GenericX86Model;
347
348// Define a model with the PostRAScheduler enabled.
349def GenericPostRAModel : GenericX86Model {
350 let PostRAScheduler = 1;
351}
352