blob: 18a32a8e44e042cab7f2631039010d3f1d2839a9 [file] [log] [blame]
Gadi Haber323f2e12017-10-24 20:19:47 +00001//=- X86SchedBroadwell.td - X86 Broadwell 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 Broadwell to support instruction
11// scheduling and other instruction cost heuristics.
12//
13//===----------------------------------------------------------------------===//
14def BroadwellModel : SchedMachineModel {
Simon Pilgrimf7d2a932018-04-24 13:21:41 +000015 // All x86 instructions are modeled as a single micro-op, and BW can decode 4
Gadi Haber323f2e12017-10-24 20:19:47 +000016 // instructions per cycle.
17 let IssueWidth = 4;
18 let MicroOpBufferSize = 192; // Based on the reorder buffer.
19 let LoadLatency = 5;
20 let MispredictPenalty = 16;
21
22 // Based on the LSD (loop-stream detector) queue size and benchmarking data.
23 let LoopMicroOpBufferSize = 50;
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000024
Simon Pilgrimc21deec2018-03-24 19:37:28 +000025 // This flag is set to allow the scheduler to assign a default model to
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000026 // unrecognized opcodes.
27 let CompleteModel = 0;
Gadi Haber323f2e12017-10-24 20:19:47 +000028}
29
30let SchedModel = BroadwellModel in {
31
32// Broadwell can issue micro-ops to 8 different ports in one cycle.
33
34// Ports 0, 1, 5, and 6 handle all computation.
35// Port 4 gets the data half of stores. Store data can be available later than
36// the store address, but since we don't model the latency of stores, we can
37// ignore that.
38// Ports 2 and 3 are identical. They handle loads and the address half of
39// stores. Port 7 can handle address calculations.
40def BWPort0 : ProcResource<1>;
41def BWPort1 : ProcResource<1>;
42def BWPort2 : ProcResource<1>;
43def BWPort3 : ProcResource<1>;
44def BWPort4 : ProcResource<1>;
45def BWPort5 : ProcResource<1>;
46def BWPort6 : ProcResource<1>;
47def BWPort7 : ProcResource<1>;
48
49// Many micro-ops are capable of issuing on multiple ports.
50def BWPort01 : ProcResGroup<[BWPort0, BWPort1]>;
51def BWPort23 : ProcResGroup<[BWPort2, BWPort3]>;
52def BWPort237 : ProcResGroup<[BWPort2, BWPort3, BWPort7]>;
53def BWPort04 : ProcResGroup<[BWPort0, BWPort4]>;
54def BWPort05 : ProcResGroup<[BWPort0, BWPort5]>;
55def BWPort06 : ProcResGroup<[BWPort0, BWPort6]>;
56def BWPort15 : ProcResGroup<[BWPort1, BWPort5]>;
57def BWPort16 : ProcResGroup<[BWPort1, BWPort6]>;
58def BWPort56 : ProcResGroup<[BWPort5, BWPort6]>;
59def BWPort015 : ProcResGroup<[BWPort0, BWPort1, BWPort5]>;
60def BWPort056 : ProcResGroup<[BWPort0, BWPort5, BWPort6]>;
61def BWPort0156: ProcResGroup<[BWPort0, BWPort1, BWPort5, BWPort6]>;
62
63// 60 Entry Unified Scheduler
64def BWPortAny : ProcResGroup<[BWPort0, BWPort1, BWPort2, BWPort3, BWPort4,
65 BWPort5, BWPort6, BWPort7]> {
66 let BufferSize=60;
67}
68
Simon Pilgrim30c38c32018-03-19 14:46:07 +000069// Integer division issued on port 0.
Craig Topper8104f262018-04-02 05:33:28 +000070def BWDivider : ProcResource<1>;
71// FP division and sqrt on port 0.
72def BWFPDivider : ProcResource<1>;
Simon Pilgrim30c38c32018-03-19 14:46:07 +000073
Gadi Haber323f2e12017-10-24 20:19:47 +000074// 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 BWWriteResPair<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 Haber323f2e12017-10-24 20:19:47 +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 Haber323f2e12017-10-24 20:19:47 +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([BWPort23], 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 Haber323f2e12017-10-24 20:19:47 +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, [BWPort237,BWPort4]>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000106
107// Arithmetic.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000108defm : BWWriteResPair<WriteALU, [BWPort0156], 1>; // Simple integer ALU op.
109defm : BWWriteResPair<WriteIMul, [BWPort1], 3>; // Integer multiplication.
110defm : BWWriteResPair<WriteIDiv, [BWPort0, BWDivider], 25, [1, 10]>;
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000111defm : BWWriteResPair<WriteCRC32, [BWPort1], 3>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000112def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, high part.
Gadi Haber323f2e12017-10-24 20:19:47 +0000113
114def : WriteRes<WriteLEA, [BWPort15]>; // LEA instructions can't fold loads.
115
Craig Topperb7baa352018-04-08 17:53:18 +0000116defm : BWWriteResPair<WriteCMOV, [BWPort06], 1>; // Conditional move.
117def : WriteRes<WriteSETCC, [BWPort06]>; // Setcc.
118def : WriteRes<WriteSETCCStore, [BWPort06,BWPort4,BWPort237]> {
119 let Latency = 2;
120 let NumMicroOps = 3;
121}
122
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000123// Bit counts.
124defm : BWWriteResPair<WriteBitScan, [BWPort1], 3>;
125defm : BWWriteResPair<WriteLZCNT, [BWPort1], 3>;
126defm : BWWriteResPair<WriteTZCNT, [BWPort1], 3>;
127defm : BWWriteResPair<WritePOPCNT, [BWPort1], 3>;
128
Gadi Haber323f2e12017-10-24 20:19:47 +0000129// Integer shifts and rotates.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000130defm : BWWriteResPair<WriteShift, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000131
Craig Topper89310f52018-03-29 20:41:39 +0000132// BMI1 BEXTR, BMI2 BZHI
133defm : BWWriteResPair<WriteBEXTR, [BWPort06,BWPort15], 2, [1,1], 2>;
134defm : BWWriteResPair<WriteBZHI, [BWPort15], 1>;
135
Gadi Haber323f2e12017-10-24 20:19:47 +0000136// Loads, stores, and moves, not folded with other operations.
137def : WriteRes<WriteLoad, [BWPort23]> { let Latency = 5; }
138def : WriteRes<WriteStore, [BWPort237, BWPort4]>;
139def : WriteRes<WriteMove, [BWPort0156]>;
140
141// Idioms that clear a register, like xorps %xmm0, %xmm0.
142// These can often bypass execution ports completely.
143def : WriteRes<WriteZero, []>;
144
Sanjoy Das1074eb22017-12-12 19:11:31 +0000145// Treat misc copies as a move.
146def : InstRW<[WriteMove], (instrs COPY)>;
147
Gadi Haber323f2e12017-10-24 20:19:47 +0000148// Branches don't produce values, so they have no latency, but they still
149// consume resources. Indirect branches can fold loads.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000150defm : BWWriteResPair<WriteJump, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000151
152// Floating point. This covers both scalar and vector operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000153def : WriteRes<WriteFLoad, [BWPort23]> { let Latency = 5; }
154def : WriteRes<WriteFStore, [BWPort237, BWPort4]>;
155def : WriteRes<WriteFMove, [BWPort5]>;
156
Simon Pilgrim86e3c2692018-04-17 07:22:44 +0000157defm : BWWriteResPair<WriteFAdd, [BWPort1], 3>; // Floating point add/sub.
158defm : BWWriteResPair<WriteFCmp, [BWPort1], 3>; // Floating point compare.
159defm : BWWriteResPair<WriteFCom, [BWPort1], 3>; // Floating point compare to flags.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000160defm : BWWriteResPair<WriteFMul, [BWPort0], 5>; // Floating point multiplication.
161defm : BWWriteResPair<WriteFDiv, [BWPort0], 12>; // 10-14 cycles. // Floating point division.
162defm : BWWriteResPair<WriteFSqrt, [BWPort0], 15>; // Floating point square root.
163defm : BWWriteResPair<WriteFRcp, [BWPort0], 5>; // Floating point reciprocal estimate.
164defm : BWWriteResPair<WriteFRsqrt, [BWPort0], 5>; // Floating point reciprocal square root estimate.
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000165defm : BWWriteResPair<WriteFMA, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add.
166defm : BWWriteResPair<WriteFMAS, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add (Scalar).
167defm : BWWriteResPair<WriteFMAY, [BWPort01], 5, [1], 1, 6>; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000168defm : BWWriteResPair<WriteFSign, [BWPort5], 1>; // Floating point fabs/fchs.
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000169defm : BWWriteResPair<WriteFLogic, [BWPort5], 1, [1], 1, 5>; // Floating point and/or/xor logicals.
170defm : BWWriteResPair<WriteFLogicY, [BWPort5], 1, [1], 1, 6>; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000171defm : BWWriteResPair<WriteFShuffle, [BWPort5], 1>; // Floating point vector shuffles.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000172defm : BWWriteResPair<WriteFVarShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector variable shuffles.
173defm : BWWriteResPair<WriteFVarShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
174defm : BWWriteResPair<WriteFBlend, [BWPort015], 1, [1], 1, 5>; // Floating point vector blends.
175defm : BWWriteResPair<WriteFBlendY, [BWPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000176defm : BWWriteResPair<WriteFVarBlend, [BWPort5], 2, [2], 2, 5>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000177defm : BWWriteResPair<WriteFVarBlendY, [BWPort5], 2, [2], 2, 6>; // Fp vector variable blends.
Gadi Haber323f2e12017-10-24 20:19:47 +0000178
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000179def : WriteRes<WriteCvtF2FSt, [BWPort1,BWPort4,BWPort237]> {
180 let Latency = 4;
181 let NumMicroOps = 3;
182 let ResourceCycles = [1,1,1];
183}
184
Gadi Haber323f2e12017-10-24 20:19:47 +0000185// FMA Scheduling helper class.
186// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
187
188// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000189def : WriteRes<WriteVecLoad, [BWPort23]> { let Latency = 5; }
190def : WriteRes<WriteVecStore, [BWPort237, BWPort4]>;
191def : WriteRes<WriteVecMove, [BWPort015]>;
192
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000193defm : BWWriteResPair<WriteVecALU, [BWPort15], 1>; // Vector integer ALU op, no logicals.
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000194defm : BWWriteResPair<WriteVecLogic, [BWPort015], 1>; // Vector integer and/or/xor.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000195defm : BWWriteResPair<WriteVecShift, [BWPort0], 1>; // Vector integer shifts.
196defm : BWWriteResPair<WriteVecIMul, [BWPort0], 5>; // Vector integer multiply.
Craig Topper13a0f832018-03-31 04:54:32 +0000197defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // PMULLD
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000198defm : BWWriteResPair<WriteShuffle, [BWPort5], 1>; // Vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000199defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1>; // Vector variable shuffles.
Simon Pilgrim06e16542018-04-22 18:35:53 +0000200defm : BWWriteResPair<WriteBlend, [BWPort5], 1>; // Vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000201defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000202defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim27bc83e2018-04-24 18:49:25 +0000203defm : BWWriteResPair<WritePSADBW, [BWPort0], 5>; // Vector PSADBW.
204defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000205
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000206// Vector insert/extract operations.
207def : WriteRes<WriteVecInsert, [BWPort5]> {
208 let Latency = 2;
209 let NumMicroOps = 2;
210 let ResourceCycles = [2];
211}
212def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
213 let Latency = 6;
214 let NumMicroOps = 2;
215}
216
217def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
218 let Latency = 2;
219 let NumMicroOps = 2;
220}
221def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
222 let Latency = 2;
223 let NumMicroOps = 3;
224}
225
Gadi Haber323f2e12017-10-24 20:19:47 +0000226// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000227defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
228defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
229defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000230
231// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000232
Gadi Haber323f2e12017-10-24 20:19:47 +0000233// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000234def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000235 let Latency = 11;
236 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000237 let ResourceCycles = [3];
238}
239def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000240 let Latency = 16;
241 let NumMicroOps = 4;
242 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000243}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000244
245// Packed Compare Explicit Length Strings, Return Mask
246def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
247 let Latency = 19;
248 let NumMicroOps = 9;
249 let ResourceCycles = [4,3,1,1];
250}
251def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
252 let Latency = 24;
253 let NumMicroOps = 10;
254 let ResourceCycles = [4,3,1,1,1];
255}
256
257// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000258def : WriteRes<WritePCmpIStrI, [BWPort0]> {
259 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000260 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000261 let ResourceCycles = [3];
262}
263def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000264 let Latency = 16;
265 let NumMicroOps = 4;
266 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000267}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000268
269// Packed Compare Explicit Length Strings, Return Index
270def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
271 let Latency = 18;
272 let NumMicroOps = 8;
273 let ResourceCycles = [4,3,1];
274}
275def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
276 let Latency = 23;
277 let NumMicroOps = 9;
278 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000279}
280
Simon Pilgrima2f26782018-03-27 20:38:54 +0000281// MOVMSK Instructions.
282def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
283def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
284def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
285
Gadi Haber323f2e12017-10-24 20:19:47 +0000286// AES instructions.
287def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
288 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000289 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000290 let ResourceCycles = [1];
291}
292def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000293 let Latency = 12;
294 let NumMicroOps = 2;
295 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000296}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000297
Gadi Haber323f2e12017-10-24 20:19:47 +0000298def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
299 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000300 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000301 let ResourceCycles = [2];
302}
303def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000304 let Latency = 19;
305 let NumMicroOps = 3;
306 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000307}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000308
309def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
310 let Latency = 29;
311 let NumMicroOps = 11;
312 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000313}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000314def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
315 let Latency = 33;
316 let NumMicroOps = 11;
317 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000318}
319
320// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000321defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000322
323// Catch-all for expensive system instructions.
324def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
325
326// AVX2.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000327defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3>; // Fp 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000328defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3>; // Fp 256-bit width vector variable shuffles.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000329defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3>; // 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000330defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3>; // 256-bit width vector variable shuffles.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000331defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 2, [2, 1]>; // Variable vector shifts.
Gadi Haber323f2e12017-10-24 20:19:47 +0000332
333// Old microcoded instructions that nobody use.
334def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
335
336// Fence instructions.
337def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
338
Craig Topper05242bf2018-04-21 18:07:36 +0000339// Load/store MXCSR.
340def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
341def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
342
Gadi Haber323f2e12017-10-24 20:19:47 +0000343// Nop, not very useful expect it provides a model for nops!
344def : WriteRes<WriteNop, []>;
345
346////////////////////////////////////////////////////////////////////////////////
347// Horizontal add/sub instructions.
348////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000349
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000350defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000351defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000352defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000353
354// Remaining instrs.
355
356def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
357 let Latency = 1;
358 let NumMicroOps = 1;
359 let ResourceCycles = [1];
360}
Craig Topper5a69a002018-03-21 06:28:42 +0000361def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
362 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000363 "(V?)MOVPDI2DIrr",
364 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000365 "VPSLLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000366 "VPSRLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000367 "VTESTPD(Y?)rr",
368 "VTESTPS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000369
370def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
371 let Latency = 1;
372 let NumMicroOps = 1;
373 let ResourceCycles = [1];
374}
Craig Topper5a69a002018-03-21 06:28:42 +0000375def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
376 "COM_FST0r",
377 "UCOM_FPr",
378 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000379
380def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
381 let Latency = 1;
382 let NumMicroOps = 1;
383 let ResourceCycles = [1];
384}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000385def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000386 "MMX_MOVD64to64rr",
387 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000388 "(V?)MOV64toPQIrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000389 "(V?)MOVDI2PDIrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000390 "(V?)PSLLDQ(Y?)ri",
Simon Pilgrim74ccc6a2018-04-21 19:11:55 +0000391 "(V?)PSRLDQ(Y?)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000392
393def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
394 let Latency = 1;
395 let NumMicroOps = 1;
396 let ResourceCycles = [1];
397}
398def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
399
400def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
401 let Latency = 1;
402 let NumMicroOps = 1;
403 let ResourceCycles = [1];
404}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000405def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000406
407def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
408 let Latency = 1;
409 let NumMicroOps = 1;
410 let ResourceCycles = [1];
411}
Craig Topperfbe31322018-04-05 21:56:19 +0000412def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000413def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
414 "ADC(16|32|64)i",
415 "ADC(8|16|32|64)rr",
416 "ADCX(32|64)rr",
417 "ADOX(32|64)rr",
418 "BT(16|32|64)ri8",
419 "BT(16|32|64)rr",
420 "BTC(16|32|64)ri8",
421 "BTC(16|32|64)rr",
422 "BTR(16|32|64)ri8",
423 "BTR(16|32|64)rr",
424 "BTS(16|32|64)ri8",
425 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000426 "SBB(16|32|64)ri",
427 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000428 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000429
430def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
431 let Latency = 1;
432 let NumMicroOps = 1;
433 let ResourceCycles = [1];
434}
Craig Topper5a69a002018-03-21 06:28:42 +0000435def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
436 "BLSI(32|64)rr",
437 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000438 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000439
440def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
441 let Latency = 1;
442 let NumMicroOps = 1;
443 let ResourceCycles = [1];
444}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000445def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000446 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000447
448def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
449 let Latency = 1;
450 let NumMicroOps = 1;
451 let ResourceCycles = [1];
452}
Craig Topperdfccafe2018-04-18 06:41:25 +0000453def: InstRW<[BWWriteResGroup9], (instregex "LAHF", // TODO: This doesnt match Agner's data
Craig Topper5a69a002018-03-21 06:28:42 +0000454 "NOOP",
Craig Topper655e1db2018-04-17 19:35:14 +0000455 "SAHF", // TODO: This doesn't match Agner's data
Craig Topper5a69a002018-03-21 06:28:42 +0000456 "SGDT64m",
457 "SIDT64m",
458 "SLDT64m",
459 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000460 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000461 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000462
463def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
464 let Latency = 1;
465 let NumMicroOps = 2;
466 let ResourceCycles = [1,1];
467}
Craig Topper5a69a002018-03-21 06:28:42 +0000468def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
469 "MMX_MOVD64from64rm",
470 "MMX_MOVD64mr",
471 "MMX_MOVNTQmr",
472 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000473 "MOVNTI_64mr",
474 "MOVNTImr",
Craig Topper5a69a002018-03-21 06:28:42 +0000475 "ST_FP32m",
476 "ST_FP64m",
477 "ST_FP80m",
478 "VEXTRACTF128mr",
479 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000480 "(V?)MOVAPD(Y?)mr",
481 "(V?)MOVAPS(Y?)mr",
482 "(V?)MOVDQA(Y?)mr",
483 "(V?)MOVDQU(Y?)mr",
484 "(V?)MOVHPDmr",
485 "(V?)MOVHPSmr",
486 "(V?)MOVLPDmr",
487 "(V?)MOVLPSmr",
488 "(V?)MOVNTDQ(V?)mr",
489 "(V?)MOVNTPD(V?)mr",
490 "(V?)MOVNTPS(V?)mr",
491 "(V?)MOVPDI2DImr",
492 "(V?)MOVPQI2QImr",
493 "(V?)MOVPQIto64mr",
494 "(V?)MOVSDmr",
495 "(V?)MOVSSmr",
496 "(V?)MOVUPD(Y?)mr",
497 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000498
Gadi Haber323f2e12017-10-24 20:19:47 +0000499def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
500 let Latency = 2;
501 let NumMicroOps = 2;
502 let ResourceCycles = [2];
503}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000504def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000505
506def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
507 let Latency = 2;
508 let NumMicroOps = 2;
509 let ResourceCycles = [2];
510}
Craig Topper5a69a002018-03-21 06:28:42 +0000511def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
512 "ROL(8|16|32|64)ri",
513 "ROR(8|16|32|64)r1",
514 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000515
516def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
517 let Latency = 2;
518 let NumMicroOps = 2;
519 let ResourceCycles = [2];
520}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000521def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
522 MFENCE,
523 WAIT,
524 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000525
526def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
527 let Latency = 2;
528 let NumMicroOps = 2;
529 let ResourceCycles = [1,1];
530}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000531def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000532 "(V?)CVTPS2PDrr",
533 "(V?)CVTSS2SDrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000534 "(V?)PSLLDrr",
535 "(V?)PSLLQrr",
536 "(V?)PSLLWrr",
537 "(V?)PSRADrr",
538 "(V?)PSRAWrr",
539 "(V?)PSRLDrr",
540 "(V?)PSRLQrr",
541 "(V?)PSRLWrr",
542 "(V?)PTESTrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000543
544def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
545 let Latency = 2;
546 let NumMicroOps = 2;
547 let ResourceCycles = [1,1];
548}
549def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
550
551def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
552 let Latency = 2;
553 let NumMicroOps = 2;
554 let ResourceCycles = [1,1];
555}
556def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
557
558def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
559 let Latency = 2;
560 let NumMicroOps = 2;
561 let ResourceCycles = [1,1];
562}
563def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
564
565def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
566 let Latency = 2;
567 let NumMicroOps = 2;
568 let ResourceCycles = [1,1];
569}
Craig Topper498875f2018-04-04 17:54:19 +0000570def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
571
572def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
573 let Latency = 1;
574 let NumMicroOps = 1;
575 let ResourceCycles = [1];
576}
577def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000578
579def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
580 let Latency = 2;
581 let NumMicroOps = 2;
582 let ResourceCycles = [1,1];
583}
Craig Topper2d451e72018-03-18 08:38:06 +0000584def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000585def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000586def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
587 "ADC8ri",
588 "CMOV(A|BE)(16|32|64)rr",
589 "SBB8i8",
590 "SBB8ri",
591 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000592
Gadi Haber323f2e12017-10-24 20:19:47 +0000593def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
594 let Latency = 2;
595 let NumMicroOps = 3;
596 let ResourceCycles = [1,1,1];
597}
598def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
599
Gadi Haber323f2e12017-10-24 20:19:47 +0000600def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
601 let Latency = 2;
602 let NumMicroOps = 3;
603 let ResourceCycles = [1,1,1];
604}
605def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
606
607def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
608 let Latency = 2;
609 let NumMicroOps = 3;
610 let ResourceCycles = [1,1,1];
611}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000612def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
613 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000614def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000615 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000616
Gadi Haber323f2e12017-10-24 20:19:47 +0000617def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
618 let Latency = 3;
619 let NumMicroOps = 1;
620 let ResourceCycles = [1];
621}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000622def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000623 "PDEP(32|64)rr",
624 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000625 "SHLD(16|32|64)rri8",
626 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000627 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000628
629def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000630 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000631 let NumMicroOps = 2;
632 let ResourceCycles = [1,1];
633}
Clement Courbet327fac42018-03-07 08:14:02 +0000634def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000635
636def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
637 let Latency = 3;
638 let NumMicroOps = 1;
639 let ResourceCycles = [1];
640}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000641def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
642 "VPBROADCASTWrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000643 "VPMOVSXBDYrr",
644 "VPMOVSXBQYrr",
645 "VPMOVSXBWYrr",
646 "VPMOVSXDQYrr",
647 "VPMOVSXWDYrr",
648 "VPMOVSXWQYrr",
649 "VPMOVZXBDYrr",
650 "VPMOVZXBQYrr",
651 "VPMOVZXBWYrr",
652 "VPMOVZXDQYrr",
653 "VPMOVZXWDYrr",
654 "VPMOVZXWQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000655
656def BWWriteResGroup29 : SchedWriteRes<[BWPort01]> {
657 let Latency = 3;
658 let NumMicroOps = 1;
659 let ResourceCycles = [1];
660}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000661def: InstRW<[BWWriteResGroup29], (instregex "(V?)MULPD(Y?)rr",
662 "(V?)MULPS(Y?)rr",
663 "(V?)MULSDrr",
664 "(V?)MULSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000665
666def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000667 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000668 let NumMicroOps = 3;
669 let ResourceCycles = [3];
670}
Craig Topperb5f26592018-04-19 18:00:17 +0000671def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
672 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
673 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000674
675def BWWriteResGroup31 : SchedWriteRes<[BWPort0,BWPort5]> {
676 let Latency = 3;
677 let NumMicroOps = 3;
678 let ResourceCycles = [2,1];
679}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000680def: InstRW<[BWWriteResGroup31], (instregex "VPSLLVD(Y?)rr",
681 "VPSRAVD(Y?)rr",
682 "VPSRLVD(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000683
Gadi Haber323f2e12017-10-24 20:19:47 +0000684def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
685 let Latency = 3;
686 let NumMicroOps = 3;
687 let ResourceCycles = [2,1];
688}
Craig Topper5a69a002018-03-21 06:28:42 +0000689def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
690 "MMX_PACKSSWBirr",
691 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000692
693def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
694 let Latency = 3;
695 let NumMicroOps = 3;
696 let ResourceCycles = [1,2];
697}
698def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
699
700def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
701 let Latency = 3;
702 let NumMicroOps = 3;
703 let ResourceCycles = [1,2];
704}
Craig Topper5a69a002018-03-21 06:28:42 +0000705def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
706 "RCL(8|16|32|64)ri",
707 "RCR(8|16|32|64)r1",
708 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000709
710def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
711 let Latency = 3;
712 let NumMicroOps = 3;
713 let ResourceCycles = [2,1];
714}
Craig Topper5a69a002018-03-21 06:28:42 +0000715def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
716 "ROR(8|16|32|64)rCL",
717 "SAR(8|16|32|64)rCL",
718 "SHL(8|16|32|64)rCL",
719 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000720
721def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
722 let Latency = 3;
723 let NumMicroOps = 4;
724 let ResourceCycles = [1,1,1,1];
725}
726def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
727
728def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
729 let Latency = 3;
730 let NumMicroOps = 4;
731 let ResourceCycles = [1,1,1,1];
732}
Craig Topper5a69a002018-03-21 06:28:42 +0000733def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
734 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000735
736def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
737 let Latency = 4;
738 let NumMicroOps = 2;
739 let ResourceCycles = [1,1];
740}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000741def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
742 "(V?)CVTSD2SIrr",
743 "(V?)CVTSS2SI64rr",
744 "(V?)CVTSS2SIrr",
745 "(V?)CVTTSD2SI64rr",
746 "(V?)CVTTSD2SIrr",
747 "(V?)CVTTSS2SI64rr",
748 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000749
750def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
751 let Latency = 4;
752 let NumMicroOps = 2;
753 let ResourceCycles = [1,1];
754}
Craig Topper5a69a002018-03-21 06:28:42 +0000755def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr",
756 "VPSLLDYrr",
757 "VPSLLQYrr",
758 "VPSLLWYrr",
759 "VPSRADYrr",
760 "VPSRAWYrr",
761 "VPSRLDYrr",
762 "VPSRLQYrr",
763 "VPSRLWYrr",
764 "VPTESTYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000765
766def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
767 let Latency = 4;
768 let NumMicroOps = 2;
769 let ResourceCycles = [1,1];
770}
771def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
772
773def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
774 let Latency = 4;
775 let NumMicroOps = 2;
776 let ResourceCycles = [1,1];
777}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000778def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000779def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000780 "MMX_CVTPI2PDirr",
781 "MMX_CVTPS2PIirr",
782 "MMX_CVTTPD2PIirr",
783 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000784 "(V?)CVTDQ2PDrr",
785 "(V?)CVTPD2DQrr",
786 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000787 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000788 "(V?)CVTSD2SSrr",
789 "(V?)CVTSI642SDrr",
790 "(V?)CVTSI2SDrr",
791 "(V?)CVTSI2SSrr",
792 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000793
794def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
795 let Latency = 4;
796 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000797 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000798}
Craig Topper5a69a002018-03-21 06:28:42 +0000799def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000800
801def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
802 let Latency = 4;
803 let NumMicroOps = 3;
804 let ResourceCycles = [1,1,1];
805}
806def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
807
808def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
809 let Latency = 4;
810 let NumMicroOps = 3;
811 let ResourceCycles = [1,1,1];
812}
Craig Topper5a69a002018-03-21 06:28:42 +0000813def: InstRW<[BWWriteResGroup44], (instregex "ISTT_FP16m",
814 "ISTT_FP32m",
815 "ISTT_FP64m",
816 "IST_F16m",
817 "IST_F32m",
818 "IST_FP16m",
819 "IST_FP32m",
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000820 "IST_FP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000821
822def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
823 let Latency = 4;
824 let NumMicroOps = 4;
825 let ResourceCycles = [4];
826}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000827def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000828
829def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
830 let Latency = 4;
831 let NumMicroOps = 4;
832 let ResourceCycles = [1,3];
833}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000834def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000835
836def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
837 let Latency = 5;
838 let NumMicroOps = 1;
839 let ResourceCycles = [1];
840}
Simon Pilgrim74ccc6a2018-04-21 19:11:55 +0000841def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000842
Gadi Haber323f2e12017-10-24 20:19:47 +0000843def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
844 let Latency = 5;
845 let NumMicroOps = 1;
846 let ResourceCycles = [1];
847}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000848def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000849 "MOVSX(16|32|64)rm32",
850 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000851 "MOVZX(16|32|64)rm16",
852 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000853 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000854 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000855 "(V?)MOVSHDUPrm",
856 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000857 "VPBROADCASTDrm",
858 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000859
860def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
861 let Latency = 5;
862 let NumMicroOps = 3;
863 let ResourceCycles = [1,2];
864}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000865def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000866
867def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
868 let Latency = 5;
869 let NumMicroOps = 3;
870 let ResourceCycles = [1,1,1];
871}
872def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
873
874def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000875 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000876 let NumMicroOps = 3;
877 let ResourceCycles = [1,1,1];
878}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000879def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000880
881def BWWriteResGroup53 : SchedWriteRes<[BWPort0,BWPort4,BWPort237,BWPort15]> {
882 let Latency = 5;
883 let NumMicroOps = 4;
884 let ResourceCycles = [1,1,1,1];
885}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000886def: InstRW<[BWWriteResGroup53], (instregex "VMASKMOVPD(Y?)mr",
887 "VMASKMOVPS(Y?)mr",
888 "VPMASKMOVD(Y?)mr",
889 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000890
891def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
892 let Latency = 5;
893 let NumMicroOps = 5;
894 let ResourceCycles = [1,4];
895}
896def: InstRW<[BWWriteResGroup54], (instregex "PAUSE")>;
897
898def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
899 let Latency = 5;
900 let NumMicroOps = 5;
901 let ResourceCycles = [1,4];
902}
903def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
904
905def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
906 let Latency = 5;
907 let NumMicroOps = 5;
908 let ResourceCycles = [2,3];
909}
Craig Topper5a69a002018-03-21 06:28:42 +0000910def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000911
912def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
913 let Latency = 5;
914 let NumMicroOps = 6;
915 let ResourceCycles = [1,1,4];
916}
Craig Topper5a69a002018-03-21 06:28:42 +0000917def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000918
919def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
920 let Latency = 6;
921 let NumMicroOps = 1;
922 let ResourceCycles = [1];
923}
Craig Topper5a69a002018-03-21 06:28:42 +0000924def: InstRW<[BWWriteResGroup58], (instregex "LD_F32m",
925 "LD_F64m",
926 "LD_F80m",
927 "VBROADCASTF128",
928 "VBROADCASTI128",
929 "VBROADCASTSDYrm",
930 "VBROADCASTSSYrm",
931 "VLDDQUYrm",
932 "VMOVAPDYrm",
933 "VMOVAPSYrm",
934 "VMOVDDUPYrm",
935 "VMOVDQAYrm",
936 "VMOVDQUYrm",
937 "VMOVNTDQAYrm",
938 "VMOVSHDUPYrm",
939 "VMOVSLDUPYrm",
940 "VMOVUPDYrm",
941 "VMOVUPSYrm",
942 "VPBROADCASTDYrm",
943 "VPBROADCASTQYrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000944 "(V?)ROUNDPD(Y?)r",
945 "(V?)ROUNDPS(Y?)r",
946 "(V?)ROUNDSDr",
947 "(V?)ROUNDSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000948
949def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
950 let Latency = 6;
951 let NumMicroOps = 2;
952 let ResourceCycles = [1,1];
953}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000954def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000955 "(V?)CVTPS2PDrm",
956 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000957 "VPSLLVQrm",
958 "VPSRLVQrm",
959 "VTESTPDrm",
960 "VTESTPSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000961
962def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
963 let Latency = 6;
964 let NumMicroOps = 2;
965 let ResourceCycles = [1,1];
966}
Craig Topper5a69a002018-03-21 06:28:42 +0000967def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
968 "VCVTPD2DQYrr",
969 "VCVTPD2PSYrr",
970 "VCVTPS2PHYrr",
971 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000972
Gadi Haber323f2e12017-10-24 20:19:47 +0000973def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
974 let Latency = 6;
975 let NumMicroOps = 2;
976 let ResourceCycles = [1,1];
977}
Craig Topper5a69a002018-03-21 06:28:42 +0000978def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
979 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000980
981def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
982 let Latency = 6;
983 let NumMicroOps = 2;
984 let ResourceCycles = [1,1];
985}
Craig Topperdfccafe2018-04-18 06:41:25 +0000986def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +0000987def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
988 ADCX32rm, ADCX64rm,
989 ADOX32rm, ADOX64rm,
990 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000991
992def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
993 let Latency = 6;
994 let NumMicroOps = 2;
995 let ResourceCycles = [1,1];
996}
Craig Topper5a69a002018-03-21 06:28:42 +0000997def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
998 "BLSI(32|64)rm",
999 "BLSMSK(32|64)rm",
1000 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001001 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001002
1003def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
1004 let Latency = 6;
1005 let NumMicroOps = 2;
1006 let ResourceCycles = [1,1];
1007}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001008def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +00001009 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001010 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001011
1012def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1013 let Latency = 6;
1014 let NumMicroOps = 2;
1015 let ResourceCycles = [1,1];
1016}
Craig Topper2d451e72018-03-18 08:38:06 +00001017def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001018def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001019
1020def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1021 let Latency = 6;
1022 let NumMicroOps = 4;
1023 let ResourceCycles = [1,1,2];
1024}
Craig Topper5a69a002018-03-21 06:28:42 +00001025def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1026 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001027
1028def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1029 let Latency = 6;
1030 let NumMicroOps = 4;
1031 let ResourceCycles = [1,1,1,1];
1032}
1033def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1034
1035def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1036 let Latency = 6;
1037 let NumMicroOps = 4;
1038 let ResourceCycles = [1,1,1,1];
1039}
Craig Topper5a69a002018-03-21 06:28:42 +00001040def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1041 "BTR(16|32|64)mi8",
1042 "BTS(16|32|64)mi8",
1043 "SAR(8|16|32|64)m1",
1044 "SAR(8|16|32|64)mi",
1045 "SHL(8|16|32|64)m1",
1046 "SHL(8|16|32|64)mi",
1047 "SHR(8|16|32|64)m1",
1048 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001049
1050def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1051 let Latency = 6;
1052 let NumMicroOps = 4;
1053 let ResourceCycles = [1,1,1,1];
1054}
Craig Topperf0d04262018-04-06 16:16:48 +00001055def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1056 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001057
1058def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1059 let Latency = 6;
1060 let NumMicroOps = 6;
1061 let ResourceCycles = [1,5];
1062}
1063def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1064
Gadi Haber323f2e12017-10-24 20:19:47 +00001065def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1066 let Latency = 7;
1067 let NumMicroOps = 2;
1068 let ResourceCycles = [1,1];
1069}
Craig Topper5a69a002018-03-21 06:28:42 +00001070def: InstRW<[BWWriteResGroup73], (instregex "VPSLLDYrm",
1071 "VPSLLQYrm",
1072 "VPSLLVQYrm",
1073 "VPSLLWYrm",
1074 "VPSRADYrm",
1075 "VPSRAWYrm",
1076 "VPSRLDYrm",
1077 "VPSRLQYrm",
1078 "VPSRLVQYrm",
1079 "VPSRLWYrm",
1080 "VTESTPDYrm",
1081 "VTESTPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001082
1083def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1084 let Latency = 7;
1085 let NumMicroOps = 2;
1086 let ResourceCycles = [1,1];
1087}
Craig Topper5a69a002018-03-21 06:28:42 +00001088def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1089 "FCOM64m",
1090 "FCOMP32m",
1091 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001092
1093def BWWriteResGroup75 : SchedWriteRes<[BWPort5,BWPort23]> {
1094 let Latency = 7;
1095 let NumMicroOps = 2;
1096 let ResourceCycles = [1,1];
1097}
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +00001098def: InstRW<[BWWriteResGroup75], (instregex "VPACKSSDWYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001099 "VPACKSSWBYrm",
1100 "VPACKUSDWYrm",
1101 "VPACKUSWBYrm",
1102 "VPALIGNRYrmi",
1103 "VPBLENDWYrmi",
1104 "VPERMILPDYmi",
Craig Topper5a69a002018-03-21 06:28:42 +00001105 "VPERMILPSYmi",
Craig Topper5a69a002018-03-21 06:28:42 +00001106 "VPSHUFBYrm",
1107 "VPSHUFDYmi",
1108 "VPSHUFHWYmi",
1109 "VPSHUFLWYmi",
1110 "VPUNPCKHBWYrm",
1111 "VPUNPCKHDQYrm",
1112 "VPUNPCKHQDQYrm",
1113 "VPUNPCKHWDYrm",
1114 "VPUNPCKLBWYrm",
1115 "VPUNPCKLDQYrm",
1116 "VPUNPCKLQDQYrm",
1117 "VPUNPCKLWDYrm",
1118 "VSHUFPDYrmi",
1119 "VSHUFPSYrmi",
1120 "VUNPCKHPDYrm",
1121 "VUNPCKHPSYrm",
1122 "VUNPCKLPDYrm",
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +00001123 "VUNPCKLPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001124
1125def BWWriteResGroup76 : SchedWriteRes<[BWPort23,BWPort15]> {
1126 let Latency = 7;
1127 let NumMicroOps = 2;
1128 let ResourceCycles = [1,1];
1129}
Craig Topper5a69a002018-03-21 06:28:42 +00001130def: InstRW<[BWWriteResGroup76], (instregex "VPABSBYrm",
1131 "VPABSDYrm",
1132 "VPABSWYrm",
1133 "VPADDBYrm",
1134 "VPADDDYrm",
1135 "VPADDQYrm",
1136 "VPADDSBYrm",
1137 "VPADDSWYrm",
1138 "VPADDUSBYrm",
1139 "VPADDUSWYrm",
1140 "VPADDWYrm",
1141 "VPAVGBYrm",
1142 "VPAVGWYrm",
1143 "VPCMPEQBYrm",
1144 "VPCMPEQDYrm",
1145 "VPCMPEQQYrm",
1146 "VPCMPEQWYrm",
1147 "VPCMPGTBYrm",
1148 "VPCMPGTDYrm",
1149 "VPCMPGTWYrm",
1150 "VPMAXSBYrm",
1151 "VPMAXSDYrm",
1152 "VPMAXSWYrm",
1153 "VPMAXUBYrm",
1154 "VPMAXUDYrm",
1155 "VPMAXUWYrm",
1156 "VPMINSBYrm",
1157 "VPMINSDYrm",
1158 "VPMINSWYrm",
1159 "VPMINUBYrm",
1160 "VPMINUDYrm",
1161 "VPMINUWYrm",
1162 "VPSIGNBYrm",
1163 "VPSIGNDYrm",
1164 "VPSIGNWYrm",
1165 "VPSUBBYrm",
1166 "VPSUBDYrm",
1167 "VPSUBQYrm",
1168 "VPSUBSBYrm",
1169 "VPSUBSWYrm",
1170 "VPSUBUSBYrm",
1171 "VPSUBUSWYrm",
1172 "VPSUBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001173
1174def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1175 let Latency = 7;
1176 let NumMicroOps = 2;
1177 let ResourceCycles = [1,1];
1178}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001179def: InstRW<[BWWriteResGroup77], (instregex "VPANDNYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001180 "VPANDYrm",
1181 "VPBLENDDYrmi",
1182 "VPORYrm",
1183 "VPXORYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001184
Gadi Haber323f2e12017-10-24 20:19:47 +00001185def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1186 let Latency = 7;
1187 let NumMicroOps = 3;
1188 let ResourceCycles = [2,1];
1189}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001190def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001191 "MMX_PACKSSWBirm",
1192 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001193 "VMASKMOVPDrm",
1194 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001195 "VPMASKMOVDrm",
1196 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001197
1198def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1199 let Latency = 7;
1200 let NumMicroOps = 3;
1201 let ResourceCycles = [1,2];
1202}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001203def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1204 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001205
1206def BWWriteResGroup81 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1207 let Latency = 7;
1208 let NumMicroOps = 3;
1209 let ResourceCycles = [1,1,1];
1210}
Craig Topper5a69a002018-03-21 06:28:42 +00001211def: InstRW<[BWWriteResGroup81], (instregex "PSLLDrm",
1212 "PSLLQrm",
1213 "PSLLWrm",
1214 "PSRADrm",
1215 "PSRAWrm",
1216 "PSRLDrm",
1217 "PSRLQrm",
1218 "PSRLWrm",
1219 "PTESTrm",
1220 "VPSLLDrm",
1221 "VPSLLQrm",
1222 "VPSLLWrm",
1223 "VPSRADrm",
1224 "VPSRAWrm",
1225 "VPSRLDrm",
1226 "VPSRLQrm",
1227 "VPSRLWrm",
1228 "VPTESTrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001229
1230def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1231 let Latency = 7;
1232 let NumMicroOps = 3;
1233 let ResourceCycles = [1,1,1];
1234}
1235def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1236
Gadi Haber323f2e12017-10-24 20:19:47 +00001237def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1238 let Latency = 7;
1239 let NumMicroOps = 3;
1240 let ResourceCycles = [1,1,1];
1241}
Craig Topper5a69a002018-03-21 06:28:42 +00001242def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1243 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001244
Gadi Haber323f2e12017-10-24 20:19:47 +00001245def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1246 let Latency = 7;
1247 let NumMicroOps = 3;
1248 let ResourceCycles = [1,1,1];
1249}
Craig Topperf4cd9082018-01-19 05:47:32 +00001250def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001251
1252def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1253 let Latency = 7;
1254 let NumMicroOps = 5;
1255 let ResourceCycles = [1,1,1,2];
1256}
Craig Topper5a69a002018-03-21 06:28:42 +00001257def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1258 "ROL(8|16|32|64)mi",
1259 "ROR(8|16|32|64)m1",
1260 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001261
1262def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1263 let Latency = 7;
1264 let NumMicroOps = 5;
1265 let ResourceCycles = [1,1,1,2];
1266}
Craig Topper5a69a002018-03-21 06:28:42 +00001267def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001268
1269def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1270 let Latency = 7;
1271 let NumMicroOps = 5;
1272 let ResourceCycles = [1,1,1,1,1];
1273}
Craig Topper5a69a002018-03-21 06:28:42 +00001274def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1275 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001276
1277def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1278 let Latency = 7;
1279 let NumMicroOps = 7;
1280 let ResourceCycles = [2,2,1,2];
1281}
Craig Topper2d451e72018-03-18 08:38:06 +00001282def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001283
1284def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1285 let Latency = 8;
1286 let NumMicroOps = 2;
1287 let ResourceCycles = [1,1];
1288}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001289def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001290 "PDEP(32|64)rm",
1291 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001292 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001293
1294def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001295 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001296 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001297 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001298}
Craig Topperf846e2d2018-04-19 05:34:05 +00001299def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001300
Craig Topperf846e2d2018-04-19 05:34:05 +00001301def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1302 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001303 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001304 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001305}
Craig Topper5a69a002018-03-21 06:28:42 +00001306def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001307
Gadi Haber323f2e12017-10-24 20:19:47 +00001308def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1309 let Latency = 8;
1310 let NumMicroOps = 2;
1311 let ResourceCycles = [1,1];
1312}
Craig Topper5a69a002018-03-21 06:28:42 +00001313def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1314 "VPMOVSXBQYrm",
1315 "VPMOVSXBWYrm",
1316 "VPMOVSXDQYrm",
1317 "VPMOVSXWDYrm",
1318 "VPMOVSXWQYrm",
1319 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001320
1321def BWWriteResGroup93 : SchedWriteRes<[BWPort01,BWPort23]> {
1322 let Latency = 8;
1323 let NumMicroOps = 2;
1324 let ResourceCycles = [1,1];
1325}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001326def: InstRW<[BWWriteResGroup93], (instregex "(V?)MULPDrm",
1327 "(V?)MULPSrm",
1328 "(V?)MULSDrm",
1329 "(V?)MULSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001330
1331def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1332 let Latency = 8;
1333 let NumMicroOps = 3;
1334 let ResourceCycles = [2,1];
1335}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001336def: InstRW<[BWWriteResGroup94], (instregex "VMASKMOVPDYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001337 "VMASKMOVPSYrm",
1338 "VPBLENDVBYrm",
1339 "VPMASKMOVDYrm",
1340 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001341
1342def BWWriteResGroup95 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1343 let Latency = 8;
1344 let NumMicroOps = 4;
1345 let ResourceCycles = [2,1,1];
1346}
Craig Topper5a69a002018-03-21 06:28:42 +00001347def: InstRW<[BWWriteResGroup95], (instregex "VPSLLVDrm",
1348 "VPSRAVDrm",
1349 "VPSRLVDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001350
Gadi Haber323f2e12017-10-24 20:19:47 +00001351def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1352 let Latency = 8;
1353 let NumMicroOps = 5;
1354 let ResourceCycles = [1,1,1,2];
1355}
Craig Topper5a69a002018-03-21 06:28:42 +00001356def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1357 "RCL(8|16|32|64)mi",
1358 "RCR(8|16|32|64)m1",
1359 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001360
1361def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1362 let Latency = 8;
1363 let NumMicroOps = 5;
1364 let ResourceCycles = [1,1,2,1];
1365}
Craig Topper13a16502018-03-19 00:56:09 +00001366def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001367
1368def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1369 let Latency = 8;
1370 let NumMicroOps = 6;
1371 let ResourceCycles = [1,1,1,3];
1372}
Craig Topper9f834812018-04-01 21:54:24 +00001373def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001374
1375def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1376 let Latency = 8;
1377 let NumMicroOps = 6;
1378 let ResourceCycles = [1,1,1,2,1];
1379}
Craig Topper9f834812018-04-01 21:54:24 +00001380def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001381 "CMPXCHG(8|16|32|64)rm",
1382 "ROL(8|16|32|64)mCL",
1383 "SAR(8|16|32|64)mCL",
1384 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001385 "SHL(8|16|32|64)mCL",
1386 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001387def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1388 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001389
1390def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1391 let Latency = 9;
1392 let NumMicroOps = 2;
1393 let ResourceCycles = [1,1];
1394}
Craig Topper5a69a002018-03-21 06:28:42 +00001395def: InstRW<[BWWriteResGroup101], (instregex "ADD_F32m",
1396 "ADD_F64m",
1397 "ILD_F16m",
1398 "ILD_F32m",
1399 "ILD_F64m",
1400 "SUBR_F32m",
1401 "SUBR_F64m",
1402 "SUB_F32m",
1403 "SUB_F64m",
1404 "VADDPDYrm",
1405 "VADDPSYrm",
1406 "VADDSUBPDYrm",
1407 "VADDSUBPSYrm",
1408 "VCMPPDYrmi",
1409 "VCMPPSYrmi",
Craig Topper5a69a002018-03-21 06:28:42 +00001410 "VCVTPS2DQYrm",
1411 "VCVTTPS2DQYrm",
1412 "VMAX(C?)PDYrm",
1413 "VMAX(C?)PSYrm",
1414 "VMIN(C?)PDYrm",
1415 "VMIN(C?)PSYrm",
1416 "VSUBPDYrm",
1417 "VSUBPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001418
1419def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1420 let Latency = 9;
1421 let NumMicroOps = 2;
1422 let ResourceCycles = [1,1];
1423}
Craig Topper5a69a002018-03-21 06:28:42 +00001424def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1425 "VPERM2I128rm",
1426 "VPERMDYrm",
1427 "VPERMPDYmi",
1428 "VPERMPSYrm",
1429 "VPERMQYmi",
1430 "VPMOVZXBDYrm",
1431 "VPMOVZXBQYrm",
1432 "VPMOVZXBWYrm",
1433 "VPMOVZXDQYrm",
1434 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001435
1436def BWWriteResGroup103 : SchedWriteRes<[BWPort01,BWPort23]> {
1437 let Latency = 9;
1438 let NumMicroOps = 2;
1439 let ResourceCycles = [1,1];
1440}
Craig Topper5a69a002018-03-21 06:28:42 +00001441def: InstRW<[BWWriteResGroup103], (instregex "VMULPDYrm",
1442 "VMULPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001443
1444def BWWriteResGroup104 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1445 let Latency = 9;
1446 let NumMicroOps = 3;
1447 let ResourceCycles = [1,1,1];
1448}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001449def: InstRW<[BWWriteResGroup104], (instregex "(V?)DPPDrri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001450
1451def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1452 let Latency = 9;
1453 let NumMicroOps = 3;
1454 let ResourceCycles = [1,1,1];
1455}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001456def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1457 "(V?)CVTSD2SIrm",
1458 "(V?)CVTSS2SI64rm",
1459 "(V?)CVTSS2SIrm",
1460 "(V?)CVTTSD2SI64rm",
1461 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001462 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001463 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001464
1465def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1466 let Latency = 9;
1467 let NumMicroOps = 3;
1468 let ResourceCycles = [1,1,1];
1469}
1470def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1471
1472def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1473 let Latency = 9;
1474 let NumMicroOps = 3;
1475 let ResourceCycles = [1,1,1];
1476}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001477def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001478def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001479 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001480 "CVTTPD2DQrm",
1481 "MMX_CVTPD2PIirm",
1482 "MMX_CVTPI2PDirm",
1483 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001484 "(V?)CVTDQ2PDrm",
1485 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001486
1487def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1488 let Latency = 9;
1489 let NumMicroOps = 3;
1490 let ResourceCycles = [1,1,1];
1491}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001492def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1493 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001494
1495def BWWriteResGroup109 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1496 let Latency = 9;
1497 let NumMicroOps = 4;
1498 let ResourceCycles = [2,1,1];
1499}
Craig Topper5a69a002018-03-21 06:28:42 +00001500def: InstRW<[BWWriteResGroup109], (instregex "VPSLLVDYrm",
1501 "VPSRAVDYrm",
1502 "VPSRLVDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001503
1504def BWWriteResGroup110 : SchedWriteRes<[BWPort5,BWPort23,BWPort15]> {
1505 let Latency = 9;
1506 let NumMicroOps = 4;
1507 let ResourceCycles = [2,1,1];
1508}
Craig Topper5a69a002018-03-21 06:28:42 +00001509def: InstRW<[BWWriteResGroup110], (instregex "VPHADDDYrm",
1510 "VPHADDSWYrm",
1511 "VPHADDWYrm",
1512 "VPHSUBDYrm",
1513 "VPHSUBSWYrm",
1514 "VPHSUBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001515
1516def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1517 let Latency = 9;
1518 let NumMicroOps = 4;
1519 let ResourceCycles = [1,1,1,1];
1520}
Craig Topper5a69a002018-03-21 06:28:42 +00001521def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1522 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001523
1524def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1525 let Latency = 9;
1526 let NumMicroOps = 5;
1527 let ResourceCycles = [1,1,3];
1528}
1529def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1530
1531def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1532 let Latency = 9;
1533 let NumMicroOps = 5;
1534 let ResourceCycles = [1,2,1,1];
1535}
Craig Topper5a69a002018-03-21 06:28:42 +00001536def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1537 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001538
Gadi Haber323f2e12017-10-24 20:19:47 +00001539def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1540 let Latency = 10;
1541 let NumMicroOps = 2;
1542 let ResourceCycles = [1,1];
1543}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001544def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001545
Gadi Haber323f2e12017-10-24 20:19:47 +00001546def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1547 let Latency = 10;
1548 let NumMicroOps = 3;
1549 let ResourceCycles = [2,1];
1550}
Craig Topper5a69a002018-03-21 06:28:42 +00001551def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1552 "FICOM32m",
1553 "FICOMP16m",
1554 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001555
1556def BWWriteResGroup118 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1557 let Latency = 10;
1558 let NumMicroOps = 3;
1559 let ResourceCycles = [1,1,1];
1560}
1561def: InstRW<[BWWriteResGroup118], (instregex "VPTESTYrm")>;
1562
Gadi Haber323f2e12017-10-24 20:19:47 +00001563def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1564 let Latency = 10;
1565 let NumMicroOps = 4;
1566 let ResourceCycles = [1,1,1,1];
1567}
1568def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1569
1570def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001571 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001572 let NumMicroOps = 4;
1573 let ResourceCycles = [1,1,1,1];
1574}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001575def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001576
Craig Topper8104f262018-04-02 05:33:28 +00001577def BWWriteResGroup122 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001578 let Latency = 11;
1579 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001580 let ResourceCycles = [1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001581}
Craig Topper8104f262018-04-02 05:33:28 +00001582def: InstRW<[BWWriteResGroup122], (instregex "(V?)DIVPSrr")>;
1583
1584def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1585 let Latency = 11;
1586 let NumMicroOps = 1;
1587 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1588}
1589def: InstRW<[BWWriteResGroup122_1], (instregex "(V?)DIVSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001590
1591def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1592 let Latency = 11;
1593 let NumMicroOps = 2;
1594 let ResourceCycles = [1,1];
1595}
Craig Topper5a69a002018-03-21 06:28:42 +00001596def: InstRW<[BWWriteResGroup123], (instregex "MUL_F32m",
1597 "MUL_F64m",
1598 "VPCMPGTQYrm",
1599 "VPMADDUBSWYrm",
1600 "VPMADDWDYrm",
1601 "VPMULDQYrm",
1602 "VPMULHRSWYrm",
1603 "VPMULHUWYrm",
1604 "VPMULHWYrm",
1605 "VPMULLWYrm",
1606 "VPMULUDQYrm",
1607 "VPSADBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001608
Gadi Haber323f2e12017-10-24 20:19:47 +00001609def BWWriteResGroup126 : SchedWriteRes<[BWPort0,BWPort015]> {
1610 let Latency = 11;
1611 let NumMicroOps = 3;
1612 let ResourceCycles = [2,1];
1613}
Craig Topper5a69a002018-03-21 06:28:42 +00001614def: InstRW<[BWWriteResGroup126], (instregex "VRCPPSYr",
1615 "VRSQRTPSYr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001616
1617def BWWriteResGroup127 : SchedWriteRes<[BWPort1,BWPort23]> {
1618 let Latency = 11;
1619 let NumMicroOps = 3;
1620 let ResourceCycles = [2,1];
1621}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001622def: InstRW<[BWWriteResGroup127], (instregex "(V?)ROUNDPDm",
1623 "(V?)ROUNDPSm",
1624 "(V?)ROUNDSDm",
1625 "(V?)ROUNDSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001626
1627def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1628 let Latency = 11;
1629 let NumMicroOps = 3;
1630 let ResourceCycles = [1,1,1];
1631}
1632def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1633
Gadi Haber323f2e12017-10-24 20:19:47 +00001634def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1635 let Latency = 11;
1636 let NumMicroOps = 6;
1637 let ResourceCycles = [1,1,1,1,2];
1638}
Craig Topper5a69a002018-03-21 06:28:42 +00001639def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1640 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001641
1642def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1643 let Latency = 11;
1644 let NumMicroOps = 7;
1645 let ResourceCycles = [2,2,3];
1646}
Craig Topper5a69a002018-03-21 06:28:42 +00001647def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1648 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001649
1650def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1651 let Latency = 11;
1652 let NumMicroOps = 9;
1653 let ResourceCycles = [1,4,1,3];
1654}
1655def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1656
1657def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1658 let Latency = 11;
1659 let NumMicroOps = 11;
1660 let ResourceCycles = [2,9];
1661}
Craig Topper2d451e72018-03-18 08:38:06 +00001662def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1663def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001664
Gadi Haber323f2e12017-10-24 20:19:47 +00001665def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1666 let Latency = 12;
1667 let NumMicroOps = 3;
1668 let ResourceCycles = [2,1];
1669}
Craig Topper5a69a002018-03-21 06:28:42 +00001670def: InstRW<[BWWriteResGroup135], (instregex "ADD_FI16m",
1671 "ADD_FI32m",
1672 "SUBR_FI16m",
1673 "SUBR_FI32m",
1674 "SUB_FI16m",
1675 "SUB_FI32m",
Craig Topper40d3b322018-03-22 21:55:20 +00001676 "VROUNDPDYm",
1677 "VROUNDPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001678
Craig Topper8104f262018-04-02 05:33:28 +00001679def BWWriteResGroup137 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001680 let Latency = 11;
Gadi Haber323f2e12017-10-24 20:19:47 +00001681 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001682 let ResourceCycles = [1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001683}
Craig Topper8104f262018-04-02 05:33:28 +00001684def: InstRW<[BWWriteResGroup137], (instregex "(V?)SQRTPSr")>;
1685
1686def BWWriteResGroup137_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1687 let Latency = 11;
1688 let NumMicroOps = 1;
1689 let ResourceCycles = [1,4];
1690}
1691def: InstRW<[BWWriteResGroup137_1], (instregex "(V?)SQRTSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001692
1693def BWWriteResGroup138 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1694 let Latency = 13;
1695 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001696 let ResourceCycles = [1,2,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001697}
1698def: InstRW<[BWWriteResGroup138], (instregex "VMPSADBWYrmi")>;
1699
Craig Topper8104f262018-04-02 05:33:28 +00001700def BWWriteResGroup139 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001701 let Latency = 14;
1702 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001703 let ResourceCycles = [1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001704}
Craig Topper8104f262018-04-02 05:33:28 +00001705def: InstRW<[BWWriteResGroup139], (instregex "(V?)DIVPDrr")>;
1706
1707def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1708 let Latency = 14;
1709 let NumMicroOps = 1;
1710 let ResourceCycles = [1,4];
1711}
1712def: InstRW<[BWWriteResGroup139_1], (instregex "(V?)DIVSDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001713
Gadi Haber323f2e12017-10-24 20:19:47 +00001714def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1715 let Latency = 14;
1716 let NumMicroOps = 3;
1717 let ResourceCycles = [1,1,1];
1718}
Craig Topper5a69a002018-03-21 06:28:42 +00001719def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI16m",
1720 "MUL_FI32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001721
1722def BWWriteResGroup142 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1723 let Latency = 14;
1724 let NumMicroOps = 4;
1725 let ResourceCycles = [2,1,1];
1726}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001727def: InstRW<[BWWriteResGroup142], (instregex "(V?)DPPS(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001728
1729def BWWriteResGroup143 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1730 let Latency = 14;
1731 let NumMicroOps = 4;
1732 let ResourceCycles = [1,1,1,1];
1733}
Craig Topper5a69a002018-03-21 06:28:42 +00001734def: InstRW<[BWWriteResGroup143], (instregex "(V?)DPPDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001735
1736def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1737 let Latency = 14;
1738 let NumMicroOps = 8;
1739 let ResourceCycles = [2,2,1,3];
1740}
1741def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1742
1743def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1744 let Latency = 14;
1745 let NumMicroOps = 10;
1746 let ResourceCycles = [2,3,1,4];
1747}
1748def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1749
1750def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1751 let Latency = 14;
1752 let NumMicroOps = 12;
1753 let ResourceCycles = [2,1,4,5];
1754}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001755def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001756
1757def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1758 let Latency = 15;
1759 let NumMicroOps = 1;
1760 let ResourceCycles = [1];
1761}
Craig Topper5a69a002018-03-21 06:28:42 +00001762def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1763 "DIVR_FST0r",
1764 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001765
Gadi Haber323f2e12017-10-24 20:19:47 +00001766def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1767 let Latency = 15;
1768 let NumMicroOps = 10;
1769 let ResourceCycles = [1,1,1,4,1,2];
1770}
Craig Topper13a16502018-03-19 00:56:09 +00001771def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001772
Craig Topper8104f262018-04-02 05:33:28 +00001773def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001774 let Latency = 16;
1775 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001776 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001777}
Craig Topper5a69a002018-03-21 06:28:42 +00001778def: InstRW<[BWWriteResGroup150], (instregex "(V?)DIVPSrm",
1779 "(V?)DIVSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001780
1781def BWWriteResGroup151 : SchedWriteRes<[BWPort0,BWPort23]> {
1782 let Latency = 16;
1783 let NumMicroOps = 3;
1784 let ResourceCycles = [2,1];
1785}
1786def: InstRW<[BWWriteResGroup151], (instregex "VPMULLDYrm")>;
1787
Gadi Haber323f2e12017-10-24 20:19:47 +00001788def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1789 let Latency = 16;
1790 let NumMicroOps = 14;
1791 let ResourceCycles = [1,1,1,4,2,5];
1792}
1793def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1794
1795def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1796 let Latency = 16;
1797 let NumMicroOps = 16;
1798 let ResourceCycles = [16];
1799}
Craig Topper5a69a002018-03-21 06:28:42 +00001800def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001801
Craig Topper8104f262018-04-02 05:33:28 +00001802def BWWriteResGroup155 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001803 let Latency = 17;
1804 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001805 let ResourceCycles = [2,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001806}
1807def: InstRW<[BWWriteResGroup155], (instregex "VDIVPSYrr")>;
1808
1809def BWWriteResGroup156 : SchedWriteRes<[BWPort0,BWPort23,BWPort015]> {
1810 let Latency = 17;
1811 let NumMicroOps = 4;
1812 let ResourceCycles = [2,1,1];
1813}
Craig Topper5a69a002018-03-21 06:28:42 +00001814def: InstRW<[BWWriteResGroup156], (instregex "VRCPPSYm",
1815 "VRSQRTPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001816
Craig Topper8104f262018-04-02 05:33:28 +00001817def BWWriteResGroup157 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001818 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001819 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001820 let ResourceCycles = [1,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001821}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001822def: InstRW<[BWWriteResGroup157], (instregex "(V?)SQRTPSm",
1823 "(V?)SQRTSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001824
Gadi Haber323f2e12017-10-24 20:19:47 +00001825def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1826 let Latency = 18;
1827 let NumMicroOps = 8;
1828 let ResourceCycles = [1,1,1,5];
1829}
Craig Topper5a69a002018-03-21 06:28:42 +00001830def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001831def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001832
1833def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1834 let Latency = 18;
1835 let NumMicroOps = 11;
1836 let ResourceCycles = [2,1,1,3,1,3];
1837}
Craig Topper13a16502018-03-19 00:56:09 +00001838def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001839
Craig Topper8104f262018-04-02 05:33:28 +00001840def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001841 let Latency = 19;
1842 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001843 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001844}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001845def: InstRW<[BWWriteResGroup161], (instregex "(V?)DIVPDrm",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001846 "(V?)DIVSDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001847
Gadi Haber323f2e12017-10-24 20:19:47 +00001848def BWWriteResGroup163 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1849 let Latency = 19;
1850 let NumMicroOps = 5;
1851 let ResourceCycles = [2,1,1,1];
1852}
Craig Topper5a69a002018-03-21 06:28:42 +00001853def: InstRW<[BWWriteResGroup163], (instregex "(V?)DPPSrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001854
Gadi Haber323f2e12017-10-24 20:19:47 +00001855def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1856 let Latency = 20;
1857 let NumMicroOps = 1;
1858 let ResourceCycles = [1];
1859}
Craig Topper5a69a002018-03-21 06:28:42 +00001860def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1861 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001862 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001863
1864def BWWriteResGroup166 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1865 let Latency = 20;
1866 let NumMicroOps = 5;
1867 let ResourceCycles = [2,1,1,1];
1868}
1869def: InstRW<[BWWriteResGroup166], (instregex "VDPPSYrmi")>;
1870
1871def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1872 let Latency = 20;
1873 let NumMicroOps = 8;
1874 let ResourceCycles = [1,1,1,1,1,1,2];
1875}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001876def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001877
Craig Topper8104f262018-04-02 05:33:28 +00001878def BWWriteResGroup168 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001879 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001880 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001881 let ResourceCycles = [1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001882}
Craig Topper8104f262018-04-02 05:33:28 +00001883def: InstRW<[BWWriteResGroup168], (instregex "(V?)SQRTPDr")>;
1884
1885def BWWriteResGroup168_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1886 let Latency = 16;
1887 let NumMicroOps = 1;
1888 let ResourceCycles = [1,8];
1889}
1890def: InstRW<[BWWriteResGroup168_1], (instregex "(V?)SQRTSDr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001891
1892def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1893 let Latency = 21;
1894 let NumMicroOps = 2;
1895 let ResourceCycles = [1,1];
1896}
Craig Topper5a69a002018-03-21 06:28:42 +00001897def: InstRW<[BWWriteResGroup169], (instregex "DIV_F32m",
1898 "DIV_F64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001899
Craig Topper8104f262018-04-02 05:33:28 +00001900def BWWriteResGroup170 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001901 let Latency = 21;
1902 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001903 let ResourceCycles = [2,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001904}
1905def: InstRW<[BWWriteResGroup170], (instregex "VSQRTPSYr")>;
1906
1907def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1908 let Latency = 21;
1909 let NumMicroOps = 19;
1910 let ResourceCycles = [2,1,4,1,1,4,6];
1911}
1912def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1913
1914def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1915 let Latency = 22;
1916 let NumMicroOps = 18;
1917 let ResourceCycles = [1,1,16];
1918}
1919def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1920
Craig Topper8104f262018-04-02 05:33:28 +00001921def BWWriteResGroup173 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001922 let Latency = 23;
1923 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001924 let ResourceCycles = [2,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001925}
1926def: InstRW<[BWWriteResGroup173], (instregex "VDIVPDYrr")>;
1927
Craig Topper8104f262018-04-02 05:33:28 +00001928def BWWriteResGroup174 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001929 let Latency = 23;
1930 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001931 let ResourceCycles = [2,1,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001932}
1933def: InstRW<[BWWriteResGroup174], (instregex "VDIVPSYrm")>;
1934
Gadi Haber323f2e12017-10-24 20:19:47 +00001935def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1936 let Latency = 23;
1937 let NumMicroOps = 19;
1938 let ResourceCycles = [3,1,15];
1939}
Craig Topper391c6f92017-12-10 01:24:08 +00001940def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001941
1942def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1943 let Latency = 24;
1944 let NumMicroOps = 3;
1945 let ResourceCycles = [1,1,1];
1946}
Craig Topper5a69a002018-03-21 06:28:42 +00001947def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI16m",
1948 "DIV_FI32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001949
Craig Topper8104f262018-04-02 05:33:28 +00001950def BWWriteResGroup179 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001951 let Latency = 21;
Gadi Haber323f2e12017-10-24 20:19:47 +00001952 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001953 let ResourceCycles = [1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001954}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001955def: InstRW<[BWWriteResGroup179], (instregex "(V?)SQRTPDm",
1956 "(V?)SQRTSDm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001957
1958def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1959 let Latency = 26;
1960 let NumMicroOps = 2;
1961 let ResourceCycles = [1,1];
1962}
Craig Topper5a69a002018-03-21 06:28:42 +00001963def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F32m",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001964 "DIVR_F64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001965
Craig Topper8104f262018-04-02 05:33:28 +00001966def BWWriteResGroup181 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001967 let Latency = 27;
1968 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001969 let ResourceCycles = [2,1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001970}
1971def: InstRW<[BWWriteResGroup181], (instregex "VSQRTPSYm")>;
1972
1973def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1974 let Latency = 29;
1975 let NumMicroOps = 3;
1976 let ResourceCycles = [1,1,1];
1977}
Craig Topper5a69a002018-03-21 06:28:42 +00001978def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI16m",
1979 "DIVR_FI32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001980
Craig Topper8104f262018-04-02 05:33:28 +00001981def BWWriteResGroup183 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001982 let Latency = 29;
1983 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001984 let ResourceCycles = [2,1,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001985}
1986def: InstRW<[BWWriteResGroup183], (instregex "VDIVPDYrm")>;
1987
1988def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1989 let Latency = 22;
1990 let NumMicroOps = 7;
1991 let ResourceCycles = [1,3,2,1];
1992}
Craig Topper17a31182017-12-16 18:35:29 +00001993def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001994
1995def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1996 let Latency = 23;
1997 let NumMicroOps = 9;
1998 let ResourceCycles = [1,3,4,1];
1999}
Craig Topper17a31182017-12-16 18:35:29 +00002000def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002001
2002def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
2003 let Latency = 24;
2004 let NumMicroOps = 9;
2005 let ResourceCycles = [1,5,2,1];
2006}
Craig Topper17a31182017-12-16 18:35:29 +00002007def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002008
2009def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
2010 let Latency = 25;
2011 let NumMicroOps = 7;
2012 let ResourceCycles = [1,3,2,1];
2013}
Craig Topper17a31182017-12-16 18:35:29 +00002014def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
2015 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002016
2017def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
2018 let Latency = 26;
2019 let NumMicroOps = 9;
2020 let ResourceCycles = [1,5,2,1];
2021}
Craig Topper17a31182017-12-16 18:35:29 +00002022def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002023
2024def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
2025 let Latency = 26;
2026 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00002027 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00002028}
Craig Topper17a31182017-12-16 18:35:29 +00002029def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002030
2031def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
2032 let Latency = 27;
2033 let NumMicroOps = 9;
2034 let ResourceCycles = [1,5,2,1];
2035}
Craig Topper17a31182017-12-16 18:35:29 +00002036def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002037
Gadi Haber323f2e12017-10-24 20:19:47 +00002038def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
2039 let Latency = 29;
2040 let NumMicroOps = 27;
2041 let ResourceCycles = [1,5,1,1,19];
2042}
2043def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
2044
2045def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
2046 let Latency = 30;
2047 let NumMicroOps = 28;
2048 let ResourceCycles = [1,6,1,1,19];
2049}
Craig Topper2d451e72018-03-18 08:38:06 +00002050def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002051
2052def BWWriteResGroup187 : SchedWriteRes<[BWPort01,BWPort15,BWPort015,BWPort0156]> {
2053 let Latency = 31;
2054 let NumMicroOps = 31;
2055 let ResourceCycles = [8,1,21,1];
2056}
2057def: InstRW<[BWWriteResGroup187], (instregex "MMX_EMMS")>;
2058
Craig Topper8104f262018-04-02 05:33:28 +00002059def BWWriteResGroup189 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
2060 let Latency = 29;
Gadi Haber323f2e12017-10-24 20:19:47 +00002061 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00002062 let ResourceCycles = [2,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00002063}
2064def: InstRW<[BWWriteResGroup189], (instregex "VSQRTPDYr")>;
2065
2066def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
2067 let Latency = 34;
2068 let NumMicroOps = 8;
2069 let ResourceCycles = [2,2,2,1,1];
2070}
Craig Topper13a16502018-03-19 00:56:09 +00002071def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002072
2073def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
2074 let Latency = 34;
2075 let NumMicroOps = 23;
2076 let ResourceCycles = [1,5,3,4,10];
2077}
Craig Topper5a69a002018-03-21 06:28:42 +00002078def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
2079 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002080
2081def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
2082 let Latency = 35;
2083 let NumMicroOps = 8;
2084 let ResourceCycles = [2,2,2,1,1];
2085}
Craig Topper13a16502018-03-19 00:56:09 +00002086def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002087
2088def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
2089 let Latency = 35;
2090 let NumMicroOps = 23;
2091 let ResourceCycles = [1,5,2,1,4,10];
2092}
Craig Topper5a69a002018-03-21 06:28:42 +00002093def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
2094 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002095
Craig Topper8104f262018-04-02 05:33:28 +00002096def BWWriteResGroup195 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
2097 let Latency = 35;
Gadi Haber323f2e12017-10-24 20:19:47 +00002098 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00002099 let ResourceCycles = [2,1,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00002100}
2101def: InstRW<[BWWriteResGroup195], (instregex "VSQRTPDYm")>;
2102
2103def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
2104 let Latency = 42;
2105 let NumMicroOps = 22;
2106 let ResourceCycles = [2,20];
2107}
Craig Topper2d451e72018-03-18 08:38:06 +00002108def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002109
2110def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
2111 let Latency = 60;
2112 let NumMicroOps = 64;
2113 let ResourceCycles = [2,2,8,1,10,2,39];
2114}
2115def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002116
2117def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
2118 let Latency = 63;
2119 let NumMicroOps = 88;
2120 let ResourceCycles = [4,4,31,1,2,1,45];
2121}
Craig Topper2d451e72018-03-18 08:38:06 +00002122def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002123
2124def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
2125 let Latency = 63;
2126 let NumMicroOps = 90;
2127 let ResourceCycles = [4,2,33,1,2,1,47];
2128}
Craig Topper2d451e72018-03-18 08:38:06 +00002129def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002130
2131def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
2132 let Latency = 75;
2133 let NumMicroOps = 15;
2134 let ResourceCycles = [6,3,6];
2135}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00002136def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002137
2138def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
2139 let Latency = 80;
2140 let NumMicroOps = 32;
2141 let ResourceCycles = [7,7,3,3,1,11];
2142}
2143def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
2144
2145def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
2146 let Latency = 115;
2147 let NumMicroOps = 100;
2148 let ResourceCycles = [9,9,11,8,1,11,21,30];
2149}
2150def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002151
2152} // SchedModel
2153