blob: 379bf8099f6616c2aea72e98750bffa8df3c8f05 [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
Craig Topperb7baa352018-04-08 17:53:18 +000041// Loads, stores, and moves, not folded with other operations.
42def WriteLoad : SchedWrite;
43def WriteStore : SchedWrite;
44def WriteMove : SchedWrite;
45
Simon Pilgrima271c542017-05-03 15:42:29 +000046// Arithmetic.
47defm WriteALU : X86SchedWritePair; // Simple integer ALU op.
Craig Topperb7baa352018-04-08 17:53:18 +000048def WriteALURMW : WriteSequence<[WriteALULd, WriteStore]>;
Simon Pilgrima271c542017-05-03 15:42:29 +000049defm WriteIMul : X86SchedWritePair; // Integer multiplication.
50def WriteIMulH : SchedWrite; // Integer multiplication, high part.
51defm WriteIDiv : X86SchedWritePair; // Integer division.
52def WriteLEA : SchedWrite; // LEA instructions can't fold loads.
53
Simon Pilgrimf33d9052018-03-26 18:19:28 +000054defm WriteBitScan : X86SchedWritePair; // Bit scan forward/reverse.
55defm WritePOPCNT : X86SchedWritePair; // Bit population count.
56defm WriteLZCNT : X86SchedWritePair; // Leading zero count.
57defm WriteTZCNT : X86SchedWritePair; // Trailing zero count.
Craig Topperb7baa352018-04-08 17:53:18 +000058defm WriteCMOV : X86SchedWritePair; // Conditional move.
59def WriteSETCC : SchedWrite; // Set register based on condition code.
60def WriteSETCCStore : SchedWrite;
Simon Pilgrimf33d9052018-03-26 18:19:28 +000061
Simon Pilgrima271c542017-05-03 15:42:29 +000062// Integer shifts and rotates.
63defm WriteShift : X86SchedWritePair;
64
Craig Topper89310f52018-03-29 20:41:39 +000065// BMI1 BEXTR, BMI2 BZHI
66defm WriteBEXTR : X86SchedWritePair;
67defm WriteBZHI : X86SchedWritePair;
68
Simon Pilgrima271c542017-05-03 15:42:29 +000069// Idioms that clear a register, like xorps %xmm0, %xmm0.
70// These can often bypass execution ports completely.
71def WriteZero : SchedWrite;
72
73// Branches don't produce values, so they have no latency, but they still
74// consume resources. Indirect branches can fold loads.
75defm WriteJump : X86SchedWritePair;
76
77// Floating point. This covers both scalar and vector operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +000078def WriteFLoad : SchedWrite;
79def WriteFStore : SchedWrite;
80def WriteFMove : SchedWrite;
Simon Pilgrim86e3c2692018-04-17 07:22:44 +000081defm WriteFAdd : X86SchedWritePair; // Floating point add/sub.
82defm WriteFCmp : X86SchedWritePair; // Floating point compare.
83defm WriteFCom : X86SchedWritePair; // Floating point compare to flags.
Simon Pilgrima271c542017-05-03 15:42:29 +000084defm WriteFMul : X86SchedWritePair; // Floating point multiplication.
85defm WriteFDiv : X86SchedWritePair; // Floating point division.
86defm WriteFSqrt : X86SchedWritePair; // Floating point square root.
87defm WriteFRcp : X86SchedWritePair; // Floating point reciprocal estimate.
88defm WriteFRsqrt : X86SchedWritePair; // Floating point reciprocal square root estimate.
89defm WriteFMA : X86SchedWritePair; // Fused Multiply Add.
Simon Pilgrimd14d2e72018-04-20 21:16:05 +000090defm WriteFSign : X86SchedWritePair; // Floating point fabs/fchs.
91defm WriteFLogic : X86SchedWritePair; // Floating point and/or/xor logicals.
Simon Pilgrima271c542017-05-03 15:42:29 +000092defm WriteFShuffle : X86SchedWritePair; // Floating point vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +000093defm WriteFVarShuffle : X86SchedWritePair; // Floating point vector variable shuffles.
Simon Pilgrima271c542017-05-03 15:42:29 +000094defm WriteFBlend : X86SchedWritePair; // Floating point vector blends.
95defm WriteFVarBlend : X86SchedWritePair; // Fp vector variable blends.
96
97// FMA Scheduling helper class.
98class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
99
Andrew V. Tischenko8cb1d092017-06-08 16:44:13 +0000100// Horizontal Add/Sub (float and integer)
101defm WriteFHAdd : X86SchedWritePair;
102defm WritePHAdd : X86SchedWritePair;
103
Simon Pilgrima271c542017-05-03 15:42:29 +0000104// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000105def WriteVecLoad : SchedWrite;
106def WriteVecStore : SchedWrite;
107def WriteVecMove : SchedWrite;
Simon Pilgrima271c542017-05-03 15:42:29 +0000108defm WriteVecALU : X86SchedWritePair; // Vector integer ALU op, no logicals.
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000109defm WriteVecLogic : X86SchedWritePair; // Vector integer and/or/xor logicals.
Simon Pilgrima271c542017-05-03 15:42:29 +0000110defm WriteVecShift : X86SchedWritePair; // Vector integer shifts.
111defm WriteVecIMul : X86SchedWritePair; // Vector integer multiply.
Craig Topper13a0f832018-03-31 04:54:32 +0000112defm WritePMULLD : X86SchedWritePair; // PMULLD
Simon Pilgrima271c542017-05-03 15:42:29 +0000113defm WriteShuffle : X86SchedWritePair; // Vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000114defm WriteVarShuffle : X86SchedWritePair; // Vector variable shuffles.
Simon Pilgrima271c542017-05-03 15:42:29 +0000115defm WriteBlend : X86SchedWritePair; // Vector blends.
116defm WriteVarBlend : X86SchedWritePair; // Vector variable blends.
Craig Toppere56a2fc2018-04-17 19:35:19 +0000117defm WritePSADBW : X86SchedWritePair; // Vector PSADBW.
Simon Pilgrima271c542017-05-03 15:42:29 +0000118defm WriteMPSAD : X86SchedWritePair; // Vector MPSAD.
Simon Pilgrim27bc83e2018-04-24 18:49:25 +0000119defm WritePHMINPOS : X86SchedWritePair; // Vector PHMINPOS.
Simon Pilgrima271c542017-05-03 15:42:29 +0000120
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000121// Vector insert/extract operations.
122defm WriteVecInsert : X86SchedWritePair; // Insert gpr to vector element.
123def WriteVecExtract : SchedWrite; // Extract vector element to gpr.
124def WriteVecExtractSt : SchedWrite; // Extract vector element and store.
125
Simon Pilgrima2f26782018-03-27 20:38:54 +0000126// MOVMSK operations.
127def WriteFMOVMSK : SchedWrite;
128def WriteVecMOVMSK : SchedWrite;
129def WriteMMXMOVMSK : SchedWrite;
130
Simon Pilgrima271c542017-05-03 15:42:29 +0000131// Conversion between integer and float.
132defm WriteCvtF2I : X86SchedWritePair; // Float -> Integer.
133defm WriteCvtI2F : X86SchedWritePair; // Integer -> Float.
134defm WriteCvtF2F : X86SchedWritePair; // Float -> Float size conversion.
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000135def WriteCvtF2FSt : SchedWrite; // // Float -> Float + store size conversion.
Simon Pilgrima271c542017-05-03 15:42:29 +0000136
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000137// CRC32 instruction.
138defm WriteCRC32 : X86SchedWritePair;
139
Simon Pilgrima271c542017-05-03 15:42:29 +0000140// Strings instructions.
141// Packed Compare Implicit Length Strings, Return Mask
142defm WritePCmpIStrM : X86SchedWritePair;
143// Packed Compare Explicit Length Strings, Return Mask
144defm WritePCmpEStrM : X86SchedWritePair;
145// Packed Compare Implicit Length Strings, Return Index
146defm WritePCmpIStrI : X86SchedWritePair;
147// Packed Compare Explicit Length Strings, Return Index
148defm WritePCmpEStrI : X86SchedWritePair;
149
150// AES instructions.
151defm WriteAESDecEnc : X86SchedWritePair; // Decryption, encryption.
152defm WriteAESIMC : X86SchedWritePair; // InvMixColumn.
153defm WriteAESKeyGen : X86SchedWritePair; // Key Generation.
154
155// Carry-less multiplication instructions.
156defm WriteCLMul : X86SchedWritePair;
157
Craig Topper05242bf2018-04-21 18:07:36 +0000158// Load/store MXCSR
159def WriteLDMXCSR : SchedWrite;
160def WriteSTMXCSR : SchedWrite;
161
Simon Pilgrima271c542017-05-03 15:42:29 +0000162// Catch-all for expensive system instructions.
163def WriteSystem : SchedWrite;
164
165// AVX2.
166defm WriteFShuffle256 : X86SchedWritePair; // Fp 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000167defm WriteFVarShuffle256 : X86SchedWritePair; // Fp 256-bit width variable shuffles.
Simon Pilgrima271c542017-05-03 15:42:29 +0000168defm WriteShuffle256 : X86SchedWritePair; // 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000169defm WriteVarShuffle256 : X86SchedWritePair; // 256-bit width vector variable shuffles.
Simon Pilgrima271c542017-05-03 15:42:29 +0000170defm WriteVarVecShift : X86SchedWritePair; // Variable vector shifts.
171
172// Old microcoded instructions that nobody use.
173def WriteMicrocoded : SchedWrite;
174
175// Fence instructions.
176def WriteFence : SchedWrite;
177
178// Nop, not very useful expect it provides a model for nops!
179def WriteNop : SchedWrite;
180
181//===----------------------------------------------------------------------===//
Simon Pilgrim35935c02018-04-12 18:46:15 +0000182// Generic Processor Scheduler Models.
Simon Pilgrima271c542017-05-03 15:42:29 +0000183
184// IssueWidth is analogous to the number of decode units. Core and its
185// descendents, including Nehalem and SandyBridge have 4 decoders.
186// Resources beyond the decoder operate on micro-ops and are bufferred
187// so adjacent micro-ops don't directly compete.
188//
189// MicroOpBufferSize > 1 indicates that RAW dependencies can be
190// decoded in the same cycle. The value 32 is a reasonably arbitrary
191// number of in-flight instructions.
192//
193// HighLatency=10 is optimistic. X86InstrInfo::isHighLatencyDef
194// indicates high latency opcodes. Alternatively, InstrItinData
195// entries may be included here to define specific operand
196// latencies. Since these latencies are not used for pipeline hazards,
197// they do not need to be exact.
198//
Simon Pilgrime0c78682018-04-13 14:31:57 +0000199// The GenericX86Model contains no instruction schedules
Simon Pilgrima271c542017-05-03 15:42:29 +0000200// and disables PostRAScheduler.
201class GenericX86Model : SchedMachineModel {
202 let IssueWidth = 4;
203 let MicroOpBufferSize = 32;
204 let LoadLatency = 4;
205 let HighLatency = 10;
206 let PostRAScheduler = 0;
207 let CompleteModel = 0;
208}
209
210def GenericModel : GenericX86Model;
211
212// Define a model with the PostRAScheduler enabled.
213def GenericPostRAModel : GenericX86Model {
214 let PostRAScheduler = 1;
215}
216