blob: 999ecd32eb8ff6ed37427f2ac758b7de04f18435 [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//===----------------------------------------------------------------------===//
Clement Courbet0f1da8f2018-05-02 13:54:38 +000014
Gadi Haber323f2e12017-10-24 20:19:47 +000015def BroadwellModel : SchedMachineModel {
Simon Pilgrimf7d2a932018-04-24 13:21:41 +000016 // All x86 instructions are modeled as a single micro-op, and BW can decode 4
Gadi Haber323f2e12017-10-24 20:19:47 +000017 // instructions per cycle.
18 let IssueWidth = 4;
19 let MicroOpBufferSize = 192; // Based on the reorder buffer.
20 let LoadLatency = 5;
21 let MispredictPenalty = 16;
22
23 // Based on the LSD (loop-stream detector) queue size and benchmarking data.
24 let LoopMicroOpBufferSize = 50;
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000025
Simon Pilgrimc21deec2018-03-24 19:37:28 +000026 // This flag is set to allow the scheduler to assign a default model to
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000027 // unrecognized opcodes.
28 let CompleteModel = 0;
Gadi Haber323f2e12017-10-24 20:19:47 +000029}
30
31let SchedModel = BroadwellModel in {
32
33// Broadwell can issue micro-ops to 8 different ports in one cycle.
34
35// Ports 0, 1, 5, and 6 handle all computation.
36// Port 4 gets the data half of stores. Store data can be available later than
37// the store address, but since we don't model the latency of stores, we can
38// ignore that.
39// Ports 2 and 3 are identical. They handle loads and the address half of
40// stores. Port 7 can handle address calculations.
41def BWPort0 : ProcResource<1>;
42def BWPort1 : ProcResource<1>;
43def BWPort2 : ProcResource<1>;
44def BWPort3 : ProcResource<1>;
45def BWPort4 : ProcResource<1>;
46def BWPort5 : ProcResource<1>;
47def BWPort6 : ProcResource<1>;
48def BWPort7 : ProcResource<1>;
49
50// Many micro-ops are capable of issuing on multiple ports.
51def BWPort01 : ProcResGroup<[BWPort0, BWPort1]>;
52def BWPort23 : ProcResGroup<[BWPort2, BWPort3]>;
53def BWPort237 : ProcResGroup<[BWPort2, BWPort3, BWPort7]>;
54def BWPort04 : ProcResGroup<[BWPort0, BWPort4]>;
55def BWPort05 : ProcResGroup<[BWPort0, BWPort5]>;
56def BWPort06 : ProcResGroup<[BWPort0, BWPort6]>;
57def BWPort15 : ProcResGroup<[BWPort1, BWPort5]>;
58def BWPort16 : ProcResGroup<[BWPort1, BWPort6]>;
59def BWPort56 : ProcResGroup<[BWPort5, BWPort6]>;
60def BWPort015 : ProcResGroup<[BWPort0, BWPort1, BWPort5]>;
61def BWPort056 : ProcResGroup<[BWPort0, BWPort5, BWPort6]>;
62def BWPort0156: ProcResGroup<[BWPort0, BWPort1, BWPort5, BWPort6]>;
63
64// 60 Entry Unified Scheduler
65def BWPortAny : ProcResGroup<[BWPort0, BWPort1, BWPort2, BWPort3, BWPort4,
66 BWPort5, BWPort6, BWPort7]> {
67 let BufferSize=60;
68}
69
Simon Pilgrim30c38c32018-03-19 14:46:07 +000070// Integer division issued on port 0.
Craig Topper8104f262018-04-02 05:33:28 +000071def BWDivider : ProcResource<1>;
72// FP division and sqrt on port 0.
73def BWFPDivider : ProcResource<1>;
Simon Pilgrim30c38c32018-03-19 14:46:07 +000074
Gadi Haber323f2e12017-10-24 20:19:47 +000075// Loads are 5 cycles, so ReadAfterLd registers needn't be available until 5
76// cycles after the memory operand.
77def : ReadAdvance<ReadAfterLd, 5>;
78
79// Many SchedWrites are defined in pairs with and without a folded load.
80// Instructions with folded loads are usually micro-fused, so they only appear
81// as two micro-ops when queued in the reservation station.
82// This multiclass defines the resource usage for variants with and without
83// folded loads.
84multiclass BWWriteResPair<X86FoldableSchedWrite SchedRW,
Simon Pilgrim30c38c32018-03-19 14:46:07 +000085 list<ProcResourceKind> ExePorts,
Simon Pilgrime3547af2018-03-25 10:21:19 +000086 int Lat, list<int> Res = [1], int UOps = 1,
87 int LoadLat = 5> {
Gadi Haber323f2e12017-10-24 20:19:47 +000088 // Register variant is using a single cycle on ExePort.
Simon Pilgrim30c38c32018-03-19 14:46:07 +000089 def : WriteRes<SchedRW, ExePorts> {
90 let Latency = Lat;
91 let ResourceCycles = Res;
92 let NumMicroOps = UOps;
93 }
Gadi Haber323f2e12017-10-24 20:19:47 +000094
Simon Pilgrime3547af2018-03-25 10:21:19 +000095 // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to
96 // the latency (default = 5).
Simon Pilgrim30c38c32018-03-19 14:46:07 +000097 def : WriteRes<SchedRW.Folded, !listconcat([BWPort23], ExePorts)> {
Simon Pilgrime3547af2018-03-25 10:21:19 +000098 let Latency = !add(Lat, LoadLat);
Simon Pilgrim30c38c32018-03-19 14:46:07 +000099 let ResourceCycles = !listconcat([1], Res);
Simon Pilgrime3547af2018-03-25 10:21:19 +0000100 let NumMicroOps = !add(UOps, 1);
Gadi Haber323f2e12017-10-24 20:19:47 +0000101 }
102}
103
Craig Topperf131b602018-04-06 16:16:46 +0000104// A folded store needs a cycle on port 4 for the store data, and an extra port
105// 2/3/7 cycle to recompute the address.
106def : WriteRes<WriteRMW, [BWPort237,BWPort4]>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000107
108// Arithmetic.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000109defm : BWWriteResPair<WriteALU, [BWPort0156], 1>; // Simple integer ALU op.
110defm : BWWriteResPair<WriteIMul, [BWPort1], 3>; // Integer multiplication.
111defm : BWWriteResPair<WriteIDiv, [BWPort0, BWDivider], 25, [1, 10]>;
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000112defm : BWWriteResPair<WriteCRC32, [BWPort1], 3>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000113def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, high part.
Gadi Haber323f2e12017-10-24 20:19:47 +0000114
115def : WriteRes<WriteLEA, [BWPort15]>; // LEA instructions can't fold loads.
116
Craig Topperb7baa352018-04-08 17:53:18 +0000117defm : BWWriteResPair<WriteCMOV, [BWPort06], 1>; // Conditional move.
118def : WriteRes<WriteSETCC, [BWPort06]>; // Setcc.
119def : WriteRes<WriteSETCCStore, [BWPort06,BWPort4,BWPort237]> {
120 let Latency = 2;
121 let NumMicroOps = 3;
122}
123
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000124// Bit counts.
125defm : BWWriteResPair<WriteBitScan, [BWPort1], 3>;
126defm : BWWriteResPair<WriteLZCNT, [BWPort1], 3>;
127defm : BWWriteResPair<WriteTZCNT, [BWPort1], 3>;
128defm : BWWriteResPair<WritePOPCNT, [BWPort1], 3>;
129
Gadi Haber323f2e12017-10-24 20:19:47 +0000130// Integer shifts and rotates.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000131defm : BWWriteResPair<WriteShift, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000132
Craig Topper89310f52018-03-29 20:41:39 +0000133// BMI1 BEXTR, BMI2 BZHI
134defm : BWWriteResPair<WriteBEXTR, [BWPort06,BWPort15], 2, [1,1], 2>;
135defm : BWWriteResPair<WriteBZHI, [BWPort15], 1>;
136
Gadi Haber323f2e12017-10-24 20:19:47 +0000137// Loads, stores, and moves, not folded with other operations.
138def : WriteRes<WriteLoad, [BWPort23]> { let Latency = 5; }
139def : WriteRes<WriteStore, [BWPort237, BWPort4]>;
140def : WriteRes<WriteMove, [BWPort0156]>;
141
142// Idioms that clear a register, like xorps %xmm0, %xmm0.
143// These can often bypass execution ports completely.
144def : WriteRes<WriteZero, []>;
145
Sanjoy Das1074eb22017-12-12 19:11:31 +0000146// Treat misc copies as a move.
147def : InstRW<[WriteMove], (instrs COPY)>;
148
Gadi Haber323f2e12017-10-24 20:19:47 +0000149// Branches don't produce values, so they have no latency, but they still
150// consume resources. Indirect branches can fold loads.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000151defm : BWWriteResPair<WriteJump, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000152
153// Floating point. This covers both scalar and vector operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000154def : WriteRes<WriteFLoad, [BWPort23]> { let Latency = 5; }
155def : WriteRes<WriteFStore, [BWPort237, BWPort4]>;
156def : WriteRes<WriteFMove, [BWPort5]>;
157
Simon Pilgrim21caf012018-05-01 18:22:53 +0000158defm : BWWriteResPair<WriteFAdd, [BWPort1], 3, [1], 1, 5>; // Floating point add/sub.
Clement Courbet0f1da8f2018-05-02 13:54:38 +0000159defm : BWWriteResPair<WriteFAddY, [BWPort1], 3, [1], 1, 6>; // Floating point add/sub (YMM/ZMM).
Simon Pilgrim21caf012018-05-01 18:22:53 +0000160defm : BWWriteResPair<WriteFCmp, [BWPort1], 3, [1], 1, 5>; // Floating point compare.
Clement Courbet0f1da8f2018-05-02 13:54:38 +0000161defm : BWWriteResPair<WriteFCmpY, [BWPort1], 3, [1], 1, 6>; // Floating point compare (YMM/ZMM).
Simon Pilgrim21caf012018-05-01 18:22:53 +0000162defm : BWWriteResPair<WriteFCom, [BWPort1], 3>; // Floating point compare to flags.
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000163defm : BWWriteResPair<WriteFMul, [BWPort01], 3, [1], 1, 5>; // Floating point multiplication.
164defm : BWWriteResPair<WriteFMulY, [BWPort01], 3, [1], 1, 6>; // Floating point multiplication (YMM/ZMM).
Simon Pilgrim21caf012018-05-01 18:22:53 +0000165defm : BWWriteResPair<WriteFDiv, [BWPort0], 12, [1], 1, 5>; // 10-14 cycles. // Floating point division.
166defm : BWWriteResPair<WriteFDivY, [BWPort0], 12, [1], 1, 7>; // 10-14 cycles. // Floating point division (YMM/ZMM).
Simon Pilgrimc7088682018-05-01 18:06:07 +0000167defm : BWWriteResPair<WriteFSqrt, [BWPort0], 15, [1], 1, 5>; // Floating point square root.
168defm : BWWriteResPair<WriteFSqrtY, [BWPort0], 15, [1], 1, 7>; // Floating point square root (YMM/ZMM).
169defm : BWWriteResPair<WriteFRcp, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal estimate.
170defm : BWWriteResPair<WriteFRcpY, [BWPort0], 5, [1], 1, 7>; // Floating point reciprocal estimate (YMM/ZMM).
171defm : BWWriteResPair<WriteFRsqrt, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal square root estimate.
172defm : BWWriteResPair<WriteFRsqrtY,[BWPort0], 5, [1], 1, 7>; // Floating point reciprocal square root estimate (YMM/ZMM).
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000173defm : BWWriteResPair<WriteFMA, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add.
174defm : BWWriteResPair<WriteFMAS, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add (Scalar).
175defm : BWWriteResPair<WriteFMAY, [BWPort01], 5, [1], 1, 6>; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000176defm : BWWriteResPair<WriteFSign, [BWPort5], 1>; // Floating point fabs/fchs.
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000177defm : BWWriteResPair<WriteFLogic, [BWPort5], 1, [1], 1, 5>; // Floating point and/or/xor logicals.
178defm : BWWriteResPair<WriteFLogicY, [BWPort5], 1, [1], 1, 6>; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000179defm : BWWriteResPair<WriteFShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector shuffles.
180defm : BWWriteResPair<WriteFShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000181defm : BWWriteResPair<WriteFVarShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector variable shuffles.
182defm : BWWriteResPair<WriteFVarShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
183defm : BWWriteResPair<WriteFBlend, [BWPort015], 1, [1], 1, 5>; // Floating point vector blends.
184defm : BWWriteResPair<WriteFBlendY, [BWPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000185defm : BWWriteResPair<WriteFVarBlend, [BWPort5], 2, [2], 2, 5>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000186defm : BWWriteResPair<WriteFVarBlendY, [BWPort5], 2, [2], 2, 6>; // Fp vector variable blends.
Gadi Haber323f2e12017-10-24 20:19:47 +0000187
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000188def : WriteRes<WriteCvtF2FSt, [BWPort1,BWPort4,BWPort237]> {
189 let Latency = 4;
190 let NumMicroOps = 3;
191 let ResourceCycles = [1,1,1];
192}
193
Gadi Haber323f2e12017-10-24 20:19:47 +0000194// FMA Scheduling helper class.
195// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
196
197// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000198def : WriteRes<WriteVecLoad, [BWPort23]> { let Latency = 5; }
199def : WriteRes<WriteVecStore, [BWPort237, BWPort4]>;
200def : WriteRes<WriteVecMove, [BWPort015]>;
201
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000202defm : BWWriteResPair<WriteVecALU, [BWPort15], 1>; // Vector integer ALU op, no logicals.
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000203defm : BWWriteResPair<WriteVecLogic, [BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
204defm : BWWriteResPair<WriteVecLogicY,[BWPort015], 1, [1], 1, 6>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000205defm : BWWriteResPair<WriteVecShift, [BWPort0], 1>; // Vector integer shifts.
206defm : BWWriteResPair<WriteVecIMul, [BWPort0], 5>; // Vector integer multiply.
Craig Topper13a0f832018-03-31 04:54:32 +0000207defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // PMULLD
Simon Pilgrim819f2182018-05-02 17:58:50 +0000208defm : BWWriteResPair<WriteShuffle, [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
209defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
Simon Pilgrim06e16542018-04-22 18:35:53 +0000210defm : BWWriteResPair<WriteBlend, [BWPort5], 1>; // Vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000211defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000212defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim27bc83e2018-04-24 18:49:25 +0000213defm : BWWriteResPair<WritePSADBW, [BWPort0], 5>; // Vector PSADBW.
214defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000215
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000216// Vector insert/extract operations.
217def : WriteRes<WriteVecInsert, [BWPort5]> {
218 let Latency = 2;
219 let NumMicroOps = 2;
220 let ResourceCycles = [2];
221}
222def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
223 let Latency = 6;
224 let NumMicroOps = 2;
225}
226
227def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
228 let Latency = 2;
229 let NumMicroOps = 2;
230}
231def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
232 let Latency = 2;
233 let NumMicroOps = 3;
234}
235
Gadi Haber323f2e12017-10-24 20:19:47 +0000236// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000237defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
238defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
239defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000240
241// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000242
Gadi Haber323f2e12017-10-24 20:19:47 +0000243// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000244def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000245 let Latency = 11;
246 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000247 let ResourceCycles = [3];
248}
249def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000250 let Latency = 16;
251 let NumMicroOps = 4;
252 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000253}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000254
255// Packed Compare Explicit Length Strings, Return Mask
256def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
257 let Latency = 19;
258 let NumMicroOps = 9;
259 let ResourceCycles = [4,3,1,1];
260}
261def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
262 let Latency = 24;
263 let NumMicroOps = 10;
264 let ResourceCycles = [4,3,1,1,1];
265}
266
267// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000268def : WriteRes<WritePCmpIStrI, [BWPort0]> {
269 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000270 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000271 let ResourceCycles = [3];
272}
273def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000274 let Latency = 16;
275 let NumMicroOps = 4;
276 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000277}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000278
279// Packed Compare Explicit Length Strings, Return Index
280def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
281 let Latency = 18;
282 let NumMicroOps = 8;
283 let ResourceCycles = [4,3,1];
284}
285def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
286 let Latency = 23;
287 let NumMicroOps = 9;
288 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000289}
290
Simon Pilgrima2f26782018-03-27 20:38:54 +0000291// MOVMSK Instructions.
292def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
293def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
294def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
295
Gadi Haber323f2e12017-10-24 20:19:47 +0000296// AES instructions.
297def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
298 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000299 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000300 let ResourceCycles = [1];
301}
302def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000303 let Latency = 12;
304 let NumMicroOps = 2;
305 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000306}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000307
Gadi Haber323f2e12017-10-24 20:19:47 +0000308def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
309 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000310 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000311 let ResourceCycles = [2];
312}
313def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000314 let Latency = 19;
315 let NumMicroOps = 3;
316 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000317}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000318
319def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
320 let Latency = 29;
321 let NumMicroOps = 11;
322 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000323}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000324def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
325 let Latency = 33;
326 let NumMicroOps = 11;
327 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000328}
329
330// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000331defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000332
333// Catch-all for expensive system instructions.
334def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
335
336// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000337defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
338defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
339defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
340defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
341defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 2, [2, 1]>; // Variable vector shifts.
Gadi Haber323f2e12017-10-24 20:19:47 +0000342
343// Old microcoded instructions that nobody use.
344def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
345
346// Fence instructions.
347def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
348
Craig Topper05242bf2018-04-21 18:07:36 +0000349// Load/store MXCSR.
350def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
351def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
352
Gadi Haber323f2e12017-10-24 20:19:47 +0000353// Nop, not very useful expect it provides a model for nops!
354def : WriteRes<WriteNop, []>;
355
356////////////////////////////////////////////////////////////////////////////////
357// Horizontal add/sub instructions.
358////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000359
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000360defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000361defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000362defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000363
364// Remaining instrs.
365
366def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
367 let Latency = 1;
368 let NumMicroOps = 1;
369 let ResourceCycles = [1];
370}
Craig Topper5a69a002018-03-21 06:28:42 +0000371def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
372 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000373 "(V?)MOVPDI2DIrr",
374 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000375 "VPSLLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000376 "VPSRLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000377 "VTESTPD(Y?)rr",
378 "VTESTPS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000379
380def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
381 let Latency = 1;
382 let NumMicroOps = 1;
383 let ResourceCycles = [1];
384}
Craig Topper5a69a002018-03-21 06:28:42 +0000385def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
386 "COM_FST0r",
387 "UCOM_FPr",
388 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000389
390def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
391 let Latency = 1;
392 let NumMicroOps = 1;
393 let ResourceCycles = [1];
394}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000395def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000396 "MMX_MOVD64to64rr",
397 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000398 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000399 "(V?)MOVDI2PDIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000400
401def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
402 let Latency = 1;
403 let NumMicroOps = 1;
404 let ResourceCycles = [1];
405}
406def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
407
408def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
409 let Latency = 1;
410 let NumMicroOps = 1;
411 let ResourceCycles = [1];
412}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000413def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000414
415def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
416 let Latency = 1;
417 let NumMicroOps = 1;
418 let ResourceCycles = [1];
419}
Craig Topperfbe31322018-04-05 21:56:19 +0000420def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000421def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
422 "ADC(16|32|64)i",
423 "ADC(8|16|32|64)rr",
424 "ADCX(32|64)rr",
425 "ADOX(32|64)rr",
426 "BT(16|32|64)ri8",
427 "BT(16|32|64)rr",
428 "BTC(16|32|64)ri8",
429 "BTC(16|32|64)rr",
430 "BTR(16|32|64)ri8",
431 "BTR(16|32|64)rr",
432 "BTS(16|32|64)ri8",
433 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000434 "SBB(16|32|64)ri",
435 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000436 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000437
438def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
439 let Latency = 1;
440 let NumMicroOps = 1;
441 let ResourceCycles = [1];
442}
Craig Topper5a69a002018-03-21 06:28:42 +0000443def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
444 "BLSI(32|64)rr",
445 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000446 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000447
448def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
449 let Latency = 1;
450 let NumMicroOps = 1;
451 let ResourceCycles = [1];
452}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000453def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000454 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000455
456def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
457 let Latency = 1;
458 let NumMicroOps = 1;
459 let ResourceCycles = [1];
460}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000461def: InstRW<[BWWriteResGroup9], (instrs LAHF, SAHF)>; // TODO: This doesnt match Agner's data
462def: InstRW<[BWWriteResGroup9], (instregex "NOOP",
Craig Topper5a69a002018-03-21 06:28:42 +0000463 "SGDT64m",
464 "SIDT64m",
Craig Topper5a69a002018-03-21 06:28:42 +0000465 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000466 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000467 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000468
469def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
470 let Latency = 1;
471 let NumMicroOps = 2;
472 let ResourceCycles = [1,1];
473}
Craig Topper5a69a002018-03-21 06:28:42 +0000474def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
475 "MMX_MOVD64from64rm",
476 "MMX_MOVD64mr",
477 "MMX_MOVNTQmr",
478 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000479 "MOVNTI_64mr",
480 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000481 "ST_FP(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000482 "VEXTRACTF128mr",
483 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000484 "(V?)MOVAPD(Y?)mr",
485 "(V?)MOVAPS(Y?)mr",
486 "(V?)MOVDQA(Y?)mr",
487 "(V?)MOVDQU(Y?)mr",
488 "(V?)MOVHPDmr",
489 "(V?)MOVHPSmr",
490 "(V?)MOVLPDmr",
491 "(V?)MOVLPSmr",
492 "(V?)MOVNTDQ(V?)mr",
493 "(V?)MOVNTPD(V?)mr",
494 "(V?)MOVNTPS(V?)mr",
495 "(V?)MOVPDI2DImr",
496 "(V?)MOVPQI2QImr",
497 "(V?)MOVPQIto64mr",
498 "(V?)MOVSDmr",
499 "(V?)MOVSSmr",
500 "(V?)MOVUPD(Y?)mr",
501 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000502
Gadi Haber323f2e12017-10-24 20:19:47 +0000503def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
504 let Latency = 2;
505 let NumMicroOps = 2;
506 let ResourceCycles = [2];
507}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000508def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000509
510def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
511 let Latency = 2;
512 let NumMicroOps = 2;
513 let ResourceCycles = [2];
514}
Craig Topper5a69a002018-03-21 06:28:42 +0000515def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
516 "ROL(8|16|32|64)ri",
517 "ROR(8|16|32|64)r1",
518 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000519
520def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
521 let Latency = 2;
522 let NumMicroOps = 2;
523 let ResourceCycles = [2];
524}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000525def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
526 MFENCE,
527 WAIT,
528 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000529
530def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
531 let Latency = 2;
532 let NumMicroOps = 2;
533 let ResourceCycles = [1,1];
534}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000535def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000536 "(V?)CVTPS2PDrr",
537 "(V?)CVTSS2SDrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000538 "(V?)PSLLDrr",
539 "(V?)PSLLQrr",
540 "(V?)PSLLWrr",
541 "(V?)PSRADrr",
542 "(V?)PSRAWrr",
543 "(V?)PSRLDrr",
544 "(V?)PSRLQrr",
545 "(V?)PSRLWrr",
546 "(V?)PTESTrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000547
548def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
549 let Latency = 2;
550 let NumMicroOps = 2;
551 let ResourceCycles = [1,1];
552}
553def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
554
555def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
556 let Latency = 2;
557 let NumMicroOps = 2;
558 let ResourceCycles = [1,1];
559}
560def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
561
562def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
563 let Latency = 2;
564 let NumMicroOps = 2;
565 let ResourceCycles = [1,1];
566}
567def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
568
569def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
570 let Latency = 2;
571 let NumMicroOps = 2;
572 let ResourceCycles = [1,1];
573}
Craig Topper498875f2018-04-04 17:54:19 +0000574def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
575
576def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
577 let Latency = 1;
578 let NumMicroOps = 1;
579 let ResourceCycles = [1];
580}
581def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000582
583def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
584 let Latency = 2;
585 let NumMicroOps = 2;
586 let ResourceCycles = [1,1];
587}
Craig Topper2d451e72018-03-18 08:38:06 +0000588def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000589def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000590def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
591 "ADC8ri",
592 "CMOV(A|BE)(16|32|64)rr",
593 "SBB8i8",
594 "SBB8ri",
595 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000596
Gadi Haber323f2e12017-10-24 20:19:47 +0000597def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
598 let Latency = 2;
599 let NumMicroOps = 3;
600 let ResourceCycles = [1,1,1];
601}
602def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
603
Gadi Haber323f2e12017-10-24 20:19:47 +0000604def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
605 let Latency = 2;
606 let NumMicroOps = 3;
607 let ResourceCycles = [1,1,1];
608}
609def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
610
611def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
612 let Latency = 2;
613 let NumMicroOps = 3;
614 let ResourceCycles = [1,1,1];
615}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000616def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
617 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000618def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000619 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000620
Gadi Haber323f2e12017-10-24 20:19:47 +0000621def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
622 let Latency = 3;
623 let NumMicroOps = 1;
624 let ResourceCycles = [1];
625}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000626def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000627 "PDEP(32|64)rr",
628 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000629 "SHLD(16|32|64)rri8",
630 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000631 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000632
633def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000634 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000635 let NumMicroOps = 2;
636 let ResourceCycles = [1,1];
637}
Clement Courbet327fac42018-03-07 08:14:02 +0000638def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000639
640def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
641 let Latency = 3;
642 let NumMicroOps = 1;
643 let ResourceCycles = [1];
644}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000645def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
646 "VPBROADCASTWrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000647 "VPMOVSXBDYrr",
648 "VPMOVSXBQYrr",
649 "VPMOVSXBWYrr",
650 "VPMOVSXDQYrr",
651 "VPMOVSXWDYrr",
652 "VPMOVSXWQYrr",
653 "VPMOVZXBDYrr",
654 "VPMOVZXBQYrr",
655 "VPMOVZXBWYrr",
656 "VPMOVZXDQYrr",
657 "VPMOVZXWDYrr",
658 "VPMOVZXWQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000659
Gadi Haber323f2e12017-10-24 20:19:47 +0000660def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000661 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000662 let NumMicroOps = 3;
663 let ResourceCycles = [3];
664}
Craig Topperb5f26592018-04-19 18:00:17 +0000665def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
666 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
667 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000668
669def BWWriteResGroup31 : SchedWriteRes<[BWPort0,BWPort5]> {
670 let Latency = 3;
671 let NumMicroOps = 3;
672 let ResourceCycles = [2,1];
673}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000674def: InstRW<[BWWriteResGroup31], (instregex "VPSLLVD(Y?)rr",
675 "VPSRAVD(Y?)rr",
676 "VPSRLVD(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000677
Gadi Haber323f2e12017-10-24 20:19:47 +0000678def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
679 let Latency = 3;
680 let NumMicroOps = 3;
681 let ResourceCycles = [2,1];
682}
Craig Topper5a69a002018-03-21 06:28:42 +0000683def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
684 "MMX_PACKSSWBirr",
685 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000686
687def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
688 let Latency = 3;
689 let NumMicroOps = 3;
690 let ResourceCycles = [1,2];
691}
692def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
693
694def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
695 let Latency = 3;
696 let NumMicroOps = 3;
697 let ResourceCycles = [1,2];
698}
Craig Topper5a69a002018-03-21 06:28:42 +0000699def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
700 "RCL(8|16|32|64)ri",
701 "RCR(8|16|32|64)r1",
702 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000703
704def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
705 let Latency = 3;
706 let NumMicroOps = 3;
707 let ResourceCycles = [2,1];
708}
Craig Topper5a69a002018-03-21 06:28:42 +0000709def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
710 "ROR(8|16|32|64)rCL",
711 "SAR(8|16|32|64)rCL",
712 "SHL(8|16|32|64)rCL",
713 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000714
715def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
716 let Latency = 3;
717 let NumMicroOps = 4;
718 let ResourceCycles = [1,1,1,1];
719}
720def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
721
722def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
723 let Latency = 3;
724 let NumMicroOps = 4;
725 let ResourceCycles = [1,1,1,1];
726}
Craig Topper5a69a002018-03-21 06:28:42 +0000727def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
728 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000729
730def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
731 let Latency = 4;
732 let NumMicroOps = 2;
733 let ResourceCycles = [1,1];
734}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000735def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
736 "(V?)CVTSD2SIrr",
737 "(V?)CVTSS2SI64rr",
738 "(V?)CVTSS2SIrr",
739 "(V?)CVTTSD2SI64rr",
740 "(V?)CVTTSD2SIrr",
741 "(V?)CVTTSS2SI64rr",
742 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000743
744def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
745 let Latency = 4;
746 let NumMicroOps = 2;
747 let ResourceCycles = [1,1];
748}
Craig Topper5a69a002018-03-21 06:28:42 +0000749def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr",
750 "VPSLLDYrr",
751 "VPSLLQYrr",
752 "VPSLLWYrr",
753 "VPSRADYrr",
754 "VPSRAWYrr",
755 "VPSRLDYrr",
756 "VPSRLQYrr",
757 "VPSRLWYrr",
758 "VPTESTYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000759
760def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
761 let Latency = 4;
762 let NumMicroOps = 2;
763 let ResourceCycles = [1,1];
764}
765def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
766
767def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
768 let Latency = 4;
769 let NumMicroOps = 2;
770 let ResourceCycles = [1,1];
771}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000772def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000773def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000774 "MMX_CVTPI2PDirr",
775 "MMX_CVTPS2PIirr",
776 "MMX_CVTTPD2PIirr",
777 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000778 "(V?)CVTDQ2PDrr",
779 "(V?)CVTPD2DQrr",
780 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000781 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000782 "(V?)CVTSD2SSrr",
783 "(V?)CVTSI642SDrr",
784 "(V?)CVTSI2SDrr",
785 "(V?)CVTSI2SSrr",
786 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000787
788def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
789 let Latency = 4;
790 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000791 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000792}
Craig Topper5a69a002018-03-21 06:28:42 +0000793def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000794
795def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
796 let Latency = 4;
797 let NumMicroOps = 3;
798 let ResourceCycles = [1,1,1];
799}
800def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
801
802def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
803 let Latency = 4;
804 let NumMicroOps = 3;
805 let ResourceCycles = [1,1,1];
806}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000807def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
808 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000809
810def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
811 let Latency = 4;
812 let NumMicroOps = 4;
813 let ResourceCycles = [4];
814}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000815def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000816
817def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
818 let Latency = 4;
819 let NumMicroOps = 4;
820 let ResourceCycles = [1,3];
821}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000822def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000823
824def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
825 let Latency = 5;
826 let NumMicroOps = 1;
827 let ResourceCycles = [1];
828}
Simon Pilgrima53d3302018-05-02 16:16:24 +0000829def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr",
830 "MUL_FPrST0",
831 "MUL_FST0r",
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000832 "MUL_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000833
Gadi Haber323f2e12017-10-24 20:19:47 +0000834def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
835 let Latency = 5;
836 let NumMicroOps = 1;
837 let ResourceCycles = [1];
838}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000839def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000840 "MOVSX(16|32|64)rm32",
841 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000842 "MOVZX(16|32|64)rm16",
843 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000844 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000845 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000846 "(V?)MOVSHDUPrm",
847 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000848 "VPBROADCASTDrm",
849 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000850
851def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
852 let Latency = 5;
853 let NumMicroOps = 3;
854 let ResourceCycles = [1,2];
855}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000856def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000857
858def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
859 let Latency = 5;
860 let NumMicroOps = 3;
861 let ResourceCycles = [1,1,1];
862}
863def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
864
865def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000866 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000867 let NumMicroOps = 3;
868 let ResourceCycles = [1,1,1];
869}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000870def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000871
872def BWWriteResGroup53 : SchedWriteRes<[BWPort0,BWPort4,BWPort237,BWPort15]> {
873 let Latency = 5;
874 let NumMicroOps = 4;
875 let ResourceCycles = [1,1,1,1];
876}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000877def: InstRW<[BWWriteResGroup53], (instregex "VMASKMOVPD(Y?)mr",
878 "VMASKMOVPS(Y?)mr",
879 "VPMASKMOVD(Y?)mr",
880 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000881
882def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
883 let Latency = 5;
884 let NumMicroOps = 5;
885 let ResourceCycles = [1,4];
886}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000887def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000888
889def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
890 let Latency = 5;
891 let NumMicroOps = 5;
892 let ResourceCycles = [1,4];
893}
894def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
895
896def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
897 let Latency = 5;
898 let NumMicroOps = 5;
899 let ResourceCycles = [2,3];
900}
Craig Topper5a69a002018-03-21 06:28:42 +0000901def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000902
903def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
904 let Latency = 5;
905 let NumMicroOps = 6;
906 let ResourceCycles = [1,1,4];
907}
Craig Topper5a69a002018-03-21 06:28:42 +0000908def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000909
910def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
911 let Latency = 6;
912 let NumMicroOps = 1;
913 let ResourceCycles = [1];
914}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000915def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000916 "VBROADCASTF128",
917 "VBROADCASTI128",
918 "VBROADCASTSDYrm",
919 "VBROADCASTSSYrm",
920 "VLDDQUYrm",
921 "VMOVAPDYrm",
922 "VMOVAPSYrm",
923 "VMOVDDUPYrm",
924 "VMOVDQAYrm",
925 "VMOVDQUYrm",
926 "VMOVNTDQAYrm",
927 "VMOVSHDUPYrm",
928 "VMOVSLDUPYrm",
929 "VMOVUPDYrm",
930 "VMOVUPSYrm",
931 "VPBROADCASTDYrm",
932 "VPBROADCASTQYrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000933 "(V?)ROUNDPD(Y?)r",
934 "(V?)ROUNDPS(Y?)r",
935 "(V?)ROUNDSDr",
936 "(V?)ROUNDSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000937
938def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
939 let Latency = 6;
940 let NumMicroOps = 2;
941 let ResourceCycles = [1,1];
942}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000943def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000944 "(V?)CVTPS2PDrm",
945 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000946 "VPSLLVQrm",
947 "VPSRLVQrm",
948 "VTESTPDrm",
949 "VTESTPSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000950
951def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
952 let Latency = 6;
953 let NumMicroOps = 2;
954 let ResourceCycles = [1,1];
955}
Craig Topper5a69a002018-03-21 06:28:42 +0000956def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
957 "VCVTPD2DQYrr",
958 "VCVTPD2PSYrr",
959 "VCVTPS2PHYrr",
960 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000961
Gadi Haber323f2e12017-10-24 20:19:47 +0000962def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
963 let Latency = 6;
964 let NumMicroOps = 2;
965 let ResourceCycles = [1,1];
966}
Craig Topper5a69a002018-03-21 06:28:42 +0000967def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
968 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000969
970def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
971 let Latency = 6;
972 let NumMicroOps = 2;
973 let ResourceCycles = [1,1];
974}
Craig Topperdfccafe2018-04-18 06:41:25 +0000975def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +0000976def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
977 ADCX32rm, ADCX64rm,
978 ADOX32rm, ADOX64rm,
979 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000980
981def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
982 let Latency = 6;
983 let NumMicroOps = 2;
984 let ResourceCycles = [1,1];
985}
Craig Topper5a69a002018-03-21 06:28:42 +0000986def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
987 "BLSI(32|64)rm",
988 "BLSMSK(32|64)rm",
989 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +0000990 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000991
992def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
993 let Latency = 6;
994 let NumMicroOps = 2;
995 let ResourceCycles = [1,1];
996}
Simon Pilgrim06e16542018-04-22 18:35:53 +0000997def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +0000998 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000999 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001000
1001def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1002 let Latency = 6;
1003 let NumMicroOps = 2;
1004 let ResourceCycles = [1,1];
1005}
Craig Topper2d451e72018-03-18 08:38:06 +00001006def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001007def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001008
1009def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1010 let Latency = 6;
1011 let NumMicroOps = 4;
1012 let ResourceCycles = [1,1,2];
1013}
Craig Topper5a69a002018-03-21 06:28:42 +00001014def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1015 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001016
1017def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1018 let Latency = 6;
1019 let NumMicroOps = 4;
1020 let ResourceCycles = [1,1,1,1];
1021}
1022def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1023
1024def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1025 let Latency = 6;
1026 let NumMicroOps = 4;
1027 let ResourceCycles = [1,1,1,1];
1028}
Craig Topper5a69a002018-03-21 06:28:42 +00001029def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1030 "BTR(16|32|64)mi8",
1031 "BTS(16|32|64)mi8",
1032 "SAR(8|16|32|64)m1",
1033 "SAR(8|16|32|64)mi",
1034 "SHL(8|16|32|64)m1",
1035 "SHL(8|16|32|64)mi",
1036 "SHR(8|16|32|64)m1",
1037 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001038
1039def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1040 let Latency = 6;
1041 let NumMicroOps = 4;
1042 let ResourceCycles = [1,1,1,1];
1043}
Craig Topperf0d04262018-04-06 16:16:48 +00001044def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1045 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001046
1047def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1048 let Latency = 6;
1049 let NumMicroOps = 6;
1050 let ResourceCycles = [1,5];
1051}
1052def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1053
Gadi Haber323f2e12017-10-24 20:19:47 +00001054def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1055 let Latency = 7;
1056 let NumMicroOps = 2;
1057 let ResourceCycles = [1,1];
1058}
Craig Topper5a69a002018-03-21 06:28:42 +00001059def: InstRW<[BWWriteResGroup73], (instregex "VPSLLDYrm",
1060 "VPSLLQYrm",
1061 "VPSLLVQYrm",
1062 "VPSLLWYrm",
1063 "VPSRADYrm",
1064 "VPSRAWYrm",
1065 "VPSRLDYrm",
1066 "VPSRLQYrm",
1067 "VPSRLVQYrm",
1068 "VPSRLWYrm",
1069 "VTESTPDYrm",
1070 "VTESTPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001071
1072def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1073 let Latency = 7;
1074 let NumMicroOps = 2;
1075 let ResourceCycles = [1,1];
1076}
Craig Topper5a69a002018-03-21 06:28:42 +00001077def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1078 "FCOM64m",
1079 "FCOMP32m",
1080 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001081
1082def BWWriteResGroup75 : SchedWriteRes<[BWPort5,BWPort23]> {
1083 let Latency = 7;
1084 let NumMicroOps = 2;
1085 let ResourceCycles = [1,1];
1086}
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +00001087def: InstRW<[BWWriteResGroup75], (instregex "VPACKSSDWYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001088 "VPACKSSWBYrm",
1089 "VPACKUSDWYrm",
1090 "VPACKUSWBYrm",
1091 "VPALIGNRYrmi",
1092 "VPBLENDWYrmi",
Craig Topper5a69a002018-03-21 06:28:42 +00001093 "VPSHUFBYrm",
1094 "VPSHUFDYmi",
1095 "VPSHUFHWYmi",
1096 "VPSHUFLWYmi",
1097 "VPUNPCKHBWYrm",
1098 "VPUNPCKHDQYrm",
1099 "VPUNPCKHQDQYrm",
1100 "VPUNPCKHWDYrm",
1101 "VPUNPCKLBWYrm",
1102 "VPUNPCKLDQYrm",
1103 "VPUNPCKLQDQYrm",
Simon Pilgrimdd8eae12018-05-01 14:25:01 +00001104 "VPUNPCKLWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001105
1106def BWWriteResGroup76 : SchedWriteRes<[BWPort23,BWPort15]> {
1107 let Latency = 7;
1108 let NumMicroOps = 2;
1109 let ResourceCycles = [1,1];
1110}
Craig Topper5a69a002018-03-21 06:28:42 +00001111def: InstRW<[BWWriteResGroup76], (instregex "VPABSBYrm",
1112 "VPABSDYrm",
1113 "VPABSWYrm",
1114 "VPADDBYrm",
1115 "VPADDDYrm",
1116 "VPADDQYrm",
1117 "VPADDSBYrm",
1118 "VPADDSWYrm",
1119 "VPADDUSBYrm",
1120 "VPADDUSWYrm",
1121 "VPADDWYrm",
1122 "VPAVGBYrm",
1123 "VPAVGWYrm",
1124 "VPCMPEQBYrm",
1125 "VPCMPEQDYrm",
1126 "VPCMPEQQYrm",
1127 "VPCMPEQWYrm",
1128 "VPCMPGTBYrm",
1129 "VPCMPGTDYrm",
1130 "VPCMPGTWYrm",
1131 "VPMAXSBYrm",
1132 "VPMAXSDYrm",
1133 "VPMAXSWYrm",
1134 "VPMAXUBYrm",
1135 "VPMAXUDYrm",
1136 "VPMAXUWYrm",
1137 "VPMINSBYrm",
1138 "VPMINSDYrm",
1139 "VPMINSWYrm",
1140 "VPMINUBYrm",
1141 "VPMINUDYrm",
1142 "VPMINUWYrm",
1143 "VPSIGNBYrm",
1144 "VPSIGNDYrm",
1145 "VPSIGNWYrm",
1146 "VPSUBBYrm",
1147 "VPSUBDYrm",
1148 "VPSUBQYrm",
1149 "VPSUBSBYrm",
1150 "VPSUBSWYrm",
1151 "VPSUBUSBYrm",
1152 "VPSUBUSWYrm",
1153 "VPSUBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001154
1155def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1156 let Latency = 7;
1157 let NumMicroOps = 2;
1158 let ResourceCycles = [1,1];
1159}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001160def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001161
Gadi Haber323f2e12017-10-24 20:19:47 +00001162def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1163 let Latency = 7;
1164 let NumMicroOps = 3;
1165 let ResourceCycles = [2,1];
1166}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001167def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001168 "MMX_PACKSSWBirm",
1169 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001170 "VMASKMOVPDrm",
1171 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001172 "VPMASKMOVDrm",
1173 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001174
1175def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1176 let Latency = 7;
1177 let NumMicroOps = 3;
1178 let ResourceCycles = [1,2];
1179}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001180def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1181 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001182
1183def BWWriteResGroup81 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1184 let Latency = 7;
1185 let NumMicroOps = 3;
1186 let ResourceCycles = [1,1,1];
1187}
Simon Pilgrimd5ada492018-04-29 15:33:15 +00001188def: InstRW<[BWWriteResGroup81], (instregex "(V?)PSLLDrm",
1189 "(V?)PSLLQrm",
1190 "(V?)PSLLWrm",
1191 "(V?)PSRADrm",
1192 "(V?)PSRAWrm",
1193 "(V?)PSRLDrm",
1194 "(V?)PSRLQrm",
1195 "(V?)PSRLWrm",
1196 "(V?)PTESTrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001197
1198def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1199 let Latency = 7;
1200 let NumMicroOps = 3;
1201 let ResourceCycles = [1,1,1];
1202}
1203def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1204
Gadi Haber323f2e12017-10-24 20:19:47 +00001205def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1206 let Latency = 7;
1207 let NumMicroOps = 3;
1208 let ResourceCycles = [1,1,1];
1209}
Craig Topper5a69a002018-03-21 06:28:42 +00001210def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1211 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001212
Gadi Haber323f2e12017-10-24 20:19:47 +00001213def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1214 let Latency = 7;
1215 let NumMicroOps = 3;
1216 let ResourceCycles = [1,1,1];
1217}
Craig Topperf4cd9082018-01-19 05:47:32 +00001218def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001219
1220def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1221 let Latency = 7;
1222 let NumMicroOps = 5;
1223 let ResourceCycles = [1,1,1,2];
1224}
Craig Topper5a69a002018-03-21 06:28:42 +00001225def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1226 "ROL(8|16|32|64)mi",
1227 "ROR(8|16|32|64)m1",
1228 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001229
1230def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1231 let Latency = 7;
1232 let NumMicroOps = 5;
1233 let ResourceCycles = [1,1,1,2];
1234}
Craig Topper5a69a002018-03-21 06:28:42 +00001235def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001236
1237def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1238 let Latency = 7;
1239 let NumMicroOps = 5;
1240 let ResourceCycles = [1,1,1,1,1];
1241}
Craig Topper5a69a002018-03-21 06:28:42 +00001242def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1243 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001244
1245def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1246 let Latency = 7;
1247 let NumMicroOps = 7;
1248 let ResourceCycles = [2,2,1,2];
1249}
Craig Topper2d451e72018-03-18 08:38:06 +00001250def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001251
1252def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1253 let Latency = 8;
1254 let NumMicroOps = 2;
1255 let ResourceCycles = [1,1];
1256}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001257def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001258 "PDEP(32|64)rm",
1259 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001260 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001261
1262def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001263 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001264 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001265 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001266}
Craig Topperf846e2d2018-04-19 05:34:05 +00001267def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001268
Craig Topperf846e2d2018-04-19 05:34:05 +00001269def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1270 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001271 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001272 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001273}
Craig Topper5a69a002018-03-21 06:28:42 +00001274def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001275
Gadi Haber323f2e12017-10-24 20:19:47 +00001276def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1277 let Latency = 8;
1278 let NumMicroOps = 2;
1279 let ResourceCycles = [1,1];
1280}
Craig Topper5a69a002018-03-21 06:28:42 +00001281def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1282 "VPMOVSXBQYrm",
1283 "VPMOVSXBWYrm",
1284 "VPMOVSXDQYrm",
1285 "VPMOVSXWDYrm",
1286 "VPMOVSXWQYrm",
1287 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001288
Gadi Haber323f2e12017-10-24 20:19:47 +00001289def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1290 let Latency = 8;
1291 let NumMicroOps = 3;
1292 let ResourceCycles = [2,1];
1293}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001294def: InstRW<[BWWriteResGroup94], (instregex "VMASKMOVPDYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001295 "VMASKMOVPSYrm",
1296 "VPBLENDVBYrm",
1297 "VPMASKMOVDYrm",
1298 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001299
1300def BWWriteResGroup95 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1301 let Latency = 8;
1302 let NumMicroOps = 4;
1303 let ResourceCycles = [2,1,1];
1304}
Craig Topper5a69a002018-03-21 06:28:42 +00001305def: InstRW<[BWWriteResGroup95], (instregex "VPSLLVDrm",
1306 "VPSRAVDrm",
1307 "VPSRLVDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001308
Gadi Haber323f2e12017-10-24 20:19:47 +00001309def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1310 let Latency = 8;
1311 let NumMicroOps = 5;
1312 let ResourceCycles = [1,1,1,2];
1313}
Craig Topper5a69a002018-03-21 06:28:42 +00001314def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1315 "RCL(8|16|32|64)mi",
1316 "RCR(8|16|32|64)m1",
1317 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001318
1319def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1320 let Latency = 8;
1321 let NumMicroOps = 5;
1322 let ResourceCycles = [1,1,2,1];
1323}
Craig Topper13a16502018-03-19 00:56:09 +00001324def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001325
1326def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1327 let Latency = 8;
1328 let NumMicroOps = 6;
1329 let ResourceCycles = [1,1,1,3];
1330}
Craig Topper9f834812018-04-01 21:54:24 +00001331def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001332
1333def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1334 let Latency = 8;
1335 let NumMicroOps = 6;
1336 let ResourceCycles = [1,1,1,2,1];
1337}
Craig Topper9f834812018-04-01 21:54:24 +00001338def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001339 "CMPXCHG(8|16|32|64)rm",
1340 "ROL(8|16|32|64)mCL",
1341 "SAR(8|16|32|64)mCL",
1342 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001343 "SHL(8|16|32|64)mCL",
1344 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001345def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1346 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001347
1348def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1349 let Latency = 9;
1350 let NumMicroOps = 2;
1351 let ResourceCycles = [1,1];
1352}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001353def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1354 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001355 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001356 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001357
1358def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1359 let Latency = 9;
1360 let NumMicroOps = 2;
1361 let ResourceCycles = [1,1];
1362}
Craig Topper5a69a002018-03-21 06:28:42 +00001363def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1364 "VPERM2I128rm",
1365 "VPERMDYrm",
1366 "VPERMPDYmi",
1367 "VPERMPSYrm",
1368 "VPERMQYmi",
1369 "VPMOVZXBDYrm",
1370 "VPMOVZXBQYrm",
1371 "VPMOVZXBWYrm",
1372 "VPMOVZXDQYrm",
1373 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001374
Gadi Haber323f2e12017-10-24 20:19:47 +00001375def BWWriteResGroup104 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1376 let Latency = 9;
1377 let NumMicroOps = 3;
1378 let ResourceCycles = [1,1,1];
1379}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001380def: InstRW<[BWWriteResGroup104], (instregex "(V?)DPPDrri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001381
1382def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1383 let Latency = 9;
1384 let NumMicroOps = 3;
1385 let ResourceCycles = [1,1,1];
1386}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001387def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1388 "(V?)CVTSD2SIrm",
1389 "(V?)CVTSS2SI64rm",
1390 "(V?)CVTSS2SIrm",
1391 "(V?)CVTTSD2SI64rm",
1392 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001393 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001394 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001395
1396def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1397 let Latency = 9;
1398 let NumMicroOps = 3;
1399 let ResourceCycles = [1,1,1];
1400}
1401def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1402
1403def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1404 let Latency = 9;
1405 let NumMicroOps = 3;
1406 let ResourceCycles = [1,1,1];
1407}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001408def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001409def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001410 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001411 "CVTTPD2DQrm",
1412 "MMX_CVTPD2PIirm",
1413 "MMX_CVTPI2PDirm",
1414 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001415 "(V?)CVTDQ2PDrm",
1416 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001417
1418def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1419 let Latency = 9;
1420 let NumMicroOps = 3;
1421 let ResourceCycles = [1,1,1];
1422}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001423def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1424 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001425
1426def BWWriteResGroup109 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1427 let Latency = 9;
1428 let NumMicroOps = 4;
1429 let ResourceCycles = [2,1,1];
1430}
Craig Topper5a69a002018-03-21 06:28:42 +00001431def: InstRW<[BWWriteResGroup109], (instregex "VPSLLVDYrm",
1432 "VPSRAVDYrm",
1433 "VPSRLVDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001434
1435def BWWriteResGroup110 : SchedWriteRes<[BWPort5,BWPort23,BWPort15]> {
1436 let Latency = 9;
1437 let NumMicroOps = 4;
1438 let ResourceCycles = [2,1,1];
1439}
Craig Topper5a69a002018-03-21 06:28:42 +00001440def: InstRW<[BWWriteResGroup110], (instregex "VPHADDDYrm",
1441 "VPHADDSWYrm",
1442 "VPHADDWYrm",
1443 "VPHSUBDYrm",
1444 "VPHSUBSWYrm",
1445 "VPHSUBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001446
1447def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1448 let Latency = 9;
1449 let NumMicroOps = 4;
1450 let ResourceCycles = [1,1,1,1];
1451}
Craig Topper5a69a002018-03-21 06:28:42 +00001452def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1453 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001454
1455def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1456 let Latency = 9;
1457 let NumMicroOps = 5;
1458 let ResourceCycles = [1,1,3];
1459}
1460def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1461
1462def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1463 let Latency = 9;
1464 let NumMicroOps = 5;
1465 let ResourceCycles = [1,2,1,1];
1466}
Craig Topper5a69a002018-03-21 06:28:42 +00001467def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1468 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001469
Gadi Haber323f2e12017-10-24 20:19:47 +00001470def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1471 let Latency = 10;
1472 let NumMicroOps = 2;
1473 let ResourceCycles = [1,1];
1474}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001475def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001476
Gadi Haber323f2e12017-10-24 20:19:47 +00001477def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1478 let Latency = 10;
1479 let NumMicroOps = 3;
1480 let ResourceCycles = [2,1];
1481}
Craig Topper5a69a002018-03-21 06:28:42 +00001482def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1483 "FICOM32m",
1484 "FICOMP16m",
1485 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001486
1487def BWWriteResGroup118 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1488 let Latency = 10;
1489 let NumMicroOps = 3;
1490 let ResourceCycles = [1,1,1];
1491}
1492def: InstRW<[BWWriteResGroup118], (instregex "VPTESTYrm")>;
1493
Gadi Haber323f2e12017-10-24 20:19:47 +00001494def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1495 let Latency = 10;
1496 let NumMicroOps = 4;
1497 let ResourceCycles = [1,1,1,1];
1498}
1499def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1500
1501def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001502 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001503 let NumMicroOps = 4;
1504 let ResourceCycles = [1,1,1,1];
1505}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001506def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001507
Craig Topper8104f262018-04-02 05:33:28 +00001508def BWWriteResGroup122 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001509 let Latency = 11;
1510 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001511 let ResourceCycles = [1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001512}
Craig Topper8104f262018-04-02 05:33:28 +00001513def: InstRW<[BWWriteResGroup122], (instregex "(V?)DIVPSrr")>;
1514
1515def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1516 let Latency = 11;
1517 let NumMicroOps = 1;
1518 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1519}
1520def: InstRW<[BWWriteResGroup122_1], (instregex "(V?)DIVSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001521
1522def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1523 let Latency = 11;
1524 let NumMicroOps = 2;
1525 let ResourceCycles = [1,1];
1526}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001527def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001528 "VPCMPGTQYrm",
1529 "VPMADDUBSWYrm",
1530 "VPMADDWDYrm",
1531 "VPMULDQYrm",
1532 "VPMULHRSWYrm",
1533 "VPMULHUWYrm",
1534 "VPMULHWYrm",
1535 "VPMULLWYrm",
1536 "VPMULUDQYrm",
1537 "VPSADBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001538
Gadi Haber323f2e12017-10-24 20:19:47 +00001539def BWWriteResGroup126 : SchedWriteRes<[BWPort0,BWPort015]> {
1540 let Latency = 11;
1541 let NumMicroOps = 3;
1542 let ResourceCycles = [2,1];
1543}
Craig Topper5a69a002018-03-21 06:28:42 +00001544def: InstRW<[BWWriteResGroup126], (instregex "VRCPPSYr",
1545 "VRSQRTPSYr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001546
1547def BWWriteResGroup127 : SchedWriteRes<[BWPort1,BWPort23]> {
1548 let Latency = 11;
1549 let NumMicroOps = 3;
1550 let ResourceCycles = [2,1];
1551}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001552def: InstRW<[BWWriteResGroup127], (instregex "(V?)ROUNDPDm",
1553 "(V?)ROUNDPSm",
1554 "(V?)ROUNDSDm",
1555 "(V?)ROUNDSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001556
1557def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1558 let Latency = 11;
1559 let NumMicroOps = 3;
1560 let ResourceCycles = [1,1,1];
1561}
1562def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1563
Gadi Haber323f2e12017-10-24 20:19:47 +00001564def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1565 let Latency = 11;
1566 let NumMicroOps = 6;
1567 let ResourceCycles = [1,1,1,1,2];
1568}
Craig Topper5a69a002018-03-21 06:28:42 +00001569def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1570 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001571
1572def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1573 let Latency = 11;
1574 let NumMicroOps = 7;
1575 let ResourceCycles = [2,2,3];
1576}
Craig Topper5a69a002018-03-21 06:28:42 +00001577def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1578 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001579
1580def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1581 let Latency = 11;
1582 let NumMicroOps = 9;
1583 let ResourceCycles = [1,4,1,3];
1584}
1585def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1586
1587def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1588 let Latency = 11;
1589 let NumMicroOps = 11;
1590 let ResourceCycles = [2,9];
1591}
Craig Topper2d451e72018-03-18 08:38:06 +00001592def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1593def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001594
Gadi Haber323f2e12017-10-24 20:19:47 +00001595def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1596 let Latency = 12;
1597 let NumMicroOps = 3;
1598 let ResourceCycles = [2,1];
1599}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001600def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m",
Craig Topper40d3b322018-03-22 21:55:20 +00001601 "VROUNDPDYm",
1602 "VROUNDPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001603
Craig Topper8104f262018-04-02 05:33:28 +00001604def BWWriteResGroup137 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001605 let Latency = 11;
Gadi Haber323f2e12017-10-24 20:19:47 +00001606 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001607 let ResourceCycles = [1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001608}
Craig Topper8104f262018-04-02 05:33:28 +00001609def: InstRW<[BWWriteResGroup137], (instregex "(V?)SQRTPSr")>;
1610
1611def BWWriteResGroup137_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1612 let Latency = 11;
1613 let NumMicroOps = 1;
1614 let ResourceCycles = [1,4];
1615}
1616def: InstRW<[BWWriteResGroup137_1], (instregex "(V?)SQRTSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001617
1618def BWWriteResGroup138 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1619 let Latency = 13;
1620 let NumMicroOps = 4;
Clement Courbetd2ff5fb2018-05-02 14:35:48 +00001621 let ResourceCycles = [1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001622}
1623def: InstRW<[BWWriteResGroup138], (instregex "VMPSADBWYrmi")>;
1624
Craig Topper8104f262018-04-02 05:33:28 +00001625def BWWriteResGroup139 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001626 let Latency = 14;
1627 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001628 let ResourceCycles = [1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001629}
Craig Topper8104f262018-04-02 05:33:28 +00001630def: InstRW<[BWWriteResGroup139], (instregex "(V?)DIVPDrr")>;
1631
1632def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1633 let Latency = 14;
1634 let NumMicroOps = 1;
1635 let ResourceCycles = [1,4];
1636}
1637def: InstRW<[BWWriteResGroup139_1], (instregex "(V?)DIVSDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001638
Gadi Haber323f2e12017-10-24 20:19:47 +00001639def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1640 let Latency = 14;
1641 let NumMicroOps = 3;
1642 let ResourceCycles = [1,1,1];
1643}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001644def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001645
1646def BWWriteResGroup142 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1647 let Latency = 14;
1648 let NumMicroOps = 4;
1649 let ResourceCycles = [2,1,1];
1650}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001651def: InstRW<[BWWriteResGroup142], (instregex "(V?)DPPS(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001652
1653def BWWriteResGroup143 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1654 let Latency = 14;
1655 let NumMicroOps = 4;
1656 let ResourceCycles = [1,1,1,1];
1657}
Craig Topper5a69a002018-03-21 06:28:42 +00001658def: InstRW<[BWWriteResGroup143], (instregex "(V?)DPPDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001659
1660def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1661 let Latency = 14;
1662 let NumMicroOps = 8;
1663 let ResourceCycles = [2,2,1,3];
1664}
1665def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1666
1667def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1668 let Latency = 14;
1669 let NumMicroOps = 10;
1670 let ResourceCycles = [2,3,1,4];
1671}
1672def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1673
1674def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1675 let Latency = 14;
1676 let NumMicroOps = 12;
1677 let ResourceCycles = [2,1,4,5];
1678}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001679def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001680
1681def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1682 let Latency = 15;
1683 let NumMicroOps = 1;
1684 let ResourceCycles = [1];
1685}
Craig Topper5a69a002018-03-21 06:28:42 +00001686def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1687 "DIVR_FST0r",
1688 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001689
Gadi Haber323f2e12017-10-24 20:19:47 +00001690def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1691 let Latency = 15;
1692 let NumMicroOps = 10;
1693 let ResourceCycles = [1,1,1,4,1,2];
1694}
Craig Topper13a16502018-03-19 00:56:09 +00001695def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001696
Craig Topper8104f262018-04-02 05:33:28 +00001697def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001698 let Latency = 16;
1699 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001700 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001701}
Craig Topper5a69a002018-03-21 06:28:42 +00001702def: InstRW<[BWWriteResGroup150], (instregex "(V?)DIVPSrm",
1703 "(V?)DIVSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001704
1705def BWWriteResGroup151 : SchedWriteRes<[BWPort0,BWPort23]> {
1706 let Latency = 16;
1707 let NumMicroOps = 3;
1708 let ResourceCycles = [2,1];
1709}
1710def: InstRW<[BWWriteResGroup151], (instregex "VPMULLDYrm")>;
1711
Gadi Haber323f2e12017-10-24 20:19:47 +00001712def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1713 let Latency = 16;
1714 let NumMicroOps = 14;
1715 let ResourceCycles = [1,1,1,4,2,5];
1716}
1717def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1718
1719def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1720 let Latency = 16;
1721 let NumMicroOps = 16;
1722 let ResourceCycles = [16];
1723}
Craig Topper5a69a002018-03-21 06:28:42 +00001724def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001725
Craig Topper8104f262018-04-02 05:33:28 +00001726def BWWriteResGroup155 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001727 let Latency = 17;
1728 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001729 let ResourceCycles = [2,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001730}
1731def: InstRW<[BWWriteResGroup155], (instregex "VDIVPSYrr")>;
1732
1733def BWWriteResGroup156 : SchedWriteRes<[BWPort0,BWPort23,BWPort015]> {
1734 let Latency = 17;
1735 let NumMicroOps = 4;
1736 let ResourceCycles = [2,1,1];
1737}
Craig Topper5a69a002018-03-21 06:28:42 +00001738def: InstRW<[BWWriteResGroup156], (instregex "VRCPPSYm",
1739 "VRSQRTPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001740
Craig Topper8104f262018-04-02 05:33:28 +00001741def BWWriteResGroup157 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001742 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001743 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001744 let ResourceCycles = [1,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001745}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001746def: InstRW<[BWWriteResGroup157], (instregex "(V?)SQRTPSm",
1747 "(V?)SQRTSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001748
Gadi Haber323f2e12017-10-24 20:19:47 +00001749def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1750 let Latency = 18;
1751 let NumMicroOps = 8;
1752 let ResourceCycles = [1,1,1,5];
1753}
Craig Topper5a69a002018-03-21 06:28:42 +00001754def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001755def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001756
1757def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1758 let Latency = 18;
1759 let NumMicroOps = 11;
1760 let ResourceCycles = [2,1,1,3,1,3];
1761}
Craig Topper13a16502018-03-19 00:56:09 +00001762def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001763
Craig Topper8104f262018-04-02 05:33:28 +00001764def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001765 let Latency = 19;
1766 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001767 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001768}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001769def: InstRW<[BWWriteResGroup161], (instregex "(V?)DIVPDrm",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001770 "(V?)DIVSDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001771
Gadi Haber323f2e12017-10-24 20:19:47 +00001772def BWWriteResGroup163 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1773 let Latency = 19;
1774 let NumMicroOps = 5;
1775 let ResourceCycles = [2,1,1,1];
1776}
Craig Topper5a69a002018-03-21 06:28:42 +00001777def: InstRW<[BWWriteResGroup163], (instregex "(V?)DPPSrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001778
Gadi Haber323f2e12017-10-24 20:19:47 +00001779def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1780 let Latency = 20;
1781 let NumMicroOps = 1;
1782 let ResourceCycles = [1];
1783}
Craig Topper5a69a002018-03-21 06:28:42 +00001784def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1785 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001786 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001787
1788def BWWriteResGroup166 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1789 let Latency = 20;
1790 let NumMicroOps = 5;
1791 let ResourceCycles = [2,1,1,1];
1792}
1793def: InstRW<[BWWriteResGroup166], (instregex "VDPPSYrmi")>;
1794
1795def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1796 let Latency = 20;
1797 let NumMicroOps = 8;
1798 let ResourceCycles = [1,1,1,1,1,1,2];
1799}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001800def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001801
Craig Topper8104f262018-04-02 05:33:28 +00001802def BWWriteResGroup168 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001803 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001804 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001805 let ResourceCycles = [1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001806}
Craig Topper8104f262018-04-02 05:33:28 +00001807def: InstRW<[BWWriteResGroup168], (instregex "(V?)SQRTPDr")>;
1808
1809def BWWriteResGroup168_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1810 let Latency = 16;
1811 let NumMicroOps = 1;
1812 let ResourceCycles = [1,8];
1813}
1814def: InstRW<[BWWriteResGroup168_1], (instregex "(V?)SQRTSDr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001815
1816def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1817 let Latency = 21;
1818 let NumMicroOps = 2;
1819 let ResourceCycles = [1,1];
1820}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001821def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001822
Craig Topper8104f262018-04-02 05:33:28 +00001823def BWWriteResGroup170 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001824 let Latency = 21;
1825 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001826 let ResourceCycles = [2,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001827}
1828def: InstRW<[BWWriteResGroup170], (instregex "VSQRTPSYr")>;
1829
1830def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1831 let Latency = 21;
1832 let NumMicroOps = 19;
1833 let ResourceCycles = [2,1,4,1,1,4,6];
1834}
1835def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1836
1837def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1838 let Latency = 22;
1839 let NumMicroOps = 18;
1840 let ResourceCycles = [1,1,16];
1841}
1842def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1843
Craig Topper8104f262018-04-02 05:33:28 +00001844def BWWriteResGroup173 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001845 let Latency = 23;
1846 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001847 let ResourceCycles = [2,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001848}
1849def: InstRW<[BWWriteResGroup173], (instregex "VDIVPDYrr")>;
1850
Craig Topper8104f262018-04-02 05:33:28 +00001851def BWWriteResGroup174 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001852 let Latency = 23;
1853 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001854 let ResourceCycles = [2,1,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001855}
1856def: InstRW<[BWWriteResGroup174], (instregex "VDIVPSYrm")>;
1857
Gadi Haber323f2e12017-10-24 20:19:47 +00001858def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1859 let Latency = 23;
1860 let NumMicroOps = 19;
1861 let ResourceCycles = [3,1,15];
1862}
Craig Topper391c6f92017-12-10 01:24:08 +00001863def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001864
1865def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1866 let Latency = 24;
1867 let NumMicroOps = 3;
1868 let ResourceCycles = [1,1,1];
1869}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001870def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001871
Craig Topper8104f262018-04-02 05:33:28 +00001872def BWWriteResGroup179 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001873 let Latency = 21;
Gadi Haber323f2e12017-10-24 20:19:47 +00001874 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001875 let ResourceCycles = [1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001876}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001877def: InstRW<[BWWriteResGroup179], (instregex "(V?)SQRTPDm",
1878 "(V?)SQRTSDm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001879
1880def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1881 let Latency = 26;
1882 let NumMicroOps = 2;
1883 let ResourceCycles = [1,1];
1884}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001885def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001886
Craig Topper8104f262018-04-02 05:33:28 +00001887def BWWriteResGroup181 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001888 let Latency = 27;
1889 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001890 let ResourceCycles = [2,1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001891}
1892def: InstRW<[BWWriteResGroup181], (instregex "VSQRTPSYm")>;
1893
1894def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1895 let Latency = 29;
1896 let NumMicroOps = 3;
1897 let ResourceCycles = [1,1,1];
1898}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001899def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001900
Craig Topper8104f262018-04-02 05:33:28 +00001901def BWWriteResGroup183 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001902 let Latency = 29;
1903 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001904 let ResourceCycles = [2,1,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001905}
1906def: InstRW<[BWWriteResGroup183], (instregex "VDIVPDYrm")>;
1907
1908def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1909 let Latency = 22;
1910 let NumMicroOps = 7;
1911 let ResourceCycles = [1,3,2,1];
1912}
Craig Topper17a31182017-12-16 18:35:29 +00001913def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001914
1915def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1916 let Latency = 23;
1917 let NumMicroOps = 9;
1918 let ResourceCycles = [1,3,4,1];
1919}
Craig Topper17a31182017-12-16 18:35:29 +00001920def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001921
1922def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1923 let Latency = 24;
1924 let NumMicroOps = 9;
1925 let ResourceCycles = [1,5,2,1];
1926}
Craig Topper17a31182017-12-16 18:35:29 +00001927def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001928
1929def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1930 let Latency = 25;
1931 let NumMicroOps = 7;
1932 let ResourceCycles = [1,3,2,1];
1933}
Craig Topper17a31182017-12-16 18:35:29 +00001934def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1935 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001936
1937def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1938 let Latency = 26;
1939 let NumMicroOps = 9;
1940 let ResourceCycles = [1,5,2,1];
1941}
Craig Topper17a31182017-12-16 18:35:29 +00001942def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001943
1944def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1945 let Latency = 26;
1946 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001947 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001948}
Craig Topper17a31182017-12-16 18:35:29 +00001949def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001950
1951def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1952 let Latency = 27;
1953 let NumMicroOps = 9;
1954 let ResourceCycles = [1,5,2,1];
1955}
Craig Topper17a31182017-12-16 18:35:29 +00001956def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001957
Gadi Haber323f2e12017-10-24 20:19:47 +00001958def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1959 let Latency = 29;
1960 let NumMicroOps = 27;
1961 let ResourceCycles = [1,5,1,1,19];
1962}
1963def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1964
1965def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1966 let Latency = 30;
1967 let NumMicroOps = 28;
1968 let ResourceCycles = [1,6,1,1,19];
1969}
Craig Topper2d451e72018-03-18 08:38:06 +00001970def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001971
1972def BWWriteResGroup187 : SchedWriteRes<[BWPort01,BWPort15,BWPort015,BWPort0156]> {
1973 let Latency = 31;
1974 let NumMicroOps = 31;
1975 let ResourceCycles = [8,1,21,1];
1976}
1977def: InstRW<[BWWriteResGroup187], (instregex "MMX_EMMS")>;
1978
Craig Topper8104f262018-04-02 05:33:28 +00001979def BWWriteResGroup189 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
1980 let Latency = 29;
Gadi Haber323f2e12017-10-24 20:19:47 +00001981 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001982 let ResourceCycles = [2,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00001983}
1984def: InstRW<[BWWriteResGroup189], (instregex "VSQRTPDYr")>;
1985
1986def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1987 let Latency = 34;
1988 let NumMicroOps = 8;
1989 let ResourceCycles = [2,2,2,1,1];
1990}
Craig Topper13a16502018-03-19 00:56:09 +00001991def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001992
1993def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
1994 let Latency = 34;
1995 let NumMicroOps = 23;
1996 let ResourceCycles = [1,5,3,4,10];
1997}
Craig Topper5a69a002018-03-21 06:28:42 +00001998def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
1999 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002000
2001def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
2002 let Latency = 35;
2003 let NumMicroOps = 8;
2004 let ResourceCycles = [2,2,2,1,1];
2005}
Craig Topper13a16502018-03-19 00:56:09 +00002006def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002007
2008def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
2009 let Latency = 35;
2010 let NumMicroOps = 23;
2011 let ResourceCycles = [1,5,2,1,4,10];
2012}
Craig Topper5a69a002018-03-21 06:28:42 +00002013def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
2014 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002015
Craig Topper8104f262018-04-02 05:33:28 +00002016def BWWriteResGroup195 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
2017 let Latency = 35;
Gadi Haber323f2e12017-10-24 20:19:47 +00002018 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00002019 let ResourceCycles = [2,1,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00002020}
2021def: InstRW<[BWWriteResGroup195], (instregex "VSQRTPDYm")>;
2022
2023def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
2024 let Latency = 42;
2025 let NumMicroOps = 22;
2026 let ResourceCycles = [2,20];
2027}
Craig Topper2d451e72018-03-18 08:38:06 +00002028def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002029
2030def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
2031 let Latency = 60;
2032 let NumMicroOps = 64;
2033 let ResourceCycles = [2,2,8,1,10,2,39];
2034}
2035def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002036
2037def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
2038 let Latency = 63;
2039 let NumMicroOps = 88;
2040 let ResourceCycles = [4,4,31,1,2,1,45];
2041}
Craig Topper2d451e72018-03-18 08:38:06 +00002042def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002043
2044def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
2045 let Latency = 63;
2046 let NumMicroOps = 90;
2047 let ResourceCycles = [4,2,33,1,2,1,47];
2048}
Craig Topper2d451e72018-03-18 08:38:06 +00002049def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002050
2051def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
2052 let Latency = 75;
2053 let NumMicroOps = 15;
2054 let ResourceCycles = [6,3,6];
2055}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00002056def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002057
2058def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
2059 let Latency = 80;
2060 let NumMicroOps = 32;
2061 let ResourceCycles = [7,7,3,3,1,11];
2062}
2063def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
2064
2065def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
2066 let Latency = 115;
2067 let NumMicroOps = 100;
2068 let ResourceCycles = [9,9,11,8,1,11,21,30];
2069}
2070def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002071
2072} // SchedModel
2073