blob: c52914357eded0607fcd47d9395a69873682cc54 [file] [log] [blame]
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001//=- X86SchedSkylake.td - X86 Skylake Client Scheduling ------*- 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//
10// This file defines the machine model for Skylake Client to support
11// instruction scheduling and other instruction cost heuristics.
12//
13//===----------------------------------------------------------------------===//
14
15def SkylakeClientModel : SchedMachineModel {
16 // All x86 instructions are modeled as a single micro-op, and SKylake can
17 // decode 6 instructions per cycle.
18 let IssueWidth = 6;
19 let MicroOpBufferSize = 224; // Based on the reorder buffer.
20 let LoadLatency = 5;
21 let MispredictPenalty = 14;
Simon Pilgrim31a96332018-03-24 20:40:14 +000022
Gadi Haber6f8fbf42017-09-19 06:19:27 +000023 // Based on the LSD (loop-stream detector) queue size and benchmarking data.
24 let LoopMicroOpBufferSize = 50;
25
26 // This flag is set to allow the scheduler to assign a default model to
27 // unrecognized opcodes.
28 let CompleteModel = 0;
29}
30
31let SchedModel = SkylakeClientModel in {
32
33// Skylake Client can issue micro-ops to 8 different ports in one cycle.
34
35// Ports 0, 1, 5, and 6 handle all computation.
36// Port 4 gets the data half of stores. Store data can be available later than
37// the store address, but since we don't model the latency of stores, we can
38// ignore that.
39// Ports 2 and 3 are identical. They handle loads and the address half of
40// stores. Port 7 can handle address calculations.
41def SKLPort0 : ProcResource<1>;
42def SKLPort1 : ProcResource<1>;
43def SKLPort2 : ProcResource<1>;
44def SKLPort3 : ProcResource<1>;
45def SKLPort4 : ProcResource<1>;
46def SKLPort5 : ProcResource<1>;
47def SKLPort6 : ProcResource<1>;
48def SKLPort7 : ProcResource<1>;
49
50// Many micro-ops are capable of issuing on multiple ports.
51def SKLPort01 : ProcResGroup<[SKLPort0, SKLPort1]>;
52def SKLPort23 : ProcResGroup<[SKLPort2, SKLPort3]>;
53def SKLPort237 : ProcResGroup<[SKLPort2, SKLPort3, SKLPort7]>;
54def SKLPort04 : ProcResGroup<[SKLPort0, SKLPort4]>;
55def SKLPort05 : ProcResGroup<[SKLPort0, SKLPort5]>;
56def SKLPort06 : ProcResGroup<[SKLPort0, SKLPort6]>;
57def SKLPort15 : ProcResGroup<[SKLPort1, SKLPort5]>;
58def SKLPort16 : ProcResGroup<[SKLPort1, SKLPort6]>;
59def SKLPort56 : ProcResGroup<[SKLPort5, SKLPort6]>;
60def SKLPort015 : ProcResGroup<[SKLPort0, SKLPort1, SKLPort5]>;
61def SKLPort056 : ProcResGroup<[SKLPort0, SKLPort5, SKLPort6]>;
62def SKLPort0156: ProcResGroup<[SKLPort0, SKLPort1, SKLPort5, SKLPort6]>;
63
Simon Pilgrim68a8fbc2018-03-25 20:16:53 +000064def SKLDivider : ProcResource<1>; // Integer division issued on port 0.
Craig Topper8104f262018-04-02 05:33:28 +000065// FP division and sqrt on port 0.
66def SKLFPDivider : ProcResource<1>;
Simon Pilgrim68a8fbc2018-03-25 20:16:53 +000067
Gadi Haber6f8fbf42017-09-19 06:19:27 +000068// 60 Entry Unified Scheduler
69def SKLPortAny : ProcResGroup<[SKLPort0, SKLPort1, SKLPort2, SKLPort3, SKLPort4,
70 SKLPort5, SKLPort6, SKLPort7]> {
71 let BufferSize=60;
72}
73
74// Loads are 5 cycles, so ReadAfterLd registers needn't be available until 5
75// cycles after the memory operand.
76def : ReadAdvance<ReadAfterLd, 5>;
77
78// Many SchedWrites are defined in pairs with and without a folded load.
79// Instructions with folded loads are usually micro-fused, so they only appear
80// as two micro-ops when queued in the reservation station.
81// This multiclass defines the resource usage for variants with and without
82// folded loads.
83multiclass SKLWriteResPair<X86FoldableSchedWrite SchedRW,
Simon Pilgrim30c38c32018-03-19 14:46:07 +000084 list<ProcResourceKind> ExePorts,
Simon Pilgrime3547af2018-03-25 10:21:19 +000085 int Lat, list<int> Res = [1], int UOps = 1,
86 int LoadLat = 5> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +000087 // Register variant is using a single cycle on ExePort.
Simon Pilgrim30c38c32018-03-19 14:46:07 +000088 def : WriteRes<SchedRW, ExePorts> {
89 let Latency = Lat;
90 let ResourceCycles = Res;
91 let NumMicroOps = UOps;
92 }
Gadi Haber6f8fbf42017-09-19 06:19:27 +000093
Simon Pilgrime3547af2018-03-25 10:21:19 +000094 // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to
95 // the latency (default = 5).
Simon Pilgrim30c38c32018-03-19 14:46:07 +000096 def : WriteRes<SchedRW.Folded, !listconcat([SKLPort23], ExePorts)> {
Simon Pilgrime3547af2018-03-25 10:21:19 +000097 let Latency = !add(Lat, LoadLat);
Simon Pilgrim30c38c32018-03-19 14:46:07 +000098 let ResourceCycles = !listconcat([1], Res);
Simon Pilgrime3547af2018-03-25 10:21:19 +000099 let NumMicroOps = !add(UOps, 1);
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000100 }
101}
102
Craig Topperf131b602018-04-06 16:16:46 +0000103// A folded store needs a cycle on port 4 for the store data, and an extra port
104// 2/3/7 cycle to recompute the address.
105def : WriteRes<WriteRMW, [SKLPort237,SKLPort4]>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000106
107// Arithmetic.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000108defm : SKLWriteResPair<WriteALU, [SKLPort0156], 1>; // Simple integer ALU op.
109defm : SKLWriteResPair<WriteIMul, [SKLPort1], 3>; // Integer multiplication.
Simon Pilgrim68a8fbc2018-03-25 20:16:53 +0000110defm : SKLWriteResPair<WriteIDiv, [SKLPort0, SKLDivider], 25, [1,10], 1, 4>; // Integer division.
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000111defm : SKLWriteResPair<WriteCRC32, [SKLPort1], 3>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000112
Simon Pilgrim68a8fbc2018-03-25 20:16:53 +0000113def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, high part.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000114def : WriteRes<WriteLEA, [SKLPort15]>; // LEA instructions can't fold loads.
115
Craig Topperb7baa352018-04-08 17:53:18 +0000116defm : SKLWriteResPair<WriteCMOV, [SKLPort06], 1>; // Conditional move.
117def : WriteRes<WriteSETCC, [SKLPort06]>; // Setcc.
118def : WriteRes<WriteSETCCStore, [SKLPort06,SKLPort4,SKLPort237]> {
119 let Latency = 2;
120 let NumMicroOps = 3;
121}
122
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000123// Bit counts.
124defm : SKLWriteResPair<WriteBitScan, [SKLPort1], 3>;
125defm : SKLWriteResPair<WriteLZCNT, [SKLPort1], 3>;
126defm : SKLWriteResPair<WriteTZCNT, [SKLPort1], 3>;
127defm : SKLWriteResPair<WritePOPCNT, [SKLPort1], 3>;
128
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000129// Integer shifts and rotates.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000130defm : SKLWriteResPair<WriteShift, [SKLPort06], 1>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000131
Craig Topper89310f52018-03-29 20:41:39 +0000132// BMI1 BEXTR, BMI2 BZHI
133defm : SKLWriteResPair<WriteBEXTR, [SKLPort06,SKLPort15], 2, [1,1], 2>;
134defm : SKLWriteResPair<WriteBZHI, [SKLPort15], 1>;
135
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000136// Loads, stores, and moves, not folded with other operations.
137def : WriteRes<WriteLoad, [SKLPort23]> { let Latency = 5; }
138def : WriteRes<WriteStore, [SKLPort237, SKLPort4]>;
139def : WriteRes<WriteMove, [SKLPort0156]>;
140
141// Idioms that clear a register, like xorps %xmm0, %xmm0.
142// These can often bypass execution ports completely.
143def : WriteRes<WriteZero, []>;
144
145// Branches don't produce values, so they have no latency, but they still
146// consume resources. Indirect branches can fold loads.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000147defm : SKLWriteResPair<WriteJump, [SKLPort06], 1>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000148
149// Floating point. This covers both scalar and vector operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000150def : WriteRes<WriteFLoad, [SKLPort23]> { let Latency = 6; }
151def : WriteRes<WriteFStore, [SKLPort237, SKLPort4]>;
152def : WriteRes<WriteFMove, [SKLPort015]>;
Simon Pilgrim0e51a122018-05-04 18:16:13 +0000153defm : X86WriteRes<WriteEMMS, [SKLPort05,SKLPort0156], 10, [9,1], 10>;
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000154
Simon Pilgrim1233e122018-05-07 20:52:53 +0000155defm : SKLWriteResPair<WriteFAdd, [SKLPort01], 4, [1], 1, 5>; // Floating point add/sub.
156defm : SKLWriteResPair<WriteFAddX, [SKLPort01], 4, [1], 1, 6>; // Floating point add/sub (XMM).
157defm : SKLWriteResPair<WriteFAddY, [SKLPort01], 4, [1], 1, 7>; // Floating point add/sub (YMM/ZMM).
158defm : SKLWriteResPair<WriteFAdd64, [SKLPort01], 4, [1], 1, 5>; // Floating point double add/sub.
159defm : SKLWriteResPair<WriteFAdd64X, [SKLPort01], 4, [1], 1, 6>; // Floating point double add/sub (XMM).
160defm : SKLWriteResPair<WriteFAdd64Y, [SKLPort01], 4, [1], 1, 7>; // Floating point double add/sub (YMM/ZMM).
161
162defm : SKLWriteResPair<WriteFCmp, [SKLPort01], 4, [1], 1, 5>; // Floating point compare.
163defm : SKLWriteResPair<WriteFCmpX, [SKLPort01], 4, [1], 1, 6>; // Floating point compare (XMM).
164defm : SKLWriteResPair<WriteFCmpY, [SKLPort01], 4, [1], 1, 7>; // Floating point compare (YMM/ZMM).
165defm : SKLWriteResPair<WriteFCmp64, [SKLPort01], 4, [1], 1, 5>; // Floating point double compare.
166defm : SKLWriteResPair<WriteFCmp64X, [SKLPort01], 4, [1], 1, 6>; // Floating point double compare (XMM).
167defm : SKLWriteResPair<WriteFCmp64Y, [SKLPort01], 4, [1], 1, 7>; // Floating point double compare (YMM/ZMM).
168
169defm : SKLWriteResPair<WriteFCom, [SKLPort0], 2>; // Floating point compare to flags.
170
171defm : SKLWriteResPair<WriteFMul, [SKLPort01], 4, [1], 1, 5>; // Floating point multiplication.
172defm : SKLWriteResPair<WriteFMulX, [SKLPort01], 4, [1], 1, 6>; // Floating point multiplication (XMM).
173defm : SKLWriteResPair<WriteFMulY, [SKLPort01], 4, [1], 1, 7>; // Floating point multiplication (YMM/ZMM).
174defm : SKLWriteResPair<WriteFMul64, [SKLPort01], 4, [1], 1, 5>; // Floating point double multiplication.
175defm : SKLWriteResPair<WriteFMul64X, [SKLPort01], 4, [1], 1, 6>; // Floating point double multiplication (XMM).
176defm : SKLWriteResPair<WriteFMul64Y, [SKLPort01], 4, [1], 1, 7>; // Floating point double multiplication (YMM/ZMM).
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000177
178defm : SKLWriteResPair<WriteFDiv, [SKLPort0,SKLFPDivider], 11, [1,3], 1, 5>; // Floating point division.
179//defm : SKLWriteResPair<WriteFDivX, [SKLPort0,SKLFPDivider], 11, [1,3], 1, 6>; // Floating point division (XMM).
180defm : SKLWriteResPair<WriteFDivY, [SKLPort0,SKLFPDivider], 11, [1,5], 1, 7>; // Floating point division (YMM).
181defm : SKLWriteResPair<WriteFDivZ, [SKLPort0,SKLFPDivider], 11, [1,5], 1, 7>; // Floating point division (ZMM).
182//defm : SKLWriteResPair<WriteFDiv64, [SKLPort0,SKLFPDivider], 14, [1,3], 1, 5>; // Floating point double division.
183//defm : SKLWriteResPair<WriteFDiv64X, [SKLPort0,SKLFPDivider], 14, [1,3], 1, 6>; // Floating point double division (XMM).
184//defm : SKLWriteResPair<WriteFDiv64Y, [SKLPort0,SKLFPDivider], 14, [1,5], 1, 7>; // Floating point double division (YMM).
185defm : SKLWriteResPair<WriteFDiv64Z, [SKLPort0,SKLFPDivider], 14, [1,5], 1, 7>; // Floating point double division (ZMM).
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000186
187defm : SKLWriteResPair<WriteFSqrt, [SKLPort0,SKLFPDivider], 12, [1,3], 1, 5>; // Floating point square root.
188defm : SKLWriteResPair<WriteFSqrtX, [SKLPort0,SKLFPDivider], 12, [1,3], 1, 6>; // Floating point square root (XMM).
189defm : SKLWriteResPair<WriteFSqrtY, [SKLPort0,SKLFPDivider], 12, [1,6], 1, 7>; // Floating point square root (YMM).
190defm : SKLWriteResPair<WriteFSqrtZ, [SKLPort0,SKLFPDivider], 12, [1,6], 1, 7>; // Floating point square root (ZMM).
191defm : SKLWriteResPair<WriteFSqrt64, [SKLPort0,SKLFPDivider], 18, [1,6], 1, 5>; // Floating point double square root.
192defm : SKLWriteResPair<WriteFSqrt64X, [SKLPort0,SKLFPDivider], 18, [1,6], 1, 6>; // Floating point double square root (XMM).
193defm : SKLWriteResPair<WriteFSqrt64Y, [SKLPort0,SKLFPDivider], 18, [1,12],1, 7>; // Floating point double square root (YMM).
194defm : SKLWriteResPair<WriteFSqrt64Z, [SKLPort0,SKLFPDivider], 18, [1,12],1, 7>; // Floating point double square root (ZMM).
195defm : SKLWriteResPair<WriteFSqrt80, [SKLPort0,SKLFPDivider], 21, [1,7]>; // Floating point long double square root.
196
Simon Pilgrimc7088682018-05-01 18:06:07 +0000197defm : SKLWriteResPair<WriteFRcp, [SKLPort0], 4, [1], 1, 5>; // Floating point reciprocal estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000198defm : SKLWriteResPair<WriteFRcpX, [SKLPort0], 4, [1], 1, 6>; // Floating point reciprocal estimate (XMM).
199defm : SKLWriteResPair<WriteFRcpY, [SKLPort0], 4, [1], 1, 7>; // Floating point reciprocal estimate (YMM/ZMM).
200
Simon Pilgrimc7088682018-05-01 18:06:07 +0000201defm : SKLWriteResPair<WriteFRsqrt, [SKLPort0], 4, [1], 1, 5>; // Floating point reciprocal square root estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000202defm : SKLWriteResPair<WriteFRsqrtX,[SKLPort0], 4, [1], 1, 6>; // Floating point reciprocal square root estimate (XMM).
203defm : SKLWriteResPair<WriteFRsqrtY,[SKLPort0], 4, [1], 1, 7>; // Floating point reciprocal square root estimate (YMM/ZMM).
204
Simon Pilgrim67cc2462018-05-04 15:20:18 +0000205defm : SKLWriteResPair<WriteFMA, [SKLPort01], 4, [1], 1, 5>; // Fused Multiply Add.
206defm : SKLWriteResPair<WriteFMAX, [SKLPort01], 4, [1], 1, 6>; // Fused Multiply Add (XMM).
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000207defm : SKLWriteResPair<WriteFMAY, [SKLPort01], 4, [1], 1, 7>; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000208defm : SKLWriteResPair<WriteDPPD, [SKLPort5,SKLPort01], 9, [1,2], 3, 6>; // Floating point double dot product.
209defm : SKLWriteResPair<WriteDPPS, [SKLPort5,SKLPort01], 13, [1,3], 4, 6>; // Floating point single dot product.
210defm : SKLWriteResPair<WriteDPPSY, [SKLPort5,SKLPort01], 13, [1,3], 4, 7>; // Floating point single dot product (YMM).
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000211defm : SKLWriteResPair<WriteFSign, [SKLPort0], 1>; // Floating point fabs/fchs.
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000212defm : SKLWriteResPair<WriteFRnd, [SKLPort01], 8, [2], 2, 6>; // Floating point rounding.
213defm : SKLWriteResPair<WriteFRndY, [SKLPort01], 8, [2], 2, 7>; // Floating point rounding (YMM/ZMM).
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000214defm : SKLWriteResPair<WriteFLogic, [SKLPort015], 1, [1], 1, 6>; // Floating point and/or/xor logicals.
215defm : SKLWriteResPair<WriteFLogicY, [SKLPort015], 1, [1], 1, 7>; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000216defm : SKLWriteResPair<WriteFTest, [SKLPort0], 2, [1], 1, 6>; // Floating point TEST instructions.
217defm : SKLWriteResPair<WriteFTestY, [SKLPort0], 2, [1], 1, 7>; // Floating point TEST instructions (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000218defm : SKLWriteResPair<WriteFShuffle, [SKLPort5], 1, [1], 1, 6>; // Floating point vector shuffles.
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000219defm : SKLWriteResPair<WriteFShuffleY, [SKLPort5], 1, [1], 1, 7>; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000220defm : SKLWriteResPair<WriteFVarShuffle, [SKLPort5], 1, [1], 1, 6>; // Floating point vector shuffles.
221defm : SKLWriteResPair<WriteFVarShuffleY, [SKLPort5], 1, [1], 1, 7>; // Floating point vector shuffles.
Simon Pilgrim06e16542018-04-22 18:35:53 +0000222defm : SKLWriteResPair<WriteFBlend, [SKLPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000223defm : SKLWriteResPair<WriteFBlendY, [SKLPort015], 1, [1], 1, 7>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000224defm : SKLWriteResPair<WriteFVarBlend, [SKLPort015], 2, [2], 2, 6>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000225defm : SKLWriteResPair<WriteFVarBlendY,[SKLPort015], 2, [2], 2, 7>; // Fp vector variable blends.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000226
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000227def : WriteRes<WriteCvtF2FSt, [SKLPort4,SKLPort5,SKLPort237,SKLPort01]> {
228 let Latency = 6;
229 let NumMicroOps = 4;
230 let ResourceCycles = [1,1,1,1];
231}
232
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000233// FMA Scheduling helper class.
234// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
235
236// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000237def : WriteRes<WriteVecLoad, [SKLPort23]> { let Latency = 6; }
238def : WriteRes<WriteVecStore, [SKLPort237, SKLPort4]>;
239def : WriteRes<WriteVecMove, [SKLPort015]>;
240
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000241defm : SKLWriteResPair<WriteVecALU, [SKLPort01], 1, [1], 1, 6>; // Vector integer ALU op, no logicals.
242defm : SKLWriteResPair<WriteVecALUY, [SKLPort01], 1, [1], 1, 7>; // Vector integer ALU op, no logicals (YMM/ZMM).
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000243defm : SKLWriteResPair<WriteVecLogic, [SKLPort015], 1, [1], 1, 6>; // Vector integer and/or/xor.
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000244defm : SKLWriteResPair<WriteVecLogicY,[SKLPort015], 1, [1], 1, 7>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000245defm : SKLWriteResPair<WriteVecTest, [SKLPort0,SKLPort5], 3, [1,1], 2, 6>; // Vector integer TEST instructions.
246defm : SKLWriteResPair<WriteVecTestY, [SKLPort0,SKLPort5], 3, [1,1], 2, 7>; // Vector integer TEST instructions (YMM/ZMM).
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000247defm : SKLWriteResPair<WriteVecIMul, [SKLPort0] , 4, [1], 1, 5>; // Vector integer multiply.
248defm : SKLWriteResPair<WriteVecIMulX, [SKLPort01], 4, [1], 1, 6>; // Vector integer multiply (XMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000249defm : SKLWriteResPair<WriteVecIMulY, [SKLPort01], 4, [1], 1, 7>; // Vector integer multiply (YMM/ZMM).
250defm : SKLWriteResPair<WritePMULLD, [SKLPort01], 10, [2], 2, 6>; // Vector PMULLD.
251defm : SKLWriteResPair<WritePMULLDY, [SKLPort01], 10, [2], 2, 7>; // Vector PMULLD (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000252defm : SKLWriteResPair<WriteShuffle, [SKLPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000253defm : SKLWriteResPair<WriteShuffleY, [SKLPort5], 1, [1], 1, 7>; // Vector shuffles (YMM/ZMM).
254defm : SKLWriteResPair<WriteVarShuffle, [SKLPort5], 1, [1], 1, 6>; // Vector shuffles.
255defm : SKLWriteResPair<WriteVarShuffleY, [SKLPort5], 1, [1], 1, 7>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim06e16542018-04-22 18:35:53 +0000256defm : SKLWriteResPair<WriteBlend, [SKLPort5], 1, [1], 1, 6>; // Vector blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000257defm : SKLWriteResPair<WriteBlendY, [SKLPort5], 1, [1], 1, 7>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000258defm : SKLWriteResPair<WriteVarBlend, [SKLPort015], 2, [2], 2, 6>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000259defm : SKLWriteResPair<WriteVarBlendY, [SKLPort015], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000260defm : SKLWriteResPair<WriteMPSAD, [SKLPort5], 4, [2], 2, 6>; // Vector MPSAD.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000261defm : SKLWriteResPair<WriteMPSADY, [SKLPort5], 4, [2], 2, 7>; // Vector MPSAD.
262defm : SKLWriteResPair<WritePSADBW, [SKLPort5], 3, [1], 1, 6>; // Vector PSADBW.
263defm : SKLWriteResPair<WritePSADBWY, [SKLPort5], 3, [1], 1, 7>; // Vector PSADBW.
Simon Pilgrim27bc83e2018-04-24 18:49:25 +0000264defm : SKLWriteResPair<WritePHMINPOS, [SKLPort01], 4, [1], 1, 6>; // Vector PHMINPOS.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000265
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000266// Vector integer shifts.
267defm : SKLWriteResPair<WriteVecShift, [SKLPort0], 1, [1], 1, 5>;
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000268defm : X86WriteRes<WriteVecShiftX, [SKLPort5,SKLPort01], 2, [1,1], 2>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000269defm : X86WriteRes<WriteVecShiftY, [SKLPort5,SKLPort01], 4, [1,1], 2>;
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000270defm : X86WriteRes<WriteVecShiftXLd, [SKLPort01,SKLPort23], 7, [1,1], 2>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000271defm : X86WriteRes<WriteVecShiftYLd, [SKLPort01,SKLPort23], 8, [1,1], 2>;
272
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000273defm : SKLWriteResPair<WriteVecShiftImm, [SKLPort0], 1, [1], 1, 5>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000274defm : SKLWriteResPair<WriteVecShiftImmX, [SKLPort01], 1, [1], 1, 6>; // Vector integer immediate shifts (XMM).
275defm : SKLWriteResPair<WriteVecShiftImmY, [SKLPort01], 1, [1], 1, 7>; // Vector integer immediate shifts (YMM/ZMM).
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000276defm : SKLWriteResPair<WriteVarVecShift, [SKLPort01], 1, [1], 1, 6>; // Variable vector shifts.
277defm : SKLWriteResPair<WriteVarVecShiftY, [SKLPort01], 1, [1], 1, 7>; // Variable vector shifts (YMM/ZMM).
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000278
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000279// Vector insert/extract operations.
280def : WriteRes<WriteVecInsert, [SKLPort5]> {
281 let Latency = 2;
282 let NumMicroOps = 2;
283 let ResourceCycles = [2];
284}
285def : WriteRes<WriteVecInsertLd, [SKLPort5,SKLPort23]> {
286 let Latency = 6;
287 let NumMicroOps = 2;
288}
Simon Pilgrim819f2182018-05-02 17:58:50 +0000289def: InstRW<[WriteVecInsertLd], (instregex "(V?)MOV(H|L)(PD|PS)rm")>;
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000290
291def : WriteRes<WriteVecExtract, [SKLPort0,SKLPort5]> {
292 let Latency = 3;
293 let NumMicroOps = 2;
294}
295def : WriteRes<WriteVecExtractSt, [SKLPort4,SKLPort5,SKLPort237]> {
296 let Latency = 2;
297 let NumMicroOps = 3;
298}
299
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000300// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000301defm : SKLWriteResPair<WriteCvtF2I, [SKLPort1], 3>; // Float -> Integer.
302defm : SKLWriteResPair<WriteCvtI2F, [SKLPort1], 4>; // Integer -> Float.
303defm : SKLWriteResPair<WriteCvtF2F, [SKLPort1], 3>; // Float -> Float size conversion.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000304
305// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000306
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000307// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000308def : WriteRes<WritePCmpIStrM, [SKLPort0]> {
309 let Latency = 10;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000310 let NumMicroOps = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000311 let ResourceCycles = [3];
312}
313def : WriteRes<WritePCmpIStrMLd, [SKLPort0, SKLPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000314 let Latency = 16;
315 let NumMicroOps = 4;
316 let ResourceCycles = [3,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000317}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000318
319// Packed Compare Explicit Length Strings, Return Mask
320def : WriteRes<WritePCmpEStrM, [SKLPort0, SKLPort5, SKLPort015, SKLPort0156]> {
321 let Latency = 19;
322 let NumMicroOps = 9;
323 let ResourceCycles = [4,3,1,1];
324}
325def : WriteRes<WritePCmpEStrMLd, [SKLPort0, SKLPort5,SKLPort23, SKLPort015, SKLPort0156]> {
326 let Latency = 25;
327 let NumMicroOps = 10;
328 let ResourceCycles = [4,3,1,1,1];
329}
330
331// Packed Compare Implicit Length Strings, Return Index
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000332def : WriteRes<WritePCmpIStrI, [SKLPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000333 let Latency = 10;
334 let NumMicroOps = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000335 let ResourceCycles = [3];
336}
337def : WriteRes<WritePCmpIStrILd, [SKLPort0, SKLPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000338 let Latency = 16;
339 let NumMicroOps = 4;
340 let ResourceCycles = [3,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000341}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000342
343// Packed Compare Explicit Length Strings, Return Index
344def : WriteRes<WritePCmpEStrI, [SKLPort0, SKLPort5, SKLPort0156]> {
345 let Latency = 18;
346 let NumMicroOps = 8;
347 let ResourceCycles = [4,3,1];
348}
349def : WriteRes<WritePCmpEStrILd, [SKLPort0, SKLPort5, SKLPort23, SKLPort0156]> {
350 let Latency = 24;
351 let NumMicroOps = 9;
352 let ResourceCycles = [4,3,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000353}
354
Simon Pilgrima2f26782018-03-27 20:38:54 +0000355// MOVMSK Instructions.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000356def : WriteRes<WriteFMOVMSK, [SKLPort0]> { let Latency = 2; }
357def : WriteRes<WriteVecMOVMSK, [SKLPort0]> { let Latency = 2; }
358def : WriteRes<WriteVecMOVMSKY, [SKLPort0]> { let Latency = 2; }
359def : WriteRes<WriteMMXMOVMSK, [SKLPort0]> { let Latency = 2; }
Simon Pilgrima2f26782018-03-27 20:38:54 +0000360
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000361// AES instructions.
Simon Pilgrim7684e052018-03-22 13:18:08 +0000362def : WriteRes<WriteAESDecEnc, [SKLPort0]> { // Decryption, encryption.
363 let Latency = 4;
364 let NumMicroOps = 1;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000365 let ResourceCycles = [1];
366}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000367def : WriteRes<WriteAESDecEncLd, [SKLPort0, SKLPort23]> {
368 let Latency = 10;
369 let NumMicroOps = 2;
370 let ResourceCycles = [1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000371}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000372
373def : WriteRes<WriteAESIMC, [SKLPort0]> { // InvMixColumn.
374 let Latency = 8;
375 let NumMicroOps = 2;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000376 let ResourceCycles = [2];
377}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000378def : WriteRes<WriteAESIMCLd, [SKLPort0, SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000379 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000380 let NumMicroOps = 3;
381 let ResourceCycles = [2,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000382}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000383
384def : WriteRes<WriteAESKeyGen, [SKLPort0, SKLPort5, SKLPort015]> { // Key Generation.
385 let Latency = 20;
386 let NumMicroOps = 11;
387 let ResourceCycles = [3,6,2];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000388}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000389def : WriteRes<WriteAESKeyGenLd, [SKLPort0, SKLPort5, SKLPort23, SKLPort015]> {
390 let Latency = 25;
391 let NumMicroOps = 11;
392 let ResourceCycles = [3,6,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000393}
394
395// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000396def : WriteRes<WriteCLMul, [SKLPort5]> {
397 let Latency = 6;
398 let NumMicroOps = 1;
399 let ResourceCycles = [1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000400}
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000401def : WriteRes<WriteCLMulLd, [SKLPort5, SKLPort23]> {
402 let Latency = 12;
403 let NumMicroOps = 2;
404 let ResourceCycles = [1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000405}
406
407// Catch-all for expensive system instructions.
408def : WriteRes<WriteSystem, [SKLPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
409
410// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000411defm : SKLWriteResPair<WriteFShuffle256, [SKLPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
412defm : SKLWriteResPair<WriteFVarShuffle256, [SKLPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
413defm : SKLWriteResPair<WriteShuffle256, [SKLPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
414defm : SKLWriteResPair<WriteVarShuffle256, [SKLPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000415
416// Old microcoded instructions that nobody use.
417def : WriteRes<WriteMicrocoded, [SKLPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
418
419// Fence instructions.
420def : WriteRes<WriteFence, [SKLPort23, SKLPort4]>;
421
Craig Topper05242bf2018-04-21 18:07:36 +0000422// Load/store MXCSR.
423def : WriteRes<WriteLDMXCSR, [SKLPort0,SKLPort23,SKLPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
424def : WriteRes<WriteSTMXCSR, [SKLPort4,SKLPort5,SKLPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
425
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000426// Nop, not very useful expect it provides a model for nops!
427def : WriteRes<WriteNop, []>;
428
429////////////////////////////////////////////////////////////////////////////////
430// Horizontal add/sub instructions.
431////////////////////////////////////////////////////////////////////////////////
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000432
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000433defm : SKLWriteResPair<WriteFHAdd, [SKLPort5,SKLPort01], 6, [2,1], 3, 6>;
434defm : SKLWriteResPair<WriteFHAddY, [SKLPort5,SKLPort01], 6, [2,1], 3, 7>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000435defm : SKLWriteResPair<WritePHAdd, [SKLPort5,SKLPort015], 3, [2,1], 3, 6>;
436defm : SKLWriteResPair<WritePHAddY, [SKLPort5,SKLPort015], 3, [2,1], 3, 7>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000437
438// Remaining instrs.
439
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000440def SKLWriteResGroup1 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000441 let Latency = 1;
442 let NumMicroOps = 1;
443 let ResourceCycles = [1];
444}
Craig Topperfc179c62018-03-22 04:23:41 +0000445def: InstRW<[SKLWriteResGroup1], (instregex "MMX_PADDSBirr",
446 "MMX_PADDSWirr",
447 "MMX_PADDUSBirr",
448 "MMX_PADDUSWirr",
449 "MMX_PAVGBirr",
450 "MMX_PAVGWirr",
451 "MMX_PCMPEQBirr",
452 "MMX_PCMPEQDirr",
453 "MMX_PCMPEQWirr",
454 "MMX_PCMPGTBirr",
455 "MMX_PCMPGTDirr",
456 "MMX_PCMPGTWirr",
457 "MMX_PMAXSWirr",
458 "MMX_PMAXUBirr",
459 "MMX_PMINSWirr",
460 "MMX_PMINUBirr",
Craig Topperfc179c62018-03-22 04:23:41 +0000461 "MMX_PSUBSBirr",
462 "MMX_PSUBSWirr",
463 "MMX_PSUBUSBirr",
464 "MMX_PSUBUSWirr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000465
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000466def SKLWriteResGroup3 : SchedWriteRes<[SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000467 let Latency = 1;
468 let NumMicroOps = 1;
469 let ResourceCycles = [1];
470}
Craig Topperfc179c62018-03-22 04:23:41 +0000471def: InstRW<[SKLWriteResGroup3], (instregex "COMP_FST0r",
472 "COM_FST0r",
Craig Topperfc179c62018-03-22 04:23:41 +0000473 "MMX_MOVD64rr",
474 "MMX_MOVD64to64rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000475 "UCOM_FPr",
476 "UCOM_Fr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000477 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000478 "(V?)MOVDI2PDIrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000479
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000480def SKLWriteResGroup4 : SchedWriteRes<[SKLPort6]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000481 let Latency = 1;
482 let NumMicroOps = 1;
483 let ResourceCycles = [1];
484}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000485def: InstRW<[SKLWriteResGroup4], (instregex "JMP(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000486
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000487def SKLWriteResGroup6 : SchedWriteRes<[SKLPort05]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000488 let Latency = 1;
489 let NumMicroOps = 1;
490 let ResourceCycles = [1];
491}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000492def: InstRW<[SKLWriteResGroup6], (instrs FINCSTP, FNOP)>;
493def: InstRW<[SKLWriteResGroup6], (instregex "MMX_MOVQ64rr",
Simon Pilgrim5e492d22018-04-19 17:32:10 +0000494 "MMX_PABS(B|D|W)rr",
495 "MMX_PADD(B|D|Q|W)irr",
Craig Topperfc179c62018-03-22 04:23:41 +0000496 "MMX_PANDNirr",
497 "MMX_PANDirr",
498 "MMX_PORirr",
Simon Pilgrim5e492d22018-04-19 17:32:10 +0000499 "MMX_PSIGN(B|D|W)rr",
500 "MMX_PSUB(B|D|Q|W)irr",
Craig Topperfc179c62018-03-22 04:23:41 +0000501 "MMX_PXORirr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000502
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000503def SKLWriteResGroup7 : SchedWriteRes<[SKLPort06]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000504 let Latency = 1;
505 let NumMicroOps = 1;
506 let ResourceCycles = [1];
507}
Simon Pilgrim455d0b22018-04-23 13:24:17 +0000508def: InstRW<[SKLWriteResGroup7], (instrs CDQ, CQO, CLAC, STAC)>;
Craig Topperfc179c62018-03-22 04:23:41 +0000509def: InstRW<[SKLWriteResGroup7], (instregex "ADC(16|32|64)ri",
510 "ADC(16|32|64)i",
511 "ADC(8|16|32|64)rr",
512 "ADCX(32|64)rr",
513 "ADOX(32|64)rr",
514 "BT(16|32|64)ri8",
515 "BT(16|32|64)rr",
516 "BTC(16|32|64)ri8",
517 "BTC(16|32|64)rr",
518 "BTR(16|32|64)ri8",
519 "BTR(16|32|64)rr",
520 "BTS(16|32|64)ri8",
521 "BTS(16|32|64)rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000522 "SBB(16|32|64)ri",
523 "SBB(16|32|64)i",
Simon Pilgrim39d77202018-04-28 15:32:19 +0000524 "SBB(8|16|32|64)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000525
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000526def SKLWriteResGroup8 : SchedWriteRes<[SKLPort15]> {
527 let Latency = 1;
528 let NumMicroOps = 1;
529 let ResourceCycles = [1];
530}
Craig Topperfc179c62018-03-22 04:23:41 +0000531def: InstRW<[SKLWriteResGroup8], (instregex "ANDN(32|64)rr",
532 "BLSI(32|64)rr",
533 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000534 "BLSR(32|64)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000535
536def SKLWriteResGroup9 : SchedWriteRes<[SKLPort015]> {
537 let Latency = 1;
538 let NumMicroOps = 1;
539 let ResourceCycles = [1];
540}
Simon Pilgrim37334ea2018-04-21 21:59:36 +0000541def: InstRW<[SKLWriteResGroup9], (instregex "(V?)PADDB(Y?)rr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000542 "(V?)PADDD(Y?)rr",
543 "(V?)PADDQ(Y?)rr",
544 "(V?)PADDW(Y?)rr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000545 "VPBLENDD(Y?)rri",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000546 "(V?)PSUBB(Y?)rr",
547 "(V?)PSUBD(Y?)rr",
548 "(V?)PSUBQ(Y?)rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000549 "(V?)PSUBW(Y?)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000550
551def SKLWriteResGroup10 : SchedWriteRes<[SKLPort0156]> {
552 let Latency = 1;
553 let NumMicroOps = 1;
554 let ResourceCycles = [1];
555}
Craig Topperfbe31322018-04-05 21:56:19 +0000556def: InstRW<[SKLWriteResGroup10], (instrs CBW, CWDE, CDQE)>;
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000557def: InstRW<[SKLWriteResGroup10], (instrs LAHF, SAHF)>; // TODO: This doesn't match Agner's data
Craig Topperf0d04262018-04-06 16:16:48 +0000558def: InstRW<[SKLWriteResGroup10], (instregex "CLC",
Craig Topperfc179c62018-03-22 04:23:41 +0000559 "CMC",
Craig Topperfc179c62018-03-22 04:23:41 +0000560 "NOOP",
Craig Topperfc179c62018-03-22 04:23:41 +0000561 "SGDT64m",
562 "SIDT64m",
Craig Topperfc179c62018-03-22 04:23:41 +0000563 "SMSW16m",
564 "STC",
565 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000566 "SYSCALL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000567
568def SKLWriteResGroup11 : SchedWriteRes<[SKLPort4,SKLPort237]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000569 let Latency = 1;
570 let NumMicroOps = 2;
571 let ResourceCycles = [1,1];
572}
Craig Topperfc179c62018-03-22 04:23:41 +0000573def: InstRW<[SKLWriteResGroup11], (instregex "FBSTPm",
574 "MMX_MOVD64from64rm",
575 "MMX_MOVD64mr",
576 "MMX_MOVNTQmr",
577 "MMX_MOVQ64mr",
Craig Topperfc179c62018-03-22 04:23:41 +0000578 "MOVNTI_64mr",
579 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000580 "ST_FP(32|64|80)m",
Craig Topperfc179c62018-03-22 04:23:41 +0000581 "VEXTRACTF128mr",
582 "VEXTRACTI128mr",
Craig Topper972bdbd2018-03-25 17:33:14 +0000583 "(V?)MOVAPDYmr",
584 "(V?)MOVAPS(Y?)mr",
585 "(V?)MOVDQA(Y?)mr",
586 "(V?)MOVDQU(Y?)mr",
587 "(V?)MOVHPDmr",
588 "(V?)MOVHPSmr",
589 "(V?)MOVLPDmr",
590 "(V?)MOVLPSmr",
591 "(V?)MOVNTDQ(Y?)mr",
592 "(V?)MOVNTPD(Y?)mr",
593 "(V?)MOVNTPS(Y?)mr",
594 "(V?)MOVPDI2DImr",
595 "(V?)MOVPQI2QImr",
596 "(V?)MOVPQIto64mr",
597 "(V?)MOVSDmr",
598 "(V?)MOVSSmr",
599 "(V?)MOVUPD(Y?)mr",
600 "(V?)MOVUPS(Y?)mr",
Craig Topperfc179c62018-03-22 04:23:41 +0000601 "VMPTRSTm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000602
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000603def SKLWriteResGroup12 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000604 let Latency = 2;
605 let NumMicroOps = 1;
606 let ResourceCycles = [1];
607}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000608def: InstRW<[SKLWriteResGroup12], (instregex "MMX_MOVD64from64rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000609 "MMX_MOVD64grr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000610 "(V?)MOVPDI2DIrr",
Simon Pilgrim210286e2018-05-08 10:28:03 +0000611 "(V?)MOVPQIto64rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000612
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000613def SKLWriteResGroup13 : SchedWriteRes<[SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000614 let Latency = 2;
615 let NumMicroOps = 2;
616 let ResourceCycles = [2];
617}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000618def: InstRW<[SKLWriteResGroup13], (instregex "MMX_MOVQ2DQrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000619
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000620def SKLWriteResGroup14 : SchedWriteRes<[SKLPort05]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000621 let Latency = 2;
622 let NumMicroOps = 2;
623 let ResourceCycles = [2];
624}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000625def: InstRW<[SKLWriteResGroup14], (instrs FDECSTP)>;
626def: InstRW<[SKLWriteResGroup14], (instregex "MMX_MOVDQ2Qrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000627
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000628def SKLWriteResGroup15 : SchedWriteRes<[SKLPort06]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000629 let Latency = 2;
630 let NumMicroOps = 2;
631 let ResourceCycles = [2];
632}
Craig Topperfc179c62018-03-22 04:23:41 +0000633def: InstRW<[SKLWriteResGroup15], (instregex "CMOV(A|BE)(16|32|64)rr",
634 "ROL(8|16|32|64)r1",
635 "ROL(8|16|32|64)ri",
636 "ROR(8|16|32|64)r1",
637 "ROR(8|16|32|64)ri",
638 "SET(A|BE)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000639
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000640def SKLWriteResGroup17 : SchedWriteRes<[SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000641 let Latency = 2;
642 let NumMicroOps = 2;
643 let ResourceCycles = [2];
644}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000645def: InstRW<[SKLWriteResGroup17], (instrs LFENCE,
646 WAIT,
647 XGETBV)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000648
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000649def SKLWriteResGroup18 : SchedWriteRes<[SKLPort0,SKLPort237]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000650 let Latency = 2;
651 let NumMicroOps = 2;
652 let ResourceCycles = [1,1];
653}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000654def: InstRW<[SKLWriteResGroup18], (instregex "VMASKMOVPD(Y?)mr",
655 "VMASKMOVPS(Y?)mr",
656 "VPMASKMOVD(Y?)mr",
657 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000658
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000659def SKLWriteResGroup20 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000660 let Latency = 2;
661 let NumMicroOps = 2;
662 let ResourceCycles = [1,1];
663}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000664def: InstRW<[SKLWriteResGroup20], (instregex "CLFLUSH")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000665
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000666def SKLWriteResGroup21 : SchedWriteRes<[SKLPort237,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000667 let Latency = 2;
668 let NumMicroOps = 2;
669 let ResourceCycles = [1,1];
670}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000671def: InstRW<[SKLWriteResGroup21], (instregex "SFENCE")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000672
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000673def SKLWriteResGroup22 : SchedWriteRes<[SKLPort06,SKLPort15]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000674 let Latency = 2;
675 let NumMicroOps = 2;
676 let ResourceCycles = [1,1];
677}
Craig Topper498875f2018-04-04 17:54:19 +0000678def: InstRW<[SKLWriteResGroup22], (instrs BSWAP64r)>;
679
680def SKLWriteResGroup22_1 : SchedWriteRes<[SKLPort15]> {
681 let Latency = 1;
682 let NumMicroOps = 1;
683 let ResourceCycles = [1];
684}
685def: InstRW<[SKLWriteResGroup22_1], (instrs BSWAP32r)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000686
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000687def SKLWriteResGroup23 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000688 let Latency = 2;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000689 let NumMicroOps = 2;
690 let ResourceCycles = [1,1];
691}
Craig Topper2d451e72018-03-18 08:38:06 +0000692def: InstRW<[SKLWriteResGroup23], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000693def: InstRW<[SKLWriteResGroup23], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topperfc179c62018-03-22 04:23:41 +0000694def: InstRW<[SKLWriteResGroup23], (instregex "ADC8i8",
695 "ADC8ri",
696 "SBB8i8",
697 "SBB8ri")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000698
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000699def SKLWriteResGroup25 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort237]> {
700 let Latency = 2;
701 let NumMicroOps = 3;
702 let ResourceCycles = [1,1,1];
703}
704def: InstRW<[SKLWriteResGroup25], (instregex "FNSTCW16m")>;
705
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000706def SKLWriteResGroup27 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort15]> {
707 let Latency = 2;
708 let NumMicroOps = 3;
709 let ResourceCycles = [1,1,1];
710}
711def: InstRW<[SKLWriteResGroup27], (instregex "MOVBE(16|32|64)mr")>;
712
713def SKLWriteResGroup28 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort0156]> {
714 let Latency = 2;
715 let NumMicroOps = 3;
716 let ResourceCycles = [1,1,1];
717}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000718def: InstRW<[SKLWriteResGroup28], (instrs PUSH16r, PUSH32r, PUSH64r,
719 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topperfc179c62018-03-22 04:23:41 +0000720def: InstRW<[SKLWriteResGroup28], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000721 "PUSH64i8")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000722
723def SKLWriteResGroup29 : SchedWriteRes<[SKLPort1]> {
724 let Latency = 3;
725 let NumMicroOps = 1;
726 let ResourceCycles = [1];
727}
Simon Pilgrime93fd5f2018-05-02 09:18:49 +0000728def: InstRW<[SKLWriteResGroup29], (instregex "CMOV(N?)(B|BE|E|P)_F",
729 "PDEP(32|64)rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000730 "PEXT(32|64)rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000731 "SHLD(16|32|64)rri8",
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000732 "SHRD(16|32|64)rri8")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000733
Clement Courbet327fac42018-03-07 08:14:02 +0000734def SKLWriteResGroup29_16i : SchedWriteRes<[SKLPort1, SKLPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000735 let Latency = 4;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000736 let NumMicroOps = 2;
737 let ResourceCycles = [1,1];
738}
Clement Courbet327fac42018-03-07 08:14:02 +0000739def: InstRW<[SKLWriteResGroup29_16i], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000740
741def SKLWriteResGroup30 : SchedWriteRes<[SKLPort5]> {
742 let Latency = 3;
743 let NumMicroOps = 1;
744 let ResourceCycles = [1];
745}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000746def: InstRW<[SKLWriteResGroup30], (instregex "(ADD|SUB|SUBR)_FPrST0",
747 "(ADD|SUB|SUBR)_FST0r",
748 "(ADD|SUB|SUBR)_FrST0",
Simon Pilgrim74ccc6a2018-04-21 19:11:55 +0000749 "VPBROADCASTBrr",
Simon Pilgrim825ead92018-04-21 20:45:12 +0000750 "VPBROADCASTWrr",
Simon Pilgrime480ed02018-05-07 18:25:19 +0000751 "(V?)PCMPGTQ(Y?)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000752
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000753def SKLWriteResGroup32 : SchedWriteRes<[SKLPort0,SKLPort0156]> {
754 let Latency = 3;
755 let NumMicroOps = 2;
756 let ResourceCycles = [1,1];
757}
758def: InstRW<[SKLWriteResGroup32], (instregex "FNSTSW16r")>;
759
760def SKLWriteResGroup33 : SchedWriteRes<[SKLPort06]> {
761 let Latency = 3;
762 let NumMicroOps = 3;
763 let ResourceCycles = [3];
764}
Craig Topperfc179c62018-03-22 04:23:41 +0000765def: InstRW<[SKLWriteResGroup33], (instregex "ROL(8|16|32|64)rCL",
766 "ROR(8|16|32|64)rCL",
767 "SAR(8|16|32|64)rCL",
768 "SHL(8|16|32|64)rCL",
769 "SHR(8|16|32|64)rCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000770
771def SKLWriteResGroup34 : SchedWriteRes<[SKLPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000772 let Latency = 2;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000773 let NumMicroOps = 3;
774 let ResourceCycles = [3];
775}
Craig Topperb5f26592018-04-19 18:00:17 +0000776def: InstRW<[SKLWriteResGroup34], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
777 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
778 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000779
780def SKLWriteResGroup35 : SchedWriteRes<[SKLPort0,SKLPort5]> {
781 let Latency = 3;
782 let NumMicroOps = 3;
783 let ResourceCycles = [1,2];
784}
Simon Pilgrim5e492d22018-04-19 17:32:10 +0000785def: InstRW<[SKLWriteResGroup35], (instregex "MMX_PH(ADD|SUB)SWrr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000786
787def SKLWriteResGroup36 : SchedWriteRes<[SKLPort5,SKLPort01]> {
788 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000789 let NumMicroOps = 3;
790 let ResourceCycles = [2,1];
791}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000792def: InstRW<[SKLWriteResGroup36], (instregex "(V?)PHADDSW(Y?)rr",
793 "(V?)PHSUBSW(Y?)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000794
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000795def SKLWriteResGroup37 : SchedWriteRes<[SKLPort5,SKLPort05]> {
796 let Latency = 3;
797 let NumMicroOps = 3;
798 let ResourceCycles = [2,1];
799}
Simon Pilgrim5e492d22018-04-19 17:32:10 +0000800def: InstRW<[SKLWriteResGroup37], (instregex "MMX_PH(ADD|SUB)(D|W)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000801
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000802def SKLWriteResGroup39 : SchedWriteRes<[SKLPort5,SKLPort0156]> {
803 let Latency = 3;
804 let NumMicroOps = 3;
805 let ResourceCycles = [2,1];
806}
Craig Topperfc179c62018-03-22 04:23:41 +0000807def: InstRW<[SKLWriteResGroup39], (instregex "MMX_PACKSSDWirr",
808 "MMX_PACKSSWBirr",
809 "MMX_PACKUSWBirr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000810
811def SKLWriteResGroup40 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
812 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000813 let NumMicroOps = 3;
814 let ResourceCycles = [1,2];
815}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000816def: InstRW<[SKLWriteResGroup40], (instregex "CLD")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000817
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000818def SKLWriteResGroup41 : SchedWriteRes<[SKLPort237,SKLPort0156]> {
819 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000820 let NumMicroOps = 3;
821 let ResourceCycles = [1,2];
822}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000823def: InstRW<[SKLWriteResGroup41], (instrs MFENCE)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000824
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000825def SKLWriteResGroup42 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
826 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000827 let NumMicroOps = 3;
828 let ResourceCycles = [1,2];
829}
Craig Topperfc179c62018-03-22 04:23:41 +0000830def: InstRW<[SKLWriteResGroup42], (instregex "RCL(8|16|32|64)r1",
831 "RCL(8|16|32|64)ri",
832 "RCR(8|16|32|64)r1",
833 "RCR(8|16|32|64)ri")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000834
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000835def SKLWriteResGroup43 : SchedWriteRes<[SKLPort0,SKLPort4,SKLPort237]> {
836 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000837 let NumMicroOps = 3;
838 let ResourceCycles = [1,1,1];
839}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000840def: InstRW<[SKLWriteResGroup43], (instregex "FNSTSWm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000841
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000842def SKLWriteResGroup44 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort06]> {
843 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000844 let NumMicroOps = 4;
845 let ResourceCycles = [1,1,2];
846}
Craig Topperf4cd9082018-01-19 05:47:32 +0000847def: InstRW<[SKLWriteResGroup44], (instregex "SET(A|BE)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000848
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000849def SKLWriteResGroup45 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort237,SKLPort0156]> {
850 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000851 let NumMicroOps = 4;
852 let ResourceCycles = [1,1,1,1];
853}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000854def: InstRW<[SKLWriteResGroup45], (instregex "CALL(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000855
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000856def SKLWriteResGroup46 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort06,SKLPort0156]> {
857 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000858 let NumMicroOps = 4;
859 let ResourceCycles = [1,1,1,1];
860}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000861def: InstRW<[SKLWriteResGroup46], (instregex "CALL64pcrel32")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000862
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000863def SKLWriteResGroup47 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000864 let Latency = 4;
865 let NumMicroOps = 1;
866 let ResourceCycles = [1];
867}
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000868def: InstRW<[SKLWriteResGroup47], (instregex "MUL_FPrST0",
Craig Topperfc179c62018-03-22 04:23:41 +0000869 "MUL_FST0r",
Simon Pilgrim93b102c2018-04-21 15:16:59 +0000870 "MUL_FrST0")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000871
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000872def SKLWriteResGroup48 : SchedWriteRes<[SKLPort01]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000873 let Latency = 4;
874 let NumMicroOps = 1;
875 let ResourceCycles = [1];
876}
Simon Pilgrime93fd5f2018-05-02 09:18:49 +0000877def: InstRW<[SKLWriteResGroup48], (instregex "(V?)CVTDQ2PS(Y?)rr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000878 "(V?)CVTPS2DQ(Y?)rr",
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000879 "(V?)CVTTPS2DQ(Y?)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000880
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000881def SKLWriteResGroup51 : SchedWriteRes<[SKLPort1,SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000882 let Latency = 4;
883 let NumMicroOps = 2;
884 let ResourceCycles = [1,1];
885}
Craig Topperf846e2d2018-04-19 05:34:05 +0000886def: InstRW<[SKLWriteResGroup51], (instrs IMUL64r, MUL64r, MULX64rr)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000887
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000888def SKLWriteResGroup51_16 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
889 let Latency = 4;
890 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000891 let ResourceCycles = [1,1,2];
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000892}
Craig Topperfc179c62018-03-22 04:23:41 +0000893def: InstRW<[SKLWriteResGroup51_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000894
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000895def SKLWriteResGroup53 : SchedWriteRes<[SKLPort4,SKLPort5,SKLPort237]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000896 let Latency = 4;
897 let NumMicroOps = 3;
898 let ResourceCycles = [1,1,1];
899}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000900def: InstRW<[SKLWriteResGroup53], (instregex "IST(T?)_FP(16|32|64)m",
901 "IST_F(16|32)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000902
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000903def SKLWriteResGroup54 : SchedWriteRes<[SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000904 let Latency = 4;
905 let NumMicroOps = 4;
906 let ResourceCycles = [4];
907}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000908def: InstRW<[SKLWriteResGroup54], (instrs FNCLEX)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000909
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000910def SKLWriteResGroup55 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000911 let Latency = 4;
912 let NumMicroOps = 4;
913 let ResourceCycles = [1,3];
914}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000915def: InstRW<[SKLWriteResGroup55], (instrs PAUSE)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000916
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000917def SKLWriteResGroup56 : SchedWriteRes<[SKLPort015,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000918 let Latency = 4;
919 let NumMicroOps = 4;
920 let ResourceCycles = [1,3];
921}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000922def: InstRW<[SKLWriteResGroup56], (instrs VZEROUPPER)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000923
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000924def SKLWriteResGroup57 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000925 let Latency = 4;
926 let NumMicroOps = 4;
927 let ResourceCycles = [1,1,2];
928}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000929def: InstRW<[SKLWriteResGroup57], (instregex "LAR(16|32|64)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000930
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000931def SKLWriteResGroup58 : SchedWriteRes<[SKLPort23]> {
932 let Latency = 5;
933 let NumMicroOps = 1;
934 let ResourceCycles = [1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000935}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000936def: InstRW<[SKLWriteResGroup58], (instregex "MOVSX(16|32|64)rm16",
Craig Topperfc179c62018-03-22 04:23:41 +0000937 "MOVSX(16|32|64)rm32",
938 "MOVSX(16|32|64)rm8",
939 "MOVZX(16|32|64)rm16",
940 "MOVZX(16|32|64)rm8",
Simon Pilgrim37334ea2018-04-21 21:59:36 +0000941 "(V?)MOVDDUPrm")>; // TODO: Should this be SKLWriteResGroup67?
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000942
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000943def SKLWriteResGroup59 : SchedWriteRes<[SKLPort0,SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000944 let Latency = 5;
945 let NumMicroOps = 2;
946 let ResourceCycles = [1,1];
947}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000948def: InstRW<[SKLWriteResGroup59], (instregex "MMX_CVTPI2PDirr",
949 "(V?)CVTDQ2PDrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000950
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000951def SKLWriteResGroup60 : SchedWriteRes<[SKLPort5,SKLPort015]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000952 let Latency = 5;
953 let NumMicroOps = 2;
954 let ResourceCycles = [1,1];
955}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000956def: InstRW<[SKLWriteResGroup60], (instregex "MMX_CVTPD2PIirr",
Craig Topperfc179c62018-03-22 04:23:41 +0000957 "MMX_CVTPS2PIirr",
958 "MMX_CVTTPD2PIirr",
959 "MMX_CVTTPS2PIirr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000960 "(V?)CVTPD2DQrr",
961 "(V?)CVTPD2PSrr",
Craig Topperfc179c62018-03-22 04:23:41 +0000962 "VCVTPH2PSrr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000963 "(V?)CVTPS2PDrr",
Craig Topperfc179c62018-03-22 04:23:41 +0000964 "VCVTPS2PHrr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000965 "(V?)CVTSD2SSrr",
966 "(V?)CVTSI642SDrr",
967 "(V?)CVTSI2SDrr",
968 "(V?)CVTSI2SSrr",
969 "(V?)CVTSS2SDrr",
970 "(V?)CVTTPD2DQrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000971
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000972def SKLWriteResGroup61 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort06]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000973 let Latency = 5;
974 let NumMicroOps = 3;
975 let ResourceCycles = [1,1,1];
976}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000977def: InstRW<[SKLWriteResGroup61], (instregex "STR(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000978
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000979def SKLWriteResGroup62 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000980 let Latency = 4;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000981 let NumMicroOps = 3;
982 let ResourceCycles = [1,1,1];
983}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000984def: InstRW<[SKLWriteResGroup62], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000985
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000986def SKLWriteResGroup63 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000987 let Latency = 5;
988 let NumMicroOps = 5;
989 let ResourceCycles = [1,4];
990}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000991def: InstRW<[SKLWriteResGroup63], (instregex "XSETBV")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000992
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000993def SKLWriteResGroup64 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000994 let Latency = 5;
995 let NumMicroOps = 5;
996 let ResourceCycles = [2,3];
997}
Craig Topper13a16502018-03-19 00:56:09 +0000998def: InstRW<[SKLWriteResGroup64], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000999
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001000def SKLWriteResGroup65 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001001 let Latency = 5;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001002 let NumMicroOps = 6;
1003 let ResourceCycles = [1,1,4];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001004}
Craig Topperfc179c62018-03-22 04:23:41 +00001005def: InstRW<[SKLWriteResGroup65], (instregex "PUSHF16",
1006 "PUSHF64")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001007
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001008def SKLWriteResGroup67 : SchedWriteRes<[SKLPort23]> {
1009 let Latency = 6;
1010 let NumMicroOps = 1;
1011 let ResourceCycles = [1];
1012}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001013def: InstRW<[SKLWriteResGroup67], (instregex "VBROADCASTSSrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001014 "(V?)MOVSHDUPrm",
1015 "(V?)MOVSLDUPrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001016 "VPBROADCASTDrm",
1017 "VPBROADCASTQrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001018
1019def SKLWriteResGroup68 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001020 let Latency = 6;
1021 let NumMicroOps = 2;
1022 let ResourceCycles = [2];
1023}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001024def: InstRW<[SKLWriteResGroup68], (instregex "MMX_CVTPI2PSirr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001025
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001026def SKLWriteResGroup69 : SchedWriteRes<[SKLPort0,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001027 let Latency = 6;
1028 let NumMicroOps = 2;
1029 let ResourceCycles = [1,1];
1030}
Craig Topperfc179c62018-03-22 04:23:41 +00001031def: InstRW<[SKLWriteResGroup69], (instregex "MMX_PADDSBirm",
1032 "MMX_PADDSWirm",
1033 "MMX_PADDUSBirm",
1034 "MMX_PADDUSWirm",
1035 "MMX_PAVGBirm",
1036 "MMX_PAVGWirm",
1037 "MMX_PCMPEQBirm",
1038 "MMX_PCMPEQDirm",
1039 "MMX_PCMPEQWirm",
1040 "MMX_PCMPGTBirm",
1041 "MMX_PCMPGTDirm",
1042 "MMX_PCMPGTWirm",
1043 "MMX_PMAXSWirm",
1044 "MMX_PMAXUBirm",
1045 "MMX_PMINSWirm",
1046 "MMX_PMINUBirm",
Craig Topperfc179c62018-03-22 04:23:41 +00001047 "MMX_PSUBSBirm",
1048 "MMX_PSUBSWirm",
1049 "MMX_PSUBUSBirm",
1050 "MMX_PSUBUSWirm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001051
Craig Topper58afb4e2018-03-22 21:10:07 +00001052def SKLWriteResGroup70 : SchedWriteRes<[SKLPort0,SKLPort01]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001053 let Latency = 6;
1054 let NumMicroOps = 2;
1055 let ResourceCycles = [1,1];
1056}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001057def: InstRW<[SKLWriteResGroup70], (instregex "(V?)CVTSD2SI64rr",
1058 "(V?)CVTSD2SIrr",
1059 "(V?)CVTSS2SI64rr",
1060 "(V?)CVTSS2SIrr",
1061 "(V?)CVTTSD2SI64rr",
1062 "(V?)CVTTSD2SIrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001063
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001064def SKLWriteResGroup72 : SchedWriteRes<[SKLPort6,SKLPort23]> {
1065 let Latency = 6;
1066 let NumMicroOps = 2;
1067 let ResourceCycles = [1,1];
1068}
Craig Topperfc179c62018-03-22 04:23:41 +00001069def: InstRW<[SKLWriteResGroup72], (instregex "FARJMP64",
1070 "JMP(16|32|64)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001071
1072def SKLWriteResGroup73 : SchedWriteRes<[SKLPort23,SKLPort05]> {
1073 let Latency = 6;
1074 let NumMicroOps = 2;
1075 let ResourceCycles = [1,1];
1076}
Simon Pilgrim5e492d22018-04-19 17:32:10 +00001077def: InstRW<[SKLWriteResGroup73], (instregex "MMX_PABS(B|D|W)rm",
1078 "MMX_PADD(B|D|Q|W)irm",
Craig Topperfc179c62018-03-22 04:23:41 +00001079 "MMX_PANDNirm",
1080 "MMX_PANDirm",
1081 "MMX_PORirm",
Simon Pilgrim5e492d22018-04-19 17:32:10 +00001082 "MMX_PSIGN(B|D|W)rm",
1083 "MMX_PSUB(B|D|Q|W)irm",
Craig Topperfc179c62018-03-22 04:23:41 +00001084 "MMX_PXORirm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001085
1086def SKLWriteResGroup74 : SchedWriteRes<[SKLPort23,SKLPort06]> {
1087 let Latency = 6;
1088 let NumMicroOps = 2;
1089 let ResourceCycles = [1,1];
1090}
Simon Pilgrimeb609092018-04-23 22:19:55 +00001091def: InstRW<[SKLWriteResGroup74], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001092def: InstRW<[SKLWriteResGroup74, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
1093 ADCX32rm, ADCX64rm,
1094 ADOX32rm, ADOX64rm,
1095 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001096
1097def SKLWriteResGroup75 : SchedWriteRes<[SKLPort23,SKLPort15]> {
1098 let Latency = 6;
1099 let NumMicroOps = 2;
1100 let ResourceCycles = [1,1];
1101}
Craig Topperfc179c62018-03-22 04:23:41 +00001102def: InstRW<[SKLWriteResGroup75], (instregex "ANDN(32|64)rm",
1103 "BLSI(32|64)rm",
1104 "BLSMSK(32|64)rm",
1105 "BLSR(32|64)rm",
Craig Topperfc179c62018-03-22 04:23:41 +00001106 "MOVBE(16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001107
1108def SKLWriteResGroup76 : SchedWriteRes<[SKLPort23,SKLPort0156]> {
1109 let Latency = 6;
1110 let NumMicroOps = 2;
1111 let ResourceCycles = [1,1];
1112}
Craig Topper2d451e72018-03-18 08:38:06 +00001113def: InstRW<[SKLWriteResGroup76], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001114def: InstRW<[SKLWriteResGroup76], (instregex "POP(16|32|64)rmr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001115
Craig Topper58afb4e2018-03-22 21:10:07 +00001116def SKLWriteResGroup78 : SchedWriteRes<[SKLPort5,SKLPort01]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001117 let Latency = 6;
1118 let NumMicroOps = 3;
1119 let ResourceCycles = [2,1];
1120}
Craig Topperfc179c62018-03-22 04:23:41 +00001121def: InstRW<[SKLWriteResGroup78], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001122
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001123def SKLWriteResGroup79 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001124 let Latency = 6;
1125 let NumMicroOps = 4;
1126 let ResourceCycles = [1,2,1];
1127}
Craig Topperfc179c62018-03-22 04:23:41 +00001128def: InstRW<[SKLWriteResGroup79], (instregex "SHLD(16|32|64)rrCL",
1129 "SHRD(16|32|64)rrCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001130
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001131def SKLWriteResGroup80 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001132 let Latency = 6;
1133 let NumMicroOps = 4;
1134 let ResourceCycles = [1,1,1,1];
1135}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001136def: InstRW<[SKLWriteResGroup80], (instregex "SLDT(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001137
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001138def SKLWriteResGroup82 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06]> {
1139 let Latency = 6;
1140 let NumMicroOps = 4;
1141 let ResourceCycles = [1,1,1,1];
1142}
Craig Topperfc179c62018-03-22 04:23:41 +00001143def: InstRW<[SKLWriteResGroup82], (instregex "BTC(16|32|64)mi8",
1144 "BTR(16|32|64)mi8",
1145 "BTS(16|32|64)mi8",
1146 "SAR(8|16|32|64)m1",
1147 "SAR(8|16|32|64)mi",
1148 "SHL(8|16|32|64)m1",
1149 "SHL(8|16|32|64)mi",
1150 "SHR(8|16|32|64)m1",
1151 "SHR(8|16|32|64)mi")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001152
1153def SKLWriteResGroup83 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort0156]> {
1154 let Latency = 6;
1155 let NumMicroOps = 4;
1156 let ResourceCycles = [1,1,1,1];
1157}
Craig Topperf0d04262018-04-06 16:16:48 +00001158def: InstRW<[SKLWriteResGroup83], (instregex "POP(16|32|64)rmm",
1159 "PUSH(16|32|64)rmm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001160
1161def SKLWriteResGroup84 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001162 let Latency = 6;
1163 let NumMicroOps = 6;
1164 let ResourceCycles = [1,5];
1165}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001166def: InstRW<[SKLWriteResGroup84], (instregex "STD")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001167
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001168def SKLWriteResGroup85 : SchedWriteRes<[SKLPort23]> {
1169 let Latency = 7;
1170 let NumMicroOps = 1;
1171 let ResourceCycles = [1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001172}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001173def: InstRW<[SKLWriteResGroup85], (instregex "LD_F(32|64|80)m",
Craig Topperfc179c62018-03-22 04:23:41 +00001174 "VBROADCASTF128",
1175 "VBROADCASTI128",
1176 "VBROADCASTSDYrm",
1177 "VBROADCASTSSYrm",
1178 "VLDDQUYrm",
1179 "VMOVAPDYrm",
1180 "VMOVAPSYrm",
1181 "VMOVDDUPYrm",
1182 "VMOVDQAYrm",
1183 "VMOVDQUYrm",
1184 "VMOVNTDQAYrm",
1185 "VMOVSHDUPYrm",
1186 "VMOVSLDUPYrm",
1187 "VMOVUPDYrm",
1188 "VMOVUPSYrm",
1189 "VPBROADCASTDYrm",
1190 "VPBROADCASTQYrm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001191
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001192def SKLWriteResGroup86 : SchedWriteRes<[SKLPort0,SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001193 let Latency = 7;
1194 let NumMicroOps = 2;
1195 let ResourceCycles = [1,1];
1196}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001197def: InstRW<[SKLWriteResGroup86], (instregex "VCVTDQ2PDYrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001198
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001199def SKLWriteResGroup88 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1200 let Latency = 7;
1201 let NumMicroOps = 2;
1202 let ResourceCycles = [1,1];
1203}
Simon Pilgrim819f2182018-05-02 17:58:50 +00001204def: InstRW<[SKLWriteResGroup88], (instregex "(V?)PACKSSDWrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001205 "(V?)PACKSSWBrm",
1206 "(V?)PACKUSDWrm",
1207 "(V?)PACKUSWBrm",
1208 "(V?)PALIGNRrmi",
Craig Topperfc179c62018-03-22 04:23:41 +00001209 "VPBROADCASTBrm",
1210 "VPBROADCASTWrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001211 "(V?)PSHUFDmi",
1212 "(V?)PSHUFHWmi",
1213 "(V?)PSHUFLWmi",
1214 "(V?)PUNPCKHBWrm",
1215 "(V?)PUNPCKHDQrm",
1216 "(V?)PUNPCKHQDQrm",
1217 "(V?)PUNPCKHWDrm",
1218 "(V?)PUNPCKLBWrm",
1219 "(V?)PUNPCKLDQrm",
1220 "(V?)PUNPCKLQDQrm",
Simon Pilgrim819f2182018-05-02 17:58:50 +00001221 "(V?)PUNPCKLWDrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001222
Simon Pilgrim6732f6e2018-05-02 18:48:23 +00001223def SKLWriteResGroup88a : SchedWriteRes<[SKLPort5,SKLPort23]> {
1224 let Latency = 6;
1225 let NumMicroOps = 2;
1226 let ResourceCycles = [1,1];
1227}
1228def: InstRW<[SKLWriteResGroup88a], (instregex "MMX_PSHUFBrm")>;
1229
Craig Topper58afb4e2018-03-22 21:10:07 +00001230def SKLWriteResGroup89 : SchedWriteRes<[SKLPort5,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001231 let Latency = 7;
1232 let NumMicroOps = 2;
1233 let ResourceCycles = [1,1];
1234}
Craig Topperfc179c62018-03-22 04:23:41 +00001235def: InstRW<[SKLWriteResGroup89], (instregex "VCVTPD2DQYrr",
1236 "VCVTPD2PSYrr",
1237 "VCVTPH2PSYrr",
1238 "VCVTPS2PDYrr",
1239 "VCVTPS2PHYrr",
1240 "VCVTTPD2DQYrr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001241
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001242def SKLWriteResGroup91 : SchedWriteRes<[SKLPort23,SKLPort015]> {
1243 let Latency = 7;
1244 let NumMicroOps = 2;
1245 let ResourceCycles = [1,1];
1246}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001247def: InstRW<[SKLWriteResGroup91], (instregex "(V?)INSERTF128rm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001248 "(V?)INSERTI128rm",
1249 "(V?)MASKMOVPDrm",
1250 "(V?)MASKMOVPSrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001251 "(V?)PADDBrm",
1252 "(V?)PADDDrm",
1253 "(V?)PADDQrm",
1254 "(V?)PADDWrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001255 "(V?)PBLENDDrmi",
1256 "(V?)PMASKMOVDrm",
1257 "(V?)PMASKMOVQrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001258 "(V?)PSUBBrm",
1259 "(V?)PSUBDrm",
1260 "(V?)PSUBQrm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001261 "(V?)PSUBWrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001262
1263def SKLWriteResGroup92 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1264 let Latency = 7;
1265 let NumMicroOps = 3;
1266 let ResourceCycles = [2,1];
1267}
Craig Topperfc179c62018-03-22 04:23:41 +00001268def: InstRW<[SKLWriteResGroup92], (instregex "MMX_PACKSSDWirm",
1269 "MMX_PACKSSWBirm",
1270 "MMX_PACKUSWBirm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001271
1272def SKLWriteResGroup93 : SchedWriteRes<[SKLPort23,SKLPort06]> {
1273 let Latency = 7;
1274 let NumMicroOps = 3;
1275 let ResourceCycles = [1,2];
1276}
Craig Topperf4cd9082018-01-19 05:47:32 +00001277def: InstRW<[SKLWriteResGroup93], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001278
1279def SKLWriteResGroup94 : SchedWriteRes<[SKLPort23,SKLPort0156]> {
1280 let Latency = 7;
1281 let NumMicroOps = 3;
1282 let ResourceCycles = [1,2];
1283}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001284def: InstRW<[SKLWriteResGroup94], (instrs LEAVE, LEAVE64,
1285 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001286
Craig Topper58afb4e2018-03-22 21:10:07 +00001287def SKLWriteResGroup95 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort01]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001288 let Latency = 7;
1289 let NumMicroOps = 3;
1290 let ResourceCycles = [1,1,1];
1291}
Craig Topperfc179c62018-03-22 04:23:41 +00001292def: InstRW<[SKLWriteResGroup95], (instregex "(V?)CVTTSS2SI64rr",
1293 "(V?)CVTTSS2SIrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001294
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001295def SKLWriteResGroup96 : SchedWriteRes<[SKLPort0,SKLPort23,SKLPort05]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001296 let Latency = 7;
1297 let NumMicroOps = 3;
1298 let ResourceCycles = [1,1,1];
1299}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001300def: InstRW<[SKLWriteResGroup96], (instregex "FLDCW16m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001301
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001302def SKLWriteResGroup98 : SchedWriteRes<[SKLPort6,SKLPort23,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001303 let Latency = 7;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001304 let NumMicroOps = 3;
1305 let ResourceCycles = [1,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001306}
Craig Topperfc179c62018-03-22 04:23:41 +00001307def: InstRW<[SKLWriteResGroup98], (instregex "LRETQ",
1308 "RETQ")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001309
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001310def SKLWriteResGroup100 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06]> {
1311 let Latency = 7;
1312 let NumMicroOps = 5;
1313 let ResourceCycles = [1,1,1,2];
1314}
Craig Topperfc179c62018-03-22 04:23:41 +00001315def: InstRW<[SKLWriteResGroup100], (instregex "ROL(8|16|32|64)m1",
1316 "ROL(8|16|32|64)mi",
1317 "ROR(8|16|32|64)m1",
1318 "ROR(8|16|32|64)mi")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001319
1320def SKLWriteResGroup101 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort0156]> {
1321 let Latency = 7;
1322 let NumMicroOps = 5;
1323 let ResourceCycles = [1,1,1,2];
1324}
Craig Topper13a16502018-03-19 00:56:09 +00001325def: InstRW<[SKLWriteResGroup101], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001326
1327def SKLWriteResGroup102 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
1328 let Latency = 7;
1329 let NumMicroOps = 5;
1330 let ResourceCycles = [1,1,1,1,1];
1331}
Craig Topperfc179c62018-03-22 04:23:41 +00001332def: InstRW<[SKLWriteResGroup102], (instregex "CALL(16|32|64)m",
1333 "FARCALL64")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001334
1335def SKLWriteResGroup103 : SchedWriteRes<[SKLPort6,SKLPort06,SKLPort15,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001336 let Latency = 7;
1337 let NumMicroOps = 7;
1338 let ResourceCycles = [1,3,1,2];
1339}
Craig Topper2d451e72018-03-18 08:38:06 +00001340def: InstRW<[SKLWriteResGroup103], (instrs LOOP)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001341
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001342def SKLWriteResGroup107 : SchedWriteRes<[SKLPort1,SKLPort23]> {
1343 let Latency = 8;
1344 let NumMicroOps = 2;
1345 let ResourceCycles = [1,1];
1346}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001347def: InstRW<[SKLWriteResGroup107], (instregex "PDEP(32|64)rm",
1348 "PEXT(32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001349
1350def SKLWriteResGroup107_16 : SchedWriteRes<[SKLPort1, SKLPort0156, SKLPort23]> {
Craig Topperb369cdb2018-01-25 06:57:42 +00001351 let Latency = 8;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001352 let NumMicroOps = 3;
Simon Pilgrim31a96332018-03-24 20:40:14 +00001353 let ResourceCycles = [1,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001354}
Craig Topperf846e2d2018-04-19 05:34:05 +00001355def: InstRW<[SKLWriteResGroup107_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001356
Craig Topperf846e2d2018-04-19 05:34:05 +00001357def SKLWriteResGroup107_16_2 : SchedWriteRes<[SKLPort1, SKLPort06, SKLPort0156, SKLPort23]> {
1358 let Latency = 9;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001359 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001360 let ResourceCycles = [1,1,2,1];
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001361}
Craig Topperfc179c62018-03-22 04:23:41 +00001362def: InstRW<[SKLWriteResGroup107_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001363
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001364def SKLWriteResGroup108 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1365 let Latency = 8;
1366 let NumMicroOps = 2;
1367 let ResourceCycles = [1,1];
1368}
Craig Topperfc179c62018-03-22 04:23:41 +00001369def: InstRW<[SKLWriteResGroup108], (instregex "FCOM32m",
1370 "FCOM64m",
1371 "FCOMP32m",
1372 "FCOMP64m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001373 "MMX_PSADBWirm", // TODO - SKLWriteResGroup120??
Craig Topperfc179c62018-03-22 04:23:41 +00001374 "VPBROADCASTBYrm",
1375 "VPBROADCASTWYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001376 "VPMOVSXBDYrm",
1377 "VPMOVSXBQYrm",
Simon Pilgrim6732f6e2018-05-02 18:48:23 +00001378 "VPMOVSXWQYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001379
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001380def SKLWriteResGroup110 : SchedWriteRes<[SKLPort23,SKLPort015]> {
1381 let Latency = 8;
1382 let NumMicroOps = 2;
1383 let ResourceCycles = [1,1];
1384}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001385def: InstRW<[SKLWriteResGroup110], (instregex "VMASKMOVPDYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001386 "VMASKMOVPSYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001387 "VPADDBYrm",
1388 "VPADDDYrm",
1389 "VPADDQYrm",
1390 "VPADDWYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001391 "VPBLENDDYrmi",
1392 "VPMASKMOVDYrm",
1393 "VPMASKMOVQYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001394 "VPSUBBYrm",
1395 "VPSUBDYrm",
1396 "VPSUBQYrm",
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001397 "VPSUBWYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001398
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001399def SKLWriteResGroup112 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1400 let Latency = 8;
1401 let NumMicroOps = 4;
1402 let ResourceCycles = [1,2,1];
1403}
Simon Pilgrim5e492d22018-04-19 17:32:10 +00001404def: InstRW<[SKLWriteResGroup112], (instregex "MMX_PH(ADD|SUB)SWrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001405
1406def SKLWriteResGroup113 : SchedWriteRes<[SKLPort5,SKLPort23,SKLPort05]> {
1407 let Latency = 8;
1408 let NumMicroOps = 4;
1409 let ResourceCycles = [2,1,1];
1410}
Simon Pilgrim5e492d22018-04-19 17:32:10 +00001411def: InstRW<[SKLWriteResGroup113], (instregex "MMX_PH(ADD|SUB)(D|W)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001412
Craig Topper58afb4e2018-03-22 21:10:07 +00001413def SKLWriteResGroup114 : SchedWriteRes<[SKLPort4,SKLPort5,SKLPort237,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001414 let Latency = 8;
1415 let NumMicroOps = 4;
1416 let ResourceCycles = [1,1,1,1];
1417}
1418def: InstRW<[SKLWriteResGroup114], (instregex "VCVTPS2PHYmr")>;
1419
1420def SKLWriteResGroup115 : SchedWriteRes<[SKLPort23,SKLPort237,SKLPort06]> {
1421 let Latency = 8;
1422 let NumMicroOps = 5;
1423 let ResourceCycles = [1,1,3];
1424}
Craig Topper13a16502018-03-19 00:56:09 +00001425def: InstRW<[SKLWriteResGroup115], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001426
1427def SKLWriteResGroup116 : SchedWriteRes<[SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1428 let Latency = 8;
1429 let NumMicroOps = 5;
1430 let ResourceCycles = [1,1,1,2];
1431}
Craig Topperfc179c62018-03-22 04:23:41 +00001432def: InstRW<[SKLWriteResGroup116], (instregex "RCL(8|16|32|64)m1",
1433 "RCL(8|16|32|64)mi",
1434 "RCR(8|16|32|64)m1",
1435 "RCR(8|16|32|64)mi")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001436
1437def SKLWriteResGroup117 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06]> {
1438 let Latency = 8;
1439 let NumMicroOps = 6;
1440 let ResourceCycles = [1,1,1,3];
1441}
Craig Topperfc179c62018-03-22 04:23:41 +00001442def: InstRW<[SKLWriteResGroup117], (instregex "ROL(8|16|32|64)mCL",
1443 "SAR(8|16|32|64)mCL",
1444 "SHL(8|16|32|64)mCL",
1445 "SHR(8|16|32|64)mCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001446
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001447def SKLWriteResGroup119 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1448 let Latency = 8;
1449 let NumMicroOps = 6;
1450 let ResourceCycles = [1,1,1,2,1];
1451}
Craig Topper9f834812018-04-01 21:54:24 +00001452def: InstRW<[SKLWriteResGroup119], (instregex "ADC(8|16|32|64)mi",
Craig Topperfc179c62018-03-22 04:23:41 +00001453 "CMPXCHG(8|16|32|64)rm",
Craig Topperc50570f2018-04-06 17:12:18 +00001454 "SBB(8|16|32|64)mi")>;
1455def: InstRW<[SKLWriteResGroup119, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1456 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001457
1458def SKLWriteResGroup120 : SchedWriteRes<[SKLPort0,SKLPort23]> {
1459 let Latency = 9;
1460 let NumMicroOps = 2;
1461 let ResourceCycles = [1,1];
1462}
Simon Pilgrim210286e2018-05-08 10:28:03 +00001463def: InstRW<[SKLWriteResGroup120], (instregex "MMX_CVTPI2PSirm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001464
1465def SKLWriteResGroup121 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1466 let Latency = 9;
1467 let NumMicroOps = 2;
1468 let ResourceCycles = [1,1];
1469}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001470def: InstRW<[SKLWriteResGroup121], (instregex "(V?)PCMPGTQrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001471 "VPMOVSXBWYrm",
1472 "VPMOVSXDQYrm",
1473 "VPMOVSXWDYrm",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001474 "VPMOVZXWDYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001475
Craig Topper58afb4e2018-03-22 21:10:07 +00001476def SKLWriteResGroup123 : SchedWriteRes<[SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001477 let Latency = 9;
1478 let NumMicroOps = 2;
1479 let ResourceCycles = [1,1];
1480}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001481def: InstRW<[SKLWriteResGroup123], (instregex "MMX_CVTPS2PIirm",
Craig Topperfc179c62018-03-22 04:23:41 +00001482 "MMX_CVTTPS2PIirm",
Craig Topperfc179c62018-03-22 04:23:41 +00001483 "VCVTPH2PSrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001484 "(V?)CVTPS2PDrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001485
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001486def SKLWriteResGroup127 : SchedWriteRes<[SKLPort1,SKLPort5,SKLPort23]> {
1487 let Latency = 9;
1488 let NumMicroOps = 3;
1489 let ResourceCycles = [1,1,1];
1490}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001491def: InstRW<[SKLWriteResGroup127], (instrs IMUL64m, MUL64m, MULX64rm)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001492
1493def SKLWriteResGroup128 : SchedWriteRes<[SKLPort5,SKLPort01,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001494 let Latency = 9;
1495 let NumMicroOps = 4;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001496 let ResourceCycles = [2,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001497}
Craig Topperfc179c62018-03-22 04:23:41 +00001498def: InstRW<[SKLWriteResGroup128], (instregex "(V?)PHADDSWrm",
1499 "(V?)PHSUBSWrm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001500
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001501def SKLWriteResGroup130 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort0156]> {
1502 let Latency = 9;
1503 let NumMicroOps = 4;
1504 let ResourceCycles = [1,1,1,1];
1505}
Craig Topperfc179c62018-03-22 04:23:41 +00001506def: InstRW<[SKLWriteResGroup130], (instregex "SHLD(16|32|64)mri8",
1507 "SHRD(16|32|64)mri8")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001508
1509def SKLWriteResGroup131 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort23,SKLPort0156]> {
1510 let Latency = 9;
1511 let NumMicroOps = 5;
1512 let ResourceCycles = [1,2,1,1];
1513}
Craig Topperfc179c62018-03-22 04:23:41 +00001514def: InstRW<[SKLWriteResGroup131], (instregex "LAR(16|32|64)rm",
1515 "LSL(16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001516
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001517def SKLWriteResGroup133 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1518 let Latency = 10;
1519 let NumMicroOps = 2;
1520 let ResourceCycles = [1,1];
1521}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001522def: InstRW<[SKLWriteResGroup133], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1523 "ILD_F(16|32|64)m",
Simon Pilgrime480ed02018-05-07 18:25:19 +00001524 "VPCMPGTQYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001525
1526def SKLWriteResGroup134 : SchedWriteRes<[SKLPort01,SKLPort23]> {
1527 let Latency = 10;
1528 let NumMicroOps = 2;
1529 let ResourceCycles = [1,1];
1530}
Simon Pilgrime93fd5f2018-05-02 09:18:49 +00001531def: InstRW<[SKLWriteResGroup134], (instregex "(V?)CVTDQ2PSrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001532 "(V?)CVTPH2PSYrm",
1533 "(V?)CVTPS2DQrm",
1534 "(V?)CVTSS2SDrm",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001535 "(V?)CVTTPS2DQrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001536
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001537def SKLWriteResGroup138 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1538 let Latency = 10;
1539 let NumMicroOps = 3;
1540 let ResourceCycles = [1,1,1];
1541}
Simon Pilgrim210286e2018-05-08 10:28:03 +00001542def: InstRW<[SKLWriteResGroup138], (instregex "MMX_CVTPI2PDirm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001543
Craig Topper58afb4e2018-03-22 21:10:07 +00001544def SKLWriteResGroup139 : SchedWriteRes<[SKLPort5,SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001545 let Latency = 10;
1546 let NumMicroOps = 3;
1547 let ResourceCycles = [1,1,1];
1548}
Craig Topperfc179c62018-03-22 04:23:41 +00001549def: InstRW<[SKLWriteResGroup139], (instregex "(V?)CVTSD2SSrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001550
1551def SKLWriteResGroup140 : SchedWriteRes<[SKLPort5,SKLPort01,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001552 let Latency = 10;
1553 let NumMicroOps = 4;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001554 let ResourceCycles = [2,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001555}
Craig Topperfc179c62018-03-22 04:23:41 +00001556def: InstRW<[SKLWriteResGroup140], (instregex "VPHADDSWYrm",
1557 "VPHSUBSWYrm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001558
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001559def SKLWriteResGroup142 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort06,SKLPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001560 let Latency = 9;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001561 let NumMicroOps = 4;
1562 let ResourceCycles = [1,1,1,1];
1563}
Craig Topperf846e2d2018-04-19 05:34:05 +00001564def: InstRW<[SKLWriteResGroup142], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001565
1566def SKLWriteResGroup143 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1567 let Latency = 10;
1568 let NumMicroOps = 8;
1569 let ResourceCycles = [1,1,1,1,1,3];
1570}
Craig Topper13a16502018-03-19 00:56:09 +00001571def: InstRW<[SKLWriteResGroup143], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001572
Craig Topper8104f262018-04-02 05:33:28 +00001573def SKLWriteResGroup145 : SchedWriteRes<[SKLPort0,SKLFPDivider]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001574 let Latency = 11;
1575 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001576 let ResourceCycles = [1,3];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001577}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001578def : SchedAlias<WriteFDivX, SKLWriteResGroup145>; // TODO - convert to ZnWriteResFpuPair
Craig Topper8104f262018-04-02 05:33:28 +00001579
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001580def SKLWriteResGroup146 : SchedWriteRes<[SKLPort0,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001581 let Latency = 11;
1582 let NumMicroOps = 2;
1583 let ResourceCycles = [1,1];
1584}
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +00001585def: InstRW<[SKLWriteResGroup146], (instregex "MUL_F(32|64)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001586
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001587def SKLWriteResGroup147 : SchedWriteRes<[SKLPort01,SKLPort23]> {
1588 let Latency = 11;
1589 let NumMicroOps = 2;
1590 let ResourceCycles = [1,1];
1591}
Simon Pilgrime93fd5f2018-05-02 09:18:49 +00001592def: InstRW<[SKLWriteResGroup147], (instregex "VCVTDQ2PSYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001593 "VCVTPS2DQYrm",
1594 "VCVTPS2PDYrm",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001595 "VCVTTPS2DQYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001596
1597def SKLWriteResGroup149 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1598 let Latency = 11;
1599 let NumMicroOps = 3;
1600 let ResourceCycles = [2,1];
1601}
Craig Topperfc179c62018-03-22 04:23:41 +00001602def: InstRW<[SKLWriteResGroup149], (instregex "FICOM16m",
1603 "FICOM32m",
1604 "FICOMP16m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001605 "FICOMP32m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001606
1607def SKLWriteResGroup150 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1608 let Latency = 11;
1609 let NumMicroOps = 3;
1610 let ResourceCycles = [1,1,1];
1611}
Craig Topperfc179c62018-03-22 04:23:41 +00001612def: InstRW<[SKLWriteResGroup150], (instregex "(V?)CVTDQ2PDrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001613
Craig Topper58afb4e2018-03-22 21:10:07 +00001614def SKLWriteResGroup151 : SchedWriteRes<[SKLPort0,SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001615 let Latency = 11;
1616 let NumMicroOps = 3;
1617 let ResourceCycles = [1,1,1];
1618}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001619def: InstRW<[SKLWriteResGroup151], (instregex "(V?)CVTSD2SI64rm",
1620 "(V?)CVTSD2SIrm",
1621 "(V?)CVTSS2SI64rm",
1622 "(V?)CVTSS2SIrm",
1623 "(V?)CVTTSD2SI64rm",
1624 "(V?)CVTTSD2SIrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001625 "VCVTTSS2SI64rm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001626 "(V?)CVTTSS2SIrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001627
Craig Topper58afb4e2018-03-22 21:10:07 +00001628def SKLWriteResGroup152 : SchedWriteRes<[SKLPort5,SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001629 let Latency = 11;
1630 let NumMicroOps = 3;
1631 let ResourceCycles = [1,1,1];
1632}
Craig Topperfc179c62018-03-22 04:23:41 +00001633def: InstRW<[SKLWriteResGroup152], (instregex "CVTPD2DQrm",
1634 "CVTPD2PSrm",
1635 "CVTTPD2DQrm",
1636 "MMX_CVTPD2PIirm",
1637 "MMX_CVTTPD2PIirm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001638
1639def SKLWriteResGroup153 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1640 let Latency = 11;
1641 let NumMicroOps = 6;
1642 let ResourceCycles = [1,1,1,2,1];
1643}
Craig Topperfc179c62018-03-22 04:23:41 +00001644def: InstRW<[SKLWriteResGroup153], (instregex "SHLD(16|32|64)mrCL",
1645 "SHRD(16|32|64)mrCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001646
1647def SKLWriteResGroup154 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001648 let Latency = 11;
1649 let NumMicroOps = 7;
1650 let ResourceCycles = [2,3,2];
1651}
Craig Topperfc179c62018-03-22 04:23:41 +00001652def: InstRW<[SKLWriteResGroup154], (instregex "RCL(16|32|64)rCL",
1653 "RCR(16|32|64)rCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001654
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001655def SKLWriteResGroup155 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort15,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001656 let Latency = 11;
1657 let NumMicroOps = 9;
1658 let ResourceCycles = [1,5,1,2];
1659}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001660def: InstRW<[SKLWriteResGroup155], (instregex "RCL8rCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001661
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001662def SKLWriteResGroup156 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001663 let Latency = 11;
1664 let NumMicroOps = 11;
1665 let ResourceCycles = [2,9];
1666}
Craig Topperfc179c62018-03-22 04:23:41 +00001667def: InstRW<[SKLWriteResGroup156], (instrs LOOPE, LOOPNE)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001668
Craig Topper58afb4e2018-03-22 21:10:07 +00001669def SKLWriteResGroup160 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001670 let Latency = 12;
1671 let NumMicroOps = 4;
1672 let ResourceCycles = [1,1,1,1];
1673}
1674def: InstRW<[SKLWriteResGroup160], (instregex "CVTTSS2SI64rm")>;
1675
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001676def SKLWriteResGroup162 : SchedWriteRes<[SKLPort5,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001677 let Latency = 13;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001678 let NumMicroOps = 3;
1679 let ResourceCycles = [2,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001680}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001681def: InstRW<[SKLWriteResGroup162], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001682
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001683def SKLWriteResGroup163 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1684 let Latency = 13;
1685 let NumMicroOps = 3;
1686 let ResourceCycles = [1,1,1];
1687}
1688def: InstRW<[SKLWriteResGroup163], (instregex "VCVTDQ2PDYrm")>;
1689
Craig Topper8104f262018-04-02 05:33:28 +00001690def SKLWriteResGroup166 : SchedWriteRes<[SKLPort0,SKLFPDivider]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001691 let Latency = 14;
1692 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001693 let ResourceCycles = [1,3];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001694}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001695def : SchedAlias<WriteFDiv64, SKLWriteResGroup166>; // TODO - convert to ZnWriteResFpuPair
1696def : SchedAlias<WriteFDiv64X, SKLWriteResGroup166>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001697
Craig Topper8104f262018-04-02 05:33:28 +00001698def SKLWriteResGroup166_1 : SchedWriteRes<[SKLPort0,SKLFPDivider]> {
1699 let Latency = 14;
1700 let NumMicroOps = 1;
1701 let ResourceCycles = [1,5];
1702}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001703def : SchedAlias<WriteFDiv64Y, SKLWriteResGroup166_1>; // TODO - convert to ZnWriteResFpuPair
Craig Topper8104f262018-04-02 05:33:28 +00001704
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001705def SKLWriteResGroup169 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1706 let Latency = 14;
1707 let NumMicroOps = 3;
1708 let ResourceCycles = [1,1,1];
1709}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001710def: InstRW<[SKLWriteResGroup169], (instregex "MUL_FI(16|32)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001711
1712def SKLWriteResGroup170 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort15,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001713 let Latency = 14;
1714 let NumMicroOps = 10;
1715 let ResourceCycles = [2,4,1,3];
1716}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001717def: InstRW<[SKLWriteResGroup170], (instregex "RCR8rCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001718
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001719def SKLWriteResGroup171 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001720 let Latency = 15;
1721 let NumMicroOps = 1;
1722 let ResourceCycles = [1];
1723}
Craig Topperfc179c62018-03-22 04:23:41 +00001724def: InstRW<[SKLWriteResGroup171], (instregex "DIVR_FPrST0",
1725 "DIVR_FST0r",
1726 "DIVR_FrST0")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001727
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001728def SKLWriteResGroup174 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort06,SKLPort15,SKLPort0156]> {
1729 let Latency = 15;
1730 let NumMicroOps = 10;
1731 let ResourceCycles = [1,1,1,5,1,1];
1732}
Craig Topper13a16502018-03-19 00:56:09 +00001733def: InstRW<[SKLWriteResGroup174], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001734
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001735def SKLWriteResGroup177 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06,SKLPort15,SKLPort0156]> {
1736 let Latency = 16;
1737 let NumMicroOps = 14;
1738 let ResourceCycles = [1,1,1,4,2,5];
1739}
1740def: InstRW<[SKLWriteResGroup177], (instregex "CMPXCHG8B")>;
1741
1742def SKLWriteResGroup178 : SchedWriteRes<[SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001743 let Latency = 16;
1744 let NumMicroOps = 16;
1745 let ResourceCycles = [16];
1746}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001747def: InstRW<[SKLWriteResGroup178], (instrs VZEROALL)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001748
Craig Topper8104f262018-04-02 05:33:28 +00001749def SKLWriteResGroup179 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001750 let Latency = 17;
1751 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001752 let ResourceCycles = [1,1,5];
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001753}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001754def : SchedAlias<WriteFDivXLd, SKLWriteResGroup179>; // TODO - convert to ZnWriteResFpuPair
Craig Topper8104f262018-04-02 05:33:28 +00001755
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001756def SKLWriteResGroup180 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort05,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001757 let Latency = 17;
1758 let NumMicroOps = 15;
1759 let ResourceCycles = [2,1,2,4,2,4];
1760}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001761def: InstRW<[SKLWriteResGroup180], (instrs XCH_F)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001762
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001763def SKLWriteResGroup184 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001764 let Latency = 18;
1765 let NumMicroOps = 8;
1766 let ResourceCycles = [1,1,1,5];
1767}
Craig Topperfc179c62018-03-22 04:23:41 +00001768def: InstRW<[SKLWriteResGroup184], (instrs CPUID, RDTSC)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001769
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001770def SKLWriteResGroup185 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort06,SKLPort15,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001771 let Latency = 18;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001772 let NumMicroOps = 11;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001773 let ResourceCycles = [2,1,1,4,1,2];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001774}
Craig Topper13a16502018-03-19 00:56:09 +00001775def: InstRW<[SKLWriteResGroup185], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001776
Craig Topper8104f262018-04-02 05:33:28 +00001777def SKLWriteResGroup186 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001778 let Latency = 19;
1779 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001780 let ResourceCycles = [1,1,4];
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001781}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001782def : SchedAlias<WriteFDiv64Ld, SKLWriteResGroup186>; // TODO - convert to ZnWriteResFpuPair
Craig Topper8104f262018-04-02 05:33:28 +00001783
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001784def SKLWriteResGroup189 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001785 let Latency = 20;
1786 let NumMicroOps = 1;
1787 let ResourceCycles = [1];
1788}
Craig Topperfc179c62018-03-22 04:23:41 +00001789def: InstRW<[SKLWriteResGroup189], (instregex "DIV_FPrST0",
1790 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001791 "DIV_FrST0")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001792
Craig Topper8104f262018-04-02 05:33:28 +00001793def SKLWriteResGroup190 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001794 let Latency = 20;
1795 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001796 let ResourceCycles = [1,1,4];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001797}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001798def : SchedAlias<WriteFDiv64XLd, SKLWriteResGroup190>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001799
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001800def SKLWriteResGroup192 : SchedWriteRes<[SKLPort4,SKLPort5,SKLPort6,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1801 let Latency = 20;
1802 let NumMicroOps = 8;
1803 let ResourceCycles = [1,1,1,1,1,1,2];
1804}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001805def: InstRW<[SKLWriteResGroup192], (instrs INSB, INSL, INSW)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001806
1807def SKLWriteResGroup193 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001808 let Latency = 20;
1809 let NumMicroOps = 10;
1810 let ResourceCycles = [1,2,7];
1811}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001812def: InstRW<[SKLWriteResGroup193], (instregex "MWAITrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001813
Craig Topper8104f262018-04-02 05:33:28 +00001814def SKLWriteResGroup195 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001815 let Latency = 21;
1816 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001817 let ResourceCycles = [1,1,8];
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001818}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001819def : SchedAlias<WriteFDiv64YLd, SKLWriteResGroup195>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001820
1821def SKLWriteResGroup196 : SchedWriteRes<[SKLPort0,SKLPort23]> {
1822 let Latency = 22;
1823 let NumMicroOps = 2;
1824 let ResourceCycles = [1,1];
1825}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001826def: InstRW<[SKLWriteResGroup196], (instregex "DIV_F(32|64)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001827
1828def SKLWriteResGroup196_1 : SchedWriteRes<[SKLPort0, SKLPort23, SKLPort5, SKLPort015]> {
1829 let Latency = 22;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001830 let NumMicroOps = 5;
1831 let ResourceCycles = [1,2,1,1];
1832}
Craig Topper17a31182017-12-16 18:35:29 +00001833def: InstRW<[SKLWriteResGroup196_1], (instrs VGATHERDPSrm,
1834 VGATHERDPDrm,
1835 VGATHERQPDrm,
1836 VGATHERQPSrm,
1837 VPGATHERDDrm,
1838 VPGATHERDQrm,
1839 VPGATHERQDrm,
1840 VPGATHERQQrm)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001841
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001842def SKLWriteResGroup196_2 : SchedWriteRes<[SKLPort0, SKLPort23, SKLPort5, SKLPort015]> {
1843 let Latency = 25;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001844 let NumMicroOps = 5;
1845 let ResourceCycles = [1,2,1,1];
1846}
Craig Topper17a31182017-12-16 18:35:29 +00001847def: InstRW<[SKLWriteResGroup196_2], (instrs VGATHERDPSYrm,
1848 VGATHERQPDYrm,
1849 VGATHERQPSYrm,
1850 VPGATHERDDYrm,
1851 VPGATHERDQYrm,
1852 VPGATHERQDYrm,
1853 VPGATHERQQYrm,
1854 VGATHERDPDYrm)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001855
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001856def SKLWriteResGroup198 : SchedWriteRes<[SKLPort0,SKLPort4,SKLPort5,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1857 let Latency = 23;
1858 let NumMicroOps = 19;
1859 let ResourceCycles = [2,1,4,1,1,4,6];
1860}
1861def: InstRW<[SKLWriteResGroup198], (instregex "CMPXCHG16B")>;
1862
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001863def SKLWriteResGroup202 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1864 let Latency = 25;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001865 let NumMicroOps = 3;
1866 let ResourceCycles = [1,1,1];
1867}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001868def: InstRW<[SKLWriteResGroup202], (instregex "DIV_FI(16|32)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001869
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001870def SKLWriteResGroup206 : SchedWriteRes<[SKLPort0,SKLPort23]> {
1871 let Latency = 27;
1872 let NumMicroOps = 2;
1873 let ResourceCycles = [1,1];
1874}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001875def: InstRW<[SKLWriteResGroup206], (instregex "DIVR_F(32|64)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001876
1877def SKLWriteResGroup207 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23,SKLPort0156]> {
1878 let Latency = 28;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001879 let NumMicroOps = 8;
1880 let ResourceCycles = [2,4,1,1];
1881}
Craig Topper13a16502018-03-19 00:56:09 +00001882def: InstRW<[SKLWriteResGroup207], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001883
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001884def SKLWriteResGroup208 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001885 let Latency = 30;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001886 let NumMicroOps = 3;
1887 let ResourceCycles = [1,1,1];
1888}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001889def: InstRW<[SKLWriteResGroup208], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001890
1891def SKLWriteResGroup209 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort23,SKLPort06,SKLPort0156]> {
1892 let Latency = 35;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001893 let NumMicroOps = 23;
1894 let ResourceCycles = [1,5,3,4,10];
1895}
Craig Topperfc179c62018-03-22 04:23:41 +00001896def: InstRW<[SKLWriteResGroup209], (instregex "IN(8|16|32)ri",
1897 "IN(8|16|32)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001898
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001899def SKLWriteResGroup210 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1900 let Latency = 35;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001901 let NumMicroOps = 23;
1902 let ResourceCycles = [1,5,2,1,4,10];
1903}
Craig Topperfc179c62018-03-22 04:23:41 +00001904def: InstRW<[SKLWriteResGroup210], (instregex "OUT(8|16|32)ir",
1905 "OUT(8|16|32)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001906
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001907def SKLWriteResGroup211 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort23,SKLPort0156]> {
1908 let Latency = 37;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001909 let NumMicroOps = 31;
1910 let ResourceCycles = [1,8,1,21];
1911}
Craig Topper391c6f92017-12-10 01:24:08 +00001912def: InstRW<[SKLWriteResGroup211], (instregex "XRSTOR(64)?")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001913
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001914def SKLWriteResGroup212 : SchedWriteRes<[SKLPort1,SKLPort4,SKLPort5,SKLPort6,SKLPort23,SKLPort237,SKLPort15,SKLPort0156]> {
1915 let Latency = 40;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001916 let NumMicroOps = 18;
1917 let ResourceCycles = [1,1,2,3,1,1,1,8];
1918}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001919def: InstRW<[SKLWriteResGroup212], (instregex "VMCLEARm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001920
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001921def SKLWriteResGroup213 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
1922 let Latency = 41;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001923 let NumMicroOps = 39;
1924 let ResourceCycles = [1,10,1,1,26];
1925}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001926def: InstRW<[SKLWriteResGroup213], (instregex "XSAVE64")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001927
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001928def SKLWriteResGroup214 : SchedWriteRes<[SKLPort5,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001929 let Latency = 42;
1930 let NumMicroOps = 22;
1931 let ResourceCycles = [2,20];
1932}
Craig Topper2d451e72018-03-18 08:38:06 +00001933def: InstRW<[SKLWriteResGroup214], (instrs RDTSCP)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001934
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001935def SKLWriteResGroup215 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
1936 let Latency = 42;
1937 let NumMicroOps = 40;
1938 let ResourceCycles = [1,11,1,1,26];
1939}
Craig Topper391c6f92017-12-10 01:24:08 +00001940def: InstRW<[SKLWriteResGroup215], (instregex "^XSAVE$", "XSAVEC", "XSAVES")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001941
1942def SKLWriteResGroup216 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
1943 let Latency = 46;
1944 let NumMicroOps = 44;
1945 let ResourceCycles = [1,11,1,1,30];
1946}
1947def: InstRW<[SKLWriteResGroup216], (instregex "XSAVEOPT")>;
1948
1949def SKLWriteResGroup217 : SchedWriteRes<[SKLPort0,SKLPort23,SKLPort05,SKLPort06,SKLPort0156]> {
1950 let Latency = 62;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001951 let NumMicroOps = 64;
1952 let ResourceCycles = [2,8,5,10,39];
1953}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001954def: InstRW<[SKLWriteResGroup217], (instregex "FLDENVm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001955
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001956def SKLWriteResGroup218 : SchedWriteRes<[SKLPort0,SKLPort6,SKLPort23,SKLPort05,SKLPort06,SKLPort15,SKLPort0156]> {
1957 let Latency = 63;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001958 let NumMicroOps = 88;
1959 let ResourceCycles = [4,4,31,1,2,1,45];
1960}
Craig Topper2d451e72018-03-18 08:38:06 +00001961def: InstRW<[SKLWriteResGroup218], (instrs FXRSTOR64)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001962
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001963def SKLWriteResGroup219 : SchedWriteRes<[SKLPort0,SKLPort6,SKLPort23,SKLPort05,SKLPort06,SKLPort15,SKLPort0156]> {
1964 let Latency = 63;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001965 let NumMicroOps = 90;
1966 let ResourceCycles = [4,2,33,1,2,1,47];
1967}
Craig Topper2d451e72018-03-18 08:38:06 +00001968def: InstRW<[SKLWriteResGroup219], (instrs FXRSTOR)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001969
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001970def SKLWriteResGroup220 : SchedWriteRes<[SKLPort5,SKLPort05,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001971 let Latency = 75;
1972 let NumMicroOps = 15;
1973 let ResourceCycles = [6,3,6];
1974}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00001975def: InstRW<[SKLWriteResGroup220], (instrs FNINIT)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001976
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001977def SKLWriteResGroup221 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort05,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001978 let Latency = 76;
1979 let NumMicroOps = 32;
1980 let ResourceCycles = [7,2,8,3,1,11];
1981}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001982def: InstRW<[SKLWriteResGroup221], (instregex "DIV(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001983
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001984def SKLWriteResGroup222 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001985 let Latency = 102;
1986 let NumMicroOps = 66;
1987 let ResourceCycles = [4,2,4,8,14,34];
1988}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001989def: InstRW<[SKLWriteResGroup222], (instregex "IDIV(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001990
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001991def SKLWriteResGroup223 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort4,SKLPort5,SKLPort6,SKLPort237,SKLPort06,SKLPort0156]> {
1992 let Latency = 106;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001993 let NumMicroOps = 100;
1994 let ResourceCycles = [9,1,11,16,1,11,21,30];
1995}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001996def: InstRW<[SKLWriteResGroup223], (instregex "FSTENVm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001997
1998} // SchedModel