blob: 25c14f5c08a77a148d7d9cf8d79261c7a0417e6f [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
22// Most instructions can fold loads, so almost every SchedWrite comes in two
23// variants: With and without a folded load.
24// An X86FoldableSchedWrite holds a reference to the corresponding SchedWrite
25// with a folded load.
26class X86FoldableSchedWrite : SchedWrite {
27 // The SchedWrite to use when a load is folded into the instruction.
28 SchedWrite Folded;
29}
30
31// Multiclass that produces a linked pair of SchedWrites.
32multiclass X86SchedWritePair {
33 // Register-Memory operation.
34 def Ld : SchedWrite;
35 // Register-Register operation.
36 def NAME : X86FoldableSchedWrite {
37 let Folded = !cast<SchedWrite>(NAME#"Ld");
38 }
39}
40
Simon Pilgrim3c354082018-04-30 18:18:38 +000041// Multiclass that wraps X86FoldableSchedWrite for each vector width.
42class X86SchedWriteWidths<X86FoldableSchedWrite sScl,
43 X86FoldableSchedWrite s128,
44 X86FoldableSchedWrite s256,
45 X86FoldableSchedWrite s512> {
46 X86FoldableSchedWrite Scl = sScl; // Scalar float/double operations.
47 X86FoldableSchedWrite MMX = sScl; // MMX operations.
48 X86FoldableSchedWrite XMM = s128; // XMM operations.
49 X86FoldableSchedWrite YMM = s256; // YMM operations.
50 X86FoldableSchedWrite ZMM = s512; // ZMM operations.
51}
52
Craig Topperb7baa352018-04-08 17:53:18 +000053// Loads, stores, and moves, not folded with other operations.
54def WriteLoad : SchedWrite;
55def WriteStore : SchedWrite;
56def WriteMove : SchedWrite;
57
Simon Pilgrima271c542017-05-03 15:42:29 +000058// Arithmetic.
59defm WriteALU : X86SchedWritePair; // Simple integer ALU op.
Craig Topperb7baa352018-04-08 17:53:18 +000060def WriteALURMW : WriteSequence<[WriteALULd, WriteStore]>;
Simon Pilgrima271c542017-05-03 15:42:29 +000061defm WriteIMul : X86SchedWritePair; // Integer multiplication.
62def WriteIMulH : SchedWrite; // Integer multiplication, high part.
63defm WriteIDiv : X86SchedWritePair; // Integer division.
64def WriteLEA : SchedWrite; // LEA instructions can't fold loads.
65
Simon Pilgrimf33d9052018-03-26 18:19:28 +000066defm WriteBitScan : X86SchedWritePair; // Bit scan forward/reverse.
67defm WritePOPCNT : X86SchedWritePair; // Bit population count.
68defm WriteLZCNT : X86SchedWritePair; // Leading zero count.
69defm WriteTZCNT : X86SchedWritePair; // Trailing zero count.
Craig Topperb7baa352018-04-08 17:53:18 +000070defm WriteCMOV : X86SchedWritePair; // Conditional move.
71def WriteSETCC : SchedWrite; // Set register based on condition code.
72def WriteSETCCStore : SchedWrite;
Simon Pilgrimf33d9052018-03-26 18:19:28 +000073
Simon Pilgrima271c542017-05-03 15:42:29 +000074// Integer shifts and rotates.
75defm WriteShift : X86SchedWritePair;
76
Craig Topper89310f52018-03-29 20:41:39 +000077// BMI1 BEXTR, BMI2 BZHI
78defm WriteBEXTR : X86SchedWritePair;
79defm WriteBZHI : X86SchedWritePair;
80
Simon Pilgrima271c542017-05-03 15:42:29 +000081// Idioms that clear a register, like xorps %xmm0, %xmm0.
82// These can often bypass execution ports completely.
83def WriteZero : SchedWrite;
84
85// Branches don't produce values, so they have no latency, but they still
86// consume resources. Indirect branches can fold loads.
87defm WriteJump : X86SchedWritePair;
88
89// Floating point. This covers both scalar and vector operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +000090def WriteFLoad : SchedWrite;
91def WriteFStore : SchedWrite;
92def WriteFMove : SchedWrite;
Simon Pilgrim86e3c2692018-04-17 07:22:44 +000093defm WriteFAdd : X86SchedWritePair; // Floating point add/sub.
Simon Pilgrim5269167f2018-05-01 16:13:42 +000094defm WriteFAddY : X86SchedWritePair; // Floating point add/sub (YMM/ZMM).
Simon Pilgrim86e3c2692018-04-17 07:22:44 +000095defm WriteFCmp : X86SchedWritePair; // Floating point compare.
Simon Pilgrimc546f942018-05-01 16:50:16 +000096defm WriteFCmpY : X86SchedWritePair; // Floating point compare (YMM/ZMM).
Simon Pilgrim86e3c2692018-04-17 07:22:44 +000097defm WriteFCom : X86SchedWritePair; // Floating point compare to flags.
Simon Pilgrima271c542017-05-03 15:42:29 +000098defm WriteFMul : X86SchedWritePair; // Floating point multiplication.
Simon Pilgrim21caf012018-05-01 18:22:53 +000099defm WriteFMulY : X86SchedWritePair; // Floating point multiplication (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000100defm WriteFDiv : X86SchedWritePair; // Floating point division.
Simon Pilgrim21caf012018-05-01 18:22:53 +0000101defm WriteFDivY : X86SchedWritePair; // Floating point division (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000102defm WriteFSqrt : X86SchedWritePair; // Floating point square root.
Simon Pilgrimc7088682018-05-01 18:06:07 +0000103defm WriteFSqrtY : X86SchedWritePair; // Floating point square root (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000104defm WriteFRcp : X86SchedWritePair; // Floating point reciprocal estimate.
Simon Pilgrimc7088682018-05-01 18:06:07 +0000105defm WriteFRcpY : X86SchedWritePair; // Floating point reciprocal estimate (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000106defm WriteFRsqrt : X86SchedWritePair; // Floating point reciprocal square root estimate.
Simon Pilgrimc7088682018-05-01 18:06:07 +0000107defm WriteFRsqrtY: X86SchedWritePair; // Floating point reciprocal square root estimate (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000108defm WriteFMA : X86SchedWritePair; // Fused Multiply Add.
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000109defm WriteFMAS : X86SchedWritePair; // Fused Multiply Add (Scalar).
110defm WriteFMAY : X86SchedWritePair; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000111defm WriteFSign : X86SchedWritePair; // Floating point fabs/fchs.
112defm WriteFLogic : X86SchedWritePair; // Floating point and/or/xor logicals.
113defm WriteFLogicY : X86SchedWritePair; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000114defm WriteFShuffle : X86SchedWritePair; // Floating point vector shuffles.
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000115defm WriteFShuffleY : X86SchedWritePair; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000116defm WriteFVarShuffle : X86SchedWritePair; // Floating point vector variable shuffles.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000117defm WriteFVarShuffleY : X86SchedWritePair; // Floating point vector variable shuffles (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000118defm WriteFBlend : X86SchedWritePair; // Floating point vector blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000119defm WriteFBlendY : X86SchedWritePair; // Floating point vector blends (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000120defm WriteFVarBlend : X86SchedWritePair; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000121defm WriteFVarBlendY : X86SchedWritePair; // Fp vector variable blends (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000122
123// FMA Scheduling helper class.
124class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
125
Andrew V. Tischenko8cb1d092017-06-08 16:44:13 +0000126// Horizontal Add/Sub (float and integer)
127defm WriteFHAdd : X86SchedWritePair;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000128defm WriteFHAddY : X86SchedWritePair; // YMM/ZMM.
129defm WritePHAdd : X86SchedWritePair;
Andrew V. Tischenko8cb1d092017-06-08 16:44:13 +0000130
Simon Pilgrima271c542017-05-03 15:42:29 +0000131// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000132def WriteVecLoad : SchedWrite;
133def WriteVecStore : SchedWrite;
134def WriteVecMove : SchedWrite;
Simon Pilgrima271c542017-05-03 15:42:29 +0000135defm WriteVecALU : X86SchedWritePair; // Vector integer ALU op, no logicals.
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000136defm WriteVecLogic : X86SchedWritePair; // Vector integer and/or/xor logicals.
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000137defm WriteVecLogicY: X86SchedWritePair; // Vector integer and/or/xor logicals (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000138defm WriteVecShift : X86SchedWritePair; // Vector integer shifts.
139defm WriteVecIMul : X86SchedWritePair; // Vector integer multiply.
Craig Topper13a0f832018-03-31 04:54:32 +0000140defm WritePMULLD : X86SchedWritePair; // PMULLD
Simon Pilgrima271c542017-05-03 15:42:29 +0000141defm WriteShuffle : X86SchedWritePair; // Vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000142defm WriteVarShuffle : X86SchedWritePair; // Vector variable shuffles.
Simon Pilgrima271c542017-05-03 15:42:29 +0000143defm WriteBlend : X86SchedWritePair; // Vector blends.
144defm WriteVarBlend : X86SchedWritePair; // Vector variable blends.
Craig Toppere56a2fc2018-04-17 19:35:19 +0000145defm WritePSADBW : X86SchedWritePair; // Vector PSADBW.
Simon Pilgrima271c542017-05-03 15:42:29 +0000146defm WriteMPSAD : X86SchedWritePair; // Vector MPSAD.
Simon Pilgrim27bc83e2018-04-24 18:49:25 +0000147defm WritePHMINPOS : X86SchedWritePair; // Vector PHMINPOS.
Simon Pilgrima271c542017-05-03 15:42:29 +0000148
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000149// Vector insert/extract operations.
150defm WriteVecInsert : X86SchedWritePair; // Insert gpr to vector element.
151def WriteVecExtract : SchedWrite; // Extract vector element to gpr.
152def WriteVecExtractSt : SchedWrite; // Extract vector element and store.
153
Simon Pilgrima2f26782018-03-27 20:38:54 +0000154// MOVMSK operations.
155def WriteFMOVMSK : SchedWrite;
156def WriteVecMOVMSK : SchedWrite;
157def WriteMMXMOVMSK : SchedWrite;
158
Simon Pilgrima271c542017-05-03 15:42:29 +0000159// Conversion between integer and float.
160defm WriteCvtF2I : X86SchedWritePair; // Float -> Integer.
161defm WriteCvtI2F : X86SchedWritePair; // Integer -> Float.
162defm WriteCvtF2F : X86SchedWritePair; // Float -> Float size conversion.
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000163def WriteCvtF2FSt : SchedWrite; // // Float -> Float + store size conversion.
Simon Pilgrima271c542017-05-03 15:42:29 +0000164
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000165// CRC32 instruction.
166defm WriteCRC32 : X86SchedWritePair;
167
Simon Pilgrima271c542017-05-03 15:42:29 +0000168// Strings instructions.
169// Packed Compare Implicit Length Strings, Return Mask
170defm WritePCmpIStrM : X86SchedWritePair;
171// Packed Compare Explicit Length Strings, Return Mask
172defm WritePCmpEStrM : X86SchedWritePair;
173// Packed Compare Implicit Length Strings, Return Index
174defm WritePCmpIStrI : X86SchedWritePair;
175// Packed Compare Explicit Length Strings, Return Index
176defm WritePCmpEStrI : X86SchedWritePair;
177
178// AES instructions.
179defm WriteAESDecEnc : X86SchedWritePair; // Decryption, encryption.
180defm WriteAESIMC : X86SchedWritePair; // InvMixColumn.
181defm WriteAESKeyGen : X86SchedWritePair; // Key Generation.
182
183// Carry-less multiplication instructions.
184defm WriteCLMul : X86SchedWritePair;
185
Craig Topper05242bf2018-04-21 18:07:36 +0000186// Load/store MXCSR
187def WriteLDMXCSR : SchedWrite;
188def WriteSTMXCSR : SchedWrite;
189
Simon Pilgrima271c542017-05-03 15:42:29 +0000190// Catch-all for expensive system instructions.
191def WriteSystem : SchedWrite;
192
193// AVX2.
194defm WriteFShuffle256 : X86SchedWritePair; // Fp 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000195defm WriteFVarShuffle256 : X86SchedWritePair; // Fp 256-bit width variable shuffles.
Simon Pilgrima271c542017-05-03 15:42:29 +0000196defm WriteShuffle256 : X86SchedWritePair; // 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000197defm WriteVarShuffle256 : X86SchedWritePair; // 256-bit width vector variable shuffles.
Simon Pilgrima271c542017-05-03 15:42:29 +0000198defm WriteVarVecShift : X86SchedWritePair; // Variable vector shifts.
199
200// Old microcoded instructions that nobody use.
201def WriteMicrocoded : SchedWrite;
202
203// Fence instructions.
204def WriteFence : SchedWrite;
205
206// Nop, not very useful expect it provides a model for nops!
207def WriteNop : SchedWrite;
208
Simon Pilgrim3c354082018-04-30 18:18:38 +0000209// Vector width wrappers.
210def SchedWriteFAdd
Simon Pilgrim5269167f2018-05-01 16:13:42 +0000211 : X86SchedWriteWidths<WriteFAdd, WriteFAdd, WriteFAddY, WriteFAddY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000212def SchedWriteFCmp
Simon Pilgrimc546f942018-05-01 16:50:16 +0000213 : X86SchedWriteWidths<WriteFCmp, WriteFCmp, WriteFCmpY, WriteFCmpY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000214def SchedWriteFMul
Simon Pilgrim21caf012018-05-01 18:22:53 +0000215 : X86SchedWriteWidths<WriteFMul, WriteFMul, WriteFMulY, WriteFMulY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000216def SchedWriteFDiv
Simon Pilgrim21caf012018-05-01 18:22:53 +0000217 : X86SchedWriteWidths<WriteFDiv, WriteFDiv, WriteFDivY, WriteFDivY>;
Simon Pilgrimc7088682018-05-01 18:06:07 +0000218def SchedWriteFSqrt
219 : X86SchedWriteWidths<WriteFSqrt, WriteFSqrt, WriteFSqrtY, WriteFSqrtY>;
Simon Pilgrim1b7a80d2018-05-01 15:57:17 +0000220def SchedWriteFRcp
Simon Pilgrimc7088682018-05-01 18:06:07 +0000221 : X86SchedWriteWidths<WriteFRcp, WriteFRcp, WriteFRcpY, WriteFRcpY>;
Simon Pilgrim1b7a80d2018-05-01 15:57:17 +0000222def SchedWriteFRsqrt
Simon Pilgrimc7088682018-05-01 18:06:07 +0000223 : X86SchedWriteWidths<WriteFRsqrt, WriteFRsqrt, WriteFRsqrtY, WriteFRsqrtY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000224def SchedWriteFLogic
225 : X86SchedWriteWidths<WriteFLogic, WriteFLogic, WriteFLogicY, WriteFLogicY>;
226
227def SchedWriteFShuffle
228 : X86SchedWriteWidths<WriteFShuffle, WriteFShuffle,
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000229 WriteFShuffleY, WriteFShuffleY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000230def SchedWriteFVarShuffle
231 : X86SchedWriteWidths<WriteFVarShuffle, WriteFVarShuffle,
232 WriteFVarShuffleY, WriteFVarShuffleY>;
233def SchedWriteFBlend
234 : X86SchedWriteWidths<WriteFBlend, WriteFBlend, WriteFBlendY, WriteFBlendY>;
235def SchedWriteFVarBlend
236 : X86SchedWriteWidths<WriteFVarBlend, WriteFVarBlend,
237 WriteFVarBlendY, WriteFVarBlendY>;
238
239def SchedWriteVecALU
240 : X86SchedWriteWidths<WriteVecALU, WriteVecALU, WriteVecALU, WriteVecALU>;
241def SchedWriteVecLogic
242 : X86SchedWriteWidths<WriteVecLogic, WriteVecLogic,
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000243 WriteVecLogicY, WriteVecLogicY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000244def SchedWriteVecShift
245 : X86SchedWriteWidths<WriteVecShift, WriteVecShift,
246 WriteVecShift, WriteVecShift>;
Simon Pilgrime8671ef2018-05-02 12:27:54 +0000247def SchedWriteVarVecShift
248 : X86SchedWriteWidths<WriteVarVecShift, WriteVarVecShift,
249 WriteVarVecShift, WriteVarVecShift>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000250def SchedWriteVecIMul
251 : X86SchedWriteWidths<WriteVecIMul, WriteVecIMul,
252 WriteVecIMul, WriteVecIMul>;
253def SchedWritePMULLD
254 : X86SchedWriteWidths<WritePMULLD, WritePMULLD,
255 WritePMULLD, WritePMULLD>;
Simon Pilgrime8671ef2018-05-02 12:27:54 +0000256def SchedWriteMPSAD
257 : X86SchedWriteWidths<WriteMPSAD, WriteMPSAD,
258 WriteMPSAD, WriteMPSAD>;
259def SchedWritePSADBW
260 : X86SchedWriteWidths<WritePSADBW, WritePSADBW,
261 WritePSADBW, WritePSADBW>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000262
263def SchedWriteShuffle
264 : X86SchedWriteWidths<WriteShuffle, WriteShuffle,
265 WriteShuffle, WriteShuffle>;
266def SchedWriteVarShuffle
267 : X86SchedWriteWidths<WriteVarShuffle, WriteVarShuffle,
268 WriteVarShuffle, WriteVarShuffle>;
269def SchedWriteBlend
270 : X86SchedWriteWidths<WriteBlend, WriteBlend, WriteBlend, WriteBlend>;
271def SchedWriteVarBlend
272 : X86SchedWriteWidths<WriteVarBlend, WriteVarBlend,
273 WriteVarBlend, WriteVarBlend>;
274
Simon Pilgrima271c542017-05-03 15:42:29 +0000275//===----------------------------------------------------------------------===//
Simon Pilgrim35935c02018-04-12 18:46:15 +0000276// Generic Processor Scheduler Models.
Simon Pilgrima271c542017-05-03 15:42:29 +0000277
278// IssueWidth is analogous to the number of decode units. Core and its
279// descendents, including Nehalem and SandyBridge have 4 decoders.
280// Resources beyond the decoder operate on micro-ops and are bufferred
281// so adjacent micro-ops don't directly compete.
282//
283// MicroOpBufferSize > 1 indicates that RAW dependencies can be
284// decoded in the same cycle. The value 32 is a reasonably arbitrary
285// number of in-flight instructions.
286//
287// HighLatency=10 is optimistic. X86InstrInfo::isHighLatencyDef
288// indicates high latency opcodes. Alternatively, InstrItinData
289// entries may be included here to define specific operand
290// latencies. Since these latencies are not used for pipeline hazards,
291// they do not need to be exact.
292//
Simon Pilgrime0c78682018-04-13 14:31:57 +0000293// The GenericX86Model contains no instruction schedules
Simon Pilgrima271c542017-05-03 15:42:29 +0000294// and disables PostRAScheduler.
295class GenericX86Model : SchedMachineModel {
296 let IssueWidth = 4;
297 let MicroOpBufferSize = 32;
298 let LoadLatency = 4;
299 let HighLatency = 10;
300 let PostRAScheduler = 0;
301 let CompleteModel = 0;
302}
303
304def GenericModel : GenericX86Model;
305
306// Define a model with the PostRAScheduler enabled.
307def GenericPostRAModel : GenericX86Model {
308 let PostRAScheduler = 1;
309}
310