blob: 077eeed90d4b045dbd61632a6b9ef5410224182f [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 Pilgrim21caf012018-05-01 18:22:53 +0000162defm : SKLWriteResPair<WriteFDiv, [SKLPort0], 12, [1], 1, 5>; // 10-14 cycles. // Floating point division.
163defm : SKLWriteResPair<WriteFDivY, [SKLPort0], 12, [1], 1, 7>; // 10-14 cycles. // Floating point division (YMM/ZMM).
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000164
165defm : SKLWriteResPair<WriteFSqrt, [SKLPort0,SKLFPDivider], 12, [1,3], 1, 5>; // Floating point square root.
166defm : SKLWriteResPair<WriteFSqrtX, [SKLPort0,SKLFPDivider], 12, [1,3], 1, 6>; // Floating point square root (XMM).
167defm : SKLWriteResPair<WriteFSqrtY, [SKLPort0,SKLFPDivider], 12, [1,6], 1, 7>; // Floating point square root (YMM).
168defm : SKLWriteResPair<WriteFSqrtZ, [SKLPort0,SKLFPDivider], 12, [1,6], 1, 7>; // Floating point square root (ZMM).
169defm : SKLWriteResPair<WriteFSqrt64, [SKLPort0,SKLFPDivider], 18, [1,6], 1, 5>; // Floating point double square root.
170defm : SKLWriteResPair<WriteFSqrt64X, [SKLPort0,SKLFPDivider], 18, [1,6], 1, 6>; // Floating point double square root (XMM).
171defm : SKLWriteResPair<WriteFSqrt64Y, [SKLPort0,SKLFPDivider], 18, [1,12],1, 7>; // Floating point double square root (YMM).
172defm : SKLWriteResPair<WriteFSqrt64Z, [SKLPort0,SKLFPDivider], 18, [1,12],1, 7>; // Floating point double square root (ZMM).
173defm : SKLWriteResPair<WriteFSqrt80, [SKLPort0,SKLFPDivider], 21, [1,7]>; // Floating point long double square root.
174
Simon Pilgrimc7088682018-05-01 18:06:07 +0000175defm : SKLWriteResPair<WriteFRcp, [SKLPort0], 4, [1], 1, 5>; // Floating point reciprocal estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000176defm : SKLWriteResPair<WriteFRcpX, [SKLPort0], 4, [1], 1, 6>; // Floating point reciprocal estimate (XMM).
177defm : SKLWriteResPair<WriteFRcpY, [SKLPort0], 4, [1], 1, 7>; // Floating point reciprocal estimate (YMM/ZMM).
178
Simon Pilgrimc7088682018-05-01 18:06:07 +0000179defm : SKLWriteResPair<WriteFRsqrt, [SKLPort0], 4, [1], 1, 5>; // Floating point reciprocal square root estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000180defm : SKLWriteResPair<WriteFRsqrtX,[SKLPort0], 4, [1], 1, 6>; // Floating point reciprocal square root estimate (XMM).
181defm : SKLWriteResPair<WriteFRsqrtY,[SKLPort0], 4, [1], 1, 7>; // Floating point reciprocal square root estimate (YMM/ZMM).
182
Simon Pilgrim67cc2462018-05-04 15:20:18 +0000183defm : SKLWriteResPair<WriteFMA, [SKLPort01], 4, [1], 1, 5>; // Fused Multiply Add.
184defm : SKLWriteResPair<WriteFMAX, [SKLPort01], 4, [1], 1, 6>; // Fused Multiply Add (XMM).
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000185defm : SKLWriteResPair<WriteFMAY, [SKLPort01], 4, [1], 1, 7>; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000186defm : SKLWriteResPair<WriteDPPD, [SKLPort5,SKLPort01], 9, [1,2], 3, 6>; // Floating point double dot product.
187defm : SKLWriteResPair<WriteDPPS, [SKLPort5,SKLPort01], 13, [1,3], 4, 6>; // Floating point single dot product.
188defm : SKLWriteResPair<WriteDPPSY, [SKLPort5,SKLPort01], 13, [1,3], 4, 7>; // Floating point single dot product (YMM).
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000189defm : SKLWriteResPair<WriteFSign, [SKLPort0], 1>; // Floating point fabs/fchs.
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000190defm : SKLWriteResPair<WriteFRnd, [SKLPort01], 8, [2], 2, 6>; // Floating point rounding.
191defm : SKLWriteResPair<WriteFRndY, [SKLPort01], 8, [2], 2, 7>; // Floating point rounding (YMM/ZMM).
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000192defm : SKLWriteResPair<WriteFLogic, [SKLPort015], 1, [1], 1, 6>; // Floating point and/or/xor logicals.
193defm : SKLWriteResPair<WriteFLogicY, [SKLPort015], 1, [1], 1, 7>; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000194defm : SKLWriteResPair<WriteFShuffle, [SKLPort5], 1, [1], 1, 6>; // Floating point vector shuffles.
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000195defm : SKLWriteResPair<WriteFShuffleY, [SKLPort5], 1, [1], 1, 7>; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000196defm : SKLWriteResPair<WriteFVarShuffle, [SKLPort5], 1, [1], 1, 6>; // Floating point vector shuffles.
197defm : SKLWriteResPair<WriteFVarShuffleY, [SKLPort5], 1, [1], 1, 7>; // Floating point vector shuffles.
Simon Pilgrim06e16542018-04-22 18:35:53 +0000198defm : SKLWriteResPair<WriteFBlend, [SKLPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000199defm : SKLWriteResPair<WriteFBlendY, [SKLPort015], 1, [1], 1, 7>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000200defm : SKLWriteResPair<WriteFVarBlend, [SKLPort015], 2, [2], 2, 6>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000201defm : SKLWriteResPair<WriteFVarBlendY,[SKLPort015], 2, [2], 2, 7>; // Fp vector variable blends.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000202
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000203def : WriteRes<WriteCvtF2FSt, [SKLPort4,SKLPort5,SKLPort237,SKLPort01]> {
204 let Latency = 6;
205 let NumMicroOps = 4;
206 let ResourceCycles = [1,1,1,1];
207}
208
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000209// FMA Scheduling helper class.
210// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
211
212// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000213def : WriteRes<WriteVecLoad, [SKLPort23]> { let Latency = 6; }
214def : WriteRes<WriteVecStore, [SKLPort237, SKLPort4]>;
215def : WriteRes<WriteVecMove, [SKLPort015]>;
216
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000217defm : SKLWriteResPair<WriteVecALU, [SKLPort01], 1, [1], 1, 6>; // Vector integer ALU op, no logicals.
218defm : SKLWriteResPair<WriteVecALUY, [SKLPort01], 1, [1], 1, 7>; // Vector integer ALU op, no logicals (YMM/ZMM).
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000219defm : SKLWriteResPair<WriteVecLogic, [SKLPort015], 1, [1], 1, 6>; // Vector integer and/or/xor.
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000220defm : SKLWriteResPair<WriteVecLogicY,[SKLPort015], 1, [1], 1, 7>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000221defm : SKLWriteResPair<WriteVecIMul, [SKLPort0] , 4, [1], 1, 5>; // Vector integer multiply.
222defm : SKLWriteResPair<WriteVecIMulX, [SKLPort01], 4, [1], 1, 6>; // Vector integer multiply (XMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000223defm : SKLWriteResPair<WriteVecIMulY, [SKLPort01], 4, [1], 1, 7>; // Vector integer multiply (YMM/ZMM).
224defm : SKLWriteResPair<WritePMULLD, [SKLPort01], 10, [2], 2, 6>; // Vector PMULLD.
225defm : SKLWriteResPair<WritePMULLDY, [SKLPort01], 10, [2], 2, 7>; // Vector PMULLD (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000226defm : SKLWriteResPair<WriteShuffle, [SKLPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000227defm : SKLWriteResPair<WriteShuffleY, [SKLPort5], 1, [1], 1, 7>; // Vector shuffles (YMM/ZMM).
228defm : SKLWriteResPair<WriteVarShuffle, [SKLPort5], 1, [1], 1, 6>; // Vector shuffles.
229defm : SKLWriteResPair<WriteVarShuffleY, [SKLPort5], 1, [1], 1, 7>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim06e16542018-04-22 18:35:53 +0000230defm : SKLWriteResPair<WriteBlend, [SKLPort5], 1, [1], 1, 6>; // Vector blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000231defm : SKLWriteResPair<WriteBlendY, [SKLPort5], 1, [1], 1, 7>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000232defm : SKLWriteResPair<WriteVarBlend, [SKLPort015], 2, [2], 2, 6>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000233defm : SKLWriteResPair<WriteVarBlendY, [SKLPort015], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000234defm : SKLWriteResPair<WriteMPSAD, [SKLPort5], 4, [2], 2, 6>; // Vector MPSAD.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000235defm : SKLWriteResPair<WriteMPSADY, [SKLPort5], 4, [2], 2, 7>; // Vector MPSAD.
236defm : SKLWriteResPair<WritePSADBW, [SKLPort5], 3, [1], 1, 6>; // Vector PSADBW.
237defm : SKLWriteResPair<WritePSADBWY, [SKLPort5], 3, [1], 1, 7>; // Vector PSADBW.
Simon Pilgrim27bc83e2018-04-24 18:49:25 +0000238defm : SKLWriteResPair<WritePHMINPOS, [SKLPort01], 4, [1], 1, 6>; // Vector PHMINPOS.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000239
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000240// Vector integer shifts.
241defm : SKLWriteResPair<WriteVecShift, [SKLPort0], 1, [1], 1, 5>;
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000242defm : X86WriteRes<WriteVecShiftX, [SKLPort5,SKLPort01], 2, [1,1], 2>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000243defm : X86WriteRes<WriteVecShiftY, [SKLPort5,SKLPort01], 4, [1,1], 2>;
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000244defm : X86WriteRes<WriteVecShiftXLd, [SKLPort01,SKLPort23], 7, [1,1], 2>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000245defm : X86WriteRes<WriteVecShiftYLd, [SKLPort01,SKLPort23], 8, [1,1], 2>;
246
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000247defm : SKLWriteResPair<WriteVecShiftImm, [SKLPort0], 1, [1], 1, 5>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000248defm : SKLWriteResPair<WriteVecShiftImmX, [SKLPort01], 1, [1], 1, 6>; // Vector integer immediate shifts (XMM).
249defm : SKLWriteResPair<WriteVecShiftImmY, [SKLPort01], 1, [1], 1, 7>; // Vector integer immediate shifts (YMM/ZMM).
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000250defm : SKLWriteResPair<WriteVarVecShift, [SKLPort01], 1, [1], 1, 6>; // Variable vector shifts.
251defm : SKLWriteResPair<WriteVarVecShiftY, [SKLPort01], 1, [1], 1, 7>; // Variable vector shifts (YMM/ZMM).
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000252
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000253// Vector insert/extract operations.
254def : WriteRes<WriteVecInsert, [SKLPort5]> {
255 let Latency = 2;
256 let NumMicroOps = 2;
257 let ResourceCycles = [2];
258}
259def : WriteRes<WriteVecInsertLd, [SKLPort5,SKLPort23]> {
260 let Latency = 6;
261 let NumMicroOps = 2;
262}
Simon Pilgrim819f2182018-05-02 17:58:50 +0000263def: InstRW<[WriteVecInsertLd], (instregex "(V?)MOV(H|L)(PD|PS)rm")>;
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000264
265def : WriteRes<WriteVecExtract, [SKLPort0,SKLPort5]> {
266 let Latency = 3;
267 let NumMicroOps = 2;
268}
269def : WriteRes<WriteVecExtractSt, [SKLPort4,SKLPort5,SKLPort237]> {
270 let Latency = 2;
271 let NumMicroOps = 3;
272}
273
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000274// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000275defm : SKLWriteResPair<WriteCvtF2I, [SKLPort1], 3>; // Float -> Integer.
276defm : SKLWriteResPair<WriteCvtI2F, [SKLPort1], 4>; // Integer -> Float.
277defm : SKLWriteResPair<WriteCvtF2F, [SKLPort1], 3>; // Float -> Float size conversion.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000278
279// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000280
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000281// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000282def : WriteRes<WritePCmpIStrM, [SKLPort0]> {
283 let Latency = 10;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000284 let NumMicroOps = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000285 let ResourceCycles = [3];
286}
287def : WriteRes<WritePCmpIStrMLd, [SKLPort0, SKLPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000288 let Latency = 16;
289 let NumMicroOps = 4;
290 let ResourceCycles = [3,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000291}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000292
293// Packed Compare Explicit Length Strings, Return Mask
294def : WriteRes<WritePCmpEStrM, [SKLPort0, SKLPort5, SKLPort015, SKLPort0156]> {
295 let Latency = 19;
296 let NumMicroOps = 9;
297 let ResourceCycles = [4,3,1,1];
298}
299def : WriteRes<WritePCmpEStrMLd, [SKLPort0, SKLPort5,SKLPort23, SKLPort015, SKLPort0156]> {
300 let Latency = 25;
301 let NumMicroOps = 10;
302 let ResourceCycles = [4,3,1,1,1];
303}
304
305// Packed Compare Implicit Length Strings, Return Index
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000306def : WriteRes<WritePCmpIStrI, [SKLPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000307 let Latency = 10;
308 let NumMicroOps = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000309 let ResourceCycles = [3];
310}
311def : WriteRes<WritePCmpIStrILd, [SKLPort0, SKLPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000312 let Latency = 16;
313 let NumMicroOps = 4;
314 let ResourceCycles = [3,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000315}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000316
317// Packed Compare Explicit Length Strings, Return Index
318def : WriteRes<WritePCmpEStrI, [SKLPort0, SKLPort5, SKLPort0156]> {
319 let Latency = 18;
320 let NumMicroOps = 8;
321 let ResourceCycles = [4,3,1];
322}
323def : WriteRes<WritePCmpEStrILd, [SKLPort0, SKLPort5, SKLPort23, SKLPort0156]> {
324 let Latency = 24;
325 let NumMicroOps = 9;
326 let ResourceCycles = [4,3,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000327}
328
Simon Pilgrima2f26782018-03-27 20:38:54 +0000329// MOVMSK Instructions.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000330def : WriteRes<WriteFMOVMSK, [SKLPort0]> { let Latency = 2; }
331def : WriteRes<WriteVecMOVMSK, [SKLPort0]> { let Latency = 2; }
332def : WriteRes<WriteVecMOVMSKY, [SKLPort0]> { let Latency = 2; }
333def : WriteRes<WriteMMXMOVMSK, [SKLPort0]> { let Latency = 2; }
Simon Pilgrima2f26782018-03-27 20:38:54 +0000334
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000335// AES instructions.
Simon Pilgrim7684e052018-03-22 13:18:08 +0000336def : WriteRes<WriteAESDecEnc, [SKLPort0]> { // Decryption, encryption.
337 let Latency = 4;
338 let NumMicroOps = 1;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000339 let ResourceCycles = [1];
340}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000341def : WriteRes<WriteAESDecEncLd, [SKLPort0, SKLPort23]> {
342 let Latency = 10;
343 let NumMicroOps = 2;
344 let ResourceCycles = [1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000345}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000346
347def : WriteRes<WriteAESIMC, [SKLPort0]> { // InvMixColumn.
348 let Latency = 8;
349 let NumMicroOps = 2;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000350 let ResourceCycles = [2];
351}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000352def : WriteRes<WriteAESIMCLd, [SKLPort0, SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000353 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000354 let NumMicroOps = 3;
355 let ResourceCycles = [2,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000356}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000357
358def : WriteRes<WriteAESKeyGen, [SKLPort0, SKLPort5, SKLPort015]> { // Key Generation.
359 let Latency = 20;
360 let NumMicroOps = 11;
361 let ResourceCycles = [3,6,2];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000362}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000363def : WriteRes<WriteAESKeyGenLd, [SKLPort0, SKLPort5, SKLPort23, SKLPort015]> {
364 let Latency = 25;
365 let NumMicroOps = 11;
366 let ResourceCycles = [3,6,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000367}
368
369// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000370def : WriteRes<WriteCLMul, [SKLPort5]> {
371 let Latency = 6;
372 let NumMicroOps = 1;
373 let ResourceCycles = [1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000374}
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000375def : WriteRes<WriteCLMulLd, [SKLPort5, SKLPort23]> {
376 let Latency = 12;
377 let NumMicroOps = 2;
378 let ResourceCycles = [1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000379}
380
381// Catch-all for expensive system instructions.
382def : WriteRes<WriteSystem, [SKLPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
383
384// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000385defm : SKLWriteResPair<WriteFShuffle256, [SKLPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
386defm : SKLWriteResPair<WriteFVarShuffle256, [SKLPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
387defm : SKLWriteResPair<WriteShuffle256, [SKLPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
388defm : SKLWriteResPair<WriteVarShuffle256, [SKLPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000389
390// Old microcoded instructions that nobody use.
391def : WriteRes<WriteMicrocoded, [SKLPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
392
393// Fence instructions.
394def : WriteRes<WriteFence, [SKLPort23, SKLPort4]>;
395
Craig Topper05242bf2018-04-21 18:07:36 +0000396// Load/store MXCSR.
397def : WriteRes<WriteLDMXCSR, [SKLPort0,SKLPort23,SKLPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
398def : WriteRes<WriteSTMXCSR, [SKLPort4,SKLPort5,SKLPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
399
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000400// Nop, not very useful expect it provides a model for nops!
401def : WriteRes<WriteNop, []>;
402
403////////////////////////////////////////////////////////////////////////////////
404// Horizontal add/sub instructions.
405////////////////////////////////////////////////////////////////////////////////
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000406
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000407defm : SKLWriteResPair<WriteFHAdd, [SKLPort5,SKLPort01], 6, [2,1], 3, 6>;
408defm : SKLWriteResPair<WriteFHAddY, [SKLPort5,SKLPort01], 6, [2,1], 3, 7>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000409defm : SKLWriteResPair<WritePHAdd, [SKLPort5,SKLPort015], 3, [2,1], 3, 6>;
410defm : SKLWriteResPair<WritePHAddY, [SKLPort5,SKLPort015], 3, [2,1], 3, 7>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000411
412// Remaining instrs.
413
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000414def SKLWriteResGroup1 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000415 let Latency = 1;
416 let NumMicroOps = 1;
417 let ResourceCycles = [1];
418}
Craig Topperfc179c62018-03-22 04:23:41 +0000419def: InstRW<[SKLWriteResGroup1], (instregex "MMX_PADDSBirr",
420 "MMX_PADDSWirr",
421 "MMX_PADDUSBirr",
422 "MMX_PADDUSWirr",
423 "MMX_PAVGBirr",
424 "MMX_PAVGWirr",
425 "MMX_PCMPEQBirr",
426 "MMX_PCMPEQDirr",
427 "MMX_PCMPEQWirr",
428 "MMX_PCMPGTBirr",
429 "MMX_PCMPGTDirr",
430 "MMX_PCMPGTWirr",
431 "MMX_PMAXSWirr",
432 "MMX_PMAXUBirr",
433 "MMX_PMINSWirr",
434 "MMX_PMINUBirr",
Craig Topperfc179c62018-03-22 04:23:41 +0000435 "MMX_PSUBSBirr",
436 "MMX_PSUBSWirr",
437 "MMX_PSUBUSBirr",
438 "MMX_PSUBUSWirr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000439
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000440def SKLWriteResGroup3 : SchedWriteRes<[SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000441 let Latency = 1;
442 let NumMicroOps = 1;
443 let ResourceCycles = [1];
444}
Craig Topperfc179c62018-03-22 04:23:41 +0000445def: InstRW<[SKLWriteResGroup3], (instregex "COMP_FST0r",
446 "COM_FST0r",
Craig Topperfc179c62018-03-22 04:23:41 +0000447 "MMX_MOVD64rr",
448 "MMX_MOVD64to64rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000449 "UCOM_FPr",
450 "UCOM_Fr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000451 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000452 "(V?)MOVDI2PDIrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000453
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000454def SKLWriteResGroup4 : SchedWriteRes<[SKLPort6]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000455 let Latency = 1;
456 let NumMicroOps = 1;
457 let ResourceCycles = [1];
458}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000459def: InstRW<[SKLWriteResGroup4], (instregex "JMP(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000460
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000461def SKLWriteResGroup6 : SchedWriteRes<[SKLPort05]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000462 let Latency = 1;
463 let NumMicroOps = 1;
464 let ResourceCycles = [1];
465}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000466def: InstRW<[SKLWriteResGroup6], (instrs FINCSTP, FNOP)>;
467def: InstRW<[SKLWriteResGroup6], (instregex "MMX_MOVQ64rr",
Simon Pilgrim5e492d22018-04-19 17:32:10 +0000468 "MMX_PABS(B|D|W)rr",
469 "MMX_PADD(B|D|Q|W)irr",
Craig Topperfc179c62018-03-22 04:23:41 +0000470 "MMX_PANDNirr",
471 "MMX_PANDirr",
472 "MMX_PORirr",
Simon Pilgrim5e492d22018-04-19 17:32:10 +0000473 "MMX_PSIGN(B|D|W)rr",
474 "MMX_PSUB(B|D|Q|W)irr",
Craig Topperfc179c62018-03-22 04:23:41 +0000475 "MMX_PXORirr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000476
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000477def SKLWriteResGroup7 : SchedWriteRes<[SKLPort06]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000478 let Latency = 1;
479 let NumMicroOps = 1;
480 let ResourceCycles = [1];
481}
Simon Pilgrim455d0b22018-04-23 13:24:17 +0000482def: InstRW<[SKLWriteResGroup7], (instrs CDQ, CQO, CLAC, STAC)>;
Craig Topperfc179c62018-03-22 04:23:41 +0000483def: InstRW<[SKLWriteResGroup7], (instregex "ADC(16|32|64)ri",
484 "ADC(16|32|64)i",
485 "ADC(8|16|32|64)rr",
486 "ADCX(32|64)rr",
487 "ADOX(32|64)rr",
488 "BT(16|32|64)ri8",
489 "BT(16|32|64)rr",
490 "BTC(16|32|64)ri8",
491 "BTC(16|32|64)rr",
492 "BTR(16|32|64)ri8",
493 "BTR(16|32|64)rr",
494 "BTS(16|32|64)ri8",
495 "BTS(16|32|64)rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000496 "SBB(16|32|64)ri",
497 "SBB(16|32|64)i",
Simon Pilgrim39d77202018-04-28 15:32:19 +0000498 "SBB(8|16|32|64)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000499
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000500def SKLWriteResGroup8 : SchedWriteRes<[SKLPort15]> {
501 let Latency = 1;
502 let NumMicroOps = 1;
503 let ResourceCycles = [1];
504}
Craig Topperfc179c62018-03-22 04:23:41 +0000505def: InstRW<[SKLWriteResGroup8], (instregex "ANDN(32|64)rr",
506 "BLSI(32|64)rr",
507 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000508 "BLSR(32|64)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000509
510def SKLWriteResGroup9 : SchedWriteRes<[SKLPort015]> {
511 let Latency = 1;
512 let NumMicroOps = 1;
513 let ResourceCycles = [1];
514}
Simon Pilgrim37334ea2018-04-21 21:59:36 +0000515def: InstRW<[SKLWriteResGroup9], (instregex "(V?)PADDB(Y?)rr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000516 "(V?)PADDD(Y?)rr",
517 "(V?)PADDQ(Y?)rr",
518 "(V?)PADDW(Y?)rr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000519 "VPBLENDD(Y?)rri",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000520 "(V?)PSUBB(Y?)rr",
521 "(V?)PSUBD(Y?)rr",
522 "(V?)PSUBQ(Y?)rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000523 "(V?)PSUBW(Y?)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000524
525def SKLWriteResGroup10 : SchedWriteRes<[SKLPort0156]> {
526 let Latency = 1;
527 let NumMicroOps = 1;
528 let ResourceCycles = [1];
529}
Craig Topperfbe31322018-04-05 21:56:19 +0000530def: InstRW<[SKLWriteResGroup10], (instrs CBW, CWDE, CDQE)>;
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000531def: InstRW<[SKLWriteResGroup10], (instrs LAHF, SAHF)>; // TODO: This doesn't match Agner's data
Craig Topperf0d04262018-04-06 16:16:48 +0000532def: InstRW<[SKLWriteResGroup10], (instregex "CLC",
Craig Topperfc179c62018-03-22 04:23:41 +0000533 "CMC",
Craig Topperfc179c62018-03-22 04:23:41 +0000534 "NOOP",
Craig Topperfc179c62018-03-22 04:23:41 +0000535 "SGDT64m",
536 "SIDT64m",
Craig Topperfc179c62018-03-22 04:23:41 +0000537 "SMSW16m",
538 "STC",
539 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000540 "SYSCALL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000541
542def SKLWriteResGroup11 : SchedWriteRes<[SKLPort4,SKLPort237]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000543 let Latency = 1;
544 let NumMicroOps = 2;
545 let ResourceCycles = [1,1];
546}
Craig Topperfc179c62018-03-22 04:23:41 +0000547def: InstRW<[SKLWriteResGroup11], (instregex "FBSTPm",
548 "MMX_MOVD64from64rm",
549 "MMX_MOVD64mr",
550 "MMX_MOVNTQmr",
551 "MMX_MOVQ64mr",
Craig Topperfc179c62018-03-22 04:23:41 +0000552 "MOVNTI_64mr",
553 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000554 "ST_FP(32|64|80)m",
Craig Topperfc179c62018-03-22 04:23:41 +0000555 "VEXTRACTF128mr",
556 "VEXTRACTI128mr",
Craig Topper972bdbd2018-03-25 17:33:14 +0000557 "(V?)MOVAPDYmr",
558 "(V?)MOVAPS(Y?)mr",
559 "(V?)MOVDQA(Y?)mr",
560 "(V?)MOVDQU(Y?)mr",
561 "(V?)MOVHPDmr",
562 "(V?)MOVHPSmr",
563 "(V?)MOVLPDmr",
564 "(V?)MOVLPSmr",
565 "(V?)MOVNTDQ(Y?)mr",
566 "(V?)MOVNTPD(Y?)mr",
567 "(V?)MOVNTPS(Y?)mr",
568 "(V?)MOVPDI2DImr",
569 "(V?)MOVPQI2QImr",
570 "(V?)MOVPQIto64mr",
571 "(V?)MOVSDmr",
572 "(V?)MOVSSmr",
573 "(V?)MOVUPD(Y?)mr",
574 "(V?)MOVUPS(Y?)mr",
Craig Topperfc179c62018-03-22 04:23:41 +0000575 "VMPTRSTm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000576
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000577def SKLWriteResGroup12 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000578 let Latency = 2;
579 let NumMicroOps = 1;
580 let ResourceCycles = [1];
581}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000582def: InstRW<[SKLWriteResGroup12], (instregex "MMX_MOVD64from64rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000583 "MMX_MOVD64grr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000584 "(V?)MOVPDI2DIrr",
585 "(V?)MOVPQIto64rr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000586 "VTESTPD(Y?)rr",
Simon Pilgrim86e3c2692018-04-17 07:22:44 +0000587 "VTESTPS(Y?)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000588
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000589def SKLWriteResGroup13 : SchedWriteRes<[SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000590 let Latency = 2;
591 let NumMicroOps = 2;
592 let ResourceCycles = [2];
593}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000594def: InstRW<[SKLWriteResGroup13], (instregex "MMX_MOVQ2DQrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000595
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000596def SKLWriteResGroup14 : SchedWriteRes<[SKLPort05]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000597 let Latency = 2;
598 let NumMicroOps = 2;
599 let ResourceCycles = [2];
600}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000601def: InstRW<[SKLWriteResGroup14], (instrs FDECSTP)>;
602def: InstRW<[SKLWriteResGroup14], (instregex "MMX_MOVDQ2Qrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000603
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000604def SKLWriteResGroup15 : SchedWriteRes<[SKLPort06]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000605 let Latency = 2;
606 let NumMicroOps = 2;
607 let ResourceCycles = [2];
608}
Craig Topperfc179c62018-03-22 04:23:41 +0000609def: InstRW<[SKLWriteResGroup15], (instregex "CMOV(A|BE)(16|32|64)rr",
610 "ROL(8|16|32|64)r1",
611 "ROL(8|16|32|64)ri",
612 "ROR(8|16|32|64)r1",
613 "ROR(8|16|32|64)ri",
614 "SET(A|BE)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000615
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000616def SKLWriteResGroup17 : SchedWriteRes<[SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000617 let Latency = 2;
618 let NumMicroOps = 2;
619 let ResourceCycles = [2];
620}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000621def: InstRW<[SKLWriteResGroup17], (instrs LFENCE,
622 WAIT,
623 XGETBV)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000624
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000625def SKLWriteResGroup18 : SchedWriteRes<[SKLPort0,SKLPort237]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000626 let Latency = 2;
627 let NumMicroOps = 2;
628 let ResourceCycles = [1,1];
629}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000630def: InstRW<[SKLWriteResGroup18], (instregex "VMASKMOVPD(Y?)mr",
631 "VMASKMOVPS(Y?)mr",
632 "VPMASKMOVD(Y?)mr",
633 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000634
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000635def SKLWriteResGroup20 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000636 let Latency = 2;
637 let NumMicroOps = 2;
638 let ResourceCycles = [1,1];
639}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000640def: InstRW<[SKLWriteResGroup20], (instregex "CLFLUSH")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000641
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000642def SKLWriteResGroup21 : SchedWriteRes<[SKLPort237,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<[SKLWriteResGroup21], (instregex "SFENCE")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000648
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000649def SKLWriteResGroup22 : SchedWriteRes<[SKLPort06,SKLPort15]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000650 let Latency = 2;
651 let NumMicroOps = 2;
652 let ResourceCycles = [1,1];
653}
Craig Topper498875f2018-04-04 17:54:19 +0000654def: InstRW<[SKLWriteResGroup22], (instrs BSWAP64r)>;
655
656def SKLWriteResGroup22_1 : SchedWriteRes<[SKLPort15]> {
657 let Latency = 1;
658 let NumMicroOps = 1;
659 let ResourceCycles = [1];
660}
661def: InstRW<[SKLWriteResGroup22_1], (instrs BSWAP32r)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000662
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000663def SKLWriteResGroup23 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000664 let Latency = 2;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000665 let NumMicroOps = 2;
666 let ResourceCycles = [1,1];
667}
Craig Topper2d451e72018-03-18 08:38:06 +0000668def: InstRW<[SKLWriteResGroup23], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000669def: InstRW<[SKLWriteResGroup23], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topperfc179c62018-03-22 04:23:41 +0000670def: InstRW<[SKLWriteResGroup23], (instregex "ADC8i8",
671 "ADC8ri",
672 "SBB8i8",
673 "SBB8ri")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000674
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000675def SKLWriteResGroup25 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort237]> {
676 let Latency = 2;
677 let NumMicroOps = 3;
678 let ResourceCycles = [1,1,1];
679}
680def: InstRW<[SKLWriteResGroup25], (instregex "FNSTCW16m")>;
681
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000682def SKLWriteResGroup27 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort15]> {
683 let Latency = 2;
684 let NumMicroOps = 3;
685 let ResourceCycles = [1,1,1];
686}
687def: InstRW<[SKLWriteResGroup27], (instregex "MOVBE(16|32|64)mr")>;
688
689def SKLWriteResGroup28 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort0156]> {
690 let Latency = 2;
691 let NumMicroOps = 3;
692 let ResourceCycles = [1,1,1];
693}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000694def: InstRW<[SKLWriteResGroup28], (instrs PUSH16r, PUSH32r, PUSH64r,
695 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topperfc179c62018-03-22 04:23:41 +0000696def: InstRW<[SKLWriteResGroup28], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000697 "PUSH64i8")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000698
699def SKLWriteResGroup29 : SchedWriteRes<[SKLPort1]> {
700 let Latency = 3;
701 let NumMicroOps = 1;
702 let ResourceCycles = [1];
703}
Simon Pilgrime93fd5f2018-05-02 09:18:49 +0000704def: InstRW<[SKLWriteResGroup29], (instregex "CMOV(N?)(B|BE|E|P)_F",
705 "PDEP(32|64)rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000706 "PEXT(32|64)rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000707 "SHLD(16|32|64)rri8",
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000708 "SHRD(16|32|64)rri8")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000709
Clement Courbet327fac42018-03-07 08:14:02 +0000710def SKLWriteResGroup29_16i : SchedWriteRes<[SKLPort1, SKLPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000711 let Latency = 4;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000712 let NumMicroOps = 2;
713 let ResourceCycles = [1,1];
714}
Clement Courbet327fac42018-03-07 08:14:02 +0000715def: InstRW<[SKLWriteResGroup29_16i], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000716
717def SKLWriteResGroup30 : SchedWriteRes<[SKLPort5]> {
718 let Latency = 3;
719 let NumMicroOps = 1;
720 let ResourceCycles = [1];
721}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000722def: InstRW<[SKLWriteResGroup30], (instregex "(ADD|SUB|SUBR)_FPrST0",
723 "(ADD|SUB|SUBR)_FST0r",
724 "(ADD|SUB|SUBR)_FrST0",
Simon Pilgrim74ccc6a2018-04-21 19:11:55 +0000725 "VPBROADCASTBrr",
Simon Pilgrim825ead92018-04-21 20:45:12 +0000726 "VPBROADCASTWrr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000727 "(V?)PCMPGTQ(Y?)rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000728 "VPMOVSXBDYrr",
729 "VPMOVSXBQYrr",
730 "VPMOVSXBWYrr",
731 "VPMOVSXDQYrr",
732 "VPMOVSXWDYrr",
733 "VPMOVSXWQYrr",
734 "VPMOVZXBDYrr",
735 "VPMOVZXBQYrr",
736 "VPMOVZXBWYrr",
737 "VPMOVZXDQYrr",
738 "VPMOVZXWDYrr",
Craig Toppere56a2fc2018-04-17 19:35:19 +0000739 "VPMOVZXWQYrr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000740
741def SKLWriteResGroup31 : SchedWriteRes<[SKLPort0,SKLPort5]> {
742 let Latency = 3;
743 let NumMicroOps = 2;
744 let ResourceCycles = [1,1];
745}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000746def: InstRW<[SKLWriteResGroup31], (instregex "(V?)PTEST(Y?)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000747
748def SKLWriteResGroup32 : SchedWriteRes<[SKLPort0,SKLPort0156]> {
749 let Latency = 3;
750 let NumMicroOps = 2;
751 let ResourceCycles = [1,1];
752}
753def: InstRW<[SKLWriteResGroup32], (instregex "FNSTSW16r")>;
754
755def SKLWriteResGroup33 : SchedWriteRes<[SKLPort06]> {
756 let Latency = 3;
757 let NumMicroOps = 3;
758 let ResourceCycles = [3];
759}
Craig Topperfc179c62018-03-22 04:23:41 +0000760def: InstRW<[SKLWriteResGroup33], (instregex "ROL(8|16|32|64)rCL",
761 "ROR(8|16|32|64)rCL",
762 "SAR(8|16|32|64)rCL",
763 "SHL(8|16|32|64)rCL",
764 "SHR(8|16|32|64)rCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000765
766def SKLWriteResGroup34 : SchedWriteRes<[SKLPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000767 let Latency = 2;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000768 let NumMicroOps = 3;
769 let ResourceCycles = [3];
770}
Craig Topperb5f26592018-04-19 18:00:17 +0000771def: InstRW<[SKLWriteResGroup34], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
772 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
773 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000774
775def SKLWriteResGroup35 : SchedWriteRes<[SKLPort0,SKLPort5]> {
776 let Latency = 3;
777 let NumMicroOps = 3;
778 let ResourceCycles = [1,2];
779}
Simon Pilgrim5e492d22018-04-19 17:32:10 +0000780def: InstRW<[SKLWriteResGroup35], (instregex "MMX_PH(ADD|SUB)SWrr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000781
782def SKLWriteResGroup36 : SchedWriteRes<[SKLPort5,SKLPort01]> {
783 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000784 let NumMicroOps = 3;
785 let ResourceCycles = [2,1];
786}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000787def: InstRW<[SKLWriteResGroup36], (instregex "(V?)PHADDSW(Y?)rr",
788 "(V?)PHSUBSW(Y?)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000789
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000790def SKLWriteResGroup37 : SchedWriteRes<[SKLPort5,SKLPort05]> {
791 let Latency = 3;
792 let NumMicroOps = 3;
793 let ResourceCycles = [2,1];
794}
Simon Pilgrim5e492d22018-04-19 17:32:10 +0000795def: InstRW<[SKLWriteResGroup37], (instregex "MMX_PH(ADD|SUB)(D|W)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000796
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000797def SKLWriteResGroup39 : SchedWriteRes<[SKLPort5,SKLPort0156]> {
798 let Latency = 3;
799 let NumMicroOps = 3;
800 let ResourceCycles = [2,1];
801}
Craig Topperfc179c62018-03-22 04:23:41 +0000802def: InstRW<[SKLWriteResGroup39], (instregex "MMX_PACKSSDWirr",
803 "MMX_PACKSSWBirr",
804 "MMX_PACKUSWBirr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000805
806def SKLWriteResGroup40 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
807 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000808 let NumMicroOps = 3;
809 let ResourceCycles = [1,2];
810}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000811def: InstRW<[SKLWriteResGroup40], (instregex "CLD")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000812
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000813def SKLWriteResGroup41 : SchedWriteRes<[SKLPort237,SKLPort0156]> {
814 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000815 let NumMicroOps = 3;
816 let ResourceCycles = [1,2];
817}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000818def: InstRW<[SKLWriteResGroup41], (instrs MFENCE)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000819
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000820def SKLWriteResGroup42 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
821 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000822 let NumMicroOps = 3;
823 let ResourceCycles = [1,2];
824}
Craig Topperfc179c62018-03-22 04:23:41 +0000825def: InstRW<[SKLWriteResGroup42], (instregex "RCL(8|16|32|64)r1",
826 "RCL(8|16|32|64)ri",
827 "RCR(8|16|32|64)r1",
828 "RCR(8|16|32|64)ri")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000829
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000830def SKLWriteResGroup43 : SchedWriteRes<[SKLPort0,SKLPort4,SKLPort237]> {
831 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000832 let NumMicroOps = 3;
833 let ResourceCycles = [1,1,1];
834}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000835def: InstRW<[SKLWriteResGroup43], (instregex "FNSTSWm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000836
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000837def SKLWriteResGroup44 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort06]> {
838 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000839 let NumMicroOps = 4;
840 let ResourceCycles = [1,1,2];
841}
Craig Topperf4cd9082018-01-19 05:47:32 +0000842def: InstRW<[SKLWriteResGroup44], (instregex "SET(A|BE)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000843
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000844def SKLWriteResGroup45 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort237,SKLPort0156]> {
845 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000846 let NumMicroOps = 4;
847 let ResourceCycles = [1,1,1,1];
848}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000849def: InstRW<[SKLWriteResGroup45], (instregex "CALL(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000850
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000851def SKLWriteResGroup46 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort06,SKLPort0156]> {
852 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000853 let NumMicroOps = 4;
854 let ResourceCycles = [1,1,1,1];
855}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000856def: InstRW<[SKLWriteResGroup46], (instregex "CALL64pcrel32")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000857
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000858def SKLWriteResGroup47 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000859 let Latency = 4;
860 let NumMicroOps = 1;
861 let ResourceCycles = [1];
862}
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000863def: InstRW<[SKLWriteResGroup47], (instregex "MUL_FPrST0",
Craig Topperfc179c62018-03-22 04:23:41 +0000864 "MUL_FST0r",
Simon Pilgrim93b102c2018-04-21 15:16:59 +0000865 "MUL_FrST0")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000866
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000867def SKLWriteResGroup48 : SchedWriteRes<[SKLPort01]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000868 let Latency = 4;
869 let NumMicroOps = 1;
870 let ResourceCycles = [1];
871}
Simon Pilgrime93fd5f2018-05-02 09:18:49 +0000872def: InstRW<[SKLWriteResGroup48], (instregex "(V?)CVTDQ2PS(Y?)rr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000873 "(V?)CVTPS2DQ(Y?)rr",
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000874 "(V?)CVTTPS2DQ(Y?)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000875
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000876def SKLWriteResGroup51 : SchedWriteRes<[SKLPort1,SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000877 let Latency = 4;
878 let NumMicroOps = 2;
879 let ResourceCycles = [1,1];
880}
Craig Topperf846e2d2018-04-19 05:34:05 +0000881def: InstRW<[SKLWriteResGroup51], (instrs IMUL64r, MUL64r, MULX64rr)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000882
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000883def SKLWriteResGroup51_16 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
884 let Latency = 4;
885 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000886 let ResourceCycles = [1,1,2];
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000887}
Craig Topperfc179c62018-03-22 04:23:41 +0000888def: InstRW<[SKLWriteResGroup51_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000889
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000890def SKLWriteResGroup53 : SchedWriteRes<[SKLPort4,SKLPort5,SKLPort237]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000891 let Latency = 4;
892 let NumMicroOps = 3;
893 let ResourceCycles = [1,1,1];
894}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000895def: InstRW<[SKLWriteResGroup53], (instregex "IST(T?)_FP(16|32|64)m",
896 "IST_F(16|32)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000897
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000898def SKLWriteResGroup54 : SchedWriteRes<[SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000899 let Latency = 4;
900 let NumMicroOps = 4;
901 let ResourceCycles = [4];
902}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000903def: InstRW<[SKLWriteResGroup54], (instrs FNCLEX)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000904
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000905def SKLWriteResGroup55 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000906 let Latency = 4;
907 let NumMicroOps = 4;
908 let ResourceCycles = [1,3];
909}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000910def: InstRW<[SKLWriteResGroup55], (instrs PAUSE)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000911
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000912def SKLWriteResGroup56 : SchedWriteRes<[SKLPort015,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000913 let Latency = 4;
914 let NumMicroOps = 4;
915 let ResourceCycles = [1,3];
916}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000917def: InstRW<[SKLWriteResGroup56], (instrs VZEROUPPER)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000918
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000919def SKLWriteResGroup57 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000920 let Latency = 4;
921 let NumMicroOps = 4;
922 let ResourceCycles = [1,1,2];
923}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000924def: InstRW<[SKLWriteResGroup57], (instregex "LAR(16|32|64)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000925
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000926def SKLWriteResGroup58 : SchedWriteRes<[SKLPort23]> {
927 let Latency = 5;
928 let NumMicroOps = 1;
929 let ResourceCycles = [1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000930}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000931def: InstRW<[SKLWriteResGroup58], (instregex "MOVSX(16|32|64)rm16",
Craig Topperfc179c62018-03-22 04:23:41 +0000932 "MOVSX(16|32|64)rm32",
933 "MOVSX(16|32|64)rm8",
934 "MOVZX(16|32|64)rm16",
935 "MOVZX(16|32|64)rm8",
Simon Pilgrim37334ea2018-04-21 21:59:36 +0000936 "(V?)MOVDDUPrm")>; // TODO: Should this be SKLWriteResGroup67?
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000937
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000938def SKLWriteResGroup59 : SchedWriteRes<[SKLPort0,SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000939 let Latency = 5;
940 let NumMicroOps = 2;
941 let ResourceCycles = [1,1];
942}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000943def: InstRW<[SKLWriteResGroup59], (instregex "MMX_CVTPI2PDirr",
944 "(V?)CVTDQ2PDrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000945
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000946def SKLWriteResGroup60 : SchedWriteRes<[SKLPort5,SKLPort015]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000947 let Latency = 5;
948 let NumMicroOps = 2;
949 let ResourceCycles = [1,1];
950}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000951def: InstRW<[SKLWriteResGroup60], (instregex "MMX_CVTPD2PIirr",
Craig Topperfc179c62018-03-22 04:23:41 +0000952 "MMX_CVTPS2PIirr",
953 "MMX_CVTTPD2PIirr",
954 "MMX_CVTTPS2PIirr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000955 "(V?)CVTPD2DQrr",
956 "(V?)CVTPD2PSrr",
Craig Topperfc179c62018-03-22 04:23:41 +0000957 "VCVTPH2PSrr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000958 "(V?)CVTPS2PDrr",
Craig Topperfc179c62018-03-22 04:23:41 +0000959 "VCVTPS2PHrr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000960 "(V?)CVTSD2SSrr",
961 "(V?)CVTSI642SDrr",
962 "(V?)CVTSI2SDrr",
963 "(V?)CVTSI2SSrr",
964 "(V?)CVTSS2SDrr",
965 "(V?)CVTTPD2DQrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000966
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000967def SKLWriteResGroup61 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort06]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000968 let Latency = 5;
969 let NumMicroOps = 3;
970 let ResourceCycles = [1,1,1];
971}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000972def: InstRW<[SKLWriteResGroup61], (instregex "STR(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000973
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000974def SKLWriteResGroup62 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000975 let Latency = 4;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000976 let NumMicroOps = 3;
977 let ResourceCycles = [1,1,1];
978}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000979def: InstRW<[SKLWriteResGroup62], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000980
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000981def SKLWriteResGroup63 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000982 let Latency = 5;
983 let NumMicroOps = 5;
984 let ResourceCycles = [1,4];
985}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000986def: InstRW<[SKLWriteResGroup63], (instregex "XSETBV")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000987
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000988def SKLWriteResGroup64 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000989 let Latency = 5;
990 let NumMicroOps = 5;
991 let ResourceCycles = [2,3];
992}
Craig Topper13a16502018-03-19 00:56:09 +0000993def: InstRW<[SKLWriteResGroup64], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000994
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000995def SKLWriteResGroup65 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000996 let Latency = 5;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000997 let NumMicroOps = 6;
998 let ResourceCycles = [1,1,4];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000999}
Craig Topperfc179c62018-03-22 04:23:41 +00001000def: InstRW<[SKLWriteResGroup65], (instregex "PUSHF16",
1001 "PUSHF64")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001002
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001003def SKLWriteResGroup67 : SchedWriteRes<[SKLPort23]> {
1004 let Latency = 6;
1005 let NumMicroOps = 1;
1006 let ResourceCycles = [1];
1007}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001008def: InstRW<[SKLWriteResGroup67], (instregex "VBROADCASTSSrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001009 "(V?)MOVSHDUPrm",
1010 "(V?)MOVSLDUPrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001011 "VPBROADCASTDrm",
1012 "VPBROADCASTQrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001013
1014def SKLWriteResGroup68 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001015 let Latency = 6;
1016 let NumMicroOps = 2;
1017 let ResourceCycles = [2];
1018}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001019def: InstRW<[SKLWriteResGroup68], (instregex "MMX_CVTPI2PSirr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001020
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001021def SKLWriteResGroup69 : SchedWriteRes<[SKLPort0,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001022 let Latency = 6;
1023 let NumMicroOps = 2;
1024 let ResourceCycles = [1,1];
1025}
Craig Topperfc179c62018-03-22 04:23:41 +00001026def: InstRW<[SKLWriteResGroup69], (instregex "MMX_PADDSBirm",
1027 "MMX_PADDSWirm",
1028 "MMX_PADDUSBirm",
1029 "MMX_PADDUSWirm",
1030 "MMX_PAVGBirm",
1031 "MMX_PAVGWirm",
1032 "MMX_PCMPEQBirm",
1033 "MMX_PCMPEQDirm",
1034 "MMX_PCMPEQWirm",
1035 "MMX_PCMPGTBirm",
1036 "MMX_PCMPGTDirm",
1037 "MMX_PCMPGTWirm",
1038 "MMX_PMAXSWirm",
1039 "MMX_PMAXUBirm",
1040 "MMX_PMINSWirm",
1041 "MMX_PMINUBirm",
Craig Topperfc179c62018-03-22 04:23:41 +00001042 "MMX_PSUBSBirm",
1043 "MMX_PSUBSWirm",
1044 "MMX_PSUBUSBirm",
1045 "MMX_PSUBUSWirm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001046
Craig Topper58afb4e2018-03-22 21:10:07 +00001047def SKLWriteResGroup70 : SchedWriteRes<[SKLPort0,SKLPort01]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001048 let Latency = 6;
1049 let NumMicroOps = 2;
1050 let ResourceCycles = [1,1];
1051}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001052def: InstRW<[SKLWriteResGroup70], (instregex "(V?)CVTSD2SI64rr",
1053 "(V?)CVTSD2SIrr",
1054 "(V?)CVTSS2SI64rr",
1055 "(V?)CVTSS2SIrr",
1056 "(V?)CVTTSD2SI64rr",
1057 "(V?)CVTTSD2SIrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001058
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001059def SKLWriteResGroup72 : SchedWriteRes<[SKLPort6,SKLPort23]> {
1060 let Latency = 6;
1061 let NumMicroOps = 2;
1062 let ResourceCycles = [1,1];
1063}
Craig Topperfc179c62018-03-22 04:23:41 +00001064def: InstRW<[SKLWriteResGroup72], (instregex "FARJMP64",
1065 "JMP(16|32|64)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001066
1067def SKLWriteResGroup73 : SchedWriteRes<[SKLPort23,SKLPort05]> {
1068 let Latency = 6;
1069 let NumMicroOps = 2;
1070 let ResourceCycles = [1,1];
1071}
Simon Pilgrim5e492d22018-04-19 17:32:10 +00001072def: InstRW<[SKLWriteResGroup73], (instregex "MMX_PABS(B|D|W)rm",
1073 "MMX_PADD(B|D|Q|W)irm",
Craig Topperfc179c62018-03-22 04:23:41 +00001074 "MMX_PANDNirm",
1075 "MMX_PANDirm",
1076 "MMX_PORirm",
Simon Pilgrim5e492d22018-04-19 17:32:10 +00001077 "MMX_PSIGN(B|D|W)rm",
1078 "MMX_PSUB(B|D|Q|W)irm",
Craig Topperfc179c62018-03-22 04:23:41 +00001079 "MMX_PXORirm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001080
1081def SKLWriteResGroup74 : SchedWriteRes<[SKLPort23,SKLPort06]> {
1082 let Latency = 6;
1083 let NumMicroOps = 2;
1084 let ResourceCycles = [1,1];
1085}
Simon Pilgrimeb609092018-04-23 22:19:55 +00001086def: InstRW<[SKLWriteResGroup74], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001087def: InstRW<[SKLWriteResGroup74, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
1088 ADCX32rm, ADCX64rm,
1089 ADOX32rm, ADOX64rm,
1090 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001091
1092def SKLWriteResGroup75 : SchedWriteRes<[SKLPort23,SKLPort15]> {
1093 let Latency = 6;
1094 let NumMicroOps = 2;
1095 let ResourceCycles = [1,1];
1096}
Craig Topperfc179c62018-03-22 04:23:41 +00001097def: InstRW<[SKLWriteResGroup75], (instregex "ANDN(32|64)rm",
1098 "BLSI(32|64)rm",
1099 "BLSMSK(32|64)rm",
1100 "BLSR(32|64)rm",
Craig Topperfc179c62018-03-22 04:23:41 +00001101 "MOVBE(16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001102
1103def SKLWriteResGroup76 : SchedWriteRes<[SKLPort23,SKLPort0156]> {
1104 let Latency = 6;
1105 let NumMicroOps = 2;
1106 let ResourceCycles = [1,1];
1107}
Craig Topper2d451e72018-03-18 08:38:06 +00001108def: InstRW<[SKLWriteResGroup76], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001109def: InstRW<[SKLWriteResGroup76], (instregex "POP(16|32|64)rmr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001110
Craig Topper58afb4e2018-03-22 21:10:07 +00001111def SKLWriteResGroup78 : SchedWriteRes<[SKLPort5,SKLPort01]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001112 let Latency = 6;
1113 let NumMicroOps = 3;
1114 let ResourceCycles = [2,1];
1115}
Craig Topperfc179c62018-03-22 04:23:41 +00001116def: InstRW<[SKLWriteResGroup78], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001117
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001118def SKLWriteResGroup79 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001119 let Latency = 6;
1120 let NumMicroOps = 4;
1121 let ResourceCycles = [1,2,1];
1122}
Craig Topperfc179c62018-03-22 04:23:41 +00001123def: InstRW<[SKLWriteResGroup79], (instregex "SHLD(16|32|64)rrCL",
1124 "SHRD(16|32|64)rrCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001125
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001126def SKLWriteResGroup80 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001127 let Latency = 6;
1128 let NumMicroOps = 4;
1129 let ResourceCycles = [1,1,1,1];
1130}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001131def: InstRW<[SKLWriteResGroup80], (instregex "SLDT(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001132
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001133def SKLWriteResGroup82 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06]> {
1134 let Latency = 6;
1135 let NumMicroOps = 4;
1136 let ResourceCycles = [1,1,1,1];
1137}
Craig Topperfc179c62018-03-22 04:23:41 +00001138def: InstRW<[SKLWriteResGroup82], (instregex "BTC(16|32|64)mi8",
1139 "BTR(16|32|64)mi8",
1140 "BTS(16|32|64)mi8",
1141 "SAR(8|16|32|64)m1",
1142 "SAR(8|16|32|64)mi",
1143 "SHL(8|16|32|64)m1",
1144 "SHL(8|16|32|64)mi",
1145 "SHR(8|16|32|64)m1",
1146 "SHR(8|16|32|64)mi")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001147
1148def SKLWriteResGroup83 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort0156]> {
1149 let Latency = 6;
1150 let NumMicroOps = 4;
1151 let ResourceCycles = [1,1,1,1];
1152}
Craig Topperf0d04262018-04-06 16:16:48 +00001153def: InstRW<[SKLWriteResGroup83], (instregex "POP(16|32|64)rmm",
1154 "PUSH(16|32|64)rmm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001155
1156def SKLWriteResGroup84 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001157 let Latency = 6;
1158 let NumMicroOps = 6;
1159 let ResourceCycles = [1,5];
1160}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001161def: InstRW<[SKLWriteResGroup84], (instregex "STD")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001162
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001163def SKLWriteResGroup85 : SchedWriteRes<[SKLPort23]> {
1164 let Latency = 7;
1165 let NumMicroOps = 1;
1166 let ResourceCycles = [1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001167}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001168def: InstRW<[SKLWriteResGroup85], (instregex "LD_F(32|64|80)m",
Craig Topperfc179c62018-03-22 04:23:41 +00001169 "VBROADCASTF128",
1170 "VBROADCASTI128",
1171 "VBROADCASTSDYrm",
1172 "VBROADCASTSSYrm",
1173 "VLDDQUYrm",
1174 "VMOVAPDYrm",
1175 "VMOVAPSYrm",
1176 "VMOVDDUPYrm",
1177 "VMOVDQAYrm",
1178 "VMOVDQUYrm",
1179 "VMOVNTDQAYrm",
1180 "VMOVSHDUPYrm",
1181 "VMOVSLDUPYrm",
1182 "VMOVUPDYrm",
1183 "VMOVUPSYrm",
1184 "VPBROADCASTDYrm",
1185 "VPBROADCASTQYrm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001186
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001187def SKLWriteResGroup86 : SchedWriteRes<[SKLPort0,SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001188 let Latency = 7;
1189 let NumMicroOps = 2;
1190 let ResourceCycles = [1,1];
1191}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001192def: InstRW<[SKLWriteResGroup86], (instregex "VCVTDQ2PDYrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001193
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001194def SKLWriteResGroup88 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1195 let Latency = 7;
1196 let NumMicroOps = 2;
1197 let ResourceCycles = [1,1];
1198}
Simon Pilgrim819f2182018-05-02 17:58:50 +00001199def: InstRW<[SKLWriteResGroup88], (instregex "(V?)PACKSSDWrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001200 "(V?)PACKSSWBrm",
1201 "(V?)PACKUSDWrm",
1202 "(V?)PACKUSWBrm",
1203 "(V?)PALIGNRrmi",
Craig Topperfc179c62018-03-22 04:23:41 +00001204 "VPBROADCASTBrm",
1205 "VPBROADCASTWrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001206 "(V?)PSHUFDmi",
1207 "(V?)PSHUFHWmi",
1208 "(V?)PSHUFLWmi",
1209 "(V?)PUNPCKHBWrm",
1210 "(V?)PUNPCKHDQrm",
1211 "(V?)PUNPCKHQDQrm",
1212 "(V?)PUNPCKHWDrm",
1213 "(V?)PUNPCKLBWrm",
1214 "(V?)PUNPCKLDQrm",
1215 "(V?)PUNPCKLQDQrm",
Simon Pilgrim819f2182018-05-02 17:58:50 +00001216 "(V?)PUNPCKLWDrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001217
Simon Pilgrim6732f6e2018-05-02 18:48:23 +00001218def SKLWriteResGroup88a : SchedWriteRes<[SKLPort5,SKLPort23]> {
1219 let Latency = 6;
1220 let NumMicroOps = 2;
1221 let ResourceCycles = [1,1];
1222}
1223def: InstRW<[SKLWriteResGroup88a], (instregex "MMX_PSHUFBrm")>;
1224
Craig Topper58afb4e2018-03-22 21:10:07 +00001225def SKLWriteResGroup89 : SchedWriteRes<[SKLPort5,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001226 let Latency = 7;
1227 let NumMicroOps = 2;
1228 let ResourceCycles = [1,1];
1229}
Craig Topperfc179c62018-03-22 04:23:41 +00001230def: InstRW<[SKLWriteResGroup89], (instregex "VCVTPD2DQYrr",
1231 "VCVTPD2PSYrr",
1232 "VCVTPH2PSYrr",
1233 "VCVTPS2PDYrr",
1234 "VCVTPS2PHYrr",
1235 "VCVTTPD2DQYrr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001236
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001237def SKLWriteResGroup91 : SchedWriteRes<[SKLPort23,SKLPort015]> {
1238 let Latency = 7;
1239 let NumMicroOps = 2;
1240 let ResourceCycles = [1,1];
1241}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001242def: InstRW<[SKLWriteResGroup91], (instregex "(V?)INSERTF128rm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001243 "(V?)INSERTI128rm",
1244 "(V?)MASKMOVPDrm",
1245 "(V?)MASKMOVPSrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001246 "(V?)PADDBrm",
1247 "(V?)PADDDrm",
1248 "(V?)PADDQrm",
1249 "(V?)PADDWrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001250 "(V?)PBLENDDrmi",
1251 "(V?)PMASKMOVDrm",
1252 "(V?)PMASKMOVQrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001253 "(V?)PSUBBrm",
1254 "(V?)PSUBDrm",
1255 "(V?)PSUBQrm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001256 "(V?)PSUBWrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001257
1258def SKLWriteResGroup92 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1259 let Latency = 7;
1260 let NumMicroOps = 3;
1261 let ResourceCycles = [2,1];
1262}
Craig Topperfc179c62018-03-22 04:23:41 +00001263def: InstRW<[SKLWriteResGroup92], (instregex "MMX_PACKSSDWirm",
1264 "MMX_PACKSSWBirm",
1265 "MMX_PACKUSWBirm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001266
1267def SKLWriteResGroup93 : SchedWriteRes<[SKLPort23,SKLPort06]> {
1268 let Latency = 7;
1269 let NumMicroOps = 3;
1270 let ResourceCycles = [1,2];
1271}
Craig Topperf4cd9082018-01-19 05:47:32 +00001272def: InstRW<[SKLWriteResGroup93], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001273
1274def SKLWriteResGroup94 : SchedWriteRes<[SKLPort23,SKLPort0156]> {
1275 let Latency = 7;
1276 let NumMicroOps = 3;
1277 let ResourceCycles = [1,2];
1278}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001279def: InstRW<[SKLWriteResGroup94], (instrs LEAVE, LEAVE64,
1280 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001281
Craig Topper58afb4e2018-03-22 21:10:07 +00001282def SKLWriteResGroup95 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort01]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001283 let Latency = 7;
1284 let NumMicroOps = 3;
1285 let ResourceCycles = [1,1,1];
1286}
Craig Topperfc179c62018-03-22 04:23:41 +00001287def: InstRW<[SKLWriteResGroup95], (instregex "(V?)CVTTSS2SI64rr",
1288 "(V?)CVTTSS2SIrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001289
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001290def SKLWriteResGroup96 : SchedWriteRes<[SKLPort0,SKLPort23,SKLPort05]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001291 let Latency = 7;
1292 let NumMicroOps = 3;
1293 let ResourceCycles = [1,1,1];
1294}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001295def: InstRW<[SKLWriteResGroup96], (instregex "FLDCW16m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001296
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001297def SKLWriteResGroup98 : SchedWriteRes<[SKLPort6,SKLPort23,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001298 let Latency = 7;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001299 let NumMicroOps = 3;
1300 let ResourceCycles = [1,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001301}
Craig Topperfc179c62018-03-22 04:23:41 +00001302def: InstRW<[SKLWriteResGroup98], (instregex "LRETQ",
1303 "RETQ")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001304
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001305def SKLWriteResGroup100 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06]> {
1306 let Latency = 7;
1307 let NumMicroOps = 5;
1308 let ResourceCycles = [1,1,1,2];
1309}
Craig Topperfc179c62018-03-22 04:23:41 +00001310def: InstRW<[SKLWriteResGroup100], (instregex "ROL(8|16|32|64)m1",
1311 "ROL(8|16|32|64)mi",
1312 "ROR(8|16|32|64)m1",
1313 "ROR(8|16|32|64)mi")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001314
1315def SKLWriteResGroup101 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort0156]> {
1316 let Latency = 7;
1317 let NumMicroOps = 5;
1318 let ResourceCycles = [1,1,1,2];
1319}
Craig Topper13a16502018-03-19 00:56:09 +00001320def: InstRW<[SKLWriteResGroup101], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001321
1322def SKLWriteResGroup102 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
1323 let Latency = 7;
1324 let NumMicroOps = 5;
1325 let ResourceCycles = [1,1,1,1,1];
1326}
Craig Topperfc179c62018-03-22 04:23:41 +00001327def: InstRW<[SKLWriteResGroup102], (instregex "CALL(16|32|64)m",
1328 "FARCALL64")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001329
1330def SKLWriteResGroup103 : SchedWriteRes<[SKLPort6,SKLPort06,SKLPort15,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001331 let Latency = 7;
1332 let NumMicroOps = 7;
1333 let ResourceCycles = [1,3,1,2];
1334}
Craig Topper2d451e72018-03-18 08:38:06 +00001335def: InstRW<[SKLWriteResGroup103], (instrs LOOP)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001336
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001337def SKLWriteResGroup106 : SchedWriteRes<[SKLPort0,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001338 let Latency = 8;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001339 let NumMicroOps = 2;
1340 let ResourceCycles = [1,1];
1341}
Craig Topperfc179c62018-03-22 04:23:41 +00001342def: InstRW<[SKLWriteResGroup106], (instregex "VTESTPDrm",
1343 "VTESTPSrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001344
1345def SKLWriteResGroup107 : SchedWriteRes<[SKLPort1,SKLPort23]> {
1346 let Latency = 8;
1347 let NumMicroOps = 2;
1348 let ResourceCycles = [1,1];
1349}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001350def: InstRW<[SKLWriteResGroup107], (instregex "PDEP(32|64)rm",
1351 "PEXT(32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001352
1353def SKLWriteResGroup107_16 : SchedWriteRes<[SKLPort1, SKLPort0156, SKLPort23]> {
Craig Topperb369cdb2018-01-25 06:57:42 +00001354 let Latency = 8;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001355 let NumMicroOps = 3;
Simon Pilgrim31a96332018-03-24 20:40:14 +00001356 let ResourceCycles = [1,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001357}
Craig Topperf846e2d2018-04-19 05:34:05 +00001358def: InstRW<[SKLWriteResGroup107_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001359
Craig Topperf846e2d2018-04-19 05:34:05 +00001360def SKLWriteResGroup107_16_2 : SchedWriteRes<[SKLPort1, SKLPort06, SKLPort0156, SKLPort23]> {
1361 let Latency = 9;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001362 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001363 let ResourceCycles = [1,1,2,1];
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001364}
Craig Topperfc179c62018-03-22 04:23:41 +00001365def: InstRW<[SKLWriteResGroup107_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001366
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001367def SKLWriteResGroup108 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1368 let Latency = 8;
1369 let NumMicroOps = 2;
1370 let ResourceCycles = [1,1];
1371}
Craig Topperfc179c62018-03-22 04:23:41 +00001372def: InstRW<[SKLWriteResGroup108], (instregex "FCOM32m",
1373 "FCOM64m",
1374 "FCOMP32m",
1375 "FCOMP64m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001376 "MMX_PSADBWirm", // TODO - SKLWriteResGroup120??
Craig Topperfc179c62018-03-22 04:23:41 +00001377 "VPBROADCASTBYrm",
1378 "VPBROADCASTWYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001379 "VPMOVSXBDYrm",
1380 "VPMOVSXBQYrm",
Simon Pilgrim6732f6e2018-05-02 18:48:23 +00001381 "VPMOVSXWQYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001382
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001383def SKLWriteResGroup110 : SchedWriteRes<[SKLPort23,SKLPort015]> {
1384 let Latency = 8;
1385 let NumMicroOps = 2;
1386 let ResourceCycles = [1,1];
1387}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001388def: InstRW<[SKLWriteResGroup110], (instregex "VMASKMOVPDYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001389 "VMASKMOVPSYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001390 "VPADDBYrm",
1391 "VPADDDYrm",
1392 "VPADDQYrm",
1393 "VPADDWYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001394 "VPBLENDDYrmi",
1395 "VPMASKMOVDYrm",
1396 "VPMASKMOVQYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001397 "VPSUBBYrm",
1398 "VPSUBDYrm",
1399 "VPSUBQYrm",
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001400 "VPSUBWYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001401
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001402def SKLWriteResGroup112 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1403 let Latency = 8;
1404 let NumMicroOps = 4;
1405 let ResourceCycles = [1,2,1];
1406}
Simon Pilgrim5e492d22018-04-19 17:32:10 +00001407def: InstRW<[SKLWriteResGroup112], (instregex "MMX_PH(ADD|SUB)SWrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001408
1409def SKLWriteResGroup113 : SchedWriteRes<[SKLPort5,SKLPort23,SKLPort05]> {
1410 let Latency = 8;
1411 let NumMicroOps = 4;
1412 let ResourceCycles = [2,1,1];
1413}
Simon Pilgrim5e492d22018-04-19 17:32:10 +00001414def: InstRW<[SKLWriteResGroup113], (instregex "MMX_PH(ADD|SUB)(D|W)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001415
Craig Topper58afb4e2018-03-22 21:10:07 +00001416def SKLWriteResGroup114 : SchedWriteRes<[SKLPort4,SKLPort5,SKLPort237,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001417 let Latency = 8;
1418 let NumMicroOps = 4;
1419 let ResourceCycles = [1,1,1,1];
1420}
1421def: InstRW<[SKLWriteResGroup114], (instregex "VCVTPS2PHYmr")>;
1422
1423def SKLWriteResGroup115 : SchedWriteRes<[SKLPort23,SKLPort237,SKLPort06]> {
1424 let Latency = 8;
1425 let NumMicroOps = 5;
1426 let ResourceCycles = [1,1,3];
1427}
Craig Topper13a16502018-03-19 00:56:09 +00001428def: InstRW<[SKLWriteResGroup115], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001429
1430def SKLWriteResGroup116 : SchedWriteRes<[SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1431 let Latency = 8;
1432 let NumMicroOps = 5;
1433 let ResourceCycles = [1,1,1,2];
1434}
Craig Topperfc179c62018-03-22 04:23:41 +00001435def: InstRW<[SKLWriteResGroup116], (instregex "RCL(8|16|32|64)m1",
1436 "RCL(8|16|32|64)mi",
1437 "RCR(8|16|32|64)m1",
1438 "RCR(8|16|32|64)mi")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001439
1440def SKLWriteResGroup117 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06]> {
1441 let Latency = 8;
1442 let NumMicroOps = 6;
1443 let ResourceCycles = [1,1,1,3];
1444}
Craig Topperfc179c62018-03-22 04:23:41 +00001445def: InstRW<[SKLWriteResGroup117], (instregex "ROL(8|16|32|64)mCL",
1446 "SAR(8|16|32|64)mCL",
1447 "SHL(8|16|32|64)mCL",
1448 "SHR(8|16|32|64)mCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001449
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001450def SKLWriteResGroup119 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1451 let Latency = 8;
1452 let NumMicroOps = 6;
1453 let ResourceCycles = [1,1,1,2,1];
1454}
Craig Topper9f834812018-04-01 21:54:24 +00001455def: InstRW<[SKLWriteResGroup119], (instregex "ADC(8|16|32|64)mi",
Craig Topperfc179c62018-03-22 04:23:41 +00001456 "CMPXCHG(8|16|32|64)rm",
Craig Topperc50570f2018-04-06 17:12:18 +00001457 "SBB(8|16|32|64)mi")>;
1458def: InstRW<[SKLWriteResGroup119, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1459 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001460
1461def SKLWriteResGroup120 : SchedWriteRes<[SKLPort0,SKLPort23]> {
1462 let Latency = 9;
1463 let NumMicroOps = 2;
1464 let ResourceCycles = [1,1];
1465}
Craig Topperfc179c62018-03-22 04:23:41 +00001466def: InstRW<[SKLWriteResGroup120], (instregex "MMX_CVTPI2PSirm",
Craig Topperfc179c62018-03-22 04:23:41 +00001467 "VTESTPDYrm",
1468 "VTESTPSYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001469
1470def SKLWriteResGroup121 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1471 let Latency = 9;
1472 let NumMicroOps = 2;
1473 let ResourceCycles = [1,1];
1474}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001475def: InstRW<[SKLWriteResGroup121], (instregex "(V?)PCMPGTQrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001476 "VPMOVSXBWYrm",
1477 "VPMOVSXDQYrm",
1478 "VPMOVSXWDYrm",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001479 "VPMOVZXWDYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001480
1481def SKLWriteResGroup122 : SchedWriteRes<[SKLPort01,SKLPort23]> {
1482 let Latency = 9;
1483 let NumMicroOps = 2;
1484 let ResourceCycles = [1,1];
1485}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001486def: InstRW<[SKLWriteResGroup122], (instregex "(V?)ADDSDrm",
1487 "(V?)ADDSSrm",
1488 "(V?)CMPSDrm",
1489 "(V?)CMPSSrm",
1490 "(V?)MAX(C?)SDrm",
1491 "(V?)MAX(C?)SSrm",
1492 "(V?)MIN(C?)SDrm",
1493 "(V?)MIN(C?)SSrm",
1494 "(V?)MULSDrm",
1495 "(V?)MULSSrm",
1496 "(V?)SUBSDrm",
1497 "(V?)SUBSSrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001498
Craig Topper58afb4e2018-03-22 21:10:07 +00001499def SKLWriteResGroup123 : SchedWriteRes<[SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001500 let Latency = 9;
1501 let NumMicroOps = 2;
1502 let ResourceCycles = [1,1];
1503}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001504def: InstRW<[SKLWriteResGroup123], (instregex "MMX_CVTPS2PIirm",
Craig Topperfc179c62018-03-22 04:23:41 +00001505 "MMX_CVTTPS2PIirm",
Craig Topperfc179c62018-03-22 04:23:41 +00001506 "VCVTPH2PSrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001507 "(V?)CVTPS2PDrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001508
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001509def SKLWriteResGroup126 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1510 let Latency = 9;
1511 let NumMicroOps = 3;
1512 let ResourceCycles = [1,1,1];
1513}
Craig Topperfc179c62018-03-22 04:23:41 +00001514def: InstRW<[SKLWriteResGroup126], (instregex "(V?)PTESTrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001515
1516def SKLWriteResGroup127 : SchedWriteRes<[SKLPort1,SKLPort5,SKLPort23]> {
1517 let Latency = 9;
1518 let NumMicroOps = 3;
1519 let ResourceCycles = [1,1,1];
1520}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001521def: InstRW<[SKLWriteResGroup127], (instrs IMUL64m, MUL64m, MULX64rm)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001522
1523def SKLWriteResGroup128 : SchedWriteRes<[SKLPort5,SKLPort01,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001524 let Latency = 9;
1525 let NumMicroOps = 4;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001526 let ResourceCycles = [2,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001527}
Craig Topperfc179c62018-03-22 04:23:41 +00001528def: InstRW<[SKLWriteResGroup128], (instregex "(V?)PHADDSWrm",
1529 "(V?)PHSUBSWrm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001530
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001531def SKLWriteResGroup130 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort0156]> {
1532 let Latency = 9;
1533 let NumMicroOps = 4;
1534 let ResourceCycles = [1,1,1,1];
1535}
Craig Topperfc179c62018-03-22 04:23:41 +00001536def: InstRW<[SKLWriteResGroup130], (instregex "SHLD(16|32|64)mri8",
1537 "SHRD(16|32|64)mri8")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001538
1539def SKLWriteResGroup131 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort23,SKLPort0156]> {
1540 let Latency = 9;
1541 let NumMicroOps = 5;
1542 let ResourceCycles = [1,2,1,1];
1543}
Craig Topperfc179c62018-03-22 04:23:41 +00001544def: InstRW<[SKLWriteResGroup131], (instregex "LAR(16|32|64)rm",
1545 "LSL(16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001546
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001547def SKLWriteResGroup133 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1548 let Latency = 10;
1549 let NumMicroOps = 2;
1550 let ResourceCycles = [1,1];
1551}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001552def: InstRW<[SKLWriteResGroup133], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1553 "ILD_F(16|32|64)m",
Craig Topperfc179c62018-03-22 04:23:41 +00001554 "VPCMPGTQYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001555 "VPMOVZXBDYrm",
1556 "VPMOVZXBQYrm",
1557 "VPMOVZXBWYrm",
1558 "VPMOVZXDQYrm",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001559 "VPMOVZXWQYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001560
1561def SKLWriteResGroup134 : SchedWriteRes<[SKLPort01,SKLPort23]> {
1562 let Latency = 10;
1563 let NumMicroOps = 2;
1564 let ResourceCycles = [1,1];
1565}
Simon Pilgrime93fd5f2018-05-02 09:18:49 +00001566def: InstRW<[SKLWriteResGroup134], (instregex "(V?)CVTDQ2PSrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001567 "(V?)CVTPH2PSYrm",
1568 "(V?)CVTPS2DQrm",
1569 "(V?)CVTSS2SDrm",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001570 "(V?)CVTTPS2DQrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001571
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001572def SKLWriteResGroup138 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1573 let Latency = 10;
1574 let NumMicroOps = 3;
1575 let ResourceCycles = [1,1,1];
1576}
Craig Topperfc179c62018-03-22 04:23:41 +00001577def: InstRW<[SKLWriteResGroup138], (instregex "MMX_CVTPI2PDirm",
1578 "VPTESTYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001579
Craig Topper58afb4e2018-03-22 21:10:07 +00001580def SKLWriteResGroup139 : SchedWriteRes<[SKLPort5,SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001581 let Latency = 10;
1582 let NumMicroOps = 3;
1583 let ResourceCycles = [1,1,1];
1584}
Craig Topperfc179c62018-03-22 04:23:41 +00001585def: InstRW<[SKLWriteResGroup139], (instregex "(V?)CVTSD2SSrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001586
1587def SKLWriteResGroup140 : SchedWriteRes<[SKLPort5,SKLPort01,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001588 let Latency = 10;
1589 let NumMicroOps = 4;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001590 let ResourceCycles = [2,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001591}
Craig Topperfc179c62018-03-22 04:23:41 +00001592def: InstRW<[SKLWriteResGroup140], (instregex "VPHADDSWYrm",
1593 "VPHSUBSWYrm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001594
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001595def SKLWriteResGroup142 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort06,SKLPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001596 let Latency = 9;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001597 let NumMicroOps = 4;
1598 let ResourceCycles = [1,1,1,1];
1599}
Craig Topperf846e2d2018-04-19 05:34:05 +00001600def: InstRW<[SKLWriteResGroup142], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001601
1602def SKLWriteResGroup143 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1603 let Latency = 10;
1604 let NumMicroOps = 8;
1605 let ResourceCycles = [1,1,1,1,1,3];
1606}
Craig Topper13a16502018-03-19 00:56:09 +00001607def: InstRW<[SKLWriteResGroup143], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001608
Craig Topper8104f262018-04-02 05:33:28 +00001609def SKLWriteResGroup145 : SchedWriteRes<[SKLPort0,SKLFPDivider]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001610 let Latency = 11;
1611 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001612 let ResourceCycles = [1,3];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001613}
Craig Topper8104f262018-04-02 05:33:28 +00001614def: InstRW<[SKLWriteResGroup145], (instregex "(V?)DIVPSrr",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001615 "(V?)DIVSSrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001616
Craig Topper8104f262018-04-02 05:33:28 +00001617def SKLWriteResGroup145_1 : SchedWriteRes<[SKLPort0,SKLFPDivider]> {
1618 let Latency = 11;
1619 let NumMicroOps = 1;
1620 let ResourceCycles = [1,5];
1621}
1622def: InstRW<[SKLWriteResGroup145_1], (instregex "VDIVPSYrr")>;
1623
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001624def SKLWriteResGroup146 : SchedWriteRes<[SKLPort0,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001625 let Latency = 11;
1626 let NumMicroOps = 2;
1627 let ResourceCycles = [1,1];
1628}
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +00001629def: InstRW<[SKLWriteResGroup146], (instregex "MUL_F(32|64)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001630
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001631def SKLWriteResGroup147 : SchedWriteRes<[SKLPort01,SKLPort23]> {
1632 let Latency = 11;
1633 let NumMicroOps = 2;
1634 let ResourceCycles = [1,1];
1635}
Simon Pilgrime93fd5f2018-05-02 09:18:49 +00001636def: InstRW<[SKLWriteResGroup147], (instregex "VCVTDQ2PSYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001637 "VCVTPS2DQYrm",
1638 "VCVTPS2PDYrm",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001639 "VCVTTPS2DQYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001640
1641def SKLWriteResGroup149 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1642 let Latency = 11;
1643 let NumMicroOps = 3;
1644 let ResourceCycles = [2,1];
1645}
Craig Topperfc179c62018-03-22 04:23:41 +00001646def: InstRW<[SKLWriteResGroup149], (instregex "FICOM16m",
1647 "FICOM32m",
1648 "FICOMP16m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001649 "FICOMP32m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001650
1651def SKLWriteResGroup150 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1652 let Latency = 11;
1653 let NumMicroOps = 3;
1654 let ResourceCycles = [1,1,1];
1655}
Craig Topperfc179c62018-03-22 04:23:41 +00001656def: InstRW<[SKLWriteResGroup150], (instregex "(V?)CVTDQ2PDrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001657
Craig Topper58afb4e2018-03-22 21:10:07 +00001658def SKLWriteResGroup151 : SchedWriteRes<[SKLPort0,SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001659 let Latency = 11;
1660 let NumMicroOps = 3;
1661 let ResourceCycles = [1,1,1];
1662}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001663def: InstRW<[SKLWriteResGroup151], (instregex "(V?)CVTSD2SI64rm",
1664 "(V?)CVTSD2SIrm",
1665 "(V?)CVTSS2SI64rm",
1666 "(V?)CVTSS2SIrm",
1667 "(V?)CVTTSD2SI64rm",
1668 "(V?)CVTTSD2SIrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001669 "VCVTTSS2SI64rm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001670 "(V?)CVTTSS2SIrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001671
Craig Topper58afb4e2018-03-22 21:10:07 +00001672def SKLWriteResGroup152 : SchedWriteRes<[SKLPort5,SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001673 let Latency = 11;
1674 let NumMicroOps = 3;
1675 let ResourceCycles = [1,1,1];
1676}
Craig Topperfc179c62018-03-22 04:23:41 +00001677def: InstRW<[SKLWriteResGroup152], (instregex "CVTPD2DQrm",
1678 "CVTPD2PSrm",
1679 "CVTTPD2DQrm",
1680 "MMX_CVTPD2PIirm",
1681 "MMX_CVTTPD2PIirm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001682
1683def SKLWriteResGroup153 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1684 let Latency = 11;
1685 let NumMicroOps = 6;
1686 let ResourceCycles = [1,1,1,2,1];
1687}
Craig Topperfc179c62018-03-22 04:23:41 +00001688def: InstRW<[SKLWriteResGroup153], (instregex "SHLD(16|32|64)mrCL",
1689 "SHRD(16|32|64)mrCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001690
1691def SKLWriteResGroup154 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001692 let Latency = 11;
1693 let NumMicroOps = 7;
1694 let ResourceCycles = [2,3,2];
1695}
Craig Topperfc179c62018-03-22 04:23:41 +00001696def: InstRW<[SKLWriteResGroup154], (instregex "RCL(16|32|64)rCL",
1697 "RCR(16|32|64)rCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001698
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001699def SKLWriteResGroup155 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort15,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001700 let Latency = 11;
1701 let NumMicroOps = 9;
1702 let ResourceCycles = [1,5,1,2];
1703}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001704def: InstRW<[SKLWriteResGroup155], (instregex "RCL8rCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001705
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001706def SKLWriteResGroup156 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001707 let Latency = 11;
1708 let NumMicroOps = 11;
1709 let ResourceCycles = [2,9];
1710}
Craig Topperfc179c62018-03-22 04:23:41 +00001711def: InstRW<[SKLWriteResGroup156], (instrs LOOPE, LOOPNE)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001712
Craig Topper58afb4e2018-03-22 21:10:07 +00001713def SKLWriteResGroup160 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001714 let Latency = 12;
1715 let NumMicroOps = 4;
1716 let ResourceCycles = [1,1,1,1];
1717}
1718def: InstRW<[SKLWriteResGroup160], (instregex "CVTTSS2SI64rm")>;
1719
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001720def SKLWriteResGroup162 : SchedWriteRes<[SKLPort5,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001721 let Latency = 13;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001722 let NumMicroOps = 3;
1723 let ResourceCycles = [2,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001724}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001725def: InstRW<[SKLWriteResGroup162], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001726
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001727def SKLWriteResGroup163 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1728 let Latency = 13;
1729 let NumMicroOps = 3;
1730 let ResourceCycles = [1,1,1];
1731}
1732def: InstRW<[SKLWriteResGroup163], (instregex "VCVTDQ2PDYrm")>;
1733
Craig Topper8104f262018-04-02 05:33:28 +00001734def SKLWriteResGroup166 : SchedWriteRes<[SKLPort0,SKLFPDivider]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001735 let Latency = 14;
1736 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001737 let ResourceCycles = [1,3];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001738}
Craig Topper8104f262018-04-02 05:33:28 +00001739def: InstRW<[SKLWriteResGroup166], (instregex "(V?)DIVPDrr",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001740 "(V?)DIVSDrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001741
Craig Topper8104f262018-04-02 05:33:28 +00001742def SKLWriteResGroup166_1 : SchedWriteRes<[SKLPort0,SKLFPDivider]> {
1743 let Latency = 14;
1744 let NumMicroOps = 1;
1745 let ResourceCycles = [1,5];
1746}
1747def: InstRW<[SKLWriteResGroup166_1], (instregex "VDIVPDYrr")>;
1748
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001749def SKLWriteResGroup169 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1750 let Latency = 14;
1751 let NumMicroOps = 3;
1752 let ResourceCycles = [1,1,1];
1753}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001754def: InstRW<[SKLWriteResGroup169], (instregex "MUL_FI(16|32)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001755
1756def SKLWriteResGroup170 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort15,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001757 let Latency = 14;
1758 let NumMicroOps = 10;
1759 let ResourceCycles = [2,4,1,3];
1760}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001761def: InstRW<[SKLWriteResGroup170], (instregex "RCR8rCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001762
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001763def SKLWriteResGroup171 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001764 let Latency = 15;
1765 let NumMicroOps = 1;
1766 let ResourceCycles = [1];
1767}
Craig Topperfc179c62018-03-22 04:23:41 +00001768def: InstRW<[SKLWriteResGroup171], (instregex "DIVR_FPrST0",
1769 "DIVR_FST0r",
1770 "DIVR_FrST0")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001771
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001772def SKLWriteResGroup174 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort06,SKLPort15,SKLPort0156]> {
1773 let Latency = 15;
1774 let NumMicroOps = 10;
1775 let ResourceCycles = [1,1,1,5,1,1];
1776}
Craig Topper13a16502018-03-19 00:56:09 +00001777def: InstRW<[SKLWriteResGroup174], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001778
Craig Topper8104f262018-04-02 05:33:28 +00001779def SKLWriteResGroup175 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001780 let Latency = 16;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001781 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001782 let ResourceCycles = [1,1,3];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001783}
Craig Topperfc179c62018-03-22 04:23:41 +00001784def: InstRW<[SKLWriteResGroup175], (instregex "(V?)DIVSSrm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001785
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001786def SKLWriteResGroup177 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06,SKLPort15,SKLPort0156]> {
1787 let Latency = 16;
1788 let NumMicroOps = 14;
1789 let ResourceCycles = [1,1,1,4,2,5];
1790}
1791def: InstRW<[SKLWriteResGroup177], (instregex "CMPXCHG8B")>;
1792
1793def SKLWriteResGroup178 : SchedWriteRes<[SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001794 let Latency = 16;
1795 let NumMicroOps = 16;
1796 let ResourceCycles = [16];
1797}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001798def: InstRW<[SKLWriteResGroup178], (instrs VZEROALL)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001799
Craig Topper8104f262018-04-02 05:33:28 +00001800def SKLWriteResGroup179 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001801 let Latency = 17;
1802 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001803 let ResourceCycles = [1,1,5];
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001804}
Craig Topper8104f262018-04-02 05:33:28 +00001805def: InstRW<[SKLWriteResGroup179], (instregex "(V?)DIVPSrm")>;
1806
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001807def SKLWriteResGroup180 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort05,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001808 let Latency = 17;
1809 let NumMicroOps = 15;
1810 let ResourceCycles = [2,1,2,4,2,4];
1811}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001812def: InstRW<[SKLWriteResGroup180], (instrs XCH_F)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001813
Craig Topper8104f262018-04-02 05:33:28 +00001814def SKLWriteResGroup182 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001815 let Latency = 18;
1816 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001817 let ResourceCycles = [1,1,5];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001818}
Craig Topper8104f262018-04-02 05:33:28 +00001819def: InstRW<[SKLWriteResGroup182], (instregex "VDIVPSYrm")>;
1820
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001821def SKLWriteResGroup184 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001822 let Latency = 18;
1823 let NumMicroOps = 8;
1824 let ResourceCycles = [1,1,1,5];
1825}
Craig Topperfc179c62018-03-22 04:23:41 +00001826def: InstRW<[SKLWriteResGroup184], (instrs CPUID, RDTSC)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001827
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001828def SKLWriteResGroup185 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort06,SKLPort15,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001829 let Latency = 18;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001830 let NumMicroOps = 11;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001831 let ResourceCycles = [2,1,1,4,1,2];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001832}
Craig Topper13a16502018-03-19 00:56:09 +00001833def: InstRW<[SKLWriteResGroup185], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001834
Craig Topper8104f262018-04-02 05:33:28 +00001835def SKLWriteResGroup186 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001836 let Latency = 19;
1837 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001838 let ResourceCycles = [1,1,4];
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001839}
Craig Topper8104f262018-04-02 05:33:28 +00001840def: InstRW<[SKLWriteResGroup186], (instregex "(V?)DIVSDrm")>;
1841
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001842def SKLWriteResGroup189 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001843 let Latency = 20;
1844 let NumMicroOps = 1;
1845 let ResourceCycles = [1];
1846}
Craig Topperfc179c62018-03-22 04:23:41 +00001847def: InstRW<[SKLWriteResGroup189], (instregex "DIV_FPrST0",
1848 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001849 "DIV_FrST0")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001850
Craig Topper8104f262018-04-02 05:33:28 +00001851def SKLWriteResGroup190 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001852 let Latency = 20;
1853 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001854 let ResourceCycles = [1,1,4];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001855}
Craig Topperfc179c62018-03-22 04:23:41 +00001856def: InstRW<[SKLWriteResGroup190], (instregex "(V?)DIVPDrm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001857
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001858def SKLWriteResGroup192 : SchedWriteRes<[SKLPort4,SKLPort5,SKLPort6,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1859 let Latency = 20;
1860 let NumMicroOps = 8;
1861 let ResourceCycles = [1,1,1,1,1,1,2];
1862}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001863def: InstRW<[SKLWriteResGroup192], (instrs INSB, INSL, INSW)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001864
1865def SKLWriteResGroup193 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001866 let Latency = 20;
1867 let NumMicroOps = 10;
1868 let ResourceCycles = [1,2,7];
1869}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001870def: InstRW<[SKLWriteResGroup193], (instregex "MWAITrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001871
Craig Topper8104f262018-04-02 05:33:28 +00001872def SKLWriteResGroup195 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001873 let Latency = 21;
1874 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001875 let ResourceCycles = [1,1,8];
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001876}
1877def: InstRW<[SKLWriteResGroup195], (instregex "VDIVPDYrm")>;
1878
1879def SKLWriteResGroup196 : SchedWriteRes<[SKLPort0,SKLPort23]> {
1880 let Latency = 22;
1881 let NumMicroOps = 2;
1882 let ResourceCycles = [1,1];
1883}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001884def: InstRW<[SKLWriteResGroup196], (instregex "DIV_F(32|64)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001885
1886def SKLWriteResGroup196_1 : SchedWriteRes<[SKLPort0, SKLPort23, SKLPort5, SKLPort015]> {
1887 let Latency = 22;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001888 let NumMicroOps = 5;
1889 let ResourceCycles = [1,2,1,1];
1890}
Craig Topper17a31182017-12-16 18:35:29 +00001891def: InstRW<[SKLWriteResGroup196_1], (instrs VGATHERDPSrm,
1892 VGATHERDPDrm,
1893 VGATHERQPDrm,
1894 VGATHERQPSrm,
1895 VPGATHERDDrm,
1896 VPGATHERDQrm,
1897 VPGATHERQDrm,
1898 VPGATHERQQrm)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001899
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001900def SKLWriteResGroup196_2 : SchedWriteRes<[SKLPort0, SKLPort23, SKLPort5, SKLPort015]> {
1901 let Latency = 25;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001902 let NumMicroOps = 5;
1903 let ResourceCycles = [1,2,1,1];
1904}
Craig Topper17a31182017-12-16 18:35:29 +00001905def: InstRW<[SKLWriteResGroup196_2], (instrs VGATHERDPSYrm,
1906 VGATHERQPDYrm,
1907 VGATHERQPSYrm,
1908 VPGATHERDDYrm,
1909 VPGATHERDQYrm,
1910 VPGATHERQDYrm,
1911 VPGATHERQQYrm,
1912 VGATHERDPDYrm)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001913
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001914def SKLWriteResGroup198 : SchedWriteRes<[SKLPort0,SKLPort4,SKLPort5,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1915 let Latency = 23;
1916 let NumMicroOps = 19;
1917 let ResourceCycles = [2,1,4,1,1,4,6];
1918}
1919def: InstRW<[SKLWriteResGroup198], (instregex "CMPXCHG16B")>;
1920
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001921def SKLWriteResGroup202 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1922 let Latency = 25;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001923 let NumMicroOps = 3;
1924 let ResourceCycles = [1,1,1];
1925}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001926def: InstRW<[SKLWriteResGroup202], (instregex "DIV_FI(16|32)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001927
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001928def SKLWriteResGroup206 : SchedWriteRes<[SKLPort0,SKLPort23]> {
1929 let Latency = 27;
1930 let NumMicroOps = 2;
1931 let ResourceCycles = [1,1];
1932}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001933def: InstRW<[SKLWriteResGroup206], (instregex "DIVR_F(32|64)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001934
1935def SKLWriteResGroup207 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23,SKLPort0156]> {
1936 let Latency = 28;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001937 let NumMicroOps = 8;
1938 let ResourceCycles = [2,4,1,1];
1939}
Craig Topper13a16502018-03-19 00:56:09 +00001940def: InstRW<[SKLWriteResGroup207], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001941
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001942def SKLWriteResGroup208 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001943 let Latency = 30;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001944 let NumMicroOps = 3;
1945 let ResourceCycles = [1,1,1];
1946}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001947def: InstRW<[SKLWriteResGroup208], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001948
1949def SKLWriteResGroup209 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort23,SKLPort06,SKLPort0156]> {
1950 let Latency = 35;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001951 let NumMicroOps = 23;
1952 let ResourceCycles = [1,5,3,4,10];
1953}
Craig Topperfc179c62018-03-22 04:23:41 +00001954def: InstRW<[SKLWriteResGroup209], (instregex "IN(8|16|32)ri",
1955 "IN(8|16|32)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001956
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001957def SKLWriteResGroup210 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1958 let Latency = 35;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001959 let NumMicroOps = 23;
1960 let ResourceCycles = [1,5,2,1,4,10];
1961}
Craig Topperfc179c62018-03-22 04:23:41 +00001962def: InstRW<[SKLWriteResGroup210], (instregex "OUT(8|16|32)ir",
1963 "OUT(8|16|32)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001964
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001965def SKLWriteResGroup211 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort23,SKLPort0156]> {
1966 let Latency = 37;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001967 let NumMicroOps = 31;
1968 let ResourceCycles = [1,8,1,21];
1969}
Craig Topper391c6f92017-12-10 01:24:08 +00001970def: InstRW<[SKLWriteResGroup211], (instregex "XRSTOR(64)?")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001971
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001972def SKLWriteResGroup212 : SchedWriteRes<[SKLPort1,SKLPort4,SKLPort5,SKLPort6,SKLPort23,SKLPort237,SKLPort15,SKLPort0156]> {
1973 let Latency = 40;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001974 let NumMicroOps = 18;
1975 let ResourceCycles = [1,1,2,3,1,1,1,8];
1976}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001977def: InstRW<[SKLWriteResGroup212], (instregex "VMCLEARm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001978
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001979def SKLWriteResGroup213 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
1980 let Latency = 41;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001981 let NumMicroOps = 39;
1982 let ResourceCycles = [1,10,1,1,26];
1983}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001984def: InstRW<[SKLWriteResGroup213], (instregex "XSAVE64")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001985
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001986def SKLWriteResGroup214 : SchedWriteRes<[SKLPort5,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001987 let Latency = 42;
1988 let NumMicroOps = 22;
1989 let ResourceCycles = [2,20];
1990}
Craig Topper2d451e72018-03-18 08:38:06 +00001991def: InstRW<[SKLWriteResGroup214], (instrs RDTSCP)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001992
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001993def SKLWriteResGroup215 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
1994 let Latency = 42;
1995 let NumMicroOps = 40;
1996 let ResourceCycles = [1,11,1,1,26];
1997}
Craig Topper391c6f92017-12-10 01:24:08 +00001998def: InstRW<[SKLWriteResGroup215], (instregex "^XSAVE$", "XSAVEC", "XSAVES")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001999
2000def SKLWriteResGroup216 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
2001 let Latency = 46;
2002 let NumMicroOps = 44;
2003 let ResourceCycles = [1,11,1,1,30];
2004}
2005def: InstRW<[SKLWriteResGroup216], (instregex "XSAVEOPT")>;
2006
2007def SKLWriteResGroup217 : SchedWriteRes<[SKLPort0,SKLPort23,SKLPort05,SKLPort06,SKLPort0156]> {
2008 let Latency = 62;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002009 let NumMicroOps = 64;
2010 let ResourceCycles = [2,8,5,10,39];
2011}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002012def: InstRW<[SKLWriteResGroup217], (instregex "FLDENVm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002013
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002014def SKLWriteResGroup218 : SchedWriteRes<[SKLPort0,SKLPort6,SKLPort23,SKLPort05,SKLPort06,SKLPort15,SKLPort0156]> {
2015 let Latency = 63;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002016 let NumMicroOps = 88;
2017 let ResourceCycles = [4,4,31,1,2,1,45];
2018}
Craig Topper2d451e72018-03-18 08:38:06 +00002019def: InstRW<[SKLWriteResGroup218], (instrs FXRSTOR64)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002020
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002021def SKLWriteResGroup219 : SchedWriteRes<[SKLPort0,SKLPort6,SKLPort23,SKLPort05,SKLPort06,SKLPort15,SKLPort0156]> {
2022 let Latency = 63;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002023 let NumMicroOps = 90;
2024 let ResourceCycles = [4,2,33,1,2,1,47];
2025}
Craig Topper2d451e72018-03-18 08:38:06 +00002026def: InstRW<[SKLWriteResGroup219], (instrs FXRSTOR)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002027
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002028def SKLWriteResGroup220 : SchedWriteRes<[SKLPort5,SKLPort05,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002029 let Latency = 75;
2030 let NumMicroOps = 15;
2031 let ResourceCycles = [6,3,6];
2032}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00002033def: InstRW<[SKLWriteResGroup220], (instrs FNINIT)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002034
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002035def SKLWriteResGroup221 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort05,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002036 let Latency = 76;
2037 let NumMicroOps = 32;
2038 let ResourceCycles = [7,2,8,3,1,11];
2039}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002040def: InstRW<[SKLWriteResGroup221], (instregex "DIV(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002041
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002042def SKLWriteResGroup222 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002043 let Latency = 102;
2044 let NumMicroOps = 66;
2045 let ResourceCycles = [4,2,4,8,14,34];
2046}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002047def: InstRW<[SKLWriteResGroup222], (instregex "IDIV(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002048
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002049def SKLWriteResGroup223 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort4,SKLPort5,SKLPort6,SKLPort237,SKLPort06,SKLPort0156]> {
2050 let Latency = 106;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002051 let NumMicroOps = 100;
2052 let ResourceCycles = [9,1,11,16,1,11,21,30];
2053}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002054def: InstRW<[SKLWriteResGroup223], (instregex "FSTENVm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002055
2056} // SchedModel