blob: daa624492bc1b27aaa28c330809167933e7b9d9c [file] [log] [blame]
Gadi Haber323f2e12017-10-24 20:19:47 +00001//=- X86SchedBroadwell.td - X86 Broadwell Scheduling ---------*- tablegen -*-=//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the machine model for Broadwell to support instruction
11// scheduling and other instruction cost heuristics.
12//
13//===----------------------------------------------------------------------===//
14def BroadwellModel : SchedMachineModel {
Simon Pilgrimf7d2a932018-04-24 13:21:41 +000015 // All x86 instructions are modeled as a single micro-op, and BW can decode 4
Gadi Haber323f2e12017-10-24 20:19:47 +000016 // instructions per cycle.
17 let IssueWidth = 4;
18 let MicroOpBufferSize = 192; // Based on the reorder buffer.
19 let LoadLatency = 5;
20 let MispredictPenalty = 16;
21
22 // Based on the LSD (loop-stream detector) queue size and benchmarking data.
23 let LoopMicroOpBufferSize = 50;
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000024
Simon Pilgrimc21deec2018-03-24 19:37:28 +000025 // This flag is set to allow the scheduler to assign a default model to
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000026 // unrecognized opcodes.
27 let CompleteModel = 0;
Gadi Haber323f2e12017-10-24 20:19:47 +000028}
29
30let SchedModel = BroadwellModel in {
31
32// Broadwell can issue micro-ops to 8 different ports in one cycle.
33
34// Ports 0, 1, 5, and 6 handle all computation.
35// Port 4 gets the data half of stores. Store data can be available later than
36// the store address, but since we don't model the latency of stores, we can
37// ignore that.
38// Ports 2 and 3 are identical. They handle loads and the address half of
39// stores. Port 7 can handle address calculations.
40def BWPort0 : ProcResource<1>;
41def BWPort1 : ProcResource<1>;
42def BWPort2 : ProcResource<1>;
43def BWPort3 : ProcResource<1>;
44def BWPort4 : ProcResource<1>;
45def BWPort5 : ProcResource<1>;
46def BWPort6 : ProcResource<1>;
47def BWPort7 : ProcResource<1>;
48
49// Many micro-ops are capable of issuing on multiple ports.
50def BWPort01 : ProcResGroup<[BWPort0, BWPort1]>;
51def BWPort23 : ProcResGroup<[BWPort2, BWPort3]>;
52def BWPort237 : ProcResGroup<[BWPort2, BWPort3, BWPort7]>;
53def BWPort04 : ProcResGroup<[BWPort0, BWPort4]>;
54def BWPort05 : ProcResGroup<[BWPort0, BWPort5]>;
55def BWPort06 : ProcResGroup<[BWPort0, BWPort6]>;
56def BWPort15 : ProcResGroup<[BWPort1, BWPort5]>;
57def BWPort16 : ProcResGroup<[BWPort1, BWPort6]>;
58def BWPort56 : ProcResGroup<[BWPort5, BWPort6]>;
59def BWPort015 : ProcResGroup<[BWPort0, BWPort1, BWPort5]>;
60def BWPort056 : ProcResGroup<[BWPort0, BWPort5, BWPort6]>;
61def BWPort0156: ProcResGroup<[BWPort0, BWPort1, BWPort5, BWPort6]>;
62
63// 60 Entry Unified Scheduler
64def BWPortAny : ProcResGroup<[BWPort0, BWPort1, BWPort2, BWPort3, BWPort4,
65 BWPort5, BWPort6, BWPort7]> {
66 let BufferSize=60;
67}
68
Simon Pilgrim30c38c32018-03-19 14:46:07 +000069// Integer division issued on port 0.
Craig Topper8104f262018-04-02 05:33:28 +000070def BWDivider : ProcResource<1>;
71// FP division and sqrt on port 0.
72def BWFPDivider : ProcResource<1>;
Simon Pilgrim30c38c32018-03-19 14:46:07 +000073
Gadi Haber323f2e12017-10-24 20:19:47 +000074// Loads are 5 cycles, so ReadAfterLd registers needn't be available until 5
75// cycles after the memory operand.
76def : ReadAdvance<ReadAfterLd, 5>;
77
78// Many SchedWrites are defined in pairs with and without a folded load.
79// Instructions with folded loads are usually micro-fused, so they only appear
80// as two micro-ops when queued in the reservation station.
81// This multiclass defines the resource usage for variants with and without
82// folded loads.
83multiclass BWWriteResPair<X86FoldableSchedWrite SchedRW,
Simon Pilgrim30c38c32018-03-19 14:46:07 +000084 list<ProcResourceKind> ExePorts,
Simon Pilgrime3547af2018-03-25 10:21:19 +000085 int Lat, list<int> Res = [1], int UOps = 1,
86 int LoadLat = 5> {
Gadi Haber323f2e12017-10-24 20:19:47 +000087 // Register variant is using a single cycle on ExePort.
Simon Pilgrim30c38c32018-03-19 14:46:07 +000088 def : WriteRes<SchedRW, ExePorts> {
89 let Latency = Lat;
90 let ResourceCycles = Res;
91 let NumMicroOps = UOps;
92 }
Gadi Haber323f2e12017-10-24 20:19:47 +000093
Simon Pilgrime3547af2018-03-25 10:21:19 +000094 // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to
95 // the latency (default = 5).
Simon Pilgrim30c38c32018-03-19 14:46:07 +000096 def : WriteRes<SchedRW.Folded, !listconcat([BWPort23], ExePorts)> {
Simon Pilgrime3547af2018-03-25 10:21:19 +000097 let Latency = !add(Lat, LoadLat);
Simon Pilgrim30c38c32018-03-19 14:46:07 +000098 let ResourceCycles = !listconcat([1], Res);
Simon Pilgrime3547af2018-03-25 10:21:19 +000099 let NumMicroOps = !add(UOps, 1);
Gadi Haber323f2e12017-10-24 20:19:47 +0000100 }
101}
102
Craig Topperf131b602018-04-06 16:16:46 +0000103// A folded store needs a cycle on port 4 for the store data, and an extra port
104// 2/3/7 cycle to recompute the address.
105def : WriteRes<WriteRMW, [BWPort237,BWPort4]>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000106
107// Arithmetic.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000108defm : BWWriteResPair<WriteALU, [BWPort0156], 1>; // Simple integer ALU op.
109defm : BWWriteResPair<WriteIMul, [BWPort1], 3>; // Integer multiplication.
110defm : BWWriteResPair<WriteIDiv, [BWPort0, BWDivider], 25, [1, 10]>;
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000111defm : BWWriteResPair<WriteCRC32, [BWPort1], 3>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000112def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, high part.
Gadi Haber323f2e12017-10-24 20:19:47 +0000113
114def : WriteRes<WriteLEA, [BWPort15]>; // LEA instructions can't fold loads.
115
Craig Topperb7baa352018-04-08 17:53:18 +0000116defm : BWWriteResPair<WriteCMOV, [BWPort06], 1>; // Conditional move.
117def : WriteRes<WriteSETCC, [BWPort06]>; // Setcc.
118def : WriteRes<WriteSETCCStore, [BWPort06,BWPort4,BWPort237]> {
119 let Latency = 2;
120 let NumMicroOps = 3;
121}
122
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000123// Bit counts.
124defm : BWWriteResPair<WriteBitScan, [BWPort1], 3>;
125defm : BWWriteResPair<WriteLZCNT, [BWPort1], 3>;
126defm : BWWriteResPair<WriteTZCNT, [BWPort1], 3>;
127defm : BWWriteResPair<WritePOPCNT, [BWPort1], 3>;
128
Gadi Haber323f2e12017-10-24 20:19:47 +0000129// Integer shifts and rotates.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000130defm : BWWriteResPair<WriteShift, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000131
Craig Topper89310f52018-03-29 20:41:39 +0000132// BMI1 BEXTR, BMI2 BZHI
133defm : BWWriteResPair<WriteBEXTR, [BWPort06,BWPort15], 2, [1,1], 2>;
134defm : BWWriteResPair<WriteBZHI, [BWPort15], 1>;
135
Gadi Haber323f2e12017-10-24 20:19:47 +0000136// Loads, stores, and moves, not folded with other operations.
137def : WriteRes<WriteLoad, [BWPort23]> { let Latency = 5; }
138def : WriteRes<WriteStore, [BWPort237, BWPort4]>;
139def : WriteRes<WriteMove, [BWPort0156]>;
140
141// Idioms that clear a register, like xorps %xmm0, %xmm0.
142// These can often bypass execution ports completely.
143def : WriteRes<WriteZero, []>;
144
Sanjoy Das1074eb22017-12-12 19:11:31 +0000145// Treat misc copies as a move.
146def : InstRW<[WriteMove], (instrs COPY)>;
147
Gadi Haber323f2e12017-10-24 20:19:47 +0000148// Branches don't produce values, so they have no latency, but they still
149// consume resources. Indirect branches can fold loads.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000150defm : BWWriteResPair<WriteJump, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000151
152// Floating point. This covers both scalar and vector operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000153def : WriteRes<WriteFLoad, [BWPort23]> { let Latency = 5; }
154def : WriteRes<WriteFStore, [BWPort237, BWPort4]>;
155def : WriteRes<WriteFMove, [BWPort5]>;
156
Simon Pilgrim86e3c2692018-04-17 07:22:44 +0000157defm : BWWriteResPair<WriteFAdd, [BWPort1], 3>; // Floating point add/sub.
158defm : BWWriteResPair<WriteFCmp, [BWPort1], 3>; // Floating point compare.
159defm : BWWriteResPair<WriteFCom, [BWPort1], 3>; // Floating point compare to flags.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000160defm : BWWriteResPair<WriteFMul, [BWPort0], 5>; // Floating point multiplication.
161defm : BWWriteResPair<WriteFDiv, [BWPort0], 12>; // 10-14 cycles. // Floating point division.
162defm : BWWriteResPair<WriteFSqrt, [BWPort0], 15>; // Floating point square root.
163defm : BWWriteResPair<WriteFRcp, [BWPort0], 5>; // Floating point reciprocal estimate.
164defm : BWWriteResPair<WriteFRsqrt, [BWPort0], 5>; // Floating point reciprocal square root estimate.
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000165defm : BWWriteResPair<WriteFMA, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add.
166defm : BWWriteResPair<WriteFMAS, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add (Scalar).
167defm : BWWriteResPair<WriteFMAY, [BWPort01], 5, [1], 1, 6>; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000168defm : BWWriteResPair<WriteFSign, [BWPort5], 1>; // Floating point fabs/fchs.
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000169defm : BWWriteResPair<WriteFLogic, [BWPort5], 1, [1], 1, 5>; // Floating point and/or/xor logicals.
170defm : BWWriteResPair<WriteFLogicY, [BWPort5], 1, [1], 1, 6>; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000171defm : BWWriteResPair<WriteFShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector shuffles.
172defm : BWWriteResPair<WriteFShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000173defm : BWWriteResPair<WriteFVarShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector variable shuffles.
174defm : BWWriteResPair<WriteFVarShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
175defm : BWWriteResPair<WriteFBlend, [BWPort015], 1, [1], 1, 5>; // Floating point vector blends.
176defm : BWWriteResPair<WriteFBlendY, [BWPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000177defm : BWWriteResPair<WriteFVarBlend, [BWPort5], 2, [2], 2, 5>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000178defm : BWWriteResPair<WriteFVarBlendY, [BWPort5], 2, [2], 2, 6>; // Fp vector variable blends.
Gadi Haber323f2e12017-10-24 20:19:47 +0000179
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000180def : WriteRes<WriteCvtF2FSt, [BWPort1,BWPort4,BWPort237]> {
181 let Latency = 4;
182 let NumMicroOps = 3;
183 let ResourceCycles = [1,1,1];
184}
185
Gadi Haber323f2e12017-10-24 20:19:47 +0000186// FMA Scheduling helper class.
187// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
188
189// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000190def : WriteRes<WriteVecLoad, [BWPort23]> { let Latency = 5; }
191def : WriteRes<WriteVecStore, [BWPort237, BWPort4]>;
192def : WriteRes<WriteVecMove, [BWPort015]>;
193
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000194defm : BWWriteResPair<WriteVecALU, [BWPort15], 1>; // Vector integer ALU op, no logicals.
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000195defm : BWWriteResPair<WriteVecLogic, [BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
196defm : BWWriteResPair<WriteVecLogicY,[BWPort015], 1, [1], 1, 6>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000197defm : BWWriteResPair<WriteVecShift, [BWPort0], 1>; // Vector integer shifts.
198defm : BWWriteResPair<WriteVecIMul, [BWPort0], 5>; // Vector integer multiply.
Craig Topper13a0f832018-03-31 04:54:32 +0000199defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // PMULLD
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000200defm : BWWriteResPair<WriteShuffle, [BWPort5], 1>; // Vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000201defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1>; // Vector variable shuffles.
Simon Pilgrim06e16542018-04-22 18:35:53 +0000202defm : BWWriteResPair<WriteBlend, [BWPort5], 1>; // Vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000203defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000204defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim27bc83e2018-04-24 18:49:25 +0000205defm : BWWriteResPair<WritePSADBW, [BWPort0], 5>; // Vector PSADBW.
206defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000207
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000208// Vector insert/extract operations.
209def : WriteRes<WriteVecInsert, [BWPort5]> {
210 let Latency = 2;
211 let NumMicroOps = 2;
212 let ResourceCycles = [2];
213}
214def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
215 let Latency = 6;
216 let NumMicroOps = 2;
217}
218
219def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
220 let Latency = 2;
221 let NumMicroOps = 2;
222}
223def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
224 let Latency = 2;
225 let NumMicroOps = 3;
226}
227
Gadi Haber323f2e12017-10-24 20:19:47 +0000228// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000229defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
230defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
231defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000232
233// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000234
Gadi Haber323f2e12017-10-24 20:19:47 +0000235// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000236def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000237 let Latency = 11;
238 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000239 let ResourceCycles = [3];
240}
241def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000242 let Latency = 16;
243 let NumMicroOps = 4;
244 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000245}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000246
247// Packed Compare Explicit Length Strings, Return Mask
248def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
249 let Latency = 19;
250 let NumMicroOps = 9;
251 let ResourceCycles = [4,3,1,1];
252}
253def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
254 let Latency = 24;
255 let NumMicroOps = 10;
256 let ResourceCycles = [4,3,1,1,1];
257}
258
259// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000260def : WriteRes<WritePCmpIStrI, [BWPort0]> {
261 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000262 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000263 let ResourceCycles = [3];
264}
265def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000266 let Latency = 16;
267 let NumMicroOps = 4;
268 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000269}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000270
271// Packed Compare Explicit Length Strings, Return Index
272def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
273 let Latency = 18;
274 let NumMicroOps = 8;
275 let ResourceCycles = [4,3,1];
276}
277def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
278 let Latency = 23;
279 let NumMicroOps = 9;
280 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000281}
282
Simon Pilgrima2f26782018-03-27 20:38:54 +0000283// MOVMSK Instructions.
284def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
285def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
286def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
287
Gadi Haber323f2e12017-10-24 20:19:47 +0000288// AES instructions.
289def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
290 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000291 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000292 let ResourceCycles = [1];
293}
294def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000295 let Latency = 12;
296 let NumMicroOps = 2;
297 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000298}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000299
Gadi Haber323f2e12017-10-24 20:19:47 +0000300def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
301 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000302 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000303 let ResourceCycles = [2];
304}
305def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000306 let Latency = 19;
307 let NumMicroOps = 3;
308 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000309}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000310
311def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
312 let Latency = 29;
313 let NumMicroOps = 11;
314 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000315}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000316def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
317 let Latency = 33;
318 let NumMicroOps = 11;
319 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000320}
321
322// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000323defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000324
325// Catch-all for expensive system instructions.
326def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
327
328// AVX2.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000329defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3>; // Fp 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000330defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3>; // Fp 256-bit width vector variable shuffles.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000331defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3>; // 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000332defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3>; // 256-bit width vector variable shuffles.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000333defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 2, [2, 1]>; // Variable vector shifts.
Gadi Haber323f2e12017-10-24 20:19:47 +0000334
335// Old microcoded instructions that nobody use.
336def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
337
338// Fence instructions.
339def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
340
Craig Topper05242bf2018-04-21 18:07:36 +0000341// Load/store MXCSR.
342def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
343def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
344
Gadi Haber323f2e12017-10-24 20:19:47 +0000345// Nop, not very useful expect it provides a model for nops!
346def : WriteRes<WriteNop, []>;
347
348////////////////////////////////////////////////////////////////////////////////
349// Horizontal add/sub instructions.
350////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000351
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000352defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000353defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000354defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000355
356// Remaining instrs.
357
358def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
359 let Latency = 1;
360 let NumMicroOps = 1;
361 let ResourceCycles = [1];
362}
Craig Topper5a69a002018-03-21 06:28:42 +0000363def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
364 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000365 "(V?)MOVPDI2DIrr",
366 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000367 "VPSLLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000368 "VPSRLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000369 "VTESTPD(Y?)rr",
370 "VTESTPS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000371
372def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
373 let Latency = 1;
374 let NumMicroOps = 1;
375 let ResourceCycles = [1];
376}
Craig Topper5a69a002018-03-21 06:28:42 +0000377def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
378 "COM_FST0r",
379 "UCOM_FPr",
380 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000381
382def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
383 let Latency = 1;
384 let NumMicroOps = 1;
385 let ResourceCycles = [1];
386}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000387def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000388 "MMX_MOVD64to64rr",
389 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000390 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000391 "(V?)MOVDI2PDIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000392
393def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
394 let Latency = 1;
395 let NumMicroOps = 1;
396 let ResourceCycles = [1];
397}
398def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
399
400def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
401 let Latency = 1;
402 let NumMicroOps = 1;
403 let ResourceCycles = [1];
404}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000405def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000406
407def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
408 let Latency = 1;
409 let NumMicroOps = 1;
410 let ResourceCycles = [1];
411}
Craig Topperfbe31322018-04-05 21:56:19 +0000412def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000413def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
414 "ADC(16|32|64)i",
415 "ADC(8|16|32|64)rr",
416 "ADCX(32|64)rr",
417 "ADOX(32|64)rr",
418 "BT(16|32|64)ri8",
419 "BT(16|32|64)rr",
420 "BTC(16|32|64)ri8",
421 "BTC(16|32|64)rr",
422 "BTR(16|32|64)ri8",
423 "BTR(16|32|64)rr",
424 "BTS(16|32|64)ri8",
425 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000426 "SBB(16|32|64)ri",
427 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000428 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000429
430def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
431 let Latency = 1;
432 let NumMicroOps = 1;
433 let ResourceCycles = [1];
434}
Craig Topper5a69a002018-03-21 06:28:42 +0000435def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
436 "BLSI(32|64)rr",
437 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000438 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000439
440def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
441 let Latency = 1;
442 let NumMicroOps = 1;
443 let ResourceCycles = [1];
444}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000445def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000446 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000447
448def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
449 let Latency = 1;
450 let NumMicroOps = 1;
451 let ResourceCycles = [1];
452}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000453def: InstRW<[BWWriteResGroup9], (instrs LAHF, SAHF)>; // TODO: This doesnt match Agner's data
454def: InstRW<[BWWriteResGroup9], (instregex "NOOP",
Craig Topper5a69a002018-03-21 06:28:42 +0000455 "SGDT64m",
456 "SIDT64m",
Craig Topper5a69a002018-03-21 06:28:42 +0000457 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000458 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000459 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000460
461def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
462 let Latency = 1;
463 let NumMicroOps = 2;
464 let ResourceCycles = [1,1];
465}
Craig Topper5a69a002018-03-21 06:28:42 +0000466def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
467 "MMX_MOVD64from64rm",
468 "MMX_MOVD64mr",
469 "MMX_MOVNTQmr",
470 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000471 "MOVNTI_64mr",
472 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000473 "ST_FP(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000474 "VEXTRACTF128mr",
475 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000476 "(V?)MOVAPD(Y?)mr",
477 "(V?)MOVAPS(Y?)mr",
478 "(V?)MOVDQA(Y?)mr",
479 "(V?)MOVDQU(Y?)mr",
480 "(V?)MOVHPDmr",
481 "(V?)MOVHPSmr",
482 "(V?)MOVLPDmr",
483 "(V?)MOVLPSmr",
484 "(V?)MOVNTDQ(V?)mr",
485 "(V?)MOVNTPD(V?)mr",
486 "(V?)MOVNTPS(V?)mr",
487 "(V?)MOVPDI2DImr",
488 "(V?)MOVPQI2QImr",
489 "(V?)MOVPQIto64mr",
490 "(V?)MOVSDmr",
491 "(V?)MOVSSmr",
492 "(V?)MOVUPD(Y?)mr",
493 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000494
Gadi Haber323f2e12017-10-24 20:19:47 +0000495def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
496 let Latency = 2;
497 let NumMicroOps = 2;
498 let ResourceCycles = [2];
499}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000500def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000501
502def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
503 let Latency = 2;
504 let NumMicroOps = 2;
505 let ResourceCycles = [2];
506}
Craig Topper5a69a002018-03-21 06:28:42 +0000507def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
508 "ROL(8|16|32|64)ri",
509 "ROR(8|16|32|64)r1",
510 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000511
512def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
513 let Latency = 2;
514 let NumMicroOps = 2;
515 let ResourceCycles = [2];
516}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000517def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
518 MFENCE,
519 WAIT,
520 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000521
522def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
523 let Latency = 2;
524 let NumMicroOps = 2;
525 let ResourceCycles = [1,1];
526}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000527def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000528 "(V?)CVTPS2PDrr",
529 "(V?)CVTSS2SDrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000530 "(V?)PSLLDrr",
531 "(V?)PSLLQrr",
532 "(V?)PSLLWrr",
533 "(V?)PSRADrr",
534 "(V?)PSRAWrr",
535 "(V?)PSRLDrr",
536 "(V?)PSRLQrr",
537 "(V?)PSRLWrr",
538 "(V?)PTESTrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000539
540def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
541 let Latency = 2;
542 let NumMicroOps = 2;
543 let ResourceCycles = [1,1];
544}
545def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
546
547def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
548 let Latency = 2;
549 let NumMicroOps = 2;
550 let ResourceCycles = [1,1];
551}
552def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
553
554def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
555 let Latency = 2;
556 let NumMicroOps = 2;
557 let ResourceCycles = [1,1];
558}
559def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
560
561def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
562 let Latency = 2;
563 let NumMicroOps = 2;
564 let ResourceCycles = [1,1];
565}
Craig Topper498875f2018-04-04 17:54:19 +0000566def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
567
568def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
569 let Latency = 1;
570 let NumMicroOps = 1;
571 let ResourceCycles = [1];
572}
573def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000574
575def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
576 let Latency = 2;
577 let NumMicroOps = 2;
578 let ResourceCycles = [1,1];
579}
Craig Topper2d451e72018-03-18 08:38:06 +0000580def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000581def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000582def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
583 "ADC8ri",
584 "CMOV(A|BE)(16|32|64)rr",
585 "SBB8i8",
586 "SBB8ri",
587 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000588
Gadi Haber323f2e12017-10-24 20:19:47 +0000589def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
590 let Latency = 2;
591 let NumMicroOps = 3;
592 let ResourceCycles = [1,1,1];
593}
594def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
595
Gadi Haber323f2e12017-10-24 20:19:47 +0000596def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
597 let Latency = 2;
598 let NumMicroOps = 3;
599 let ResourceCycles = [1,1,1];
600}
601def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
602
603def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
604 let Latency = 2;
605 let NumMicroOps = 3;
606 let ResourceCycles = [1,1,1];
607}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000608def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
609 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000610def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000611 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000612
Gadi Haber323f2e12017-10-24 20:19:47 +0000613def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
614 let Latency = 3;
615 let NumMicroOps = 1;
616 let ResourceCycles = [1];
617}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000618def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000619 "PDEP(32|64)rr",
620 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000621 "SHLD(16|32|64)rri8",
622 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000623 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000624
625def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000626 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000627 let NumMicroOps = 2;
628 let ResourceCycles = [1,1];
629}
Clement Courbet327fac42018-03-07 08:14:02 +0000630def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000631
632def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
633 let Latency = 3;
634 let NumMicroOps = 1;
635 let ResourceCycles = [1];
636}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000637def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
638 "VPBROADCASTWrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000639 "VPMOVSXBDYrr",
640 "VPMOVSXBQYrr",
641 "VPMOVSXBWYrr",
642 "VPMOVSXDQYrr",
643 "VPMOVSXWDYrr",
644 "VPMOVSXWQYrr",
645 "VPMOVZXBDYrr",
646 "VPMOVZXBQYrr",
647 "VPMOVZXBWYrr",
648 "VPMOVZXDQYrr",
649 "VPMOVZXWDYrr",
650 "VPMOVZXWQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000651
652def BWWriteResGroup29 : SchedWriteRes<[BWPort01]> {
653 let Latency = 3;
654 let NumMicroOps = 1;
655 let ResourceCycles = [1];
656}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000657def: InstRW<[BWWriteResGroup29], (instregex "(V?)MULPD(Y?)rr",
658 "(V?)MULPS(Y?)rr",
659 "(V?)MULSDrr",
660 "(V?)MULSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000661
662def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000663 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000664 let NumMicroOps = 3;
665 let ResourceCycles = [3];
666}
Craig Topperb5f26592018-04-19 18:00:17 +0000667def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
668 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
669 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000670
671def BWWriteResGroup31 : SchedWriteRes<[BWPort0,BWPort5]> {
672 let Latency = 3;
673 let NumMicroOps = 3;
674 let ResourceCycles = [2,1];
675}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000676def: InstRW<[BWWriteResGroup31], (instregex "VPSLLVD(Y?)rr",
677 "VPSRAVD(Y?)rr",
678 "VPSRLVD(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000679
Gadi Haber323f2e12017-10-24 20:19:47 +0000680def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
681 let Latency = 3;
682 let NumMicroOps = 3;
683 let ResourceCycles = [2,1];
684}
Craig Topper5a69a002018-03-21 06:28:42 +0000685def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
686 "MMX_PACKSSWBirr",
687 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000688
689def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
690 let Latency = 3;
691 let NumMicroOps = 3;
692 let ResourceCycles = [1,2];
693}
694def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
695
696def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
697 let Latency = 3;
698 let NumMicroOps = 3;
699 let ResourceCycles = [1,2];
700}
Craig Topper5a69a002018-03-21 06:28:42 +0000701def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
702 "RCL(8|16|32|64)ri",
703 "RCR(8|16|32|64)r1",
704 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000705
706def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
707 let Latency = 3;
708 let NumMicroOps = 3;
709 let ResourceCycles = [2,1];
710}
Craig Topper5a69a002018-03-21 06:28:42 +0000711def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
712 "ROR(8|16|32|64)rCL",
713 "SAR(8|16|32|64)rCL",
714 "SHL(8|16|32|64)rCL",
715 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000716
717def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
718 let Latency = 3;
719 let NumMicroOps = 4;
720 let ResourceCycles = [1,1,1,1];
721}
722def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
723
724def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
725 let Latency = 3;
726 let NumMicroOps = 4;
727 let ResourceCycles = [1,1,1,1];
728}
Craig Topper5a69a002018-03-21 06:28:42 +0000729def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
730 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000731
732def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
733 let Latency = 4;
734 let NumMicroOps = 2;
735 let ResourceCycles = [1,1];
736}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000737def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
738 "(V?)CVTSD2SIrr",
739 "(V?)CVTSS2SI64rr",
740 "(V?)CVTSS2SIrr",
741 "(V?)CVTTSD2SI64rr",
742 "(V?)CVTTSD2SIrr",
743 "(V?)CVTTSS2SI64rr",
744 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000745
746def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
747 let Latency = 4;
748 let NumMicroOps = 2;
749 let ResourceCycles = [1,1];
750}
Craig Topper5a69a002018-03-21 06:28:42 +0000751def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr",
752 "VPSLLDYrr",
753 "VPSLLQYrr",
754 "VPSLLWYrr",
755 "VPSRADYrr",
756 "VPSRAWYrr",
757 "VPSRLDYrr",
758 "VPSRLQYrr",
759 "VPSRLWYrr",
760 "VPTESTYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000761
762def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
763 let Latency = 4;
764 let NumMicroOps = 2;
765 let ResourceCycles = [1,1];
766}
767def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
768
769def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
770 let Latency = 4;
771 let NumMicroOps = 2;
772 let ResourceCycles = [1,1];
773}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000774def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000775def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000776 "MMX_CVTPI2PDirr",
777 "MMX_CVTPS2PIirr",
778 "MMX_CVTTPD2PIirr",
779 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000780 "(V?)CVTDQ2PDrr",
781 "(V?)CVTPD2DQrr",
782 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000783 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000784 "(V?)CVTSD2SSrr",
785 "(V?)CVTSI642SDrr",
786 "(V?)CVTSI2SDrr",
787 "(V?)CVTSI2SSrr",
788 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000789
790def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
791 let Latency = 4;
792 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000793 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000794}
Craig Topper5a69a002018-03-21 06:28:42 +0000795def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000796
797def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
798 let Latency = 4;
799 let NumMicroOps = 3;
800 let ResourceCycles = [1,1,1];
801}
802def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
803
804def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
805 let Latency = 4;
806 let NumMicroOps = 3;
807 let ResourceCycles = [1,1,1];
808}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000809def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
810 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000811
812def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
813 let Latency = 4;
814 let NumMicroOps = 4;
815 let ResourceCycles = [4];
816}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000817def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000818
819def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
820 let Latency = 4;
821 let NumMicroOps = 4;
822 let ResourceCycles = [1,3];
823}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000824def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000825
826def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
827 let Latency = 5;
828 let NumMicroOps = 1;
829 let ResourceCycles = [1];
830}
Simon Pilgrim74ccc6a2018-04-21 19:11:55 +0000831def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000832
Gadi Haber323f2e12017-10-24 20:19:47 +0000833def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
834 let Latency = 5;
835 let NumMicroOps = 1;
836 let ResourceCycles = [1];
837}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000838def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000839 "MOVSX(16|32|64)rm32",
840 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000841 "MOVZX(16|32|64)rm16",
842 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000843 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000844 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000845 "(V?)MOVSHDUPrm",
846 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000847 "VPBROADCASTDrm",
848 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000849
850def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
851 let Latency = 5;
852 let NumMicroOps = 3;
853 let ResourceCycles = [1,2];
854}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000855def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000856
857def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
858 let Latency = 5;
859 let NumMicroOps = 3;
860 let ResourceCycles = [1,1,1];
861}
862def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
863
864def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000865 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000866 let NumMicroOps = 3;
867 let ResourceCycles = [1,1,1];
868}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000869def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000870
871def BWWriteResGroup53 : SchedWriteRes<[BWPort0,BWPort4,BWPort237,BWPort15]> {
872 let Latency = 5;
873 let NumMicroOps = 4;
874 let ResourceCycles = [1,1,1,1];
875}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000876def: InstRW<[BWWriteResGroup53], (instregex "VMASKMOVPD(Y?)mr",
877 "VMASKMOVPS(Y?)mr",
878 "VPMASKMOVD(Y?)mr",
879 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000880
881def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
882 let Latency = 5;
883 let NumMicroOps = 5;
884 let ResourceCycles = [1,4];
885}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000886def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000887
888def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
889 let Latency = 5;
890 let NumMicroOps = 5;
891 let ResourceCycles = [1,4];
892}
893def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
894
895def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
896 let Latency = 5;
897 let NumMicroOps = 5;
898 let ResourceCycles = [2,3];
899}
Craig Topper5a69a002018-03-21 06:28:42 +0000900def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000901
902def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
903 let Latency = 5;
904 let NumMicroOps = 6;
905 let ResourceCycles = [1,1,4];
906}
Craig Topper5a69a002018-03-21 06:28:42 +0000907def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000908
909def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
910 let Latency = 6;
911 let NumMicroOps = 1;
912 let ResourceCycles = [1];
913}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000914def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000915 "VBROADCASTF128",
916 "VBROADCASTI128",
917 "VBROADCASTSDYrm",
918 "VBROADCASTSSYrm",
919 "VLDDQUYrm",
920 "VMOVAPDYrm",
921 "VMOVAPSYrm",
922 "VMOVDDUPYrm",
923 "VMOVDQAYrm",
924 "VMOVDQUYrm",
925 "VMOVNTDQAYrm",
926 "VMOVSHDUPYrm",
927 "VMOVSLDUPYrm",
928 "VMOVUPDYrm",
929 "VMOVUPSYrm",
930 "VPBROADCASTDYrm",
931 "VPBROADCASTQYrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000932 "(V?)ROUNDPD(Y?)r",
933 "(V?)ROUNDPS(Y?)r",
934 "(V?)ROUNDSDr",
935 "(V?)ROUNDSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000936
937def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
938 let Latency = 6;
939 let NumMicroOps = 2;
940 let ResourceCycles = [1,1];
941}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000942def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000943 "(V?)CVTPS2PDrm",
944 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000945 "VPSLLVQrm",
946 "VPSRLVQrm",
947 "VTESTPDrm",
948 "VTESTPSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000949
950def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
951 let Latency = 6;
952 let NumMicroOps = 2;
953 let ResourceCycles = [1,1];
954}
Craig Topper5a69a002018-03-21 06:28:42 +0000955def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
956 "VCVTPD2DQYrr",
957 "VCVTPD2PSYrr",
958 "VCVTPS2PHYrr",
959 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000960
Gadi Haber323f2e12017-10-24 20:19:47 +0000961def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
962 let Latency = 6;
963 let NumMicroOps = 2;
964 let ResourceCycles = [1,1];
965}
Craig Topper5a69a002018-03-21 06:28:42 +0000966def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
967 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000968
969def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
970 let Latency = 6;
971 let NumMicroOps = 2;
972 let ResourceCycles = [1,1];
973}
Craig Topperdfccafe2018-04-18 06:41:25 +0000974def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +0000975def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
976 ADCX32rm, ADCX64rm,
977 ADOX32rm, ADOX64rm,
978 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000979
980def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
981 let Latency = 6;
982 let NumMicroOps = 2;
983 let ResourceCycles = [1,1];
984}
Craig Topper5a69a002018-03-21 06:28:42 +0000985def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
986 "BLSI(32|64)rm",
987 "BLSMSK(32|64)rm",
988 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +0000989 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000990
991def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
992 let Latency = 6;
993 let NumMicroOps = 2;
994 let ResourceCycles = [1,1];
995}
Simon Pilgrim06e16542018-04-22 18:35:53 +0000996def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +0000997 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000998 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000999
1000def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1001 let Latency = 6;
1002 let NumMicroOps = 2;
1003 let ResourceCycles = [1,1];
1004}
Craig Topper2d451e72018-03-18 08:38:06 +00001005def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001006def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001007
1008def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1009 let Latency = 6;
1010 let NumMicroOps = 4;
1011 let ResourceCycles = [1,1,2];
1012}
Craig Topper5a69a002018-03-21 06:28:42 +00001013def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1014 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001015
1016def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1017 let Latency = 6;
1018 let NumMicroOps = 4;
1019 let ResourceCycles = [1,1,1,1];
1020}
1021def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1022
1023def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1024 let Latency = 6;
1025 let NumMicroOps = 4;
1026 let ResourceCycles = [1,1,1,1];
1027}
Craig Topper5a69a002018-03-21 06:28:42 +00001028def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1029 "BTR(16|32|64)mi8",
1030 "BTS(16|32|64)mi8",
1031 "SAR(8|16|32|64)m1",
1032 "SAR(8|16|32|64)mi",
1033 "SHL(8|16|32|64)m1",
1034 "SHL(8|16|32|64)mi",
1035 "SHR(8|16|32|64)m1",
1036 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001037
1038def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1039 let Latency = 6;
1040 let NumMicroOps = 4;
1041 let ResourceCycles = [1,1,1,1];
1042}
Craig Topperf0d04262018-04-06 16:16:48 +00001043def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1044 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001045
1046def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1047 let Latency = 6;
1048 let NumMicroOps = 6;
1049 let ResourceCycles = [1,5];
1050}
1051def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1052
Gadi Haber323f2e12017-10-24 20:19:47 +00001053def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1054 let Latency = 7;
1055 let NumMicroOps = 2;
1056 let ResourceCycles = [1,1];
1057}
Craig Topper5a69a002018-03-21 06:28:42 +00001058def: InstRW<[BWWriteResGroup73], (instregex "VPSLLDYrm",
1059 "VPSLLQYrm",
1060 "VPSLLVQYrm",
1061 "VPSLLWYrm",
1062 "VPSRADYrm",
1063 "VPSRAWYrm",
1064 "VPSRLDYrm",
1065 "VPSRLQYrm",
1066 "VPSRLVQYrm",
1067 "VPSRLWYrm",
1068 "VTESTPDYrm",
1069 "VTESTPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001070
1071def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1072 let Latency = 7;
1073 let NumMicroOps = 2;
1074 let ResourceCycles = [1,1];
1075}
Craig Topper5a69a002018-03-21 06:28:42 +00001076def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1077 "FCOM64m",
1078 "FCOMP32m",
1079 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001080
1081def BWWriteResGroup75 : SchedWriteRes<[BWPort5,BWPort23]> {
1082 let Latency = 7;
1083 let NumMicroOps = 2;
1084 let ResourceCycles = [1,1];
1085}
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +00001086def: InstRW<[BWWriteResGroup75], (instregex "VPACKSSDWYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001087 "VPACKSSWBYrm",
1088 "VPACKUSDWYrm",
1089 "VPACKUSWBYrm",
1090 "VPALIGNRYrmi",
1091 "VPBLENDWYrmi",
Craig Topper5a69a002018-03-21 06:28:42 +00001092 "VPSHUFBYrm",
1093 "VPSHUFDYmi",
1094 "VPSHUFHWYmi",
1095 "VPSHUFLWYmi",
1096 "VPUNPCKHBWYrm",
1097 "VPUNPCKHDQYrm",
1098 "VPUNPCKHQDQYrm",
1099 "VPUNPCKHWDYrm",
1100 "VPUNPCKLBWYrm",
1101 "VPUNPCKLDQYrm",
1102 "VPUNPCKLQDQYrm",
Simon Pilgrimdd8eae12018-05-01 14:25:01 +00001103 "VPUNPCKLWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001104
1105def BWWriteResGroup76 : SchedWriteRes<[BWPort23,BWPort15]> {
1106 let Latency = 7;
1107 let NumMicroOps = 2;
1108 let ResourceCycles = [1,1];
1109}
Craig Topper5a69a002018-03-21 06:28:42 +00001110def: InstRW<[BWWriteResGroup76], (instregex "VPABSBYrm",
1111 "VPABSDYrm",
1112 "VPABSWYrm",
1113 "VPADDBYrm",
1114 "VPADDDYrm",
1115 "VPADDQYrm",
1116 "VPADDSBYrm",
1117 "VPADDSWYrm",
1118 "VPADDUSBYrm",
1119 "VPADDUSWYrm",
1120 "VPADDWYrm",
1121 "VPAVGBYrm",
1122 "VPAVGWYrm",
1123 "VPCMPEQBYrm",
1124 "VPCMPEQDYrm",
1125 "VPCMPEQQYrm",
1126 "VPCMPEQWYrm",
1127 "VPCMPGTBYrm",
1128 "VPCMPGTDYrm",
1129 "VPCMPGTWYrm",
1130 "VPMAXSBYrm",
1131 "VPMAXSDYrm",
1132 "VPMAXSWYrm",
1133 "VPMAXUBYrm",
1134 "VPMAXUDYrm",
1135 "VPMAXUWYrm",
1136 "VPMINSBYrm",
1137 "VPMINSDYrm",
1138 "VPMINSWYrm",
1139 "VPMINUBYrm",
1140 "VPMINUDYrm",
1141 "VPMINUWYrm",
1142 "VPSIGNBYrm",
1143 "VPSIGNDYrm",
1144 "VPSIGNWYrm",
1145 "VPSUBBYrm",
1146 "VPSUBDYrm",
1147 "VPSUBQYrm",
1148 "VPSUBSBYrm",
1149 "VPSUBSWYrm",
1150 "VPSUBUSBYrm",
1151 "VPSUBUSWYrm",
1152 "VPSUBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001153
1154def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1155 let Latency = 7;
1156 let NumMicroOps = 2;
1157 let ResourceCycles = [1,1];
1158}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001159def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001160
Gadi Haber323f2e12017-10-24 20:19:47 +00001161def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1162 let Latency = 7;
1163 let NumMicroOps = 3;
1164 let ResourceCycles = [2,1];
1165}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001166def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001167 "MMX_PACKSSWBirm",
1168 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001169 "VMASKMOVPDrm",
1170 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001171 "VPMASKMOVDrm",
1172 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001173
1174def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1175 let Latency = 7;
1176 let NumMicroOps = 3;
1177 let ResourceCycles = [1,2];
1178}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001179def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1180 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001181
1182def BWWriteResGroup81 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1183 let Latency = 7;
1184 let NumMicroOps = 3;
1185 let ResourceCycles = [1,1,1];
1186}
Simon Pilgrimd5ada492018-04-29 15:33:15 +00001187def: InstRW<[BWWriteResGroup81], (instregex "(V?)PSLLDrm",
1188 "(V?)PSLLQrm",
1189 "(V?)PSLLWrm",
1190 "(V?)PSRADrm",
1191 "(V?)PSRAWrm",
1192 "(V?)PSRLDrm",
1193 "(V?)PSRLQrm",
1194 "(V?)PSRLWrm",
1195 "(V?)PTESTrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001196
1197def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1198 let Latency = 7;
1199 let NumMicroOps = 3;
1200 let ResourceCycles = [1,1,1];
1201}
1202def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1203
Gadi Haber323f2e12017-10-24 20:19:47 +00001204def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1205 let Latency = 7;
1206 let NumMicroOps = 3;
1207 let ResourceCycles = [1,1,1];
1208}
Craig Topper5a69a002018-03-21 06:28:42 +00001209def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1210 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001211
Gadi Haber323f2e12017-10-24 20:19:47 +00001212def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1213 let Latency = 7;
1214 let NumMicroOps = 3;
1215 let ResourceCycles = [1,1,1];
1216}
Craig Topperf4cd9082018-01-19 05:47:32 +00001217def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001218
1219def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1220 let Latency = 7;
1221 let NumMicroOps = 5;
1222 let ResourceCycles = [1,1,1,2];
1223}
Craig Topper5a69a002018-03-21 06:28:42 +00001224def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1225 "ROL(8|16|32|64)mi",
1226 "ROR(8|16|32|64)m1",
1227 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001228
1229def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1230 let Latency = 7;
1231 let NumMicroOps = 5;
1232 let ResourceCycles = [1,1,1,2];
1233}
Craig Topper5a69a002018-03-21 06:28:42 +00001234def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001235
1236def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1237 let Latency = 7;
1238 let NumMicroOps = 5;
1239 let ResourceCycles = [1,1,1,1,1];
1240}
Craig Topper5a69a002018-03-21 06:28:42 +00001241def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1242 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001243
1244def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1245 let Latency = 7;
1246 let NumMicroOps = 7;
1247 let ResourceCycles = [2,2,1,2];
1248}
Craig Topper2d451e72018-03-18 08:38:06 +00001249def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001250
1251def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1252 let Latency = 8;
1253 let NumMicroOps = 2;
1254 let ResourceCycles = [1,1];
1255}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001256def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001257 "PDEP(32|64)rm",
1258 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001259 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001260
1261def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001262 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001263 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001264 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001265}
Craig Topperf846e2d2018-04-19 05:34:05 +00001266def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001267
Craig Topperf846e2d2018-04-19 05:34:05 +00001268def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1269 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001270 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001271 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001272}
Craig Topper5a69a002018-03-21 06:28:42 +00001273def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001274
Gadi Haber323f2e12017-10-24 20:19:47 +00001275def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1276 let Latency = 8;
1277 let NumMicroOps = 2;
1278 let ResourceCycles = [1,1];
1279}
Craig Topper5a69a002018-03-21 06:28:42 +00001280def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1281 "VPMOVSXBQYrm",
1282 "VPMOVSXBWYrm",
1283 "VPMOVSXDQYrm",
1284 "VPMOVSXWDYrm",
1285 "VPMOVSXWQYrm",
1286 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001287
1288def BWWriteResGroup93 : SchedWriteRes<[BWPort01,BWPort23]> {
1289 let Latency = 8;
1290 let NumMicroOps = 2;
1291 let ResourceCycles = [1,1];
1292}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001293def: InstRW<[BWWriteResGroup93], (instregex "(V?)MULPDrm",
1294 "(V?)MULPSrm",
1295 "(V?)MULSDrm",
1296 "(V?)MULSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001297
1298def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1299 let Latency = 8;
1300 let NumMicroOps = 3;
1301 let ResourceCycles = [2,1];
1302}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001303def: InstRW<[BWWriteResGroup94], (instregex "VMASKMOVPDYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001304 "VMASKMOVPSYrm",
1305 "VPBLENDVBYrm",
1306 "VPMASKMOVDYrm",
1307 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001308
1309def BWWriteResGroup95 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1310 let Latency = 8;
1311 let NumMicroOps = 4;
1312 let ResourceCycles = [2,1,1];
1313}
Craig Topper5a69a002018-03-21 06:28:42 +00001314def: InstRW<[BWWriteResGroup95], (instregex "VPSLLVDrm",
1315 "VPSRAVDrm",
1316 "VPSRLVDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001317
Gadi Haber323f2e12017-10-24 20:19:47 +00001318def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1319 let Latency = 8;
1320 let NumMicroOps = 5;
1321 let ResourceCycles = [1,1,1,2];
1322}
Craig Topper5a69a002018-03-21 06:28:42 +00001323def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1324 "RCL(8|16|32|64)mi",
1325 "RCR(8|16|32|64)m1",
1326 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001327
1328def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1329 let Latency = 8;
1330 let NumMicroOps = 5;
1331 let ResourceCycles = [1,1,2,1];
1332}
Craig Topper13a16502018-03-19 00:56:09 +00001333def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001334
1335def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1336 let Latency = 8;
1337 let NumMicroOps = 6;
1338 let ResourceCycles = [1,1,1,3];
1339}
Craig Topper9f834812018-04-01 21:54:24 +00001340def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001341
1342def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1343 let Latency = 8;
1344 let NumMicroOps = 6;
1345 let ResourceCycles = [1,1,1,2,1];
1346}
Craig Topper9f834812018-04-01 21:54:24 +00001347def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001348 "CMPXCHG(8|16|32|64)rm",
1349 "ROL(8|16|32|64)mCL",
1350 "SAR(8|16|32|64)mCL",
1351 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001352 "SHL(8|16|32|64)mCL",
1353 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001354def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1355 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001356
1357def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1358 let Latency = 9;
1359 let NumMicroOps = 2;
1360 let ResourceCycles = [1,1];
1361}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001362def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1363 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001364 "VADDPDYrm",
1365 "VADDPSYrm",
1366 "VADDSUBPDYrm",
1367 "VADDSUBPSYrm",
1368 "VCMPPDYrmi",
1369 "VCMPPSYrmi",
Craig Topper5a69a002018-03-21 06:28:42 +00001370 "VCVTPS2DQYrm",
1371 "VCVTTPS2DQYrm",
1372 "VMAX(C?)PDYrm",
1373 "VMAX(C?)PSYrm",
1374 "VMIN(C?)PDYrm",
1375 "VMIN(C?)PSYrm",
1376 "VSUBPDYrm",
1377 "VSUBPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001378
1379def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1380 let Latency = 9;
1381 let NumMicroOps = 2;
1382 let ResourceCycles = [1,1];
1383}
Craig Topper5a69a002018-03-21 06:28:42 +00001384def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1385 "VPERM2I128rm",
1386 "VPERMDYrm",
1387 "VPERMPDYmi",
1388 "VPERMPSYrm",
1389 "VPERMQYmi",
1390 "VPMOVZXBDYrm",
1391 "VPMOVZXBQYrm",
1392 "VPMOVZXBWYrm",
1393 "VPMOVZXDQYrm",
1394 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001395
1396def BWWriteResGroup103 : SchedWriteRes<[BWPort01,BWPort23]> {
1397 let Latency = 9;
1398 let NumMicroOps = 2;
1399 let ResourceCycles = [1,1];
1400}
Craig Topper5a69a002018-03-21 06:28:42 +00001401def: InstRW<[BWWriteResGroup103], (instregex "VMULPDYrm",
1402 "VMULPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001403
1404def BWWriteResGroup104 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1405 let Latency = 9;
1406 let NumMicroOps = 3;
1407 let ResourceCycles = [1,1,1];
1408}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001409def: InstRW<[BWWriteResGroup104], (instregex "(V?)DPPDrri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001410
1411def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1412 let Latency = 9;
1413 let NumMicroOps = 3;
1414 let ResourceCycles = [1,1,1];
1415}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001416def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1417 "(V?)CVTSD2SIrm",
1418 "(V?)CVTSS2SI64rm",
1419 "(V?)CVTSS2SIrm",
1420 "(V?)CVTTSD2SI64rm",
1421 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001422 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001423 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001424
1425def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1426 let Latency = 9;
1427 let NumMicroOps = 3;
1428 let ResourceCycles = [1,1,1];
1429}
1430def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1431
1432def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1433 let Latency = 9;
1434 let NumMicroOps = 3;
1435 let ResourceCycles = [1,1,1];
1436}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001437def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001438def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001439 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001440 "CVTTPD2DQrm",
1441 "MMX_CVTPD2PIirm",
1442 "MMX_CVTPI2PDirm",
1443 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001444 "(V?)CVTDQ2PDrm",
1445 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001446
1447def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1448 let Latency = 9;
1449 let NumMicroOps = 3;
1450 let ResourceCycles = [1,1,1];
1451}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001452def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1453 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001454
1455def BWWriteResGroup109 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1456 let Latency = 9;
1457 let NumMicroOps = 4;
1458 let ResourceCycles = [2,1,1];
1459}
Craig Topper5a69a002018-03-21 06:28:42 +00001460def: InstRW<[BWWriteResGroup109], (instregex "VPSLLVDYrm",
1461 "VPSRAVDYrm",
1462 "VPSRLVDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001463
1464def BWWriteResGroup110 : SchedWriteRes<[BWPort5,BWPort23,BWPort15]> {
1465 let Latency = 9;
1466 let NumMicroOps = 4;
1467 let ResourceCycles = [2,1,1];
1468}
Craig Topper5a69a002018-03-21 06:28:42 +00001469def: InstRW<[BWWriteResGroup110], (instregex "VPHADDDYrm",
1470 "VPHADDSWYrm",
1471 "VPHADDWYrm",
1472 "VPHSUBDYrm",
1473 "VPHSUBSWYrm",
1474 "VPHSUBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001475
1476def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1477 let Latency = 9;
1478 let NumMicroOps = 4;
1479 let ResourceCycles = [1,1,1,1];
1480}
Craig Topper5a69a002018-03-21 06:28:42 +00001481def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1482 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001483
1484def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1485 let Latency = 9;
1486 let NumMicroOps = 5;
1487 let ResourceCycles = [1,1,3];
1488}
1489def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1490
1491def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1492 let Latency = 9;
1493 let NumMicroOps = 5;
1494 let ResourceCycles = [1,2,1,1];
1495}
Craig Topper5a69a002018-03-21 06:28:42 +00001496def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1497 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001498
Gadi Haber323f2e12017-10-24 20:19:47 +00001499def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1500 let Latency = 10;
1501 let NumMicroOps = 2;
1502 let ResourceCycles = [1,1];
1503}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001504def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001505
Gadi Haber323f2e12017-10-24 20:19:47 +00001506def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1507 let Latency = 10;
1508 let NumMicroOps = 3;
1509 let ResourceCycles = [2,1];
1510}
Craig Topper5a69a002018-03-21 06:28:42 +00001511def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1512 "FICOM32m",
1513 "FICOMP16m",
1514 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001515
1516def BWWriteResGroup118 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1517 let Latency = 10;
1518 let NumMicroOps = 3;
1519 let ResourceCycles = [1,1,1];
1520}
1521def: InstRW<[BWWriteResGroup118], (instregex "VPTESTYrm")>;
1522
Gadi Haber323f2e12017-10-24 20:19:47 +00001523def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1524 let Latency = 10;
1525 let NumMicroOps = 4;
1526 let ResourceCycles = [1,1,1,1];
1527}
1528def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1529
1530def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001531 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001532 let NumMicroOps = 4;
1533 let ResourceCycles = [1,1,1,1];
1534}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001535def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001536
Craig Topper8104f262018-04-02 05:33:28 +00001537def BWWriteResGroup122 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001538 let Latency = 11;
1539 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001540 let ResourceCycles = [1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001541}
Craig Topper8104f262018-04-02 05:33:28 +00001542def: InstRW<[BWWriteResGroup122], (instregex "(V?)DIVPSrr")>;
1543
1544def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1545 let Latency = 11;
1546 let NumMicroOps = 1;
1547 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1548}
1549def: InstRW<[BWWriteResGroup122_1], (instregex "(V?)DIVSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001550
1551def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1552 let Latency = 11;
1553 let NumMicroOps = 2;
1554 let ResourceCycles = [1,1];
1555}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001556def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001557 "VPCMPGTQYrm",
1558 "VPMADDUBSWYrm",
1559 "VPMADDWDYrm",
1560 "VPMULDQYrm",
1561 "VPMULHRSWYrm",
1562 "VPMULHUWYrm",
1563 "VPMULHWYrm",
1564 "VPMULLWYrm",
1565 "VPMULUDQYrm",
1566 "VPSADBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001567
Gadi Haber323f2e12017-10-24 20:19:47 +00001568def BWWriteResGroup126 : SchedWriteRes<[BWPort0,BWPort015]> {
1569 let Latency = 11;
1570 let NumMicroOps = 3;
1571 let ResourceCycles = [2,1];
1572}
Craig Topper5a69a002018-03-21 06:28:42 +00001573def: InstRW<[BWWriteResGroup126], (instregex "VRCPPSYr",
1574 "VRSQRTPSYr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001575
1576def BWWriteResGroup127 : SchedWriteRes<[BWPort1,BWPort23]> {
1577 let Latency = 11;
1578 let NumMicroOps = 3;
1579 let ResourceCycles = [2,1];
1580}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001581def: InstRW<[BWWriteResGroup127], (instregex "(V?)ROUNDPDm",
1582 "(V?)ROUNDPSm",
1583 "(V?)ROUNDSDm",
1584 "(V?)ROUNDSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001585
1586def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1587 let Latency = 11;
1588 let NumMicroOps = 3;
1589 let ResourceCycles = [1,1,1];
1590}
1591def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1592
Gadi Haber323f2e12017-10-24 20:19:47 +00001593def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1594 let Latency = 11;
1595 let NumMicroOps = 6;
1596 let ResourceCycles = [1,1,1,1,2];
1597}
Craig Topper5a69a002018-03-21 06:28:42 +00001598def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1599 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001600
1601def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1602 let Latency = 11;
1603 let NumMicroOps = 7;
1604 let ResourceCycles = [2,2,3];
1605}
Craig Topper5a69a002018-03-21 06:28:42 +00001606def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1607 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001608
1609def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1610 let Latency = 11;
1611 let NumMicroOps = 9;
1612 let ResourceCycles = [1,4,1,3];
1613}
1614def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1615
1616def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1617 let Latency = 11;
1618 let NumMicroOps = 11;
1619 let ResourceCycles = [2,9];
1620}
Craig Topper2d451e72018-03-18 08:38:06 +00001621def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1622def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001623
Gadi Haber323f2e12017-10-24 20:19:47 +00001624def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1625 let Latency = 12;
1626 let NumMicroOps = 3;
1627 let ResourceCycles = [2,1];
1628}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001629def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m",
Craig Topper40d3b322018-03-22 21:55:20 +00001630 "VROUNDPDYm",
1631 "VROUNDPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001632
Craig Topper8104f262018-04-02 05:33:28 +00001633def BWWriteResGroup137 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001634 let Latency = 11;
Gadi Haber323f2e12017-10-24 20:19:47 +00001635 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001636 let ResourceCycles = [1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001637}
Craig Topper8104f262018-04-02 05:33:28 +00001638def: InstRW<[BWWriteResGroup137], (instregex "(V?)SQRTPSr")>;
1639
1640def BWWriteResGroup137_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1641 let Latency = 11;
1642 let NumMicroOps = 1;
1643 let ResourceCycles = [1,4];
1644}
1645def: InstRW<[BWWriteResGroup137_1], (instregex "(V?)SQRTSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001646
1647def BWWriteResGroup138 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1648 let Latency = 13;
1649 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001650 let ResourceCycles = [1,2,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001651}
1652def: InstRW<[BWWriteResGroup138], (instregex "VMPSADBWYrmi")>;
1653
Craig Topper8104f262018-04-02 05:33:28 +00001654def BWWriteResGroup139 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001655 let Latency = 14;
1656 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001657 let ResourceCycles = [1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001658}
Craig Topper8104f262018-04-02 05:33:28 +00001659def: InstRW<[BWWriteResGroup139], (instregex "(V?)DIVPDrr")>;
1660
1661def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1662 let Latency = 14;
1663 let NumMicroOps = 1;
1664 let ResourceCycles = [1,4];
1665}
1666def: InstRW<[BWWriteResGroup139_1], (instregex "(V?)DIVSDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001667
Gadi Haber323f2e12017-10-24 20:19:47 +00001668def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1669 let Latency = 14;
1670 let NumMicroOps = 3;
1671 let ResourceCycles = [1,1,1];
1672}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001673def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001674
1675def BWWriteResGroup142 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1676 let Latency = 14;
1677 let NumMicroOps = 4;
1678 let ResourceCycles = [2,1,1];
1679}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001680def: InstRW<[BWWriteResGroup142], (instregex "(V?)DPPS(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001681
1682def BWWriteResGroup143 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1683 let Latency = 14;
1684 let NumMicroOps = 4;
1685 let ResourceCycles = [1,1,1,1];
1686}
Craig Topper5a69a002018-03-21 06:28:42 +00001687def: InstRW<[BWWriteResGroup143], (instregex "(V?)DPPDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001688
1689def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1690 let Latency = 14;
1691 let NumMicroOps = 8;
1692 let ResourceCycles = [2,2,1,3];
1693}
1694def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1695
1696def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1697 let Latency = 14;
1698 let NumMicroOps = 10;
1699 let ResourceCycles = [2,3,1,4];
1700}
1701def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1702
1703def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1704 let Latency = 14;
1705 let NumMicroOps = 12;
1706 let ResourceCycles = [2,1,4,5];
1707}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001708def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001709
1710def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1711 let Latency = 15;
1712 let NumMicroOps = 1;
1713 let ResourceCycles = [1];
1714}
Craig Topper5a69a002018-03-21 06:28:42 +00001715def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1716 "DIVR_FST0r",
1717 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001718
Gadi Haber323f2e12017-10-24 20:19:47 +00001719def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1720 let Latency = 15;
1721 let NumMicroOps = 10;
1722 let ResourceCycles = [1,1,1,4,1,2];
1723}
Craig Topper13a16502018-03-19 00:56:09 +00001724def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001725
Craig Topper8104f262018-04-02 05:33:28 +00001726def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001727 let Latency = 16;
1728 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001729 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001730}
Craig Topper5a69a002018-03-21 06:28:42 +00001731def: InstRW<[BWWriteResGroup150], (instregex "(V?)DIVPSrm",
1732 "(V?)DIVSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001733
1734def BWWriteResGroup151 : SchedWriteRes<[BWPort0,BWPort23]> {
1735 let Latency = 16;
1736 let NumMicroOps = 3;
1737 let ResourceCycles = [2,1];
1738}
1739def: InstRW<[BWWriteResGroup151], (instregex "VPMULLDYrm")>;
1740
Gadi Haber323f2e12017-10-24 20:19:47 +00001741def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1742 let Latency = 16;
1743 let NumMicroOps = 14;
1744 let ResourceCycles = [1,1,1,4,2,5];
1745}
1746def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1747
1748def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1749 let Latency = 16;
1750 let NumMicroOps = 16;
1751 let ResourceCycles = [16];
1752}
Craig Topper5a69a002018-03-21 06:28:42 +00001753def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001754
Craig Topper8104f262018-04-02 05:33:28 +00001755def BWWriteResGroup155 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001756 let Latency = 17;
1757 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001758 let ResourceCycles = [2,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001759}
1760def: InstRW<[BWWriteResGroup155], (instregex "VDIVPSYrr")>;
1761
1762def BWWriteResGroup156 : SchedWriteRes<[BWPort0,BWPort23,BWPort015]> {
1763 let Latency = 17;
1764 let NumMicroOps = 4;
1765 let ResourceCycles = [2,1,1];
1766}
Craig Topper5a69a002018-03-21 06:28:42 +00001767def: InstRW<[BWWriteResGroup156], (instregex "VRCPPSYm",
1768 "VRSQRTPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001769
Craig Topper8104f262018-04-02 05:33:28 +00001770def BWWriteResGroup157 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001771 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001772 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001773 let ResourceCycles = [1,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001774}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001775def: InstRW<[BWWriteResGroup157], (instregex "(V?)SQRTPSm",
1776 "(V?)SQRTSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001777
Gadi Haber323f2e12017-10-24 20:19:47 +00001778def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1779 let Latency = 18;
1780 let NumMicroOps = 8;
1781 let ResourceCycles = [1,1,1,5];
1782}
Craig Topper5a69a002018-03-21 06:28:42 +00001783def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001784def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001785
1786def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1787 let Latency = 18;
1788 let NumMicroOps = 11;
1789 let ResourceCycles = [2,1,1,3,1,3];
1790}
Craig Topper13a16502018-03-19 00:56:09 +00001791def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001792
Craig Topper8104f262018-04-02 05:33:28 +00001793def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001794 let Latency = 19;
1795 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001796 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001797}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001798def: InstRW<[BWWriteResGroup161], (instregex "(V?)DIVPDrm",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001799 "(V?)DIVSDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001800
Gadi Haber323f2e12017-10-24 20:19:47 +00001801def BWWriteResGroup163 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1802 let Latency = 19;
1803 let NumMicroOps = 5;
1804 let ResourceCycles = [2,1,1,1];
1805}
Craig Topper5a69a002018-03-21 06:28:42 +00001806def: InstRW<[BWWriteResGroup163], (instregex "(V?)DPPSrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001807
Gadi Haber323f2e12017-10-24 20:19:47 +00001808def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1809 let Latency = 20;
1810 let NumMicroOps = 1;
1811 let ResourceCycles = [1];
1812}
Craig Topper5a69a002018-03-21 06:28:42 +00001813def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1814 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001815 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001816
1817def BWWriteResGroup166 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1818 let Latency = 20;
1819 let NumMicroOps = 5;
1820 let ResourceCycles = [2,1,1,1];
1821}
1822def: InstRW<[BWWriteResGroup166], (instregex "VDPPSYrmi")>;
1823
1824def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1825 let Latency = 20;
1826 let NumMicroOps = 8;
1827 let ResourceCycles = [1,1,1,1,1,1,2];
1828}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001829def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001830
Craig Topper8104f262018-04-02 05:33:28 +00001831def BWWriteResGroup168 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001832 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001833 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001834 let ResourceCycles = [1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001835}
Craig Topper8104f262018-04-02 05:33:28 +00001836def: InstRW<[BWWriteResGroup168], (instregex "(V?)SQRTPDr")>;
1837
1838def BWWriteResGroup168_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1839 let Latency = 16;
1840 let NumMicroOps = 1;
1841 let ResourceCycles = [1,8];
1842}
1843def: InstRW<[BWWriteResGroup168_1], (instregex "(V?)SQRTSDr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001844
1845def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1846 let Latency = 21;
1847 let NumMicroOps = 2;
1848 let ResourceCycles = [1,1];
1849}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001850def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001851
Craig Topper8104f262018-04-02 05:33:28 +00001852def BWWriteResGroup170 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001853 let Latency = 21;
1854 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001855 let ResourceCycles = [2,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001856}
1857def: InstRW<[BWWriteResGroup170], (instregex "VSQRTPSYr")>;
1858
1859def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1860 let Latency = 21;
1861 let NumMicroOps = 19;
1862 let ResourceCycles = [2,1,4,1,1,4,6];
1863}
1864def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1865
1866def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1867 let Latency = 22;
1868 let NumMicroOps = 18;
1869 let ResourceCycles = [1,1,16];
1870}
1871def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1872
Craig Topper8104f262018-04-02 05:33:28 +00001873def BWWriteResGroup173 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001874 let Latency = 23;
1875 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001876 let ResourceCycles = [2,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001877}
1878def: InstRW<[BWWriteResGroup173], (instregex "VDIVPDYrr")>;
1879
Craig Topper8104f262018-04-02 05:33:28 +00001880def BWWriteResGroup174 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001881 let Latency = 23;
1882 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001883 let ResourceCycles = [2,1,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001884}
1885def: InstRW<[BWWriteResGroup174], (instregex "VDIVPSYrm")>;
1886
Gadi Haber323f2e12017-10-24 20:19:47 +00001887def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1888 let Latency = 23;
1889 let NumMicroOps = 19;
1890 let ResourceCycles = [3,1,15];
1891}
Craig Topper391c6f92017-12-10 01:24:08 +00001892def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001893
1894def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1895 let Latency = 24;
1896 let NumMicroOps = 3;
1897 let ResourceCycles = [1,1,1];
1898}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001899def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001900
Craig Topper8104f262018-04-02 05:33:28 +00001901def BWWriteResGroup179 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001902 let Latency = 21;
Gadi Haber323f2e12017-10-24 20:19:47 +00001903 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001904 let ResourceCycles = [1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001905}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001906def: InstRW<[BWWriteResGroup179], (instregex "(V?)SQRTPDm",
1907 "(V?)SQRTSDm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001908
1909def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1910 let Latency = 26;
1911 let NumMicroOps = 2;
1912 let ResourceCycles = [1,1];
1913}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001914def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001915
Craig Topper8104f262018-04-02 05:33:28 +00001916def BWWriteResGroup181 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001917 let Latency = 27;
1918 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001919 let ResourceCycles = [2,1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001920}
1921def: InstRW<[BWWriteResGroup181], (instregex "VSQRTPSYm")>;
1922
1923def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1924 let Latency = 29;
1925 let NumMicroOps = 3;
1926 let ResourceCycles = [1,1,1];
1927}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001928def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001929
Craig Topper8104f262018-04-02 05:33:28 +00001930def BWWriteResGroup183 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001931 let Latency = 29;
1932 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001933 let ResourceCycles = [2,1,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001934}
1935def: InstRW<[BWWriteResGroup183], (instregex "VDIVPDYrm")>;
1936
1937def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1938 let Latency = 22;
1939 let NumMicroOps = 7;
1940 let ResourceCycles = [1,3,2,1];
1941}
Craig Topper17a31182017-12-16 18:35:29 +00001942def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001943
1944def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1945 let Latency = 23;
1946 let NumMicroOps = 9;
1947 let ResourceCycles = [1,3,4,1];
1948}
Craig Topper17a31182017-12-16 18:35:29 +00001949def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001950
1951def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1952 let Latency = 24;
1953 let NumMicroOps = 9;
1954 let ResourceCycles = [1,5,2,1];
1955}
Craig Topper17a31182017-12-16 18:35:29 +00001956def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001957
1958def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1959 let Latency = 25;
1960 let NumMicroOps = 7;
1961 let ResourceCycles = [1,3,2,1];
1962}
Craig Topper17a31182017-12-16 18:35:29 +00001963def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1964 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001965
1966def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1967 let Latency = 26;
1968 let NumMicroOps = 9;
1969 let ResourceCycles = [1,5,2,1];
1970}
Craig Topper17a31182017-12-16 18:35:29 +00001971def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001972
1973def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1974 let Latency = 26;
1975 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001976 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001977}
Craig Topper17a31182017-12-16 18:35:29 +00001978def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001979
1980def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1981 let Latency = 27;
1982 let NumMicroOps = 9;
1983 let ResourceCycles = [1,5,2,1];
1984}
Craig Topper17a31182017-12-16 18:35:29 +00001985def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001986
Gadi Haber323f2e12017-10-24 20:19:47 +00001987def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1988 let Latency = 29;
1989 let NumMicroOps = 27;
1990 let ResourceCycles = [1,5,1,1,19];
1991}
1992def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1993
1994def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1995 let Latency = 30;
1996 let NumMicroOps = 28;
1997 let ResourceCycles = [1,6,1,1,19];
1998}
Craig Topper2d451e72018-03-18 08:38:06 +00001999def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002000
2001def BWWriteResGroup187 : SchedWriteRes<[BWPort01,BWPort15,BWPort015,BWPort0156]> {
2002 let Latency = 31;
2003 let NumMicroOps = 31;
2004 let ResourceCycles = [8,1,21,1];
2005}
2006def: InstRW<[BWWriteResGroup187], (instregex "MMX_EMMS")>;
2007
Craig Topper8104f262018-04-02 05:33:28 +00002008def BWWriteResGroup189 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
2009 let Latency = 29;
Gadi Haber323f2e12017-10-24 20:19:47 +00002010 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00002011 let ResourceCycles = [2,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00002012}
2013def: InstRW<[BWWriteResGroup189], (instregex "VSQRTPDYr")>;
2014
2015def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
2016 let Latency = 34;
2017 let NumMicroOps = 8;
2018 let ResourceCycles = [2,2,2,1,1];
2019}
Craig Topper13a16502018-03-19 00:56:09 +00002020def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002021
2022def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
2023 let Latency = 34;
2024 let NumMicroOps = 23;
2025 let ResourceCycles = [1,5,3,4,10];
2026}
Craig Topper5a69a002018-03-21 06:28:42 +00002027def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
2028 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002029
2030def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
2031 let Latency = 35;
2032 let NumMicroOps = 8;
2033 let ResourceCycles = [2,2,2,1,1];
2034}
Craig Topper13a16502018-03-19 00:56:09 +00002035def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002036
2037def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
2038 let Latency = 35;
2039 let NumMicroOps = 23;
2040 let ResourceCycles = [1,5,2,1,4,10];
2041}
Craig Topper5a69a002018-03-21 06:28:42 +00002042def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
2043 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002044
Craig Topper8104f262018-04-02 05:33:28 +00002045def BWWriteResGroup195 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
2046 let Latency = 35;
Gadi Haber323f2e12017-10-24 20:19:47 +00002047 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00002048 let ResourceCycles = [2,1,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00002049}
2050def: InstRW<[BWWriteResGroup195], (instregex "VSQRTPDYm")>;
2051
2052def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
2053 let Latency = 42;
2054 let NumMicroOps = 22;
2055 let ResourceCycles = [2,20];
2056}
Craig Topper2d451e72018-03-18 08:38:06 +00002057def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002058
2059def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
2060 let Latency = 60;
2061 let NumMicroOps = 64;
2062 let ResourceCycles = [2,2,8,1,10,2,39];
2063}
2064def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002065
2066def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
2067 let Latency = 63;
2068 let NumMicroOps = 88;
2069 let ResourceCycles = [4,4,31,1,2,1,45];
2070}
Craig Topper2d451e72018-03-18 08:38:06 +00002071def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002072
2073def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
2074 let Latency = 63;
2075 let NumMicroOps = 90;
2076 let ResourceCycles = [4,2,33,1,2,1,47];
2077}
Craig Topper2d451e72018-03-18 08:38:06 +00002078def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002079
2080def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
2081 let Latency = 75;
2082 let NumMicroOps = 15;
2083 let ResourceCycles = [6,3,6];
2084}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00002085def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002086
2087def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
2088 let Latency = 80;
2089 let NumMicroOps = 32;
2090 let ResourceCycles = [7,7,3,3,1,11];
2091}
2092def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
2093
2094def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
2095 let Latency = 115;
2096 let NumMicroOps = 100;
2097 let ResourceCycles = [9,9,11,8,1,11,21,30];
2098}
2099def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002100
2101} // SchedModel
2102