blob: c07d68f8c94086e0b26f7e2263f1179155870f63 [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",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000475 "ST_FP(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000476 "VEXTRACTF128mr",
477 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000478 "(V?)MOVAPD(Y?)mr",
479 "(V?)MOVAPS(Y?)mr",
480 "(V?)MOVDQA(Y?)mr",
481 "(V?)MOVDQU(Y?)mr",
482 "(V?)MOVHPDmr",
483 "(V?)MOVHPSmr",
484 "(V?)MOVLPDmr",
485 "(V?)MOVLPSmr",
486 "(V?)MOVNTDQ(V?)mr",
487 "(V?)MOVNTPD(V?)mr",
488 "(V?)MOVNTPS(V?)mr",
489 "(V?)MOVPDI2DImr",
490 "(V?)MOVPQI2QImr",
491 "(V?)MOVPQIto64mr",
492 "(V?)MOVSDmr",
493 "(V?)MOVSSmr",
494 "(V?)MOVUPD(Y?)mr",
495 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000496
Gadi Haber323f2e12017-10-24 20:19:47 +0000497def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
498 let Latency = 2;
499 let NumMicroOps = 2;
500 let ResourceCycles = [2];
501}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000502def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000503
504def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
505 let Latency = 2;
506 let NumMicroOps = 2;
507 let ResourceCycles = [2];
508}
Craig Topper5a69a002018-03-21 06:28:42 +0000509def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
510 "ROL(8|16|32|64)ri",
511 "ROR(8|16|32|64)r1",
512 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000513
514def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
515 let Latency = 2;
516 let NumMicroOps = 2;
517 let ResourceCycles = [2];
518}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000519def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
520 MFENCE,
521 WAIT,
522 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000523
524def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
525 let Latency = 2;
526 let NumMicroOps = 2;
527 let ResourceCycles = [1,1];
528}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000529def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000530 "(V?)CVTPS2PDrr",
531 "(V?)CVTSS2SDrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000532 "(V?)PSLLDrr",
533 "(V?)PSLLQrr",
534 "(V?)PSLLWrr",
535 "(V?)PSRADrr",
536 "(V?)PSRAWrr",
537 "(V?)PSRLDrr",
538 "(V?)PSRLQrr",
539 "(V?)PSRLWrr",
540 "(V?)PTESTrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000541
542def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
543 let Latency = 2;
544 let NumMicroOps = 2;
545 let ResourceCycles = [1,1];
546}
547def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
548
549def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
550 let Latency = 2;
551 let NumMicroOps = 2;
552 let ResourceCycles = [1,1];
553}
554def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
555
556def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
557 let Latency = 2;
558 let NumMicroOps = 2;
559 let ResourceCycles = [1,1];
560}
561def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
562
563def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
564 let Latency = 2;
565 let NumMicroOps = 2;
566 let ResourceCycles = [1,1];
567}
Craig Topper498875f2018-04-04 17:54:19 +0000568def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
569
570def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
571 let Latency = 1;
572 let NumMicroOps = 1;
573 let ResourceCycles = [1];
574}
575def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000576
577def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
578 let Latency = 2;
579 let NumMicroOps = 2;
580 let ResourceCycles = [1,1];
581}
Craig Topper2d451e72018-03-18 08:38:06 +0000582def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000583def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000584def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
585 "ADC8ri",
586 "CMOV(A|BE)(16|32|64)rr",
587 "SBB8i8",
588 "SBB8ri",
589 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000590
Gadi Haber323f2e12017-10-24 20:19:47 +0000591def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
592 let Latency = 2;
593 let NumMicroOps = 3;
594 let ResourceCycles = [1,1,1];
595}
596def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
597
Gadi Haber323f2e12017-10-24 20:19:47 +0000598def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
599 let Latency = 2;
600 let NumMicroOps = 3;
601 let ResourceCycles = [1,1,1];
602}
603def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
604
605def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
606 let Latency = 2;
607 let NumMicroOps = 3;
608 let ResourceCycles = [1,1,1];
609}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000610def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
611 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000612def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000613 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000614
Gadi Haber323f2e12017-10-24 20:19:47 +0000615def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
616 let Latency = 3;
617 let NumMicroOps = 1;
618 let ResourceCycles = [1];
619}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000620def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000621 "PDEP(32|64)rr",
622 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000623 "SHLD(16|32|64)rri8",
624 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000625 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000626
627def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000628 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000629 let NumMicroOps = 2;
630 let ResourceCycles = [1,1];
631}
Clement Courbet327fac42018-03-07 08:14:02 +0000632def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000633
634def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
635 let Latency = 3;
636 let NumMicroOps = 1;
637 let ResourceCycles = [1];
638}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000639def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
640 "VPBROADCASTWrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000641 "VPMOVSXBDYrr",
642 "VPMOVSXBQYrr",
643 "VPMOVSXBWYrr",
644 "VPMOVSXDQYrr",
645 "VPMOVSXWDYrr",
646 "VPMOVSXWQYrr",
647 "VPMOVZXBDYrr",
648 "VPMOVZXBQYrr",
649 "VPMOVZXBWYrr",
650 "VPMOVZXDQYrr",
651 "VPMOVZXWDYrr",
652 "VPMOVZXWQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000653
654def BWWriteResGroup29 : SchedWriteRes<[BWPort01]> {
655 let Latency = 3;
656 let NumMicroOps = 1;
657 let ResourceCycles = [1];
658}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000659def: InstRW<[BWWriteResGroup29], (instregex "(V?)MULPD(Y?)rr",
660 "(V?)MULPS(Y?)rr",
661 "(V?)MULSDrr",
662 "(V?)MULSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000663
664def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000665 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000666 let NumMicroOps = 3;
667 let ResourceCycles = [3];
668}
Craig Topperb5f26592018-04-19 18:00:17 +0000669def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
670 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
671 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000672
673def BWWriteResGroup31 : SchedWriteRes<[BWPort0,BWPort5]> {
674 let Latency = 3;
675 let NumMicroOps = 3;
676 let ResourceCycles = [2,1];
677}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000678def: InstRW<[BWWriteResGroup31], (instregex "VPSLLVD(Y?)rr",
679 "VPSRAVD(Y?)rr",
680 "VPSRLVD(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000681
Gadi Haber323f2e12017-10-24 20:19:47 +0000682def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
683 let Latency = 3;
684 let NumMicroOps = 3;
685 let ResourceCycles = [2,1];
686}
Craig Topper5a69a002018-03-21 06:28:42 +0000687def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
688 "MMX_PACKSSWBirr",
689 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000690
691def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
692 let Latency = 3;
693 let NumMicroOps = 3;
694 let ResourceCycles = [1,2];
695}
696def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
697
698def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
699 let Latency = 3;
700 let NumMicroOps = 3;
701 let ResourceCycles = [1,2];
702}
Craig Topper5a69a002018-03-21 06:28:42 +0000703def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
704 "RCL(8|16|32|64)ri",
705 "RCR(8|16|32|64)r1",
706 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000707
708def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
709 let Latency = 3;
710 let NumMicroOps = 3;
711 let ResourceCycles = [2,1];
712}
Craig Topper5a69a002018-03-21 06:28:42 +0000713def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
714 "ROR(8|16|32|64)rCL",
715 "SAR(8|16|32|64)rCL",
716 "SHL(8|16|32|64)rCL",
717 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000718
719def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
720 let Latency = 3;
721 let NumMicroOps = 4;
722 let ResourceCycles = [1,1,1,1];
723}
724def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
725
726def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
727 let Latency = 3;
728 let NumMicroOps = 4;
729 let ResourceCycles = [1,1,1,1];
730}
Craig Topper5a69a002018-03-21 06:28:42 +0000731def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
732 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000733
734def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
735 let Latency = 4;
736 let NumMicroOps = 2;
737 let ResourceCycles = [1,1];
738}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000739def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
740 "(V?)CVTSD2SIrr",
741 "(V?)CVTSS2SI64rr",
742 "(V?)CVTSS2SIrr",
743 "(V?)CVTTSD2SI64rr",
744 "(V?)CVTTSD2SIrr",
745 "(V?)CVTTSS2SI64rr",
746 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000747
748def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
749 let Latency = 4;
750 let NumMicroOps = 2;
751 let ResourceCycles = [1,1];
752}
Craig Topper5a69a002018-03-21 06:28:42 +0000753def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr",
754 "VPSLLDYrr",
755 "VPSLLQYrr",
756 "VPSLLWYrr",
757 "VPSRADYrr",
758 "VPSRAWYrr",
759 "VPSRLDYrr",
760 "VPSRLQYrr",
761 "VPSRLWYrr",
762 "VPTESTYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000763
764def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
765 let Latency = 4;
766 let NumMicroOps = 2;
767 let ResourceCycles = [1,1];
768}
769def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
770
771def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
772 let Latency = 4;
773 let NumMicroOps = 2;
774 let ResourceCycles = [1,1];
775}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000776def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000777def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000778 "MMX_CVTPI2PDirr",
779 "MMX_CVTPS2PIirr",
780 "MMX_CVTTPD2PIirr",
781 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000782 "(V?)CVTDQ2PDrr",
783 "(V?)CVTPD2DQrr",
784 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000785 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000786 "(V?)CVTSD2SSrr",
787 "(V?)CVTSI642SDrr",
788 "(V?)CVTSI2SDrr",
789 "(V?)CVTSI2SSrr",
790 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000791
792def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
793 let Latency = 4;
794 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000795 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000796}
Craig Topper5a69a002018-03-21 06:28:42 +0000797def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000798
799def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
800 let Latency = 4;
801 let NumMicroOps = 3;
802 let ResourceCycles = [1,1,1];
803}
804def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
805
806def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
807 let Latency = 4;
808 let NumMicroOps = 3;
809 let ResourceCycles = [1,1,1];
810}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000811def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
812 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000813
814def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
815 let Latency = 4;
816 let NumMicroOps = 4;
817 let ResourceCycles = [4];
818}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000819def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000820
821def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
822 let Latency = 4;
823 let NumMicroOps = 4;
824 let ResourceCycles = [1,3];
825}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000826def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000827
828def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
829 let Latency = 5;
830 let NumMicroOps = 1;
831 let ResourceCycles = [1];
832}
Simon Pilgrim74ccc6a2018-04-21 19:11:55 +0000833def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000834
Gadi Haber323f2e12017-10-24 20:19:47 +0000835def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
836 let Latency = 5;
837 let NumMicroOps = 1;
838 let ResourceCycles = [1];
839}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000840def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000841 "MOVSX(16|32|64)rm32",
842 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000843 "MOVZX(16|32|64)rm16",
844 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000845 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000846 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000847 "(V?)MOVSHDUPrm",
848 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000849 "VPBROADCASTDrm",
850 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000851
852def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
853 let Latency = 5;
854 let NumMicroOps = 3;
855 let ResourceCycles = [1,2];
856}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000857def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000858
859def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
860 let Latency = 5;
861 let NumMicroOps = 3;
862 let ResourceCycles = [1,1,1];
863}
864def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
865
866def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000867 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000868 let NumMicroOps = 3;
869 let ResourceCycles = [1,1,1];
870}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000871def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000872
873def BWWriteResGroup53 : SchedWriteRes<[BWPort0,BWPort4,BWPort237,BWPort15]> {
874 let Latency = 5;
875 let NumMicroOps = 4;
876 let ResourceCycles = [1,1,1,1];
877}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000878def: InstRW<[BWWriteResGroup53], (instregex "VMASKMOVPD(Y?)mr",
879 "VMASKMOVPS(Y?)mr",
880 "VPMASKMOVD(Y?)mr",
881 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000882
883def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
884 let Latency = 5;
885 let NumMicroOps = 5;
886 let ResourceCycles = [1,4];
887}
888def: InstRW<[BWWriteResGroup54], (instregex "PAUSE")>;
889
890def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
891 let Latency = 5;
892 let NumMicroOps = 5;
893 let ResourceCycles = [1,4];
894}
895def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
896
897def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
898 let Latency = 5;
899 let NumMicroOps = 5;
900 let ResourceCycles = [2,3];
901}
Craig Topper5a69a002018-03-21 06:28:42 +0000902def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000903
904def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
905 let Latency = 5;
906 let NumMicroOps = 6;
907 let ResourceCycles = [1,1,4];
908}
Craig Topper5a69a002018-03-21 06:28:42 +0000909def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000910
911def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
912 let Latency = 6;
913 let NumMicroOps = 1;
914 let ResourceCycles = [1];
915}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000916def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000917 "VBROADCASTF128",
918 "VBROADCASTI128",
919 "VBROADCASTSDYrm",
920 "VBROADCASTSSYrm",
921 "VLDDQUYrm",
922 "VMOVAPDYrm",
923 "VMOVAPSYrm",
924 "VMOVDDUPYrm",
925 "VMOVDQAYrm",
926 "VMOVDQUYrm",
927 "VMOVNTDQAYrm",
928 "VMOVSHDUPYrm",
929 "VMOVSLDUPYrm",
930 "VMOVUPDYrm",
931 "VMOVUPSYrm",
932 "VPBROADCASTDYrm",
933 "VPBROADCASTQYrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000934 "(V?)ROUNDPD(Y?)r",
935 "(V?)ROUNDPS(Y?)r",
936 "(V?)ROUNDSDr",
937 "(V?)ROUNDSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000938
939def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
940 let Latency = 6;
941 let NumMicroOps = 2;
942 let ResourceCycles = [1,1];
943}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000944def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000945 "(V?)CVTPS2PDrm",
946 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000947 "VPSLLVQrm",
948 "VPSRLVQrm",
949 "VTESTPDrm",
950 "VTESTPSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000951
952def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
953 let Latency = 6;
954 let NumMicroOps = 2;
955 let ResourceCycles = [1,1];
956}
Craig Topper5a69a002018-03-21 06:28:42 +0000957def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
958 "VCVTPD2DQYrr",
959 "VCVTPD2PSYrr",
960 "VCVTPS2PHYrr",
961 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000962
Gadi Haber323f2e12017-10-24 20:19:47 +0000963def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
964 let Latency = 6;
965 let NumMicroOps = 2;
966 let ResourceCycles = [1,1];
967}
Craig Topper5a69a002018-03-21 06:28:42 +0000968def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
969 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000970
971def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
972 let Latency = 6;
973 let NumMicroOps = 2;
974 let ResourceCycles = [1,1];
975}
Craig Topperdfccafe2018-04-18 06:41:25 +0000976def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +0000977def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
978 ADCX32rm, ADCX64rm,
979 ADOX32rm, ADOX64rm,
980 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000981
982def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
983 let Latency = 6;
984 let NumMicroOps = 2;
985 let ResourceCycles = [1,1];
986}
Craig Topper5a69a002018-03-21 06:28:42 +0000987def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
988 "BLSI(32|64)rm",
989 "BLSMSK(32|64)rm",
990 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +0000991 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000992
993def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
994 let Latency = 6;
995 let NumMicroOps = 2;
996 let ResourceCycles = [1,1];
997}
Simon Pilgrim06e16542018-04-22 18:35:53 +0000998def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +0000999 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001000 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001001
1002def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1003 let Latency = 6;
1004 let NumMicroOps = 2;
1005 let ResourceCycles = [1,1];
1006}
Craig Topper2d451e72018-03-18 08:38:06 +00001007def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001008def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001009
1010def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1011 let Latency = 6;
1012 let NumMicroOps = 4;
1013 let ResourceCycles = [1,1,2];
1014}
Craig Topper5a69a002018-03-21 06:28:42 +00001015def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1016 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001017
1018def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1019 let Latency = 6;
1020 let NumMicroOps = 4;
1021 let ResourceCycles = [1,1,1,1];
1022}
1023def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1024
1025def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1026 let Latency = 6;
1027 let NumMicroOps = 4;
1028 let ResourceCycles = [1,1,1,1];
1029}
Craig Topper5a69a002018-03-21 06:28:42 +00001030def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1031 "BTR(16|32|64)mi8",
1032 "BTS(16|32|64)mi8",
1033 "SAR(8|16|32|64)m1",
1034 "SAR(8|16|32|64)mi",
1035 "SHL(8|16|32|64)m1",
1036 "SHL(8|16|32|64)mi",
1037 "SHR(8|16|32|64)m1",
1038 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001039
1040def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1041 let Latency = 6;
1042 let NumMicroOps = 4;
1043 let ResourceCycles = [1,1,1,1];
1044}
Craig Topperf0d04262018-04-06 16:16:48 +00001045def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1046 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001047
1048def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1049 let Latency = 6;
1050 let NumMicroOps = 6;
1051 let ResourceCycles = [1,5];
1052}
1053def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1054
Gadi Haber323f2e12017-10-24 20:19:47 +00001055def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1056 let Latency = 7;
1057 let NumMicroOps = 2;
1058 let ResourceCycles = [1,1];
1059}
Craig Topper5a69a002018-03-21 06:28:42 +00001060def: InstRW<[BWWriteResGroup73], (instregex "VPSLLDYrm",
1061 "VPSLLQYrm",
1062 "VPSLLVQYrm",
1063 "VPSLLWYrm",
1064 "VPSRADYrm",
1065 "VPSRAWYrm",
1066 "VPSRLDYrm",
1067 "VPSRLQYrm",
1068 "VPSRLVQYrm",
1069 "VPSRLWYrm",
1070 "VTESTPDYrm",
1071 "VTESTPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001072
1073def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1074 let Latency = 7;
1075 let NumMicroOps = 2;
1076 let ResourceCycles = [1,1];
1077}
Craig Topper5a69a002018-03-21 06:28:42 +00001078def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1079 "FCOM64m",
1080 "FCOMP32m",
1081 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001082
1083def BWWriteResGroup75 : SchedWriteRes<[BWPort5,BWPort23]> {
1084 let Latency = 7;
1085 let NumMicroOps = 2;
1086 let ResourceCycles = [1,1];
1087}
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +00001088def: InstRW<[BWWriteResGroup75], (instregex "VPACKSSDWYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001089 "VPACKSSWBYrm",
1090 "VPACKUSDWYrm",
1091 "VPACKUSWBYrm",
1092 "VPALIGNRYrmi",
1093 "VPBLENDWYrmi",
1094 "VPERMILPDYmi",
Craig Topper5a69a002018-03-21 06:28:42 +00001095 "VPERMILPSYmi",
Craig Topper5a69a002018-03-21 06:28:42 +00001096 "VPSHUFBYrm",
1097 "VPSHUFDYmi",
1098 "VPSHUFHWYmi",
1099 "VPSHUFLWYmi",
1100 "VPUNPCKHBWYrm",
1101 "VPUNPCKHDQYrm",
1102 "VPUNPCKHQDQYrm",
1103 "VPUNPCKHWDYrm",
1104 "VPUNPCKLBWYrm",
1105 "VPUNPCKLDQYrm",
1106 "VPUNPCKLQDQYrm",
1107 "VPUNPCKLWDYrm",
1108 "VSHUFPDYrmi",
1109 "VSHUFPSYrmi",
1110 "VUNPCKHPDYrm",
1111 "VUNPCKHPSYrm",
1112 "VUNPCKLPDYrm",
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +00001113 "VUNPCKLPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001114
1115def BWWriteResGroup76 : SchedWriteRes<[BWPort23,BWPort15]> {
1116 let Latency = 7;
1117 let NumMicroOps = 2;
1118 let ResourceCycles = [1,1];
1119}
Craig Topper5a69a002018-03-21 06:28:42 +00001120def: InstRW<[BWWriteResGroup76], (instregex "VPABSBYrm",
1121 "VPABSDYrm",
1122 "VPABSWYrm",
1123 "VPADDBYrm",
1124 "VPADDDYrm",
1125 "VPADDQYrm",
1126 "VPADDSBYrm",
1127 "VPADDSWYrm",
1128 "VPADDUSBYrm",
1129 "VPADDUSWYrm",
1130 "VPADDWYrm",
1131 "VPAVGBYrm",
1132 "VPAVGWYrm",
1133 "VPCMPEQBYrm",
1134 "VPCMPEQDYrm",
1135 "VPCMPEQQYrm",
1136 "VPCMPEQWYrm",
1137 "VPCMPGTBYrm",
1138 "VPCMPGTDYrm",
1139 "VPCMPGTWYrm",
1140 "VPMAXSBYrm",
1141 "VPMAXSDYrm",
1142 "VPMAXSWYrm",
1143 "VPMAXUBYrm",
1144 "VPMAXUDYrm",
1145 "VPMAXUWYrm",
1146 "VPMINSBYrm",
1147 "VPMINSDYrm",
1148 "VPMINSWYrm",
1149 "VPMINUBYrm",
1150 "VPMINUDYrm",
1151 "VPMINUWYrm",
1152 "VPSIGNBYrm",
1153 "VPSIGNDYrm",
1154 "VPSIGNWYrm",
1155 "VPSUBBYrm",
1156 "VPSUBDYrm",
1157 "VPSUBQYrm",
1158 "VPSUBSBYrm",
1159 "VPSUBSWYrm",
1160 "VPSUBUSBYrm",
1161 "VPSUBUSWYrm",
1162 "VPSUBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001163
1164def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1165 let Latency = 7;
1166 let NumMicroOps = 2;
1167 let ResourceCycles = [1,1];
1168}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001169def: InstRW<[BWWriteResGroup77], (instregex "VPANDNYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001170 "VPANDYrm",
1171 "VPBLENDDYrmi",
1172 "VPORYrm",
1173 "VPXORYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001174
Gadi Haber323f2e12017-10-24 20:19:47 +00001175def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1176 let Latency = 7;
1177 let NumMicroOps = 3;
1178 let ResourceCycles = [2,1];
1179}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001180def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001181 "MMX_PACKSSWBirm",
1182 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001183 "VMASKMOVPDrm",
1184 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001185 "VPMASKMOVDrm",
1186 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001187
1188def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1189 let Latency = 7;
1190 let NumMicroOps = 3;
1191 let ResourceCycles = [1,2];
1192}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001193def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1194 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001195
1196def BWWriteResGroup81 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1197 let Latency = 7;
1198 let NumMicroOps = 3;
1199 let ResourceCycles = [1,1,1];
1200}
Craig Topper5a69a002018-03-21 06:28:42 +00001201def: InstRW<[BWWriteResGroup81], (instregex "PSLLDrm",
1202 "PSLLQrm",
1203 "PSLLWrm",
1204 "PSRADrm",
1205 "PSRAWrm",
1206 "PSRLDrm",
1207 "PSRLQrm",
1208 "PSRLWrm",
1209 "PTESTrm",
1210 "VPSLLDrm",
1211 "VPSLLQrm",
1212 "VPSLLWrm",
1213 "VPSRADrm",
1214 "VPSRAWrm",
1215 "VPSRLDrm",
1216 "VPSRLQrm",
1217 "VPSRLWrm",
1218 "VPTESTrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001219
1220def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1221 let Latency = 7;
1222 let NumMicroOps = 3;
1223 let ResourceCycles = [1,1,1];
1224}
1225def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1226
Gadi Haber323f2e12017-10-24 20:19:47 +00001227def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1228 let Latency = 7;
1229 let NumMicroOps = 3;
1230 let ResourceCycles = [1,1,1];
1231}
Craig Topper5a69a002018-03-21 06:28:42 +00001232def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1233 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001234
Gadi Haber323f2e12017-10-24 20:19:47 +00001235def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1236 let Latency = 7;
1237 let NumMicroOps = 3;
1238 let ResourceCycles = [1,1,1];
1239}
Craig Topperf4cd9082018-01-19 05:47:32 +00001240def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001241
1242def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1243 let Latency = 7;
1244 let NumMicroOps = 5;
1245 let ResourceCycles = [1,1,1,2];
1246}
Craig Topper5a69a002018-03-21 06:28:42 +00001247def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1248 "ROL(8|16|32|64)mi",
1249 "ROR(8|16|32|64)m1",
1250 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001251
1252def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
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<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001258
1259def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1260 let Latency = 7;
1261 let NumMicroOps = 5;
1262 let ResourceCycles = [1,1,1,1,1];
1263}
Craig Topper5a69a002018-03-21 06:28:42 +00001264def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1265 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001266
1267def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1268 let Latency = 7;
1269 let NumMicroOps = 7;
1270 let ResourceCycles = [2,2,1,2];
1271}
Craig Topper2d451e72018-03-18 08:38:06 +00001272def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001273
1274def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1275 let Latency = 8;
1276 let NumMicroOps = 2;
1277 let ResourceCycles = [1,1];
1278}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001279def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001280 "PDEP(32|64)rm",
1281 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001282 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001283
1284def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001285 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001286 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001287 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001288}
Craig Topperf846e2d2018-04-19 05:34:05 +00001289def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001290
Craig Topperf846e2d2018-04-19 05:34:05 +00001291def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1292 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001293 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001294 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001295}
Craig Topper5a69a002018-03-21 06:28:42 +00001296def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001297
Gadi Haber323f2e12017-10-24 20:19:47 +00001298def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1299 let Latency = 8;
1300 let NumMicroOps = 2;
1301 let ResourceCycles = [1,1];
1302}
Craig Topper5a69a002018-03-21 06:28:42 +00001303def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1304 "VPMOVSXBQYrm",
1305 "VPMOVSXBWYrm",
1306 "VPMOVSXDQYrm",
1307 "VPMOVSXWDYrm",
1308 "VPMOVSXWQYrm",
1309 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001310
1311def BWWriteResGroup93 : SchedWriteRes<[BWPort01,BWPort23]> {
1312 let Latency = 8;
1313 let NumMicroOps = 2;
1314 let ResourceCycles = [1,1];
1315}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001316def: InstRW<[BWWriteResGroup93], (instregex "(V?)MULPDrm",
1317 "(V?)MULPSrm",
1318 "(V?)MULSDrm",
1319 "(V?)MULSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001320
1321def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1322 let Latency = 8;
1323 let NumMicroOps = 3;
1324 let ResourceCycles = [2,1];
1325}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001326def: InstRW<[BWWriteResGroup94], (instregex "VMASKMOVPDYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001327 "VMASKMOVPSYrm",
1328 "VPBLENDVBYrm",
1329 "VPMASKMOVDYrm",
1330 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001331
1332def BWWriteResGroup95 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1333 let Latency = 8;
1334 let NumMicroOps = 4;
1335 let ResourceCycles = [2,1,1];
1336}
Craig Topper5a69a002018-03-21 06:28:42 +00001337def: InstRW<[BWWriteResGroup95], (instregex "VPSLLVDrm",
1338 "VPSRAVDrm",
1339 "VPSRLVDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001340
Gadi Haber323f2e12017-10-24 20:19:47 +00001341def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1342 let Latency = 8;
1343 let NumMicroOps = 5;
1344 let ResourceCycles = [1,1,1,2];
1345}
Craig Topper5a69a002018-03-21 06:28:42 +00001346def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1347 "RCL(8|16|32|64)mi",
1348 "RCR(8|16|32|64)m1",
1349 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001350
1351def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1352 let Latency = 8;
1353 let NumMicroOps = 5;
1354 let ResourceCycles = [1,1,2,1];
1355}
Craig Topper13a16502018-03-19 00:56:09 +00001356def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001357
1358def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1359 let Latency = 8;
1360 let NumMicroOps = 6;
1361 let ResourceCycles = [1,1,1,3];
1362}
Craig Topper9f834812018-04-01 21:54:24 +00001363def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001364
1365def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1366 let Latency = 8;
1367 let NumMicroOps = 6;
1368 let ResourceCycles = [1,1,1,2,1];
1369}
Craig Topper9f834812018-04-01 21:54:24 +00001370def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001371 "CMPXCHG(8|16|32|64)rm",
1372 "ROL(8|16|32|64)mCL",
1373 "SAR(8|16|32|64)mCL",
1374 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001375 "SHL(8|16|32|64)mCL",
1376 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001377def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1378 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001379
1380def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1381 let Latency = 9;
1382 let NumMicroOps = 2;
1383 let ResourceCycles = [1,1];
1384}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001385def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1386 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001387 "VADDPDYrm",
1388 "VADDPSYrm",
1389 "VADDSUBPDYrm",
1390 "VADDSUBPSYrm",
1391 "VCMPPDYrmi",
1392 "VCMPPSYrmi",
Craig Topper5a69a002018-03-21 06:28:42 +00001393 "VCVTPS2DQYrm",
1394 "VCVTTPS2DQYrm",
1395 "VMAX(C?)PDYrm",
1396 "VMAX(C?)PSYrm",
1397 "VMIN(C?)PDYrm",
1398 "VMIN(C?)PSYrm",
1399 "VSUBPDYrm",
1400 "VSUBPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001401
1402def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1403 let Latency = 9;
1404 let NumMicroOps = 2;
1405 let ResourceCycles = [1,1];
1406}
Craig Topper5a69a002018-03-21 06:28:42 +00001407def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1408 "VPERM2I128rm",
1409 "VPERMDYrm",
1410 "VPERMPDYmi",
1411 "VPERMPSYrm",
1412 "VPERMQYmi",
1413 "VPMOVZXBDYrm",
1414 "VPMOVZXBQYrm",
1415 "VPMOVZXBWYrm",
1416 "VPMOVZXDQYrm",
1417 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001418
1419def BWWriteResGroup103 : SchedWriteRes<[BWPort01,BWPort23]> {
1420 let Latency = 9;
1421 let NumMicroOps = 2;
1422 let ResourceCycles = [1,1];
1423}
Craig Topper5a69a002018-03-21 06:28:42 +00001424def: InstRW<[BWWriteResGroup103], (instregex "VMULPDYrm",
1425 "VMULPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001426
1427def BWWriteResGroup104 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1428 let Latency = 9;
1429 let NumMicroOps = 3;
1430 let ResourceCycles = [1,1,1];
1431}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001432def: InstRW<[BWWriteResGroup104], (instregex "(V?)DPPDrri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001433
1434def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1435 let Latency = 9;
1436 let NumMicroOps = 3;
1437 let ResourceCycles = [1,1,1];
1438}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001439def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1440 "(V?)CVTSD2SIrm",
1441 "(V?)CVTSS2SI64rm",
1442 "(V?)CVTSS2SIrm",
1443 "(V?)CVTTSD2SI64rm",
1444 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001445 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001446 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001447
1448def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1449 let Latency = 9;
1450 let NumMicroOps = 3;
1451 let ResourceCycles = [1,1,1];
1452}
1453def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1454
1455def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1456 let Latency = 9;
1457 let NumMicroOps = 3;
1458 let ResourceCycles = [1,1,1];
1459}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001460def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001461def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001462 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001463 "CVTTPD2DQrm",
1464 "MMX_CVTPD2PIirm",
1465 "MMX_CVTPI2PDirm",
1466 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001467 "(V?)CVTDQ2PDrm",
1468 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001469
1470def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1471 let Latency = 9;
1472 let NumMicroOps = 3;
1473 let ResourceCycles = [1,1,1];
1474}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001475def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1476 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001477
1478def BWWriteResGroup109 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1479 let Latency = 9;
1480 let NumMicroOps = 4;
1481 let ResourceCycles = [2,1,1];
1482}
Craig Topper5a69a002018-03-21 06:28:42 +00001483def: InstRW<[BWWriteResGroup109], (instregex "VPSLLVDYrm",
1484 "VPSRAVDYrm",
1485 "VPSRLVDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001486
1487def BWWriteResGroup110 : SchedWriteRes<[BWPort5,BWPort23,BWPort15]> {
1488 let Latency = 9;
1489 let NumMicroOps = 4;
1490 let ResourceCycles = [2,1,1];
1491}
Craig Topper5a69a002018-03-21 06:28:42 +00001492def: InstRW<[BWWriteResGroup110], (instregex "VPHADDDYrm",
1493 "VPHADDSWYrm",
1494 "VPHADDWYrm",
1495 "VPHSUBDYrm",
1496 "VPHSUBSWYrm",
1497 "VPHSUBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001498
1499def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1500 let Latency = 9;
1501 let NumMicroOps = 4;
1502 let ResourceCycles = [1,1,1,1];
1503}
Craig Topper5a69a002018-03-21 06:28:42 +00001504def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1505 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001506
1507def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1508 let Latency = 9;
1509 let NumMicroOps = 5;
1510 let ResourceCycles = [1,1,3];
1511}
1512def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1513
1514def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1515 let Latency = 9;
1516 let NumMicroOps = 5;
1517 let ResourceCycles = [1,2,1,1];
1518}
Craig Topper5a69a002018-03-21 06:28:42 +00001519def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1520 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001521
Gadi Haber323f2e12017-10-24 20:19:47 +00001522def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1523 let Latency = 10;
1524 let NumMicroOps = 2;
1525 let ResourceCycles = [1,1];
1526}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001527def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001528
Gadi Haber323f2e12017-10-24 20:19:47 +00001529def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1530 let Latency = 10;
1531 let NumMicroOps = 3;
1532 let ResourceCycles = [2,1];
1533}
Craig Topper5a69a002018-03-21 06:28:42 +00001534def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1535 "FICOM32m",
1536 "FICOMP16m",
1537 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001538
1539def BWWriteResGroup118 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1540 let Latency = 10;
1541 let NumMicroOps = 3;
1542 let ResourceCycles = [1,1,1];
1543}
1544def: InstRW<[BWWriteResGroup118], (instregex "VPTESTYrm")>;
1545
Gadi Haber323f2e12017-10-24 20:19:47 +00001546def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1547 let Latency = 10;
1548 let NumMicroOps = 4;
1549 let ResourceCycles = [1,1,1,1];
1550}
1551def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1552
1553def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001554 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001555 let NumMicroOps = 4;
1556 let ResourceCycles = [1,1,1,1];
1557}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001558def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001559
Craig Topper8104f262018-04-02 05:33:28 +00001560def BWWriteResGroup122 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001561 let Latency = 11;
1562 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001563 let ResourceCycles = [1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001564}
Craig Topper8104f262018-04-02 05:33:28 +00001565def: InstRW<[BWWriteResGroup122], (instregex "(V?)DIVPSrr")>;
1566
1567def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1568 let Latency = 11;
1569 let NumMicroOps = 1;
1570 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1571}
1572def: InstRW<[BWWriteResGroup122_1], (instregex "(V?)DIVSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001573
1574def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1575 let Latency = 11;
1576 let NumMicroOps = 2;
1577 let ResourceCycles = [1,1];
1578}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001579def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001580 "VPCMPGTQYrm",
1581 "VPMADDUBSWYrm",
1582 "VPMADDWDYrm",
1583 "VPMULDQYrm",
1584 "VPMULHRSWYrm",
1585 "VPMULHUWYrm",
1586 "VPMULHWYrm",
1587 "VPMULLWYrm",
1588 "VPMULUDQYrm",
1589 "VPSADBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001590
Gadi Haber323f2e12017-10-24 20:19:47 +00001591def BWWriteResGroup126 : SchedWriteRes<[BWPort0,BWPort015]> {
1592 let Latency = 11;
1593 let NumMicroOps = 3;
1594 let ResourceCycles = [2,1];
1595}
Craig Topper5a69a002018-03-21 06:28:42 +00001596def: InstRW<[BWWriteResGroup126], (instregex "VRCPPSYr",
1597 "VRSQRTPSYr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001598
1599def BWWriteResGroup127 : SchedWriteRes<[BWPort1,BWPort23]> {
1600 let Latency = 11;
1601 let NumMicroOps = 3;
1602 let ResourceCycles = [2,1];
1603}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001604def: InstRW<[BWWriteResGroup127], (instregex "(V?)ROUNDPDm",
1605 "(V?)ROUNDPSm",
1606 "(V?)ROUNDSDm",
1607 "(V?)ROUNDSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001608
1609def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1610 let Latency = 11;
1611 let NumMicroOps = 3;
1612 let ResourceCycles = [1,1,1];
1613}
1614def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1615
Gadi Haber323f2e12017-10-24 20:19:47 +00001616def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1617 let Latency = 11;
1618 let NumMicroOps = 6;
1619 let ResourceCycles = [1,1,1,1,2];
1620}
Craig Topper5a69a002018-03-21 06:28:42 +00001621def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1622 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001623
1624def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1625 let Latency = 11;
1626 let NumMicroOps = 7;
1627 let ResourceCycles = [2,2,3];
1628}
Craig Topper5a69a002018-03-21 06:28:42 +00001629def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1630 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001631
1632def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1633 let Latency = 11;
1634 let NumMicroOps = 9;
1635 let ResourceCycles = [1,4,1,3];
1636}
1637def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1638
1639def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1640 let Latency = 11;
1641 let NumMicroOps = 11;
1642 let ResourceCycles = [2,9];
1643}
Craig Topper2d451e72018-03-18 08:38:06 +00001644def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1645def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001646
Gadi Haber323f2e12017-10-24 20:19:47 +00001647def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1648 let Latency = 12;
1649 let NumMicroOps = 3;
1650 let ResourceCycles = [2,1];
1651}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001652def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m",
Craig Topper40d3b322018-03-22 21:55:20 +00001653 "VROUNDPDYm",
1654 "VROUNDPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001655
Craig Topper8104f262018-04-02 05:33:28 +00001656def BWWriteResGroup137 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001657 let Latency = 11;
Gadi Haber323f2e12017-10-24 20:19:47 +00001658 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001659 let ResourceCycles = [1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001660}
Craig Topper8104f262018-04-02 05:33:28 +00001661def: InstRW<[BWWriteResGroup137], (instregex "(V?)SQRTPSr")>;
1662
1663def BWWriteResGroup137_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1664 let Latency = 11;
1665 let NumMicroOps = 1;
1666 let ResourceCycles = [1,4];
1667}
1668def: InstRW<[BWWriteResGroup137_1], (instregex "(V?)SQRTSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001669
1670def BWWriteResGroup138 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1671 let Latency = 13;
1672 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001673 let ResourceCycles = [1,2,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001674}
1675def: InstRW<[BWWriteResGroup138], (instregex "VMPSADBWYrmi")>;
1676
Craig Topper8104f262018-04-02 05:33:28 +00001677def BWWriteResGroup139 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001678 let Latency = 14;
1679 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001680 let ResourceCycles = [1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001681}
Craig Topper8104f262018-04-02 05:33:28 +00001682def: InstRW<[BWWriteResGroup139], (instregex "(V?)DIVPDrr")>;
1683
1684def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1685 let Latency = 14;
1686 let NumMicroOps = 1;
1687 let ResourceCycles = [1,4];
1688}
1689def: InstRW<[BWWriteResGroup139_1], (instregex "(V?)DIVSDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001690
Gadi Haber323f2e12017-10-24 20:19:47 +00001691def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1692 let Latency = 14;
1693 let NumMicroOps = 3;
1694 let ResourceCycles = [1,1,1];
1695}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001696def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001697
1698def BWWriteResGroup142 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1699 let Latency = 14;
1700 let NumMicroOps = 4;
1701 let ResourceCycles = [2,1,1];
1702}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001703def: InstRW<[BWWriteResGroup142], (instregex "(V?)DPPS(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001704
1705def BWWriteResGroup143 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1706 let Latency = 14;
1707 let NumMicroOps = 4;
1708 let ResourceCycles = [1,1,1,1];
1709}
Craig Topper5a69a002018-03-21 06:28:42 +00001710def: InstRW<[BWWriteResGroup143], (instregex "(V?)DPPDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001711
1712def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1713 let Latency = 14;
1714 let NumMicroOps = 8;
1715 let ResourceCycles = [2,2,1,3];
1716}
1717def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1718
1719def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1720 let Latency = 14;
1721 let NumMicroOps = 10;
1722 let ResourceCycles = [2,3,1,4];
1723}
1724def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1725
1726def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1727 let Latency = 14;
1728 let NumMicroOps = 12;
1729 let ResourceCycles = [2,1,4,5];
1730}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001731def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001732
1733def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1734 let Latency = 15;
1735 let NumMicroOps = 1;
1736 let ResourceCycles = [1];
1737}
Craig Topper5a69a002018-03-21 06:28:42 +00001738def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1739 "DIVR_FST0r",
1740 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001741
Gadi Haber323f2e12017-10-24 20:19:47 +00001742def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1743 let Latency = 15;
1744 let NumMicroOps = 10;
1745 let ResourceCycles = [1,1,1,4,1,2];
1746}
Craig Topper13a16502018-03-19 00:56:09 +00001747def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001748
Craig Topper8104f262018-04-02 05:33:28 +00001749def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001750 let Latency = 16;
1751 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001752 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001753}
Craig Topper5a69a002018-03-21 06:28:42 +00001754def: InstRW<[BWWriteResGroup150], (instregex "(V?)DIVPSrm",
1755 "(V?)DIVSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001756
1757def BWWriteResGroup151 : SchedWriteRes<[BWPort0,BWPort23]> {
1758 let Latency = 16;
1759 let NumMicroOps = 3;
1760 let ResourceCycles = [2,1];
1761}
1762def: InstRW<[BWWriteResGroup151], (instregex "VPMULLDYrm")>;
1763
Gadi Haber323f2e12017-10-24 20:19:47 +00001764def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1765 let Latency = 16;
1766 let NumMicroOps = 14;
1767 let ResourceCycles = [1,1,1,4,2,5];
1768}
1769def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1770
1771def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1772 let Latency = 16;
1773 let NumMicroOps = 16;
1774 let ResourceCycles = [16];
1775}
Craig Topper5a69a002018-03-21 06:28:42 +00001776def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001777
Craig Topper8104f262018-04-02 05:33:28 +00001778def BWWriteResGroup155 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001779 let Latency = 17;
1780 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001781 let ResourceCycles = [2,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001782}
1783def: InstRW<[BWWriteResGroup155], (instregex "VDIVPSYrr")>;
1784
1785def BWWriteResGroup156 : SchedWriteRes<[BWPort0,BWPort23,BWPort015]> {
1786 let Latency = 17;
1787 let NumMicroOps = 4;
1788 let ResourceCycles = [2,1,1];
1789}
Craig Topper5a69a002018-03-21 06:28:42 +00001790def: InstRW<[BWWriteResGroup156], (instregex "VRCPPSYm",
1791 "VRSQRTPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001792
Craig Topper8104f262018-04-02 05:33:28 +00001793def BWWriteResGroup157 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001794 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001795 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001796 let ResourceCycles = [1,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001797}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001798def: InstRW<[BWWriteResGroup157], (instregex "(V?)SQRTPSm",
1799 "(V?)SQRTSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001800
Gadi Haber323f2e12017-10-24 20:19:47 +00001801def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1802 let Latency = 18;
1803 let NumMicroOps = 8;
1804 let ResourceCycles = [1,1,1,5];
1805}
Craig Topper5a69a002018-03-21 06:28:42 +00001806def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001807def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001808
1809def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1810 let Latency = 18;
1811 let NumMicroOps = 11;
1812 let ResourceCycles = [2,1,1,3,1,3];
1813}
Craig Topper13a16502018-03-19 00:56:09 +00001814def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001815
Craig Topper8104f262018-04-02 05:33:28 +00001816def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001817 let Latency = 19;
1818 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001819 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001820}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001821def: InstRW<[BWWriteResGroup161], (instregex "(V?)DIVPDrm",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001822 "(V?)DIVSDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001823
Gadi Haber323f2e12017-10-24 20:19:47 +00001824def BWWriteResGroup163 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1825 let Latency = 19;
1826 let NumMicroOps = 5;
1827 let ResourceCycles = [2,1,1,1];
1828}
Craig Topper5a69a002018-03-21 06:28:42 +00001829def: InstRW<[BWWriteResGroup163], (instregex "(V?)DPPSrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001830
Gadi Haber323f2e12017-10-24 20:19:47 +00001831def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1832 let Latency = 20;
1833 let NumMicroOps = 1;
1834 let ResourceCycles = [1];
1835}
Craig Topper5a69a002018-03-21 06:28:42 +00001836def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1837 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001838 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001839
1840def BWWriteResGroup166 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1841 let Latency = 20;
1842 let NumMicroOps = 5;
1843 let ResourceCycles = [2,1,1,1];
1844}
1845def: InstRW<[BWWriteResGroup166], (instregex "VDPPSYrmi")>;
1846
1847def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1848 let Latency = 20;
1849 let NumMicroOps = 8;
1850 let ResourceCycles = [1,1,1,1,1,1,2];
1851}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001852def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001853
Craig Topper8104f262018-04-02 05:33:28 +00001854def BWWriteResGroup168 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001855 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001856 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001857 let ResourceCycles = [1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001858}
Craig Topper8104f262018-04-02 05:33:28 +00001859def: InstRW<[BWWriteResGroup168], (instregex "(V?)SQRTPDr")>;
1860
1861def BWWriteResGroup168_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1862 let Latency = 16;
1863 let NumMicroOps = 1;
1864 let ResourceCycles = [1,8];
1865}
1866def: InstRW<[BWWriteResGroup168_1], (instregex "(V?)SQRTSDr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001867
1868def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1869 let Latency = 21;
1870 let NumMicroOps = 2;
1871 let ResourceCycles = [1,1];
1872}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001873def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001874
Craig Topper8104f262018-04-02 05:33:28 +00001875def BWWriteResGroup170 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001876 let Latency = 21;
1877 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001878 let ResourceCycles = [2,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001879}
1880def: InstRW<[BWWriteResGroup170], (instregex "VSQRTPSYr")>;
1881
1882def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1883 let Latency = 21;
1884 let NumMicroOps = 19;
1885 let ResourceCycles = [2,1,4,1,1,4,6];
1886}
1887def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1888
1889def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1890 let Latency = 22;
1891 let NumMicroOps = 18;
1892 let ResourceCycles = [1,1,16];
1893}
1894def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1895
Craig Topper8104f262018-04-02 05:33:28 +00001896def BWWriteResGroup173 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001897 let Latency = 23;
1898 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001899 let ResourceCycles = [2,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001900}
1901def: InstRW<[BWWriteResGroup173], (instregex "VDIVPDYrr")>;
1902
Craig Topper8104f262018-04-02 05:33:28 +00001903def BWWriteResGroup174 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001904 let Latency = 23;
1905 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001906 let ResourceCycles = [2,1,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001907}
1908def: InstRW<[BWWriteResGroup174], (instregex "VDIVPSYrm")>;
1909
Gadi Haber323f2e12017-10-24 20:19:47 +00001910def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1911 let Latency = 23;
1912 let NumMicroOps = 19;
1913 let ResourceCycles = [3,1,15];
1914}
Craig Topper391c6f92017-12-10 01:24:08 +00001915def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001916
1917def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1918 let Latency = 24;
1919 let NumMicroOps = 3;
1920 let ResourceCycles = [1,1,1];
1921}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001922def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001923
Craig Topper8104f262018-04-02 05:33:28 +00001924def BWWriteResGroup179 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001925 let Latency = 21;
Gadi Haber323f2e12017-10-24 20:19:47 +00001926 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001927 let ResourceCycles = [1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001928}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001929def: InstRW<[BWWriteResGroup179], (instregex "(V?)SQRTPDm",
1930 "(V?)SQRTSDm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001931
1932def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1933 let Latency = 26;
1934 let NumMicroOps = 2;
1935 let ResourceCycles = [1,1];
1936}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001937def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001938
Craig Topper8104f262018-04-02 05:33:28 +00001939def BWWriteResGroup181 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001940 let Latency = 27;
1941 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001942 let ResourceCycles = [2,1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001943}
1944def: InstRW<[BWWriteResGroup181], (instregex "VSQRTPSYm")>;
1945
1946def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1947 let Latency = 29;
1948 let NumMicroOps = 3;
1949 let ResourceCycles = [1,1,1];
1950}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001951def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001952
Craig Topper8104f262018-04-02 05:33:28 +00001953def BWWriteResGroup183 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001954 let Latency = 29;
1955 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001956 let ResourceCycles = [2,1,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001957}
1958def: InstRW<[BWWriteResGroup183], (instregex "VDIVPDYrm")>;
1959
1960def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1961 let Latency = 22;
1962 let NumMicroOps = 7;
1963 let ResourceCycles = [1,3,2,1];
1964}
Craig Topper17a31182017-12-16 18:35:29 +00001965def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001966
1967def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1968 let Latency = 23;
1969 let NumMicroOps = 9;
1970 let ResourceCycles = [1,3,4,1];
1971}
Craig Topper17a31182017-12-16 18:35:29 +00001972def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001973
1974def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1975 let Latency = 24;
1976 let NumMicroOps = 9;
1977 let ResourceCycles = [1,5,2,1];
1978}
Craig Topper17a31182017-12-16 18:35:29 +00001979def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001980
1981def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1982 let Latency = 25;
1983 let NumMicroOps = 7;
1984 let ResourceCycles = [1,3,2,1];
1985}
Craig Topper17a31182017-12-16 18:35:29 +00001986def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1987 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001988
1989def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1990 let Latency = 26;
1991 let NumMicroOps = 9;
1992 let ResourceCycles = [1,5,2,1];
1993}
Craig Topper17a31182017-12-16 18:35:29 +00001994def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001995
1996def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1997 let Latency = 26;
1998 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001999 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00002000}
Craig Topper17a31182017-12-16 18:35:29 +00002001def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002002
2003def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
2004 let Latency = 27;
2005 let NumMicroOps = 9;
2006 let ResourceCycles = [1,5,2,1];
2007}
Craig Topper17a31182017-12-16 18:35:29 +00002008def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002009
Gadi Haber323f2e12017-10-24 20:19:47 +00002010def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
2011 let Latency = 29;
2012 let NumMicroOps = 27;
2013 let ResourceCycles = [1,5,1,1,19];
2014}
2015def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
2016
2017def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
2018 let Latency = 30;
2019 let NumMicroOps = 28;
2020 let ResourceCycles = [1,6,1,1,19];
2021}
Craig Topper2d451e72018-03-18 08:38:06 +00002022def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002023
2024def BWWriteResGroup187 : SchedWriteRes<[BWPort01,BWPort15,BWPort015,BWPort0156]> {
2025 let Latency = 31;
2026 let NumMicroOps = 31;
2027 let ResourceCycles = [8,1,21,1];
2028}
2029def: InstRW<[BWWriteResGroup187], (instregex "MMX_EMMS")>;
2030
Craig Topper8104f262018-04-02 05:33:28 +00002031def BWWriteResGroup189 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
2032 let Latency = 29;
Gadi Haber323f2e12017-10-24 20:19:47 +00002033 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00002034 let ResourceCycles = [2,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00002035}
2036def: InstRW<[BWWriteResGroup189], (instregex "VSQRTPDYr")>;
2037
2038def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
2039 let Latency = 34;
2040 let NumMicroOps = 8;
2041 let ResourceCycles = [2,2,2,1,1];
2042}
Craig Topper13a16502018-03-19 00:56:09 +00002043def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002044
2045def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
2046 let Latency = 34;
2047 let NumMicroOps = 23;
2048 let ResourceCycles = [1,5,3,4,10];
2049}
Craig Topper5a69a002018-03-21 06:28:42 +00002050def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
2051 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002052
2053def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
2054 let Latency = 35;
2055 let NumMicroOps = 8;
2056 let ResourceCycles = [2,2,2,1,1];
2057}
Craig Topper13a16502018-03-19 00:56:09 +00002058def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002059
2060def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
2061 let Latency = 35;
2062 let NumMicroOps = 23;
2063 let ResourceCycles = [1,5,2,1,4,10];
2064}
Craig Topper5a69a002018-03-21 06:28:42 +00002065def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
2066 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002067
Craig Topper8104f262018-04-02 05:33:28 +00002068def BWWriteResGroup195 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
2069 let Latency = 35;
Gadi Haber323f2e12017-10-24 20:19:47 +00002070 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00002071 let ResourceCycles = [2,1,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00002072}
2073def: InstRW<[BWWriteResGroup195], (instregex "VSQRTPDYm")>;
2074
2075def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
2076 let Latency = 42;
2077 let NumMicroOps = 22;
2078 let ResourceCycles = [2,20];
2079}
Craig Topper2d451e72018-03-18 08:38:06 +00002080def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002081
2082def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
2083 let Latency = 60;
2084 let NumMicroOps = 64;
2085 let ResourceCycles = [2,2,8,1,10,2,39];
2086}
2087def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002088
2089def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
2090 let Latency = 63;
2091 let NumMicroOps = 88;
2092 let ResourceCycles = [4,4,31,1,2,1,45];
2093}
Craig Topper2d451e72018-03-18 08:38:06 +00002094def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002095
2096def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
2097 let Latency = 63;
2098 let NumMicroOps = 90;
2099 let ResourceCycles = [4,2,33,1,2,1,47];
2100}
Craig Topper2d451e72018-03-18 08:38:06 +00002101def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002102
2103def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
2104 let Latency = 75;
2105 let NumMicroOps = 15;
2106 let ResourceCycles = [6,3,6];
2107}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00002108def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002109
2110def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
2111 let Latency = 80;
2112 let NumMicroOps = 32;
2113 let ResourceCycles = [7,7,3,3,1,11];
2114}
2115def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
2116
2117def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
2118 let Latency = 115;
2119 let NumMicroOps = 100;
2120 let ResourceCycles = [9,9,11,8,1,11,21,30];
2121}
2122def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002123
2124} // SchedModel
2125