blob: ccee972c482c9b49f577ac625758020f9dc7a7c8 [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
Simon Pilgrimead11e42018-05-11 12:46:54 +000071// Multiclass that wraps move/load/store triple for a vector width.
72class X86SchedWriteMoveLS<SchedWrite MoveRR,
73 SchedWrite LoadRM,
74 SchedWrite StoreMR> {
75 SchedWrite RR = MoveRR;
76 SchedWrite RM = LoadRM;
77 SchedWrite MR = StoreMR;
78}
79
80// Multiclass that wraps X86SchedWriteMoveLS for each vector width.
81class X86SchedWriteMoveLSWidths<X86SchedWriteMoveLS sScl,
82 X86SchedWriteMoveLS s128,
83 X86SchedWriteMoveLS s256,
84 X86SchedWriteMoveLS s512> {
85 X86SchedWriteMoveLS Scl = sScl; // Scalar float/double operations.
86 X86SchedWriteMoveLS MMX = sScl; // MMX operations.
87 X86SchedWriteMoveLS XMM = s128; // XMM operations.
88 X86SchedWriteMoveLS YMM = s256; // YMM operations.
89 X86SchedWriteMoveLS ZMM = s512; // ZMM operations.
90}
91
Craig Topperb7baa352018-04-08 17:53:18 +000092// Loads, stores, and moves, not folded with other operations.
Simon Pilgrim215ce4a2018-05-14 18:37:19 +000093def WriteLoad : SchedWrite;
94def WriteStore : SchedWrite;
95def WriteStoreNT : SchedWrite;
96def WriteMove : SchedWrite;
Craig Topperb7baa352018-04-08 17:53:18 +000097
Simon Pilgrima271c542017-05-03 15:42:29 +000098// Arithmetic.
Simon Pilgrim2864b462018-05-08 14:55:16 +000099defm WriteALU : X86SchedWritePair; // Simple integer ALU op.
Simon Pilgrim0c0336e2018-05-17 12:43:42 +0000100defm WriteADC : X86SchedWritePair; // Integer ALU + flags op.
Simon Pilgrimead11e42018-05-11 12:46:54 +0000101def WriteALURMW : WriteSequence<[WriteALULd, WriteStore]>;
Simon Pilgrim0c0336e2018-05-17 12:43:42 +0000102def WriteADCRMW : WriteSequence<[WriteADCLd, WriteStore]>;
Simon Pilgrim2864b462018-05-08 14:55:16 +0000103defm WriteIMul : X86SchedWritePair; // Integer multiplication.
104defm WriteIMul64 : X86SchedWritePair; // Integer 64-bit multiplication.
105def WriteIMulH : SchedWrite; // Integer multiplication, high part.
106def WriteLEA : SchedWrite; // LEA instructions can't fold loads.
Simon Pilgrima271c542017-05-03 15:42:29 +0000107
Simon Pilgrim25805542018-05-08 13:51:45 +0000108// Integer division.
109defm WriteDiv8 : X86SchedWritePair;
110defm WriteDiv16 : X86SchedWritePair;
111defm WriteDiv32 : X86SchedWritePair;
112defm WriteDiv64 : X86SchedWritePair;
113defm WriteIDiv8 : X86SchedWritePair;
114defm WriteIDiv16 : X86SchedWritePair;
115defm WriteIDiv32 : X86SchedWritePair;
116defm WriteIDiv64 : X86SchedWritePair;
117
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000118defm WriteBitScan : X86SchedWritePair; // Bit scan forward/reverse.
119defm WritePOPCNT : X86SchedWritePair; // Bit population count.
120defm WriteLZCNT : X86SchedWritePair; // Leading zero count.
121defm WriteTZCNT : X86SchedWritePair; // Trailing zero count.
Simon Pilgrim2782a192018-05-17 16:47:30 +0000122defm WriteCMOV : X86SchedWritePair; // Conditional move.
123defm WriteCMOV2 : X86SchedWritePair; // Conditional (CF + ZF flag) move.
Simon Pilgrim6e160c12018-05-12 18:07:07 +0000124def WriteFCMOV : SchedWrite; // X87 conditional move.
Craig Topperb7baa352018-04-08 17:53:18 +0000125def WriteSETCC : SchedWrite; // Set register based on condition code.
126def WriteSETCCStore : SchedWrite;
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000127
Simon Pilgrima271c542017-05-03 15:42:29 +0000128// Integer shifts and rotates.
129defm WriteShift : X86SchedWritePair;
130
Craig Topper89310f52018-03-29 20:41:39 +0000131// BMI1 BEXTR, BMI2 BZHI
132defm WriteBEXTR : X86SchedWritePair;
133defm WriteBZHI : X86SchedWritePair;
134
Simon Pilgrima271c542017-05-03 15:42:29 +0000135// Idioms that clear a register, like xorps %xmm0, %xmm0.
136// These can often bypass execution ports completely.
137def WriteZero : SchedWrite;
138
139// Branches don't produce values, so they have no latency, but they still
140// consume resources. Indirect branches can fold loads.
141defm WriteJump : X86SchedWritePair;
142
143// Floating point. This covers both scalar and vector operations.
Clement Courbetb78ab502018-05-31 11:41:27 +0000144def WriteFLD0 : SchedWrite;
145def WriteFLD1 : SchedWrite;
Clement Courbet2e41c5a2018-05-31 14:22:01 +0000146def WriteFLDC : SchedWrite;
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000147def WriteFLoad : SchedWrite;
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000148def WriteFLoadX : SchedWrite;
149def WriteFLoadY : SchedWrite;
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000150def WriteFMaskedLoad : SchedWrite;
151def WriteFMaskedLoadY : SchedWrite;
152def WriteFStore : SchedWrite;
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000153def WriteFStoreX : SchedWrite;
154def WriteFStoreY : SchedWrite;
Simon Pilgrim215ce4a2018-05-14 18:37:19 +0000155def WriteFStoreNT : SchedWrite;
156def WriteFStoreNTX : SchedWrite;
157def WriteFStoreNTY : SchedWrite;
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000158def WriteFMaskedStore : SchedWrite;
159def WriteFMaskedStoreY : SchedWrite;
160def WriteFMove : SchedWrite;
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000161def WriteFMoveX : SchedWrite;
162def WriteFMoveY : SchedWrite;
Simon Pilgrim1233e122018-05-07 20:52:53 +0000163
164defm WriteFAdd : X86SchedWritePair; // Floating point add/sub.
165defm WriteFAddX : X86SchedWritePair; // Floating point add/sub (XMM).
166defm WriteFAddY : X86SchedWritePair; // Floating point add/sub (YMM/ZMM).
167defm WriteFAdd64 : X86SchedWritePair; // Floating point double add/sub.
168defm WriteFAdd64X : X86SchedWritePair; // Floating point double add/sub (XMM).
169defm WriteFAdd64Y : X86SchedWritePair; // Floating point double add/sub (YMM/ZMM).
170defm WriteFCmp : X86SchedWritePair; // Floating point compare.
171defm WriteFCmpX : X86SchedWritePair; // Floating point compare (XMM).
172defm WriteFCmpY : X86SchedWritePair; // Floating point compare (YMM/ZMM).
173defm WriteFCmp64 : X86SchedWritePair; // Floating point double compare.
174defm WriteFCmp64X : X86SchedWritePair; // Floating point double compare (XMM).
175defm WriteFCmp64Y : X86SchedWritePair; // Floating point double compare (YMM/ZMM).
176defm WriteFCom : X86SchedWritePair; // Floating point compare to flags.
177defm WriteFMul : X86SchedWritePair; // Floating point multiplication.
178defm WriteFMulX : X86SchedWritePair; // Floating point multiplication (XMM).
179defm WriteFMulY : X86SchedWritePair; // Floating point multiplication (YMM/ZMM).
180defm WriteFMul64 : X86SchedWritePair; // Floating point double multiplication.
181defm WriteFMul64X : X86SchedWritePair; // Floating point double multiplication (XMM).
182defm WriteFMul64Y : X86SchedWritePair; // Floating point double multiplication (YMM/ZMM).
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000183defm WriteFDiv : X86SchedWritePair; // Floating point division.
184defm WriteFDivX : X86SchedWritePair; // Floating point division (XMM).
185defm WriteFDivY : X86SchedWritePair; // Floating point division (YMM).
186defm WriteFDivZ : X86SchedWritePair; // Floating point division (ZMM).
Simon Pilgrim1233e122018-05-07 20:52:53 +0000187defm WriteFDiv64 : X86SchedWritePair; // Floating point double division.
188defm WriteFDiv64X : X86SchedWritePair; // Floating point double division (XMM).
189defm WriteFDiv64Y : X86SchedWritePair; // Floating point double division (YMM).
190defm WriteFDiv64Z : X86SchedWritePair; // Floating point double division (ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000191defm WriteFSqrt : X86SchedWritePair; // Floating point square root.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000192defm WriteFSqrtX : X86SchedWritePair; // Floating point square root (XMM).
193defm WriteFSqrtY : X86SchedWritePair; // Floating point square root (YMM).
194defm WriteFSqrtZ : X86SchedWritePair; // Floating point square root (ZMM).
195defm WriteFSqrt64 : X86SchedWritePair; // Floating point double square root.
196defm WriteFSqrt64X : X86SchedWritePair; // Floating point double square root (XMM).
197defm WriteFSqrt64Y : X86SchedWritePair; // Floating point double square root (YMM).
198defm WriteFSqrt64Z : X86SchedWritePair; // Floating point double square root (ZMM).
199defm WriteFSqrt80 : X86SchedWritePair; // Floating point long double square root.
Simon Pilgrima271c542017-05-03 15:42:29 +0000200defm WriteFRcp : X86SchedWritePair; // Floating point reciprocal estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000201defm WriteFRcpX : X86SchedWritePair; // Floating point reciprocal estimate (XMM).
Simon Pilgrimc7088682018-05-01 18:06:07 +0000202defm WriteFRcpY : X86SchedWritePair; // Floating point reciprocal estimate (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000203defm WriteFRsqrt : X86SchedWritePair; // Floating point reciprocal square root estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000204defm WriteFRsqrtX: X86SchedWritePair; // Floating point reciprocal square root estimate (XMM).
Simon Pilgrimc7088682018-05-01 18:06:07 +0000205defm WriteFRsqrtY: X86SchedWritePair; // Floating point reciprocal square root estimate (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000206defm WriteFMA : X86SchedWritePair; // Fused Multiply Add.
Simon Pilgrim67cc2462018-05-04 15:20:18 +0000207defm WriteFMAX : X86SchedWritePair; // Fused Multiply Add (XMM).
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000208defm WriteFMAY : X86SchedWritePair; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000209defm WriteDPPD : X86SchedWritePair; // Floating point double dot product.
210defm WriteDPPS : X86SchedWritePair; // Floating point single dot product.
211defm WriteDPPSY : X86SchedWritePair; // Floating point single dot product (YMM).
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000212defm WriteFSign : X86SchedWritePair; // Floating point fabs/fchs.
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000213defm WriteFRnd : X86SchedWritePair; // Floating point rounding.
214defm WriteFRndY : X86SchedWritePair; // Floating point rounding (YMM/ZMM).
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000215defm WriteFLogic : X86SchedWritePair; // Floating point and/or/xor logicals.
216defm WriteFLogicY : X86SchedWritePair; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000217defm WriteFTest : X86SchedWritePair; // Floating point TEST instructions.
218defm WriteFTestY : X86SchedWritePair; // Floating point TEST instructions (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000219defm WriteFShuffle : X86SchedWritePair; // Floating point vector shuffles.
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000220defm WriteFShuffleY : X86SchedWritePair; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000221defm WriteFVarShuffle : X86SchedWritePair; // Floating point vector variable shuffles.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000222defm WriteFVarShuffleY : X86SchedWritePair; // Floating point vector variable shuffles (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000223defm WriteFBlend : X86SchedWritePair; // Floating point vector blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000224defm WriteFBlendY : X86SchedWritePair; // Floating point vector blends (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000225defm WriteFVarBlend : X86SchedWritePair; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000226defm WriteFVarBlendY : X86SchedWritePair; // Fp vector variable blends (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000227
228// FMA Scheduling helper class.
229class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
230
Andrew V. Tischenko8cb1d092017-06-08 16:44:13 +0000231// Horizontal Add/Sub (float and integer)
232defm WriteFHAdd : X86SchedWritePair;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000233defm WriteFHAddY : X86SchedWritePair; // YMM/ZMM.
234defm WritePHAdd : X86SchedWritePair;
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000235defm WritePHAddX : X86SchedWritePair; // XMM.
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000236defm WritePHAddY : X86SchedWritePair; // YMM/ZMM.
Andrew V. Tischenko8cb1d092017-06-08 16:44:13 +0000237
Simon Pilgrima271c542017-05-03 15:42:29 +0000238// Vector integer operations.
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000239def WriteVecLoad : SchedWrite;
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000240def WriteVecLoadX : SchedWrite;
241def WriteVecLoadY : SchedWrite;
Simon Pilgrim215ce4a2018-05-14 18:37:19 +0000242def WriteVecLoadNT : SchedWrite;
243def WriteVecLoadNTY : SchedWrite;
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000244def WriteVecMaskedLoad : SchedWrite;
245def WriteVecMaskedLoadY : SchedWrite;
246def WriteVecStore : SchedWrite;
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000247def WriteVecStoreX : SchedWrite;
248def WriteVecStoreY : SchedWrite;
Simon Pilgrim215ce4a2018-05-14 18:37:19 +0000249def WriteVecStoreNT : SchedWrite;
250def WriteVecStoreNTY : SchedWrite;
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000251def WriteVecMaskedStore : SchedWrite;
252def WriteVecMaskedStoreY : SchedWrite;
253def WriteVecMove : SchedWrite;
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000254def WriteVecMoveX : SchedWrite;
255def WriteVecMoveY : SchedWrite;
Simon Pilgrim1273f4a2018-05-18 17:58:36 +0000256def WriteVecMoveToGpr : SchedWrite;
257def WriteVecMoveFromGpr : SchedWrite;
Simon Pilgrim210286e2018-05-08 10:28:03 +0000258
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000259defm WriteVecALU : X86SchedWritePair; // Vector integer ALU op, no logicals.
260defm WriteVecALUX : X86SchedWritePair; // Vector integer ALU op, no logicals (XMM).
261defm WriteVecALUY : X86SchedWritePair; // Vector integer ALU op, no logicals (YMM/ZMM).
262defm WriteVecLogic : X86SchedWritePair; // Vector integer and/or/xor logicals.
263defm WriteVecLogicX : X86SchedWritePair; // Vector integer and/or/xor logicals (XMM).
264defm WriteVecLogicY : X86SchedWritePair; // Vector integer and/or/xor logicals (YMM/ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000265defm WriteVecTest : X86SchedWritePair; // Vector integer TEST instructions.
266defm WriteVecTestY : X86SchedWritePair; // Vector integer TEST instructions (YMM/ZMM).
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000267defm WriteVecShift : X86SchedWritePair; // Vector integer shifts (default).
268defm WriteVecShiftX : X86SchedWritePair; // Vector integer shifts (XMM).
269defm WriteVecShiftY : X86SchedWritePair; // Vector integer shifts (YMM/ZMM).
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000270defm WriteVecShiftImm : X86SchedWritePair; // Vector integer immediate shifts (default).
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000271defm WriteVecShiftImmX: X86SchedWritePair; // Vector integer immediate shifts (XMM).
272defm WriteVecShiftImmY: X86SchedWritePair; // Vector integer immediate shifts (YMM/ZMM).
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000273defm WriteVecIMul : X86SchedWritePair; // Vector integer multiply (default).
274defm WriteVecIMulX : X86SchedWritePair; // Vector integer multiply (XMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000275defm WriteVecIMulY : X86SchedWritePair; // Vector integer multiply (YMM/ZMM).
276defm WritePMULLD : X86SchedWritePair; // Vector PMULLD.
277defm WritePMULLDY : X86SchedWritePair; // Vector PMULLD (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000278defm WriteShuffle : X86SchedWritePair; // Vector shuffles.
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000279defm WriteShuffleX : X86SchedWritePair; // Vector shuffles (XMM).
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000280defm WriteShuffleY : X86SchedWritePair; // Vector shuffles (YMM/ZMM).
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000281defm WriteVarShuffle : X86SchedWritePair; // Vector variable shuffles.
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000282defm WriteVarShuffleX : X86SchedWritePair; // Vector variable shuffles (XMM).
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000283defm WriteVarShuffleY : X86SchedWritePair; // Vector variable shuffles (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000284defm WriteBlend : X86SchedWritePair; // Vector blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000285defm WriteBlendY : X86SchedWritePair; // Vector blends (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000286defm WriteVarBlend : X86SchedWritePair; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000287defm WriteVarBlendY : X86SchedWritePair; // Vector variable blends (YMM/ZMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000288defm WritePSADBW : X86SchedWritePair; // Vector PSADBW.
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000289defm WritePSADBWX : X86SchedWritePair; // Vector PSADBW (XMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000290defm WritePSADBWY : X86SchedWritePair; // Vector PSADBW (YMM/ZMM).
291defm WriteMPSAD : X86SchedWritePair; // Vector MPSAD.
292defm WriteMPSADY : X86SchedWritePair; // Vector MPSAD (YMM/ZMM).
Simon Pilgrim27bc83e2018-04-24 18:49:25 +0000293defm WritePHMINPOS : X86SchedWritePair; // Vector PHMINPOS.
Simon Pilgrima271c542017-05-03 15:42:29 +0000294
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000295// Vector insert/extract operations.
296defm WriteVecInsert : X86SchedWritePair; // Insert gpr to vector element.
297def WriteVecExtract : SchedWrite; // Extract vector element to gpr.
298def WriteVecExtractSt : SchedWrite; // Extract vector element and store.
299
Simon Pilgrima2f26782018-03-27 20:38:54 +0000300// MOVMSK operations.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000301def WriteFMOVMSK : SchedWrite;
302def WriteVecMOVMSK : SchedWrite;
303def WriteVecMOVMSKY : SchedWrite;
304def WriteMMXMOVMSK : SchedWrite;
Simon Pilgrima2f26782018-03-27 20:38:54 +0000305
Simon Pilgrima271c542017-05-03 15:42:29 +0000306// Conversion between integer and float.
Simon Pilgrim5647e892018-05-16 10:53:45 +0000307defm WriteCvtSD2I : X86SchedWritePair; // Double -> Integer.
308defm WriteCvtPD2I : X86SchedWritePair; // Double -> Integer (XMM).
309defm WriteCvtPD2IY : X86SchedWritePair; // Double -> Integer (YMM/ZMM).
310
311defm WriteCvtSS2I : X86SchedWritePair; // Float -> Integer.
312defm WriteCvtPS2I : X86SchedWritePair; // Float -> Integer (XMM).
313defm WriteCvtPS2IY : X86SchedWritePair; // Float -> Integer (YMM/ZMM).
314
315defm WriteCvtI2SD : X86SchedWritePair; // Integer -> Double.
316defm WriteCvtI2PD : X86SchedWritePair; // Integer -> Double (XMM).
317defm WriteCvtI2PDY : X86SchedWritePair; // Integer -> Double (YMM/ZMM).
318
319defm WriteCvtI2SS : X86SchedWritePair; // Integer -> Float.
320defm WriteCvtI2PS : X86SchedWritePair; // Integer -> Float (XMM).
321defm WriteCvtI2PSY : X86SchedWritePair; // Integer -> Float (YMM/ZMM).
Simon Pilgrimbe9a2062018-05-15 17:36:49 +0000322
323defm WriteCvtSS2SD : X86SchedWritePair; // Float -> Double size conversion.
324defm WriteCvtPS2PD : X86SchedWritePair; // Float -> Double size conversion (XMM).
325defm WriteCvtPS2PDY : X86SchedWritePair; // Float -> Double size conversion (YMM/ZMM).
326
327defm WriteCvtSD2SS : X86SchedWritePair; // Double -> Float size conversion.
328defm WriteCvtPD2PS : X86SchedWritePair; // Double -> Float size conversion (XMM).
329defm WriteCvtPD2PSY : X86SchedWritePair; // Double -> Float size conversion (YMM/ZMM).
Simon Pilgrim891ebcd2018-05-15 14:12:32 +0000330
331defm WriteCvtPH2PS : X86SchedWritePair; // Half -> Float size conversion.
332defm WriteCvtPH2PSY : X86SchedWritePair; // Half -> Float size conversion (YMM/ZMM).
333
334def WriteCvtPS2PH : SchedWrite; // // Float -> Half size conversion.
335def WriteCvtPS2PHY : SchedWrite; // // Float -> Half size conversion (YMM/ZMM).
336def WriteCvtPS2PHSt : SchedWrite; // // Float -> Half + store size conversion.
337def WriteCvtPS2PHYSt : SchedWrite; // // Float -> Half + store size conversion (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000338
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000339// CRC32 instruction.
340defm WriteCRC32 : X86SchedWritePair;
341
Simon Pilgrima271c542017-05-03 15:42:29 +0000342// Strings instructions.
343// Packed Compare Implicit Length Strings, Return Mask
344defm WritePCmpIStrM : X86SchedWritePair;
345// Packed Compare Explicit Length Strings, Return Mask
346defm WritePCmpEStrM : X86SchedWritePair;
347// Packed Compare Implicit Length Strings, Return Index
348defm WritePCmpIStrI : X86SchedWritePair;
349// Packed Compare Explicit Length Strings, Return Index
350defm WritePCmpEStrI : X86SchedWritePair;
351
352// AES instructions.
353defm WriteAESDecEnc : X86SchedWritePair; // Decryption, encryption.
354defm WriteAESIMC : X86SchedWritePair; // InvMixColumn.
355defm WriteAESKeyGen : X86SchedWritePair; // Key Generation.
356
357// Carry-less multiplication instructions.
358defm WriteCLMul : X86SchedWritePair;
359
Simon Pilgrim0e51a122018-05-04 18:16:13 +0000360// EMMS/FEMMS
361def WriteEMMS : SchedWrite;
362
Craig Topper05242bf2018-04-21 18:07:36 +0000363// Load/store MXCSR
364def WriteLDMXCSR : SchedWrite;
365def WriteSTMXCSR : SchedWrite;
366
Simon Pilgrima271c542017-05-03 15:42:29 +0000367// Catch-all for expensive system instructions.
368def WriteSystem : SchedWrite;
369
370// AVX2.
371defm WriteFShuffle256 : X86SchedWritePair; // Fp 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000372defm WriteFVarShuffle256 : X86SchedWritePair; // Fp 256-bit width variable shuffles.
Simon Pilgrima271c542017-05-03 15:42:29 +0000373defm WriteShuffle256 : X86SchedWritePair; // 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000374defm WriteVarShuffle256 : X86SchedWritePair; // 256-bit width vector variable shuffles.
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000375defm WriteVarVecShift : X86SchedWritePair; // Variable vector shifts.
376defm WriteVarVecShiftY : X86SchedWritePair; // Variable vector shifts (YMM/ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000377
378// Old microcoded instructions that nobody use.
379def WriteMicrocoded : SchedWrite;
380
381// Fence instructions.
382def WriteFence : SchedWrite;
383
384// Nop, not very useful expect it provides a model for nops!
385def WriteNop : SchedWrite;
386
Simon Pilgrimead11e42018-05-11 12:46:54 +0000387// Move/Load/Store wrappers.
388def WriteFMoveLS
389 : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStore>;
390def WriteFMoveLSX
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000391 : X86SchedWriteMoveLS<WriteFMoveX, WriteFLoadX, WriteFStoreX>;
Simon Pilgrimead11e42018-05-11 12:46:54 +0000392def WriteFMoveLSY
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000393 : X86SchedWriteMoveLS<WriteFMoveY, WriteFLoadY, WriteFStoreY>;
Simon Pilgrimead11e42018-05-11 12:46:54 +0000394def SchedWriteFMoveLS
395 : X86SchedWriteMoveLSWidths<WriteFMoveLS, WriteFMoveLSX,
396 WriteFMoveLSY, WriteFMoveLSY>;
397
Simon Pilgrim215ce4a2018-05-14 18:37:19 +0000398def WriteFMoveLSNT
399 : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStoreNT>;
400def WriteFMoveLSNTX
401 : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStoreNTX>;
402def WriteFMoveLSNTY
403 : X86SchedWriteMoveLS<WriteFMoveY, WriteFLoadY, WriteFStoreNTY>;
404def SchedWriteFMoveLSNT
405 : X86SchedWriteMoveLSWidths<WriteFMoveLSNT, WriteFMoveLSNTX,
406 WriteFMoveLSNTY, WriteFMoveLSNTY>;
407
Simon Pilgrimead11e42018-05-11 12:46:54 +0000408def WriteVecMoveLS
409 : X86SchedWriteMoveLS<WriteVecMove, WriteVecLoad, WriteVecStore>;
410def WriteVecMoveLSX
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000411 : X86SchedWriteMoveLS<WriteVecMoveX, WriteVecLoadX, WriteVecStoreX>;
Simon Pilgrimead11e42018-05-11 12:46:54 +0000412def WriteVecMoveLSY
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000413 : X86SchedWriteMoveLS<WriteVecMoveY, WriteVecLoadY, WriteVecStoreY>;
Simon Pilgrimead11e42018-05-11 12:46:54 +0000414def SchedWriteVecMoveLS
415 : X86SchedWriteMoveLSWidths<WriteVecMoveLS, WriteVecMoveLSX,
416 WriteVecMoveLSY, WriteVecMoveLSY>;
417
Simon Pilgrim215ce4a2018-05-14 18:37:19 +0000418def WriteVecMoveLSNT
419 : X86SchedWriteMoveLS<WriteVecMove, WriteVecLoadNT, WriteVecStoreNT>;
420def WriteVecMoveLSNTX
421 : X86SchedWriteMoveLS<WriteVecMoveX, WriteVecLoadNT, WriteVecStoreNT>;
422def WriteVecMoveLSNTY
423 : X86SchedWriteMoveLS<WriteVecMoveY, WriteVecLoadNTY, WriteVecStoreNTY>;
424def SchedWriteVecMoveLSNT
425 : X86SchedWriteMoveLSWidths<WriteVecMoveLSNT, WriteVecMoveLSNTX,
426 WriteVecMoveLSNTY, WriteVecMoveLSNTY>;
427
Simon Pilgrim3c354082018-04-30 18:18:38 +0000428// Vector width wrappers.
429def SchedWriteFAdd
Simon Pilgrim1233e122018-05-07 20:52:53 +0000430 : X86SchedWriteWidths<WriteFAdd, WriteFAddX, WriteFAddY, WriteFAddY>;
431def SchedWriteFAdd64
432 : X86SchedWriteWidths<WriteFAdd64, WriteFAdd64X, WriteFAdd64Y, WriteFAdd64Y>;
Simon Pilgrim342ac8c2018-05-03 09:11:32 +0000433def SchedWriteFHAdd
434 : X86SchedWriteWidths<WriteFHAdd, WriteFHAdd, WriteFHAddY, WriteFHAddY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000435def SchedWriteFCmp
Simon Pilgrim1233e122018-05-07 20:52:53 +0000436 : X86SchedWriteWidths<WriteFCmp, WriteFCmpX, WriteFCmpY, WriteFCmpY>;
437def SchedWriteFCmp64
438 : X86SchedWriteWidths<WriteFCmp64, WriteFCmp64X, WriteFCmp64Y, WriteFCmp64Y>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000439def SchedWriteFMul
Simon Pilgrim1233e122018-05-07 20:52:53 +0000440 : X86SchedWriteWidths<WriteFMul, WriteFMulX, WriteFMulY, WriteFMulY>;
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000441def SchedWriteFMul64
Simon Pilgrim1233e122018-05-07 20:52:53 +0000442 : X86SchedWriteWidths<WriteFMul64, WriteFMul64X, WriteFMul64Y, WriteFMul64Y>;
Simon Pilgrima1f1a3b2018-05-02 13:32:56 +0000443def SchedWriteFMA
Simon Pilgrim67cc2462018-05-04 15:20:18 +0000444 : X86SchedWriteWidths<WriteFMA, WriteFMAX, WriteFMAY, WriteFMAY>;
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000445def SchedWriteDPPD
446 : X86SchedWriteWidths<WriteDPPD, WriteDPPD, WriteDPPD, WriteDPPD>;
447def SchedWriteDPPS
448 : X86SchedWriteWidths<WriteDPPS, WriteDPPS, WriteDPPSY, WriteDPPSY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000449def SchedWriteFDiv
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000450 : X86SchedWriteWidths<WriteFDiv, WriteFDivX, WriteFDivY, WriteFDivZ>;
451def SchedWriteFDiv64
452 : X86SchedWriteWidths<WriteFDiv64, WriteFDiv64X, WriteFDiv64Y, WriteFDiv64Z>;
Simon Pilgrimc7088682018-05-01 18:06:07 +0000453def SchedWriteFSqrt
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000454 : X86SchedWriteWidths<WriteFSqrt, WriteFSqrtX,
455 WriteFSqrtY, WriteFSqrtZ>;
456def SchedWriteFSqrt64
457 : X86SchedWriteWidths<WriteFSqrt64, WriteFSqrt64X,
458 WriteFSqrt64Y, WriteFSqrt64Z>;
Simon Pilgrim1b7a80d2018-05-01 15:57:17 +0000459def SchedWriteFRcp
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000460 : X86SchedWriteWidths<WriteFRcp, WriteFRcpX, WriteFRcpY, WriteFRcpY>;
Simon Pilgrim1b7a80d2018-05-01 15:57:17 +0000461def SchedWriteFRsqrt
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000462 : X86SchedWriteWidths<WriteFRsqrt, WriteFRsqrtX, WriteFRsqrtY, WriteFRsqrtY>;
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000463def SchedWriteFRnd
464 : X86SchedWriteWidths<WriteFRnd, WriteFRnd, WriteFRndY, WriteFRndY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000465def SchedWriteFLogic
466 : X86SchedWriteWidths<WriteFLogic, WriteFLogic, WriteFLogicY, WriteFLogicY>;
Simon Pilgrim210286e2018-05-08 10:28:03 +0000467def SchedWriteFTest
468 : X86SchedWriteWidths<WriteFTest, WriteFTest, WriteFTestY, WriteFTestY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000469
470def SchedWriteFShuffle
471 : X86SchedWriteWidths<WriteFShuffle, WriteFShuffle,
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000472 WriteFShuffleY, WriteFShuffleY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000473def SchedWriteFVarShuffle
474 : X86SchedWriteWidths<WriteFVarShuffle, WriteFVarShuffle,
475 WriteFVarShuffleY, WriteFVarShuffleY>;
476def SchedWriteFBlend
477 : X86SchedWriteWidths<WriteFBlend, WriteFBlend, WriteFBlendY, WriteFBlendY>;
478def SchedWriteFVarBlend
479 : X86SchedWriteWidths<WriteFVarBlend, WriteFVarBlend,
480 WriteFVarBlendY, WriteFVarBlendY>;
481
Simon Pilgrim5647e892018-05-16 10:53:45 +0000482def SchedWriteCvtDQ2PD
483 : X86SchedWriteWidths<WriteCvtI2SD, WriteCvtI2PD,
484 WriteCvtI2PDY, WriteCvtI2PDY>;
485def SchedWriteCvtDQ2PS
486 : X86SchedWriteWidths<WriteCvtI2SS, WriteCvtI2PS,
487 WriteCvtI2PSY, WriteCvtI2PSY>;
488def SchedWriteCvtPD2DQ
489 : X86SchedWriteWidths<WriteCvtSD2I, WriteCvtPD2I,
490 WriteCvtPD2IY, WriteCvtPD2IY>;
491def SchedWriteCvtPS2DQ
492 : X86SchedWriteWidths<WriteCvtSS2I, WriteCvtPS2I,
493 WriteCvtPS2IY, WriteCvtPS2IY>;
Simon Pilgrimbe9a2062018-05-15 17:36:49 +0000494def SchedWriteCvtPS2PD
495 : X86SchedWriteWidths<WriteCvtSS2SD, WriteCvtPS2PD,
496 WriteCvtPS2PDY, WriteCvtPS2PDY>;
497def SchedWriteCvtPD2PS
498 : X86SchedWriteWidths<WriteCvtSD2SS, WriteCvtPD2PS,
499 WriteCvtPD2PSY, WriteCvtPD2PSY>;
500
Simon Pilgrim3c354082018-04-30 18:18:38 +0000501def SchedWriteVecALU
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000502 : X86SchedWriteWidths<WriteVecALU, WriteVecALUX, WriteVecALUY, WriteVecALUY>;
Simon Pilgrim342ac8c2018-05-03 09:11:32 +0000503def SchedWritePHAdd
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000504 : X86SchedWriteWidths<WritePHAdd, WritePHAddX, WritePHAddY, WritePHAddY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000505def SchedWriteVecLogic
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000506 : X86SchedWriteWidths<WriteVecLogic, WriteVecLogicX,
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000507 WriteVecLogicY, WriteVecLogicY>;
Simon Pilgrim210286e2018-05-08 10:28:03 +0000508def SchedWriteVecTest
509 : X86SchedWriteWidths<WriteVecTest, WriteVecTest,
510 WriteVecTestY, WriteVecTestY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000511def SchedWriteVecShift
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000512 : X86SchedWriteWidths<WriteVecShift, WriteVecShiftX,
513 WriteVecShiftY, WriteVecShiftY>;
514def SchedWriteVecShiftImm
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000515 : X86SchedWriteWidths<WriteVecShiftImm, WriteVecShiftImmX,
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000516 WriteVecShiftImmY, WriteVecShiftImmY>;
Simon Pilgrime8671ef2018-05-02 12:27:54 +0000517def SchedWriteVarVecShift
518 : X86SchedWriteWidths<WriteVarVecShift, WriteVarVecShift,
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000519 WriteVarVecShiftY, WriteVarVecShiftY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000520def SchedWriteVecIMul
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000521 : X86SchedWriteWidths<WriteVecIMul, WriteVecIMulX,
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000522 WriteVecIMulY, WriteVecIMulY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000523def SchedWritePMULLD
524 : X86SchedWriteWidths<WritePMULLD, WritePMULLD,
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000525 WritePMULLDY, WritePMULLDY>;
Simon Pilgrime8671ef2018-05-02 12:27:54 +0000526def SchedWriteMPSAD
527 : X86SchedWriteWidths<WriteMPSAD, WriteMPSAD,
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000528 WriteMPSADY, WriteMPSADY>;
Simon Pilgrime8671ef2018-05-02 12:27:54 +0000529def SchedWritePSADBW
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000530 : X86SchedWriteWidths<WritePSADBW, WritePSADBWX,
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000531 WritePSADBWY, WritePSADBWY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000532
533def SchedWriteShuffle
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000534 : X86SchedWriteWidths<WriteShuffle, WriteShuffleX,
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000535 WriteShuffleY, WriteShuffleY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000536def SchedWriteVarShuffle
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000537 : X86SchedWriteWidths<WriteVarShuffle, WriteVarShuffleX,
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000538 WriteVarShuffleY, WriteVarShuffleY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000539def SchedWriteBlend
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000540 : X86SchedWriteWidths<WriteBlend, WriteBlend, WriteBlendY, WriteBlendY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000541def SchedWriteVarBlend
542 : X86SchedWriteWidths<WriteVarBlend, WriteVarBlend,
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000543 WriteVarBlendY, WriteVarBlendY>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000544
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000545// Vector size wrappers.
546def SchedWriteFAddSizes
Simon Pilgrim1233e122018-05-07 20:52:53 +0000547 : X86SchedWriteSizes<SchedWriteFAdd, SchedWriteFAdd64>;
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000548def SchedWriteFCmpSizes
Simon Pilgrim1233e122018-05-07 20:52:53 +0000549 : X86SchedWriteSizes<SchedWriteFCmp, SchedWriteFCmp64>;
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000550def SchedWriteFMulSizes
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000551 : X86SchedWriteSizes<SchedWriteFMul, SchedWriteFMul64>;
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000552def SchedWriteFDivSizes
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000553 : X86SchedWriteSizes<SchedWriteFDiv, SchedWriteFDiv64>;
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000554def SchedWriteFSqrtSizes
555 : X86SchedWriteSizes<SchedWriteFSqrt, SchedWriteFSqrt64>;
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000556def SchedWriteFLogicSizes
557 : X86SchedWriteSizes<SchedWriteFLogic, SchedWriteFLogic>;
558def SchedWriteFShuffleSizes
559 : X86SchedWriteSizes<SchedWriteFShuffle, SchedWriteFShuffle>;
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000560
Simon Pilgrima271c542017-05-03 15:42:29 +0000561//===----------------------------------------------------------------------===//
Simon Pilgrim35935c02018-04-12 18:46:15 +0000562// Generic Processor Scheduler Models.
Simon Pilgrima271c542017-05-03 15:42:29 +0000563
564// IssueWidth is analogous to the number of decode units. Core and its
565// descendents, including Nehalem and SandyBridge have 4 decoders.
566// Resources beyond the decoder operate on micro-ops and are bufferred
567// so adjacent micro-ops don't directly compete.
568//
569// MicroOpBufferSize > 1 indicates that RAW dependencies can be
570// decoded in the same cycle. The value 32 is a reasonably arbitrary
571// number of in-flight instructions.
572//
573// HighLatency=10 is optimistic. X86InstrInfo::isHighLatencyDef
574// indicates high latency opcodes. Alternatively, InstrItinData
575// entries may be included here to define specific operand
576// latencies. Since these latencies are not used for pipeline hazards,
577// they do not need to be exact.
578//
Simon Pilgrime0c78682018-04-13 14:31:57 +0000579// The GenericX86Model contains no instruction schedules
Simon Pilgrima271c542017-05-03 15:42:29 +0000580// and disables PostRAScheduler.
581class GenericX86Model : SchedMachineModel {
582 let IssueWidth = 4;
583 let MicroOpBufferSize = 32;
584 let LoadLatency = 4;
585 let HighLatency = 10;
586 let PostRAScheduler = 0;
587 let CompleteModel = 0;
588}
589
590def GenericModel : GenericX86Model;
591
592// Define a model with the PostRAScheduler enabled.
593def GenericPostRAModel : GenericX86Model {
594 let PostRAScheduler = 1;
595}
596