1 //===-- X86Schedule.td - X86 Scheduling Definitions --------*- tablegen -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 //===----------------------------------------------------------------------===//
11 // InstrSchedModel annotations for out-of-order CPUs.
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.
16 def ReadAfterLd : SchedRead;
18 // Instructions with both a load and a store folded are modeled as a folded
20 def WriteRMW : SchedWrite;
22 // Helper to set SchedWrite ExePorts/Latency/ResourceCycles/NumMicroOps.
23 multiclass X86WriteRes<SchedWrite SchedRW,
24 list<ProcResourceKind> ExePorts,
25 int Lat, list<int> Res, int UOps> {
26 def : WriteRes<SchedRW, ExePorts> {
28 let ResourceCycles = Res;
29 let NumMicroOps = UOps;
33 // 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.
37 class X86FoldableSchedWrite : SchedWrite {
38 // The SchedWrite to use when a load is folded into the instruction.
42 // Multiclass that produces a linked pair of SchedWrites.
43 multiclass X86SchedWritePair {
44 // Register-Memory operation.
46 // Register-Register operation.
47 def NAME : X86FoldableSchedWrite {
48 let Folded = !cast<SchedWrite>(NAME#"Ld");
52 // Helpers to mark SchedWrites as unsupported.
53 multiclass X86WriteResUnsupported<SchedWrite SchedRW> {
54 let Unsupported = 1 in {
55 def : WriteRes<SchedRW, []>;
58 multiclass X86WriteResPairUnsupported<X86FoldableSchedWrite SchedRW> {
59 let Unsupported = 1 in {
60 def : WriteRes<SchedRW, []>;
61 def : WriteRes<SchedRW.Folded, []>;
65 // Multiclass that wraps X86FoldableSchedWrite for each vector width.
66 class X86SchedWriteWidths<X86FoldableSchedWrite sScl,
67 X86FoldableSchedWrite s128,
68 X86FoldableSchedWrite s256,
69 X86FoldableSchedWrite s512> {
70 X86FoldableSchedWrite Scl = sScl; // Scalar float/double operations.
71 X86FoldableSchedWrite MMX = sScl; // MMX operations.
72 X86FoldableSchedWrite XMM = s128; // XMM operations.
73 X86FoldableSchedWrite YMM = s256; // YMM operations.
74 X86FoldableSchedWrite ZMM = s512; // ZMM operations.
77 // Multiclass that wraps X86SchedWriteWidths for each fp vector type.
78 class X86SchedWriteSizes<X86SchedWriteWidths sPS,
79 X86SchedWriteWidths sPD> {
80 X86SchedWriteWidths PS = sPS;
81 X86SchedWriteWidths PD = sPD;
84 // Multiclass that wraps move/load/store triple for a vector width.
85 class X86SchedWriteMoveLS<SchedWrite MoveRR,
88 SchedWrite RR = MoveRR;
89 SchedWrite RM = LoadRM;
90 SchedWrite MR = StoreMR;
93 // Multiclass that wraps X86SchedWriteMoveLS for each vector width.
94 class X86SchedWriteMoveLSWidths<X86SchedWriteMoveLS sScl,
95 X86SchedWriteMoveLS s128,
96 X86SchedWriteMoveLS s256,
97 X86SchedWriteMoveLS s512> {
98 X86SchedWriteMoveLS Scl = sScl; // Scalar float/double operations.
99 X86SchedWriteMoveLS MMX = sScl; // MMX operations.
100 X86SchedWriteMoveLS XMM = s128; // XMM operations.
101 X86SchedWriteMoveLS YMM = s256; // YMM operations.
102 X86SchedWriteMoveLS ZMM = s512; // ZMM operations.
105 // Loads, stores, and moves, not folded with other operations.
106 def WriteLoad : SchedWrite;
107 def WriteStore : SchedWrite;
108 def WriteStoreNT : SchedWrite;
109 def WriteMove : SchedWrite;
112 defm WriteALU : X86SchedWritePair; // Simple integer ALU op.
113 defm WriteADC : X86SchedWritePair; // Integer ALU + flags op.
114 def WriteALURMW : WriteSequence<[WriteALULd, WriteStore]>;
115 def WriteADCRMW : WriteSequence<[WriteADCLd, WriteStore]>;
116 defm WriteIMul : X86SchedWritePair; // Integer multiplication.
117 defm WriteIMul64 : X86SchedWritePair; // Integer 64-bit multiplication.
118 def WriteIMulH : SchedWrite; // Integer multiplication, high part.
119 def WriteLEA : SchedWrite; // LEA instructions can't fold loads.
121 def WriteBSWAP32 : SchedWrite; // Byte Order (Endianness) 32-bit Swap.
122 def WriteBSWAP64 : SchedWrite; // Byte Order (Endianness) 64-bit Swap.
125 defm WriteDiv8 : X86SchedWritePair;
126 defm WriteDiv16 : X86SchedWritePair;
127 defm WriteDiv32 : X86SchedWritePair;
128 defm WriteDiv64 : X86SchedWritePair;
129 defm WriteIDiv8 : X86SchedWritePair;
130 defm WriteIDiv16 : X86SchedWritePair;
131 defm WriteIDiv32 : X86SchedWritePair;
132 defm WriteIDiv64 : X86SchedWritePair;
134 defm WriteBSF : X86SchedWritePair; // Bit scan forward.
135 defm WriteBSR : X86SchedWritePair; // Bit scan reverse.
136 defm WritePOPCNT : X86SchedWritePair; // Bit population count.
137 defm WriteLZCNT : X86SchedWritePair; // Leading zero count.
138 defm WriteTZCNT : X86SchedWritePair; // Trailing zero count.
139 defm WriteCMOV : X86SchedWritePair; // Conditional move.
140 defm WriteCMOV2 : X86SchedWritePair; // Conditional (CF + ZF flag) move.
141 def WriteFCMOV : SchedWrite; // X87 conditional move.
142 def WriteSETCC : SchedWrite; // Set register based on condition code.
143 def WriteSETCCStore : SchedWrite;
144 def WriteLAHFSAHF : SchedWrite; // Load/Store flags in AH.
145 def WriteBitTest : SchedWrite; // Bit Test - TODO add memory folding support
147 // Integer shifts and rotates.
148 defm WriteShift : X86SchedWritePair;
149 // Double shift instructions.
150 def WriteSHDrri : SchedWrite;
151 def WriteSHDrrcl : SchedWrite;
152 def WriteSHDmri : SchedWrite;
153 def WriteSHDmrcl : SchedWrite;
155 // BMI1 BEXTR, BMI2 BZHI
156 defm WriteBEXTR : X86SchedWritePair;
157 defm WriteBZHI : X86SchedWritePair;
159 // Idioms that clear a register, like xorps %xmm0, %xmm0.
160 // These can often bypass execution ports completely.
161 def WriteZero : SchedWrite;
163 // Branches don't produce values, so they have no latency, but they still
164 // consume resources. Indirect branches can fold loads.
165 defm WriteJump : X86SchedWritePair;
167 // Floating point. This covers both scalar and vector operations.
168 def WriteFLD0 : SchedWrite;
169 def WriteFLD1 : SchedWrite;
170 def WriteFLDC : SchedWrite;
171 def WriteFLoad : SchedWrite;
172 def WriteFLoadX : SchedWrite;
173 def WriteFLoadY : SchedWrite;
174 def WriteFMaskedLoad : SchedWrite;
175 def WriteFMaskedLoadY : SchedWrite;
176 def WriteFStore : SchedWrite;
177 def WriteFStoreX : SchedWrite;
178 def WriteFStoreY : SchedWrite;
179 def WriteFStoreNT : SchedWrite;
180 def WriteFStoreNTX : SchedWrite;
181 def WriteFStoreNTY : SchedWrite;
182 def WriteFMaskedStore : SchedWrite;
183 def WriteFMaskedStoreY : SchedWrite;
184 def WriteFMove : SchedWrite;
185 def WriteFMoveX : SchedWrite;
186 def WriteFMoveY : SchedWrite;
188 defm WriteFAdd : X86SchedWritePair; // Floating point add/sub.
189 defm WriteFAddX : X86SchedWritePair; // Floating point add/sub (XMM).
190 defm WriteFAddY : X86SchedWritePair; // Floating point add/sub (YMM).
191 defm WriteFAddZ : X86SchedWritePair; // Floating point add/sub (ZMM).
192 defm WriteFAdd64 : X86SchedWritePair; // Floating point double add/sub.
193 defm WriteFAdd64X : X86SchedWritePair; // Floating point double add/sub (XMM).
194 defm WriteFAdd64Y : X86SchedWritePair; // Floating point double add/sub (YMM).
195 defm WriteFAdd64Z : X86SchedWritePair; // Floating point double add/sub (ZMM).
196 defm WriteFCmp : X86SchedWritePair; // Floating point compare.
197 defm WriteFCmpX : X86SchedWritePair; // Floating point compare (XMM).
198 defm WriteFCmpY : X86SchedWritePair; // Floating point compare (YMM).
199 defm WriteFCmpZ : X86SchedWritePair; // Floating point compare (ZMM).
200 defm WriteFCmp64 : X86SchedWritePair; // Floating point double compare.
201 defm WriteFCmp64X : X86SchedWritePair; // Floating point double compare (XMM).
202 defm WriteFCmp64Y : X86SchedWritePair; // Floating point double compare (YMM).
203 defm WriteFCmp64Z : X86SchedWritePair; // Floating point double compare (ZMM).
204 defm WriteFCom : X86SchedWritePair; // Floating point compare to flags.
205 defm WriteFMul : X86SchedWritePair; // Floating point multiplication.
206 defm WriteFMulX : X86SchedWritePair; // Floating point multiplication (XMM).
207 defm WriteFMulY : X86SchedWritePair; // Floating point multiplication (YMM).
208 defm WriteFMulZ : X86SchedWritePair; // Floating point multiplication (YMM).
209 defm WriteFMul64 : X86SchedWritePair; // Floating point double multiplication.
210 defm WriteFMul64X : X86SchedWritePair; // Floating point double multiplication (XMM).
211 defm WriteFMul64Y : X86SchedWritePair; // Floating point double multiplication (YMM).
212 defm WriteFMul64Z : X86SchedWritePair; // Floating point double multiplication (ZMM).
213 defm WriteFDiv : X86SchedWritePair; // Floating point division.
214 defm WriteFDivX : X86SchedWritePair; // Floating point division (XMM).
215 defm WriteFDivY : X86SchedWritePair; // Floating point division (YMM).
216 defm WriteFDivZ : X86SchedWritePair; // Floating point division (ZMM).
217 defm WriteFDiv64 : X86SchedWritePair; // Floating point double division.
218 defm WriteFDiv64X : X86SchedWritePair; // Floating point double division (XMM).
219 defm WriteFDiv64Y : X86SchedWritePair; // Floating point double division (YMM).
220 defm WriteFDiv64Z : X86SchedWritePair; // Floating point double division (ZMM).
221 defm WriteFSqrt : X86SchedWritePair; // Floating point square root.
222 defm WriteFSqrtX : X86SchedWritePair; // Floating point square root (XMM).
223 defm WriteFSqrtY : X86SchedWritePair; // Floating point square root (YMM).
224 defm WriteFSqrtZ : X86SchedWritePair; // Floating point square root (ZMM).
225 defm WriteFSqrt64 : X86SchedWritePair; // Floating point double square root.
226 defm WriteFSqrt64X : X86SchedWritePair; // Floating point double square root (XMM).
227 defm WriteFSqrt64Y : X86SchedWritePair; // Floating point double square root (YMM).
228 defm WriteFSqrt64Z : X86SchedWritePair; // Floating point double square root (ZMM).
229 defm WriteFSqrt80 : X86SchedWritePair; // Floating point long double square root.
230 defm WriteFRcp : X86SchedWritePair; // Floating point reciprocal estimate.
231 defm WriteFRcpX : X86SchedWritePair; // Floating point reciprocal estimate (XMM).
232 defm WriteFRcpY : X86SchedWritePair; // Floating point reciprocal estimate (YMM).
233 defm WriteFRcpZ : X86SchedWritePair; // Floating point reciprocal estimate (ZMM).
234 defm WriteFRsqrt : X86SchedWritePair; // Floating point reciprocal square root estimate.
235 defm WriteFRsqrtX: X86SchedWritePair; // Floating point reciprocal square root estimate (XMM).
236 defm WriteFRsqrtY: X86SchedWritePair; // Floating point reciprocal square root estimate (YMM).
237 defm WriteFRsqrtZ: X86SchedWritePair; // Floating point reciprocal square root estimate (ZMM).
238 defm WriteFMA : X86SchedWritePair; // Fused Multiply Add.
239 defm WriteFMAX : X86SchedWritePair; // Fused Multiply Add (XMM).
240 defm WriteFMAY : X86SchedWritePair; // Fused Multiply Add (YMM).
241 defm WriteFMAZ : X86SchedWritePair; // Fused Multiply Add (ZMM).
242 defm WriteDPPD : X86SchedWritePair; // Floating point double dot product.
243 defm WriteDPPS : X86SchedWritePair; // Floating point single dot product.
244 defm WriteDPPSY : X86SchedWritePair; // Floating point single dot product (YMM).
245 defm WriteDPPSZ : X86SchedWritePair; // Floating point single dot product (ZMM).
246 defm WriteFSign : X86SchedWritePair; // Floating point fabs/fchs.
247 defm WriteFRnd : X86SchedWritePair; // Floating point rounding.
248 defm WriteFRndY : X86SchedWritePair; // Floating point rounding (YMM).
249 defm WriteFRndZ : X86SchedWritePair; // Floating point rounding (ZMM).
250 defm WriteFLogic : X86SchedWritePair; // Floating point and/or/xor logicals.
251 defm WriteFLogicY : X86SchedWritePair; // Floating point and/or/xor logicals (YMM).
252 defm WriteFLogicZ : X86SchedWritePair; // Floating point and/or/xor logicals (ZMM).
253 defm WriteFTest : X86SchedWritePair; // Floating point TEST instructions.
254 defm WriteFTestY : X86SchedWritePair; // Floating point TEST instructions (YMM).
255 defm WriteFTestZ : X86SchedWritePair; // Floating point TEST instructions (ZMM).
256 defm WriteFShuffle : X86SchedWritePair; // Floating point vector shuffles.
257 defm WriteFShuffleY : X86SchedWritePair; // Floating point vector shuffles (YMM).
258 defm WriteFShuffleZ : X86SchedWritePair; // Floating point vector shuffles (ZMM).
259 defm WriteFVarShuffle : X86SchedWritePair; // Floating point vector variable shuffles.
260 defm WriteFVarShuffleY : X86SchedWritePair; // Floating point vector variable shuffles (YMM).
261 defm WriteFVarShuffleZ : X86SchedWritePair; // Floating point vector variable shuffles (ZMM).
262 defm WriteFBlend : X86SchedWritePair; // Floating point vector blends.
263 defm WriteFBlendY : X86SchedWritePair; // Floating point vector blends (YMM).
264 defm WriteFBlendZ : X86SchedWritePair; // Floating point vector blends (ZMM).
265 defm WriteFVarBlend : X86SchedWritePair; // Fp vector variable blends.
266 defm WriteFVarBlendY : X86SchedWritePair; // Fp vector variable blends (YMM).
267 defm WriteFVarBlendZ : X86SchedWritePair; // Fp vector variable blends (YMZMM).
269 // FMA Scheduling helper class.
270 class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
272 // Horizontal Add/Sub (float and integer)
273 defm WriteFHAdd : X86SchedWritePair;
274 defm WriteFHAddY : X86SchedWritePair;
275 defm WriteFHAddZ : X86SchedWritePair;
276 defm WritePHAdd : X86SchedWritePair;
277 defm WritePHAddX : X86SchedWritePair;
278 defm WritePHAddY : X86SchedWritePair;
279 defm WritePHAddZ : X86SchedWritePair;
281 // Vector integer operations.
282 def WriteVecLoad : SchedWrite;
283 def WriteVecLoadX : SchedWrite;
284 def WriteVecLoadY : SchedWrite;
285 def WriteVecLoadNT : SchedWrite;
286 def WriteVecLoadNTY : SchedWrite;
287 def WriteVecMaskedLoad : SchedWrite;
288 def WriteVecMaskedLoadY : SchedWrite;
289 def WriteVecStore : SchedWrite;
290 def WriteVecStoreX : SchedWrite;
291 def WriteVecStoreY : SchedWrite;
292 def WriteVecStoreNT : SchedWrite;
293 def WriteVecStoreNTY : SchedWrite;
294 def WriteVecMaskedStore : SchedWrite;
295 def WriteVecMaskedStoreY : SchedWrite;
296 def WriteVecMove : SchedWrite;
297 def WriteVecMoveX : SchedWrite;
298 def WriteVecMoveY : SchedWrite;
299 def WriteVecMoveToGpr : SchedWrite;
300 def WriteVecMoveFromGpr : SchedWrite;
302 defm WriteVecALU : X86SchedWritePair; // Vector integer ALU op, no logicals.
303 defm WriteVecALUX : X86SchedWritePair; // Vector integer ALU op, no logicals (XMM).
304 defm WriteVecALUY : X86SchedWritePair; // Vector integer ALU op, no logicals (YMM).
305 defm WriteVecALUZ : X86SchedWritePair; // Vector integer ALU op, no logicals (ZMM).
306 defm WriteVecLogic : X86SchedWritePair; // Vector integer and/or/xor logicals.
307 defm WriteVecLogicX : X86SchedWritePair; // Vector integer and/or/xor logicals (XMM).
308 defm WriteVecLogicY : X86SchedWritePair; // Vector integer and/or/xor logicals (YMM).
309 defm WriteVecLogicZ : X86SchedWritePair; // Vector integer and/or/xor logicals (ZMM).
310 defm WriteVecTest : X86SchedWritePair; // Vector integer TEST instructions.
311 defm WriteVecTestY : X86SchedWritePair; // Vector integer TEST instructions (YMM).
312 defm WriteVecTestZ : X86SchedWritePair; // Vector integer TEST instructions (ZMM).
313 defm WriteVecShift : X86SchedWritePair; // Vector integer shifts (default).
314 defm WriteVecShiftX : X86SchedWritePair; // Vector integer shifts (XMM).
315 defm WriteVecShiftY : X86SchedWritePair; // Vector integer shifts (YMM).
316 defm WriteVecShiftZ : X86SchedWritePair; // Vector integer shifts (ZMM).
317 defm WriteVecShiftImm : X86SchedWritePair; // Vector integer immediate shifts (default).
318 defm WriteVecShiftImmX: X86SchedWritePair; // Vector integer immediate shifts (XMM).
319 defm WriteVecShiftImmY: X86SchedWritePair; // Vector integer immediate shifts (YMM).
320 defm WriteVecShiftImmZ: X86SchedWritePair; // Vector integer immediate shifts (ZMM).
321 defm WriteVecIMul : X86SchedWritePair; // Vector integer multiply (default).
322 defm WriteVecIMulX : X86SchedWritePair; // Vector integer multiply (XMM).
323 defm WriteVecIMulY : X86SchedWritePair; // Vector integer multiply (YMM).
324 defm WriteVecIMulZ : X86SchedWritePair; // Vector integer multiply (ZMM).
325 defm WritePMULLD : X86SchedWritePair; // Vector PMULLD.
326 defm WritePMULLDY : X86SchedWritePair; // Vector PMULLD (YMM).
327 defm WritePMULLDZ : X86SchedWritePair; // Vector PMULLD (ZMM).
328 defm WriteShuffle : X86SchedWritePair; // Vector shuffles.
329 defm WriteShuffleX : X86SchedWritePair; // Vector shuffles (XMM).
330 defm WriteShuffleY : X86SchedWritePair; // Vector shuffles (YMM).
331 defm WriteShuffleZ : X86SchedWritePair; // Vector shuffles (ZMM).
332 defm WriteVarShuffle : X86SchedWritePair; // Vector variable shuffles.
333 defm WriteVarShuffleX : X86SchedWritePair; // Vector variable shuffles (XMM).
334 defm WriteVarShuffleY : X86SchedWritePair; // Vector variable shuffles (YMM).
335 defm WriteVarShuffleZ : X86SchedWritePair; // Vector variable shuffles (ZMM).
336 defm WriteBlend : X86SchedWritePair; // Vector blends.
337 defm WriteBlendY : X86SchedWritePair; // Vector blends (YMM).
338 defm WriteBlendZ : X86SchedWritePair; // Vector blends (ZMM).
339 defm WriteVarBlend : X86SchedWritePair; // Vector variable blends.
340 defm WriteVarBlendY : X86SchedWritePair; // Vector variable blends (YMM).
341 defm WriteVarBlendZ : X86SchedWritePair; // Vector variable blends (ZMM).
342 defm WritePSADBW : X86SchedWritePair; // Vector PSADBW.
343 defm WritePSADBWX : X86SchedWritePair; // Vector PSADBW (XMM).
344 defm WritePSADBWY : X86SchedWritePair; // Vector PSADBW (YMM).
345 defm WritePSADBWZ : X86SchedWritePair; // Vector PSADBW (ZMM).
346 defm WriteMPSAD : X86SchedWritePair; // Vector MPSAD.
347 defm WriteMPSADY : X86SchedWritePair; // Vector MPSAD (YMM).
348 defm WriteMPSADZ : X86SchedWritePair; // Vector MPSAD (ZMM).
349 defm WritePHMINPOS : X86SchedWritePair; // Vector PHMINPOS.
351 // Vector insert/extract operations.
352 defm WriteVecInsert : X86SchedWritePair; // Insert gpr to vector element.
353 def WriteVecExtract : SchedWrite; // Extract vector element to gpr.
354 def WriteVecExtractSt : SchedWrite; // Extract vector element and store.
356 // MOVMSK operations.
357 def WriteFMOVMSK : SchedWrite;
358 def WriteVecMOVMSK : SchedWrite;
359 def WriteVecMOVMSKY : SchedWrite;
360 def WriteMMXMOVMSK : SchedWrite;
362 // Conversion between integer and float.
363 defm WriteCvtSD2I : X86SchedWritePair; // Double -> Integer.
364 defm WriteCvtPD2I : X86SchedWritePair; // Double -> Integer (XMM).
365 defm WriteCvtPD2IY : X86SchedWritePair; // Double -> Integer (YMM).
366 defm WriteCvtPD2IZ : X86SchedWritePair; // Double -> Integer (ZMM).
368 defm WriteCvtSS2I : X86SchedWritePair; // Float -> Integer.
369 defm WriteCvtPS2I : X86SchedWritePair; // Float -> Integer (XMM).
370 defm WriteCvtPS2IY : X86SchedWritePair; // Float -> Integer (YMM).
371 defm WriteCvtPS2IZ : X86SchedWritePair; // Float -> Integer (ZMM).
373 defm WriteCvtI2SD : X86SchedWritePair; // Integer -> Double.
374 defm WriteCvtI2PD : X86SchedWritePair; // Integer -> Double (XMM).
375 defm WriteCvtI2PDY : X86SchedWritePair; // Integer -> Double (YMM).
376 defm WriteCvtI2PDZ : X86SchedWritePair; // Integer -> Double (ZMM).
378 defm WriteCvtI2SS : X86SchedWritePair; // Integer -> Float.
379 defm WriteCvtI2PS : X86SchedWritePair; // Integer -> Float (XMM).
380 defm WriteCvtI2PSY : X86SchedWritePair; // Integer -> Float (YMM).
381 defm WriteCvtI2PSZ : X86SchedWritePair; // Integer -> Float (ZMM).
383 defm WriteCvtSS2SD : X86SchedWritePair; // Float -> Double size conversion.
384 defm WriteCvtPS2PD : X86SchedWritePair; // Float -> Double size conversion (XMM).
385 defm WriteCvtPS2PDY : X86SchedWritePair; // Float -> Double size conversion (YMM).
386 defm WriteCvtPS2PDZ : X86SchedWritePair; // Float -> Double size conversion (ZMM).
388 defm WriteCvtSD2SS : X86SchedWritePair; // Double -> Float size conversion.
389 defm WriteCvtPD2PS : X86SchedWritePair; // Double -> Float size conversion (XMM).
390 defm WriteCvtPD2PSY : X86SchedWritePair; // Double -> Float size conversion (YMM).
391 defm WriteCvtPD2PSZ : X86SchedWritePair; // Double -> Float size conversion (ZMM).
393 defm WriteCvtPH2PS : X86SchedWritePair; // Half -> Float size conversion.
394 defm WriteCvtPH2PSY : X86SchedWritePair; // Half -> Float size conversion (YMM).
395 defm WriteCvtPH2PSZ : X86SchedWritePair; // Half -> Float size conversion (ZMM).
397 def WriteCvtPS2PH : SchedWrite; // // Float -> Half size conversion.
398 def WriteCvtPS2PHY : SchedWrite; // // Float -> Half size conversion (YMM).
399 def WriteCvtPS2PHZ : SchedWrite; // // Float -> Half size conversion (ZMM).
400 def WriteCvtPS2PHSt : SchedWrite; // // Float -> Half + store size conversion.
401 def WriteCvtPS2PHYSt : SchedWrite; // // Float -> Half + store size conversion (YMM).
402 def WriteCvtPS2PHZSt : SchedWrite; // // Float -> Half + store size conversion (ZMM).
404 // CRC32 instruction.
405 defm WriteCRC32 : X86SchedWritePair;
407 // Strings instructions.
408 // Packed Compare Implicit Length Strings, Return Mask
409 defm WritePCmpIStrM : X86SchedWritePair;
410 // Packed Compare Explicit Length Strings, Return Mask
411 defm WritePCmpEStrM : X86SchedWritePair;
412 // Packed Compare Implicit Length Strings, Return Index
413 defm WritePCmpIStrI : X86SchedWritePair;
414 // Packed Compare Explicit Length Strings, Return Index
415 defm WritePCmpEStrI : X86SchedWritePair;
418 defm WriteAESDecEnc : X86SchedWritePair; // Decryption, encryption.
419 defm WriteAESIMC : X86SchedWritePair; // InvMixColumn.
420 defm WriteAESKeyGen : X86SchedWritePair; // Key Generation.
422 // Carry-less multiplication instructions.
423 defm WriteCLMul : X86SchedWritePair;
426 def WriteEMMS : SchedWrite;
429 def WriteLDMXCSR : SchedWrite;
430 def WriteSTMXCSR : SchedWrite;
432 // Catch-all for expensive system instructions.
433 def WriteSystem : SchedWrite;
436 defm WriteFShuffle256 : X86SchedWritePair; // Fp 256-bit width vector shuffles.
437 defm WriteFVarShuffle256 : X86SchedWritePair; // Fp 256-bit width variable shuffles.
438 defm WriteShuffle256 : X86SchedWritePair; // 256-bit width vector shuffles.
439 defm WriteVarShuffle256 : X86SchedWritePair; // 256-bit width vector variable shuffles.
440 defm WriteVarVecShift : X86SchedWritePair; // Variable vector shifts.
441 defm WriteVarVecShiftY : X86SchedWritePair; // Variable vector shifts (YMM).
442 defm WriteVarVecShiftZ : X86SchedWritePair; // Variable vector shifts (ZMM).
444 // Old microcoded instructions that nobody use.
445 def WriteMicrocoded : SchedWrite;
447 // Fence instructions.
448 def WriteFence : SchedWrite;
450 // Nop, not very useful expect it provides a model for nops!
451 def WriteNop : SchedWrite;
453 // Move/Load/Store wrappers.
455 : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStore>;
457 : X86SchedWriteMoveLS<WriteFMoveX, WriteFLoadX, WriteFStoreX>;
459 : X86SchedWriteMoveLS<WriteFMoveY, WriteFLoadY, WriteFStoreY>;
460 def SchedWriteFMoveLS
461 : X86SchedWriteMoveLSWidths<WriteFMoveLS, WriteFMoveLSX,
462 WriteFMoveLSY, WriteFMoveLSY>;
465 : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStoreNT>;
467 : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStoreNTX>;
469 : X86SchedWriteMoveLS<WriteFMoveY, WriteFLoadY, WriteFStoreNTY>;
470 def SchedWriteFMoveLSNT
471 : X86SchedWriteMoveLSWidths<WriteFMoveLSNT, WriteFMoveLSNTX,
472 WriteFMoveLSNTY, WriteFMoveLSNTY>;
475 : X86SchedWriteMoveLS<WriteVecMove, WriteVecLoad, WriteVecStore>;
477 : X86SchedWriteMoveLS<WriteVecMoveX, WriteVecLoadX, WriteVecStoreX>;
479 : X86SchedWriteMoveLS<WriteVecMoveY, WriteVecLoadY, WriteVecStoreY>;
480 def SchedWriteVecMoveLS
481 : X86SchedWriteMoveLSWidths<WriteVecMoveLS, WriteVecMoveLSX,
482 WriteVecMoveLSY, WriteVecMoveLSY>;
485 : X86SchedWriteMoveLS<WriteVecMove, WriteVecLoadNT, WriteVecStoreNT>;
486 def WriteVecMoveLSNTX
487 : X86SchedWriteMoveLS<WriteVecMoveX, WriteVecLoadNT, WriteVecStoreNT>;
488 def WriteVecMoveLSNTY
489 : X86SchedWriteMoveLS<WriteVecMoveY, WriteVecLoadNTY, WriteVecStoreNTY>;
490 def SchedWriteVecMoveLSNT
491 : X86SchedWriteMoveLSWidths<WriteVecMoveLSNT, WriteVecMoveLSNTX,
492 WriteVecMoveLSNTY, WriteVecMoveLSNTY>;
494 // Vector width wrappers.
496 : X86SchedWriteWidths<WriteFAdd, WriteFAddX, WriteFAddY, WriteFAddZ>;
498 : X86SchedWriteWidths<WriteFAdd64, WriteFAdd64X, WriteFAdd64Y, WriteFAdd64Z>;
500 : X86SchedWriteWidths<WriteFHAdd, WriteFHAdd, WriteFHAddY, WriteFHAddZ>;
502 : X86SchedWriteWidths<WriteFCmp, WriteFCmpX, WriteFCmpY, WriteFCmpZ>;
504 : X86SchedWriteWidths<WriteFCmp64, WriteFCmp64X, WriteFCmp64Y, WriteFCmp64Z>;
506 : X86SchedWriteWidths<WriteFMul, WriteFMulX, WriteFMulY, WriteFMulZ>;
508 : X86SchedWriteWidths<WriteFMul64, WriteFMul64X, WriteFMul64Y, WriteFMul64Z>;
510 : X86SchedWriteWidths<WriteFMA, WriteFMAX, WriteFMAY, WriteFMAZ>;
512 : X86SchedWriteWidths<WriteDPPD, WriteDPPD, WriteDPPD, WriteDPPD>;
514 : X86SchedWriteWidths<WriteDPPS, WriteDPPS, WriteDPPSY, WriteDPPSZ>;
516 : X86SchedWriteWidths<WriteFDiv, WriteFDivX, WriteFDivY, WriteFDivZ>;
518 : X86SchedWriteWidths<WriteFDiv64, WriteFDiv64X, WriteFDiv64Y, WriteFDiv64Z>;
520 : X86SchedWriteWidths<WriteFSqrt, WriteFSqrtX,
521 WriteFSqrtY, WriteFSqrtZ>;
522 def SchedWriteFSqrt64
523 : X86SchedWriteWidths<WriteFSqrt64, WriteFSqrt64X,
524 WriteFSqrt64Y, WriteFSqrt64Z>;
526 : X86SchedWriteWidths<WriteFRcp, WriteFRcpX, WriteFRcpY, WriteFRcpZ>;
528 : X86SchedWriteWidths<WriteFRsqrt, WriteFRsqrtX, WriteFRsqrtY, WriteFRsqrtZ>;
530 : X86SchedWriteWidths<WriteFRnd, WriteFRnd, WriteFRndY, WriteFRndZ>;
532 : X86SchedWriteWidths<WriteFLogic, WriteFLogic, WriteFLogicY, WriteFLogicZ>;
534 : X86SchedWriteWidths<WriteFTest, WriteFTest, WriteFTestY, WriteFTestZ>;
536 def SchedWriteFShuffle
537 : X86SchedWriteWidths<WriteFShuffle, WriteFShuffle,
538 WriteFShuffleY, WriteFShuffleZ>;
539 def SchedWriteFVarShuffle
540 : X86SchedWriteWidths<WriteFVarShuffle, WriteFVarShuffle,
541 WriteFVarShuffleY, WriteFVarShuffleZ>;
543 : X86SchedWriteWidths<WriteFBlend, WriteFBlend, WriteFBlendY, WriteFBlendZ>;
544 def SchedWriteFVarBlend
545 : X86SchedWriteWidths<WriteFVarBlend, WriteFVarBlend,
546 WriteFVarBlendY, WriteFVarBlendZ>;
548 def SchedWriteCvtDQ2PD
549 : X86SchedWriteWidths<WriteCvtI2SD, WriteCvtI2PD,
550 WriteCvtI2PDY, WriteCvtI2PDZ>;
551 def SchedWriteCvtDQ2PS
552 : X86SchedWriteWidths<WriteCvtI2SS, WriteCvtI2PS,
553 WriteCvtI2PSY, WriteCvtI2PSZ>;
554 def SchedWriteCvtPD2DQ
555 : X86SchedWriteWidths<WriteCvtSD2I, WriteCvtPD2I,
556 WriteCvtPD2IY, WriteCvtPD2IZ>;
557 def SchedWriteCvtPS2DQ
558 : X86SchedWriteWidths<WriteCvtSS2I, WriteCvtPS2I,
559 WriteCvtPS2IY, WriteCvtPS2IZ>;
560 def SchedWriteCvtPS2PD
561 : X86SchedWriteWidths<WriteCvtSS2SD, WriteCvtPS2PD,
562 WriteCvtPS2PDY, WriteCvtPS2PDZ>;
563 def SchedWriteCvtPD2PS
564 : X86SchedWriteWidths<WriteCvtSD2SS, WriteCvtPD2PS,
565 WriteCvtPD2PSY, WriteCvtPD2PSZ>;
568 : X86SchedWriteWidths<WriteVecALU, WriteVecALUX, WriteVecALUY, WriteVecALUZ>;
570 : X86SchedWriteWidths<WritePHAdd, WritePHAddX, WritePHAddY, WritePHAddZ>;
571 def SchedWriteVecLogic
572 : X86SchedWriteWidths<WriteVecLogic, WriteVecLogicX,
573 WriteVecLogicY, WriteVecLogicZ>;
574 def SchedWriteVecTest
575 : X86SchedWriteWidths<WriteVecTest, WriteVecTest,
576 WriteVecTestY, WriteVecTestZ>;
577 def SchedWriteVecShift
578 : X86SchedWriteWidths<WriteVecShift, WriteVecShiftX,
579 WriteVecShiftY, WriteVecShiftZ>;
580 def SchedWriteVecShiftImm
581 : X86SchedWriteWidths<WriteVecShiftImm, WriteVecShiftImmX,
582 WriteVecShiftImmY, WriteVecShiftImmZ>;
583 def SchedWriteVarVecShift
584 : X86SchedWriteWidths<WriteVarVecShift, WriteVarVecShift,
585 WriteVarVecShiftY, WriteVarVecShiftZ>;
586 def SchedWriteVecIMul
587 : X86SchedWriteWidths<WriteVecIMul, WriteVecIMulX,
588 WriteVecIMulY, WriteVecIMulZ>;
590 : X86SchedWriteWidths<WritePMULLD, WritePMULLD,
591 WritePMULLDY, WritePMULLDZ>;
593 : X86SchedWriteWidths<WriteMPSAD, WriteMPSAD,
594 WriteMPSADY, WriteMPSADZ>;
596 : X86SchedWriteWidths<WritePSADBW, WritePSADBWX,
597 WritePSADBWY, WritePSADBWZ>;
599 def SchedWriteShuffle
600 : X86SchedWriteWidths<WriteShuffle, WriteShuffleX,
601 WriteShuffleY, WriteShuffleZ>;
602 def SchedWriteVarShuffle
603 : X86SchedWriteWidths<WriteVarShuffle, WriteVarShuffleX,
604 WriteVarShuffleY, WriteVarShuffleZ>;
606 : X86SchedWriteWidths<WriteBlend, WriteBlend, WriteBlendY, WriteBlendZ>;
607 def SchedWriteVarBlend
608 : X86SchedWriteWidths<WriteVarBlend, WriteVarBlend,
609 WriteVarBlendY, WriteVarBlendZ>;
611 // Vector size wrappers.
612 def SchedWriteFAddSizes
613 : X86SchedWriteSizes<SchedWriteFAdd, SchedWriteFAdd64>;
614 def SchedWriteFCmpSizes
615 : X86SchedWriteSizes<SchedWriteFCmp, SchedWriteFCmp64>;
616 def SchedWriteFMulSizes
617 : X86SchedWriteSizes<SchedWriteFMul, SchedWriteFMul64>;
618 def SchedWriteFDivSizes
619 : X86SchedWriteSizes<SchedWriteFDiv, SchedWriteFDiv64>;
620 def SchedWriteFSqrtSizes
621 : X86SchedWriteSizes<SchedWriteFSqrt, SchedWriteFSqrt64>;
622 def SchedWriteFLogicSizes
623 : X86SchedWriteSizes<SchedWriteFLogic, SchedWriteFLogic>;
624 def SchedWriteFShuffleSizes
625 : X86SchedWriteSizes<SchedWriteFShuffle, SchedWriteFShuffle>;
627 //===----------------------------------------------------------------------===//
628 // Generic Processor Scheduler Models.
630 // IssueWidth is analogous to the number of decode units. Core and its
631 // descendents, including Nehalem and SandyBridge have 4 decoders.
632 // Resources beyond the decoder operate on micro-ops and are bufferred
633 // so adjacent micro-ops don't directly compete.
635 // MicroOpBufferSize > 1 indicates that RAW dependencies can be
636 // decoded in the same cycle. The value 32 is a reasonably arbitrary
637 // number of in-flight instructions.
639 // HighLatency=10 is optimistic. X86InstrInfo::isHighLatencyDef
640 // indicates high latency opcodes. Alternatively, InstrItinData
641 // entries may be included here to define specific operand
642 // latencies. Since these latencies are not used for pipeline hazards,
643 // they do not need to be exact.
645 // The GenericX86Model contains no instruction schedules
646 // and disables PostRAScheduler.
647 class GenericX86Model : SchedMachineModel {
649 let MicroOpBufferSize = 32;
651 let HighLatency = 10;
652 let PostRAScheduler = 0;
653 let CompleteModel = 0;
656 def GenericModel : GenericX86Model;
658 // Define a model with the PostRAScheduler enabled.
659 def GenericPostRAModel : GenericX86Model {
660 let PostRAScheduler = 1;