blob: 408b3ce3690e290065c131fbd0e490e92c1670db [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 Pilgrime93fd5f2018-05-02 09:18:49 +0000155defm : SKLWriteResPair<WriteFAdd, [SKLPort01], 4, [1], 1, 6>; // Floating point add/sub.
156defm : SKLWriteResPair<WriteFAddY, [SKLPort01], 4, [1], 1, 7>; // Floating point add/sub (YMM/ZMM).
Simon Pilgrim21caf012018-05-01 18:22:53 +0000157defm : SKLWriteResPair<WriteFCmp, [SKLPort01], 4, [1], 1, 6>; // Floating point compare.
158defm : SKLWriteResPair<WriteFCmpY, [SKLPort01], 4, [1], 1, 7>; // Floating point compare (YMM/ZMM).
159defm : SKLWriteResPair<WriteFCom, [SKLPort0], 2>; // Floating point compare to flags.
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000160defm : SKLWriteResPair<WriteFMul, [SKLPort01], 4, [1], 1, 6>; // Floating point multiplication.
161defm : SKLWriteResPair<WriteFMulY, [SKLPort01], 4, [1], 1, 7>; // Floating point multiplication (YMM/ZMM).
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000162
163defm : SKLWriteResPair<WriteFDiv, [SKLPort0,SKLFPDivider], 11, [1,3], 1, 5>; // Floating point division.
164//defm : SKLWriteResPair<WriteFDivX, [SKLPort0,SKLFPDivider], 11, [1,3], 1, 6>; // Floating point division (XMM).
165defm : SKLWriteResPair<WriteFDivY, [SKLPort0,SKLFPDivider], 11, [1,5], 1, 7>; // Floating point division (YMM).
166defm : SKLWriteResPair<WriteFDivZ, [SKLPort0,SKLFPDivider], 11, [1,5], 1, 7>; // Floating point division (ZMM).
167//defm : SKLWriteResPair<WriteFDiv64, [SKLPort0,SKLFPDivider], 14, [1,3], 1, 5>; // Floating point double division.
168//defm : SKLWriteResPair<WriteFDiv64X, [SKLPort0,SKLFPDivider], 14, [1,3], 1, 6>; // Floating point double division (XMM).
169//defm : SKLWriteResPair<WriteFDiv64Y, [SKLPort0,SKLFPDivider], 14, [1,5], 1, 7>; // Floating point double division (YMM).
170defm : SKLWriteResPair<WriteFDiv64Z, [SKLPort0,SKLFPDivider], 14, [1,5], 1, 7>; // Floating point double division (ZMM).
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000171
172defm : SKLWriteResPair<WriteFSqrt, [SKLPort0,SKLFPDivider], 12, [1,3], 1, 5>; // Floating point square root.
173defm : SKLWriteResPair<WriteFSqrtX, [SKLPort0,SKLFPDivider], 12, [1,3], 1, 6>; // Floating point square root (XMM).
174defm : SKLWriteResPair<WriteFSqrtY, [SKLPort0,SKLFPDivider], 12, [1,6], 1, 7>; // Floating point square root (YMM).
175defm : SKLWriteResPair<WriteFSqrtZ, [SKLPort0,SKLFPDivider], 12, [1,6], 1, 7>; // Floating point square root (ZMM).
176defm : SKLWriteResPair<WriteFSqrt64, [SKLPort0,SKLFPDivider], 18, [1,6], 1, 5>; // Floating point double square root.
177defm : SKLWriteResPair<WriteFSqrt64X, [SKLPort0,SKLFPDivider], 18, [1,6], 1, 6>; // Floating point double square root (XMM).
178defm : SKLWriteResPair<WriteFSqrt64Y, [SKLPort0,SKLFPDivider], 18, [1,12],1, 7>; // Floating point double square root (YMM).
179defm : SKLWriteResPair<WriteFSqrt64Z, [SKLPort0,SKLFPDivider], 18, [1,12],1, 7>; // Floating point double square root (ZMM).
180defm : SKLWriteResPair<WriteFSqrt80, [SKLPort0,SKLFPDivider], 21, [1,7]>; // Floating point long double square root.
181
Simon Pilgrimc7088682018-05-01 18:06:07 +0000182defm : SKLWriteResPair<WriteFRcp, [SKLPort0], 4, [1], 1, 5>; // Floating point reciprocal estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000183defm : SKLWriteResPair<WriteFRcpX, [SKLPort0], 4, [1], 1, 6>; // Floating point reciprocal estimate (XMM).
184defm : SKLWriteResPair<WriteFRcpY, [SKLPort0], 4, [1], 1, 7>; // Floating point reciprocal estimate (YMM/ZMM).
185
Simon Pilgrimc7088682018-05-01 18:06:07 +0000186defm : SKLWriteResPair<WriteFRsqrt, [SKLPort0], 4, [1], 1, 5>; // Floating point reciprocal square root estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000187defm : SKLWriteResPair<WriteFRsqrtX,[SKLPort0], 4, [1], 1, 6>; // Floating point reciprocal square root estimate (XMM).
188defm : SKLWriteResPair<WriteFRsqrtY,[SKLPort0], 4, [1], 1, 7>; // Floating point reciprocal square root estimate (YMM/ZMM).
189
Simon Pilgrim67cc2462018-05-04 15:20:18 +0000190defm : SKLWriteResPair<WriteFMA, [SKLPort01], 4, [1], 1, 5>; // Fused Multiply Add.
191defm : SKLWriteResPair<WriteFMAX, [SKLPort01], 4, [1], 1, 6>; // Fused Multiply Add (XMM).
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000192defm : SKLWriteResPair<WriteFMAY, [SKLPort01], 4, [1], 1, 7>; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000193defm : SKLWriteResPair<WriteDPPD, [SKLPort5,SKLPort01], 9, [1,2], 3, 6>; // Floating point double dot product.
194defm : SKLWriteResPair<WriteDPPS, [SKLPort5,SKLPort01], 13, [1,3], 4, 6>; // Floating point single dot product.
195defm : SKLWriteResPair<WriteDPPSY, [SKLPort5,SKLPort01], 13, [1,3], 4, 7>; // Floating point single dot product (YMM).
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000196defm : SKLWriteResPair<WriteFSign, [SKLPort0], 1>; // Floating point fabs/fchs.
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000197defm : SKLWriteResPair<WriteFRnd, [SKLPort01], 8, [2], 2, 6>; // Floating point rounding.
198defm : SKLWriteResPair<WriteFRndY, [SKLPort01], 8, [2], 2, 7>; // Floating point rounding (YMM/ZMM).
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000199defm : SKLWriteResPair<WriteFLogic, [SKLPort015], 1, [1], 1, 6>; // Floating point and/or/xor logicals.
200defm : SKLWriteResPair<WriteFLogicY, [SKLPort015], 1, [1], 1, 7>; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000201defm : SKLWriteResPair<WriteFShuffle, [SKLPort5], 1, [1], 1, 6>; // Floating point vector shuffles.
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000202defm : SKLWriteResPair<WriteFShuffleY, [SKLPort5], 1, [1], 1, 7>; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000203defm : SKLWriteResPair<WriteFVarShuffle, [SKLPort5], 1, [1], 1, 6>; // Floating point vector shuffles.
204defm : SKLWriteResPair<WriteFVarShuffleY, [SKLPort5], 1, [1], 1, 7>; // Floating point vector shuffles.
Simon Pilgrim06e16542018-04-22 18:35:53 +0000205defm : SKLWriteResPair<WriteFBlend, [SKLPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000206defm : SKLWriteResPair<WriteFBlendY, [SKLPort015], 1, [1], 1, 7>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000207defm : SKLWriteResPair<WriteFVarBlend, [SKLPort015], 2, [2], 2, 6>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000208defm : SKLWriteResPair<WriteFVarBlendY,[SKLPort015], 2, [2], 2, 7>; // Fp vector variable blends.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000209
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000210def : WriteRes<WriteCvtF2FSt, [SKLPort4,SKLPort5,SKLPort237,SKLPort01]> {
211 let Latency = 6;
212 let NumMicroOps = 4;
213 let ResourceCycles = [1,1,1,1];
214}
215
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000216// FMA Scheduling helper class.
217// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
218
219// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000220def : WriteRes<WriteVecLoad, [SKLPort23]> { let Latency = 6; }
221def : WriteRes<WriteVecStore, [SKLPort237, SKLPort4]>;
222def : WriteRes<WriteVecMove, [SKLPort015]>;
223
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000224defm : SKLWriteResPair<WriteVecALU, [SKLPort01], 1, [1], 1, 6>; // Vector integer ALU op, no logicals.
225defm : SKLWriteResPair<WriteVecALUY, [SKLPort01], 1, [1], 1, 7>; // Vector integer ALU op, no logicals (YMM/ZMM).
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000226defm : SKLWriteResPair<WriteVecLogic, [SKLPort015], 1, [1], 1, 6>; // Vector integer and/or/xor.
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000227defm : SKLWriteResPair<WriteVecLogicY,[SKLPort015], 1, [1], 1, 7>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000228defm : SKLWriteResPair<WriteVecIMul, [SKLPort0] , 4, [1], 1, 5>; // Vector integer multiply.
229defm : SKLWriteResPair<WriteVecIMulX, [SKLPort01], 4, [1], 1, 6>; // Vector integer multiply (XMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000230defm : SKLWriteResPair<WriteVecIMulY, [SKLPort01], 4, [1], 1, 7>; // Vector integer multiply (YMM/ZMM).
231defm : SKLWriteResPair<WritePMULLD, [SKLPort01], 10, [2], 2, 6>; // Vector PMULLD.
232defm : SKLWriteResPair<WritePMULLDY, [SKLPort01], 10, [2], 2, 7>; // Vector PMULLD (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000233defm : SKLWriteResPair<WriteShuffle, [SKLPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000234defm : SKLWriteResPair<WriteShuffleY, [SKLPort5], 1, [1], 1, 7>; // Vector shuffles (YMM/ZMM).
235defm : SKLWriteResPair<WriteVarShuffle, [SKLPort5], 1, [1], 1, 6>; // Vector shuffles.
236defm : SKLWriteResPair<WriteVarShuffleY, [SKLPort5], 1, [1], 1, 7>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim06e16542018-04-22 18:35:53 +0000237defm : SKLWriteResPair<WriteBlend, [SKLPort5], 1, [1], 1, 6>; // Vector blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000238defm : SKLWriteResPair<WriteBlendY, [SKLPort5], 1, [1], 1, 7>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000239defm : SKLWriteResPair<WriteVarBlend, [SKLPort015], 2, [2], 2, 6>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000240defm : SKLWriteResPair<WriteVarBlendY, [SKLPort015], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000241defm : SKLWriteResPair<WriteMPSAD, [SKLPort5], 4, [2], 2, 6>; // Vector MPSAD.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000242defm : SKLWriteResPair<WriteMPSADY, [SKLPort5], 4, [2], 2, 7>; // Vector MPSAD.
243defm : SKLWriteResPair<WritePSADBW, [SKLPort5], 3, [1], 1, 6>; // Vector PSADBW.
244defm : SKLWriteResPair<WritePSADBWY, [SKLPort5], 3, [1], 1, 7>; // Vector PSADBW.
Simon Pilgrim27bc83e2018-04-24 18:49:25 +0000245defm : SKLWriteResPair<WritePHMINPOS, [SKLPort01], 4, [1], 1, 6>; // Vector PHMINPOS.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000246
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000247// Vector integer shifts.
248defm : SKLWriteResPair<WriteVecShift, [SKLPort0], 1, [1], 1, 5>;
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000249defm : X86WriteRes<WriteVecShiftX, [SKLPort5,SKLPort01], 2, [1,1], 2>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000250defm : X86WriteRes<WriteVecShiftY, [SKLPort5,SKLPort01], 4, [1,1], 2>;
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000251defm : X86WriteRes<WriteVecShiftXLd, [SKLPort01,SKLPort23], 7, [1,1], 2>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000252defm : X86WriteRes<WriteVecShiftYLd, [SKLPort01,SKLPort23], 8, [1,1], 2>;
253
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000254defm : SKLWriteResPair<WriteVecShiftImm, [SKLPort0], 1, [1], 1, 5>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000255defm : SKLWriteResPair<WriteVecShiftImmX, [SKLPort01], 1, [1], 1, 6>; // Vector integer immediate shifts (XMM).
256defm : SKLWriteResPair<WriteVecShiftImmY, [SKLPort01], 1, [1], 1, 7>; // Vector integer immediate shifts (YMM/ZMM).
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000257defm : SKLWriteResPair<WriteVarVecShift, [SKLPort01], 1, [1], 1, 6>; // Variable vector shifts.
258defm : SKLWriteResPair<WriteVarVecShiftY, [SKLPort01], 1, [1], 1, 7>; // Variable vector shifts (YMM/ZMM).
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000259
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000260// Vector insert/extract operations.
261def : WriteRes<WriteVecInsert, [SKLPort5]> {
262 let Latency = 2;
263 let NumMicroOps = 2;
264 let ResourceCycles = [2];
265}
266def : WriteRes<WriteVecInsertLd, [SKLPort5,SKLPort23]> {
267 let Latency = 6;
268 let NumMicroOps = 2;
269}
Simon Pilgrim819f2182018-05-02 17:58:50 +0000270def: InstRW<[WriteVecInsertLd], (instregex "(V?)MOV(H|L)(PD|PS)rm")>;
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000271
272def : WriteRes<WriteVecExtract, [SKLPort0,SKLPort5]> {
273 let Latency = 3;
274 let NumMicroOps = 2;
275}
276def : WriteRes<WriteVecExtractSt, [SKLPort4,SKLPort5,SKLPort237]> {
277 let Latency = 2;
278 let NumMicroOps = 3;
279}
280
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000281// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000282defm : SKLWriteResPair<WriteCvtF2I, [SKLPort1], 3>; // Float -> Integer.
283defm : SKLWriteResPair<WriteCvtI2F, [SKLPort1], 4>; // Integer -> Float.
284defm : SKLWriteResPair<WriteCvtF2F, [SKLPort1], 3>; // Float -> Float size conversion.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000285
286// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000287
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000288// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000289def : WriteRes<WritePCmpIStrM, [SKLPort0]> {
290 let Latency = 10;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000291 let NumMicroOps = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000292 let ResourceCycles = [3];
293}
294def : WriteRes<WritePCmpIStrMLd, [SKLPort0, SKLPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000295 let Latency = 16;
296 let NumMicroOps = 4;
297 let ResourceCycles = [3,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000298}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000299
300// Packed Compare Explicit Length Strings, Return Mask
301def : WriteRes<WritePCmpEStrM, [SKLPort0, SKLPort5, SKLPort015, SKLPort0156]> {
302 let Latency = 19;
303 let NumMicroOps = 9;
304 let ResourceCycles = [4,3,1,1];
305}
306def : WriteRes<WritePCmpEStrMLd, [SKLPort0, SKLPort5,SKLPort23, SKLPort015, SKLPort0156]> {
307 let Latency = 25;
308 let NumMicroOps = 10;
309 let ResourceCycles = [4,3,1,1,1];
310}
311
312// Packed Compare Implicit Length Strings, Return Index
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000313def : WriteRes<WritePCmpIStrI, [SKLPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000314 let Latency = 10;
315 let NumMicroOps = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000316 let ResourceCycles = [3];
317}
318def : WriteRes<WritePCmpIStrILd, [SKLPort0, SKLPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000319 let Latency = 16;
320 let NumMicroOps = 4;
321 let ResourceCycles = [3,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000322}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000323
324// Packed Compare Explicit Length Strings, Return Index
325def : WriteRes<WritePCmpEStrI, [SKLPort0, SKLPort5, SKLPort0156]> {
326 let Latency = 18;
327 let NumMicroOps = 8;
328 let ResourceCycles = [4,3,1];
329}
330def : WriteRes<WritePCmpEStrILd, [SKLPort0, SKLPort5, SKLPort23, SKLPort0156]> {
331 let Latency = 24;
332 let NumMicroOps = 9;
333 let ResourceCycles = [4,3,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000334}
335
Simon Pilgrima2f26782018-03-27 20:38:54 +0000336// MOVMSK Instructions.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000337def : WriteRes<WriteFMOVMSK, [SKLPort0]> { let Latency = 2; }
338def : WriteRes<WriteVecMOVMSK, [SKLPort0]> { let Latency = 2; }
339def : WriteRes<WriteVecMOVMSKY, [SKLPort0]> { let Latency = 2; }
340def : WriteRes<WriteMMXMOVMSK, [SKLPort0]> { let Latency = 2; }
Simon Pilgrima2f26782018-03-27 20:38:54 +0000341
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000342// AES instructions.
Simon Pilgrim7684e052018-03-22 13:18:08 +0000343def : WriteRes<WriteAESDecEnc, [SKLPort0]> { // Decryption, encryption.
344 let Latency = 4;
345 let NumMicroOps = 1;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000346 let ResourceCycles = [1];
347}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000348def : WriteRes<WriteAESDecEncLd, [SKLPort0, SKLPort23]> {
349 let Latency = 10;
350 let NumMicroOps = 2;
351 let ResourceCycles = [1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000352}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000353
354def : WriteRes<WriteAESIMC, [SKLPort0]> { // InvMixColumn.
355 let Latency = 8;
356 let NumMicroOps = 2;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000357 let ResourceCycles = [2];
358}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000359def : WriteRes<WriteAESIMCLd, [SKLPort0, SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000360 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000361 let NumMicroOps = 3;
362 let ResourceCycles = [2,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000363}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000364
365def : WriteRes<WriteAESKeyGen, [SKLPort0, SKLPort5, SKLPort015]> { // Key Generation.
366 let Latency = 20;
367 let NumMicroOps = 11;
368 let ResourceCycles = [3,6,2];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000369}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000370def : WriteRes<WriteAESKeyGenLd, [SKLPort0, SKLPort5, SKLPort23, SKLPort015]> {
371 let Latency = 25;
372 let NumMicroOps = 11;
373 let ResourceCycles = [3,6,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000374}
375
376// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000377def : WriteRes<WriteCLMul, [SKLPort5]> {
378 let Latency = 6;
379 let NumMicroOps = 1;
380 let ResourceCycles = [1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000381}
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000382def : WriteRes<WriteCLMulLd, [SKLPort5, SKLPort23]> {
383 let Latency = 12;
384 let NumMicroOps = 2;
385 let ResourceCycles = [1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000386}
387
388// Catch-all for expensive system instructions.
389def : WriteRes<WriteSystem, [SKLPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
390
391// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000392defm : SKLWriteResPair<WriteFShuffle256, [SKLPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
393defm : SKLWriteResPair<WriteFVarShuffle256, [SKLPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
394defm : SKLWriteResPair<WriteShuffle256, [SKLPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
395defm : SKLWriteResPair<WriteVarShuffle256, [SKLPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000396
397// Old microcoded instructions that nobody use.
398def : WriteRes<WriteMicrocoded, [SKLPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
399
400// Fence instructions.
401def : WriteRes<WriteFence, [SKLPort23, SKLPort4]>;
402
Craig Topper05242bf2018-04-21 18:07:36 +0000403// Load/store MXCSR.
404def : WriteRes<WriteLDMXCSR, [SKLPort0,SKLPort23,SKLPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
405def : WriteRes<WriteSTMXCSR, [SKLPort4,SKLPort5,SKLPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
406
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000407// Nop, not very useful expect it provides a model for nops!
408def : WriteRes<WriteNop, []>;
409
410////////////////////////////////////////////////////////////////////////////////
411// Horizontal add/sub instructions.
412////////////////////////////////////////////////////////////////////////////////
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000413
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000414defm : SKLWriteResPair<WriteFHAdd, [SKLPort5,SKLPort01], 6, [2,1], 3, 6>;
415defm : SKLWriteResPair<WriteFHAddY, [SKLPort5,SKLPort01], 6, [2,1], 3, 7>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000416defm : SKLWriteResPair<WritePHAdd, [SKLPort5,SKLPort015], 3, [2,1], 3, 6>;
417defm : SKLWriteResPair<WritePHAddY, [SKLPort5,SKLPort015], 3, [2,1], 3, 7>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000418
419// Remaining instrs.
420
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000421def SKLWriteResGroup1 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000422 let Latency = 1;
423 let NumMicroOps = 1;
424 let ResourceCycles = [1];
425}
Craig Topperfc179c62018-03-22 04:23:41 +0000426def: InstRW<[SKLWriteResGroup1], (instregex "MMX_PADDSBirr",
427 "MMX_PADDSWirr",
428 "MMX_PADDUSBirr",
429 "MMX_PADDUSWirr",
430 "MMX_PAVGBirr",
431 "MMX_PAVGWirr",
432 "MMX_PCMPEQBirr",
433 "MMX_PCMPEQDirr",
434 "MMX_PCMPEQWirr",
435 "MMX_PCMPGTBirr",
436 "MMX_PCMPGTDirr",
437 "MMX_PCMPGTWirr",
438 "MMX_PMAXSWirr",
439 "MMX_PMAXUBirr",
440 "MMX_PMINSWirr",
441 "MMX_PMINUBirr",
Craig Topperfc179c62018-03-22 04:23:41 +0000442 "MMX_PSUBSBirr",
443 "MMX_PSUBSWirr",
444 "MMX_PSUBUSBirr",
445 "MMX_PSUBUSWirr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000446
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000447def SKLWriteResGroup3 : SchedWriteRes<[SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000448 let Latency = 1;
449 let NumMicroOps = 1;
450 let ResourceCycles = [1];
451}
Craig Topperfc179c62018-03-22 04:23:41 +0000452def: InstRW<[SKLWriteResGroup3], (instregex "COMP_FST0r",
453 "COM_FST0r",
Craig Topperfc179c62018-03-22 04:23:41 +0000454 "MMX_MOVD64rr",
455 "MMX_MOVD64to64rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000456 "UCOM_FPr",
457 "UCOM_Fr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000458 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000459 "(V?)MOVDI2PDIrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000460
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000461def SKLWriteResGroup4 : SchedWriteRes<[SKLPort6]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000462 let Latency = 1;
463 let NumMicroOps = 1;
464 let ResourceCycles = [1];
465}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000466def: InstRW<[SKLWriteResGroup4], (instregex "JMP(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000467
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000468def SKLWriteResGroup6 : SchedWriteRes<[SKLPort05]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000469 let Latency = 1;
470 let NumMicroOps = 1;
471 let ResourceCycles = [1];
472}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000473def: InstRW<[SKLWriteResGroup6], (instrs FINCSTP, FNOP)>;
474def: InstRW<[SKLWriteResGroup6], (instregex "MMX_MOVQ64rr",
Simon Pilgrim5e492d22018-04-19 17:32:10 +0000475 "MMX_PABS(B|D|W)rr",
476 "MMX_PADD(B|D|Q|W)irr",
Craig Topperfc179c62018-03-22 04:23:41 +0000477 "MMX_PANDNirr",
478 "MMX_PANDirr",
479 "MMX_PORirr",
Simon Pilgrim5e492d22018-04-19 17:32:10 +0000480 "MMX_PSIGN(B|D|W)rr",
481 "MMX_PSUB(B|D|Q|W)irr",
Craig Topperfc179c62018-03-22 04:23:41 +0000482 "MMX_PXORirr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000483
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000484def SKLWriteResGroup7 : SchedWriteRes<[SKLPort06]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000485 let Latency = 1;
486 let NumMicroOps = 1;
487 let ResourceCycles = [1];
488}
Simon Pilgrim455d0b22018-04-23 13:24:17 +0000489def: InstRW<[SKLWriteResGroup7], (instrs CDQ, CQO, CLAC, STAC)>;
Craig Topperfc179c62018-03-22 04:23:41 +0000490def: InstRW<[SKLWriteResGroup7], (instregex "ADC(16|32|64)ri",
491 "ADC(16|32|64)i",
492 "ADC(8|16|32|64)rr",
493 "ADCX(32|64)rr",
494 "ADOX(32|64)rr",
495 "BT(16|32|64)ri8",
496 "BT(16|32|64)rr",
497 "BTC(16|32|64)ri8",
498 "BTC(16|32|64)rr",
499 "BTR(16|32|64)ri8",
500 "BTR(16|32|64)rr",
501 "BTS(16|32|64)ri8",
502 "BTS(16|32|64)rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000503 "SBB(16|32|64)ri",
504 "SBB(16|32|64)i",
Simon Pilgrim39d77202018-04-28 15:32:19 +0000505 "SBB(8|16|32|64)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000506
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000507def SKLWriteResGroup8 : SchedWriteRes<[SKLPort15]> {
508 let Latency = 1;
509 let NumMicroOps = 1;
510 let ResourceCycles = [1];
511}
Craig Topperfc179c62018-03-22 04:23:41 +0000512def: InstRW<[SKLWriteResGroup8], (instregex "ANDN(32|64)rr",
513 "BLSI(32|64)rr",
514 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000515 "BLSR(32|64)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000516
517def SKLWriteResGroup9 : SchedWriteRes<[SKLPort015]> {
518 let Latency = 1;
519 let NumMicroOps = 1;
520 let ResourceCycles = [1];
521}
Simon Pilgrim37334ea2018-04-21 21:59:36 +0000522def: InstRW<[SKLWriteResGroup9], (instregex "(V?)PADDB(Y?)rr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000523 "(V?)PADDD(Y?)rr",
524 "(V?)PADDQ(Y?)rr",
525 "(V?)PADDW(Y?)rr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000526 "VPBLENDD(Y?)rri",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000527 "(V?)PSUBB(Y?)rr",
528 "(V?)PSUBD(Y?)rr",
529 "(V?)PSUBQ(Y?)rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000530 "(V?)PSUBW(Y?)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000531
532def SKLWriteResGroup10 : SchedWriteRes<[SKLPort0156]> {
533 let Latency = 1;
534 let NumMicroOps = 1;
535 let ResourceCycles = [1];
536}
Craig Topperfbe31322018-04-05 21:56:19 +0000537def: InstRW<[SKLWriteResGroup10], (instrs CBW, CWDE, CDQE)>;
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000538def: InstRW<[SKLWriteResGroup10], (instrs LAHF, SAHF)>; // TODO: This doesn't match Agner's data
Craig Topperf0d04262018-04-06 16:16:48 +0000539def: InstRW<[SKLWriteResGroup10], (instregex "CLC",
Craig Topperfc179c62018-03-22 04:23:41 +0000540 "CMC",
Craig Topperfc179c62018-03-22 04:23:41 +0000541 "NOOP",
Craig Topperfc179c62018-03-22 04:23:41 +0000542 "SGDT64m",
543 "SIDT64m",
Craig Topperfc179c62018-03-22 04:23:41 +0000544 "SMSW16m",
545 "STC",
546 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000547 "SYSCALL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000548
549def SKLWriteResGroup11 : SchedWriteRes<[SKLPort4,SKLPort237]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000550 let Latency = 1;
551 let NumMicroOps = 2;
552 let ResourceCycles = [1,1];
553}
Craig Topperfc179c62018-03-22 04:23:41 +0000554def: InstRW<[SKLWriteResGroup11], (instregex "FBSTPm",
555 "MMX_MOVD64from64rm",
556 "MMX_MOVD64mr",
557 "MMX_MOVNTQmr",
558 "MMX_MOVQ64mr",
Craig Topperfc179c62018-03-22 04:23:41 +0000559 "MOVNTI_64mr",
560 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000561 "ST_FP(32|64|80)m",
Craig Topperfc179c62018-03-22 04:23:41 +0000562 "VEXTRACTF128mr",
563 "VEXTRACTI128mr",
Craig Topper972bdbd2018-03-25 17:33:14 +0000564 "(V?)MOVAPDYmr",
565 "(V?)MOVAPS(Y?)mr",
566 "(V?)MOVDQA(Y?)mr",
567 "(V?)MOVDQU(Y?)mr",
568 "(V?)MOVHPDmr",
569 "(V?)MOVHPSmr",
570 "(V?)MOVLPDmr",
571 "(V?)MOVLPSmr",
572 "(V?)MOVNTDQ(Y?)mr",
573 "(V?)MOVNTPD(Y?)mr",
574 "(V?)MOVNTPS(Y?)mr",
575 "(V?)MOVPDI2DImr",
576 "(V?)MOVPQI2QImr",
577 "(V?)MOVPQIto64mr",
578 "(V?)MOVSDmr",
579 "(V?)MOVSSmr",
580 "(V?)MOVUPD(Y?)mr",
581 "(V?)MOVUPS(Y?)mr",
Craig Topperfc179c62018-03-22 04:23:41 +0000582 "VMPTRSTm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000583
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000584def SKLWriteResGroup12 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000585 let Latency = 2;
586 let NumMicroOps = 1;
587 let ResourceCycles = [1];
588}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000589def: InstRW<[SKLWriteResGroup12], (instregex "MMX_MOVD64from64rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000590 "MMX_MOVD64grr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000591 "(V?)MOVPDI2DIrr",
592 "(V?)MOVPQIto64rr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000593 "VTESTPD(Y?)rr",
Simon Pilgrim86e3c2692018-04-17 07:22:44 +0000594 "VTESTPS(Y?)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000595
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000596def SKLWriteResGroup13 : SchedWriteRes<[SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000597 let Latency = 2;
598 let NumMicroOps = 2;
599 let ResourceCycles = [2];
600}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000601def: InstRW<[SKLWriteResGroup13], (instregex "MMX_MOVQ2DQrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000602
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000603def SKLWriteResGroup14 : SchedWriteRes<[SKLPort05]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000604 let Latency = 2;
605 let NumMicroOps = 2;
606 let ResourceCycles = [2];
607}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000608def: InstRW<[SKLWriteResGroup14], (instrs FDECSTP)>;
609def: InstRW<[SKLWriteResGroup14], (instregex "MMX_MOVDQ2Qrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000610
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000611def SKLWriteResGroup15 : SchedWriteRes<[SKLPort06]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000612 let Latency = 2;
613 let NumMicroOps = 2;
614 let ResourceCycles = [2];
615}
Craig Topperfc179c62018-03-22 04:23:41 +0000616def: InstRW<[SKLWriteResGroup15], (instregex "CMOV(A|BE)(16|32|64)rr",
617 "ROL(8|16|32|64)r1",
618 "ROL(8|16|32|64)ri",
619 "ROR(8|16|32|64)r1",
620 "ROR(8|16|32|64)ri",
621 "SET(A|BE)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000622
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000623def SKLWriteResGroup17 : SchedWriteRes<[SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000624 let Latency = 2;
625 let NumMicroOps = 2;
626 let ResourceCycles = [2];
627}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000628def: InstRW<[SKLWriteResGroup17], (instrs LFENCE,
629 WAIT,
630 XGETBV)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000631
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000632def SKLWriteResGroup18 : SchedWriteRes<[SKLPort0,SKLPort237]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000633 let Latency = 2;
634 let NumMicroOps = 2;
635 let ResourceCycles = [1,1];
636}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000637def: InstRW<[SKLWriteResGroup18], (instregex "VMASKMOVPD(Y?)mr",
638 "VMASKMOVPS(Y?)mr",
639 "VPMASKMOVD(Y?)mr",
640 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000641
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000642def SKLWriteResGroup20 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000643 let Latency = 2;
644 let NumMicroOps = 2;
645 let ResourceCycles = [1,1];
646}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000647def: InstRW<[SKLWriteResGroup20], (instregex "CLFLUSH")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000648
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000649def SKLWriteResGroup21 : SchedWriteRes<[SKLPort237,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000650 let Latency = 2;
651 let NumMicroOps = 2;
652 let ResourceCycles = [1,1];
653}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000654def: InstRW<[SKLWriteResGroup21], (instregex "SFENCE")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000655
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000656def SKLWriteResGroup22 : SchedWriteRes<[SKLPort06,SKLPort15]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000657 let Latency = 2;
658 let NumMicroOps = 2;
659 let ResourceCycles = [1,1];
660}
Craig Topper498875f2018-04-04 17:54:19 +0000661def: InstRW<[SKLWriteResGroup22], (instrs BSWAP64r)>;
662
663def SKLWriteResGroup22_1 : SchedWriteRes<[SKLPort15]> {
664 let Latency = 1;
665 let NumMicroOps = 1;
666 let ResourceCycles = [1];
667}
668def: InstRW<[SKLWriteResGroup22_1], (instrs BSWAP32r)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000669
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000670def SKLWriteResGroup23 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000671 let Latency = 2;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000672 let NumMicroOps = 2;
673 let ResourceCycles = [1,1];
674}
Craig Topper2d451e72018-03-18 08:38:06 +0000675def: InstRW<[SKLWriteResGroup23], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000676def: InstRW<[SKLWriteResGroup23], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topperfc179c62018-03-22 04:23:41 +0000677def: InstRW<[SKLWriteResGroup23], (instregex "ADC8i8",
678 "ADC8ri",
679 "SBB8i8",
680 "SBB8ri")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000681
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000682def SKLWriteResGroup25 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort237]> {
683 let Latency = 2;
684 let NumMicroOps = 3;
685 let ResourceCycles = [1,1,1];
686}
687def: InstRW<[SKLWriteResGroup25], (instregex "FNSTCW16m")>;
688
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000689def SKLWriteResGroup27 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort15]> {
690 let Latency = 2;
691 let NumMicroOps = 3;
692 let ResourceCycles = [1,1,1];
693}
694def: InstRW<[SKLWriteResGroup27], (instregex "MOVBE(16|32|64)mr")>;
695
696def SKLWriteResGroup28 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort0156]> {
697 let Latency = 2;
698 let NumMicroOps = 3;
699 let ResourceCycles = [1,1,1];
700}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000701def: InstRW<[SKLWriteResGroup28], (instrs PUSH16r, PUSH32r, PUSH64r,
702 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topperfc179c62018-03-22 04:23:41 +0000703def: InstRW<[SKLWriteResGroup28], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000704 "PUSH64i8")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000705
706def SKLWriteResGroup29 : SchedWriteRes<[SKLPort1]> {
707 let Latency = 3;
708 let NumMicroOps = 1;
709 let ResourceCycles = [1];
710}
Simon Pilgrime93fd5f2018-05-02 09:18:49 +0000711def: InstRW<[SKLWriteResGroup29], (instregex "CMOV(N?)(B|BE|E|P)_F",
712 "PDEP(32|64)rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000713 "PEXT(32|64)rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000714 "SHLD(16|32|64)rri8",
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000715 "SHRD(16|32|64)rri8")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000716
Clement Courbet327fac42018-03-07 08:14:02 +0000717def SKLWriteResGroup29_16i : SchedWriteRes<[SKLPort1, SKLPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000718 let Latency = 4;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000719 let NumMicroOps = 2;
720 let ResourceCycles = [1,1];
721}
Clement Courbet327fac42018-03-07 08:14:02 +0000722def: InstRW<[SKLWriteResGroup29_16i], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000723
724def SKLWriteResGroup30 : SchedWriteRes<[SKLPort5]> {
725 let Latency = 3;
726 let NumMicroOps = 1;
727 let ResourceCycles = [1];
728}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000729def: InstRW<[SKLWriteResGroup30], (instregex "(ADD|SUB|SUBR)_FPrST0",
730 "(ADD|SUB|SUBR)_FST0r",
731 "(ADD|SUB|SUBR)_FrST0",
Simon Pilgrim74ccc6a2018-04-21 19:11:55 +0000732 "VPBROADCASTBrr",
Simon Pilgrim825ead92018-04-21 20:45:12 +0000733 "VPBROADCASTWrr",
Simon Pilgrime480ed02018-05-07 18:25:19 +0000734 "(V?)PCMPGTQ(Y?)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000735
736def SKLWriteResGroup31 : SchedWriteRes<[SKLPort0,SKLPort5]> {
737 let Latency = 3;
738 let NumMicroOps = 2;
739 let ResourceCycles = [1,1];
740}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000741def: InstRW<[SKLWriteResGroup31], (instregex "(V?)PTEST(Y?)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000742
743def SKLWriteResGroup32 : SchedWriteRes<[SKLPort0,SKLPort0156]> {
744 let Latency = 3;
745 let NumMicroOps = 2;
746 let ResourceCycles = [1,1];
747}
748def: InstRW<[SKLWriteResGroup32], (instregex "FNSTSW16r")>;
749
750def SKLWriteResGroup33 : SchedWriteRes<[SKLPort06]> {
751 let Latency = 3;
752 let NumMicroOps = 3;
753 let ResourceCycles = [3];
754}
Craig Topperfc179c62018-03-22 04:23:41 +0000755def: InstRW<[SKLWriteResGroup33], (instregex "ROL(8|16|32|64)rCL",
756 "ROR(8|16|32|64)rCL",
757 "SAR(8|16|32|64)rCL",
758 "SHL(8|16|32|64)rCL",
759 "SHR(8|16|32|64)rCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000760
761def SKLWriteResGroup34 : SchedWriteRes<[SKLPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000762 let Latency = 2;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000763 let NumMicroOps = 3;
764 let ResourceCycles = [3];
765}
Craig Topperb5f26592018-04-19 18:00:17 +0000766def: InstRW<[SKLWriteResGroup34], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
767 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
768 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000769
770def SKLWriteResGroup35 : SchedWriteRes<[SKLPort0,SKLPort5]> {
771 let Latency = 3;
772 let NumMicroOps = 3;
773 let ResourceCycles = [1,2];
774}
Simon Pilgrim5e492d22018-04-19 17:32:10 +0000775def: InstRW<[SKLWriteResGroup35], (instregex "MMX_PH(ADD|SUB)SWrr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000776
777def SKLWriteResGroup36 : SchedWriteRes<[SKLPort5,SKLPort01]> {
778 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000779 let NumMicroOps = 3;
780 let ResourceCycles = [2,1];
781}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000782def: InstRW<[SKLWriteResGroup36], (instregex "(V?)PHADDSW(Y?)rr",
783 "(V?)PHSUBSW(Y?)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000784
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000785def SKLWriteResGroup37 : SchedWriteRes<[SKLPort5,SKLPort05]> {
786 let Latency = 3;
787 let NumMicroOps = 3;
788 let ResourceCycles = [2,1];
789}
Simon Pilgrim5e492d22018-04-19 17:32:10 +0000790def: InstRW<[SKLWriteResGroup37], (instregex "MMX_PH(ADD|SUB)(D|W)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000791
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000792def SKLWriteResGroup39 : SchedWriteRes<[SKLPort5,SKLPort0156]> {
793 let Latency = 3;
794 let NumMicroOps = 3;
795 let ResourceCycles = [2,1];
796}
Craig Topperfc179c62018-03-22 04:23:41 +0000797def: InstRW<[SKLWriteResGroup39], (instregex "MMX_PACKSSDWirr",
798 "MMX_PACKSSWBirr",
799 "MMX_PACKUSWBirr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000800
801def SKLWriteResGroup40 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
802 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000803 let NumMicroOps = 3;
804 let ResourceCycles = [1,2];
805}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000806def: InstRW<[SKLWriteResGroup40], (instregex "CLD")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000807
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000808def SKLWriteResGroup41 : SchedWriteRes<[SKLPort237,SKLPort0156]> {
809 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000810 let NumMicroOps = 3;
811 let ResourceCycles = [1,2];
812}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000813def: InstRW<[SKLWriteResGroup41], (instrs MFENCE)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000814
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000815def SKLWriteResGroup42 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
816 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000817 let NumMicroOps = 3;
818 let ResourceCycles = [1,2];
819}
Craig Topperfc179c62018-03-22 04:23:41 +0000820def: InstRW<[SKLWriteResGroup42], (instregex "RCL(8|16|32|64)r1",
821 "RCL(8|16|32|64)ri",
822 "RCR(8|16|32|64)r1",
823 "RCR(8|16|32|64)ri")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000824
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000825def SKLWriteResGroup43 : SchedWriteRes<[SKLPort0,SKLPort4,SKLPort237]> {
826 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000827 let NumMicroOps = 3;
828 let ResourceCycles = [1,1,1];
829}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000830def: InstRW<[SKLWriteResGroup43], (instregex "FNSTSWm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000831
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000832def SKLWriteResGroup44 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort06]> {
833 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000834 let NumMicroOps = 4;
835 let ResourceCycles = [1,1,2];
836}
Craig Topperf4cd9082018-01-19 05:47:32 +0000837def: InstRW<[SKLWriteResGroup44], (instregex "SET(A|BE)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000838
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000839def SKLWriteResGroup45 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort237,SKLPort0156]> {
840 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000841 let NumMicroOps = 4;
842 let ResourceCycles = [1,1,1,1];
843}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000844def: InstRW<[SKLWriteResGroup45], (instregex "CALL(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000845
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000846def SKLWriteResGroup46 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort06,SKLPort0156]> {
847 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000848 let NumMicroOps = 4;
849 let ResourceCycles = [1,1,1,1];
850}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000851def: InstRW<[SKLWriteResGroup46], (instregex "CALL64pcrel32")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000852
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000853def SKLWriteResGroup47 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000854 let Latency = 4;
855 let NumMicroOps = 1;
856 let ResourceCycles = [1];
857}
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000858def: InstRW<[SKLWriteResGroup47], (instregex "MUL_FPrST0",
Craig Topperfc179c62018-03-22 04:23:41 +0000859 "MUL_FST0r",
Simon Pilgrim93b102c2018-04-21 15:16:59 +0000860 "MUL_FrST0")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000861
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000862def SKLWriteResGroup48 : SchedWriteRes<[SKLPort01]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000863 let Latency = 4;
864 let NumMicroOps = 1;
865 let ResourceCycles = [1];
866}
Simon Pilgrime93fd5f2018-05-02 09:18:49 +0000867def: InstRW<[SKLWriteResGroup48], (instregex "(V?)CVTDQ2PS(Y?)rr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000868 "(V?)CVTPS2DQ(Y?)rr",
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000869 "(V?)CVTTPS2DQ(Y?)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000870
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000871def SKLWriteResGroup51 : SchedWriteRes<[SKLPort1,SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000872 let Latency = 4;
873 let NumMicroOps = 2;
874 let ResourceCycles = [1,1];
875}
Craig Topperf846e2d2018-04-19 05:34:05 +0000876def: InstRW<[SKLWriteResGroup51], (instrs IMUL64r, MUL64r, MULX64rr)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000877
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000878def SKLWriteResGroup51_16 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
879 let Latency = 4;
880 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000881 let ResourceCycles = [1,1,2];
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000882}
Craig Topperfc179c62018-03-22 04:23:41 +0000883def: InstRW<[SKLWriteResGroup51_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000884
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000885def SKLWriteResGroup53 : SchedWriteRes<[SKLPort4,SKLPort5,SKLPort237]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000886 let Latency = 4;
887 let NumMicroOps = 3;
888 let ResourceCycles = [1,1,1];
889}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000890def: InstRW<[SKLWriteResGroup53], (instregex "IST(T?)_FP(16|32|64)m",
891 "IST_F(16|32)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000892
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000893def SKLWriteResGroup54 : SchedWriteRes<[SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000894 let Latency = 4;
895 let NumMicroOps = 4;
896 let ResourceCycles = [4];
897}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000898def: InstRW<[SKLWriteResGroup54], (instrs FNCLEX)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000899
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000900def SKLWriteResGroup55 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000901 let Latency = 4;
902 let NumMicroOps = 4;
903 let ResourceCycles = [1,3];
904}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000905def: InstRW<[SKLWriteResGroup55], (instrs PAUSE)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000906
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000907def SKLWriteResGroup56 : SchedWriteRes<[SKLPort015,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000908 let Latency = 4;
909 let NumMicroOps = 4;
910 let ResourceCycles = [1,3];
911}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000912def: InstRW<[SKLWriteResGroup56], (instrs VZEROUPPER)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000913
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000914def SKLWriteResGroup57 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000915 let Latency = 4;
916 let NumMicroOps = 4;
917 let ResourceCycles = [1,1,2];
918}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000919def: InstRW<[SKLWriteResGroup57], (instregex "LAR(16|32|64)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000920
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000921def SKLWriteResGroup58 : SchedWriteRes<[SKLPort23]> {
922 let Latency = 5;
923 let NumMicroOps = 1;
924 let ResourceCycles = [1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000925}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000926def: InstRW<[SKLWriteResGroup58], (instregex "MOVSX(16|32|64)rm16",
Craig Topperfc179c62018-03-22 04:23:41 +0000927 "MOVSX(16|32|64)rm32",
928 "MOVSX(16|32|64)rm8",
929 "MOVZX(16|32|64)rm16",
930 "MOVZX(16|32|64)rm8",
Simon Pilgrim37334ea2018-04-21 21:59:36 +0000931 "(V?)MOVDDUPrm")>; // TODO: Should this be SKLWriteResGroup67?
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000932
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000933def SKLWriteResGroup59 : SchedWriteRes<[SKLPort0,SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000934 let Latency = 5;
935 let NumMicroOps = 2;
936 let ResourceCycles = [1,1];
937}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000938def: InstRW<[SKLWriteResGroup59], (instregex "MMX_CVTPI2PDirr",
939 "(V?)CVTDQ2PDrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000940
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000941def SKLWriteResGroup60 : SchedWriteRes<[SKLPort5,SKLPort015]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000942 let Latency = 5;
943 let NumMicroOps = 2;
944 let ResourceCycles = [1,1];
945}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000946def: InstRW<[SKLWriteResGroup60], (instregex "MMX_CVTPD2PIirr",
Craig Topperfc179c62018-03-22 04:23:41 +0000947 "MMX_CVTPS2PIirr",
948 "MMX_CVTTPD2PIirr",
949 "MMX_CVTTPS2PIirr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000950 "(V?)CVTPD2DQrr",
951 "(V?)CVTPD2PSrr",
Craig Topperfc179c62018-03-22 04:23:41 +0000952 "VCVTPH2PSrr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000953 "(V?)CVTPS2PDrr",
Craig Topperfc179c62018-03-22 04:23:41 +0000954 "VCVTPS2PHrr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000955 "(V?)CVTSD2SSrr",
956 "(V?)CVTSI642SDrr",
957 "(V?)CVTSI2SDrr",
958 "(V?)CVTSI2SSrr",
959 "(V?)CVTSS2SDrr",
960 "(V?)CVTTPD2DQrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000961
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000962def SKLWriteResGroup61 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort06]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000963 let Latency = 5;
964 let NumMicroOps = 3;
965 let ResourceCycles = [1,1,1];
966}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000967def: InstRW<[SKLWriteResGroup61], (instregex "STR(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000968
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000969def SKLWriteResGroup62 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000970 let Latency = 4;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000971 let NumMicroOps = 3;
972 let ResourceCycles = [1,1,1];
973}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000974def: InstRW<[SKLWriteResGroup62], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000975
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000976def SKLWriteResGroup63 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000977 let Latency = 5;
978 let NumMicroOps = 5;
979 let ResourceCycles = [1,4];
980}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000981def: InstRW<[SKLWriteResGroup63], (instregex "XSETBV")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000982
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000983def SKLWriteResGroup64 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000984 let Latency = 5;
985 let NumMicroOps = 5;
986 let ResourceCycles = [2,3];
987}
Craig Topper13a16502018-03-19 00:56:09 +0000988def: InstRW<[SKLWriteResGroup64], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000989
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000990def SKLWriteResGroup65 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000991 let Latency = 5;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000992 let NumMicroOps = 6;
993 let ResourceCycles = [1,1,4];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000994}
Craig Topperfc179c62018-03-22 04:23:41 +0000995def: InstRW<[SKLWriteResGroup65], (instregex "PUSHF16",
996 "PUSHF64")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000997
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000998def SKLWriteResGroup67 : SchedWriteRes<[SKLPort23]> {
999 let Latency = 6;
1000 let NumMicroOps = 1;
1001 let ResourceCycles = [1];
1002}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001003def: InstRW<[SKLWriteResGroup67], (instregex "VBROADCASTSSrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001004 "(V?)MOVSHDUPrm",
1005 "(V?)MOVSLDUPrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001006 "VPBROADCASTDrm",
1007 "VPBROADCASTQrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001008
1009def SKLWriteResGroup68 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001010 let Latency = 6;
1011 let NumMicroOps = 2;
1012 let ResourceCycles = [2];
1013}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001014def: InstRW<[SKLWriteResGroup68], (instregex "MMX_CVTPI2PSirr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001015
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001016def SKLWriteResGroup69 : SchedWriteRes<[SKLPort0,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001017 let Latency = 6;
1018 let NumMicroOps = 2;
1019 let ResourceCycles = [1,1];
1020}
Craig Topperfc179c62018-03-22 04:23:41 +00001021def: InstRW<[SKLWriteResGroup69], (instregex "MMX_PADDSBirm",
1022 "MMX_PADDSWirm",
1023 "MMX_PADDUSBirm",
1024 "MMX_PADDUSWirm",
1025 "MMX_PAVGBirm",
1026 "MMX_PAVGWirm",
1027 "MMX_PCMPEQBirm",
1028 "MMX_PCMPEQDirm",
1029 "MMX_PCMPEQWirm",
1030 "MMX_PCMPGTBirm",
1031 "MMX_PCMPGTDirm",
1032 "MMX_PCMPGTWirm",
1033 "MMX_PMAXSWirm",
1034 "MMX_PMAXUBirm",
1035 "MMX_PMINSWirm",
1036 "MMX_PMINUBirm",
Craig Topperfc179c62018-03-22 04:23:41 +00001037 "MMX_PSUBSBirm",
1038 "MMX_PSUBSWirm",
1039 "MMX_PSUBUSBirm",
1040 "MMX_PSUBUSWirm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001041
Craig Topper58afb4e2018-03-22 21:10:07 +00001042def SKLWriteResGroup70 : SchedWriteRes<[SKLPort0,SKLPort01]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001043 let Latency = 6;
1044 let NumMicroOps = 2;
1045 let ResourceCycles = [1,1];
1046}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001047def: InstRW<[SKLWriteResGroup70], (instregex "(V?)CVTSD2SI64rr",
1048 "(V?)CVTSD2SIrr",
1049 "(V?)CVTSS2SI64rr",
1050 "(V?)CVTSS2SIrr",
1051 "(V?)CVTTSD2SI64rr",
1052 "(V?)CVTTSD2SIrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001053
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001054def SKLWriteResGroup72 : SchedWriteRes<[SKLPort6,SKLPort23]> {
1055 let Latency = 6;
1056 let NumMicroOps = 2;
1057 let ResourceCycles = [1,1];
1058}
Craig Topperfc179c62018-03-22 04:23:41 +00001059def: InstRW<[SKLWriteResGroup72], (instregex "FARJMP64",
1060 "JMP(16|32|64)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001061
1062def SKLWriteResGroup73 : SchedWriteRes<[SKLPort23,SKLPort05]> {
1063 let Latency = 6;
1064 let NumMicroOps = 2;
1065 let ResourceCycles = [1,1];
1066}
Simon Pilgrim5e492d22018-04-19 17:32:10 +00001067def: InstRW<[SKLWriteResGroup73], (instregex "MMX_PABS(B|D|W)rm",
1068 "MMX_PADD(B|D|Q|W)irm",
Craig Topperfc179c62018-03-22 04:23:41 +00001069 "MMX_PANDNirm",
1070 "MMX_PANDirm",
1071 "MMX_PORirm",
Simon Pilgrim5e492d22018-04-19 17:32:10 +00001072 "MMX_PSIGN(B|D|W)rm",
1073 "MMX_PSUB(B|D|Q|W)irm",
Craig Topperfc179c62018-03-22 04:23:41 +00001074 "MMX_PXORirm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001075
1076def SKLWriteResGroup74 : SchedWriteRes<[SKLPort23,SKLPort06]> {
1077 let Latency = 6;
1078 let NumMicroOps = 2;
1079 let ResourceCycles = [1,1];
1080}
Simon Pilgrimeb609092018-04-23 22:19:55 +00001081def: InstRW<[SKLWriteResGroup74], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001082def: InstRW<[SKLWriteResGroup74, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
1083 ADCX32rm, ADCX64rm,
1084 ADOX32rm, ADOX64rm,
1085 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001086
1087def SKLWriteResGroup75 : SchedWriteRes<[SKLPort23,SKLPort15]> {
1088 let Latency = 6;
1089 let NumMicroOps = 2;
1090 let ResourceCycles = [1,1];
1091}
Craig Topperfc179c62018-03-22 04:23:41 +00001092def: InstRW<[SKLWriteResGroup75], (instregex "ANDN(32|64)rm",
1093 "BLSI(32|64)rm",
1094 "BLSMSK(32|64)rm",
1095 "BLSR(32|64)rm",
Craig Topperfc179c62018-03-22 04:23:41 +00001096 "MOVBE(16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001097
1098def SKLWriteResGroup76 : SchedWriteRes<[SKLPort23,SKLPort0156]> {
1099 let Latency = 6;
1100 let NumMicroOps = 2;
1101 let ResourceCycles = [1,1];
1102}
Craig Topper2d451e72018-03-18 08:38:06 +00001103def: InstRW<[SKLWriteResGroup76], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001104def: InstRW<[SKLWriteResGroup76], (instregex "POP(16|32|64)rmr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001105
Craig Topper58afb4e2018-03-22 21:10:07 +00001106def SKLWriteResGroup78 : SchedWriteRes<[SKLPort5,SKLPort01]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001107 let Latency = 6;
1108 let NumMicroOps = 3;
1109 let ResourceCycles = [2,1];
1110}
Craig Topperfc179c62018-03-22 04:23:41 +00001111def: InstRW<[SKLWriteResGroup78], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001112
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001113def SKLWriteResGroup79 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001114 let Latency = 6;
1115 let NumMicroOps = 4;
1116 let ResourceCycles = [1,2,1];
1117}
Craig Topperfc179c62018-03-22 04:23:41 +00001118def: InstRW<[SKLWriteResGroup79], (instregex "SHLD(16|32|64)rrCL",
1119 "SHRD(16|32|64)rrCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001120
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001121def SKLWriteResGroup80 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001122 let Latency = 6;
1123 let NumMicroOps = 4;
1124 let ResourceCycles = [1,1,1,1];
1125}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001126def: InstRW<[SKLWriteResGroup80], (instregex "SLDT(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001127
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001128def SKLWriteResGroup82 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06]> {
1129 let Latency = 6;
1130 let NumMicroOps = 4;
1131 let ResourceCycles = [1,1,1,1];
1132}
Craig Topperfc179c62018-03-22 04:23:41 +00001133def: InstRW<[SKLWriteResGroup82], (instregex "BTC(16|32|64)mi8",
1134 "BTR(16|32|64)mi8",
1135 "BTS(16|32|64)mi8",
1136 "SAR(8|16|32|64)m1",
1137 "SAR(8|16|32|64)mi",
1138 "SHL(8|16|32|64)m1",
1139 "SHL(8|16|32|64)mi",
1140 "SHR(8|16|32|64)m1",
1141 "SHR(8|16|32|64)mi")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001142
1143def SKLWriteResGroup83 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort0156]> {
1144 let Latency = 6;
1145 let NumMicroOps = 4;
1146 let ResourceCycles = [1,1,1,1];
1147}
Craig Topperf0d04262018-04-06 16:16:48 +00001148def: InstRW<[SKLWriteResGroup83], (instregex "POP(16|32|64)rmm",
1149 "PUSH(16|32|64)rmm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001150
1151def SKLWriteResGroup84 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001152 let Latency = 6;
1153 let NumMicroOps = 6;
1154 let ResourceCycles = [1,5];
1155}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001156def: InstRW<[SKLWriteResGroup84], (instregex "STD")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001157
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001158def SKLWriteResGroup85 : SchedWriteRes<[SKLPort23]> {
1159 let Latency = 7;
1160 let NumMicroOps = 1;
1161 let ResourceCycles = [1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001162}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001163def: InstRW<[SKLWriteResGroup85], (instregex "LD_F(32|64|80)m",
Craig Topperfc179c62018-03-22 04:23:41 +00001164 "VBROADCASTF128",
1165 "VBROADCASTI128",
1166 "VBROADCASTSDYrm",
1167 "VBROADCASTSSYrm",
1168 "VLDDQUYrm",
1169 "VMOVAPDYrm",
1170 "VMOVAPSYrm",
1171 "VMOVDDUPYrm",
1172 "VMOVDQAYrm",
1173 "VMOVDQUYrm",
1174 "VMOVNTDQAYrm",
1175 "VMOVSHDUPYrm",
1176 "VMOVSLDUPYrm",
1177 "VMOVUPDYrm",
1178 "VMOVUPSYrm",
1179 "VPBROADCASTDYrm",
1180 "VPBROADCASTQYrm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001181
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001182def SKLWriteResGroup86 : SchedWriteRes<[SKLPort0,SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001183 let Latency = 7;
1184 let NumMicroOps = 2;
1185 let ResourceCycles = [1,1];
1186}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001187def: InstRW<[SKLWriteResGroup86], (instregex "VCVTDQ2PDYrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001188
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001189def SKLWriteResGroup88 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1190 let Latency = 7;
1191 let NumMicroOps = 2;
1192 let ResourceCycles = [1,1];
1193}
Simon Pilgrim819f2182018-05-02 17:58:50 +00001194def: InstRW<[SKLWriteResGroup88], (instregex "(V?)PACKSSDWrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001195 "(V?)PACKSSWBrm",
1196 "(V?)PACKUSDWrm",
1197 "(V?)PACKUSWBrm",
1198 "(V?)PALIGNRrmi",
Craig Topperfc179c62018-03-22 04:23:41 +00001199 "VPBROADCASTBrm",
1200 "VPBROADCASTWrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001201 "(V?)PSHUFDmi",
1202 "(V?)PSHUFHWmi",
1203 "(V?)PSHUFLWmi",
1204 "(V?)PUNPCKHBWrm",
1205 "(V?)PUNPCKHDQrm",
1206 "(V?)PUNPCKHQDQrm",
1207 "(V?)PUNPCKHWDrm",
1208 "(V?)PUNPCKLBWrm",
1209 "(V?)PUNPCKLDQrm",
1210 "(V?)PUNPCKLQDQrm",
Simon Pilgrim819f2182018-05-02 17:58:50 +00001211 "(V?)PUNPCKLWDrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001212
Simon Pilgrim6732f6e2018-05-02 18:48:23 +00001213def SKLWriteResGroup88a : SchedWriteRes<[SKLPort5,SKLPort23]> {
1214 let Latency = 6;
1215 let NumMicroOps = 2;
1216 let ResourceCycles = [1,1];
1217}
1218def: InstRW<[SKLWriteResGroup88a], (instregex "MMX_PSHUFBrm")>;
1219
Craig Topper58afb4e2018-03-22 21:10:07 +00001220def SKLWriteResGroup89 : SchedWriteRes<[SKLPort5,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001221 let Latency = 7;
1222 let NumMicroOps = 2;
1223 let ResourceCycles = [1,1];
1224}
Craig Topperfc179c62018-03-22 04:23:41 +00001225def: InstRW<[SKLWriteResGroup89], (instregex "VCVTPD2DQYrr",
1226 "VCVTPD2PSYrr",
1227 "VCVTPH2PSYrr",
1228 "VCVTPS2PDYrr",
1229 "VCVTPS2PHYrr",
1230 "VCVTTPD2DQYrr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001231
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001232def SKLWriteResGroup91 : SchedWriteRes<[SKLPort23,SKLPort015]> {
1233 let Latency = 7;
1234 let NumMicroOps = 2;
1235 let ResourceCycles = [1,1];
1236}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001237def: InstRW<[SKLWriteResGroup91], (instregex "(V?)INSERTF128rm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001238 "(V?)INSERTI128rm",
1239 "(V?)MASKMOVPDrm",
1240 "(V?)MASKMOVPSrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001241 "(V?)PADDBrm",
1242 "(V?)PADDDrm",
1243 "(V?)PADDQrm",
1244 "(V?)PADDWrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001245 "(V?)PBLENDDrmi",
1246 "(V?)PMASKMOVDrm",
1247 "(V?)PMASKMOVQrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001248 "(V?)PSUBBrm",
1249 "(V?)PSUBDrm",
1250 "(V?)PSUBQrm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001251 "(V?)PSUBWrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001252
1253def SKLWriteResGroup92 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1254 let Latency = 7;
1255 let NumMicroOps = 3;
1256 let ResourceCycles = [2,1];
1257}
Craig Topperfc179c62018-03-22 04:23:41 +00001258def: InstRW<[SKLWriteResGroup92], (instregex "MMX_PACKSSDWirm",
1259 "MMX_PACKSSWBirm",
1260 "MMX_PACKUSWBirm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001261
1262def SKLWriteResGroup93 : SchedWriteRes<[SKLPort23,SKLPort06]> {
1263 let Latency = 7;
1264 let NumMicroOps = 3;
1265 let ResourceCycles = [1,2];
1266}
Craig Topperf4cd9082018-01-19 05:47:32 +00001267def: InstRW<[SKLWriteResGroup93], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001268
1269def SKLWriteResGroup94 : SchedWriteRes<[SKLPort23,SKLPort0156]> {
1270 let Latency = 7;
1271 let NumMicroOps = 3;
1272 let ResourceCycles = [1,2];
1273}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001274def: InstRW<[SKLWriteResGroup94], (instrs LEAVE, LEAVE64,
1275 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001276
Craig Topper58afb4e2018-03-22 21:10:07 +00001277def SKLWriteResGroup95 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort01]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001278 let Latency = 7;
1279 let NumMicroOps = 3;
1280 let ResourceCycles = [1,1,1];
1281}
Craig Topperfc179c62018-03-22 04:23:41 +00001282def: InstRW<[SKLWriteResGroup95], (instregex "(V?)CVTTSS2SI64rr",
1283 "(V?)CVTTSS2SIrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001284
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001285def SKLWriteResGroup96 : SchedWriteRes<[SKLPort0,SKLPort23,SKLPort05]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001286 let Latency = 7;
1287 let NumMicroOps = 3;
1288 let ResourceCycles = [1,1,1];
1289}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001290def: InstRW<[SKLWriteResGroup96], (instregex "FLDCW16m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001291
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001292def SKLWriteResGroup98 : SchedWriteRes<[SKLPort6,SKLPort23,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001293 let Latency = 7;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001294 let NumMicroOps = 3;
1295 let ResourceCycles = [1,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001296}
Craig Topperfc179c62018-03-22 04:23:41 +00001297def: InstRW<[SKLWriteResGroup98], (instregex "LRETQ",
1298 "RETQ")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001299
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001300def SKLWriteResGroup100 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06]> {
1301 let Latency = 7;
1302 let NumMicroOps = 5;
1303 let ResourceCycles = [1,1,1,2];
1304}
Craig Topperfc179c62018-03-22 04:23:41 +00001305def: InstRW<[SKLWriteResGroup100], (instregex "ROL(8|16|32|64)m1",
1306 "ROL(8|16|32|64)mi",
1307 "ROR(8|16|32|64)m1",
1308 "ROR(8|16|32|64)mi")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001309
1310def SKLWriteResGroup101 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort0156]> {
1311 let Latency = 7;
1312 let NumMicroOps = 5;
1313 let ResourceCycles = [1,1,1,2];
1314}
Craig Topper13a16502018-03-19 00:56:09 +00001315def: InstRW<[SKLWriteResGroup101], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001316
1317def SKLWriteResGroup102 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
1318 let Latency = 7;
1319 let NumMicroOps = 5;
1320 let ResourceCycles = [1,1,1,1,1];
1321}
Craig Topperfc179c62018-03-22 04:23:41 +00001322def: InstRW<[SKLWriteResGroup102], (instregex "CALL(16|32|64)m",
1323 "FARCALL64")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001324
1325def SKLWriteResGroup103 : SchedWriteRes<[SKLPort6,SKLPort06,SKLPort15,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001326 let Latency = 7;
1327 let NumMicroOps = 7;
1328 let ResourceCycles = [1,3,1,2];
1329}
Craig Topper2d451e72018-03-18 08:38:06 +00001330def: InstRW<[SKLWriteResGroup103], (instrs LOOP)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001331
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001332def SKLWriteResGroup106 : SchedWriteRes<[SKLPort0,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001333 let Latency = 8;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001334 let NumMicroOps = 2;
1335 let ResourceCycles = [1,1];
1336}
Craig Topperfc179c62018-03-22 04:23:41 +00001337def: InstRW<[SKLWriteResGroup106], (instregex "VTESTPDrm",
1338 "VTESTPSrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001339
1340def SKLWriteResGroup107 : SchedWriteRes<[SKLPort1,SKLPort23]> {
1341 let Latency = 8;
1342 let NumMicroOps = 2;
1343 let ResourceCycles = [1,1];
1344}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001345def: InstRW<[SKLWriteResGroup107], (instregex "PDEP(32|64)rm",
1346 "PEXT(32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001347
1348def SKLWriteResGroup107_16 : SchedWriteRes<[SKLPort1, SKLPort0156, SKLPort23]> {
Craig Topperb369cdb2018-01-25 06:57:42 +00001349 let Latency = 8;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001350 let NumMicroOps = 3;
Simon Pilgrim31a96332018-03-24 20:40:14 +00001351 let ResourceCycles = [1,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001352}
Craig Topperf846e2d2018-04-19 05:34:05 +00001353def: InstRW<[SKLWriteResGroup107_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001354
Craig Topperf846e2d2018-04-19 05:34:05 +00001355def SKLWriteResGroup107_16_2 : SchedWriteRes<[SKLPort1, SKLPort06, SKLPort0156, SKLPort23]> {
1356 let Latency = 9;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001357 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001358 let ResourceCycles = [1,1,2,1];
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001359}
Craig Topperfc179c62018-03-22 04:23:41 +00001360def: InstRW<[SKLWriteResGroup107_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001361
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001362def SKLWriteResGroup108 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1363 let Latency = 8;
1364 let NumMicroOps = 2;
1365 let ResourceCycles = [1,1];
1366}
Craig Topperfc179c62018-03-22 04:23:41 +00001367def: InstRW<[SKLWriteResGroup108], (instregex "FCOM32m",
1368 "FCOM64m",
1369 "FCOMP32m",
1370 "FCOMP64m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001371 "MMX_PSADBWirm", // TODO - SKLWriteResGroup120??
Craig Topperfc179c62018-03-22 04:23:41 +00001372 "VPBROADCASTBYrm",
1373 "VPBROADCASTWYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001374 "VPMOVSXBDYrm",
1375 "VPMOVSXBQYrm",
Simon Pilgrim6732f6e2018-05-02 18:48:23 +00001376 "VPMOVSXWQYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001377
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001378def SKLWriteResGroup110 : SchedWriteRes<[SKLPort23,SKLPort015]> {
1379 let Latency = 8;
1380 let NumMicroOps = 2;
1381 let ResourceCycles = [1,1];
1382}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001383def: InstRW<[SKLWriteResGroup110], (instregex "VMASKMOVPDYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001384 "VMASKMOVPSYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001385 "VPADDBYrm",
1386 "VPADDDYrm",
1387 "VPADDQYrm",
1388 "VPADDWYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001389 "VPBLENDDYrmi",
1390 "VPMASKMOVDYrm",
1391 "VPMASKMOVQYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001392 "VPSUBBYrm",
1393 "VPSUBDYrm",
1394 "VPSUBQYrm",
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001395 "VPSUBWYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001396
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001397def SKLWriteResGroup112 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1398 let Latency = 8;
1399 let NumMicroOps = 4;
1400 let ResourceCycles = [1,2,1];
1401}
Simon Pilgrim5e492d22018-04-19 17:32:10 +00001402def: InstRW<[SKLWriteResGroup112], (instregex "MMX_PH(ADD|SUB)SWrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001403
1404def SKLWriteResGroup113 : SchedWriteRes<[SKLPort5,SKLPort23,SKLPort05]> {
1405 let Latency = 8;
1406 let NumMicroOps = 4;
1407 let ResourceCycles = [2,1,1];
1408}
Simon Pilgrim5e492d22018-04-19 17:32:10 +00001409def: InstRW<[SKLWriteResGroup113], (instregex "MMX_PH(ADD|SUB)(D|W)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001410
Craig Topper58afb4e2018-03-22 21:10:07 +00001411def SKLWriteResGroup114 : SchedWriteRes<[SKLPort4,SKLPort5,SKLPort237,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001412 let Latency = 8;
1413 let NumMicroOps = 4;
1414 let ResourceCycles = [1,1,1,1];
1415}
1416def: InstRW<[SKLWriteResGroup114], (instregex "VCVTPS2PHYmr")>;
1417
1418def SKLWriteResGroup115 : SchedWriteRes<[SKLPort23,SKLPort237,SKLPort06]> {
1419 let Latency = 8;
1420 let NumMicroOps = 5;
1421 let ResourceCycles = [1,1,3];
1422}
Craig Topper13a16502018-03-19 00:56:09 +00001423def: InstRW<[SKLWriteResGroup115], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001424
1425def SKLWriteResGroup116 : SchedWriteRes<[SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1426 let Latency = 8;
1427 let NumMicroOps = 5;
1428 let ResourceCycles = [1,1,1,2];
1429}
Craig Topperfc179c62018-03-22 04:23:41 +00001430def: InstRW<[SKLWriteResGroup116], (instregex "RCL(8|16|32|64)m1",
1431 "RCL(8|16|32|64)mi",
1432 "RCR(8|16|32|64)m1",
1433 "RCR(8|16|32|64)mi")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001434
1435def SKLWriteResGroup117 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06]> {
1436 let Latency = 8;
1437 let NumMicroOps = 6;
1438 let ResourceCycles = [1,1,1,3];
1439}
Craig Topperfc179c62018-03-22 04:23:41 +00001440def: InstRW<[SKLWriteResGroup117], (instregex "ROL(8|16|32|64)mCL",
1441 "SAR(8|16|32|64)mCL",
1442 "SHL(8|16|32|64)mCL",
1443 "SHR(8|16|32|64)mCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001444
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001445def SKLWriteResGroup119 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1446 let Latency = 8;
1447 let NumMicroOps = 6;
1448 let ResourceCycles = [1,1,1,2,1];
1449}
Craig Topper9f834812018-04-01 21:54:24 +00001450def: InstRW<[SKLWriteResGroup119], (instregex "ADC(8|16|32|64)mi",
Craig Topperfc179c62018-03-22 04:23:41 +00001451 "CMPXCHG(8|16|32|64)rm",
Craig Topperc50570f2018-04-06 17:12:18 +00001452 "SBB(8|16|32|64)mi")>;
1453def: InstRW<[SKLWriteResGroup119, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1454 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001455
1456def SKLWriteResGroup120 : SchedWriteRes<[SKLPort0,SKLPort23]> {
1457 let Latency = 9;
1458 let NumMicroOps = 2;
1459 let ResourceCycles = [1,1];
1460}
Craig Topperfc179c62018-03-22 04:23:41 +00001461def: InstRW<[SKLWriteResGroup120], (instregex "MMX_CVTPI2PSirm",
Craig Topperfc179c62018-03-22 04:23:41 +00001462 "VTESTPDYrm",
1463 "VTESTPSYrm")>;
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
1476def SKLWriteResGroup122 : SchedWriteRes<[SKLPort01,SKLPort23]> {
1477 let Latency = 9;
1478 let NumMicroOps = 2;
1479 let ResourceCycles = [1,1];
1480}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001481def: InstRW<[SKLWriteResGroup122], (instregex "(V?)ADDSDrm",
1482 "(V?)ADDSSrm",
1483 "(V?)CMPSDrm",
1484 "(V?)CMPSSrm",
1485 "(V?)MAX(C?)SDrm",
1486 "(V?)MAX(C?)SSrm",
1487 "(V?)MIN(C?)SDrm",
1488 "(V?)MIN(C?)SSrm",
1489 "(V?)MULSDrm",
1490 "(V?)MULSSrm",
1491 "(V?)SUBSDrm",
1492 "(V?)SUBSSrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001493
Craig Topper58afb4e2018-03-22 21:10:07 +00001494def SKLWriteResGroup123 : SchedWriteRes<[SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001495 let Latency = 9;
1496 let NumMicroOps = 2;
1497 let ResourceCycles = [1,1];
1498}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001499def: InstRW<[SKLWriteResGroup123], (instregex "MMX_CVTPS2PIirm",
Craig Topperfc179c62018-03-22 04:23:41 +00001500 "MMX_CVTTPS2PIirm",
Craig Topperfc179c62018-03-22 04:23:41 +00001501 "VCVTPH2PSrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001502 "(V?)CVTPS2PDrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001503
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001504def SKLWriteResGroup126 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1505 let Latency = 9;
1506 let NumMicroOps = 3;
1507 let ResourceCycles = [1,1,1];
1508}
Craig Topperfc179c62018-03-22 04:23:41 +00001509def: InstRW<[SKLWriteResGroup126], (instregex "(V?)PTESTrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001510
1511def SKLWriteResGroup127 : SchedWriteRes<[SKLPort1,SKLPort5,SKLPort23]> {
1512 let Latency = 9;
1513 let NumMicroOps = 3;
1514 let ResourceCycles = [1,1,1];
1515}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001516def: InstRW<[SKLWriteResGroup127], (instrs IMUL64m, MUL64m, MULX64rm)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001517
1518def SKLWriteResGroup128 : SchedWriteRes<[SKLPort5,SKLPort01,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001519 let Latency = 9;
1520 let NumMicroOps = 4;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001521 let ResourceCycles = [2,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001522}
Craig Topperfc179c62018-03-22 04:23:41 +00001523def: InstRW<[SKLWriteResGroup128], (instregex "(V?)PHADDSWrm",
1524 "(V?)PHSUBSWrm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001525
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001526def SKLWriteResGroup130 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort0156]> {
1527 let Latency = 9;
1528 let NumMicroOps = 4;
1529 let ResourceCycles = [1,1,1,1];
1530}
Craig Topperfc179c62018-03-22 04:23:41 +00001531def: InstRW<[SKLWriteResGroup130], (instregex "SHLD(16|32|64)mri8",
1532 "SHRD(16|32|64)mri8")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001533
1534def SKLWriteResGroup131 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort23,SKLPort0156]> {
1535 let Latency = 9;
1536 let NumMicroOps = 5;
1537 let ResourceCycles = [1,2,1,1];
1538}
Craig Topperfc179c62018-03-22 04:23:41 +00001539def: InstRW<[SKLWriteResGroup131], (instregex "LAR(16|32|64)rm",
1540 "LSL(16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001541
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001542def SKLWriteResGroup133 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1543 let Latency = 10;
1544 let NumMicroOps = 2;
1545 let ResourceCycles = [1,1];
1546}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001547def: InstRW<[SKLWriteResGroup133], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1548 "ILD_F(16|32|64)m",
Simon Pilgrime480ed02018-05-07 18:25:19 +00001549 "VPCMPGTQYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001550
1551def SKLWriteResGroup134 : SchedWriteRes<[SKLPort01,SKLPort23]> {
1552 let Latency = 10;
1553 let NumMicroOps = 2;
1554 let ResourceCycles = [1,1];
1555}
Simon Pilgrime93fd5f2018-05-02 09:18:49 +00001556def: InstRW<[SKLWriteResGroup134], (instregex "(V?)CVTDQ2PSrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001557 "(V?)CVTPH2PSYrm",
1558 "(V?)CVTPS2DQrm",
1559 "(V?)CVTSS2SDrm",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001560 "(V?)CVTTPS2DQrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001561
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001562def SKLWriteResGroup138 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1563 let Latency = 10;
1564 let NumMicroOps = 3;
1565 let ResourceCycles = [1,1,1];
1566}
Craig Topperfc179c62018-03-22 04:23:41 +00001567def: InstRW<[SKLWriteResGroup138], (instregex "MMX_CVTPI2PDirm",
1568 "VPTESTYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001569
Craig Topper58afb4e2018-03-22 21:10:07 +00001570def SKLWriteResGroup139 : SchedWriteRes<[SKLPort5,SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001571 let Latency = 10;
1572 let NumMicroOps = 3;
1573 let ResourceCycles = [1,1,1];
1574}
Craig Topperfc179c62018-03-22 04:23:41 +00001575def: InstRW<[SKLWriteResGroup139], (instregex "(V?)CVTSD2SSrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001576
1577def SKLWriteResGroup140 : SchedWriteRes<[SKLPort5,SKLPort01,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001578 let Latency = 10;
1579 let NumMicroOps = 4;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001580 let ResourceCycles = [2,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001581}
Craig Topperfc179c62018-03-22 04:23:41 +00001582def: InstRW<[SKLWriteResGroup140], (instregex "VPHADDSWYrm",
1583 "VPHSUBSWYrm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001584
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001585def SKLWriteResGroup142 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort06,SKLPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001586 let Latency = 9;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001587 let NumMicroOps = 4;
1588 let ResourceCycles = [1,1,1,1];
1589}
Craig Topperf846e2d2018-04-19 05:34:05 +00001590def: InstRW<[SKLWriteResGroup142], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001591
1592def SKLWriteResGroup143 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1593 let Latency = 10;
1594 let NumMicroOps = 8;
1595 let ResourceCycles = [1,1,1,1,1,3];
1596}
Craig Topper13a16502018-03-19 00:56:09 +00001597def: InstRW<[SKLWriteResGroup143], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001598
Craig Topper8104f262018-04-02 05:33:28 +00001599def SKLWriteResGroup145 : SchedWriteRes<[SKLPort0,SKLFPDivider]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001600 let Latency = 11;
1601 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001602 let ResourceCycles = [1,3];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001603}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001604def : SchedAlias<WriteFDivX, SKLWriteResGroup145>; // TODO - convert to ZnWriteResFpuPair
Craig Topper8104f262018-04-02 05:33:28 +00001605
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001606def SKLWriteResGroup146 : SchedWriteRes<[SKLPort0,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001607 let Latency = 11;
1608 let NumMicroOps = 2;
1609 let ResourceCycles = [1,1];
1610}
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +00001611def: InstRW<[SKLWriteResGroup146], (instregex "MUL_F(32|64)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001612
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001613def SKLWriteResGroup147 : SchedWriteRes<[SKLPort01,SKLPort23]> {
1614 let Latency = 11;
1615 let NumMicroOps = 2;
1616 let ResourceCycles = [1,1];
1617}
Simon Pilgrime93fd5f2018-05-02 09:18:49 +00001618def: InstRW<[SKLWriteResGroup147], (instregex "VCVTDQ2PSYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001619 "VCVTPS2DQYrm",
1620 "VCVTPS2PDYrm",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001621 "VCVTTPS2DQYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001622
1623def SKLWriteResGroup149 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1624 let Latency = 11;
1625 let NumMicroOps = 3;
1626 let ResourceCycles = [2,1];
1627}
Craig Topperfc179c62018-03-22 04:23:41 +00001628def: InstRW<[SKLWriteResGroup149], (instregex "FICOM16m",
1629 "FICOM32m",
1630 "FICOMP16m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001631 "FICOMP32m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001632
1633def SKLWriteResGroup150 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1634 let Latency = 11;
1635 let NumMicroOps = 3;
1636 let ResourceCycles = [1,1,1];
1637}
Craig Topperfc179c62018-03-22 04:23:41 +00001638def: InstRW<[SKLWriteResGroup150], (instregex "(V?)CVTDQ2PDrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001639
Craig Topper58afb4e2018-03-22 21:10:07 +00001640def SKLWriteResGroup151 : SchedWriteRes<[SKLPort0,SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001641 let Latency = 11;
1642 let NumMicroOps = 3;
1643 let ResourceCycles = [1,1,1];
1644}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001645def: InstRW<[SKLWriteResGroup151], (instregex "(V?)CVTSD2SI64rm",
1646 "(V?)CVTSD2SIrm",
1647 "(V?)CVTSS2SI64rm",
1648 "(V?)CVTSS2SIrm",
1649 "(V?)CVTTSD2SI64rm",
1650 "(V?)CVTTSD2SIrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001651 "VCVTTSS2SI64rm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001652 "(V?)CVTTSS2SIrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001653
Craig Topper58afb4e2018-03-22 21:10:07 +00001654def SKLWriteResGroup152 : SchedWriteRes<[SKLPort5,SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001655 let Latency = 11;
1656 let NumMicroOps = 3;
1657 let ResourceCycles = [1,1,1];
1658}
Craig Topperfc179c62018-03-22 04:23:41 +00001659def: InstRW<[SKLWriteResGroup152], (instregex "CVTPD2DQrm",
1660 "CVTPD2PSrm",
1661 "CVTTPD2DQrm",
1662 "MMX_CVTPD2PIirm",
1663 "MMX_CVTTPD2PIirm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001664
1665def SKLWriteResGroup153 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1666 let Latency = 11;
1667 let NumMicroOps = 6;
1668 let ResourceCycles = [1,1,1,2,1];
1669}
Craig Topperfc179c62018-03-22 04:23:41 +00001670def: InstRW<[SKLWriteResGroup153], (instregex "SHLD(16|32|64)mrCL",
1671 "SHRD(16|32|64)mrCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001672
1673def SKLWriteResGroup154 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001674 let Latency = 11;
1675 let NumMicroOps = 7;
1676 let ResourceCycles = [2,3,2];
1677}
Craig Topperfc179c62018-03-22 04:23:41 +00001678def: InstRW<[SKLWriteResGroup154], (instregex "RCL(16|32|64)rCL",
1679 "RCR(16|32|64)rCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001680
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001681def SKLWriteResGroup155 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort15,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001682 let Latency = 11;
1683 let NumMicroOps = 9;
1684 let ResourceCycles = [1,5,1,2];
1685}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001686def: InstRW<[SKLWriteResGroup155], (instregex "RCL8rCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001687
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001688def SKLWriteResGroup156 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001689 let Latency = 11;
1690 let NumMicroOps = 11;
1691 let ResourceCycles = [2,9];
1692}
Craig Topperfc179c62018-03-22 04:23:41 +00001693def: InstRW<[SKLWriteResGroup156], (instrs LOOPE, LOOPNE)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001694
Craig Topper58afb4e2018-03-22 21:10:07 +00001695def SKLWriteResGroup160 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001696 let Latency = 12;
1697 let NumMicroOps = 4;
1698 let ResourceCycles = [1,1,1,1];
1699}
1700def: InstRW<[SKLWriteResGroup160], (instregex "CVTTSS2SI64rm")>;
1701
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001702def SKLWriteResGroup162 : SchedWriteRes<[SKLPort5,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001703 let Latency = 13;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001704 let NumMicroOps = 3;
1705 let ResourceCycles = [2,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001706}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001707def: InstRW<[SKLWriteResGroup162], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001708
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001709def SKLWriteResGroup163 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1710 let Latency = 13;
1711 let NumMicroOps = 3;
1712 let ResourceCycles = [1,1,1];
1713}
1714def: InstRW<[SKLWriteResGroup163], (instregex "VCVTDQ2PDYrm")>;
1715
Craig Topper8104f262018-04-02 05:33:28 +00001716def SKLWriteResGroup166 : SchedWriteRes<[SKLPort0,SKLFPDivider]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001717 let Latency = 14;
1718 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001719 let ResourceCycles = [1,3];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001720}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001721def : SchedAlias<WriteFDiv64, SKLWriteResGroup166>; // TODO - convert to ZnWriteResFpuPair
1722def : SchedAlias<WriteFDiv64X, SKLWriteResGroup166>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001723
Craig Topper8104f262018-04-02 05:33:28 +00001724def SKLWriteResGroup166_1 : SchedWriteRes<[SKLPort0,SKLFPDivider]> {
1725 let Latency = 14;
1726 let NumMicroOps = 1;
1727 let ResourceCycles = [1,5];
1728}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001729def : SchedAlias<WriteFDiv64Y, SKLWriteResGroup166_1>; // TODO - convert to ZnWriteResFpuPair
Craig Topper8104f262018-04-02 05:33:28 +00001730
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001731def SKLWriteResGroup169 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1732 let Latency = 14;
1733 let NumMicroOps = 3;
1734 let ResourceCycles = [1,1,1];
1735}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001736def: InstRW<[SKLWriteResGroup169], (instregex "MUL_FI(16|32)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001737
1738def SKLWriteResGroup170 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort15,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001739 let Latency = 14;
1740 let NumMicroOps = 10;
1741 let ResourceCycles = [2,4,1,3];
1742}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001743def: InstRW<[SKLWriteResGroup170], (instregex "RCR8rCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001744
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001745def SKLWriteResGroup171 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001746 let Latency = 15;
1747 let NumMicroOps = 1;
1748 let ResourceCycles = [1];
1749}
Craig Topperfc179c62018-03-22 04:23:41 +00001750def: InstRW<[SKLWriteResGroup171], (instregex "DIVR_FPrST0",
1751 "DIVR_FST0r",
1752 "DIVR_FrST0")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001753
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001754def SKLWriteResGroup174 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort06,SKLPort15,SKLPort0156]> {
1755 let Latency = 15;
1756 let NumMicroOps = 10;
1757 let ResourceCycles = [1,1,1,5,1,1];
1758}
Craig Topper13a16502018-03-19 00:56:09 +00001759def: InstRW<[SKLWriteResGroup174], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001760
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001761def SKLWriteResGroup177 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06,SKLPort15,SKLPort0156]> {
1762 let Latency = 16;
1763 let NumMicroOps = 14;
1764 let ResourceCycles = [1,1,1,4,2,5];
1765}
1766def: InstRW<[SKLWriteResGroup177], (instregex "CMPXCHG8B")>;
1767
1768def SKLWriteResGroup178 : SchedWriteRes<[SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001769 let Latency = 16;
1770 let NumMicroOps = 16;
1771 let ResourceCycles = [16];
1772}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001773def: InstRW<[SKLWriteResGroup178], (instrs VZEROALL)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001774
Craig Topper8104f262018-04-02 05:33:28 +00001775def SKLWriteResGroup179 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001776 let Latency = 17;
1777 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001778 let ResourceCycles = [1,1,5];
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001779}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001780def : SchedAlias<WriteFDivXLd, SKLWriteResGroup179>; // TODO - convert to ZnWriteResFpuPair
Craig Topper8104f262018-04-02 05:33:28 +00001781
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001782def SKLWriteResGroup180 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort05,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001783 let Latency = 17;
1784 let NumMicroOps = 15;
1785 let ResourceCycles = [2,1,2,4,2,4];
1786}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001787def: InstRW<[SKLWriteResGroup180], (instrs XCH_F)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001788
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001789def SKLWriteResGroup184 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001790 let Latency = 18;
1791 let NumMicroOps = 8;
1792 let ResourceCycles = [1,1,1,5];
1793}
Craig Topperfc179c62018-03-22 04:23:41 +00001794def: InstRW<[SKLWriteResGroup184], (instrs CPUID, RDTSC)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001795
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001796def SKLWriteResGroup185 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort06,SKLPort15,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001797 let Latency = 18;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001798 let NumMicroOps = 11;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001799 let ResourceCycles = [2,1,1,4,1,2];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001800}
Craig Topper13a16502018-03-19 00:56:09 +00001801def: InstRW<[SKLWriteResGroup185], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001802
Craig Topper8104f262018-04-02 05:33:28 +00001803def SKLWriteResGroup186 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001804 let Latency = 19;
1805 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001806 let ResourceCycles = [1,1,4];
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001807}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001808def : SchedAlias<WriteFDiv64Ld, SKLWriteResGroup186>; // TODO - convert to ZnWriteResFpuPair
Craig Topper8104f262018-04-02 05:33:28 +00001809
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001810def SKLWriteResGroup189 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001811 let Latency = 20;
1812 let NumMicroOps = 1;
1813 let ResourceCycles = [1];
1814}
Craig Topperfc179c62018-03-22 04:23:41 +00001815def: InstRW<[SKLWriteResGroup189], (instregex "DIV_FPrST0",
1816 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001817 "DIV_FrST0")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001818
Craig Topper8104f262018-04-02 05:33:28 +00001819def SKLWriteResGroup190 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001820 let Latency = 20;
1821 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001822 let ResourceCycles = [1,1,4];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001823}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001824def : SchedAlias<WriteFDiv64XLd, SKLWriteResGroup190>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001825
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001826def SKLWriteResGroup192 : SchedWriteRes<[SKLPort4,SKLPort5,SKLPort6,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1827 let Latency = 20;
1828 let NumMicroOps = 8;
1829 let ResourceCycles = [1,1,1,1,1,1,2];
1830}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001831def: InstRW<[SKLWriteResGroup192], (instrs INSB, INSL, INSW)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001832
1833def SKLWriteResGroup193 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001834 let Latency = 20;
1835 let NumMicroOps = 10;
1836 let ResourceCycles = [1,2,7];
1837}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001838def: InstRW<[SKLWriteResGroup193], (instregex "MWAITrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001839
Craig Topper8104f262018-04-02 05:33:28 +00001840def SKLWriteResGroup195 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001841 let Latency = 21;
1842 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001843 let ResourceCycles = [1,1,8];
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001844}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001845def : SchedAlias<WriteFDiv64YLd, SKLWriteResGroup195>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001846
1847def SKLWriteResGroup196 : SchedWriteRes<[SKLPort0,SKLPort23]> {
1848 let Latency = 22;
1849 let NumMicroOps = 2;
1850 let ResourceCycles = [1,1];
1851}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001852def: InstRW<[SKLWriteResGroup196], (instregex "DIV_F(32|64)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001853
1854def SKLWriteResGroup196_1 : SchedWriteRes<[SKLPort0, SKLPort23, SKLPort5, SKLPort015]> {
1855 let Latency = 22;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001856 let NumMicroOps = 5;
1857 let ResourceCycles = [1,2,1,1];
1858}
Craig Topper17a31182017-12-16 18:35:29 +00001859def: InstRW<[SKLWriteResGroup196_1], (instrs VGATHERDPSrm,
1860 VGATHERDPDrm,
1861 VGATHERQPDrm,
1862 VGATHERQPSrm,
1863 VPGATHERDDrm,
1864 VPGATHERDQrm,
1865 VPGATHERQDrm,
1866 VPGATHERQQrm)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001867
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001868def SKLWriteResGroup196_2 : SchedWriteRes<[SKLPort0, SKLPort23, SKLPort5, SKLPort015]> {
1869 let Latency = 25;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001870 let NumMicroOps = 5;
1871 let ResourceCycles = [1,2,1,1];
1872}
Craig Topper17a31182017-12-16 18:35:29 +00001873def: InstRW<[SKLWriteResGroup196_2], (instrs VGATHERDPSYrm,
1874 VGATHERQPDYrm,
1875 VGATHERQPSYrm,
1876 VPGATHERDDYrm,
1877 VPGATHERDQYrm,
1878 VPGATHERQDYrm,
1879 VPGATHERQQYrm,
1880 VGATHERDPDYrm)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001881
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001882def SKLWriteResGroup198 : SchedWriteRes<[SKLPort0,SKLPort4,SKLPort5,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1883 let Latency = 23;
1884 let NumMicroOps = 19;
1885 let ResourceCycles = [2,1,4,1,1,4,6];
1886}
1887def: InstRW<[SKLWriteResGroup198], (instregex "CMPXCHG16B")>;
1888
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001889def SKLWriteResGroup202 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1890 let Latency = 25;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001891 let NumMicroOps = 3;
1892 let ResourceCycles = [1,1,1];
1893}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001894def: InstRW<[SKLWriteResGroup202], (instregex "DIV_FI(16|32)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001895
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001896def SKLWriteResGroup206 : SchedWriteRes<[SKLPort0,SKLPort23]> {
1897 let Latency = 27;
1898 let NumMicroOps = 2;
1899 let ResourceCycles = [1,1];
1900}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001901def: InstRW<[SKLWriteResGroup206], (instregex "DIVR_F(32|64)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001902
1903def SKLWriteResGroup207 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23,SKLPort0156]> {
1904 let Latency = 28;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001905 let NumMicroOps = 8;
1906 let ResourceCycles = [2,4,1,1];
1907}
Craig Topper13a16502018-03-19 00:56:09 +00001908def: InstRW<[SKLWriteResGroup207], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001909
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001910def SKLWriteResGroup208 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001911 let Latency = 30;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001912 let NumMicroOps = 3;
1913 let ResourceCycles = [1,1,1];
1914}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001915def: InstRW<[SKLWriteResGroup208], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001916
1917def SKLWriteResGroup209 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort23,SKLPort06,SKLPort0156]> {
1918 let Latency = 35;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001919 let NumMicroOps = 23;
1920 let ResourceCycles = [1,5,3,4,10];
1921}
Craig Topperfc179c62018-03-22 04:23:41 +00001922def: InstRW<[SKLWriteResGroup209], (instregex "IN(8|16|32)ri",
1923 "IN(8|16|32)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001924
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001925def SKLWriteResGroup210 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1926 let Latency = 35;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001927 let NumMicroOps = 23;
1928 let ResourceCycles = [1,5,2,1,4,10];
1929}
Craig Topperfc179c62018-03-22 04:23:41 +00001930def: InstRW<[SKLWriteResGroup210], (instregex "OUT(8|16|32)ir",
1931 "OUT(8|16|32)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001932
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001933def SKLWriteResGroup211 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort23,SKLPort0156]> {
1934 let Latency = 37;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001935 let NumMicroOps = 31;
1936 let ResourceCycles = [1,8,1,21];
1937}
Craig Topper391c6f92017-12-10 01:24:08 +00001938def: InstRW<[SKLWriteResGroup211], (instregex "XRSTOR(64)?")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001939
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001940def SKLWriteResGroup212 : SchedWriteRes<[SKLPort1,SKLPort4,SKLPort5,SKLPort6,SKLPort23,SKLPort237,SKLPort15,SKLPort0156]> {
1941 let Latency = 40;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001942 let NumMicroOps = 18;
1943 let ResourceCycles = [1,1,2,3,1,1,1,8];
1944}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001945def: InstRW<[SKLWriteResGroup212], (instregex "VMCLEARm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001946
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001947def SKLWriteResGroup213 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
1948 let Latency = 41;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001949 let NumMicroOps = 39;
1950 let ResourceCycles = [1,10,1,1,26];
1951}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001952def: InstRW<[SKLWriteResGroup213], (instregex "XSAVE64")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001953
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001954def SKLWriteResGroup214 : SchedWriteRes<[SKLPort5,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001955 let Latency = 42;
1956 let NumMicroOps = 22;
1957 let ResourceCycles = [2,20];
1958}
Craig Topper2d451e72018-03-18 08:38:06 +00001959def: InstRW<[SKLWriteResGroup214], (instrs RDTSCP)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001960
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001961def SKLWriteResGroup215 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
1962 let Latency = 42;
1963 let NumMicroOps = 40;
1964 let ResourceCycles = [1,11,1,1,26];
1965}
Craig Topper391c6f92017-12-10 01:24:08 +00001966def: InstRW<[SKLWriteResGroup215], (instregex "^XSAVE$", "XSAVEC", "XSAVES")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001967
1968def SKLWriteResGroup216 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
1969 let Latency = 46;
1970 let NumMicroOps = 44;
1971 let ResourceCycles = [1,11,1,1,30];
1972}
1973def: InstRW<[SKLWriteResGroup216], (instregex "XSAVEOPT")>;
1974
1975def SKLWriteResGroup217 : SchedWriteRes<[SKLPort0,SKLPort23,SKLPort05,SKLPort06,SKLPort0156]> {
1976 let Latency = 62;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001977 let NumMicroOps = 64;
1978 let ResourceCycles = [2,8,5,10,39];
1979}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001980def: InstRW<[SKLWriteResGroup217], (instregex "FLDENVm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001981
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001982def SKLWriteResGroup218 : SchedWriteRes<[SKLPort0,SKLPort6,SKLPort23,SKLPort05,SKLPort06,SKLPort15,SKLPort0156]> {
1983 let Latency = 63;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001984 let NumMicroOps = 88;
1985 let ResourceCycles = [4,4,31,1,2,1,45];
1986}
Craig Topper2d451e72018-03-18 08:38:06 +00001987def: InstRW<[SKLWriteResGroup218], (instrs FXRSTOR64)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001988
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001989def SKLWriteResGroup219 : SchedWriteRes<[SKLPort0,SKLPort6,SKLPort23,SKLPort05,SKLPort06,SKLPort15,SKLPort0156]> {
1990 let Latency = 63;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001991 let NumMicroOps = 90;
1992 let ResourceCycles = [4,2,33,1,2,1,47];
1993}
Craig Topper2d451e72018-03-18 08:38:06 +00001994def: InstRW<[SKLWriteResGroup219], (instrs FXRSTOR)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001995
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001996def SKLWriteResGroup220 : SchedWriteRes<[SKLPort5,SKLPort05,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001997 let Latency = 75;
1998 let NumMicroOps = 15;
1999 let ResourceCycles = [6,3,6];
2000}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00002001def: InstRW<[SKLWriteResGroup220], (instrs FNINIT)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002002
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002003def SKLWriteResGroup221 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort05,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002004 let Latency = 76;
2005 let NumMicroOps = 32;
2006 let ResourceCycles = [7,2,8,3,1,11];
2007}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002008def: InstRW<[SKLWriteResGroup221], (instregex "DIV(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002009
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002010def SKLWriteResGroup222 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002011 let Latency = 102;
2012 let NumMicroOps = 66;
2013 let ResourceCycles = [4,2,4,8,14,34];
2014}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002015def: InstRW<[SKLWriteResGroup222], (instregex "IDIV(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002016
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002017def SKLWriteResGroup223 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort4,SKLPort5,SKLPort6,SKLPort237,SKLPort06,SKLPort0156]> {
2018 let Latency = 106;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002019 let NumMicroOps = 100;
2020 let ResourceCycles = [9,1,11,16,1,11,21,30];
2021}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002022def: InstRW<[SKLWriteResGroup223], (instregex "FSTENVm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002023
2024} // SchedModel