blob: 3a5f324ea598694cf023cd81c907b3a44cda1d81 [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
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +000064// Multiclass that wraps X86SchedWriteWidths for each fp vector type.
65class X86SchedWriteSizes<X86SchedWriteWidths sPS,
66 X86SchedWriteWidths sPD> {
67 X86SchedWriteWidths PS = sPS;
68 X86SchedWriteWidths PD = sPD;
69}
70
Craig Topperb7baa352018-04-08 17:53:18 +000071// Loads, stores, and moves, not folded with other operations.
72def WriteLoad : SchedWrite;
73def WriteStore : SchedWrite;
74def WriteMove : SchedWrite;
75
Simon Pilgrima271c542017-05-03 15:42:29 +000076// Arithmetic.
Simon Pilgrim2864b462018-05-08 14:55:16 +000077defm WriteALU : X86SchedWritePair; // Simple integer ALU op.
78def WriteALURMW : WriteSequence<[WriteALULd, WriteStore]>;
79defm WriteIMul : X86SchedWritePair; // Integer multiplication.
80defm WriteIMul64 : X86SchedWritePair; // Integer 64-bit multiplication.
81def WriteIMulH : SchedWrite; // Integer multiplication, high part.
82def WriteLEA : SchedWrite; // LEA instructions can't fold loads.
Simon Pilgrima271c542017-05-03 15:42:29 +000083
Simon Pilgrim25805542018-05-08 13:51:45 +000084// Integer division.
85defm WriteDiv8 : X86SchedWritePair;
86defm WriteDiv16 : X86SchedWritePair;
87defm WriteDiv32 : X86SchedWritePair;
88defm WriteDiv64 : X86SchedWritePair;
89defm WriteIDiv8 : X86SchedWritePair;
90defm WriteIDiv16 : X86SchedWritePair;
91defm WriteIDiv32 : X86SchedWritePair;
92defm WriteIDiv64 : X86SchedWritePair;
93
Simon Pilgrimf33d9052018-03-26 18:19:28 +000094defm WriteBitScan : X86SchedWritePair; // Bit scan forward/reverse.
95defm WritePOPCNT : X86SchedWritePair; // Bit population count.
96defm WriteLZCNT : X86SchedWritePair; // Leading zero count.
97defm WriteTZCNT : X86SchedWritePair; // Trailing zero count.
Craig Topperb7baa352018-04-08 17:53:18 +000098defm WriteCMOV : X86SchedWritePair; // Conditional move.
99def WriteSETCC : SchedWrite; // Set register based on condition code.
100def WriteSETCCStore : SchedWrite;
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000101
Simon Pilgrima271c542017-05-03 15:42:29 +0000102// Integer shifts and rotates.
103defm WriteShift : X86SchedWritePair;
104
Craig Topper89310f52018-03-29 20:41:39 +0000105// BMI1 BEXTR, BMI2 BZHI
106defm WriteBEXTR : X86SchedWritePair;
107defm WriteBZHI : X86SchedWritePair;
108
Simon Pilgrima271c542017-05-03 15:42:29 +0000109// Idioms that clear a register, like xorps %xmm0, %xmm0.
110// These can often bypass execution ports completely.
111def WriteZero : SchedWrite;
112
113// Branches don't produce values, so they have no latency, but they still
114// consume resources. Indirect branches can fold loads.
115defm WriteJump : X86SchedWritePair;
116
117// Floating point. This covers both scalar and vector operations.
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000118def WriteFLoad : SchedWrite;
119def WriteFMaskedLoad : SchedWrite;
120def WriteFMaskedLoadY : SchedWrite;
121def WriteFStore : SchedWrite;
122def WriteFMaskedStore : SchedWrite;
123def WriteFMaskedStoreY : SchedWrite;
124def WriteFMove : SchedWrite;
Simon Pilgrim1233e122018-05-07 20:52:53 +0000125
126defm WriteFAdd : X86SchedWritePair; // Floating point add/sub.
127defm WriteFAddX : X86SchedWritePair; // Floating point add/sub (XMM).
128defm WriteFAddY : X86SchedWritePair; // Floating point add/sub (YMM/ZMM).
129defm WriteFAdd64 : X86SchedWritePair; // Floating point double add/sub.
130defm WriteFAdd64X : X86SchedWritePair; // Floating point double add/sub (XMM).
131defm WriteFAdd64Y : X86SchedWritePair; // Floating point double add/sub (YMM/ZMM).
132defm WriteFCmp : X86SchedWritePair; // Floating point compare.
133defm WriteFCmpX : X86SchedWritePair; // Floating point compare (XMM).
134defm WriteFCmpY : X86SchedWritePair; // Floating point compare (YMM/ZMM).
135defm WriteFCmp64 : X86SchedWritePair; // Floating point double compare.
136defm WriteFCmp64X : X86SchedWritePair; // Floating point double compare (XMM).
137defm WriteFCmp64Y : X86SchedWritePair; // Floating point double compare (YMM/ZMM).
138defm WriteFCom : X86SchedWritePair; // Floating point compare to flags.
139defm WriteFMul : X86SchedWritePair; // Floating point multiplication.
140defm WriteFMulX : X86SchedWritePair; // Floating point multiplication (XMM).
141defm WriteFMulY : X86SchedWritePair; // Floating point multiplication (YMM/ZMM).
142defm WriteFMul64 : X86SchedWritePair; // Floating point double multiplication.
143defm WriteFMul64X : X86SchedWritePair; // Floating point double multiplication (XMM).
144defm WriteFMul64Y : X86SchedWritePair; // Floating point double multiplication (YMM/ZMM).
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000145defm WriteFDiv : X86SchedWritePair; // Floating point division.
146defm WriteFDivX : X86SchedWritePair; // Floating point division (XMM).
147defm WriteFDivY : X86SchedWritePair; // Floating point division (YMM).
148defm WriteFDivZ : X86SchedWritePair; // Floating point division (ZMM).
Simon Pilgrim1233e122018-05-07 20:52:53 +0000149defm WriteFDiv64 : X86SchedWritePair; // Floating point double division.
150defm WriteFDiv64X : X86SchedWritePair; // Floating point double division (XMM).
151defm WriteFDiv64Y : X86SchedWritePair; // Floating point double division (YMM).
152defm WriteFDiv64Z : X86SchedWritePair; // Floating point double division (ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000153defm WriteFSqrt : X86SchedWritePair; // Floating point square root.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000154defm WriteFSqrtX : X86SchedWritePair; // Floating point square root (XMM).
155defm WriteFSqrtY : X86SchedWritePair; // Floating point square root (YMM).
156defm WriteFSqrtZ : X86SchedWritePair; // Floating point square root (ZMM).
157defm WriteFSqrt64 : X86SchedWritePair; // Floating point double square root.
158defm WriteFSqrt64X : X86SchedWritePair; // Floating point double square root (XMM).
159defm WriteFSqrt64Y : X86SchedWritePair; // Floating point double square root (YMM).
160defm WriteFSqrt64Z : X86SchedWritePair; // Floating point double square root (ZMM).
161defm WriteFSqrt80 : X86SchedWritePair; // Floating point long double square root.
Simon Pilgrima271c542017-05-03 15:42:29 +0000162defm WriteFRcp : X86SchedWritePair; // Floating point reciprocal estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000163defm WriteFRcpX : X86SchedWritePair; // Floating point reciprocal estimate (XMM).
Simon Pilgrimc7088682018-05-01 18:06:07 +0000164defm WriteFRcpY : X86SchedWritePair; // Floating point reciprocal estimate (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000165defm WriteFRsqrt : X86SchedWritePair; // Floating point reciprocal square root estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000166defm WriteFRsqrtX: X86SchedWritePair; // Floating point reciprocal square root estimate (XMM).
Simon Pilgrimc7088682018-05-01 18:06:07 +0000167defm WriteFRsqrtY: X86SchedWritePair; // Floating point reciprocal square root estimate (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000168defm WriteFMA : X86SchedWritePair; // Fused Multiply Add.
Simon Pilgrim67cc2462018-05-04 15:20:18 +0000169defm WriteFMAX : X86SchedWritePair; // Fused Multiply Add (XMM).
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000170defm WriteFMAY : X86SchedWritePair; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000171defm WriteDPPD : X86SchedWritePair; // Floating point double dot product.
172defm WriteDPPS : X86SchedWritePair; // Floating point single dot product.
173defm WriteDPPSY : X86SchedWritePair; // Floating point single dot product (YMM).
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000174defm WriteFSign : X86SchedWritePair; // Floating point fabs/fchs.
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000175defm WriteFRnd : X86SchedWritePair; // Floating point rounding.
176defm WriteFRndY : X86SchedWritePair; // Floating point rounding (YMM/ZMM).
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000177defm WriteFLogic : X86SchedWritePair; // Floating point and/or/xor logicals.
178defm WriteFLogicY : X86SchedWritePair; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000179defm WriteFTest : X86SchedWritePair; // Floating point TEST instructions.
180defm WriteFTestY : X86SchedWritePair; // Floating point TEST instructions (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000181defm WriteFShuffle : X86SchedWritePair; // Floating point vector shuffles.
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000182defm WriteFShuffleY : X86SchedWritePair; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000183defm WriteFVarShuffle : X86SchedWritePair; // Floating point vector variable shuffles.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000184defm WriteFVarShuffleY : X86SchedWritePair; // Floating point vector variable shuffles (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000185defm WriteFBlend : X86SchedWritePair; // Floating point vector blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000186defm WriteFBlendY : X86SchedWritePair; // Floating point vector blends (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000187defm WriteFVarBlend : X86SchedWritePair; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000188defm WriteFVarBlendY : X86SchedWritePair; // Fp vector variable blends (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000189
190// FMA Scheduling helper class.
191class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
192
Andrew V. Tischenko8cb1d092017-06-08 16:44:13 +0000193// Horizontal Add/Sub (float and integer)
194defm WriteFHAdd : X86SchedWritePair;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000195defm WriteFHAddY : X86SchedWritePair; // YMM/ZMM.
196defm WritePHAdd : X86SchedWritePair;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000197defm WritePHAddY : X86SchedWritePair; // YMM/ZMM.
Andrew V. Tischenko8cb1d092017-06-08 16:44:13 +0000198
Simon Pilgrima271c542017-05-03 15:42:29 +0000199// Vector integer operations.
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000200def WriteVecLoad : SchedWrite;
201def WriteVecMaskedLoad : SchedWrite;
202def WriteVecMaskedLoadY : SchedWrite;
203def WriteVecStore : SchedWrite;
204def WriteVecMaskedStore : SchedWrite;
205def WriteVecMaskedStoreY : SchedWrite;
206def WriteVecMove : SchedWrite;
Simon Pilgrim210286e2018-05-08 10:28:03 +0000207
Simon Pilgrima271c542017-05-03 15:42:29 +0000208defm WriteVecALU : X86SchedWritePair; // Vector integer ALU op, no logicals.
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000209defm WriteVecALUY : X86SchedWritePair; // Vector integer ALU op, no logicals (YMM/ZMM).
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000210defm WriteVecLogic : X86SchedWritePair; // Vector integer and/or/xor logicals.
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000211defm WriteVecLogicY: X86SchedWritePair; // Vector integer and/or/xor logicals (YMM/ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000212defm WriteVecTest : X86SchedWritePair; // Vector integer TEST instructions.
213defm WriteVecTestY : X86SchedWritePair; // Vector integer TEST instructions (YMM/ZMM).
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000214defm WriteVecShift : X86SchedWritePair; // Vector integer shifts (default).
215defm WriteVecShiftX : X86SchedWritePair; // Vector integer shifts (XMM).
216defm WriteVecShiftY : X86SchedWritePair; // Vector integer shifts (YMM/ZMM).
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000217defm WriteVecShiftImm : X86SchedWritePair; // Vector integer immediate shifts (default).
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000218defm WriteVecShiftImmX: X86SchedWritePair; // Vector integer immediate shifts (XMM).
219defm WriteVecShiftImmY: X86SchedWritePair; // Vector integer immediate shifts (YMM/ZMM).
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000220defm WriteVecIMul : X86SchedWritePair; // Vector integer multiply (default).
221defm WriteVecIMulX : X86SchedWritePair; // Vector integer multiply (XMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000222defm WriteVecIMulY : X86SchedWritePair; // Vector integer multiply (YMM/ZMM).
223defm WritePMULLD : X86SchedWritePair; // Vector PMULLD.
224defm WritePMULLDY : X86SchedWritePair; // Vector PMULLD (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000225defm WriteShuffle : X86SchedWritePair; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000226defm WriteShuffleY : X86SchedWritePair; // Vector shuffles (YMM/ZMM).
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000227defm WriteVarShuffle : X86SchedWritePair; // Vector variable shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000228defm WriteVarShuffleY : X86SchedWritePair; // Vector variable shuffles (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000229defm WriteBlend : X86SchedWritePair; // Vector blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000230defm WriteBlendY : X86SchedWritePair; // Vector blends (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000231defm WriteVarBlend : X86SchedWritePair; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000232defm WriteVarBlendY : X86SchedWritePair; // Vector variable blends (YMM/ZMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000233defm WritePSADBW : X86SchedWritePair; // Vector PSADBW.
234defm WritePSADBWY : X86SchedWritePair; // Vector PSADBW (YMM/ZMM).
235defm WriteMPSAD : X86SchedWritePair; // Vector MPSAD.
236defm WriteMPSADY : X86SchedWritePair; // Vector MPSAD (YMM/ZMM).
Simon Pilgrim27bc83e2018-04-24 18:49:25 +0000237defm WritePHMINPOS : X86SchedWritePair; // Vector PHMINPOS.
Simon Pilgrima271c542017-05-03 15:42:29 +0000238
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000239// Vector insert/extract operations.
240defm WriteVecInsert : X86SchedWritePair; // Insert gpr to vector element.
241def WriteVecExtract : SchedWrite; // Extract vector element to gpr.
242def WriteVecExtractSt : SchedWrite; // Extract vector element and store.
243
Simon Pilgrima2f26782018-03-27 20:38:54 +0000244// MOVMSK operations.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000245def WriteFMOVMSK : SchedWrite;
246def WriteVecMOVMSK : SchedWrite;
247def WriteVecMOVMSKY : SchedWrite;
248def WriteMMXMOVMSK : SchedWrite;
Simon Pilgrima2f26782018-03-27 20:38:54 +0000249
Simon Pilgrima271c542017-05-03 15:42:29 +0000250// Conversion between integer and float.
251defm WriteCvtF2I : X86SchedWritePair; // Float -> Integer.
252defm WriteCvtI2F : X86SchedWritePair; // Integer -> Float.
253defm WriteCvtF2F : X86SchedWritePair; // Float -> Float size conversion.
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000254def WriteCvtF2FSt : SchedWrite; // // Float -> Float + store size conversion.
Simon Pilgrima271c542017-05-03 15:42:29 +0000255
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000256// CRC32 instruction.
257defm WriteCRC32 : X86SchedWritePair;
258
Simon Pilgrima271c542017-05-03 15:42:29 +0000259// Strings instructions.
260// Packed Compare Implicit Length Strings, Return Mask
261defm WritePCmpIStrM : X86SchedWritePair;
262// Packed Compare Explicit Length Strings, Return Mask
263defm WritePCmpEStrM : X86SchedWritePair;
264// Packed Compare Implicit Length Strings, Return Index
265defm WritePCmpIStrI : X86SchedWritePair;
266// Packed Compare Explicit Length Strings, Return Index
267defm WritePCmpEStrI : X86SchedWritePair;
268
269// AES instructions.
270defm WriteAESDecEnc : X86SchedWritePair; // Decryption, encryption.
271defm WriteAESIMC : X86SchedWritePair; // InvMixColumn.
272defm WriteAESKeyGen : X86SchedWritePair; // Key Generation.
273
274// Carry-less multiplication instructions.
275defm WriteCLMul : X86SchedWritePair;
276
Simon Pilgrim0e51a122018-05-04 18:16:13 +0000277// EMMS/FEMMS
278def WriteEMMS : SchedWrite;
279
Craig Topper05242bf2018-04-21 18:07:36 +0000280// Load/store MXCSR
281def WriteLDMXCSR : SchedWrite;
282def WriteSTMXCSR : SchedWrite;
283
Simon Pilgrima271c542017-05-03 15:42:29 +0000284// Catch-all for expensive system instructions.
285def WriteSystem : SchedWrite;
286
287// AVX2.
288defm WriteFShuffle256 : X86SchedWritePair; // Fp 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000289defm WriteFVarShuffle256 : X86SchedWritePair; // Fp 256-bit width variable shuffles.
Simon Pilgrima271c542017-05-03 15:42:29 +0000290defm WriteShuffle256 : X86SchedWritePair; // 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000291defm WriteVarShuffle256 : X86SchedWritePair; // 256-bit width vector variable shuffles.
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000292defm WriteVarVecShift : X86SchedWritePair; // Variable vector shifts.
293defm WriteVarVecShiftY : X86SchedWritePair; // Variable vector shifts (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000294
295// Old microcoded instructions that nobody use.
296def WriteMicrocoded : SchedWrite;
297
298// Fence instructions.
299def WriteFence : SchedWrite;
300
301// Nop, not very useful expect it provides a model for nops!
302def WriteNop : SchedWrite;
303
Simon Pilgrim3c354082018-04-30 18:18:38 +0000304// Vector width wrappers.
305def SchedWriteFAdd
Simon Pilgrim1233e122018-05-07 20:52:53 +0000306 : X86SchedWriteWidths<WriteFAdd, WriteFAddX, WriteFAddY, WriteFAddY>;
307def SchedWriteFAdd64
308 : X86SchedWriteWidths<WriteFAdd64, WriteFAdd64X, WriteFAdd64Y, WriteFAdd64Y>;
Simon Pilgrim342ac8c2018-05-03 09:11:32 +0000309def SchedWriteFHAdd
310 : X86SchedWriteWidths<WriteFHAdd, WriteFHAdd, WriteFHAddY, WriteFHAddY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000311def SchedWriteFCmp
Simon Pilgrim1233e122018-05-07 20:52:53 +0000312 : X86SchedWriteWidths<WriteFCmp, WriteFCmpX, WriteFCmpY, WriteFCmpY>;
313def SchedWriteFCmp64
314 : X86SchedWriteWidths<WriteFCmp64, WriteFCmp64X, WriteFCmp64Y, WriteFCmp64Y>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000315def SchedWriteFMul
Simon Pilgrim1233e122018-05-07 20:52:53 +0000316 : X86SchedWriteWidths<WriteFMul, WriteFMulX, WriteFMulY, WriteFMulY>;
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000317def SchedWriteFMul64
Simon Pilgrim1233e122018-05-07 20:52:53 +0000318 : X86SchedWriteWidths<WriteFMul64, WriteFMul64X, WriteFMul64Y, WriteFMul64Y>;
Simon Pilgrima1f1a3b2018-05-02 13:32:56 +0000319def SchedWriteFMA
Simon Pilgrim67cc2462018-05-04 15:20:18 +0000320 : X86SchedWriteWidths<WriteFMA, WriteFMAX, WriteFMAY, WriteFMAY>;
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000321def SchedWriteDPPD
322 : X86SchedWriteWidths<WriteDPPD, WriteDPPD, WriteDPPD, WriteDPPD>;
323def SchedWriteDPPS
324 : X86SchedWriteWidths<WriteDPPS, WriteDPPS, WriteDPPSY, WriteDPPSY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000325def SchedWriteFDiv
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000326 : X86SchedWriteWidths<WriteFDiv, WriteFDivX, WriteFDivY, WriteFDivZ>;
327def SchedWriteFDiv64
328 : X86SchedWriteWidths<WriteFDiv64, WriteFDiv64X, WriteFDiv64Y, WriteFDiv64Z>;
Simon Pilgrimc7088682018-05-01 18:06:07 +0000329def SchedWriteFSqrt
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000330 : X86SchedWriteWidths<WriteFSqrt, WriteFSqrtX,
331 WriteFSqrtY, WriteFSqrtZ>;
332def SchedWriteFSqrt64
333 : X86SchedWriteWidths<WriteFSqrt64, WriteFSqrt64X,
334 WriteFSqrt64Y, WriteFSqrt64Z>;
Simon Pilgrim1b7a80d2018-05-01 15:57:17 +0000335def SchedWriteFRcp
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000336 : X86SchedWriteWidths<WriteFRcp, WriteFRcpX, WriteFRcpY, WriteFRcpY>;
Simon Pilgrim1b7a80d2018-05-01 15:57:17 +0000337def SchedWriteFRsqrt
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000338 : X86SchedWriteWidths<WriteFRsqrt, WriteFRsqrtX, WriteFRsqrtY, WriteFRsqrtY>;
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000339def SchedWriteFRnd
340 : X86SchedWriteWidths<WriteFRnd, WriteFRnd, WriteFRndY, WriteFRndY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000341def SchedWriteFLogic
342 : X86SchedWriteWidths<WriteFLogic, WriteFLogic, WriteFLogicY, WriteFLogicY>;
Simon Pilgrim210286e2018-05-08 10:28:03 +0000343def SchedWriteFTest
344 : X86SchedWriteWidths<WriteFTest, WriteFTest, WriteFTestY, WriteFTestY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000345
346def SchedWriteFShuffle
347 : X86SchedWriteWidths<WriteFShuffle, WriteFShuffle,
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000348 WriteFShuffleY, WriteFShuffleY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000349def SchedWriteFVarShuffle
350 : X86SchedWriteWidths<WriteFVarShuffle, WriteFVarShuffle,
351 WriteFVarShuffleY, WriteFVarShuffleY>;
352def SchedWriteFBlend
353 : X86SchedWriteWidths<WriteFBlend, WriteFBlend, WriteFBlendY, WriteFBlendY>;
354def SchedWriteFVarBlend
355 : X86SchedWriteWidths<WriteFVarBlend, WriteFVarBlend,
356 WriteFVarBlendY, WriteFVarBlendY>;
357
358def SchedWriteVecALU
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000359 : X86SchedWriteWidths<WriteVecALU, WriteVecALU, WriteVecALUY, WriteVecALUY>;
Simon Pilgrim342ac8c2018-05-03 09:11:32 +0000360def SchedWritePHAdd
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000361 : X86SchedWriteWidths<WritePHAdd, WritePHAdd, WritePHAddY, WritePHAddY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000362def SchedWriteVecLogic
363 : X86SchedWriteWidths<WriteVecLogic, WriteVecLogic,
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000364 WriteVecLogicY, WriteVecLogicY>;
Simon Pilgrim210286e2018-05-08 10:28:03 +0000365def SchedWriteVecTest
366 : X86SchedWriteWidths<WriteVecTest, WriteVecTest,
367 WriteVecTestY, WriteVecTestY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000368def SchedWriteVecShift
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000369 : X86SchedWriteWidths<WriteVecShift, WriteVecShiftX,
370 WriteVecShiftY, WriteVecShiftY>;
371def SchedWriteVecShiftImm
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000372 : X86SchedWriteWidths<WriteVecShiftImm, WriteVecShiftImmX,
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000373 WriteVecShiftImmY, WriteVecShiftImmY>;
Simon Pilgrime8671ef2018-05-02 12:27:54 +0000374def SchedWriteVarVecShift
375 : X86SchedWriteWidths<WriteVarVecShift, WriteVarVecShift,
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000376 WriteVarVecShiftY, WriteVarVecShiftY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000377def SchedWriteVecIMul
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000378 : X86SchedWriteWidths<WriteVecIMul, WriteVecIMulX,
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000379 WriteVecIMulY, WriteVecIMulY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000380def SchedWritePMULLD
381 : X86SchedWriteWidths<WritePMULLD, WritePMULLD,
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000382 WritePMULLDY, WritePMULLDY>;
Simon Pilgrime8671ef2018-05-02 12:27:54 +0000383def SchedWriteMPSAD
384 : X86SchedWriteWidths<WriteMPSAD, WriteMPSAD,
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000385 WriteMPSADY, WriteMPSADY>;
Simon Pilgrime8671ef2018-05-02 12:27:54 +0000386def SchedWritePSADBW
387 : X86SchedWriteWidths<WritePSADBW, WritePSADBW,
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000388 WritePSADBWY, WritePSADBWY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000389
390def SchedWriteShuffle
391 : X86SchedWriteWidths<WriteShuffle, WriteShuffle,
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000392 WriteShuffleY, WriteShuffleY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000393def SchedWriteVarShuffle
394 : X86SchedWriteWidths<WriteVarShuffle, WriteVarShuffle,
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000395 WriteVarShuffleY, WriteVarShuffleY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000396def SchedWriteBlend
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000397 : X86SchedWriteWidths<WriteBlend, WriteBlend, WriteBlendY, WriteBlendY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000398def SchedWriteVarBlend
399 : X86SchedWriteWidths<WriteVarBlend, WriteVarBlend,
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000400 WriteVarBlendY, WriteVarBlendY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000401
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000402// Vector size wrappers.
403def SchedWriteFAddSizes
Simon Pilgrim1233e122018-05-07 20:52:53 +0000404 : X86SchedWriteSizes<SchedWriteFAdd, SchedWriteFAdd64>;
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000405def SchedWriteFCmpSizes
Simon Pilgrim1233e122018-05-07 20:52:53 +0000406 : X86SchedWriteSizes<SchedWriteFCmp, SchedWriteFCmp64>;
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000407def SchedWriteFMulSizes
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000408 : X86SchedWriteSizes<SchedWriteFMul, SchedWriteFMul64>;
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000409def SchedWriteFDivSizes
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000410 : X86SchedWriteSizes<SchedWriteFDiv, SchedWriteFDiv64>;
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000411def SchedWriteFSqrtSizes
412 : X86SchedWriteSizes<SchedWriteFSqrt, SchedWriteFSqrt64>;
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000413def SchedWriteFLogicSizes
414 : X86SchedWriteSizes<SchedWriteFLogic, SchedWriteFLogic>;
415def SchedWriteFShuffleSizes
416 : X86SchedWriteSizes<SchedWriteFShuffle, SchedWriteFShuffle>;
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000417
Simon Pilgrima271c542017-05-03 15:42:29 +0000418//===----------------------------------------------------------------------===//
Simon Pilgrim35935c02018-04-12 18:46:15 +0000419// Generic Processor Scheduler Models.
Simon Pilgrima271c542017-05-03 15:42:29 +0000420
421// IssueWidth is analogous to the number of decode units. Core and its
422// descendents, including Nehalem and SandyBridge have 4 decoders.
423// Resources beyond the decoder operate on micro-ops and are bufferred
424// so adjacent micro-ops don't directly compete.
425//
426// MicroOpBufferSize > 1 indicates that RAW dependencies can be
427// decoded in the same cycle. The value 32 is a reasonably arbitrary
428// number of in-flight instructions.
429//
430// HighLatency=10 is optimistic. X86InstrInfo::isHighLatencyDef
431// indicates high latency opcodes. Alternatively, InstrItinData
432// entries may be included here to define specific operand
433// latencies. Since these latencies are not used for pipeline hazards,
434// they do not need to be exact.
435//
Simon Pilgrime0c78682018-04-13 14:31:57 +0000436// The GenericX86Model contains no instruction schedules
Simon Pilgrima271c542017-05-03 15:42:29 +0000437// and disables PostRAScheduler.
438class GenericX86Model : SchedMachineModel {
439 let IssueWidth = 4;
440 let MicroOpBufferSize = 32;
441 let LoadLatency = 4;
442 let HighLatency = 10;
443 let PostRAScheduler = 0;
444 let CompleteModel = 0;
445}
446
447def GenericModel : GenericX86Model;
448
449// Define a model with the PostRAScheduler enabled.
450def GenericPostRAModel : GenericX86Model {
451 let PostRAScheduler = 1;
452}
453