blob: 72044bf44e9036843276a22980924a5d9bf73137 [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.
169defm : BWWriteResPair<WriteFLogic, [BWPort5], 1>; // Floating point and/or/xor logicals.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000170defm : BWWriteResPair<WriteFShuffle, [BWPort5], 1>; // Floating point vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000171defm : BWWriteResPair<WriteFVarShuffle, [BWPort5], 1>; // Floating point vector variable shuffles.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000172defm : BWWriteResPair<WriteFBlend, [BWPort015], 1>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000173defm : BWWriteResPair<WriteFVarBlend, [BWPort5], 2, [2], 2, 5>; // Fp vector variable blends.
Gadi Haber323f2e12017-10-24 20:19:47 +0000174
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000175def : WriteRes<WriteCvtF2FSt, [BWPort1,BWPort4,BWPort237]> {
176 let Latency = 4;
177 let NumMicroOps = 3;
178 let ResourceCycles = [1,1,1];
179}
180
Gadi Haber323f2e12017-10-24 20:19:47 +0000181// FMA Scheduling helper class.
182// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
183
184// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000185def : WriteRes<WriteVecLoad, [BWPort23]> { let Latency = 5; }
186def : WriteRes<WriteVecStore, [BWPort237, BWPort4]>;
187def : WriteRes<WriteVecMove, [BWPort015]>;
188
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000189defm : BWWriteResPair<WriteVecALU, [BWPort15], 1>; // Vector integer ALU op, no logicals.
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000190defm : BWWriteResPair<WriteVecLogic, [BWPort015], 1>; // Vector integer and/or/xor.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000191defm : BWWriteResPair<WriteVecShift, [BWPort0], 1>; // Vector integer shifts.
192defm : BWWriteResPair<WriteVecIMul, [BWPort0], 5>; // Vector integer multiply.
Craig Topper13a0f832018-03-31 04:54:32 +0000193defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // PMULLD
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000194defm : BWWriteResPair<WriteShuffle, [BWPort5], 1>; // Vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000195defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1>; // Vector variable shuffles.
Simon Pilgrim06e16542018-04-22 18:35:53 +0000196defm : BWWriteResPair<WriteBlend, [BWPort5], 1>; // Vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000197defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000198defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim27bc83e2018-04-24 18:49:25 +0000199defm : BWWriteResPair<WritePSADBW, [BWPort0], 5>; // Vector PSADBW.
200defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000201
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000202// Vector insert/extract operations.
203def : WriteRes<WriteVecInsert, [BWPort5]> {
204 let Latency = 2;
205 let NumMicroOps = 2;
206 let ResourceCycles = [2];
207}
208def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
209 let Latency = 6;
210 let NumMicroOps = 2;
211}
212
213def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
214 let Latency = 2;
215 let NumMicroOps = 2;
216}
217def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
218 let Latency = 2;
219 let NumMicroOps = 3;
220}
221
Gadi Haber323f2e12017-10-24 20:19:47 +0000222// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000223defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
224defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
225defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000226
227// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000228
Gadi Haber323f2e12017-10-24 20:19:47 +0000229// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000230def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000231 let Latency = 11;
232 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000233 let ResourceCycles = [3];
234}
235def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000236 let Latency = 16;
237 let NumMicroOps = 4;
238 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000239}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000240
241// Packed Compare Explicit Length Strings, Return Mask
242def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
243 let Latency = 19;
244 let NumMicroOps = 9;
245 let ResourceCycles = [4,3,1,1];
246}
247def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
248 let Latency = 24;
249 let NumMicroOps = 10;
250 let ResourceCycles = [4,3,1,1,1];
251}
252
253// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000254def : WriteRes<WritePCmpIStrI, [BWPort0]> {
255 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000256 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000257 let ResourceCycles = [3];
258}
259def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000260 let Latency = 16;
261 let NumMicroOps = 4;
262 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000263}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000264
265// Packed Compare Explicit Length Strings, Return Index
266def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
267 let Latency = 18;
268 let NumMicroOps = 8;
269 let ResourceCycles = [4,3,1];
270}
271def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
272 let Latency = 23;
273 let NumMicroOps = 9;
274 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000275}
276
Simon Pilgrima2f26782018-03-27 20:38:54 +0000277// MOVMSK Instructions.
278def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
279def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
280def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
281
Gadi Haber323f2e12017-10-24 20:19:47 +0000282// AES instructions.
283def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
284 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000285 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000286 let ResourceCycles = [1];
287}
288def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000289 let Latency = 12;
290 let NumMicroOps = 2;
291 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000292}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000293
Gadi Haber323f2e12017-10-24 20:19:47 +0000294def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
295 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000296 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000297 let ResourceCycles = [2];
298}
299def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000300 let Latency = 19;
301 let NumMicroOps = 3;
302 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000303}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000304
305def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
306 let Latency = 29;
307 let NumMicroOps = 11;
308 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000309}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000310def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
311 let Latency = 33;
312 let NumMicroOps = 11;
313 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000314}
315
316// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000317defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000318
319// Catch-all for expensive system instructions.
320def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
321
322// AVX2.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000323defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3>; // Fp 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000324defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3>; // Fp 256-bit width vector variable shuffles.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000325defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3>; // 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000326defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3>; // 256-bit width vector variable shuffles.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000327defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 2, [2, 1]>; // Variable vector shifts.
Gadi Haber323f2e12017-10-24 20:19:47 +0000328
329// Old microcoded instructions that nobody use.
330def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
331
332// Fence instructions.
333def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
334
Craig Topper05242bf2018-04-21 18:07:36 +0000335// Load/store MXCSR.
336def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
337def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
338
Gadi Haber323f2e12017-10-24 20:19:47 +0000339// Nop, not very useful expect it provides a model for nops!
340def : WriteRes<WriteNop, []>;
341
342////////////////////////////////////////////////////////////////////////////////
343// Horizontal add/sub instructions.
344////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000345
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000346defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3>;
347defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000348
349// Remaining instrs.
350
351def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
352 let Latency = 1;
353 let NumMicroOps = 1;
354 let ResourceCycles = [1];
355}
Craig Topper5a69a002018-03-21 06:28:42 +0000356def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
357 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000358 "(V?)MOVPDI2DIrr",
359 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000360 "VPSLLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000361 "VPSRLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000362 "VTESTPD(Y?)rr",
363 "VTESTPS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000364
365def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
366 let Latency = 1;
367 let NumMicroOps = 1;
368 let ResourceCycles = [1];
369}
Craig Topper5a69a002018-03-21 06:28:42 +0000370def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
371 "COM_FST0r",
372 "UCOM_FPr",
373 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000374
375def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
376 let Latency = 1;
377 let NumMicroOps = 1;
378 let ResourceCycles = [1];
379}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000380def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000381 "MMX_MOVD64to64rr",
382 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000383 "(V?)MOV64toPQIrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000384 "(V?)MOVDI2PDIrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000385 "(V?)PSLLDQ(Y?)ri",
Simon Pilgrim74ccc6a2018-04-21 19:11:55 +0000386 "(V?)PSRLDQ(Y?)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000387
388def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
389 let Latency = 1;
390 let NumMicroOps = 1;
391 let ResourceCycles = [1];
392}
393def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
394
395def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
396 let Latency = 1;
397 let NumMicroOps = 1;
398 let ResourceCycles = [1];
399}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000400def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000401
402def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
403 let Latency = 1;
404 let NumMicroOps = 1;
405 let ResourceCycles = [1];
406}
Craig Topperfbe31322018-04-05 21:56:19 +0000407def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000408def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
409 "ADC(16|32|64)i",
410 "ADC(8|16|32|64)rr",
411 "ADCX(32|64)rr",
412 "ADOX(32|64)rr",
413 "BT(16|32|64)ri8",
414 "BT(16|32|64)rr",
415 "BTC(16|32|64)ri8",
416 "BTC(16|32|64)rr",
417 "BTR(16|32|64)ri8",
418 "BTR(16|32|64)rr",
419 "BTS(16|32|64)ri8",
420 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000421 "SBB(16|32|64)ri",
422 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000423 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000424
425def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
426 let Latency = 1;
427 let NumMicroOps = 1;
428 let ResourceCycles = [1];
429}
Craig Topper5a69a002018-03-21 06:28:42 +0000430def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
431 "BLSI(32|64)rr",
432 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000433 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000434
435def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
436 let Latency = 1;
437 let NumMicroOps = 1;
438 let ResourceCycles = [1];
439}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000440def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000441 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000442
443def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
444 let Latency = 1;
445 let NumMicroOps = 1;
446 let ResourceCycles = [1];
447}
Craig Topperdfccafe2018-04-18 06:41:25 +0000448def: InstRW<[BWWriteResGroup9], (instregex "LAHF", // TODO: This doesnt match Agner's data
Craig Topper5a69a002018-03-21 06:28:42 +0000449 "NOOP",
Craig Topper655e1db2018-04-17 19:35:14 +0000450 "SAHF", // TODO: This doesn't match Agner's data
Craig Topper5a69a002018-03-21 06:28:42 +0000451 "SGDT64m",
452 "SIDT64m",
453 "SLDT64m",
454 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000455 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000456 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000457
458def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
459 let Latency = 1;
460 let NumMicroOps = 2;
461 let ResourceCycles = [1,1];
462}
Craig Topper5a69a002018-03-21 06:28:42 +0000463def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
464 "MMX_MOVD64from64rm",
465 "MMX_MOVD64mr",
466 "MMX_MOVNTQmr",
467 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000468 "MOVNTI_64mr",
469 "MOVNTImr",
Craig Topper5a69a002018-03-21 06:28:42 +0000470 "ST_FP32m",
471 "ST_FP64m",
472 "ST_FP80m",
473 "VEXTRACTF128mr",
474 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000475 "(V?)MOVAPD(Y?)mr",
476 "(V?)MOVAPS(Y?)mr",
477 "(V?)MOVDQA(Y?)mr",
478 "(V?)MOVDQU(Y?)mr",
479 "(V?)MOVHPDmr",
480 "(V?)MOVHPSmr",
481 "(V?)MOVLPDmr",
482 "(V?)MOVLPSmr",
483 "(V?)MOVNTDQ(V?)mr",
484 "(V?)MOVNTPD(V?)mr",
485 "(V?)MOVNTPS(V?)mr",
486 "(V?)MOVPDI2DImr",
487 "(V?)MOVPQI2QImr",
488 "(V?)MOVPQIto64mr",
489 "(V?)MOVSDmr",
490 "(V?)MOVSSmr",
491 "(V?)MOVUPD(Y?)mr",
492 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000493
Gadi Haber323f2e12017-10-24 20:19:47 +0000494def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
495 let Latency = 2;
496 let NumMicroOps = 2;
497 let ResourceCycles = [2];
498}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000499def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000500
501def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
502 let Latency = 2;
503 let NumMicroOps = 2;
504 let ResourceCycles = [2];
505}
Craig Topper5a69a002018-03-21 06:28:42 +0000506def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
507 "ROL(8|16|32|64)ri",
508 "ROR(8|16|32|64)r1",
509 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000510
511def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
512 let Latency = 2;
513 let NumMicroOps = 2;
514 let ResourceCycles = [2];
515}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000516def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
517 MFENCE,
518 WAIT,
519 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000520
521def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
522 let Latency = 2;
523 let NumMicroOps = 2;
524 let ResourceCycles = [1,1];
525}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000526def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000527 "(V?)CVTPS2PDrr",
528 "(V?)CVTSS2SDrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000529 "(V?)PSLLDrr",
530 "(V?)PSLLQrr",
531 "(V?)PSLLWrr",
532 "(V?)PSRADrr",
533 "(V?)PSRAWrr",
534 "(V?)PSRLDrr",
535 "(V?)PSRLQrr",
536 "(V?)PSRLWrr",
537 "(V?)PTESTrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000538
539def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
540 let Latency = 2;
541 let NumMicroOps = 2;
542 let ResourceCycles = [1,1];
543}
544def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
545
546def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
547 let Latency = 2;
548 let NumMicroOps = 2;
549 let ResourceCycles = [1,1];
550}
551def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
552
553def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
554 let Latency = 2;
555 let NumMicroOps = 2;
556 let ResourceCycles = [1,1];
557}
558def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
559
560def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
561 let Latency = 2;
562 let NumMicroOps = 2;
563 let ResourceCycles = [1,1];
564}
Craig Topper498875f2018-04-04 17:54:19 +0000565def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
566
567def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
568 let Latency = 1;
569 let NumMicroOps = 1;
570 let ResourceCycles = [1];
571}
572def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000573
574def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
575 let Latency = 2;
576 let NumMicroOps = 2;
577 let ResourceCycles = [1,1];
578}
Craig Topper2d451e72018-03-18 08:38:06 +0000579def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000580def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000581def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
582 "ADC8ri",
583 "CMOV(A|BE)(16|32|64)rr",
584 "SBB8i8",
585 "SBB8ri",
586 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000587
Gadi Haber323f2e12017-10-24 20:19:47 +0000588def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
589 let Latency = 2;
590 let NumMicroOps = 3;
591 let ResourceCycles = [1,1,1];
592}
593def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
594
Gadi Haber323f2e12017-10-24 20:19:47 +0000595def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
596 let Latency = 2;
597 let NumMicroOps = 3;
598 let ResourceCycles = [1,1,1];
599}
600def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
601
602def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
603 let Latency = 2;
604 let NumMicroOps = 3;
605 let ResourceCycles = [1,1,1];
606}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000607def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
608 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000609def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000610 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000611
Gadi Haber323f2e12017-10-24 20:19:47 +0000612def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
613 let Latency = 3;
614 let NumMicroOps = 1;
615 let ResourceCycles = [1];
616}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000617def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000618 "PDEP(32|64)rr",
619 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000620 "SHLD(16|32|64)rri8",
621 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000622 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000623
624def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000625 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000626 let NumMicroOps = 2;
627 let ResourceCycles = [1,1];
628}
Clement Courbet327fac42018-03-07 08:14:02 +0000629def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000630
631def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
632 let Latency = 3;
633 let NumMicroOps = 1;
634 let ResourceCycles = [1];
635}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000636def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
637 "VPBROADCASTWrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000638 "VPMOVSXBDYrr",
639 "VPMOVSXBQYrr",
640 "VPMOVSXBWYrr",
641 "VPMOVSXDQYrr",
642 "VPMOVSXWDYrr",
643 "VPMOVSXWQYrr",
644 "VPMOVZXBDYrr",
645 "VPMOVZXBQYrr",
646 "VPMOVZXBWYrr",
647 "VPMOVZXDQYrr",
648 "VPMOVZXWDYrr",
649 "VPMOVZXWQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000650
651def BWWriteResGroup29 : SchedWriteRes<[BWPort01]> {
652 let Latency = 3;
653 let NumMicroOps = 1;
654 let ResourceCycles = [1];
655}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000656def: InstRW<[BWWriteResGroup29], (instregex "(V?)MULPD(Y?)rr",
657 "(V?)MULPS(Y?)rr",
658 "(V?)MULSDrr",
659 "(V?)MULSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000660
661def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000662 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000663 let NumMicroOps = 3;
664 let ResourceCycles = [3];
665}
Craig Topperb5f26592018-04-19 18:00:17 +0000666def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
667 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
668 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000669
670def BWWriteResGroup31 : SchedWriteRes<[BWPort0,BWPort5]> {
671 let Latency = 3;
672 let NumMicroOps = 3;
673 let ResourceCycles = [2,1];
674}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000675def: InstRW<[BWWriteResGroup31], (instregex "VPSLLVD(Y?)rr",
676 "VPSRAVD(Y?)rr",
677 "VPSRLVD(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000678
Gadi Haber323f2e12017-10-24 20:19:47 +0000679def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
680 let Latency = 3;
681 let NumMicroOps = 3;
682 let ResourceCycles = [2,1];
683}
Craig Topper5a69a002018-03-21 06:28:42 +0000684def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
685 "MMX_PACKSSWBirr",
686 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000687
688def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
689 let Latency = 3;
690 let NumMicroOps = 3;
691 let ResourceCycles = [1,2];
692}
693def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
694
695def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
696 let Latency = 3;
697 let NumMicroOps = 3;
698 let ResourceCycles = [1,2];
699}
Craig Topper5a69a002018-03-21 06:28:42 +0000700def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
701 "RCL(8|16|32|64)ri",
702 "RCR(8|16|32|64)r1",
703 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000704
705def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
706 let Latency = 3;
707 let NumMicroOps = 3;
708 let ResourceCycles = [2,1];
709}
Craig Topper5a69a002018-03-21 06:28:42 +0000710def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
711 "ROR(8|16|32|64)rCL",
712 "SAR(8|16|32|64)rCL",
713 "SHL(8|16|32|64)rCL",
714 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000715
716def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
717 let Latency = 3;
718 let NumMicroOps = 4;
719 let ResourceCycles = [1,1,1,1];
720}
721def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
722
723def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
724 let Latency = 3;
725 let NumMicroOps = 4;
726 let ResourceCycles = [1,1,1,1];
727}
Craig Topper5a69a002018-03-21 06:28:42 +0000728def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
729 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000730
731def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
732 let Latency = 4;
733 let NumMicroOps = 2;
734 let ResourceCycles = [1,1];
735}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000736def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
737 "(V?)CVTSD2SIrr",
738 "(V?)CVTSS2SI64rr",
739 "(V?)CVTSS2SIrr",
740 "(V?)CVTTSD2SI64rr",
741 "(V?)CVTTSD2SIrr",
742 "(V?)CVTTSS2SI64rr",
743 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000744
745def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
746 let Latency = 4;
747 let NumMicroOps = 2;
748 let ResourceCycles = [1,1];
749}
Craig Topper5a69a002018-03-21 06:28:42 +0000750def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr",
751 "VPSLLDYrr",
752 "VPSLLQYrr",
753 "VPSLLWYrr",
754 "VPSRADYrr",
755 "VPSRAWYrr",
756 "VPSRLDYrr",
757 "VPSRLQYrr",
758 "VPSRLWYrr",
759 "VPTESTYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000760
761def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
762 let Latency = 4;
763 let NumMicroOps = 2;
764 let ResourceCycles = [1,1];
765}
766def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
767
768def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
769 let Latency = 4;
770 let NumMicroOps = 2;
771 let ResourceCycles = [1,1];
772}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000773def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000774def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000775 "MMX_CVTPI2PDirr",
776 "MMX_CVTPS2PIirr",
777 "MMX_CVTTPD2PIirr",
778 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000779 "(V?)CVTDQ2PDrr",
780 "(V?)CVTPD2DQrr",
781 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000782 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000783 "(V?)CVTSD2SSrr",
784 "(V?)CVTSI642SDrr",
785 "(V?)CVTSI2SDrr",
786 "(V?)CVTSI2SSrr",
787 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000788
789def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
790 let Latency = 4;
791 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000792 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000793}
Craig Topper5a69a002018-03-21 06:28:42 +0000794def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000795
796def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
797 let Latency = 4;
798 let NumMicroOps = 3;
799 let ResourceCycles = [1,1,1];
800}
801def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
802
803def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
804 let Latency = 4;
805 let NumMicroOps = 3;
806 let ResourceCycles = [1,1,1];
807}
Craig Topper5a69a002018-03-21 06:28:42 +0000808def: InstRW<[BWWriteResGroup44], (instregex "ISTT_FP16m",
809 "ISTT_FP32m",
810 "ISTT_FP64m",
811 "IST_F16m",
812 "IST_F32m",
813 "IST_FP16m",
814 "IST_FP32m",
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000815 "IST_FP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000816
817def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
818 let Latency = 4;
819 let NumMicroOps = 4;
820 let ResourceCycles = [4];
821}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000822def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000823
824def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
825 let Latency = 4;
826 let NumMicroOps = 4;
827 let ResourceCycles = [1,3];
828}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000829def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000830
831def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
832 let Latency = 5;
833 let NumMicroOps = 1;
834 let ResourceCycles = [1];
835}
Simon Pilgrim74ccc6a2018-04-21 19:11:55 +0000836def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000837
Gadi Haber323f2e12017-10-24 20:19:47 +0000838def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
839 let Latency = 5;
840 let NumMicroOps = 1;
841 let ResourceCycles = [1];
842}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000843def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000844 "MOVSX(16|32|64)rm32",
845 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000846 "MOVZX(16|32|64)rm16",
847 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000848 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000849 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000850 "(V?)MOVSHDUPrm",
851 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000852 "VPBROADCASTDrm",
853 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000854
855def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
856 let Latency = 5;
857 let NumMicroOps = 3;
858 let ResourceCycles = [1,2];
859}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000860def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000861
862def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
863 let Latency = 5;
864 let NumMicroOps = 3;
865 let ResourceCycles = [1,1,1];
866}
867def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
868
869def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000870 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000871 let NumMicroOps = 3;
872 let ResourceCycles = [1,1,1];
873}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000874def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000875
876def BWWriteResGroup53 : SchedWriteRes<[BWPort0,BWPort4,BWPort237,BWPort15]> {
877 let Latency = 5;
878 let NumMicroOps = 4;
879 let ResourceCycles = [1,1,1,1];
880}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000881def: InstRW<[BWWriteResGroup53], (instregex "VMASKMOVPD(Y?)mr",
882 "VMASKMOVPS(Y?)mr",
883 "VPMASKMOVD(Y?)mr",
884 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000885
886def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
887 let Latency = 5;
888 let NumMicroOps = 5;
889 let ResourceCycles = [1,4];
890}
891def: InstRW<[BWWriteResGroup54], (instregex "PAUSE")>;
892
893def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
894 let Latency = 5;
895 let NumMicroOps = 5;
896 let ResourceCycles = [1,4];
897}
898def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
899
900def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
901 let Latency = 5;
902 let NumMicroOps = 5;
903 let ResourceCycles = [2,3];
904}
Craig Topper5a69a002018-03-21 06:28:42 +0000905def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000906
907def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
908 let Latency = 5;
909 let NumMicroOps = 6;
910 let ResourceCycles = [1,1,4];
911}
Craig Topper5a69a002018-03-21 06:28:42 +0000912def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000913
914def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
915 let Latency = 6;
916 let NumMicroOps = 1;
917 let ResourceCycles = [1];
918}
Craig Topper5a69a002018-03-21 06:28:42 +0000919def: InstRW<[BWWriteResGroup58], (instregex "LD_F32m",
920 "LD_F64m",
921 "LD_F80m",
922 "VBROADCASTF128",
923 "VBROADCASTI128",
924 "VBROADCASTSDYrm",
925 "VBROADCASTSSYrm",
926 "VLDDQUYrm",
927 "VMOVAPDYrm",
928 "VMOVAPSYrm",
929 "VMOVDDUPYrm",
930 "VMOVDQAYrm",
931 "VMOVDQUYrm",
932 "VMOVNTDQAYrm",
933 "VMOVSHDUPYrm",
934 "VMOVSLDUPYrm",
935 "VMOVUPDYrm",
936 "VMOVUPSYrm",
937 "VPBROADCASTDYrm",
938 "VPBROADCASTQYrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000939 "(V?)ROUNDPD(Y?)r",
940 "(V?)ROUNDPS(Y?)r",
941 "(V?)ROUNDSDr",
942 "(V?)ROUNDSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000943
944def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
945 let Latency = 6;
946 let NumMicroOps = 2;
947 let ResourceCycles = [1,1];
948}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000949def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000950 "(V?)CVTPS2PDrm",
951 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000952 "VPSLLVQrm",
953 "VPSRLVQrm",
954 "VTESTPDrm",
955 "VTESTPSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000956
957def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
958 let Latency = 6;
959 let NumMicroOps = 2;
960 let ResourceCycles = [1,1];
961}
Craig Topper5a69a002018-03-21 06:28:42 +0000962def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
963 "VCVTPD2DQYrr",
964 "VCVTPD2PSYrr",
965 "VCVTPS2PHYrr",
966 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000967
Gadi Haber323f2e12017-10-24 20:19:47 +0000968def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
969 let Latency = 6;
970 let NumMicroOps = 2;
971 let ResourceCycles = [1,1];
972}
Craig Topper5a69a002018-03-21 06:28:42 +0000973def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
974 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000975
976def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
977 let Latency = 6;
978 let NumMicroOps = 2;
979 let ResourceCycles = [1,1];
980}
Craig Topperdfccafe2018-04-18 06:41:25 +0000981def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +0000982def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
983 ADCX32rm, ADCX64rm,
984 ADOX32rm, ADOX64rm,
985 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000986
987def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
988 let Latency = 6;
989 let NumMicroOps = 2;
990 let ResourceCycles = [1,1];
991}
Craig Topper5a69a002018-03-21 06:28:42 +0000992def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
993 "BLSI(32|64)rm",
994 "BLSMSK(32|64)rm",
995 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +0000996 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000997
998def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
999 let Latency = 6;
1000 let NumMicroOps = 2;
1001 let ResourceCycles = [1,1];
1002}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001003def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +00001004 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001005 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001006
1007def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1008 let Latency = 6;
1009 let NumMicroOps = 2;
1010 let ResourceCycles = [1,1];
1011}
Craig Topper2d451e72018-03-18 08:38:06 +00001012def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001013def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001014
1015def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1016 let Latency = 6;
1017 let NumMicroOps = 4;
1018 let ResourceCycles = [1,1,2];
1019}
Craig Topper5a69a002018-03-21 06:28:42 +00001020def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1021 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001022
1023def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1024 let Latency = 6;
1025 let NumMicroOps = 4;
1026 let ResourceCycles = [1,1,1,1];
1027}
1028def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1029
1030def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1031 let Latency = 6;
1032 let NumMicroOps = 4;
1033 let ResourceCycles = [1,1,1,1];
1034}
Craig Topper5a69a002018-03-21 06:28:42 +00001035def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1036 "BTR(16|32|64)mi8",
1037 "BTS(16|32|64)mi8",
1038 "SAR(8|16|32|64)m1",
1039 "SAR(8|16|32|64)mi",
1040 "SHL(8|16|32|64)m1",
1041 "SHL(8|16|32|64)mi",
1042 "SHR(8|16|32|64)m1",
1043 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001044
1045def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1046 let Latency = 6;
1047 let NumMicroOps = 4;
1048 let ResourceCycles = [1,1,1,1];
1049}
Craig Topperf0d04262018-04-06 16:16:48 +00001050def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1051 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001052
1053def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1054 let Latency = 6;
1055 let NumMicroOps = 6;
1056 let ResourceCycles = [1,5];
1057}
1058def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1059
Gadi Haber323f2e12017-10-24 20:19:47 +00001060def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1061 let Latency = 7;
1062 let NumMicroOps = 2;
1063 let ResourceCycles = [1,1];
1064}
Craig Topper5a69a002018-03-21 06:28:42 +00001065def: InstRW<[BWWriteResGroup73], (instregex "VPSLLDYrm",
1066 "VPSLLQYrm",
1067 "VPSLLVQYrm",
1068 "VPSLLWYrm",
1069 "VPSRADYrm",
1070 "VPSRAWYrm",
1071 "VPSRLDYrm",
1072 "VPSRLQYrm",
1073 "VPSRLVQYrm",
1074 "VPSRLWYrm",
1075 "VTESTPDYrm",
1076 "VTESTPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001077
1078def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1079 let Latency = 7;
1080 let NumMicroOps = 2;
1081 let ResourceCycles = [1,1];
1082}
Craig Topper5a69a002018-03-21 06:28:42 +00001083def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1084 "FCOM64m",
1085 "FCOMP32m",
1086 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001087
1088def BWWriteResGroup75 : SchedWriteRes<[BWPort5,BWPort23]> {
1089 let Latency = 7;
1090 let NumMicroOps = 2;
1091 let ResourceCycles = [1,1];
1092}
Craig Topper5a69a002018-03-21 06:28:42 +00001093def: InstRW<[BWWriteResGroup75], (instregex "VANDNPDYrm",
1094 "VANDNPSYrm",
1095 "VANDPDYrm",
1096 "VANDPSYrm",
1097 "VORPDYrm",
1098 "VORPSYrm",
1099 "VPACKSSDWYrm",
1100 "VPACKSSWBYrm",
1101 "VPACKUSDWYrm",
1102 "VPACKUSWBYrm",
1103 "VPALIGNRYrmi",
1104 "VPBLENDWYrmi",
1105 "VPERMILPDYmi",
1106 "VPERMILPDYrm",
1107 "VPERMILPSYmi",
1108 "VPERMILPSYrm",
1109 "VPSHUFBYrm",
1110 "VPSHUFDYmi",
1111 "VPSHUFHWYmi",
1112 "VPSHUFLWYmi",
1113 "VPUNPCKHBWYrm",
1114 "VPUNPCKHDQYrm",
1115 "VPUNPCKHQDQYrm",
1116 "VPUNPCKHWDYrm",
1117 "VPUNPCKLBWYrm",
1118 "VPUNPCKLDQYrm",
1119 "VPUNPCKLQDQYrm",
1120 "VPUNPCKLWDYrm",
1121 "VSHUFPDYrmi",
1122 "VSHUFPSYrmi",
1123 "VUNPCKHPDYrm",
1124 "VUNPCKHPSYrm",
1125 "VUNPCKLPDYrm",
1126 "VUNPCKLPSYrm",
1127 "VXORPDYrm",
1128 "VXORPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001129
1130def BWWriteResGroup76 : SchedWriteRes<[BWPort23,BWPort15]> {
1131 let Latency = 7;
1132 let NumMicroOps = 2;
1133 let ResourceCycles = [1,1];
1134}
Craig Topper5a69a002018-03-21 06:28:42 +00001135def: InstRW<[BWWriteResGroup76], (instregex "VPABSBYrm",
1136 "VPABSDYrm",
1137 "VPABSWYrm",
1138 "VPADDBYrm",
1139 "VPADDDYrm",
1140 "VPADDQYrm",
1141 "VPADDSBYrm",
1142 "VPADDSWYrm",
1143 "VPADDUSBYrm",
1144 "VPADDUSWYrm",
1145 "VPADDWYrm",
1146 "VPAVGBYrm",
1147 "VPAVGWYrm",
1148 "VPCMPEQBYrm",
1149 "VPCMPEQDYrm",
1150 "VPCMPEQQYrm",
1151 "VPCMPEQWYrm",
1152 "VPCMPGTBYrm",
1153 "VPCMPGTDYrm",
1154 "VPCMPGTWYrm",
1155 "VPMAXSBYrm",
1156 "VPMAXSDYrm",
1157 "VPMAXSWYrm",
1158 "VPMAXUBYrm",
1159 "VPMAXUDYrm",
1160 "VPMAXUWYrm",
1161 "VPMINSBYrm",
1162 "VPMINSDYrm",
1163 "VPMINSWYrm",
1164 "VPMINUBYrm",
1165 "VPMINUDYrm",
1166 "VPMINUWYrm",
1167 "VPSIGNBYrm",
1168 "VPSIGNDYrm",
1169 "VPSIGNWYrm",
1170 "VPSUBBYrm",
1171 "VPSUBDYrm",
1172 "VPSUBQYrm",
1173 "VPSUBSBYrm",
1174 "VPSUBSWYrm",
1175 "VPSUBUSBYrm",
1176 "VPSUBUSWYrm",
1177 "VPSUBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001178
1179def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1180 let Latency = 7;
1181 let NumMicroOps = 2;
1182 let ResourceCycles = [1,1];
1183}
Craig Topper5a69a002018-03-21 06:28:42 +00001184def: InstRW<[BWWriteResGroup77], (instregex "VBLENDPDYrmi",
1185 "VBLENDPSYrmi",
1186 "VPANDNYrm",
1187 "VPANDYrm",
1188 "VPBLENDDYrmi",
1189 "VPORYrm",
1190 "VPXORYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001191
Gadi Haber323f2e12017-10-24 20:19:47 +00001192def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1193 let Latency = 7;
1194 let NumMicroOps = 3;
1195 let ResourceCycles = [2,1];
1196}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001197def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001198 "MMX_PACKSSWBirm",
1199 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001200 "VMASKMOVPDrm",
1201 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001202 "VPMASKMOVDrm",
1203 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001204
1205def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1206 let Latency = 7;
1207 let NumMicroOps = 3;
1208 let ResourceCycles = [1,2];
1209}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001210def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1211 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001212
1213def BWWriteResGroup81 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1214 let Latency = 7;
1215 let NumMicroOps = 3;
1216 let ResourceCycles = [1,1,1];
1217}
Craig Topper5a69a002018-03-21 06:28:42 +00001218def: InstRW<[BWWriteResGroup81], (instregex "PSLLDrm",
1219 "PSLLQrm",
1220 "PSLLWrm",
1221 "PSRADrm",
1222 "PSRAWrm",
1223 "PSRLDrm",
1224 "PSRLQrm",
1225 "PSRLWrm",
1226 "PTESTrm",
1227 "VPSLLDrm",
1228 "VPSLLQrm",
1229 "VPSLLWrm",
1230 "VPSRADrm",
1231 "VPSRAWrm",
1232 "VPSRLDrm",
1233 "VPSRLQrm",
1234 "VPSRLWrm",
1235 "VPTESTrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001236
1237def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1238 let Latency = 7;
1239 let NumMicroOps = 3;
1240 let ResourceCycles = [1,1,1];
1241}
1242def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1243
Gadi Haber323f2e12017-10-24 20:19:47 +00001244def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1245 let Latency = 7;
1246 let NumMicroOps = 3;
1247 let ResourceCycles = [1,1,1];
1248}
Craig Topper5a69a002018-03-21 06:28:42 +00001249def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1250 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001251
Gadi Haber323f2e12017-10-24 20:19:47 +00001252def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1253 let Latency = 7;
1254 let NumMicroOps = 3;
1255 let ResourceCycles = [1,1,1];
1256}
Craig Topperf4cd9082018-01-19 05:47:32 +00001257def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001258
1259def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1260 let Latency = 7;
1261 let NumMicroOps = 5;
1262 let ResourceCycles = [1,1,1,2];
1263}
Craig Topper5a69a002018-03-21 06:28:42 +00001264def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1265 "ROL(8|16|32|64)mi",
1266 "ROR(8|16|32|64)m1",
1267 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001268
1269def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1270 let Latency = 7;
1271 let NumMicroOps = 5;
1272 let ResourceCycles = [1,1,1,2];
1273}
Craig Topper5a69a002018-03-21 06:28:42 +00001274def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001275
1276def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1277 let Latency = 7;
1278 let NumMicroOps = 5;
1279 let ResourceCycles = [1,1,1,1,1];
1280}
Craig Topper5a69a002018-03-21 06:28:42 +00001281def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1282 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001283
1284def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1285 let Latency = 7;
1286 let NumMicroOps = 7;
1287 let ResourceCycles = [2,2,1,2];
1288}
Craig Topper2d451e72018-03-18 08:38:06 +00001289def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001290
1291def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1292 let Latency = 8;
1293 let NumMicroOps = 2;
1294 let ResourceCycles = [1,1];
1295}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001296def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001297 "PDEP(32|64)rm",
1298 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001299 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001300
1301def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001302 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001303 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001304 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001305}
Craig Topperf846e2d2018-04-19 05:34:05 +00001306def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001307
Craig Topperf846e2d2018-04-19 05:34:05 +00001308def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1309 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001310 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001311 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001312}
Craig Topper5a69a002018-03-21 06:28:42 +00001313def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001314
Gadi Haber323f2e12017-10-24 20:19:47 +00001315def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1316 let Latency = 8;
1317 let NumMicroOps = 2;
1318 let ResourceCycles = [1,1];
1319}
Craig Topper5a69a002018-03-21 06:28:42 +00001320def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1321 "VPMOVSXBQYrm",
1322 "VPMOVSXBWYrm",
1323 "VPMOVSXDQYrm",
1324 "VPMOVSXWDYrm",
1325 "VPMOVSXWQYrm",
1326 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001327
1328def BWWriteResGroup93 : SchedWriteRes<[BWPort01,BWPort23]> {
1329 let Latency = 8;
1330 let NumMicroOps = 2;
1331 let ResourceCycles = [1,1];
1332}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001333def: InstRW<[BWWriteResGroup93], (instregex "(V?)MULPDrm",
1334 "(V?)MULPSrm",
1335 "(V?)MULSDrm",
1336 "(V?)MULSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001337
1338def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1339 let Latency = 8;
1340 let NumMicroOps = 3;
1341 let ResourceCycles = [2,1];
1342}
Craig Topper5a69a002018-03-21 06:28:42 +00001343def: InstRW<[BWWriteResGroup94], (instregex "VBLENDVPDYrm",
1344 "VBLENDVPSYrm",
1345 "VMASKMOVPDYrm",
1346 "VMASKMOVPSYrm",
1347 "VPBLENDVBYrm",
1348 "VPMASKMOVDYrm",
1349 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001350
1351def BWWriteResGroup95 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1352 let Latency = 8;
1353 let NumMicroOps = 4;
1354 let ResourceCycles = [2,1,1];
1355}
Craig Topper5a69a002018-03-21 06:28:42 +00001356def: InstRW<[BWWriteResGroup95], (instregex "VPSLLVDrm",
1357 "VPSRAVDrm",
1358 "VPSRLVDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001359
Gadi Haber323f2e12017-10-24 20:19:47 +00001360def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1361 let Latency = 8;
1362 let NumMicroOps = 5;
1363 let ResourceCycles = [1,1,1,2];
1364}
Craig Topper5a69a002018-03-21 06:28:42 +00001365def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1366 "RCL(8|16|32|64)mi",
1367 "RCR(8|16|32|64)m1",
1368 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001369
1370def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1371 let Latency = 8;
1372 let NumMicroOps = 5;
1373 let ResourceCycles = [1,1,2,1];
1374}
Craig Topper13a16502018-03-19 00:56:09 +00001375def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001376
1377def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1378 let Latency = 8;
1379 let NumMicroOps = 6;
1380 let ResourceCycles = [1,1,1,3];
1381}
Craig Topper9f834812018-04-01 21:54:24 +00001382def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001383
1384def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1385 let Latency = 8;
1386 let NumMicroOps = 6;
1387 let ResourceCycles = [1,1,1,2,1];
1388}
Craig Topper9f834812018-04-01 21:54:24 +00001389def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001390 "CMPXCHG(8|16|32|64)rm",
1391 "ROL(8|16|32|64)mCL",
1392 "SAR(8|16|32|64)mCL",
1393 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001394 "SHL(8|16|32|64)mCL",
1395 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001396def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1397 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001398
1399def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1400 let Latency = 9;
1401 let NumMicroOps = 2;
1402 let ResourceCycles = [1,1];
1403}
Craig Topper5a69a002018-03-21 06:28:42 +00001404def: InstRW<[BWWriteResGroup101], (instregex "ADD_F32m",
1405 "ADD_F64m",
1406 "ILD_F16m",
1407 "ILD_F32m",
1408 "ILD_F64m",
1409 "SUBR_F32m",
1410 "SUBR_F64m",
1411 "SUB_F32m",
1412 "SUB_F64m",
1413 "VADDPDYrm",
1414 "VADDPSYrm",
1415 "VADDSUBPDYrm",
1416 "VADDSUBPSYrm",
1417 "VCMPPDYrmi",
1418 "VCMPPSYrmi",
Craig Topper5a69a002018-03-21 06:28:42 +00001419 "VCVTPS2DQYrm",
1420 "VCVTTPS2DQYrm",
1421 "VMAX(C?)PDYrm",
1422 "VMAX(C?)PSYrm",
1423 "VMIN(C?)PDYrm",
1424 "VMIN(C?)PSYrm",
1425 "VSUBPDYrm",
1426 "VSUBPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001427
1428def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1429 let Latency = 9;
1430 let NumMicroOps = 2;
1431 let ResourceCycles = [1,1];
1432}
Craig Topper5a69a002018-03-21 06:28:42 +00001433def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1434 "VPERM2I128rm",
1435 "VPERMDYrm",
1436 "VPERMPDYmi",
1437 "VPERMPSYrm",
1438 "VPERMQYmi",
1439 "VPMOVZXBDYrm",
1440 "VPMOVZXBQYrm",
1441 "VPMOVZXBWYrm",
1442 "VPMOVZXDQYrm",
1443 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001444
1445def BWWriteResGroup103 : SchedWriteRes<[BWPort01,BWPort23]> {
1446 let Latency = 9;
1447 let NumMicroOps = 2;
1448 let ResourceCycles = [1,1];
1449}
Craig Topper5a69a002018-03-21 06:28:42 +00001450def: InstRW<[BWWriteResGroup103], (instregex "VMULPDYrm",
1451 "VMULPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001452
1453def BWWriteResGroup104 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1454 let Latency = 9;
1455 let NumMicroOps = 3;
1456 let ResourceCycles = [1,1,1];
1457}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001458def: InstRW<[BWWriteResGroup104], (instregex "(V?)DPPDrri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001459
1460def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1461 let Latency = 9;
1462 let NumMicroOps = 3;
1463 let ResourceCycles = [1,1,1];
1464}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001465def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1466 "(V?)CVTSD2SIrm",
1467 "(V?)CVTSS2SI64rm",
1468 "(V?)CVTSS2SIrm",
1469 "(V?)CVTTSD2SI64rm",
1470 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001471 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001472 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001473
1474def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1475 let Latency = 9;
1476 let NumMicroOps = 3;
1477 let ResourceCycles = [1,1,1];
1478}
1479def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1480
1481def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1482 let Latency = 9;
1483 let NumMicroOps = 3;
1484 let ResourceCycles = [1,1,1];
1485}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001486def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001487def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001488 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001489 "CVTTPD2DQrm",
1490 "MMX_CVTPD2PIirm",
1491 "MMX_CVTPI2PDirm",
1492 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001493 "(V?)CVTDQ2PDrm",
1494 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001495
1496def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1497 let Latency = 9;
1498 let NumMicroOps = 3;
1499 let ResourceCycles = [1,1,1];
1500}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001501def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1502 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001503
1504def BWWriteResGroup109 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1505 let Latency = 9;
1506 let NumMicroOps = 4;
1507 let ResourceCycles = [2,1,1];
1508}
Craig Topper5a69a002018-03-21 06:28:42 +00001509def: InstRW<[BWWriteResGroup109], (instregex "VPSLLVDYrm",
1510 "VPSRAVDYrm",
1511 "VPSRLVDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001512
1513def BWWriteResGroup110 : SchedWriteRes<[BWPort5,BWPort23,BWPort15]> {
1514 let Latency = 9;
1515 let NumMicroOps = 4;
1516 let ResourceCycles = [2,1,1];
1517}
Craig Topper5a69a002018-03-21 06:28:42 +00001518def: InstRW<[BWWriteResGroup110], (instregex "VPHADDDYrm",
1519 "VPHADDSWYrm",
1520 "VPHADDWYrm",
1521 "VPHSUBDYrm",
1522 "VPHSUBSWYrm",
1523 "VPHSUBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001524
1525def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1526 let Latency = 9;
1527 let NumMicroOps = 4;
1528 let ResourceCycles = [1,1,1,1];
1529}
Craig Topper5a69a002018-03-21 06:28:42 +00001530def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1531 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001532
1533def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1534 let Latency = 9;
1535 let NumMicroOps = 5;
1536 let ResourceCycles = [1,1,3];
1537}
1538def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1539
1540def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1541 let Latency = 9;
1542 let NumMicroOps = 5;
1543 let ResourceCycles = [1,2,1,1];
1544}
Craig Topper5a69a002018-03-21 06:28:42 +00001545def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1546 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001547
Gadi Haber323f2e12017-10-24 20:19:47 +00001548def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1549 let Latency = 10;
1550 let NumMicroOps = 2;
1551 let ResourceCycles = [1,1];
1552}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001553def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001554
Gadi Haber323f2e12017-10-24 20:19:47 +00001555def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1556 let Latency = 10;
1557 let NumMicroOps = 3;
1558 let ResourceCycles = [2,1];
1559}
Craig Topper5a69a002018-03-21 06:28:42 +00001560def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1561 "FICOM32m",
1562 "FICOMP16m",
1563 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001564
1565def BWWriteResGroup118 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1566 let Latency = 10;
1567 let NumMicroOps = 3;
1568 let ResourceCycles = [1,1,1];
1569}
1570def: InstRW<[BWWriteResGroup118], (instregex "VPTESTYrm")>;
1571
Gadi Haber323f2e12017-10-24 20:19:47 +00001572def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1573 let Latency = 10;
1574 let NumMicroOps = 4;
1575 let ResourceCycles = [1,1,1,1];
1576}
1577def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1578
1579def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001580 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001581 let NumMicroOps = 4;
1582 let ResourceCycles = [1,1,1,1];
1583}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001584def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001585
Craig Topper8104f262018-04-02 05:33:28 +00001586def BWWriteResGroup122 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001587 let Latency = 11;
1588 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001589 let ResourceCycles = [1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001590}
Craig Topper8104f262018-04-02 05:33:28 +00001591def: InstRW<[BWWriteResGroup122], (instregex "(V?)DIVPSrr")>;
1592
1593def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1594 let Latency = 11;
1595 let NumMicroOps = 1;
1596 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1597}
1598def: InstRW<[BWWriteResGroup122_1], (instregex "(V?)DIVSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001599
1600def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1601 let Latency = 11;
1602 let NumMicroOps = 2;
1603 let ResourceCycles = [1,1];
1604}
Craig Topper5a69a002018-03-21 06:28:42 +00001605def: InstRW<[BWWriteResGroup123], (instregex "MUL_F32m",
1606 "MUL_F64m",
1607 "VPCMPGTQYrm",
1608 "VPMADDUBSWYrm",
1609 "VPMADDWDYrm",
1610 "VPMULDQYrm",
1611 "VPMULHRSWYrm",
1612 "VPMULHUWYrm",
1613 "VPMULHWYrm",
1614 "VPMULLWYrm",
1615 "VPMULUDQYrm",
1616 "VPSADBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001617
Gadi Haber323f2e12017-10-24 20:19:47 +00001618def BWWriteResGroup126 : SchedWriteRes<[BWPort0,BWPort015]> {
1619 let Latency = 11;
1620 let NumMicroOps = 3;
1621 let ResourceCycles = [2,1];
1622}
Craig Topper5a69a002018-03-21 06:28:42 +00001623def: InstRW<[BWWriteResGroup126], (instregex "VRCPPSYr",
1624 "VRSQRTPSYr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001625
1626def BWWriteResGroup127 : SchedWriteRes<[BWPort1,BWPort23]> {
1627 let Latency = 11;
1628 let NumMicroOps = 3;
1629 let ResourceCycles = [2,1];
1630}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001631def: InstRW<[BWWriteResGroup127], (instregex "(V?)ROUNDPDm",
1632 "(V?)ROUNDPSm",
1633 "(V?)ROUNDSDm",
1634 "(V?)ROUNDSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001635
1636def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1637 let Latency = 11;
1638 let NumMicroOps = 3;
1639 let ResourceCycles = [1,1,1];
1640}
1641def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1642
1643def BWWriteResGroup129 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1644 let Latency = 11;
1645 let NumMicroOps = 4;
1646 let ResourceCycles = [1,2,1];
1647}
Craig Topper5a69a002018-03-21 06:28:42 +00001648def: InstRW<[BWWriteResGroup129], (instregex "VHADDPDYrm",
1649 "VHADDPSYrm",
1650 "VHSUBPDYrm",
1651 "VHSUBPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001652
1653def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1654 let Latency = 11;
1655 let NumMicroOps = 6;
1656 let ResourceCycles = [1,1,1,1,2];
1657}
Craig Topper5a69a002018-03-21 06:28:42 +00001658def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1659 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001660
1661def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1662 let Latency = 11;
1663 let NumMicroOps = 7;
1664 let ResourceCycles = [2,2,3];
1665}
Craig Topper5a69a002018-03-21 06:28:42 +00001666def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1667 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001668
1669def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1670 let Latency = 11;
1671 let NumMicroOps = 9;
1672 let ResourceCycles = [1,4,1,3];
1673}
1674def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1675
1676def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1677 let Latency = 11;
1678 let NumMicroOps = 11;
1679 let ResourceCycles = [2,9];
1680}
Craig Topper2d451e72018-03-18 08:38:06 +00001681def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1682def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001683
Gadi Haber323f2e12017-10-24 20:19:47 +00001684def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1685 let Latency = 12;
1686 let NumMicroOps = 3;
1687 let ResourceCycles = [2,1];
1688}
Craig Topper5a69a002018-03-21 06:28:42 +00001689def: InstRW<[BWWriteResGroup135], (instregex "ADD_FI16m",
1690 "ADD_FI32m",
1691 "SUBR_FI16m",
1692 "SUBR_FI32m",
1693 "SUB_FI16m",
1694 "SUB_FI32m",
Craig Topper40d3b322018-03-22 21:55:20 +00001695 "VROUNDPDYm",
1696 "VROUNDPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001697
Craig Topper8104f262018-04-02 05:33:28 +00001698def BWWriteResGroup137 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001699 let Latency = 11;
Gadi Haber323f2e12017-10-24 20:19:47 +00001700 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001701 let ResourceCycles = [1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001702}
Craig Topper8104f262018-04-02 05:33:28 +00001703def: InstRW<[BWWriteResGroup137], (instregex "(V?)SQRTPSr")>;
1704
1705def BWWriteResGroup137_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1706 let Latency = 11;
1707 let NumMicroOps = 1;
1708 let ResourceCycles = [1,4];
1709}
1710def: InstRW<[BWWriteResGroup137_1], (instregex "(V?)SQRTSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001711
1712def BWWriteResGroup138 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1713 let Latency = 13;
1714 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001715 let ResourceCycles = [1,2,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001716}
1717def: InstRW<[BWWriteResGroup138], (instregex "VMPSADBWYrmi")>;
1718
Craig Topper8104f262018-04-02 05:33:28 +00001719def BWWriteResGroup139 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001720 let Latency = 14;
1721 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001722 let ResourceCycles = [1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001723}
Craig Topper8104f262018-04-02 05:33:28 +00001724def: InstRW<[BWWriteResGroup139], (instregex "(V?)DIVPDrr")>;
1725
1726def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1727 let Latency = 14;
1728 let NumMicroOps = 1;
1729 let ResourceCycles = [1,4];
1730}
1731def: InstRW<[BWWriteResGroup139_1], (instregex "(V?)DIVSDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001732
Gadi Haber323f2e12017-10-24 20:19:47 +00001733def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1734 let Latency = 14;
1735 let NumMicroOps = 3;
1736 let ResourceCycles = [1,1,1];
1737}
Craig Topper5a69a002018-03-21 06:28:42 +00001738def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI16m",
1739 "MUL_FI32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001740
1741def BWWriteResGroup142 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1742 let Latency = 14;
1743 let NumMicroOps = 4;
1744 let ResourceCycles = [2,1,1];
1745}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001746def: InstRW<[BWWriteResGroup142], (instregex "(V?)DPPS(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001747
1748def BWWriteResGroup143 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1749 let Latency = 14;
1750 let NumMicroOps = 4;
1751 let ResourceCycles = [1,1,1,1];
1752}
Craig Topper5a69a002018-03-21 06:28:42 +00001753def: InstRW<[BWWriteResGroup143], (instregex "(V?)DPPDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001754
1755def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1756 let Latency = 14;
1757 let NumMicroOps = 8;
1758 let ResourceCycles = [2,2,1,3];
1759}
1760def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1761
1762def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1763 let Latency = 14;
1764 let NumMicroOps = 10;
1765 let ResourceCycles = [2,3,1,4];
1766}
1767def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1768
1769def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1770 let Latency = 14;
1771 let NumMicroOps = 12;
1772 let ResourceCycles = [2,1,4,5];
1773}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001774def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001775
1776def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1777 let Latency = 15;
1778 let NumMicroOps = 1;
1779 let ResourceCycles = [1];
1780}
Craig Topper5a69a002018-03-21 06:28:42 +00001781def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1782 "DIVR_FST0r",
1783 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001784
Gadi Haber323f2e12017-10-24 20:19:47 +00001785def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1786 let Latency = 15;
1787 let NumMicroOps = 10;
1788 let ResourceCycles = [1,1,1,4,1,2];
1789}
Craig Topper13a16502018-03-19 00:56:09 +00001790def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001791
Craig Topper8104f262018-04-02 05:33:28 +00001792def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001793 let Latency = 16;
1794 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001795 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001796}
Craig Topper5a69a002018-03-21 06:28:42 +00001797def: InstRW<[BWWriteResGroup150], (instregex "(V?)DIVPSrm",
1798 "(V?)DIVSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001799
1800def BWWriteResGroup151 : SchedWriteRes<[BWPort0,BWPort23]> {
1801 let Latency = 16;
1802 let NumMicroOps = 3;
1803 let ResourceCycles = [2,1];
1804}
1805def: InstRW<[BWWriteResGroup151], (instregex "VPMULLDYrm")>;
1806
Gadi Haber323f2e12017-10-24 20:19:47 +00001807def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1808 let Latency = 16;
1809 let NumMicroOps = 14;
1810 let ResourceCycles = [1,1,1,4,2,5];
1811}
1812def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1813
1814def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1815 let Latency = 16;
1816 let NumMicroOps = 16;
1817 let ResourceCycles = [16];
1818}
Craig Topper5a69a002018-03-21 06:28:42 +00001819def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001820
Craig Topper8104f262018-04-02 05:33:28 +00001821def BWWriteResGroup155 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001822 let Latency = 17;
1823 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001824 let ResourceCycles = [2,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001825}
1826def: InstRW<[BWWriteResGroup155], (instregex "VDIVPSYrr")>;
1827
1828def BWWriteResGroup156 : SchedWriteRes<[BWPort0,BWPort23,BWPort015]> {
1829 let Latency = 17;
1830 let NumMicroOps = 4;
1831 let ResourceCycles = [2,1,1];
1832}
Craig Topper5a69a002018-03-21 06:28:42 +00001833def: InstRW<[BWWriteResGroup156], (instregex "VRCPPSYm",
1834 "VRSQRTPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001835
Craig Topper8104f262018-04-02 05:33:28 +00001836def BWWriteResGroup157 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001837 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001838 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001839 let ResourceCycles = [1,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001840}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001841def: InstRW<[BWWriteResGroup157], (instregex "(V?)SQRTPSm",
1842 "(V?)SQRTSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001843
Gadi Haber323f2e12017-10-24 20:19:47 +00001844def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1845 let Latency = 18;
1846 let NumMicroOps = 8;
1847 let ResourceCycles = [1,1,1,5];
1848}
Craig Topper5a69a002018-03-21 06:28:42 +00001849def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001850def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001851
1852def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1853 let Latency = 18;
1854 let NumMicroOps = 11;
1855 let ResourceCycles = [2,1,1,3,1,3];
1856}
Craig Topper13a16502018-03-19 00:56:09 +00001857def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001858
Craig Topper8104f262018-04-02 05:33:28 +00001859def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001860 let Latency = 19;
1861 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001862 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001863}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001864def: InstRW<[BWWriteResGroup161], (instregex "(V?)DIVPDrm",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001865 "(V?)DIVSDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001866
Gadi Haber323f2e12017-10-24 20:19:47 +00001867def BWWriteResGroup163 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1868 let Latency = 19;
1869 let NumMicroOps = 5;
1870 let ResourceCycles = [2,1,1,1];
1871}
Craig Topper5a69a002018-03-21 06:28:42 +00001872def: InstRW<[BWWriteResGroup163], (instregex "(V?)DPPSrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001873
Gadi Haber323f2e12017-10-24 20:19:47 +00001874def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1875 let Latency = 20;
1876 let NumMicroOps = 1;
1877 let ResourceCycles = [1];
1878}
Craig Topper5a69a002018-03-21 06:28:42 +00001879def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1880 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001881 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001882
1883def BWWriteResGroup166 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1884 let Latency = 20;
1885 let NumMicroOps = 5;
1886 let ResourceCycles = [2,1,1,1];
1887}
1888def: InstRW<[BWWriteResGroup166], (instregex "VDPPSYrmi")>;
1889
1890def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1891 let Latency = 20;
1892 let NumMicroOps = 8;
1893 let ResourceCycles = [1,1,1,1,1,1,2];
1894}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001895def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001896
Craig Topper8104f262018-04-02 05:33:28 +00001897def BWWriteResGroup168 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001898 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001899 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001900 let ResourceCycles = [1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001901}
Craig Topper8104f262018-04-02 05:33:28 +00001902def: InstRW<[BWWriteResGroup168], (instregex "(V?)SQRTPDr")>;
1903
1904def BWWriteResGroup168_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1905 let Latency = 16;
1906 let NumMicroOps = 1;
1907 let ResourceCycles = [1,8];
1908}
1909def: InstRW<[BWWriteResGroup168_1], (instregex "(V?)SQRTSDr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001910
1911def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1912 let Latency = 21;
1913 let NumMicroOps = 2;
1914 let ResourceCycles = [1,1];
1915}
Craig Topper5a69a002018-03-21 06:28:42 +00001916def: InstRW<[BWWriteResGroup169], (instregex "DIV_F32m",
1917 "DIV_F64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001918
Craig Topper8104f262018-04-02 05:33:28 +00001919def BWWriteResGroup170 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001920 let Latency = 21;
1921 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001922 let ResourceCycles = [2,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001923}
1924def: InstRW<[BWWriteResGroup170], (instregex "VSQRTPSYr")>;
1925
1926def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1927 let Latency = 21;
1928 let NumMicroOps = 19;
1929 let ResourceCycles = [2,1,4,1,1,4,6];
1930}
1931def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1932
1933def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1934 let Latency = 22;
1935 let NumMicroOps = 18;
1936 let ResourceCycles = [1,1,16];
1937}
1938def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1939
Craig Topper8104f262018-04-02 05:33:28 +00001940def BWWriteResGroup173 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001941 let Latency = 23;
1942 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001943 let ResourceCycles = [2,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001944}
1945def: InstRW<[BWWriteResGroup173], (instregex "VDIVPDYrr")>;
1946
Craig Topper8104f262018-04-02 05:33:28 +00001947def BWWriteResGroup174 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001948 let Latency = 23;
1949 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001950 let ResourceCycles = [2,1,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001951}
1952def: InstRW<[BWWriteResGroup174], (instregex "VDIVPSYrm")>;
1953
Gadi Haber323f2e12017-10-24 20:19:47 +00001954def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1955 let Latency = 23;
1956 let NumMicroOps = 19;
1957 let ResourceCycles = [3,1,15];
1958}
Craig Topper391c6f92017-12-10 01:24:08 +00001959def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001960
1961def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1962 let Latency = 24;
1963 let NumMicroOps = 3;
1964 let ResourceCycles = [1,1,1];
1965}
Craig Topper5a69a002018-03-21 06:28:42 +00001966def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI16m",
1967 "DIV_FI32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001968
Craig Topper8104f262018-04-02 05:33:28 +00001969def BWWriteResGroup179 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001970 let Latency = 21;
Gadi Haber323f2e12017-10-24 20:19:47 +00001971 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001972 let ResourceCycles = [1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001973}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001974def: InstRW<[BWWriteResGroup179], (instregex "(V?)SQRTPDm",
1975 "(V?)SQRTSDm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001976
1977def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1978 let Latency = 26;
1979 let NumMicroOps = 2;
1980 let ResourceCycles = [1,1];
1981}
Craig Topper5a69a002018-03-21 06:28:42 +00001982def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F32m",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001983 "DIVR_F64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001984
Craig Topper8104f262018-04-02 05:33:28 +00001985def BWWriteResGroup181 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001986 let Latency = 27;
1987 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001988 let ResourceCycles = [2,1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001989}
1990def: InstRW<[BWWriteResGroup181], (instregex "VSQRTPSYm")>;
1991
1992def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1993 let Latency = 29;
1994 let NumMicroOps = 3;
1995 let ResourceCycles = [1,1,1];
1996}
Craig Topper5a69a002018-03-21 06:28:42 +00001997def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI16m",
1998 "DIVR_FI32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001999
Craig Topper8104f262018-04-02 05:33:28 +00002000def BWWriteResGroup183 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00002001 let Latency = 29;
2002 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00002003 let ResourceCycles = [2,1,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00002004}
2005def: InstRW<[BWWriteResGroup183], (instregex "VDIVPDYrm")>;
2006
2007def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
2008 let Latency = 22;
2009 let NumMicroOps = 7;
2010 let ResourceCycles = [1,3,2,1];
2011}
Craig Topper17a31182017-12-16 18:35:29 +00002012def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002013
2014def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
2015 let Latency = 23;
2016 let NumMicroOps = 9;
2017 let ResourceCycles = [1,3,4,1];
2018}
Craig Topper17a31182017-12-16 18:35:29 +00002019def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002020
2021def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
2022 let Latency = 24;
2023 let NumMicroOps = 9;
2024 let ResourceCycles = [1,5,2,1];
2025}
Craig Topper17a31182017-12-16 18:35:29 +00002026def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002027
2028def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
2029 let Latency = 25;
2030 let NumMicroOps = 7;
2031 let ResourceCycles = [1,3,2,1];
2032}
Craig Topper17a31182017-12-16 18:35:29 +00002033def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
2034 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002035
2036def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
2037 let Latency = 26;
2038 let NumMicroOps = 9;
2039 let ResourceCycles = [1,5,2,1];
2040}
Craig Topper17a31182017-12-16 18:35:29 +00002041def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002042
2043def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
2044 let Latency = 26;
2045 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00002046 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00002047}
Craig Topper17a31182017-12-16 18:35:29 +00002048def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002049
2050def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
2051 let Latency = 27;
2052 let NumMicroOps = 9;
2053 let ResourceCycles = [1,5,2,1];
2054}
Craig Topper17a31182017-12-16 18:35:29 +00002055def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002056
Gadi Haber323f2e12017-10-24 20:19:47 +00002057def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
2058 let Latency = 29;
2059 let NumMicroOps = 27;
2060 let ResourceCycles = [1,5,1,1,19];
2061}
2062def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
2063
2064def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
2065 let Latency = 30;
2066 let NumMicroOps = 28;
2067 let ResourceCycles = [1,6,1,1,19];
2068}
Craig Topper2d451e72018-03-18 08:38:06 +00002069def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002070
2071def BWWriteResGroup187 : SchedWriteRes<[BWPort01,BWPort15,BWPort015,BWPort0156]> {
2072 let Latency = 31;
2073 let NumMicroOps = 31;
2074 let ResourceCycles = [8,1,21,1];
2075}
2076def: InstRW<[BWWriteResGroup187], (instregex "MMX_EMMS")>;
2077
Craig Topper8104f262018-04-02 05:33:28 +00002078def BWWriteResGroup189 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
2079 let Latency = 29;
Gadi Haber323f2e12017-10-24 20:19:47 +00002080 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00002081 let ResourceCycles = [2,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00002082}
2083def: InstRW<[BWWriteResGroup189], (instregex "VSQRTPDYr")>;
2084
2085def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
2086 let Latency = 34;
2087 let NumMicroOps = 8;
2088 let ResourceCycles = [2,2,2,1,1];
2089}
Craig Topper13a16502018-03-19 00:56:09 +00002090def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002091
2092def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
2093 let Latency = 34;
2094 let NumMicroOps = 23;
2095 let ResourceCycles = [1,5,3,4,10];
2096}
Craig Topper5a69a002018-03-21 06:28:42 +00002097def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
2098 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002099
2100def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
2101 let Latency = 35;
2102 let NumMicroOps = 8;
2103 let ResourceCycles = [2,2,2,1,1];
2104}
Craig Topper13a16502018-03-19 00:56:09 +00002105def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002106
2107def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
2108 let Latency = 35;
2109 let NumMicroOps = 23;
2110 let ResourceCycles = [1,5,2,1,4,10];
2111}
Craig Topper5a69a002018-03-21 06:28:42 +00002112def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
2113 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002114
Craig Topper8104f262018-04-02 05:33:28 +00002115def BWWriteResGroup195 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
2116 let Latency = 35;
Gadi Haber323f2e12017-10-24 20:19:47 +00002117 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00002118 let ResourceCycles = [2,1,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00002119}
2120def: InstRW<[BWWriteResGroup195], (instregex "VSQRTPDYm")>;
2121
2122def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
2123 let Latency = 42;
2124 let NumMicroOps = 22;
2125 let ResourceCycles = [2,20];
2126}
Craig Topper2d451e72018-03-18 08:38:06 +00002127def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002128
2129def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
2130 let Latency = 60;
2131 let NumMicroOps = 64;
2132 let ResourceCycles = [2,2,8,1,10,2,39];
2133}
2134def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002135
2136def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
2137 let Latency = 63;
2138 let NumMicroOps = 88;
2139 let ResourceCycles = [4,4,31,1,2,1,45];
2140}
Craig Topper2d451e72018-03-18 08:38:06 +00002141def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002142
2143def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
2144 let Latency = 63;
2145 let NumMicroOps = 90;
2146 let ResourceCycles = [4,2,33,1,2,1,47];
2147}
Craig Topper2d451e72018-03-18 08:38:06 +00002148def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002149
2150def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
2151 let Latency = 75;
2152 let NumMicroOps = 15;
2153 let ResourceCycles = [6,3,6];
2154}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00002155def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002156
2157def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
2158 let Latency = 80;
2159 let NumMicroOps = 32;
2160 let ResourceCycles = [7,7,3,3,1,11];
2161}
2162def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
2163
2164def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
2165 let Latency = 115;
2166 let NumMicroOps = 100;
2167 let ResourceCycles = [9,9,11,8,1,11,21,30];
2168}
2169def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002170
2171} // SchedModel
2172