blob: be3ff86e0b4c9368391ac7df2e25ef3488117bcb [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
Clement Courbetc48435b2018-06-11 07:00:08 +000052// Helpers to mark SchedWrites as unsupported.
53multiclass X86WriteResUnsupported<SchedWrite SchedRW> {
54 let Unsupported = 1 in {
55 def : WriteRes<SchedRW, []>;
56 }
57}
58multiclass X86WriteResPairUnsupported<X86FoldableSchedWrite SchedRW> {
59 let Unsupported = 1 in {
60 def : WriteRes<SchedRW, []>;
61 def : WriteRes<SchedRW.Folded, []>;
62 }
63}
64
Simon Pilgrim3c354082018-04-30 18:18:38 +000065// Multiclass that wraps X86FoldableSchedWrite for each vector width.
66class 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.
75}
76
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +000077// Multiclass that wraps X86SchedWriteWidths for each fp vector type.
78class X86SchedWriteSizes<X86SchedWriteWidths sPS,
79 X86SchedWriteWidths sPD> {
80 X86SchedWriteWidths PS = sPS;
81 X86SchedWriteWidths PD = sPD;
82}
83
Simon Pilgrimead11e42018-05-11 12:46:54 +000084// Multiclass that wraps move/load/store triple for a vector width.
85class X86SchedWriteMoveLS<SchedWrite MoveRR,
86 SchedWrite LoadRM,
87 SchedWrite StoreMR> {
88 SchedWrite RR = MoveRR;
89 SchedWrite RM = LoadRM;
90 SchedWrite MR = StoreMR;
91}
92
93// Multiclass that wraps X86SchedWriteMoveLS for each vector width.
94class 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.
103}
104
Craig Topperb7baa352018-04-08 17:53:18 +0000105// Loads, stores, and moves, not folded with other operations.
Simon Pilgrim215ce4a2018-05-14 18:37:19 +0000106def WriteLoad : SchedWrite;
107def WriteStore : SchedWrite;
108def WriteStoreNT : SchedWrite;
109def WriteMove : SchedWrite;
Craig Topperb7baa352018-04-08 17:53:18 +0000110
Simon Pilgrima271c542017-05-03 15:42:29 +0000111// Arithmetic.
Simon Pilgrim2864b462018-05-08 14:55:16 +0000112defm WriteALU : X86SchedWritePair; // Simple integer ALU op.
Simon Pilgrim0c0336e2018-05-17 12:43:42 +0000113defm WriteADC : X86SchedWritePair; // Integer ALU + flags op.
Simon Pilgrimead11e42018-05-11 12:46:54 +0000114def WriteALURMW : WriteSequence<[WriteALULd, WriteStore]>;
Simon Pilgrim0c0336e2018-05-17 12:43:42 +0000115def WriteADCRMW : WriteSequence<[WriteADCLd, WriteStore]>;
Simon Pilgrim2864b462018-05-08 14:55:16 +0000116defm WriteIMul : X86SchedWritePair; // Integer multiplication.
117defm WriteIMul64 : X86SchedWritePair; // Integer 64-bit multiplication.
118def WriteIMulH : SchedWrite; // Integer multiplication, high part.
119def WriteLEA : SchedWrite; // LEA instructions can't fold loads.
Simon Pilgrima271c542017-05-03 15:42:29 +0000120
Simon Pilgrim25805542018-05-08 13:51:45 +0000121// Integer division.
122defm WriteDiv8 : X86SchedWritePair;
123defm WriteDiv16 : X86SchedWritePair;
124defm WriteDiv32 : X86SchedWritePair;
125defm WriteDiv64 : X86SchedWritePair;
126defm WriteIDiv8 : X86SchedWritePair;
127defm WriteIDiv16 : X86SchedWritePair;
128defm WriteIDiv32 : X86SchedWritePair;
129defm WriteIDiv64 : X86SchedWritePair;
130
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000131defm WriteBitScan : X86SchedWritePair; // Bit scan forward/reverse.
132defm WritePOPCNT : X86SchedWritePair; // Bit population count.
133defm WriteLZCNT : X86SchedWritePair; // Leading zero count.
134defm WriteTZCNT : X86SchedWritePair; // Trailing zero count.
Simon Pilgrim2782a192018-05-17 16:47:30 +0000135defm WriteCMOV : X86SchedWritePair; // Conditional move.
136defm WriteCMOV2 : X86SchedWritePair; // Conditional (CF + ZF flag) move.
Simon Pilgrim6e160c12018-05-12 18:07:07 +0000137def WriteFCMOV : SchedWrite; // X87 conditional move.
Craig Topperb7baa352018-04-08 17:53:18 +0000138def WriteSETCC : SchedWrite; // Set register based on condition code.
139def WriteSETCCStore : SchedWrite;
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000140
Simon Pilgrima271c542017-05-03 15:42:29 +0000141// Integer shifts and rotates.
142defm WriteShift : X86SchedWritePair;
143
Craig Topper89310f52018-03-29 20:41:39 +0000144// BMI1 BEXTR, BMI2 BZHI
145defm WriteBEXTR : X86SchedWritePair;
146defm WriteBZHI : X86SchedWritePair;
147
Simon Pilgrima271c542017-05-03 15:42:29 +0000148// Idioms that clear a register, like xorps %xmm0, %xmm0.
149// These can often bypass execution ports completely.
150def WriteZero : SchedWrite;
151
152// Branches don't produce values, so they have no latency, but they still
153// consume resources. Indirect branches can fold loads.
154defm WriteJump : X86SchedWritePair;
155
156// Floating point. This covers both scalar and vector operations.
Clement Courbetb78ab502018-05-31 11:41:27 +0000157def WriteFLD0 : SchedWrite;
158def WriteFLD1 : SchedWrite;
Clement Courbet2e41c5a2018-05-31 14:22:01 +0000159def WriteFLDC : SchedWrite;
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000160def WriteFLoad : SchedWrite;
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000161def WriteFLoadX : SchedWrite;
162def WriteFLoadY : SchedWrite;
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000163def WriteFMaskedLoad : SchedWrite;
164def WriteFMaskedLoadY : SchedWrite;
165def WriteFStore : SchedWrite;
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000166def WriteFStoreX : SchedWrite;
167def WriteFStoreY : SchedWrite;
Simon Pilgrim215ce4a2018-05-14 18:37:19 +0000168def WriteFStoreNT : SchedWrite;
169def WriteFStoreNTX : SchedWrite;
170def WriteFStoreNTY : SchedWrite;
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000171def WriteFMaskedStore : SchedWrite;
172def WriteFMaskedStoreY : SchedWrite;
173def WriteFMove : SchedWrite;
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000174def WriteFMoveX : SchedWrite;
175def WriteFMoveY : SchedWrite;
Simon Pilgrim1233e122018-05-07 20:52:53 +0000176
177defm WriteFAdd : X86SchedWritePair; // Floating point add/sub.
178defm WriteFAddX : X86SchedWritePair; // Floating point add/sub (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000179defm WriteFAddY : X86SchedWritePair; // Floating point add/sub (YMM).
180defm WriteFAddZ : X86SchedWritePair; // Floating point add/sub (ZMM).
Simon Pilgrim1233e122018-05-07 20:52:53 +0000181defm WriteFAdd64 : X86SchedWritePair; // Floating point double add/sub.
182defm WriteFAdd64X : X86SchedWritePair; // Floating point double add/sub (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000183defm WriteFAdd64Y : X86SchedWritePair; // Floating point double add/sub (YMM).
184defm WriteFAdd64Z : X86SchedWritePair; // Floating point double add/sub (ZMM).
Simon Pilgrim1233e122018-05-07 20:52:53 +0000185defm WriteFCmp : X86SchedWritePair; // Floating point compare.
186defm WriteFCmpX : X86SchedWritePair; // Floating point compare (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000187defm WriteFCmpY : X86SchedWritePair; // Floating point compare (YMM).
188defm WriteFCmpZ : X86SchedWritePair; // Floating point compare (ZMM).
Simon Pilgrim1233e122018-05-07 20:52:53 +0000189defm WriteFCmp64 : X86SchedWritePair; // Floating point double compare.
190defm WriteFCmp64X : X86SchedWritePair; // Floating point double compare (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000191defm WriteFCmp64Y : X86SchedWritePair; // Floating point double compare (YMM).
192defm WriteFCmp64Z : X86SchedWritePair; // Floating point double compare (ZMM).
Simon Pilgrim1233e122018-05-07 20:52:53 +0000193defm WriteFCom : X86SchedWritePair; // Floating point compare to flags.
194defm WriteFMul : X86SchedWritePair; // Floating point multiplication.
195defm WriteFMulX : X86SchedWritePair; // Floating point multiplication (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000196defm WriteFMulY : X86SchedWritePair; // Floating point multiplication (YMM).
197defm WriteFMulZ : X86SchedWritePair; // Floating point multiplication (YMM).
Simon Pilgrim1233e122018-05-07 20:52:53 +0000198defm WriteFMul64 : X86SchedWritePair; // Floating point double multiplication.
199defm WriteFMul64X : X86SchedWritePair; // Floating point double multiplication (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000200defm WriteFMul64Y : X86SchedWritePair; // Floating point double multiplication (YMM).
201defm WriteFMul64Z : X86SchedWritePair; // Floating point double multiplication (ZMM).
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000202defm WriteFDiv : X86SchedWritePair; // Floating point division.
203defm WriteFDivX : X86SchedWritePair; // Floating point division (XMM).
204defm WriteFDivY : X86SchedWritePair; // Floating point division (YMM).
205defm WriteFDivZ : X86SchedWritePair; // Floating point division (ZMM).
Simon Pilgrim1233e122018-05-07 20:52:53 +0000206defm WriteFDiv64 : X86SchedWritePair; // Floating point double division.
207defm WriteFDiv64X : X86SchedWritePair; // Floating point double division (XMM).
208defm WriteFDiv64Y : X86SchedWritePair; // Floating point double division (YMM).
209defm WriteFDiv64Z : X86SchedWritePair; // Floating point double division (ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000210defm WriteFSqrt : X86SchedWritePair; // Floating point square root.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000211defm WriteFSqrtX : X86SchedWritePair; // Floating point square root (XMM).
212defm WriteFSqrtY : X86SchedWritePair; // Floating point square root (YMM).
213defm WriteFSqrtZ : X86SchedWritePair; // Floating point square root (ZMM).
214defm WriteFSqrt64 : X86SchedWritePair; // Floating point double square root.
215defm WriteFSqrt64X : X86SchedWritePair; // Floating point double square root (XMM).
216defm WriteFSqrt64Y : X86SchedWritePair; // Floating point double square root (YMM).
217defm WriteFSqrt64Z : X86SchedWritePair; // Floating point double square root (ZMM).
218defm WriteFSqrt80 : X86SchedWritePair; // Floating point long double square root.
Simon Pilgrima271c542017-05-03 15:42:29 +0000219defm WriteFRcp : X86SchedWritePair; // Floating point reciprocal estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000220defm WriteFRcpX : X86SchedWritePair; // Floating point reciprocal estimate (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000221defm WriteFRcpY : X86SchedWritePair; // Floating point reciprocal estimate (YMM).
222defm WriteFRcpZ : X86SchedWritePair; // Floating point reciprocal estimate (ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000223defm WriteFRsqrt : X86SchedWritePair; // Floating point reciprocal square root estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000224defm WriteFRsqrtX: X86SchedWritePair; // Floating point reciprocal square root estimate (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000225defm WriteFRsqrtY: X86SchedWritePair; // Floating point reciprocal square root estimate (YMM).
226defm WriteFRsqrtZ: X86SchedWritePair; // Floating point reciprocal square root estimate (ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000227defm WriteFMA : X86SchedWritePair; // Fused Multiply Add.
Simon Pilgrim67cc2462018-05-04 15:20:18 +0000228defm WriteFMAX : X86SchedWritePair; // Fused Multiply Add (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000229defm WriteFMAY : X86SchedWritePair; // Fused Multiply Add (YMM).
230defm WriteFMAZ : X86SchedWritePair; // Fused Multiply Add (ZMM).
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000231defm WriteDPPD : X86SchedWritePair; // Floating point double dot product.
232defm WriteDPPS : X86SchedWritePair; // Floating point single dot product.
233defm WriteDPPSY : X86SchedWritePair; // Floating point single dot product (YMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000234defm WriteDPPSZ : X86SchedWritePair; // Floating point single dot product (ZMM).
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000235defm WriteFSign : X86SchedWritePair; // Floating point fabs/fchs.
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000236defm WriteFRnd : X86SchedWritePair; // Floating point rounding.
Clement Courbet7db69cc2018-06-11 14:37:53 +0000237defm WriteFRndY : X86SchedWritePair; // Floating point rounding (YMM).
238defm WriteFRndZ : X86SchedWritePair; // Floating point rounding (ZMM).
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000239defm WriteFLogic : X86SchedWritePair; // Floating point and/or/xor logicals.
Clement Courbet7db69cc2018-06-11 14:37:53 +0000240defm WriteFLogicY : X86SchedWritePair; // Floating point and/or/xor logicals (YMM).
241defm WriteFLogicZ : X86SchedWritePair; // Floating point and/or/xor logicals (ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000242defm WriteFTest : X86SchedWritePair; // Floating point TEST instructions.
Clement Courbet7db69cc2018-06-11 14:37:53 +0000243defm WriteFTestY : X86SchedWritePair; // Floating point TEST instructions (YMM).
244defm WriteFTestZ : X86SchedWritePair; // Floating point TEST instructions (ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000245defm WriteFShuffle : X86SchedWritePair; // Floating point vector shuffles.
Clement Courbet7db69cc2018-06-11 14:37:53 +0000246defm WriteFShuffleY : X86SchedWritePair; // Floating point vector shuffles (YMM).
247defm WriteFShuffleZ : X86SchedWritePair; // Floating point vector shuffles (ZMM).
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000248defm WriteFVarShuffle : X86SchedWritePair; // Floating point vector variable shuffles.
Clement Courbet7db69cc2018-06-11 14:37:53 +0000249defm WriteFVarShuffleY : X86SchedWritePair; // Floating point vector variable shuffles (YMM).
250defm WriteFVarShuffleZ : X86SchedWritePair; // Floating point vector variable shuffles (ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000251defm WriteFBlend : X86SchedWritePair; // Floating point vector blends.
Clement Courbet7db69cc2018-06-11 14:37:53 +0000252defm WriteFBlendY : X86SchedWritePair; // Floating point vector blends (YMM).
253defm WriteFBlendZ : X86SchedWritePair; // Floating point vector blends (ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000254defm WriteFVarBlend : X86SchedWritePair; // Fp vector variable blends.
Clement Courbet7db69cc2018-06-11 14:37:53 +0000255defm WriteFVarBlendY : X86SchedWritePair; // Fp vector variable blends (YMM).
256defm WriteFVarBlendZ : X86SchedWritePair; // Fp vector variable blends (YMZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000257
258// FMA Scheduling helper class.
259class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
260
Andrew V. Tischenko8cb1d092017-06-08 16:44:13 +0000261// Horizontal Add/Sub (float and integer)
262defm WriteFHAdd : X86SchedWritePair;
Clement Courbet7db69cc2018-06-11 14:37:53 +0000263defm WriteFHAddY : X86SchedWritePair;
264defm WriteFHAddZ : X86SchedWritePair;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000265defm WritePHAdd : X86SchedWritePair;
Clement Courbet7db69cc2018-06-11 14:37:53 +0000266defm WritePHAddX : X86SchedWritePair;
267defm WritePHAddY : X86SchedWritePair;
268defm WritePHAddZ : X86SchedWritePair;
Andrew V. Tischenko8cb1d092017-06-08 16:44:13 +0000269
Simon Pilgrima271c542017-05-03 15:42:29 +0000270// Vector integer operations.
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000271def WriteVecLoad : SchedWrite;
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000272def WriteVecLoadX : SchedWrite;
273def WriteVecLoadY : SchedWrite;
Simon Pilgrim215ce4a2018-05-14 18:37:19 +0000274def WriteVecLoadNT : SchedWrite;
275def WriteVecLoadNTY : SchedWrite;
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000276def WriteVecMaskedLoad : SchedWrite;
277def WriteVecMaskedLoadY : SchedWrite;
278def WriteVecStore : SchedWrite;
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000279def WriteVecStoreX : SchedWrite;
280def WriteVecStoreY : SchedWrite;
Simon Pilgrim215ce4a2018-05-14 18:37:19 +0000281def WriteVecStoreNT : SchedWrite;
282def WriteVecStoreNTY : SchedWrite;
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000283def WriteVecMaskedStore : SchedWrite;
284def WriteVecMaskedStoreY : SchedWrite;
285def WriteVecMove : SchedWrite;
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000286def WriteVecMoveX : SchedWrite;
287def WriteVecMoveY : SchedWrite;
Simon Pilgrim1273f4a2018-05-18 17:58:36 +0000288def WriteVecMoveToGpr : SchedWrite;
289def WriteVecMoveFromGpr : SchedWrite;
Simon Pilgrim210286e2018-05-08 10:28:03 +0000290
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000291defm WriteVecALU : X86SchedWritePair; // Vector integer ALU op, no logicals.
292defm WriteVecALUX : X86SchedWritePair; // Vector integer ALU op, no logicals (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000293defm WriteVecALUY : X86SchedWritePair; // Vector integer ALU op, no logicals (YMM).
294defm WriteVecALUZ : X86SchedWritePair; // Vector integer ALU op, no logicals (ZMM).
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000295defm WriteVecLogic : X86SchedWritePair; // Vector integer and/or/xor logicals.
296defm WriteVecLogicX : X86SchedWritePair; // Vector integer and/or/xor logicals (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000297defm WriteVecLogicY : X86SchedWritePair; // Vector integer and/or/xor logicals (YMM).
298defm WriteVecLogicZ : X86SchedWritePair; // Vector integer and/or/xor logicals (ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000299defm WriteVecTest : X86SchedWritePair; // Vector integer TEST instructions.
Clement Courbet7db69cc2018-06-11 14:37:53 +0000300defm WriteVecTestY : X86SchedWritePair; // Vector integer TEST instructions (YMM).
301defm WriteVecTestZ : X86SchedWritePair; // Vector integer TEST instructions (ZMM).
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000302defm WriteVecShift : X86SchedWritePair; // Vector integer shifts (default).
303defm WriteVecShiftX : X86SchedWritePair; // Vector integer shifts (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000304defm WriteVecShiftY : X86SchedWritePair; // Vector integer shifts (YMM).
305defm WriteVecShiftZ : X86SchedWritePair; // Vector integer shifts (ZMM).
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000306defm WriteVecShiftImm : X86SchedWritePair; // Vector integer immediate shifts (default).
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000307defm WriteVecShiftImmX: X86SchedWritePair; // Vector integer immediate shifts (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000308defm WriteVecShiftImmY: X86SchedWritePair; // Vector integer immediate shifts (YMM).
309defm WriteVecShiftImmZ: X86SchedWritePair; // Vector integer immediate shifts (ZMM).
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000310defm WriteVecIMul : X86SchedWritePair; // Vector integer multiply (default).
311defm WriteVecIMulX : X86SchedWritePair; // Vector integer multiply (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000312defm WriteVecIMulY : X86SchedWritePair; // Vector integer multiply (YMM).
313defm WriteVecIMulZ : X86SchedWritePair; // Vector integer multiply (ZMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000314defm WritePMULLD : X86SchedWritePair; // Vector PMULLD.
Clement Courbet7db69cc2018-06-11 14:37:53 +0000315defm WritePMULLDY : X86SchedWritePair; // Vector PMULLD (YMM).
316defm WritePMULLDZ : X86SchedWritePair; // Vector PMULLD (ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000317defm WriteShuffle : X86SchedWritePair; // Vector shuffles.
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000318defm WriteShuffleX : X86SchedWritePair; // Vector shuffles (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000319defm WriteShuffleY : X86SchedWritePair; // Vector shuffles (YMM).
320defm WriteShuffleZ : X86SchedWritePair; // Vector shuffles (ZMM).
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000321defm WriteVarShuffle : X86SchedWritePair; // Vector variable shuffles.
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000322defm WriteVarShuffleX : X86SchedWritePair; // Vector variable shuffles (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000323defm WriteVarShuffleY : X86SchedWritePair; // Vector variable shuffles (YMM).
324defm WriteVarShuffleZ : X86SchedWritePair; // Vector variable shuffles (ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000325defm WriteBlend : X86SchedWritePair; // Vector blends.
Clement Courbet7db69cc2018-06-11 14:37:53 +0000326defm WriteBlendY : X86SchedWritePair; // Vector blends (YMM).
327defm WriteBlendZ : X86SchedWritePair; // Vector blends (ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000328defm WriteVarBlend : X86SchedWritePair; // Vector variable blends.
Clement Courbet7db69cc2018-06-11 14:37:53 +0000329defm WriteVarBlendY : X86SchedWritePair; // Vector variable blends (YMM).
330defm WriteVarBlendZ : X86SchedWritePair; // Vector variable blends (ZMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000331defm WritePSADBW : X86SchedWritePair; // Vector PSADBW.
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000332defm WritePSADBWX : X86SchedWritePair; // Vector PSADBW (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000333defm WritePSADBWY : X86SchedWritePair; // Vector PSADBW (YMM).
334defm WritePSADBWZ : X86SchedWritePair; // Vector PSADBW (ZMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000335defm WriteMPSAD : X86SchedWritePair; // Vector MPSAD.
Clement Courbet7db69cc2018-06-11 14:37:53 +0000336defm WriteMPSADY : X86SchedWritePair; // Vector MPSAD (YMM).
337defm WriteMPSADZ : X86SchedWritePair; // Vector MPSAD (ZMM).
Simon Pilgrim27bc83e2018-04-24 18:49:25 +0000338defm WritePHMINPOS : X86SchedWritePair; // Vector PHMINPOS.
Simon Pilgrima271c542017-05-03 15:42:29 +0000339
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000340// Vector insert/extract operations.
341defm WriteVecInsert : X86SchedWritePair; // Insert gpr to vector element.
342def WriteVecExtract : SchedWrite; // Extract vector element to gpr.
343def WriteVecExtractSt : SchedWrite; // Extract vector element and store.
344
Simon Pilgrima2f26782018-03-27 20:38:54 +0000345// MOVMSK operations.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000346def WriteFMOVMSK : SchedWrite;
347def WriteVecMOVMSK : SchedWrite;
348def WriteVecMOVMSKY : SchedWrite;
349def WriteMMXMOVMSK : SchedWrite;
Simon Pilgrima2f26782018-03-27 20:38:54 +0000350
Simon Pilgrima271c542017-05-03 15:42:29 +0000351// Conversion between integer and float.
Simon Pilgrim5647e892018-05-16 10:53:45 +0000352defm WriteCvtSD2I : X86SchedWritePair; // Double -> Integer.
353defm WriteCvtPD2I : X86SchedWritePair; // Double -> Integer (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000354defm WriteCvtPD2IY : X86SchedWritePair; // Double -> Integer (YMM).
355defm WriteCvtPD2IZ : X86SchedWritePair; // Double -> Integer (ZMM).
Simon Pilgrim5647e892018-05-16 10:53:45 +0000356
357defm WriteCvtSS2I : X86SchedWritePair; // Float -> Integer.
358defm WriteCvtPS2I : X86SchedWritePair; // Float -> Integer (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000359defm WriteCvtPS2IY : X86SchedWritePair; // Float -> Integer (YMM).
360defm WriteCvtPS2IZ : X86SchedWritePair; // Float -> Integer (ZMM).
Simon Pilgrim5647e892018-05-16 10:53:45 +0000361
362defm WriteCvtI2SD : X86SchedWritePair; // Integer -> Double.
363defm WriteCvtI2PD : X86SchedWritePair; // Integer -> Double (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000364defm WriteCvtI2PDY : X86SchedWritePair; // Integer -> Double (YMM).
365defm WriteCvtI2PDZ : X86SchedWritePair; // Integer -> Double (ZMM).
Simon Pilgrim5647e892018-05-16 10:53:45 +0000366
367defm WriteCvtI2SS : X86SchedWritePair; // Integer -> Float.
368defm WriteCvtI2PS : X86SchedWritePair; // Integer -> Float (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000369defm WriteCvtI2PSY : X86SchedWritePair; // Integer -> Float (YMM).
370defm WriteCvtI2PSZ : X86SchedWritePair; // Integer -> Float (ZMM).
Simon Pilgrimbe9a2062018-05-15 17:36:49 +0000371
372defm WriteCvtSS2SD : X86SchedWritePair; // Float -> Double size conversion.
373defm WriteCvtPS2PD : X86SchedWritePair; // Float -> Double size conversion (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000374defm WriteCvtPS2PDY : X86SchedWritePair; // Float -> Double size conversion (YMM).
375defm WriteCvtPS2PDZ : X86SchedWritePair; // Float -> Double size conversion (ZMM).
Simon Pilgrimbe9a2062018-05-15 17:36:49 +0000376
377defm WriteCvtSD2SS : X86SchedWritePair; // Double -> Float size conversion.
378defm WriteCvtPD2PS : X86SchedWritePair; // Double -> Float size conversion (XMM).
Clement Courbet7db69cc2018-06-11 14:37:53 +0000379defm WriteCvtPD2PSY : X86SchedWritePair; // Double -> Float size conversion (YMM).
380defm WriteCvtPD2PSZ : X86SchedWritePair; // Double -> Float size conversion (ZMM).
Simon Pilgrim891ebcd2018-05-15 14:12:32 +0000381
382defm WriteCvtPH2PS : X86SchedWritePair; // Half -> Float size conversion.
Clement Courbet7db69cc2018-06-11 14:37:53 +0000383defm WriteCvtPH2PSY : X86SchedWritePair; // Half -> Float size conversion (YMM).
384defm WriteCvtPH2PSZ : X86SchedWritePair; // Half -> Float size conversion (ZMM).
Simon Pilgrim891ebcd2018-05-15 14:12:32 +0000385
386def WriteCvtPS2PH : SchedWrite; // // Float -> Half size conversion.
Clement Courbet7db69cc2018-06-11 14:37:53 +0000387def WriteCvtPS2PHY : SchedWrite; // // Float -> Half size conversion (YMM).
388def WriteCvtPS2PHZ : SchedWrite; // // Float -> Half size conversion (ZMM).
Simon Pilgrim891ebcd2018-05-15 14:12:32 +0000389def WriteCvtPS2PHSt : SchedWrite; // // Float -> Half + store size conversion.
Clement Courbet7db69cc2018-06-11 14:37:53 +0000390def WriteCvtPS2PHYSt : SchedWrite; // // Float -> Half + store size conversion (YMM).
391def WriteCvtPS2PHZSt : SchedWrite; // // Float -> Half + store size conversion (ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000392
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000393// CRC32 instruction.
394defm WriteCRC32 : X86SchedWritePair;
395
Simon Pilgrima271c542017-05-03 15:42:29 +0000396// Strings instructions.
397// Packed Compare Implicit Length Strings, Return Mask
398defm WritePCmpIStrM : X86SchedWritePair;
399// Packed Compare Explicit Length Strings, Return Mask
400defm WritePCmpEStrM : X86SchedWritePair;
401// Packed Compare Implicit Length Strings, Return Index
402defm WritePCmpIStrI : X86SchedWritePair;
403// Packed Compare Explicit Length Strings, Return Index
404defm WritePCmpEStrI : X86SchedWritePair;
405
406// AES instructions.
407defm WriteAESDecEnc : X86SchedWritePair; // Decryption, encryption.
408defm WriteAESIMC : X86SchedWritePair; // InvMixColumn.
409defm WriteAESKeyGen : X86SchedWritePair; // Key Generation.
410
411// Carry-less multiplication instructions.
412defm WriteCLMul : X86SchedWritePair;
413
Simon Pilgrim0e51a122018-05-04 18:16:13 +0000414// EMMS/FEMMS
415def WriteEMMS : SchedWrite;
416
Craig Topper05242bf2018-04-21 18:07:36 +0000417// Load/store MXCSR
418def WriteLDMXCSR : SchedWrite;
419def WriteSTMXCSR : SchedWrite;
420
Simon Pilgrima271c542017-05-03 15:42:29 +0000421// Catch-all for expensive system instructions.
422def WriteSystem : SchedWrite;
423
424// AVX2.
425defm WriteFShuffle256 : X86SchedWritePair; // Fp 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000426defm WriteFVarShuffle256 : X86SchedWritePair; // Fp 256-bit width variable shuffles.
Simon Pilgrima271c542017-05-03 15:42:29 +0000427defm WriteShuffle256 : X86SchedWritePair; // 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000428defm WriteVarShuffle256 : X86SchedWritePair; // 256-bit width vector variable shuffles.
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000429defm WriteVarVecShift : X86SchedWritePair; // Variable vector shifts.
Clement Courbet7db69cc2018-06-11 14:37:53 +0000430defm WriteVarVecShiftY : X86SchedWritePair; // Variable vector shifts (YMM).
431defm WriteVarVecShiftZ : X86SchedWritePair; // Variable vector shifts (ZMM).
Simon Pilgrima271c542017-05-03 15:42:29 +0000432
433// Old microcoded instructions that nobody use.
434def WriteMicrocoded : SchedWrite;
435
436// Fence instructions.
437def WriteFence : SchedWrite;
438
439// Nop, not very useful expect it provides a model for nops!
440def WriteNop : SchedWrite;
441
Simon Pilgrimead11e42018-05-11 12:46:54 +0000442// Move/Load/Store wrappers.
443def WriteFMoveLS
444 : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStore>;
445def WriteFMoveLSX
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000446 : X86SchedWriteMoveLS<WriteFMoveX, WriteFLoadX, WriteFStoreX>;
Simon Pilgrimead11e42018-05-11 12:46:54 +0000447def WriteFMoveLSY
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000448 : X86SchedWriteMoveLS<WriteFMoveY, WriteFLoadY, WriteFStoreY>;
Simon Pilgrimead11e42018-05-11 12:46:54 +0000449def SchedWriteFMoveLS
450 : X86SchedWriteMoveLSWidths<WriteFMoveLS, WriteFMoveLSX,
451 WriteFMoveLSY, WriteFMoveLSY>;
452
Simon Pilgrim215ce4a2018-05-14 18:37:19 +0000453def WriteFMoveLSNT
454 : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStoreNT>;
455def WriteFMoveLSNTX
456 : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStoreNTX>;
457def WriteFMoveLSNTY
458 : X86SchedWriteMoveLS<WriteFMoveY, WriteFLoadY, WriteFStoreNTY>;
459def SchedWriteFMoveLSNT
460 : X86SchedWriteMoveLSWidths<WriteFMoveLSNT, WriteFMoveLSNTX,
461 WriteFMoveLSNTY, WriteFMoveLSNTY>;
462
Simon Pilgrimead11e42018-05-11 12:46:54 +0000463def WriteVecMoveLS
464 : X86SchedWriteMoveLS<WriteVecMove, WriteVecLoad, WriteVecStore>;
465def WriteVecMoveLSX
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000466 : X86SchedWriteMoveLS<WriteVecMoveX, WriteVecLoadX, WriteVecStoreX>;
Simon Pilgrimead11e42018-05-11 12:46:54 +0000467def WriteVecMoveLSY
Simon Pilgrim22dd72b2018-05-11 14:30:54 +0000468 : X86SchedWriteMoveLS<WriteVecMoveY, WriteVecLoadY, WriteVecStoreY>;
Simon Pilgrimead11e42018-05-11 12:46:54 +0000469def SchedWriteVecMoveLS
470 : X86SchedWriteMoveLSWidths<WriteVecMoveLS, WriteVecMoveLSX,
471 WriteVecMoveLSY, WriteVecMoveLSY>;
472
Simon Pilgrim215ce4a2018-05-14 18:37:19 +0000473def WriteVecMoveLSNT
474 : X86SchedWriteMoveLS<WriteVecMove, WriteVecLoadNT, WriteVecStoreNT>;
475def WriteVecMoveLSNTX
476 : X86SchedWriteMoveLS<WriteVecMoveX, WriteVecLoadNT, WriteVecStoreNT>;
477def WriteVecMoveLSNTY
478 : X86SchedWriteMoveLS<WriteVecMoveY, WriteVecLoadNTY, WriteVecStoreNTY>;
479def SchedWriteVecMoveLSNT
480 : X86SchedWriteMoveLSWidths<WriteVecMoveLSNT, WriteVecMoveLSNTX,
481 WriteVecMoveLSNTY, WriteVecMoveLSNTY>;
482
Simon Pilgrim3c354082018-04-30 18:18:38 +0000483// Vector width wrappers.
484def SchedWriteFAdd
Clement Courbet7db69cc2018-06-11 14:37:53 +0000485 : X86SchedWriteWidths<WriteFAdd, WriteFAddX, WriteFAddY, WriteFAddZ>;
Simon Pilgrim1233e122018-05-07 20:52:53 +0000486def SchedWriteFAdd64
Clement Courbet7db69cc2018-06-11 14:37:53 +0000487 : X86SchedWriteWidths<WriteFAdd64, WriteFAdd64X, WriteFAdd64Y, WriteFAdd64Z>;
Simon Pilgrim342ac8c2018-05-03 09:11:32 +0000488def SchedWriteFHAdd
Clement Courbet7db69cc2018-06-11 14:37:53 +0000489 : X86SchedWriteWidths<WriteFHAdd, WriteFHAdd, WriteFHAddY, WriteFHAddZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000490def SchedWriteFCmp
Clement Courbet7db69cc2018-06-11 14:37:53 +0000491 : X86SchedWriteWidths<WriteFCmp, WriteFCmpX, WriteFCmpY, WriteFCmpZ>;
Simon Pilgrim1233e122018-05-07 20:52:53 +0000492def SchedWriteFCmp64
Clement Courbet7db69cc2018-06-11 14:37:53 +0000493 : X86SchedWriteWidths<WriteFCmp64, WriteFCmp64X, WriteFCmp64Y, WriteFCmp64Z>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000494def SchedWriteFMul
Clement Courbet7db69cc2018-06-11 14:37:53 +0000495 : X86SchedWriteWidths<WriteFMul, WriteFMulX, WriteFMulY, WriteFMulZ>;
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000496def SchedWriteFMul64
Clement Courbet7db69cc2018-06-11 14:37:53 +0000497 : X86SchedWriteWidths<WriteFMul64, WriteFMul64X, WriteFMul64Y, WriteFMul64Z>;
Simon Pilgrima1f1a3b2018-05-02 13:32:56 +0000498def SchedWriteFMA
Clement Courbet7db69cc2018-06-11 14:37:53 +0000499 : X86SchedWriteWidths<WriteFMA, WriteFMAX, WriteFMAY, WriteFMAZ>;
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000500def SchedWriteDPPD
501 : X86SchedWriteWidths<WriteDPPD, WriteDPPD, WriteDPPD, WriteDPPD>;
502def SchedWriteDPPS
Clement Courbet7db69cc2018-06-11 14:37:53 +0000503 : X86SchedWriteWidths<WriteDPPS, WriteDPPS, WriteDPPSY, WriteDPPSZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000504def SchedWriteFDiv
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000505 : X86SchedWriteWidths<WriteFDiv, WriteFDivX, WriteFDivY, WriteFDivZ>;
506def SchedWriteFDiv64
507 : X86SchedWriteWidths<WriteFDiv64, WriteFDiv64X, WriteFDiv64Y, WriteFDiv64Z>;
Simon Pilgrimc7088682018-05-01 18:06:07 +0000508def SchedWriteFSqrt
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000509 : X86SchedWriteWidths<WriteFSqrt, WriteFSqrtX,
510 WriteFSqrtY, WriteFSqrtZ>;
511def SchedWriteFSqrt64
512 : X86SchedWriteWidths<WriteFSqrt64, WriteFSqrt64X,
513 WriteFSqrt64Y, WriteFSqrt64Z>;
Simon Pilgrim1b7a80d2018-05-01 15:57:17 +0000514def SchedWriteFRcp
Clement Courbet7db69cc2018-06-11 14:37:53 +0000515 : X86SchedWriteWidths<WriteFRcp, WriteFRcpX, WriteFRcpY, WriteFRcpZ>;
Simon Pilgrim1b7a80d2018-05-01 15:57:17 +0000516def SchedWriteFRsqrt
Clement Courbet7db69cc2018-06-11 14:37:53 +0000517 : X86SchedWriteWidths<WriteFRsqrt, WriteFRsqrtX, WriteFRsqrtY, WriteFRsqrtZ>;
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000518def SchedWriteFRnd
Clement Courbet7db69cc2018-06-11 14:37:53 +0000519 : X86SchedWriteWidths<WriteFRnd, WriteFRnd, WriteFRndY, WriteFRndZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000520def SchedWriteFLogic
Clement Courbet7db69cc2018-06-11 14:37:53 +0000521 : X86SchedWriteWidths<WriteFLogic, WriteFLogic, WriteFLogicY, WriteFLogicZ>;
Simon Pilgrim210286e2018-05-08 10:28:03 +0000522def SchedWriteFTest
Clement Courbet7db69cc2018-06-11 14:37:53 +0000523 : X86SchedWriteWidths<WriteFTest, WriteFTest, WriteFTestY, WriteFTestZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000524
525def SchedWriteFShuffle
526 : X86SchedWriteWidths<WriteFShuffle, WriteFShuffle,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000527 WriteFShuffleY, WriteFShuffleZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000528def SchedWriteFVarShuffle
529 : X86SchedWriteWidths<WriteFVarShuffle, WriteFVarShuffle,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000530 WriteFVarShuffleY, WriteFVarShuffleZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000531def SchedWriteFBlend
Clement Courbet7db69cc2018-06-11 14:37:53 +0000532 : X86SchedWriteWidths<WriteFBlend, WriteFBlend, WriteFBlendY, WriteFBlendZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000533def SchedWriteFVarBlend
534 : X86SchedWriteWidths<WriteFVarBlend, WriteFVarBlend,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000535 WriteFVarBlendY, WriteFVarBlendZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000536
Simon Pilgrim5647e892018-05-16 10:53:45 +0000537def SchedWriteCvtDQ2PD
538 : X86SchedWriteWidths<WriteCvtI2SD, WriteCvtI2PD,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000539 WriteCvtI2PDY, WriteCvtI2PDZ>;
Simon Pilgrim5647e892018-05-16 10:53:45 +0000540def SchedWriteCvtDQ2PS
541 : X86SchedWriteWidths<WriteCvtI2SS, WriteCvtI2PS,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000542 WriteCvtI2PSY, WriteCvtI2PSZ>;
Simon Pilgrim5647e892018-05-16 10:53:45 +0000543def SchedWriteCvtPD2DQ
544 : X86SchedWriteWidths<WriteCvtSD2I, WriteCvtPD2I,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000545 WriteCvtPD2IY, WriteCvtPD2IZ>;
Simon Pilgrim5647e892018-05-16 10:53:45 +0000546def SchedWriteCvtPS2DQ
547 : X86SchedWriteWidths<WriteCvtSS2I, WriteCvtPS2I,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000548 WriteCvtPS2IY, WriteCvtPS2IZ>;
Simon Pilgrimbe9a2062018-05-15 17:36:49 +0000549def SchedWriteCvtPS2PD
550 : X86SchedWriteWidths<WriteCvtSS2SD, WriteCvtPS2PD,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000551 WriteCvtPS2PDY, WriteCvtPS2PDZ>;
Simon Pilgrimbe9a2062018-05-15 17:36:49 +0000552def SchedWriteCvtPD2PS
553 : X86SchedWriteWidths<WriteCvtSD2SS, WriteCvtPD2PS,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000554 WriteCvtPD2PSY, WriteCvtPD2PSZ>;
Simon Pilgrimbe9a2062018-05-15 17:36:49 +0000555
Simon Pilgrim3c354082018-04-30 18:18:38 +0000556def SchedWriteVecALU
Clement Courbet7db69cc2018-06-11 14:37:53 +0000557 : X86SchedWriteWidths<WriteVecALU, WriteVecALUX, WriteVecALUY, WriteVecALUZ>;
Simon Pilgrim342ac8c2018-05-03 09:11:32 +0000558def SchedWritePHAdd
Clement Courbet7db69cc2018-06-11 14:37:53 +0000559 : X86SchedWriteWidths<WritePHAdd, WritePHAddX, WritePHAddY, WritePHAddZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000560def SchedWriteVecLogic
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000561 : X86SchedWriteWidths<WriteVecLogic, WriteVecLogicX,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000562 WriteVecLogicY, WriteVecLogicZ>;
Simon Pilgrim210286e2018-05-08 10:28:03 +0000563def SchedWriteVecTest
564 : X86SchedWriteWidths<WriteVecTest, WriteVecTest,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000565 WriteVecTestY, WriteVecTestZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000566def SchedWriteVecShift
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000567 : X86SchedWriteWidths<WriteVecShift, WriteVecShiftX,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000568 WriteVecShiftY, WriteVecShiftZ>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000569def SchedWriteVecShiftImm
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000570 : X86SchedWriteWidths<WriteVecShiftImm, WriteVecShiftImmX,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000571 WriteVecShiftImmY, WriteVecShiftImmZ>;
Simon Pilgrime8671ef2018-05-02 12:27:54 +0000572def SchedWriteVarVecShift
573 : X86SchedWriteWidths<WriteVarVecShift, WriteVarVecShift,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000574 WriteVarVecShiftY, WriteVarVecShiftZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000575def SchedWriteVecIMul
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000576 : X86SchedWriteWidths<WriteVecIMul, WriteVecIMulX,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000577 WriteVecIMulY, WriteVecIMulZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000578def SchedWritePMULLD
579 : X86SchedWriteWidths<WritePMULLD, WritePMULLD,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000580 WritePMULLDY, WritePMULLDZ>;
Simon Pilgrime8671ef2018-05-02 12:27:54 +0000581def SchedWriteMPSAD
582 : X86SchedWriteWidths<WriteMPSAD, WriteMPSAD,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000583 WriteMPSADY, WriteMPSADZ>;
Simon Pilgrime8671ef2018-05-02 12:27:54 +0000584def SchedWritePSADBW
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000585 : X86SchedWriteWidths<WritePSADBW, WritePSADBWX,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000586 WritePSADBWY, WritePSADBWZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000587
588def SchedWriteShuffle
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000589 : X86SchedWriteWidths<WriteShuffle, WriteShuffleX,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000590 WriteShuffleY, WriteShuffleZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000591def SchedWriteVarShuffle
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000592 : X86SchedWriteWidths<WriteVarShuffle, WriteVarShuffleX,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000593 WriteVarShuffleY, WriteVarShuffleZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000594def SchedWriteBlend
Clement Courbet7db69cc2018-06-11 14:37:53 +0000595 : X86SchedWriteWidths<WriteBlend, WriteBlend, WriteBlendY, WriteBlendZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000596def SchedWriteVarBlend
597 : X86SchedWriteWidths<WriteVarBlend, WriteVarBlend,
Clement Courbet7db69cc2018-06-11 14:37:53 +0000598 WriteVarBlendY, WriteVarBlendZ>;
Simon Pilgrim3c354082018-04-30 18:18:38 +0000599
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000600// Vector size wrappers.
601def SchedWriteFAddSizes
Simon Pilgrim1233e122018-05-07 20:52:53 +0000602 : X86SchedWriteSizes<SchedWriteFAdd, SchedWriteFAdd64>;
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000603def SchedWriteFCmpSizes
Simon Pilgrim1233e122018-05-07 20:52:53 +0000604 : X86SchedWriteSizes<SchedWriteFCmp, SchedWriteFCmp64>;
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000605def SchedWriteFMulSizes
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000606 : X86SchedWriteSizes<SchedWriteFMul, SchedWriteFMul64>;
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000607def SchedWriteFDivSizes
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000608 : X86SchedWriteSizes<SchedWriteFDiv, SchedWriteFDiv64>;
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000609def SchedWriteFSqrtSizes
610 : X86SchedWriteSizes<SchedWriteFSqrt, SchedWriteFSqrt64>;
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000611def SchedWriteFLogicSizes
612 : X86SchedWriteSizes<SchedWriteFLogic, SchedWriteFLogic>;
613def SchedWriteFShuffleSizes
614 : X86SchedWriteSizes<SchedWriteFShuffle, SchedWriteFShuffle>;
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000615
Simon Pilgrima271c542017-05-03 15:42:29 +0000616//===----------------------------------------------------------------------===//
Andrea Di Biagio39e5a562018-06-04 15:43:09 +0000617// Common MCInstPredicate definitions used by variant scheduling classes.
618
619def ZeroIdiomPredicate : CheckSameRegOperand<1, 2>;
620
621//===----------------------------------------------------------------------===//
Simon Pilgrim35935c02018-04-12 18:46:15 +0000622// Generic Processor Scheduler Models.
Simon Pilgrima271c542017-05-03 15:42:29 +0000623
624// IssueWidth is analogous to the number of decode units. Core and its
625// descendents, including Nehalem and SandyBridge have 4 decoders.
626// Resources beyond the decoder operate on micro-ops and are bufferred
627// so adjacent micro-ops don't directly compete.
628//
629// MicroOpBufferSize > 1 indicates that RAW dependencies can be
630// decoded in the same cycle. The value 32 is a reasonably arbitrary
631// number of in-flight instructions.
632//
633// HighLatency=10 is optimistic. X86InstrInfo::isHighLatencyDef
634// indicates high latency opcodes. Alternatively, InstrItinData
635// entries may be included here to define specific operand
636// latencies. Since these latencies are not used for pipeline hazards,
637// they do not need to be exact.
638//
Simon Pilgrime0c78682018-04-13 14:31:57 +0000639// The GenericX86Model contains no instruction schedules
Simon Pilgrima271c542017-05-03 15:42:29 +0000640// and disables PostRAScheduler.
641class GenericX86Model : SchedMachineModel {
642 let IssueWidth = 4;
643 let MicroOpBufferSize = 32;
644 let LoadLatency = 4;
645 let HighLatency = 10;
646 let PostRAScheduler = 0;
647 let CompleteModel = 0;
648}
649
650def GenericModel : GenericX86Model;
651
652// Define a model with the PostRAScheduler enabled.
653def GenericPostRAModel : GenericX86Model {
654 let PostRAScheduler = 1;
655}