blob: 9875ce322362e61f7e335df45bfbbb6935ae07bd [file] [log] [blame]
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001//=- X86SchedSkylake.td - X86 Skylake Client Scheduling ------*- tablegen -*-=//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the machine model for Skylake Client to support
11// instruction scheduling and other instruction cost heuristics.
12//
13//===----------------------------------------------------------------------===//
14
15def SkylakeClientModel : SchedMachineModel {
16 // All x86 instructions are modeled as a single micro-op, and SKylake can
17 // decode 6 instructions per cycle.
18 let IssueWidth = 6;
19 let MicroOpBufferSize = 224; // Based on the reorder buffer.
20 let LoadLatency = 5;
21 let MispredictPenalty = 14;
Simon Pilgrim31a96332018-03-24 20:40:14 +000022
Gadi Haber6f8fbf42017-09-19 06:19:27 +000023 // Based on the LSD (loop-stream detector) queue size and benchmarking data.
24 let LoopMicroOpBufferSize = 50;
25
26 // This flag is set to allow the scheduler to assign a default model to
27 // unrecognized opcodes.
28 let CompleteModel = 0;
29}
30
31let SchedModel = SkylakeClientModel in {
32
33// Skylake Client can issue micro-ops to 8 different ports in one cycle.
34
35// Ports 0, 1, 5, and 6 handle all computation.
36// Port 4 gets the data half of stores. Store data can be available later than
37// the store address, but since we don't model the latency of stores, we can
38// ignore that.
39// Ports 2 and 3 are identical. They handle loads and the address half of
40// stores. Port 7 can handle address calculations.
41def SKLPort0 : ProcResource<1>;
42def SKLPort1 : ProcResource<1>;
43def SKLPort2 : ProcResource<1>;
44def SKLPort3 : ProcResource<1>;
45def SKLPort4 : ProcResource<1>;
46def SKLPort5 : ProcResource<1>;
47def SKLPort6 : ProcResource<1>;
48def SKLPort7 : ProcResource<1>;
49
50// Many micro-ops are capable of issuing on multiple ports.
51def SKLPort01 : ProcResGroup<[SKLPort0, SKLPort1]>;
52def SKLPort23 : ProcResGroup<[SKLPort2, SKLPort3]>;
53def SKLPort237 : ProcResGroup<[SKLPort2, SKLPort3, SKLPort7]>;
54def SKLPort04 : ProcResGroup<[SKLPort0, SKLPort4]>;
55def SKLPort05 : ProcResGroup<[SKLPort0, SKLPort5]>;
56def SKLPort06 : ProcResGroup<[SKLPort0, SKLPort6]>;
57def SKLPort15 : ProcResGroup<[SKLPort1, SKLPort5]>;
58def SKLPort16 : ProcResGroup<[SKLPort1, SKLPort6]>;
59def SKLPort56 : ProcResGroup<[SKLPort5, SKLPort6]>;
60def SKLPort015 : ProcResGroup<[SKLPort0, SKLPort1, SKLPort5]>;
61def SKLPort056 : ProcResGroup<[SKLPort0, SKLPort5, SKLPort6]>;
62def SKLPort0156: ProcResGroup<[SKLPort0, SKLPort1, SKLPort5, SKLPort6]>;
63
Simon Pilgrim68a8fbc2018-03-25 20:16:53 +000064def SKLDivider : ProcResource<1>; // Integer division issued on port 0.
Craig Topper8104f262018-04-02 05:33:28 +000065// FP division and sqrt on port 0.
66def SKLFPDivider : ProcResource<1>;
Simon Pilgrim68a8fbc2018-03-25 20:16:53 +000067
Gadi Haber6f8fbf42017-09-19 06:19:27 +000068// 60 Entry Unified Scheduler
69def SKLPortAny : ProcResGroup<[SKLPort0, SKLPort1, SKLPort2, SKLPort3, SKLPort4,
70 SKLPort5, SKLPort6, SKLPort7]> {
71 let BufferSize=60;
72}
73
74// Loads are 5 cycles, so ReadAfterLd registers needn't be available until 5
75// cycles after the memory operand.
76def : ReadAdvance<ReadAfterLd, 5>;
77
78// Many SchedWrites are defined in pairs with and without a folded load.
79// Instructions with folded loads are usually micro-fused, so they only appear
80// as two micro-ops when queued in the reservation station.
81// This multiclass defines the resource usage for variants with and without
82// folded loads.
83multiclass SKLWriteResPair<X86FoldableSchedWrite SchedRW,
Simon Pilgrim30c38c32018-03-19 14:46:07 +000084 list<ProcResourceKind> ExePorts,
Simon Pilgrime3547af2018-03-25 10:21:19 +000085 int Lat, list<int> Res = [1], int UOps = 1,
86 int LoadLat = 5> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +000087 // Register variant is using a single cycle on ExePort.
Simon Pilgrim30c38c32018-03-19 14:46:07 +000088 def : WriteRes<SchedRW, ExePorts> {
89 let Latency = Lat;
90 let ResourceCycles = Res;
91 let NumMicroOps = UOps;
92 }
Gadi Haber6f8fbf42017-09-19 06:19:27 +000093
Simon Pilgrime3547af2018-03-25 10:21:19 +000094 // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to
95 // the latency (default = 5).
Simon Pilgrim30c38c32018-03-19 14:46:07 +000096 def : WriteRes<SchedRW.Folded, !listconcat([SKLPort23], ExePorts)> {
Simon Pilgrime3547af2018-03-25 10:21:19 +000097 let Latency = !add(Lat, LoadLat);
Simon Pilgrim30c38c32018-03-19 14:46:07 +000098 let ResourceCycles = !listconcat([1], Res);
Simon Pilgrime3547af2018-03-25 10:21:19 +000099 let NumMicroOps = !add(UOps, 1);
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000100 }
101}
102
Craig Topperf131b602018-04-06 16:16:46 +0000103// A folded store needs a cycle on port 4 for the store data, and an extra port
104// 2/3/7 cycle to recompute the address.
105def : WriteRes<WriteRMW, [SKLPort237,SKLPort4]>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000106
107// Arithmetic.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000108defm : SKLWriteResPair<WriteALU, [SKLPort0156], 1>; // Simple integer ALU op.
109defm : SKLWriteResPair<WriteIMul, [SKLPort1], 3>; // Integer multiplication.
Simon Pilgrim68a8fbc2018-03-25 20:16:53 +0000110defm : SKLWriteResPair<WriteIDiv, [SKLPort0, SKLDivider], 25, [1,10], 1, 4>; // Integer division.
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000111defm : SKLWriteResPair<WriteCRC32, [SKLPort1], 3>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000112
Simon Pilgrim68a8fbc2018-03-25 20:16:53 +0000113def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, high part.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000114def : WriteRes<WriteLEA, [SKLPort15]>; // LEA instructions can't fold loads.
115
Craig Topperb7baa352018-04-08 17:53:18 +0000116defm : SKLWriteResPair<WriteCMOV, [SKLPort06], 1>; // Conditional move.
117def : WriteRes<WriteSETCC, [SKLPort06]>; // Setcc.
118def : WriteRes<WriteSETCCStore, [SKLPort06,SKLPort4,SKLPort237]> {
119 let Latency = 2;
120 let NumMicroOps = 3;
121}
122
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000123// Bit counts.
124defm : SKLWriteResPair<WriteBitScan, [SKLPort1], 3>;
125defm : SKLWriteResPair<WriteLZCNT, [SKLPort1], 3>;
126defm : SKLWriteResPair<WriteTZCNT, [SKLPort1], 3>;
127defm : SKLWriteResPair<WritePOPCNT, [SKLPort1], 3>;
128
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000129// Integer shifts and rotates.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000130defm : SKLWriteResPair<WriteShift, [SKLPort06], 1>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000131
Craig Topper89310f52018-03-29 20:41:39 +0000132// BMI1 BEXTR, BMI2 BZHI
133defm : SKLWriteResPair<WriteBEXTR, [SKLPort06,SKLPort15], 2, [1,1], 2>;
134defm : SKLWriteResPair<WriteBZHI, [SKLPort15], 1>;
135
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000136// Loads, stores, and moves, not folded with other operations.
137def : WriteRes<WriteLoad, [SKLPort23]> { let Latency = 5; }
138def : WriteRes<WriteStore, [SKLPort237, SKLPort4]>;
139def : WriteRes<WriteMove, [SKLPort0156]>;
140
141// Idioms that clear a register, like xorps %xmm0, %xmm0.
142// These can often bypass execution ports completely.
143def : WriteRes<WriteZero, []>;
144
145// Branches don't produce values, so they have no latency, but they still
146// consume resources. Indirect branches can fold loads.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000147defm : SKLWriteResPair<WriteJump, [SKLPort06], 1>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000148
149// Floating point. This covers both scalar and vector operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000150def : WriteRes<WriteFLoad, [SKLPort23]> { let Latency = 6; }
151def : WriteRes<WriteFStore, [SKLPort237, SKLPort4]>;
152def : WriteRes<WriteFMove, [SKLPort015]>;
Simon Pilgrim0e51a122018-05-04 18:16:13 +0000153defm : X86WriteRes<WriteEMMS, [SKLPort05,SKLPort0156], 10, [9,1], 10>;
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000154
Simon Pilgrime93fd5f2018-05-02 09:18:49 +0000155defm : SKLWriteResPair<WriteFAdd, [SKLPort01], 4, [1], 1, 6>; // Floating point add/sub.
156defm : SKLWriteResPair<WriteFAddY, [SKLPort01], 4, [1], 1, 7>; // Floating point add/sub (YMM/ZMM).
Simon Pilgrim21caf012018-05-01 18:22:53 +0000157defm : SKLWriteResPair<WriteFCmp, [SKLPort01], 4, [1], 1, 6>; // Floating point compare.
158defm : SKLWriteResPair<WriteFCmpY, [SKLPort01], 4, [1], 1, 7>; // Floating point compare (YMM/ZMM).
159defm : SKLWriteResPair<WriteFCom, [SKLPort0], 2>; // Floating point compare to flags.
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000160defm : SKLWriteResPair<WriteFMul, [SKLPort01], 4, [1], 1, 6>; // Floating point multiplication.
161defm : SKLWriteResPair<WriteFMulY, [SKLPort01], 4, [1], 1, 7>; // Floating point multiplication (YMM/ZMM).
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000162
163defm : SKLWriteResPair<WriteFDiv, [SKLPort0,SKLFPDivider], 11, [1,3], 1, 5>; // Floating point division.
164//defm : SKLWriteResPair<WriteFDivX, [SKLPort0,SKLFPDivider], 11, [1,3], 1, 6>; // Floating point division (XMM).
165defm : SKLWriteResPair<WriteFDivY, [SKLPort0,SKLFPDivider], 11, [1,5], 1, 7>; // Floating point division (YMM).
166defm : SKLWriteResPair<WriteFDivZ, [SKLPort0,SKLFPDivider], 11, [1,5], 1, 7>; // Floating point division (ZMM).
167//defm : SKLWriteResPair<WriteFDiv64, [SKLPort0,SKLFPDivider], 14, [1,3], 1, 5>; // Floating point double division.
168//defm : SKLWriteResPair<WriteFDiv64X, [SKLPort0,SKLFPDivider], 14, [1,3], 1, 6>; // Floating point double division (XMM).
169//defm : SKLWriteResPair<WriteFDiv64Y, [SKLPort0,SKLFPDivider], 14, [1,5], 1, 7>; // Floating point double division (YMM).
170defm : SKLWriteResPair<WriteFDiv64Z, [SKLPort0,SKLFPDivider], 14, [1,5], 1, 7>; // Floating point double division (ZMM).
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000171
172defm : SKLWriteResPair<WriteFSqrt, [SKLPort0,SKLFPDivider], 12, [1,3], 1, 5>; // Floating point square root.
173defm : SKLWriteResPair<WriteFSqrtX, [SKLPort0,SKLFPDivider], 12, [1,3], 1, 6>; // Floating point square root (XMM).
174defm : SKLWriteResPair<WriteFSqrtY, [SKLPort0,SKLFPDivider], 12, [1,6], 1, 7>; // Floating point square root (YMM).
175defm : SKLWriteResPair<WriteFSqrtZ, [SKLPort0,SKLFPDivider], 12, [1,6], 1, 7>; // Floating point square root (ZMM).
176defm : SKLWriteResPair<WriteFSqrt64, [SKLPort0,SKLFPDivider], 18, [1,6], 1, 5>; // Floating point double square root.
177defm : SKLWriteResPair<WriteFSqrt64X, [SKLPort0,SKLFPDivider], 18, [1,6], 1, 6>; // Floating point double square root (XMM).
178defm : SKLWriteResPair<WriteFSqrt64Y, [SKLPort0,SKLFPDivider], 18, [1,12],1, 7>; // Floating point double square root (YMM).
179defm : SKLWriteResPair<WriteFSqrt64Z, [SKLPort0,SKLFPDivider], 18, [1,12],1, 7>; // Floating point double square root (ZMM).
180defm : SKLWriteResPair<WriteFSqrt80, [SKLPort0,SKLFPDivider], 21, [1,7]>; // Floating point long double square root.
181
Simon Pilgrimc7088682018-05-01 18:06:07 +0000182defm : SKLWriteResPair<WriteFRcp, [SKLPort0], 4, [1], 1, 5>; // Floating point reciprocal estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000183defm : SKLWriteResPair<WriteFRcpX, [SKLPort0], 4, [1], 1, 6>; // Floating point reciprocal estimate (XMM).
184defm : SKLWriteResPair<WriteFRcpY, [SKLPort0], 4, [1], 1, 7>; // Floating point reciprocal estimate (YMM/ZMM).
185
Simon Pilgrimc7088682018-05-01 18:06:07 +0000186defm : SKLWriteResPair<WriteFRsqrt, [SKLPort0], 4, [1], 1, 5>; // Floating point reciprocal square root estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000187defm : SKLWriteResPair<WriteFRsqrtX,[SKLPort0], 4, [1], 1, 6>; // Floating point reciprocal square root estimate (XMM).
188defm : SKLWriteResPair<WriteFRsqrtY,[SKLPort0], 4, [1], 1, 7>; // Floating point reciprocal square root estimate (YMM/ZMM).
189
Simon Pilgrim67cc2462018-05-04 15:20:18 +0000190defm : SKLWriteResPair<WriteFMA, [SKLPort01], 4, [1], 1, 5>; // Fused Multiply Add.
191defm : SKLWriteResPair<WriteFMAX, [SKLPort01], 4, [1], 1, 6>; // Fused Multiply Add (XMM).
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000192defm : SKLWriteResPair<WriteFMAY, [SKLPort01], 4, [1], 1, 7>; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000193defm : SKLWriteResPair<WriteDPPD, [SKLPort5,SKLPort01], 9, [1,2], 3, 6>; // Floating point double dot product.
194defm : SKLWriteResPair<WriteDPPS, [SKLPort5,SKLPort01], 13, [1,3], 4, 6>; // Floating point single dot product.
195defm : SKLWriteResPair<WriteDPPSY, [SKLPort5,SKLPort01], 13, [1,3], 4, 7>; // Floating point single dot product (YMM).
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000196defm : SKLWriteResPair<WriteFSign, [SKLPort0], 1>; // Floating point fabs/fchs.
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000197defm : SKLWriteResPair<WriteFRnd, [SKLPort01], 8, [2], 2, 6>; // Floating point rounding.
198defm : SKLWriteResPair<WriteFRndY, [SKLPort01], 8, [2], 2, 7>; // Floating point rounding (YMM/ZMM).
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000199defm : SKLWriteResPair<WriteFLogic, [SKLPort015], 1, [1], 1, 6>; // Floating point and/or/xor logicals.
200defm : SKLWriteResPair<WriteFLogicY, [SKLPort015], 1, [1], 1, 7>; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000201defm : SKLWriteResPair<WriteFShuffle, [SKLPort5], 1, [1], 1, 6>; // Floating point vector shuffles.
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000202defm : SKLWriteResPair<WriteFShuffleY, [SKLPort5], 1, [1], 1, 7>; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000203defm : SKLWriteResPair<WriteFVarShuffle, [SKLPort5], 1, [1], 1, 6>; // Floating point vector shuffles.
204defm : SKLWriteResPair<WriteFVarShuffleY, [SKLPort5], 1, [1], 1, 7>; // Floating point vector shuffles.
Simon Pilgrim06e16542018-04-22 18:35:53 +0000205defm : SKLWriteResPair<WriteFBlend, [SKLPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000206defm : SKLWriteResPair<WriteFBlendY, [SKLPort015], 1, [1], 1, 7>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000207defm : SKLWriteResPair<WriteFVarBlend, [SKLPort015], 2, [2], 2, 6>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000208defm : SKLWriteResPair<WriteFVarBlendY,[SKLPort015], 2, [2], 2, 7>; // Fp vector variable blends.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000209
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000210def : WriteRes<WriteCvtF2FSt, [SKLPort4,SKLPort5,SKLPort237,SKLPort01]> {
211 let Latency = 6;
212 let NumMicroOps = 4;
213 let ResourceCycles = [1,1,1,1];
214}
215
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000216// FMA Scheduling helper class.
217// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
218
219// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000220def : WriteRes<WriteVecLoad, [SKLPort23]> { let Latency = 6; }
221def : WriteRes<WriteVecStore, [SKLPort237, SKLPort4]>;
222def : WriteRes<WriteVecMove, [SKLPort015]>;
223
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000224defm : SKLWriteResPair<WriteVecALU, [SKLPort01], 1, [1], 1, 6>; // Vector integer ALU op, no logicals.
225defm : SKLWriteResPair<WriteVecALUY, [SKLPort01], 1, [1], 1, 7>; // Vector integer ALU op, no logicals (YMM/ZMM).
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000226defm : SKLWriteResPair<WriteVecLogic, [SKLPort015], 1, [1], 1, 6>; // Vector integer and/or/xor.
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000227defm : SKLWriteResPair<WriteVecLogicY,[SKLPort015], 1, [1], 1, 7>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000228defm : SKLWriteResPair<WriteVecIMul, [SKLPort0] , 4, [1], 1, 5>; // Vector integer multiply.
229defm : SKLWriteResPair<WriteVecIMulX, [SKLPort01], 4, [1], 1, 6>; // Vector integer multiply (XMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000230defm : SKLWriteResPair<WriteVecIMulY, [SKLPort01], 4, [1], 1, 7>; // Vector integer multiply (YMM/ZMM).
231defm : SKLWriteResPair<WritePMULLD, [SKLPort01], 10, [2], 2, 6>; // Vector PMULLD.
232defm : SKLWriteResPair<WritePMULLDY, [SKLPort01], 10, [2], 2, 7>; // Vector PMULLD (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000233defm : SKLWriteResPair<WriteShuffle, [SKLPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000234defm : SKLWriteResPair<WriteShuffleY, [SKLPort5], 1, [1], 1, 7>; // Vector shuffles (YMM/ZMM).
235defm : SKLWriteResPair<WriteVarShuffle, [SKLPort5], 1, [1], 1, 6>; // Vector shuffles.
236defm : SKLWriteResPair<WriteVarShuffleY, [SKLPort5], 1, [1], 1, 7>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim06e16542018-04-22 18:35:53 +0000237defm : SKLWriteResPair<WriteBlend, [SKLPort5], 1, [1], 1, 6>; // Vector blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000238defm : SKLWriteResPair<WriteBlendY, [SKLPort5], 1, [1], 1, 7>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000239defm : SKLWriteResPair<WriteVarBlend, [SKLPort015], 2, [2], 2, 6>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000240defm : SKLWriteResPair<WriteVarBlendY, [SKLPort015], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000241defm : SKLWriteResPair<WriteMPSAD, [SKLPort5], 4, [2], 2, 6>; // Vector MPSAD.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000242defm : SKLWriteResPair<WriteMPSADY, [SKLPort5], 4, [2], 2, 7>; // Vector MPSAD.
243defm : SKLWriteResPair<WritePSADBW, [SKLPort5], 3, [1], 1, 6>; // Vector PSADBW.
244defm : SKLWriteResPair<WritePSADBWY, [SKLPort5], 3, [1], 1, 7>; // Vector PSADBW.
Simon Pilgrim27bc83e2018-04-24 18:49:25 +0000245defm : SKLWriteResPair<WritePHMINPOS, [SKLPort01], 4, [1], 1, 6>; // Vector PHMINPOS.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000246
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000247// Vector integer shifts.
248defm : SKLWriteResPair<WriteVecShift, [SKLPort0], 1, [1], 1, 5>;
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000249defm : X86WriteRes<WriteVecShiftX, [SKLPort5,SKLPort01], 2, [1,1], 2>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000250defm : X86WriteRes<WriteVecShiftY, [SKLPort5,SKLPort01], 4, [1,1], 2>;
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000251defm : X86WriteRes<WriteVecShiftXLd, [SKLPort01,SKLPort23], 7, [1,1], 2>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000252defm : X86WriteRes<WriteVecShiftYLd, [SKLPort01,SKLPort23], 8, [1,1], 2>;
253
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000254defm : SKLWriteResPair<WriteVecShiftImm, [SKLPort0], 1, [1], 1, 5>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000255defm : SKLWriteResPair<WriteVecShiftImmX, [SKLPort01], 1, [1], 1, 6>; // Vector integer immediate shifts (XMM).
256defm : SKLWriteResPair<WriteVecShiftImmY, [SKLPort01], 1, [1], 1, 7>; // Vector integer immediate shifts (YMM/ZMM).
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000257defm : SKLWriteResPair<WriteVarVecShift, [SKLPort01], 1, [1], 1, 6>; // Variable vector shifts.
258defm : SKLWriteResPair<WriteVarVecShiftY, [SKLPort01], 1, [1], 1, 7>; // Variable vector shifts (YMM/ZMM).
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000259
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000260// Vector insert/extract operations.
261def : WriteRes<WriteVecInsert, [SKLPort5]> {
262 let Latency = 2;
263 let NumMicroOps = 2;
264 let ResourceCycles = [2];
265}
266def : WriteRes<WriteVecInsertLd, [SKLPort5,SKLPort23]> {
267 let Latency = 6;
268 let NumMicroOps = 2;
269}
Simon Pilgrim819f2182018-05-02 17:58:50 +0000270def: InstRW<[WriteVecInsertLd], (instregex "(V?)MOV(H|L)(PD|PS)rm")>;
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000271
272def : WriteRes<WriteVecExtract, [SKLPort0,SKLPort5]> {
273 let Latency = 3;
274 let NumMicroOps = 2;
275}
276def : WriteRes<WriteVecExtractSt, [SKLPort4,SKLPort5,SKLPort237]> {
277 let Latency = 2;
278 let NumMicroOps = 3;
279}
280
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000281// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000282defm : SKLWriteResPair<WriteCvtF2I, [SKLPort1], 3>; // Float -> Integer.
283defm : SKLWriteResPair<WriteCvtI2F, [SKLPort1], 4>; // Integer -> Float.
284defm : SKLWriteResPair<WriteCvtF2F, [SKLPort1], 3>; // Float -> Float size conversion.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000285
286// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000287
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000288// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000289def : WriteRes<WritePCmpIStrM, [SKLPort0]> {
290 let Latency = 10;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000291 let NumMicroOps = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000292 let ResourceCycles = [3];
293}
294def : WriteRes<WritePCmpIStrMLd, [SKLPort0, SKLPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000295 let Latency = 16;
296 let NumMicroOps = 4;
297 let ResourceCycles = [3,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000298}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000299
300// Packed Compare Explicit Length Strings, Return Mask
301def : WriteRes<WritePCmpEStrM, [SKLPort0, SKLPort5, SKLPort015, SKLPort0156]> {
302 let Latency = 19;
303 let NumMicroOps = 9;
304 let ResourceCycles = [4,3,1,1];
305}
306def : WriteRes<WritePCmpEStrMLd, [SKLPort0, SKLPort5,SKLPort23, SKLPort015, SKLPort0156]> {
307 let Latency = 25;
308 let NumMicroOps = 10;
309 let ResourceCycles = [4,3,1,1,1];
310}
311
312// Packed Compare Implicit Length Strings, Return Index
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000313def : WriteRes<WritePCmpIStrI, [SKLPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000314 let Latency = 10;
315 let NumMicroOps = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000316 let ResourceCycles = [3];
317}
318def : WriteRes<WritePCmpIStrILd, [SKLPort0, SKLPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000319 let Latency = 16;
320 let NumMicroOps = 4;
321 let ResourceCycles = [3,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000322}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000323
324// Packed Compare Explicit Length Strings, Return Index
325def : WriteRes<WritePCmpEStrI, [SKLPort0, SKLPort5, SKLPort0156]> {
326 let Latency = 18;
327 let NumMicroOps = 8;
328 let ResourceCycles = [4,3,1];
329}
330def : WriteRes<WritePCmpEStrILd, [SKLPort0, SKLPort5, SKLPort23, SKLPort0156]> {
331 let Latency = 24;
332 let NumMicroOps = 9;
333 let ResourceCycles = [4,3,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000334}
335
Simon Pilgrima2f26782018-03-27 20:38:54 +0000336// MOVMSK Instructions.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000337def : WriteRes<WriteFMOVMSK, [SKLPort0]> { let Latency = 2; }
338def : WriteRes<WriteVecMOVMSK, [SKLPort0]> { let Latency = 2; }
339def : WriteRes<WriteVecMOVMSKY, [SKLPort0]> { let Latency = 2; }
340def : WriteRes<WriteMMXMOVMSK, [SKLPort0]> { let Latency = 2; }
Simon Pilgrima2f26782018-03-27 20:38:54 +0000341
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000342// AES instructions.
Simon Pilgrim7684e052018-03-22 13:18:08 +0000343def : WriteRes<WriteAESDecEnc, [SKLPort0]> { // Decryption, encryption.
344 let Latency = 4;
345 let NumMicroOps = 1;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000346 let ResourceCycles = [1];
347}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000348def : WriteRes<WriteAESDecEncLd, [SKLPort0, SKLPort23]> {
349 let Latency = 10;
350 let NumMicroOps = 2;
351 let ResourceCycles = [1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000352}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000353
354def : WriteRes<WriteAESIMC, [SKLPort0]> { // InvMixColumn.
355 let Latency = 8;
356 let NumMicroOps = 2;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000357 let ResourceCycles = [2];
358}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000359def : WriteRes<WriteAESIMCLd, [SKLPort0, SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000360 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000361 let NumMicroOps = 3;
362 let ResourceCycles = [2,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000363}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000364
365def : WriteRes<WriteAESKeyGen, [SKLPort0, SKLPort5, SKLPort015]> { // Key Generation.
366 let Latency = 20;
367 let NumMicroOps = 11;
368 let ResourceCycles = [3,6,2];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000369}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000370def : WriteRes<WriteAESKeyGenLd, [SKLPort0, SKLPort5, SKLPort23, SKLPort015]> {
371 let Latency = 25;
372 let NumMicroOps = 11;
373 let ResourceCycles = [3,6,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000374}
375
376// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000377def : WriteRes<WriteCLMul, [SKLPort5]> {
378 let Latency = 6;
379 let NumMicroOps = 1;
380 let ResourceCycles = [1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000381}
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000382def : WriteRes<WriteCLMulLd, [SKLPort5, SKLPort23]> {
383 let Latency = 12;
384 let NumMicroOps = 2;
385 let ResourceCycles = [1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000386}
387
388// Catch-all for expensive system instructions.
389def : WriteRes<WriteSystem, [SKLPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
390
391// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000392defm : SKLWriteResPair<WriteFShuffle256, [SKLPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
393defm : SKLWriteResPair<WriteFVarShuffle256, [SKLPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
394defm : SKLWriteResPair<WriteShuffle256, [SKLPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
395defm : SKLWriteResPair<WriteVarShuffle256, [SKLPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000396
397// Old microcoded instructions that nobody use.
398def : WriteRes<WriteMicrocoded, [SKLPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
399
400// Fence instructions.
401def : WriteRes<WriteFence, [SKLPort23, SKLPort4]>;
402
Craig Topper05242bf2018-04-21 18:07:36 +0000403// Load/store MXCSR.
404def : WriteRes<WriteLDMXCSR, [SKLPort0,SKLPort23,SKLPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
405def : WriteRes<WriteSTMXCSR, [SKLPort4,SKLPort5,SKLPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
406
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000407// Nop, not very useful expect it provides a model for nops!
408def : WriteRes<WriteNop, []>;
409
410////////////////////////////////////////////////////////////////////////////////
411// Horizontal add/sub instructions.
412////////////////////////////////////////////////////////////////////////////////
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000413
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000414defm : SKLWriteResPair<WriteFHAdd, [SKLPort5,SKLPort01], 6, [2,1], 3, 6>;
415defm : SKLWriteResPair<WriteFHAddY, [SKLPort5,SKLPort01], 6, [2,1], 3, 7>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000416defm : SKLWriteResPair<WritePHAdd, [SKLPort5,SKLPort015], 3, [2,1], 3, 6>;
417defm : SKLWriteResPair<WritePHAddY, [SKLPort5,SKLPort015], 3, [2,1], 3, 7>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000418
419// Remaining instrs.
420
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000421def SKLWriteResGroup1 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000422 let Latency = 1;
423 let NumMicroOps = 1;
424 let ResourceCycles = [1];
425}
Craig Topperfc179c62018-03-22 04:23:41 +0000426def: InstRW<[SKLWriteResGroup1], (instregex "MMX_PADDSBirr",
427 "MMX_PADDSWirr",
428 "MMX_PADDUSBirr",
429 "MMX_PADDUSWirr",
430 "MMX_PAVGBirr",
431 "MMX_PAVGWirr",
432 "MMX_PCMPEQBirr",
433 "MMX_PCMPEQDirr",
434 "MMX_PCMPEQWirr",
435 "MMX_PCMPGTBirr",
436 "MMX_PCMPGTDirr",
437 "MMX_PCMPGTWirr",
438 "MMX_PMAXSWirr",
439 "MMX_PMAXUBirr",
440 "MMX_PMINSWirr",
441 "MMX_PMINUBirr",
Craig Topperfc179c62018-03-22 04:23:41 +0000442 "MMX_PSUBSBirr",
443 "MMX_PSUBSWirr",
444 "MMX_PSUBUSBirr",
445 "MMX_PSUBUSWirr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000446
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000447def SKLWriteResGroup3 : SchedWriteRes<[SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000448 let Latency = 1;
449 let NumMicroOps = 1;
450 let ResourceCycles = [1];
451}
Craig Topperfc179c62018-03-22 04:23:41 +0000452def: InstRW<[SKLWriteResGroup3], (instregex "COMP_FST0r",
453 "COM_FST0r",
Craig Topperfc179c62018-03-22 04:23:41 +0000454 "MMX_MOVD64rr",
455 "MMX_MOVD64to64rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000456 "UCOM_FPr",
457 "UCOM_Fr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000458 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000459 "(V?)MOVDI2PDIrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000460
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000461def SKLWriteResGroup4 : SchedWriteRes<[SKLPort6]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000462 let Latency = 1;
463 let NumMicroOps = 1;
464 let ResourceCycles = [1];
465}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000466def: InstRW<[SKLWriteResGroup4], (instregex "JMP(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000467
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000468def SKLWriteResGroup6 : SchedWriteRes<[SKLPort05]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000469 let Latency = 1;
470 let NumMicroOps = 1;
471 let ResourceCycles = [1];
472}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000473def: InstRW<[SKLWriteResGroup6], (instrs FINCSTP, FNOP)>;
474def: InstRW<[SKLWriteResGroup6], (instregex "MMX_MOVQ64rr",
Simon Pilgrim5e492d22018-04-19 17:32:10 +0000475 "MMX_PABS(B|D|W)rr",
476 "MMX_PADD(B|D|Q|W)irr",
Craig Topperfc179c62018-03-22 04:23:41 +0000477 "MMX_PANDNirr",
478 "MMX_PANDirr",
479 "MMX_PORirr",
Simon Pilgrim5e492d22018-04-19 17:32:10 +0000480 "MMX_PSIGN(B|D|W)rr",
481 "MMX_PSUB(B|D|Q|W)irr",
Craig Topperfc179c62018-03-22 04:23:41 +0000482 "MMX_PXORirr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000483
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000484def SKLWriteResGroup7 : SchedWriteRes<[SKLPort06]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000485 let Latency = 1;
486 let NumMicroOps = 1;
487 let ResourceCycles = [1];
488}
Simon Pilgrim455d0b22018-04-23 13:24:17 +0000489def: InstRW<[SKLWriteResGroup7], (instrs CDQ, CQO, CLAC, STAC)>;
Craig Topperfc179c62018-03-22 04:23:41 +0000490def: InstRW<[SKLWriteResGroup7], (instregex "ADC(16|32|64)ri",
491 "ADC(16|32|64)i",
492 "ADC(8|16|32|64)rr",
493 "ADCX(32|64)rr",
494 "ADOX(32|64)rr",
495 "BT(16|32|64)ri8",
496 "BT(16|32|64)rr",
497 "BTC(16|32|64)ri8",
498 "BTC(16|32|64)rr",
499 "BTR(16|32|64)ri8",
500 "BTR(16|32|64)rr",
501 "BTS(16|32|64)ri8",
502 "BTS(16|32|64)rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000503 "SBB(16|32|64)ri",
504 "SBB(16|32|64)i",
Simon Pilgrim39d77202018-04-28 15:32:19 +0000505 "SBB(8|16|32|64)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000506
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000507def SKLWriteResGroup8 : SchedWriteRes<[SKLPort15]> {
508 let Latency = 1;
509 let NumMicroOps = 1;
510 let ResourceCycles = [1];
511}
Craig Topperfc179c62018-03-22 04:23:41 +0000512def: InstRW<[SKLWriteResGroup8], (instregex "ANDN(32|64)rr",
513 "BLSI(32|64)rr",
514 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000515 "BLSR(32|64)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000516
517def SKLWriteResGroup9 : SchedWriteRes<[SKLPort015]> {
518 let Latency = 1;
519 let NumMicroOps = 1;
520 let ResourceCycles = [1];
521}
Simon Pilgrim37334ea2018-04-21 21:59:36 +0000522def: InstRW<[SKLWriteResGroup9], (instregex "(V?)PADDB(Y?)rr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000523 "(V?)PADDD(Y?)rr",
524 "(V?)PADDQ(Y?)rr",
525 "(V?)PADDW(Y?)rr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000526 "VPBLENDD(Y?)rri",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000527 "(V?)PSUBB(Y?)rr",
528 "(V?)PSUBD(Y?)rr",
529 "(V?)PSUBQ(Y?)rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000530 "(V?)PSUBW(Y?)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000531
532def SKLWriteResGroup10 : SchedWriteRes<[SKLPort0156]> {
533 let Latency = 1;
534 let NumMicroOps = 1;
535 let ResourceCycles = [1];
536}
Craig Topperfbe31322018-04-05 21:56:19 +0000537def: InstRW<[SKLWriteResGroup10], (instrs CBW, CWDE, CDQE)>;
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000538def: InstRW<[SKLWriteResGroup10], (instrs LAHF, SAHF)>; // TODO: This doesn't match Agner's data
Craig Topperf0d04262018-04-06 16:16:48 +0000539def: InstRW<[SKLWriteResGroup10], (instregex "CLC",
Craig Topperfc179c62018-03-22 04:23:41 +0000540 "CMC",
Craig Topperfc179c62018-03-22 04:23:41 +0000541 "NOOP",
Craig Topperfc179c62018-03-22 04:23:41 +0000542 "SGDT64m",
543 "SIDT64m",
Craig Topperfc179c62018-03-22 04:23:41 +0000544 "SMSW16m",
545 "STC",
546 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000547 "SYSCALL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000548
549def SKLWriteResGroup11 : SchedWriteRes<[SKLPort4,SKLPort237]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000550 let Latency = 1;
551 let NumMicroOps = 2;
552 let ResourceCycles = [1,1];
553}
Craig Topperfc179c62018-03-22 04:23:41 +0000554def: InstRW<[SKLWriteResGroup11], (instregex "FBSTPm",
555 "MMX_MOVD64from64rm",
556 "MMX_MOVD64mr",
557 "MMX_MOVNTQmr",
558 "MMX_MOVQ64mr",
Craig Topperfc179c62018-03-22 04:23:41 +0000559 "MOVNTI_64mr",
560 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000561 "ST_FP(32|64|80)m",
Craig Topperfc179c62018-03-22 04:23:41 +0000562 "VEXTRACTF128mr",
563 "VEXTRACTI128mr",
Craig Topper972bdbd2018-03-25 17:33:14 +0000564 "(V?)MOVAPDYmr",
565 "(V?)MOVAPS(Y?)mr",
566 "(V?)MOVDQA(Y?)mr",
567 "(V?)MOVDQU(Y?)mr",
568 "(V?)MOVHPDmr",
569 "(V?)MOVHPSmr",
570 "(V?)MOVLPDmr",
571 "(V?)MOVLPSmr",
572 "(V?)MOVNTDQ(Y?)mr",
573 "(V?)MOVNTPD(Y?)mr",
574 "(V?)MOVNTPS(Y?)mr",
575 "(V?)MOVPDI2DImr",
576 "(V?)MOVPQI2QImr",
577 "(V?)MOVPQIto64mr",
578 "(V?)MOVSDmr",
579 "(V?)MOVSSmr",
580 "(V?)MOVUPD(Y?)mr",
581 "(V?)MOVUPS(Y?)mr",
Craig Topperfc179c62018-03-22 04:23:41 +0000582 "VMPTRSTm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000583
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000584def SKLWriteResGroup12 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000585 let Latency = 2;
586 let NumMicroOps = 1;
587 let ResourceCycles = [1];
588}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000589def: InstRW<[SKLWriteResGroup12], (instregex "MMX_MOVD64from64rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000590 "MMX_MOVD64grr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000591 "(V?)MOVPDI2DIrr",
592 "(V?)MOVPQIto64rr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000593 "VTESTPD(Y?)rr",
Simon Pilgrim86e3c2692018-04-17 07:22:44 +0000594 "VTESTPS(Y?)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000595
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000596def SKLWriteResGroup13 : SchedWriteRes<[SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000597 let Latency = 2;
598 let NumMicroOps = 2;
599 let ResourceCycles = [2];
600}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000601def: InstRW<[SKLWriteResGroup13], (instregex "MMX_MOVQ2DQrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000602
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000603def SKLWriteResGroup14 : SchedWriteRes<[SKLPort05]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000604 let Latency = 2;
605 let NumMicroOps = 2;
606 let ResourceCycles = [2];
607}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000608def: InstRW<[SKLWriteResGroup14], (instrs FDECSTP)>;
609def: InstRW<[SKLWriteResGroup14], (instregex "MMX_MOVDQ2Qrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000610
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000611def SKLWriteResGroup15 : SchedWriteRes<[SKLPort06]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000612 let Latency = 2;
613 let NumMicroOps = 2;
614 let ResourceCycles = [2];
615}
Craig Topperfc179c62018-03-22 04:23:41 +0000616def: InstRW<[SKLWriteResGroup15], (instregex "CMOV(A|BE)(16|32|64)rr",
617 "ROL(8|16|32|64)r1",
618 "ROL(8|16|32|64)ri",
619 "ROR(8|16|32|64)r1",
620 "ROR(8|16|32|64)ri",
621 "SET(A|BE)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000622
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000623def SKLWriteResGroup17 : SchedWriteRes<[SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000624 let Latency = 2;
625 let NumMicroOps = 2;
626 let ResourceCycles = [2];
627}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000628def: InstRW<[SKLWriteResGroup17], (instrs LFENCE,
629 WAIT,
630 XGETBV)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000631
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000632def SKLWriteResGroup18 : SchedWriteRes<[SKLPort0,SKLPort237]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000633 let Latency = 2;
634 let NumMicroOps = 2;
635 let ResourceCycles = [1,1];
636}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000637def: InstRW<[SKLWriteResGroup18], (instregex "VMASKMOVPD(Y?)mr",
638 "VMASKMOVPS(Y?)mr",
639 "VPMASKMOVD(Y?)mr",
640 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000641
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000642def SKLWriteResGroup20 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000643 let Latency = 2;
644 let NumMicroOps = 2;
645 let ResourceCycles = [1,1];
646}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000647def: InstRW<[SKLWriteResGroup20], (instregex "CLFLUSH")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000648
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000649def SKLWriteResGroup21 : SchedWriteRes<[SKLPort237,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000650 let Latency = 2;
651 let NumMicroOps = 2;
652 let ResourceCycles = [1,1];
653}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000654def: InstRW<[SKLWriteResGroup21], (instregex "SFENCE")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000655
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000656def SKLWriteResGroup22 : SchedWriteRes<[SKLPort06,SKLPort15]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000657 let Latency = 2;
658 let NumMicroOps = 2;
659 let ResourceCycles = [1,1];
660}
Craig Topper498875f2018-04-04 17:54:19 +0000661def: InstRW<[SKLWriteResGroup22], (instrs BSWAP64r)>;
662
663def SKLWriteResGroup22_1 : SchedWriteRes<[SKLPort15]> {
664 let Latency = 1;
665 let NumMicroOps = 1;
666 let ResourceCycles = [1];
667}
668def: InstRW<[SKLWriteResGroup22_1], (instrs BSWAP32r)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000669
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000670def SKLWriteResGroup23 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000671 let Latency = 2;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000672 let NumMicroOps = 2;
673 let ResourceCycles = [1,1];
674}
Craig Topper2d451e72018-03-18 08:38:06 +0000675def: InstRW<[SKLWriteResGroup23], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000676def: InstRW<[SKLWriteResGroup23], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topperfc179c62018-03-22 04:23:41 +0000677def: InstRW<[SKLWriteResGroup23], (instregex "ADC8i8",
678 "ADC8ri",
679 "SBB8i8",
680 "SBB8ri")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000681
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000682def SKLWriteResGroup25 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort237]> {
683 let Latency = 2;
684 let NumMicroOps = 3;
685 let ResourceCycles = [1,1,1];
686}
687def: InstRW<[SKLWriteResGroup25], (instregex "FNSTCW16m")>;
688
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000689def SKLWriteResGroup27 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort15]> {
690 let Latency = 2;
691 let NumMicroOps = 3;
692 let ResourceCycles = [1,1,1];
693}
694def: InstRW<[SKLWriteResGroup27], (instregex "MOVBE(16|32|64)mr")>;
695
696def SKLWriteResGroup28 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort0156]> {
697 let Latency = 2;
698 let NumMicroOps = 3;
699 let ResourceCycles = [1,1,1];
700}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000701def: InstRW<[SKLWriteResGroup28], (instrs PUSH16r, PUSH32r, PUSH64r,
702 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topperfc179c62018-03-22 04:23:41 +0000703def: InstRW<[SKLWriteResGroup28], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000704 "PUSH64i8")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000705
706def SKLWriteResGroup29 : SchedWriteRes<[SKLPort1]> {
707 let Latency = 3;
708 let NumMicroOps = 1;
709 let ResourceCycles = [1];
710}
Simon Pilgrime93fd5f2018-05-02 09:18:49 +0000711def: InstRW<[SKLWriteResGroup29], (instregex "CMOV(N?)(B|BE|E|P)_F",
712 "PDEP(32|64)rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000713 "PEXT(32|64)rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000714 "SHLD(16|32|64)rri8",
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000715 "SHRD(16|32|64)rri8")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000716
Clement Courbet327fac42018-03-07 08:14:02 +0000717def SKLWriteResGroup29_16i : SchedWriteRes<[SKLPort1, SKLPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000718 let Latency = 4;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000719 let NumMicroOps = 2;
720 let ResourceCycles = [1,1];
721}
Clement Courbet327fac42018-03-07 08:14:02 +0000722def: InstRW<[SKLWriteResGroup29_16i], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000723
724def SKLWriteResGroup30 : SchedWriteRes<[SKLPort5]> {
725 let Latency = 3;
726 let NumMicroOps = 1;
727 let ResourceCycles = [1];
728}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000729def: InstRW<[SKLWriteResGroup30], (instregex "(ADD|SUB|SUBR)_FPrST0",
730 "(ADD|SUB|SUBR)_FST0r",
731 "(ADD|SUB|SUBR)_FrST0",
Simon Pilgrim74ccc6a2018-04-21 19:11:55 +0000732 "VPBROADCASTBrr",
Simon Pilgrim825ead92018-04-21 20:45:12 +0000733 "VPBROADCASTWrr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000734 "(V?)PCMPGTQ(Y?)rr",
Craig Topperfc179c62018-03-22 04:23:41 +0000735 "VPMOVSXBDYrr",
736 "VPMOVSXBQYrr",
737 "VPMOVSXBWYrr",
738 "VPMOVSXDQYrr",
739 "VPMOVSXWDYrr",
740 "VPMOVSXWQYrr",
741 "VPMOVZXBDYrr",
742 "VPMOVZXBQYrr",
743 "VPMOVZXBWYrr",
744 "VPMOVZXDQYrr",
745 "VPMOVZXWDYrr",
Craig Toppere56a2fc2018-04-17 19:35:19 +0000746 "VPMOVZXWQYrr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000747
748def SKLWriteResGroup31 : SchedWriteRes<[SKLPort0,SKLPort5]> {
749 let Latency = 3;
750 let NumMicroOps = 2;
751 let ResourceCycles = [1,1];
752}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000753def: InstRW<[SKLWriteResGroup31], (instregex "(V?)PTEST(Y?)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000754
755def SKLWriteResGroup32 : SchedWriteRes<[SKLPort0,SKLPort0156]> {
756 let Latency = 3;
757 let NumMicroOps = 2;
758 let ResourceCycles = [1,1];
759}
760def: InstRW<[SKLWriteResGroup32], (instregex "FNSTSW16r")>;
761
762def SKLWriteResGroup33 : SchedWriteRes<[SKLPort06]> {
763 let Latency = 3;
764 let NumMicroOps = 3;
765 let ResourceCycles = [3];
766}
Craig Topperfc179c62018-03-22 04:23:41 +0000767def: InstRW<[SKLWriteResGroup33], (instregex "ROL(8|16|32|64)rCL",
768 "ROR(8|16|32|64)rCL",
769 "SAR(8|16|32|64)rCL",
770 "SHL(8|16|32|64)rCL",
771 "SHR(8|16|32|64)rCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000772
773def SKLWriteResGroup34 : SchedWriteRes<[SKLPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000774 let Latency = 2;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000775 let NumMicroOps = 3;
776 let ResourceCycles = [3];
777}
Craig Topperb5f26592018-04-19 18:00:17 +0000778def: InstRW<[SKLWriteResGroup34], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
779 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
780 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000781
782def SKLWriteResGroup35 : SchedWriteRes<[SKLPort0,SKLPort5]> {
783 let Latency = 3;
784 let NumMicroOps = 3;
785 let ResourceCycles = [1,2];
786}
Simon Pilgrim5e492d22018-04-19 17:32:10 +0000787def: InstRW<[SKLWriteResGroup35], (instregex "MMX_PH(ADD|SUB)SWrr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000788
789def SKLWriteResGroup36 : SchedWriteRes<[SKLPort5,SKLPort01]> {
790 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000791 let NumMicroOps = 3;
792 let ResourceCycles = [2,1];
793}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000794def: InstRW<[SKLWriteResGroup36], (instregex "(V?)PHADDSW(Y?)rr",
795 "(V?)PHSUBSW(Y?)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000796
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000797def SKLWriteResGroup37 : SchedWriteRes<[SKLPort5,SKLPort05]> {
798 let Latency = 3;
799 let NumMicroOps = 3;
800 let ResourceCycles = [2,1];
801}
Simon Pilgrim5e492d22018-04-19 17:32:10 +0000802def: InstRW<[SKLWriteResGroup37], (instregex "MMX_PH(ADD|SUB)(D|W)rr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000803
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000804def SKLWriteResGroup39 : SchedWriteRes<[SKLPort5,SKLPort0156]> {
805 let Latency = 3;
806 let NumMicroOps = 3;
807 let ResourceCycles = [2,1];
808}
Craig Topperfc179c62018-03-22 04:23:41 +0000809def: InstRW<[SKLWriteResGroup39], (instregex "MMX_PACKSSDWirr",
810 "MMX_PACKSSWBirr",
811 "MMX_PACKUSWBirr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000812
813def SKLWriteResGroup40 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
814 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000815 let NumMicroOps = 3;
816 let ResourceCycles = [1,2];
817}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000818def: InstRW<[SKLWriteResGroup40], (instregex "CLD")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000819
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000820def SKLWriteResGroup41 : SchedWriteRes<[SKLPort237,SKLPort0156]> {
821 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000822 let NumMicroOps = 3;
823 let ResourceCycles = [1,2];
824}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000825def: InstRW<[SKLWriteResGroup41], (instrs MFENCE)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000826
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000827def SKLWriteResGroup42 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
828 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000829 let NumMicroOps = 3;
830 let ResourceCycles = [1,2];
831}
Craig Topperfc179c62018-03-22 04:23:41 +0000832def: InstRW<[SKLWriteResGroup42], (instregex "RCL(8|16|32|64)r1",
833 "RCL(8|16|32|64)ri",
834 "RCR(8|16|32|64)r1",
835 "RCR(8|16|32|64)ri")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000836
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000837def SKLWriteResGroup43 : SchedWriteRes<[SKLPort0,SKLPort4,SKLPort237]> {
838 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000839 let NumMicroOps = 3;
840 let ResourceCycles = [1,1,1];
841}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000842def: InstRW<[SKLWriteResGroup43], (instregex "FNSTSWm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000843
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000844def SKLWriteResGroup44 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort06]> {
845 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000846 let NumMicroOps = 4;
847 let ResourceCycles = [1,1,2];
848}
Craig Topperf4cd9082018-01-19 05:47:32 +0000849def: InstRW<[SKLWriteResGroup44], (instregex "SET(A|BE)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000850
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000851def SKLWriteResGroup45 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort237,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<[SKLWriteResGroup45], (instregex "CALL(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000857
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000858def SKLWriteResGroup46 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort06,SKLPort0156]> {
859 let Latency = 3;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000860 let NumMicroOps = 4;
861 let ResourceCycles = [1,1,1,1];
862}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000863def: InstRW<[SKLWriteResGroup46], (instregex "CALL64pcrel32")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000864
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000865def SKLWriteResGroup47 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000866 let Latency = 4;
867 let NumMicroOps = 1;
868 let ResourceCycles = [1];
869}
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000870def: InstRW<[SKLWriteResGroup47], (instregex "MUL_FPrST0",
Craig Topperfc179c62018-03-22 04:23:41 +0000871 "MUL_FST0r",
Simon Pilgrim93b102c2018-04-21 15:16:59 +0000872 "MUL_FrST0")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000873
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000874def SKLWriteResGroup48 : SchedWriteRes<[SKLPort01]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000875 let Latency = 4;
876 let NumMicroOps = 1;
877 let ResourceCycles = [1];
878}
Simon Pilgrime93fd5f2018-05-02 09:18:49 +0000879def: InstRW<[SKLWriteResGroup48], (instregex "(V?)CVTDQ2PS(Y?)rr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000880 "(V?)CVTPS2DQ(Y?)rr",
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000881 "(V?)CVTTPS2DQ(Y?)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000882
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000883def SKLWriteResGroup51 : SchedWriteRes<[SKLPort1,SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000884 let Latency = 4;
885 let NumMicroOps = 2;
886 let ResourceCycles = [1,1];
887}
Craig Topperf846e2d2018-04-19 05:34:05 +0000888def: InstRW<[SKLWriteResGroup51], (instrs IMUL64r, MUL64r, MULX64rr)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000889
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000890def SKLWriteResGroup51_16 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
891 let Latency = 4;
892 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000893 let ResourceCycles = [1,1,2];
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000894}
Craig Topperfc179c62018-03-22 04:23:41 +0000895def: InstRW<[SKLWriteResGroup51_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000896
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000897def SKLWriteResGroup53 : SchedWriteRes<[SKLPort4,SKLPort5,SKLPort237]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000898 let Latency = 4;
899 let NumMicroOps = 3;
900 let ResourceCycles = [1,1,1];
901}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000902def: InstRW<[SKLWriteResGroup53], (instregex "IST(T?)_FP(16|32|64)m",
903 "IST_F(16|32)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000904
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000905def SKLWriteResGroup54 : SchedWriteRes<[SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000906 let Latency = 4;
907 let NumMicroOps = 4;
908 let ResourceCycles = [4];
909}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000910def: InstRW<[SKLWriteResGroup54], (instrs FNCLEX)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000911
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000912def SKLWriteResGroup55 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000913 let Latency = 4;
914 let NumMicroOps = 4;
915 let ResourceCycles = [1,3];
916}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000917def: InstRW<[SKLWriteResGroup55], (instrs PAUSE)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000918
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000919def SKLWriteResGroup56 : SchedWriteRes<[SKLPort015,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000920 let Latency = 4;
921 let NumMicroOps = 4;
922 let ResourceCycles = [1,3];
923}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000924def: InstRW<[SKLWriteResGroup56], (instrs VZEROUPPER)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000925
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000926def SKLWriteResGroup57 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000927 let Latency = 4;
928 let NumMicroOps = 4;
929 let ResourceCycles = [1,1,2];
930}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000931def: InstRW<[SKLWriteResGroup57], (instregex "LAR(16|32|64)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000932
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000933def SKLWriteResGroup58 : SchedWriteRes<[SKLPort23]> {
934 let Latency = 5;
935 let NumMicroOps = 1;
936 let ResourceCycles = [1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000937}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000938def: InstRW<[SKLWriteResGroup58], (instregex "MOVSX(16|32|64)rm16",
Craig Topperfc179c62018-03-22 04:23:41 +0000939 "MOVSX(16|32|64)rm32",
940 "MOVSX(16|32|64)rm8",
941 "MOVZX(16|32|64)rm16",
942 "MOVZX(16|32|64)rm8",
Simon Pilgrim37334ea2018-04-21 21:59:36 +0000943 "(V?)MOVDDUPrm")>; // TODO: Should this be SKLWriteResGroup67?
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000944
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000945def SKLWriteResGroup59 : SchedWriteRes<[SKLPort0,SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000946 let Latency = 5;
947 let NumMicroOps = 2;
948 let ResourceCycles = [1,1];
949}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000950def: InstRW<[SKLWriteResGroup59], (instregex "MMX_CVTPI2PDirr",
951 "(V?)CVTDQ2PDrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000952
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000953def SKLWriteResGroup60 : SchedWriteRes<[SKLPort5,SKLPort015]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000954 let Latency = 5;
955 let NumMicroOps = 2;
956 let ResourceCycles = [1,1];
957}
Simon Pilgrim31a96332018-03-24 20:40:14 +0000958def: InstRW<[SKLWriteResGroup60], (instregex "MMX_CVTPD2PIirr",
Craig Topperfc179c62018-03-22 04:23:41 +0000959 "MMX_CVTPS2PIirr",
960 "MMX_CVTTPD2PIirr",
961 "MMX_CVTTPS2PIirr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000962 "(V?)CVTPD2DQrr",
963 "(V?)CVTPD2PSrr",
Craig Topperfc179c62018-03-22 04:23:41 +0000964 "VCVTPH2PSrr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000965 "(V?)CVTPS2PDrr",
Craig Topperfc179c62018-03-22 04:23:41 +0000966 "VCVTPS2PHrr",
Simon Pilgrim31a96332018-03-24 20:40:14 +0000967 "(V?)CVTSD2SSrr",
968 "(V?)CVTSI642SDrr",
969 "(V?)CVTSI2SDrr",
970 "(V?)CVTSI2SSrr",
971 "(V?)CVTSS2SDrr",
972 "(V?)CVTTPD2DQrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000973
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000974def SKLWriteResGroup61 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort06]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000975 let Latency = 5;
976 let NumMicroOps = 3;
977 let ResourceCycles = [1,1,1];
978}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000979def: InstRW<[SKLWriteResGroup61], (instregex "STR(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000980
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000981def SKLWriteResGroup62 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000982 let Latency = 4;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000983 let NumMicroOps = 3;
984 let ResourceCycles = [1,1,1];
985}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000986def: InstRW<[SKLWriteResGroup62], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000987
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000988def SKLWriteResGroup63 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000989 let Latency = 5;
990 let NumMicroOps = 5;
991 let ResourceCycles = [1,4];
992}
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000993def: InstRW<[SKLWriteResGroup63], (instregex "XSETBV")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000994
Gadi Haber1e0f1f42017-10-17 06:47:04 +0000995def SKLWriteResGroup64 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +0000996 let Latency = 5;
997 let NumMicroOps = 5;
998 let ResourceCycles = [2,3];
999}
Craig Topper13a16502018-03-19 00:56:09 +00001000def: InstRW<[SKLWriteResGroup64], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001001
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001002def SKLWriteResGroup65 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001003 let Latency = 5;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001004 let NumMicroOps = 6;
1005 let ResourceCycles = [1,1,4];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001006}
Craig Topperfc179c62018-03-22 04:23:41 +00001007def: InstRW<[SKLWriteResGroup65], (instregex "PUSHF16",
1008 "PUSHF64")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001009
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001010def SKLWriteResGroup67 : SchedWriteRes<[SKLPort23]> {
1011 let Latency = 6;
1012 let NumMicroOps = 1;
1013 let ResourceCycles = [1];
1014}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001015def: InstRW<[SKLWriteResGroup67], (instregex "VBROADCASTSSrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001016 "(V?)MOVSHDUPrm",
1017 "(V?)MOVSLDUPrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001018 "VPBROADCASTDrm",
1019 "VPBROADCASTQrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001020
1021def SKLWriteResGroup68 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001022 let Latency = 6;
1023 let NumMicroOps = 2;
1024 let ResourceCycles = [2];
1025}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001026def: InstRW<[SKLWriteResGroup68], (instregex "MMX_CVTPI2PSirr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001027
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001028def SKLWriteResGroup69 : SchedWriteRes<[SKLPort0,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001029 let Latency = 6;
1030 let NumMicroOps = 2;
1031 let ResourceCycles = [1,1];
1032}
Craig Topperfc179c62018-03-22 04:23:41 +00001033def: InstRW<[SKLWriteResGroup69], (instregex "MMX_PADDSBirm",
1034 "MMX_PADDSWirm",
1035 "MMX_PADDUSBirm",
1036 "MMX_PADDUSWirm",
1037 "MMX_PAVGBirm",
1038 "MMX_PAVGWirm",
1039 "MMX_PCMPEQBirm",
1040 "MMX_PCMPEQDirm",
1041 "MMX_PCMPEQWirm",
1042 "MMX_PCMPGTBirm",
1043 "MMX_PCMPGTDirm",
1044 "MMX_PCMPGTWirm",
1045 "MMX_PMAXSWirm",
1046 "MMX_PMAXUBirm",
1047 "MMX_PMINSWirm",
1048 "MMX_PMINUBirm",
Craig Topperfc179c62018-03-22 04:23:41 +00001049 "MMX_PSUBSBirm",
1050 "MMX_PSUBSWirm",
1051 "MMX_PSUBUSBirm",
1052 "MMX_PSUBUSWirm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001053
Craig Topper58afb4e2018-03-22 21:10:07 +00001054def SKLWriteResGroup70 : SchedWriteRes<[SKLPort0,SKLPort01]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001055 let Latency = 6;
1056 let NumMicroOps = 2;
1057 let ResourceCycles = [1,1];
1058}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001059def: InstRW<[SKLWriteResGroup70], (instregex "(V?)CVTSD2SI64rr",
1060 "(V?)CVTSD2SIrr",
1061 "(V?)CVTSS2SI64rr",
1062 "(V?)CVTSS2SIrr",
1063 "(V?)CVTTSD2SI64rr",
1064 "(V?)CVTTSD2SIrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001065
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001066def SKLWriteResGroup72 : SchedWriteRes<[SKLPort6,SKLPort23]> {
1067 let Latency = 6;
1068 let NumMicroOps = 2;
1069 let ResourceCycles = [1,1];
1070}
Craig Topperfc179c62018-03-22 04:23:41 +00001071def: InstRW<[SKLWriteResGroup72], (instregex "FARJMP64",
1072 "JMP(16|32|64)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001073
1074def SKLWriteResGroup73 : SchedWriteRes<[SKLPort23,SKLPort05]> {
1075 let Latency = 6;
1076 let NumMicroOps = 2;
1077 let ResourceCycles = [1,1];
1078}
Simon Pilgrim5e492d22018-04-19 17:32:10 +00001079def: InstRW<[SKLWriteResGroup73], (instregex "MMX_PABS(B|D|W)rm",
1080 "MMX_PADD(B|D|Q|W)irm",
Craig Topperfc179c62018-03-22 04:23:41 +00001081 "MMX_PANDNirm",
1082 "MMX_PANDirm",
1083 "MMX_PORirm",
Simon Pilgrim5e492d22018-04-19 17:32:10 +00001084 "MMX_PSIGN(B|D|W)rm",
1085 "MMX_PSUB(B|D|Q|W)irm",
Craig Topperfc179c62018-03-22 04:23:41 +00001086 "MMX_PXORirm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001087
1088def SKLWriteResGroup74 : SchedWriteRes<[SKLPort23,SKLPort06]> {
1089 let Latency = 6;
1090 let NumMicroOps = 2;
1091 let ResourceCycles = [1,1];
1092}
Simon Pilgrimeb609092018-04-23 22:19:55 +00001093def: InstRW<[SKLWriteResGroup74], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001094def: InstRW<[SKLWriteResGroup74, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
1095 ADCX32rm, ADCX64rm,
1096 ADOX32rm, ADOX64rm,
1097 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001098
1099def SKLWriteResGroup75 : SchedWriteRes<[SKLPort23,SKLPort15]> {
1100 let Latency = 6;
1101 let NumMicroOps = 2;
1102 let ResourceCycles = [1,1];
1103}
Craig Topperfc179c62018-03-22 04:23:41 +00001104def: InstRW<[SKLWriteResGroup75], (instregex "ANDN(32|64)rm",
1105 "BLSI(32|64)rm",
1106 "BLSMSK(32|64)rm",
1107 "BLSR(32|64)rm",
Craig Topperfc179c62018-03-22 04:23:41 +00001108 "MOVBE(16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001109
1110def SKLWriteResGroup76 : SchedWriteRes<[SKLPort23,SKLPort0156]> {
1111 let Latency = 6;
1112 let NumMicroOps = 2;
1113 let ResourceCycles = [1,1];
1114}
Craig Topper2d451e72018-03-18 08:38:06 +00001115def: InstRW<[SKLWriteResGroup76], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001116def: InstRW<[SKLWriteResGroup76], (instregex "POP(16|32|64)rmr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001117
Craig Topper58afb4e2018-03-22 21:10:07 +00001118def SKLWriteResGroup78 : SchedWriteRes<[SKLPort5,SKLPort01]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001119 let Latency = 6;
1120 let NumMicroOps = 3;
1121 let ResourceCycles = [2,1];
1122}
Craig Topperfc179c62018-03-22 04:23:41 +00001123def: InstRW<[SKLWriteResGroup78], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001124
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001125def SKLWriteResGroup79 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001126 let Latency = 6;
1127 let NumMicroOps = 4;
1128 let ResourceCycles = [1,2,1];
1129}
Craig Topperfc179c62018-03-22 04:23:41 +00001130def: InstRW<[SKLWriteResGroup79], (instregex "SHLD(16|32|64)rrCL",
1131 "SHRD(16|32|64)rrCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001132
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001133def SKLWriteResGroup80 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001134 let Latency = 6;
1135 let NumMicroOps = 4;
1136 let ResourceCycles = [1,1,1,1];
1137}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001138def: InstRW<[SKLWriteResGroup80], (instregex "SLDT(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001139
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001140def SKLWriteResGroup82 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06]> {
1141 let Latency = 6;
1142 let NumMicroOps = 4;
1143 let ResourceCycles = [1,1,1,1];
1144}
Craig Topperfc179c62018-03-22 04:23:41 +00001145def: InstRW<[SKLWriteResGroup82], (instregex "BTC(16|32|64)mi8",
1146 "BTR(16|32|64)mi8",
1147 "BTS(16|32|64)mi8",
1148 "SAR(8|16|32|64)m1",
1149 "SAR(8|16|32|64)mi",
1150 "SHL(8|16|32|64)m1",
1151 "SHL(8|16|32|64)mi",
1152 "SHR(8|16|32|64)m1",
1153 "SHR(8|16|32|64)mi")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001154
1155def SKLWriteResGroup83 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort0156]> {
1156 let Latency = 6;
1157 let NumMicroOps = 4;
1158 let ResourceCycles = [1,1,1,1];
1159}
Craig Topperf0d04262018-04-06 16:16:48 +00001160def: InstRW<[SKLWriteResGroup83], (instregex "POP(16|32|64)rmm",
1161 "PUSH(16|32|64)rmm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001162
1163def SKLWriteResGroup84 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001164 let Latency = 6;
1165 let NumMicroOps = 6;
1166 let ResourceCycles = [1,5];
1167}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001168def: InstRW<[SKLWriteResGroup84], (instregex "STD")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001169
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001170def SKLWriteResGroup85 : SchedWriteRes<[SKLPort23]> {
1171 let Latency = 7;
1172 let NumMicroOps = 1;
1173 let ResourceCycles = [1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001174}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001175def: InstRW<[SKLWriteResGroup85], (instregex "LD_F(32|64|80)m",
Craig Topperfc179c62018-03-22 04:23:41 +00001176 "VBROADCASTF128",
1177 "VBROADCASTI128",
1178 "VBROADCASTSDYrm",
1179 "VBROADCASTSSYrm",
1180 "VLDDQUYrm",
1181 "VMOVAPDYrm",
1182 "VMOVAPSYrm",
1183 "VMOVDDUPYrm",
1184 "VMOVDQAYrm",
1185 "VMOVDQUYrm",
1186 "VMOVNTDQAYrm",
1187 "VMOVSHDUPYrm",
1188 "VMOVSLDUPYrm",
1189 "VMOVUPDYrm",
1190 "VMOVUPSYrm",
1191 "VPBROADCASTDYrm",
1192 "VPBROADCASTQYrm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001193
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001194def SKLWriteResGroup86 : SchedWriteRes<[SKLPort0,SKLPort5]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001195 let Latency = 7;
1196 let NumMicroOps = 2;
1197 let ResourceCycles = [1,1];
1198}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001199def: InstRW<[SKLWriteResGroup86], (instregex "VCVTDQ2PDYrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001200
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001201def SKLWriteResGroup88 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1202 let Latency = 7;
1203 let NumMicroOps = 2;
1204 let ResourceCycles = [1,1];
1205}
Simon Pilgrim819f2182018-05-02 17:58:50 +00001206def: InstRW<[SKLWriteResGroup88], (instregex "(V?)PACKSSDWrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001207 "(V?)PACKSSWBrm",
1208 "(V?)PACKUSDWrm",
1209 "(V?)PACKUSWBrm",
1210 "(V?)PALIGNRrmi",
Craig Topperfc179c62018-03-22 04:23:41 +00001211 "VPBROADCASTBrm",
1212 "VPBROADCASTWrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001213 "(V?)PSHUFDmi",
1214 "(V?)PSHUFHWmi",
1215 "(V?)PSHUFLWmi",
1216 "(V?)PUNPCKHBWrm",
1217 "(V?)PUNPCKHDQrm",
1218 "(V?)PUNPCKHQDQrm",
1219 "(V?)PUNPCKHWDrm",
1220 "(V?)PUNPCKLBWrm",
1221 "(V?)PUNPCKLDQrm",
1222 "(V?)PUNPCKLQDQrm",
Simon Pilgrim819f2182018-05-02 17:58:50 +00001223 "(V?)PUNPCKLWDrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001224
Simon Pilgrim6732f6e2018-05-02 18:48:23 +00001225def SKLWriteResGroup88a : SchedWriteRes<[SKLPort5,SKLPort23]> {
1226 let Latency = 6;
1227 let NumMicroOps = 2;
1228 let ResourceCycles = [1,1];
1229}
1230def: InstRW<[SKLWriteResGroup88a], (instregex "MMX_PSHUFBrm")>;
1231
Craig Topper58afb4e2018-03-22 21:10:07 +00001232def SKLWriteResGroup89 : SchedWriteRes<[SKLPort5,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001233 let Latency = 7;
1234 let NumMicroOps = 2;
1235 let ResourceCycles = [1,1];
1236}
Craig Topperfc179c62018-03-22 04:23:41 +00001237def: InstRW<[SKLWriteResGroup89], (instregex "VCVTPD2DQYrr",
1238 "VCVTPD2PSYrr",
1239 "VCVTPH2PSYrr",
1240 "VCVTPS2PDYrr",
1241 "VCVTPS2PHYrr",
1242 "VCVTTPD2DQYrr")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001243
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001244def SKLWriteResGroup91 : SchedWriteRes<[SKLPort23,SKLPort015]> {
1245 let Latency = 7;
1246 let NumMicroOps = 2;
1247 let ResourceCycles = [1,1];
1248}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001249def: InstRW<[SKLWriteResGroup91], (instregex "(V?)INSERTF128rm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001250 "(V?)INSERTI128rm",
1251 "(V?)MASKMOVPDrm",
1252 "(V?)MASKMOVPSrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001253 "(V?)PADDBrm",
1254 "(V?)PADDDrm",
1255 "(V?)PADDQrm",
1256 "(V?)PADDWrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001257 "(V?)PBLENDDrmi",
1258 "(V?)PMASKMOVDrm",
1259 "(V?)PMASKMOVQrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001260 "(V?)PSUBBrm",
1261 "(V?)PSUBDrm",
1262 "(V?)PSUBQrm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001263 "(V?)PSUBWrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001264
1265def SKLWriteResGroup92 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1266 let Latency = 7;
1267 let NumMicroOps = 3;
1268 let ResourceCycles = [2,1];
1269}
Craig Topperfc179c62018-03-22 04:23:41 +00001270def: InstRW<[SKLWriteResGroup92], (instregex "MMX_PACKSSDWirm",
1271 "MMX_PACKSSWBirm",
1272 "MMX_PACKUSWBirm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001273
1274def SKLWriteResGroup93 : SchedWriteRes<[SKLPort23,SKLPort06]> {
1275 let Latency = 7;
1276 let NumMicroOps = 3;
1277 let ResourceCycles = [1,2];
1278}
Craig Topperf4cd9082018-01-19 05:47:32 +00001279def: InstRW<[SKLWriteResGroup93], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001280
1281def SKLWriteResGroup94 : SchedWriteRes<[SKLPort23,SKLPort0156]> {
1282 let Latency = 7;
1283 let NumMicroOps = 3;
1284 let ResourceCycles = [1,2];
1285}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001286def: InstRW<[SKLWriteResGroup94], (instrs LEAVE, LEAVE64,
1287 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001288
Craig Topper58afb4e2018-03-22 21:10:07 +00001289def SKLWriteResGroup95 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort01]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001290 let Latency = 7;
1291 let NumMicroOps = 3;
1292 let ResourceCycles = [1,1,1];
1293}
Craig Topperfc179c62018-03-22 04:23:41 +00001294def: InstRW<[SKLWriteResGroup95], (instregex "(V?)CVTTSS2SI64rr",
1295 "(V?)CVTTSS2SIrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001296
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001297def SKLWriteResGroup96 : SchedWriteRes<[SKLPort0,SKLPort23,SKLPort05]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001298 let Latency = 7;
1299 let NumMicroOps = 3;
1300 let ResourceCycles = [1,1,1];
1301}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001302def: InstRW<[SKLWriteResGroup96], (instregex "FLDCW16m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001303
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001304def SKLWriteResGroup98 : SchedWriteRes<[SKLPort6,SKLPort23,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001305 let Latency = 7;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001306 let NumMicroOps = 3;
1307 let ResourceCycles = [1,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001308}
Craig Topperfc179c62018-03-22 04:23:41 +00001309def: InstRW<[SKLWriteResGroup98], (instregex "LRETQ",
1310 "RETQ")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001311
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001312def SKLWriteResGroup100 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06]> {
1313 let Latency = 7;
1314 let NumMicroOps = 5;
1315 let ResourceCycles = [1,1,1,2];
1316}
Craig Topperfc179c62018-03-22 04:23:41 +00001317def: InstRW<[SKLWriteResGroup100], (instregex "ROL(8|16|32|64)m1",
1318 "ROL(8|16|32|64)mi",
1319 "ROR(8|16|32|64)m1",
1320 "ROR(8|16|32|64)mi")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001321
1322def SKLWriteResGroup101 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort0156]> {
1323 let Latency = 7;
1324 let NumMicroOps = 5;
1325 let ResourceCycles = [1,1,1,2];
1326}
Craig Topper13a16502018-03-19 00:56:09 +00001327def: InstRW<[SKLWriteResGroup101], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001328
1329def SKLWriteResGroup102 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
1330 let Latency = 7;
1331 let NumMicroOps = 5;
1332 let ResourceCycles = [1,1,1,1,1];
1333}
Craig Topperfc179c62018-03-22 04:23:41 +00001334def: InstRW<[SKLWriteResGroup102], (instregex "CALL(16|32|64)m",
1335 "FARCALL64")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001336
1337def SKLWriteResGroup103 : SchedWriteRes<[SKLPort6,SKLPort06,SKLPort15,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001338 let Latency = 7;
1339 let NumMicroOps = 7;
1340 let ResourceCycles = [1,3,1,2];
1341}
Craig Topper2d451e72018-03-18 08:38:06 +00001342def: InstRW<[SKLWriteResGroup103], (instrs LOOP)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001343
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001344def SKLWriteResGroup106 : SchedWriteRes<[SKLPort0,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001345 let Latency = 8;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001346 let NumMicroOps = 2;
1347 let ResourceCycles = [1,1];
1348}
Craig Topperfc179c62018-03-22 04:23:41 +00001349def: InstRW<[SKLWriteResGroup106], (instregex "VTESTPDrm",
1350 "VTESTPSrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001351
1352def SKLWriteResGroup107 : SchedWriteRes<[SKLPort1,SKLPort23]> {
1353 let Latency = 8;
1354 let NumMicroOps = 2;
1355 let ResourceCycles = [1,1];
1356}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001357def: InstRW<[SKLWriteResGroup107], (instregex "PDEP(32|64)rm",
1358 "PEXT(32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001359
1360def SKLWriteResGroup107_16 : SchedWriteRes<[SKLPort1, SKLPort0156, SKLPort23]> {
Craig Topperb369cdb2018-01-25 06:57:42 +00001361 let Latency = 8;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001362 let NumMicroOps = 3;
Simon Pilgrim31a96332018-03-24 20:40:14 +00001363 let ResourceCycles = [1,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001364}
Craig Topperf846e2d2018-04-19 05:34:05 +00001365def: InstRW<[SKLWriteResGroup107_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001366
Craig Topperf846e2d2018-04-19 05:34:05 +00001367def SKLWriteResGroup107_16_2 : SchedWriteRes<[SKLPort1, SKLPort06, SKLPort0156, SKLPort23]> {
1368 let Latency = 9;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001369 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001370 let ResourceCycles = [1,1,2,1];
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001371}
Craig Topperfc179c62018-03-22 04:23:41 +00001372def: InstRW<[SKLWriteResGroup107_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001373
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001374def SKLWriteResGroup108 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1375 let Latency = 8;
1376 let NumMicroOps = 2;
1377 let ResourceCycles = [1,1];
1378}
Craig Topperfc179c62018-03-22 04:23:41 +00001379def: InstRW<[SKLWriteResGroup108], (instregex "FCOM32m",
1380 "FCOM64m",
1381 "FCOMP32m",
1382 "FCOMP64m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001383 "MMX_PSADBWirm", // TODO - SKLWriteResGroup120??
Craig Topperfc179c62018-03-22 04:23:41 +00001384 "VPBROADCASTBYrm",
1385 "VPBROADCASTWYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001386 "VPMOVSXBDYrm",
1387 "VPMOVSXBQYrm",
Simon Pilgrim6732f6e2018-05-02 18:48:23 +00001388 "VPMOVSXWQYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001389
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001390def SKLWriteResGroup110 : SchedWriteRes<[SKLPort23,SKLPort015]> {
1391 let Latency = 8;
1392 let NumMicroOps = 2;
1393 let ResourceCycles = [1,1];
1394}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001395def: InstRW<[SKLWriteResGroup110], (instregex "VMASKMOVPDYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001396 "VMASKMOVPSYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001397 "VPADDBYrm",
1398 "VPADDDYrm",
1399 "VPADDQYrm",
1400 "VPADDWYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001401 "VPBLENDDYrmi",
1402 "VPMASKMOVDYrm",
1403 "VPMASKMOVQYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001404 "VPSUBBYrm",
1405 "VPSUBDYrm",
1406 "VPSUBQYrm",
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001407 "VPSUBWYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001408
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001409def SKLWriteResGroup112 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1410 let Latency = 8;
1411 let NumMicroOps = 4;
1412 let ResourceCycles = [1,2,1];
1413}
Simon Pilgrim5e492d22018-04-19 17:32:10 +00001414def: InstRW<[SKLWriteResGroup112], (instregex "MMX_PH(ADD|SUB)SWrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001415
1416def SKLWriteResGroup113 : SchedWriteRes<[SKLPort5,SKLPort23,SKLPort05]> {
1417 let Latency = 8;
1418 let NumMicroOps = 4;
1419 let ResourceCycles = [2,1,1];
1420}
Simon Pilgrim5e492d22018-04-19 17:32:10 +00001421def: InstRW<[SKLWriteResGroup113], (instregex "MMX_PH(ADD|SUB)(D|W)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001422
Craig Topper58afb4e2018-03-22 21:10:07 +00001423def SKLWriteResGroup114 : SchedWriteRes<[SKLPort4,SKLPort5,SKLPort237,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001424 let Latency = 8;
1425 let NumMicroOps = 4;
1426 let ResourceCycles = [1,1,1,1];
1427}
1428def: InstRW<[SKLWriteResGroup114], (instregex "VCVTPS2PHYmr")>;
1429
1430def SKLWriteResGroup115 : SchedWriteRes<[SKLPort23,SKLPort237,SKLPort06]> {
1431 let Latency = 8;
1432 let NumMicroOps = 5;
1433 let ResourceCycles = [1,1,3];
1434}
Craig Topper13a16502018-03-19 00:56:09 +00001435def: InstRW<[SKLWriteResGroup115], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001436
1437def SKLWriteResGroup116 : SchedWriteRes<[SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1438 let Latency = 8;
1439 let NumMicroOps = 5;
1440 let ResourceCycles = [1,1,1,2];
1441}
Craig Topperfc179c62018-03-22 04:23:41 +00001442def: InstRW<[SKLWriteResGroup116], (instregex "RCL(8|16|32|64)m1",
1443 "RCL(8|16|32|64)mi",
1444 "RCR(8|16|32|64)m1",
1445 "RCR(8|16|32|64)mi")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001446
1447def SKLWriteResGroup117 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06]> {
1448 let Latency = 8;
1449 let NumMicroOps = 6;
1450 let ResourceCycles = [1,1,1,3];
1451}
Craig Topperfc179c62018-03-22 04:23:41 +00001452def: InstRW<[SKLWriteResGroup117], (instregex "ROL(8|16|32|64)mCL",
1453 "SAR(8|16|32|64)mCL",
1454 "SHL(8|16|32|64)mCL",
1455 "SHR(8|16|32|64)mCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001456
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001457def SKLWriteResGroup119 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1458 let Latency = 8;
1459 let NumMicroOps = 6;
1460 let ResourceCycles = [1,1,1,2,1];
1461}
Craig Topper9f834812018-04-01 21:54:24 +00001462def: InstRW<[SKLWriteResGroup119], (instregex "ADC(8|16|32|64)mi",
Craig Topperfc179c62018-03-22 04:23:41 +00001463 "CMPXCHG(8|16|32|64)rm",
Craig Topperc50570f2018-04-06 17:12:18 +00001464 "SBB(8|16|32|64)mi")>;
1465def: InstRW<[SKLWriteResGroup119, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1466 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001467
1468def SKLWriteResGroup120 : SchedWriteRes<[SKLPort0,SKLPort23]> {
1469 let Latency = 9;
1470 let NumMicroOps = 2;
1471 let ResourceCycles = [1,1];
1472}
Craig Topperfc179c62018-03-22 04:23:41 +00001473def: InstRW<[SKLWriteResGroup120], (instregex "MMX_CVTPI2PSirm",
Craig Topperfc179c62018-03-22 04:23:41 +00001474 "VTESTPDYrm",
1475 "VTESTPSYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001476
1477def SKLWriteResGroup121 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1478 let Latency = 9;
1479 let NumMicroOps = 2;
1480 let ResourceCycles = [1,1];
1481}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001482def: InstRW<[SKLWriteResGroup121], (instregex "(V?)PCMPGTQrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001483 "VPMOVSXBWYrm",
1484 "VPMOVSXDQYrm",
1485 "VPMOVSXWDYrm",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001486 "VPMOVZXWDYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001487
1488def SKLWriteResGroup122 : SchedWriteRes<[SKLPort01,SKLPort23]> {
1489 let Latency = 9;
1490 let NumMicroOps = 2;
1491 let ResourceCycles = [1,1];
1492}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001493def: InstRW<[SKLWriteResGroup122], (instregex "(V?)ADDSDrm",
1494 "(V?)ADDSSrm",
1495 "(V?)CMPSDrm",
1496 "(V?)CMPSSrm",
1497 "(V?)MAX(C?)SDrm",
1498 "(V?)MAX(C?)SSrm",
1499 "(V?)MIN(C?)SDrm",
1500 "(V?)MIN(C?)SSrm",
1501 "(V?)MULSDrm",
1502 "(V?)MULSSrm",
1503 "(V?)SUBSDrm",
1504 "(V?)SUBSSrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001505
Craig Topper58afb4e2018-03-22 21:10:07 +00001506def SKLWriteResGroup123 : SchedWriteRes<[SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001507 let Latency = 9;
1508 let NumMicroOps = 2;
1509 let ResourceCycles = [1,1];
1510}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001511def: InstRW<[SKLWriteResGroup123], (instregex "MMX_CVTPS2PIirm",
Craig Topperfc179c62018-03-22 04:23:41 +00001512 "MMX_CVTTPS2PIirm",
Craig Topperfc179c62018-03-22 04:23:41 +00001513 "VCVTPH2PSrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001514 "(V?)CVTPS2PDrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001515
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001516def SKLWriteResGroup126 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1517 let Latency = 9;
1518 let NumMicroOps = 3;
1519 let ResourceCycles = [1,1,1];
1520}
Craig Topperfc179c62018-03-22 04:23:41 +00001521def: InstRW<[SKLWriteResGroup126], (instregex "(V?)PTESTrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001522
1523def SKLWriteResGroup127 : SchedWriteRes<[SKLPort1,SKLPort5,SKLPort23]> {
1524 let Latency = 9;
1525 let NumMicroOps = 3;
1526 let ResourceCycles = [1,1,1];
1527}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001528def: InstRW<[SKLWriteResGroup127], (instrs IMUL64m, MUL64m, MULX64rm)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001529
1530def SKLWriteResGroup128 : SchedWriteRes<[SKLPort5,SKLPort01,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001531 let Latency = 9;
1532 let NumMicroOps = 4;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001533 let ResourceCycles = [2,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001534}
Craig Topperfc179c62018-03-22 04:23:41 +00001535def: InstRW<[SKLWriteResGroup128], (instregex "(V?)PHADDSWrm",
1536 "(V?)PHSUBSWrm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001537
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001538def SKLWriteResGroup130 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort0156]> {
1539 let Latency = 9;
1540 let NumMicroOps = 4;
1541 let ResourceCycles = [1,1,1,1];
1542}
Craig Topperfc179c62018-03-22 04:23:41 +00001543def: InstRW<[SKLWriteResGroup130], (instregex "SHLD(16|32|64)mri8",
1544 "SHRD(16|32|64)mri8")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001545
1546def SKLWriteResGroup131 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort23,SKLPort0156]> {
1547 let Latency = 9;
1548 let NumMicroOps = 5;
1549 let ResourceCycles = [1,2,1,1];
1550}
Craig Topperfc179c62018-03-22 04:23:41 +00001551def: InstRW<[SKLWriteResGroup131], (instregex "LAR(16|32|64)rm",
1552 "LSL(16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001553
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001554def SKLWriteResGroup133 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1555 let Latency = 10;
1556 let NumMicroOps = 2;
1557 let ResourceCycles = [1,1];
1558}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001559def: InstRW<[SKLWriteResGroup133], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1560 "ILD_F(16|32|64)m",
Craig Topperfc179c62018-03-22 04:23:41 +00001561 "VPCMPGTQYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001562 "VPMOVZXBDYrm",
1563 "VPMOVZXBQYrm",
1564 "VPMOVZXBWYrm",
1565 "VPMOVZXDQYrm",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001566 "VPMOVZXWQYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001567
1568def SKLWriteResGroup134 : SchedWriteRes<[SKLPort01,SKLPort23]> {
1569 let Latency = 10;
1570 let NumMicroOps = 2;
1571 let ResourceCycles = [1,1];
1572}
Simon Pilgrime93fd5f2018-05-02 09:18:49 +00001573def: InstRW<[SKLWriteResGroup134], (instregex "(V?)CVTDQ2PSrm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001574 "(V?)CVTPH2PSYrm",
1575 "(V?)CVTPS2DQrm",
1576 "(V?)CVTSS2SDrm",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001577 "(V?)CVTTPS2DQrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001578
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001579def SKLWriteResGroup138 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1580 let Latency = 10;
1581 let NumMicroOps = 3;
1582 let ResourceCycles = [1,1,1];
1583}
Craig Topperfc179c62018-03-22 04:23:41 +00001584def: InstRW<[SKLWriteResGroup138], (instregex "MMX_CVTPI2PDirm",
1585 "VPTESTYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001586
Craig Topper58afb4e2018-03-22 21:10:07 +00001587def SKLWriteResGroup139 : SchedWriteRes<[SKLPort5,SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001588 let Latency = 10;
1589 let NumMicroOps = 3;
1590 let ResourceCycles = [1,1,1];
1591}
Craig Topperfc179c62018-03-22 04:23:41 +00001592def: InstRW<[SKLWriteResGroup139], (instregex "(V?)CVTSD2SSrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001593
1594def SKLWriteResGroup140 : SchedWriteRes<[SKLPort5,SKLPort01,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001595 let Latency = 10;
1596 let NumMicroOps = 4;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001597 let ResourceCycles = [2,1,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001598}
Craig Topperfc179c62018-03-22 04:23:41 +00001599def: InstRW<[SKLWriteResGroup140], (instregex "VPHADDSWYrm",
1600 "VPHSUBSWYrm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001601
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001602def SKLWriteResGroup142 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort06,SKLPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001603 let Latency = 9;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001604 let NumMicroOps = 4;
1605 let ResourceCycles = [1,1,1,1];
1606}
Craig Topperf846e2d2018-04-19 05:34:05 +00001607def: InstRW<[SKLWriteResGroup142], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001608
1609def SKLWriteResGroup143 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1610 let Latency = 10;
1611 let NumMicroOps = 8;
1612 let ResourceCycles = [1,1,1,1,1,3];
1613}
Craig Topper13a16502018-03-19 00:56:09 +00001614def: InstRW<[SKLWriteResGroup143], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001615
Craig Topper8104f262018-04-02 05:33:28 +00001616def SKLWriteResGroup145 : SchedWriteRes<[SKLPort0,SKLFPDivider]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001617 let Latency = 11;
1618 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001619 let ResourceCycles = [1,3];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001620}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001621def : SchedAlias<WriteFDivX, SKLWriteResGroup145>; // TODO - convert to ZnWriteResFpuPair
Craig Topper8104f262018-04-02 05:33:28 +00001622
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001623def SKLWriteResGroup146 : SchedWriteRes<[SKLPort0,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001624 let Latency = 11;
1625 let NumMicroOps = 2;
1626 let ResourceCycles = [1,1];
1627}
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +00001628def: InstRW<[SKLWriteResGroup146], (instregex "MUL_F(32|64)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001629
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001630def SKLWriteResGroup147 : SchedWriteRes<[SKLPort01,SKLPort23]> {
1631 let Latency = 11;
1632 let NumMicroOps = 2;
1633 let ResourceCycles = [1,1];
1634}
Simon Pilgrime93fd5f2018-05-02 09:18:49 +00001635def: InstRW<[SKLWriteResGroup147], (instregex "VCVTDQ2PSYrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001636 "VCVTPS2DQYrm",
1637 "VCVTPS2PDYrm",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001638 "VCVTTPS2DQYrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001639
1640def SKLWriteResGroup149 : SchedWriteRes<[SKLPort5,SKLPort23]> {
1641 let Latency = 11;
1642 let NumMicroOps = 3;
1643 let ResourceCycles = [2,1];
1644}
Craig Topperfc179c62018-03-22 04:23:41 +00001645def: InstRW<[SKLWriteResGroup149], (instregex "FICOM16m",
1646 "FICOM32m",
1647 "FICOMP16m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001648 "FICOMP32m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001649
1650def SKLWriteResGroup150 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1651 let Latency = 11;
1652 let NumMicroOps = 3;
1653 let ResourceCycles = [1,1,1];
1654}
Craig Topperfc179c62018-03-22 04:23:41 +00001655def: InstRW<[SKLWriteResGroup150], (instregex "(V?)CVTDQ2PDrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001656
Craig Topper58afb4e2018-03-22 21:10:07 +00001657def SKLWriteResGroup151 : SchedWriteRes<[SKLPort0,SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001658 let Latency = 11;
1659 let NumMicroOps = 3;
1660 let ResourceCycles = [1,1,1];
1661}
Simon Pilgrim31a96332018-03-24 20:40:14 +00001662def: InstRW<[SKLWriteResGroup151], (instregex "(V?)CVTSD2SI64rm",
1663 "(V?)CVTSD2SIrm",
1664 "(V?)CVTSS2SI64rm",
1665 "(V?)CVTSS2SIrm",
1666 "(V?)CVTTSD2SI64rm",
1667 "(V?)CVTTSD2SIrm",
Craig Topperfc179c62018-03-22 04:23:41 +00001668 "VCVTTSS2SI64rm",
Simon Pilgrim31a96332018-03-24 20:40:14 +00001669 "(V?)CVTTSS2SIrm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001670
Craig Topper58afb4e2018-03-22 21:10:07 +00001671def SKLWriteResGroup152 : SchedWriteRes<[SKLPort5,SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001672 let Latency = 11;
1673 let NumMicroOps = 3;
1674 let ResourceCycles = [1,1,1];
1675}
Craig Topperfc179c62018-03-22 04:23:41 +00001676def: InstRW<[SKLWriteResGroup152], (instregex "CVTPD2DQrm",
1677 "CVTPD2PSrm",
1678 "CVTTPD2DQrm",
1679 "MMX_CVTPD2PIirm",
1680 "MMX_CVTTPD2PIirm")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001681
1682def SKLWriteResGroup153 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1683 let Latency = 11;
1684 let NumMicroOps = 6;
1685 let ResourceCycles = [1,1,1,2,1];
1686}
Craig Topperfc179c62018-03-22 04:23:41 +00001687def: InstRW<[SKLWriteResGroup153], (instregex "SHLD(16|32|64)mrCL",
1688 "SHRD(16|32|64)mrCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001689
1690def SKLWriteResGroup154 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001691 let Latency = 11;
1692 let NumMicroOps = 7;
1693 let ResourceCycles = [2,3,2];
1694}
Craig Topperfc179c62018-03-22 04:23:41 +00001695def: InstRW<[SKLWriteResGroup154], (instregex "RCL(16|32|64)rCL",
1696 "RCR(16|32|64)rCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001697
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001698def SKLWriteResGroup155 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort15,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001699 let Latency = 11;
1700 let NumMicroOps = 9;
1701 let ResourceCycles = [1,5,1,2];
1702}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001703def: InstRW<[SKLWriteResGroup155], (instregex "RCL8rCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001704
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001705def SKLWriteResGroup156 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001706 let Latency = 11;
1707 let NumMicroOps = 11;
1708 let ResourceCycles = [2,9];
1709}
Craig Topperfc179c62018-03-22 04:23:41 +00001710def: InstRW<[SKLWriteResGroup156], (instrs LOOPE, LOOPNE)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001711
Craig Topper58afb4e2018-03-22 21:10:07 +00001712def SKLWriteResGroup160 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23,SKLPort01]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001713 let Latency = 12;
1714 let NumMicroOps = 4;
1715 let ResourceCycles = [1,1,1,1];
1716}
1717def: InstRW<[SKLWriteResGroup160], (instregex "CVTTSS2SI64rm")>;
1718
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001719def SKLWriteResGroup162 : SchedWriteRes<[SKLPort5,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001720 let Latency = 13;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001721 let NumMicroOps = 3;
1722 let ResourceCycles = [2,1];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001723}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001724def: InstRW<[SKLWriteResGroup162], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001725
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001726def SKLWriteResGroup163 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1727 let Latency = 13;
1728 let NumMicroOps = 3;
1729 let ResourceCycles = [1,1,1];
1730}
1731def: InstRW<[SKLWriteResGroup163], (instregex "VCVTDQ2PDYrm")>;
1732
Craig Topper8104f262018-04-02 05:33:28 +00001733def SKLWriteResGroup166 : SchedWriteRes<[SKLPort0,SKLFPDivider]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001734 let Latency = 14;
1735 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001736 let ResourceCycles = [1,3];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001737}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001738def : SchedAlias<WriteFDiv64, SKLWriteResGroup166>; // TODO - convert to ZnWriteResFpuPair
1739def : SchedAlias<WriteFDiv64X, SKLWriteResGroup166>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001740
Craig Topper8104f262018-04-02 05:33:28 +00001741def SKLWriteResGroup166_1 : SchedWriteRes<[SKLPort0,SKLFPDivider]> {
1742 let Latency = 14;
1743 let NumMicroOps = 1;
1744 let ResourceCycles = [1,5];
1745}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001746def : SchedAlias<WriteFDiv64Y, SKLWriteResGroup166_1>; // TODO - convert to ZnWriteResFpuPair
Craig Topper8104f262018-04-02 05:33:28 +00001747
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001748def SKLWriteResGroup169 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1749 let Latency = 14;
1750 let NumMicroOps = 3;
1751 let ResourceCycles = [1,1,1];
1752}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001753def: InstRW<[SKLWriteResGroup169], (instregex "MUL_FI(16|32)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001754
1755def SKLWriteResGroup170 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort15,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001756 let Latency = 14;
1757 let NumMicroOps = 10;
1758 let ResourceCycles = [2,4,1,3];
1759}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001760def: InstRW<[SKLWriteResGroup170], (instregex "RCR8rCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001761
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001762def SKLWriteResGroup171 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001763 let Latency = 15;
1764 let NumMicroOps = 1;
1765 let ResourceCycles = [1];
1766}
Craig Topperfc179c62018-03-22 04:23:41 +00001767def: InstRW<[SKLWriteResGroup171], (instregex "DIVR_FPrST0",
1768 "DIVR_FST0r",
1769 "DIVR_FrST0")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001770
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001771def SKLWriteResGroup174 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort06,SKLPort15,SKLPort0156]> {
1772 let Latency = 15;
1773 let NumMicroOps = 10;
1774 let ResourceCycles = [1,1,1,5,1,1];
1775}
Craig Topper13a16502018-03-19 00:56:09 +00001776def: InstRW<[SKLWriteResGroup174], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001777
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001778def SKLWriteResGroup177 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06,SKLPort15,SKLPort0156]> {
1779 let Latency = 16;
1780 let NumMicroOps = 14;
1781 let ResourceCycles = [1,1,1,4,2,5];
1782}
1783def: InstRW<[SKLWriteResGroup177], (instregex "CMPXCHG8B")>;
1784
1785def SKLWriteResGroup178 : SchedWriteRes<[SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001786 let Latency = 16;
1787 let NumMicroOps = 16;
1788 let ResourceCycles = [16];
1789}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001790def: InstRW<[SKLWriteResGroup178], (instrs VZEROALL)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001791
Craig Topper8104f262018-04-02 05:33:28 +00001792def SKLWriteResGroup179 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001793 let Latency = 17;
1794 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001795 let ResourceCycles = [1,1,5];
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001796}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001797def : SchedAlias<WriteFDivXLd, SKLWriteResGroup179>; // TODO - convert to ZnWriteResFpuPair
Craig Topper8104f262018-04-02 05:33:28 +00001798
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001799def SKLWriteResGroup180 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort05,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001800 let Latency = 17;
1801 let NumMicroOps = 15;
1802 let ResourceCycles = [2,1,2,4,2,4];
1803}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001804def: InstRW<[SKLWriteResGroup180], (instrs XCH_F)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001805
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001806def SKLWriteResGroup184 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001807 let Latency = 18;
1808 let NumMicroOps = 8;
1809 let ResourceCycles = [1,1,1,5];
1810}
Craig Topperfc179c62018-03-22 04:23:41 +00001811def: InstRW<[SKLWriteResGroup184], (instrs CPUID, RDTSC)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001812
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001813def SKLWriteResGroup185 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort06,SKLPort15,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001814 let Latency = 18;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001815 let NumMicroOps = 11;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001816 let ResourceCycles = [2,1,1,4,1,2];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001817}
Craig Topper13a16502018-03-19 00:56:09 +00001818def: InstRW<[SKLWriteResGroup185], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001819
Craig Topper8104f262018-04-02 05:33:28 +00001820def SKLWriteResGroup186 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001821 let Latency = 19;
1822 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001823 let ResourceCycles = [1,1,4];
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001824}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001825def : SchedAlias<WriteFDiv64Ld, SKLWriteResGroup186>; // TODO - convert to ZnWriteResFpuPair
Craig Topper8104f262018-04-02 05:33:28 +00001826
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001827def SKLWriteResGroup189 : SchedWriteRes<[SKLPort0]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001828 let Latency = 20;
1829 let NumMicroOps = 1;
1830 let ResourceCycles = [1];
1831}
Craig Topperfc179c62018-03-22 04:23:41 +00001832def: InstRW<[SKLWriteResGroup189], (instregex "DIV_FPrST0",
1833 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001834 "DIV_FrST0")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001835
Craig Topper8104f262018-04-02 05:33:28 +00001836def SKLWriteResGroup190 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001837 let Latency = 20;
1838 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001839 let ResourceCycles = [1,1,4];
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001840}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001841def : SchedAlias<WriteFDiv64XLd, SKLWriteResGroup190>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001842
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001843def SKLWriteResGroup192 : SchedWriteRes<[SKLPort4,SKLPort5,SKLPort6,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1844 let Latency = 20;
1845 let NumMicroOps = 8;
1846 let ResourceCycles = [1,1,1,1,1,1,2];
1847}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001848def: InstRW<[SKLWriteResGroup192], (instrs INSB, INSL, INSW)>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001849
1850def SKLWriteResGroup193 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001851 let Latency = 20;
1852 let NumMicroOps = 10;
1853 let ResourceCycles = [1,2,7];
1854}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001855def: InstRW<[SKLWriteResGroup193], (instregex "MWAITrr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001856
Craig Topper8104f262018-04-02 05:33:28 +00001857def SKLWriteResGroup195 : SchedWriteRes<[SKLPort0,SKLPort23,SKLFPDivider]> {
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001858 let Latency = 21;
1859 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001860 let ResourceCycles = [1,1,8];
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001861}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001862def : SchedAlias<WriteFDiv64YLd, SKLWriteResGroup195>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001863
1864def SKLWriteResGroup196 : SchedWriteRes<[SKLPort0,SKLPort23]> {
1865 let Latency = 22;
1866 let NumMicroOps = 2;
1867 let ResourceCycles = [1,1];
1868}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001869def: InstRW<[SKLWriteResGroup196], (instregex "DIV_F(32|64)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001870
1871def SKLWriteResGroup196_1 : SchedWriteRes<[SKLPort0, SKLPort23, SKLPort5, SKLPort015]> {
1872 let Latency = 22;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001873 let NumMicroOps = 5;
1874 let ResourceCycles = [1,2,1,1];
1875}
Craig Topper17a31182017-12-16 18:35:29 +00001876def: InstRW<[SKLWriteResGroup196_1], (instrs VGATHERDPSrm,
1877 VGATHERDPDrm,
1878 VGATHERQPDrm,
1879 VGATHERQPSrm,
1880 VPGATHERDDrm,
1881 VPGATHERDQrm,
1882 VPGATHERQDrm,
1883 VPGATHERQQrm)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001884
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001885def SKLWriteResGroup196_2 : SchedWriteRes<[SKLPort0, SKLPort23, SKLPort5, SKLPort015]> {
1886 let Latency = 25;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001887 let NumMicroOps = 5;
1888 let ResourceCycles = [1,2,1,1];
1889}
Craig Topper17a31182017-12-16 18:35:29 +00001890def: InstRW<[SKLWriteResGroup196_2], (instrs VGATHERDPSYrm,
1891 VGATHERQPDYrm,
1892 VGATHERQPSYrm,
1893 VPGATHERDDYrm,
1894 VPGATHERDQYrm,
1895 VPGATHERQDYrm,
1896 VPGATHERQQYrm,
1897 VGATHERDPDYrm)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001898
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001899def SKLWriteResGroup198 : SchedWriteRes<[SKLPort0,SKLPort4,SKLPort5,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1900 let Latency = 23;
1901 let NumMicroOps = 19;
1902 let ResourceCycles = [2,1,4,1,1,4,6];
1903}
1904def: InstRW<[SKLWriteResGroup198], (instregex "CMPXCHG16B")>;
1905
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001906def SKLWriteResGroup202 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
1907 let Latency = 25;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001908 let NumMicroOps = 3;
1909 let ResourceCycles = [1,1,1];
1910}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001911def: InstRW<[SKLWriteResGroup202], (instregex "DIV_FI(16|32)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001912
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001913def SKLWriteResGroup206 : SchedWriteRes<[SKLPort0,SKLPort23]> {
1914 let Latency = 27;
1915 let NumMicroOps = 2;
1916 let ResourceCycles = [1,1];
1917}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001918def: InstRW<[SKLWriteResGroup206], (instregex "DIVR_F(32|64)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001919
1920def SKLWriteResGroup207 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23,SKLPort0156]> {
1921 let Latency = 28;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001922 let NumMicroOps = 8;
1923 let ResourceCycles = [2,4,1,1];
1924}
Craig Topper13a16502018-03-19 00:56:09 +00001925def: InstRW<[SKLWriteResGroup207], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001926
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001927def SKLWriteResGroup208 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001928 let Latency = 30;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001929 let NumMicroOps = 3;
1930 let ResourceCycles = [1,1,1];
1931}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001932def: InstRW<[SKLWriteResGroup208], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001933
1934def SKLWriteResGroup209 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort23,SKLPort06,SKLPort0156]> {
1935 let Latency = 35;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001936 let NumMicroOps = 23;
1937 let ResourceCycles = [1,5,3,4,10];
1938}
Craig Topperfc179c62018-03-22 04:23:41 +00001939def: InstRW<[SKLWriteResGroup209], (instregex "IN(8|16|32)ri",
1940 "IN(8|16|32)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001941
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001942def SKLWriteResGroup210 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
1943 let Latency = 35;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001944 let NumMicroOps = 23;
1945 let ResourceCycles = [1,5,2,1,4,10];
1946}
Craig Topperfc179c62018-03-22 04:23:41 +00001947def: InstRW<[SKLWriteResGroup210], (instregex "OUT(8|16|32)ir",
1948 "OUT(8|16|32)rr")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001949
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001950def SKLWriteResGroup211 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort23,SKLPort0156]> {
1951 let Latency = 37;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001952 let NumMicroOps = 31;
1953 let ResourceCycles = [1,8,1,21];
1954}
Craig Topper391c6f92017-12-10 01:24:08 +00001955def: InstRW<[SKLWriteResGroup211], (instregex "XRSTOR(64)?")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001956
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001957def SKLWriteResGroup212 : SchedWriteRes<[SKLPort1,SKLPort4,SKLPort5,SKLPort6,SKLPort23,SKLPort237,SKLPort15,SKLPort0156]> {
1958 let Latency = 40;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001959 let NumMicroOps = 18;
1960 let ResourceCycles = [1,1,2,3,1,1,1,8];
1961}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001962def: InstRW<[SKLWriteResGroup212], (instregex "VMCLEARm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001963
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001964def SKLWriteResGroup213 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
1965 let Latency = 41;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001966 let NumMicroOps = 39;
1967 let ResourceCycles = [1,10,1,1,26];
1968}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001969def: InstRW<[SKLWriteResGroup213], (instregex "XSAVE64")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001970
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001971def SKLWriteResGroup214 : SchedWriteRes<[SKLPort5,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001972 let Latency = 42;
1973 let NumMicroOps = 22;
1974 let ResourceCycles = [2,20];
1975}
Craig Topper2d451e72018-03-18 08:38:06 +00001976def: InstRW<[SKLWriteResGroup214], (instrs RDTSCP)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001977
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001978def SKLWriteResGroup215 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
1979 let Latency = 42;
1980 let NumMicroOps = 40;
1981 let ResourceCycles = [1,11,1,1,26];
1982}
Craig Topper391c6f92017-12-10 01:24:08 +00001983def: InstRW<[SKLWriteResGroup215], (instregex "^XSAVE$", "XSAVEC", "XSAVES")>;
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001984
1985def SKLWriteResGroup216 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
1986 let Latency = 46;
1987 let NumMicroOps = 44;
1988 let ResourceCycles = [1,11,1,1,30];
1989}
1990def: InstRW<[SKLWriteResGroup216], (instregex "XSAVEOPT")>;
1991
1992def SKLWriteResGroup217 : SchedWriteRes<[SKLPort0,SKLPort23,SKLPort05,SKLPort06,SKLPort0156]> {
1993 let Latency = 62;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001994 let NumMicroOps = 64;
1995 let ResourceCycles = [2,8,5,10,39];
1996}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001997def: InstRW<[SKLWriteResGroup217], (instregex "FLDENVm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00001998
Gadi Haber1e0f1f42017-10-17 06:47:04 +00001999def SKLWriteResGroup218 : SchedWriteRes<[SKLPort0,SKLPort6,SKLPort23,SKLPort05,SKLPort06,SKLPort15,SKLPort0156]> {
2000 let Latency = 63;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002001 let NumMicroOps = 88;
2002 let ResourceCycles = [4,4,31,1,2,1,45];
2003}
Craig Topper2d451e72018-03-18 08:38:06 +00002004def: InstRW<[SKLWriteResGroup218], (instrs FXRSTOR64)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002005
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002006def SKLWriteResGroup219 : SchedWriteRes<[SKLPort0,SKLPort6,SKLPort23,SKLPort05,SKLPort06,SKLPort15,SKLPort0156]> {
2007 let Latency = 63;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002008 let NumMicroOps = 90;
2009 let ResourceCycles = [4,2,33,1,2,1,47];
2010}
Craig Topper2d451e72018-03-18 08:38:06 +00002011def: InstRW<[SKLWriteResGroup219], (instrs FXRSTOR)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002012
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002013def SKLWriteResGroup220 : SchedWriteRes<[SKLPort5,SKLPort05,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002014 let Latency = 75;
2015 let NumMicroOps = 15;
2016 let ResourceCycles = [6,3,6];
2017}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00002018def: InstRW<[SKLWriteResGroup220], (instrs FNINIT)>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002019
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002020def SKLWriteResGroup221 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort05,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002021 let Latency = 76;
2022 let NumMicroOps = 32;
2023 let ResourceCycles = [7,2,8,3,1,11];
2024}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002025def: InstRW<[SKLWriteResGroup221], (instregex "DIV(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002026
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002027def SKLWriteResGroup222 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort06,SKLPort0156]> {
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002028 let Latency = 102;
2029 let NumMicroOps = 66;
2030 let ResourceCycles = [4,2,4,8,14,34];
2031}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002032def: InstRW<[SKLWriteResGroup222], (instregex "IDIV(16|32|64)r")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002033
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002034def SKLWriteResGroup223 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort4,SKLPort5,SKLPort6,SKLPort237,SKLPort06,SKLPort0156]> {
2035 let Latency = 106;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002036 let NumMicroOps = 100;
2037 let ResourceCycles = [9,1,11,16,1,11,21,30];
2038}
Gadi Haber1e0f1f42017-10-17 06:47:04 +00002039def: InstRW<[SKLWriteResGroup223], (instregex "FSTENVm")>;
Gadi Haber6f8fbf42017-09-19 06:19:27 +00002040
2041} // SchedModel