blob: 0531ef5700b06e6a63c1a03c978398ffc8b732fb [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.
163defm : BWWriteResPair<WriteFMul, [BWPort0], 5, [1], 1, 5>; // Floating point multiplication.
164defm : BWWriteResPair<WriteFMulY, [BWPort0], 5, [1], 1, 7>; // Floating point multiplication (YMM/ZMM).
165defm : 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 Pilgrim30c38c32018-03-19 14:46:07 +0000208defm : BWWriteResPair<WriteShuffle, [BWPort5], 1>; // Vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000209defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1>; // 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 Pilgrim30c38c32018-03-19 14:46:07 +0000337defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3>; // Fp 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000338defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3>; // Fp 256-bit width vector variable shuffles.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000339defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3>; // 256-bit width vector shuffles.
Simon Pilgrim89c8a102018-04-11 13:49:19 +0000340defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3>; // 256-bit width vector variable shuffles.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000341defm : 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
660def BWWriteResGroup29 : SchedWriteRes<[BWPort01]> {
661 let Latency = 3;
662 let NumMicroOps = 1;
663 let ResourceCycles = [1];
664}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000665def: InstRW<[BWWriteResGroup29], (instregex "(V?)MULPD(Y?)rr",
666 "(V?)MULPS(Y?)rr",
667 "(V?)MULSDrr",
668 "(V?)MULSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000669
670def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000671 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000672 let NumMicroOps = 3;
673 let ResourceCycles = [3];
674}
Craig Topperb5f26592018-04-19 18:00:17 +0000675def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
676 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
677 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000678
679def BWWriteResGroup31 : SchedWriteRes<[BWPort0,BWPort5]> {
680 let Latency = 3;
681 let NumMicroOps = 3;
682 let ResourceCycles = [2,1];
683}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000684def: InstRW<[BWWriteResGroup31], (instregex "VPSLLVD(Y?)rr",
685 "VPSRAVD(Y?)rr",
686 "VPSRLVD(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000687
Gadi Haber323f2e12017-10-24 20:19:47 +0000688def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
689 let Latency = 3;
690 let NumMicroOps = 3;
691 let ResourceCycles = [2,1];
692}
Craig Topper5a69a002018-03-21 06:28:42 +0000693def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
694 "MMX_PACKSSWBirr",
695 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000696
697def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
698 let Latency = 3;
699 let NumMicroOps = 3;
700 let ResourceCycles = [1,2];
701}
702def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
703
704def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
705 let Latency = 3;
706 let NumMicroOps = 3;
707 let ResourceCycles = [1,2];
708}
Craig Topper5a69a002018-03-21 06:28:42 +0000709def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
710 "RCL(8|16|32|64)ri",
711 "RCR(8|16|32|64)r1",
712 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000713
714def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
715 let Latency = 3;
716 let NumMicroOps = 3;
717 let ResourceCycles = [2,1];
718}
Craig Topper5a69a002018-03-21 06:28:42 +0000719def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
720 "ROR(8|16|32|64)rCL",
721 "SAR(8|16|32|64)rCL",
722 "SHL(8|16|32|64)rCL",
723 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000724
725def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
726 let Latency = 3;
727 let NumMicroOps = 4;
728 let ResourceCycles = [1,1,1,1];
729}
730def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
731
732def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
733 let Latency = 3;
734 let NumMicroOps = 4;
735 let ResourceCycles = [1,1,1,1];
736}
Craig Topper5a69a002018-03-21 06:28:42 +0000737def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
738 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000739
740def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
741 let Latency = 4;
742 let NumMicroOps = 2;
743 let ResourceCycles = [1,1];
744}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000745def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
746 "(V?)CVTSD2SIrr",
747 "(V?)CVTSS2SI64rr",
748 "(V?)CVTSS2SIrr",
749 "(V?)CVTTSD2SI64rr",
750 "(V?)CVTTSD2SIrr",
751 "(V?)CVTTSS2SI64rr",
752 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000753
754def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
755 let Latency = 4;
756 let NumMicroOps = 2;
757 let ResourceCycles = [1,1];
758}
Craig Topper5a69a002018-03-21 06:28:42 +0000759def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr",
760 "VPSLLDYrr",
761 "VPSLLQYrr",
762 "VPSLLWYrr",
763 "VPSRADYrr",
764 "VPSRAWYrr",
765 "VPSRLDYrr",
766 "VPSRLQYrr",
767 "VPSRLWYrr",
768 "VPTESTYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000769
770def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
771 let Latency = 4;
772 let NumMicroOps = 2;
773 let ResourceCycles = [1,1];
774}
775def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
776
777def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
778 let Latency = 4;
779 let NumMicroOps = 2;
780 let ResourceCycles = [1,1];
781}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000782def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000783def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000784 "MMX_CVTPI2PDirr",
785 "MMX_CVTPS2PIirr",
786 "MMX_CVTTPD2PIirr",
787 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000788 "(V?)CVTDQ2PDrr",
789 "(V?)CVTPD2DQrr",
790 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000791 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000792 "(V?)CVTSD2SSrr",
793 "(V?)CVTSI642SDrr",
794 "(V?)CVTSI2SDrr",
795 "(V?)CVTSI2SSrr",
796 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000797
798def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
799 let Latency = 4;
800 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000801 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000802}
Craig Topper5a69a002018-03-21 06:28:42 +0000803def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000804
805def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
806 let Latency = 4;
807 let NumMicroOps = 3;
808 let ResourceCycles = [1,1,1];
809}
810def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
811
812def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
813 let Latency = 4;
814 let NumMicroOps = 3;
815 let ResourceCycles = [1,1,1];
816}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000817def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
818 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000819
820def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
821 let Latency = 4;
822 let NumMicroOps = 4;
823 let ResourceCycles = [4];
824}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000825def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000826
827def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
828 let Latency = 4;
829 let NumMicroOps = 4;
830 let ResourceCycles = [1,3];
831}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000832def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000833
834def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
835 let Latency = 5;
836 let NumMicroOps = 1;
837 let ResourceCycles = [1];
838}
Simon Pilgrim74ccc6a2018-04-21 19:11:55 +0000839def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000840
Gadi Haber323f2e12017-10-24 20:19:47 +0000841def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
842 let Latency = 5;
843 let NumMicroOps = 1;
844 let ResourceCycles = [1];
845}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000846def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000847 "MOVSX(16|32|64)rm32",
848 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000849 "MOVZX(16|32|64)rm16",
850 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000851 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000852 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000853 "(V?)MOVSHDUPrm",
854 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000855 "VPBROADCASTDrm",
856 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000857
858def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
859 let Latency = 5;
860 let NumMicroOps = 3;
861 let ResourceCycles = [1,2];
862}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000863def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000864
865def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
866 let Latency = 5;
867 let NumMicroOps = 3;
868 let ResourceCycles = [1,1,1];
869}
870def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
871
872def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000873 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000874 let NumMicroOps = 3;
875 let ResourceCycles = [1,1,1];
876}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000877def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000878
879def BWWriteResGroup53 : SchedWriteRes<[BWPort0,BWPort4,BWPort237,BWPort15]> {
880 let Latency = 5;
881 let NumMicroOps = 4;
882 let ResourceCycles = [1,1,1,1];
883}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000884def: InstRW<[BWWriteResGroup53], (instregex "VMASKMOVPD(Y?)mr",
885 "VMASKMOVPS(Y?)mr",
886 "VPMASKMOVD(Y?)mr",
887 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000888
889def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
890 let Latency = 5;
891 let NumMicroOps = 5;
892 let ResourceCycles = [1,4];
893}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000894def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000895
896def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
897 let Latency = 5;
898 let NumMicroOps = 5;
899 let ResourceCycles = [1,4];
900}
901def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
902
903def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
904 let Latency = 5;
905 let NumMicroOps = 5;
906 let ResourceCycles = [2,3];
907}
Craig Topper5a69a002018-03-21 06:28:42 +0000908def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000909
910def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
911 let Latency = 5;
912 let NumMicroOps = 6;
913 let ResourceCycles = [1,1,4];
914}
Craig Topper5a69a002018-03-21 06:28:42 +0000915def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000916
917def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
918 let Latency = 6;
919 let NumMicroOps = 1;
920 let ResourceCycles = [1];
921}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000922def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000923 "VBROADCASTF128",
924 "VBROADCASTI128",
925 "VBROADCASTSDYrm",
926 "VBROADCASTSSYrm",
927 "VLDDQUYrm",
928 "VMOVAPDYrm",
929 "VMOVAPSYrm",
930 "VMOVDDUPYrm",
931 "VMOVDQAYrm",
932 "VMOVDQUYrm",
933 "VMOVNTDQAYrm",
934 "VMOVSHDUPYrm",
935 "VMOVSLDUPYrm",
936 "VMOVUPDYrm",
937 "VMOVUPSYrm",
938 "VPBROADCASTDYrm",
939 "VPBROADCASTQYrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000940 "(V?)ROUNDPD(Y?)r",
941 "(V?)ROUNDPS(Y?)r",
942 "(V?)ROUNDSDr",
943 "(V?)ROUNDSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000944
945def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
946 let Latency = 6;
947 let NumMicroOps = 2;
948 let ResourceCycles = [1,1];
949}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000950def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000951 "(V?)CVTPS2PDrm",
952 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000953 "VPSLLVQrm",
954 "VPSRLVQrm",
955 "VTESTPDrm",
956 "VTESTPSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000957
958def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
959 let Latency = 6;
960 let NumMicroOps = 2;
961 let ResourceCycles = [1,1];
962}
Craig Topper5a69a002018-03-21 06:28:42 +0000963def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
964 "VCVTPD2DQYrr",
965 "VCVTPD2PSYrr",
966 "VCVTPS2PHYrr",
967 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000968
Gadi Haber323f2e12017-10-24 20:19:47 +0000969def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
970 let Latency = 6;
971 let NumMicroOps = 2;
972 let ResourceCycles = [1,1];
973}
Craig Topper5a69a002018-03-21 06:28:42 +0000974def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
975 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000976
977def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
978 let Latency = 6;
979 let NumMicroOps = 2;
980 let ResourceCycles = [1,1];
981}
Craig Topperdfccafe2018-04-18 06:41:25 +0000982def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +0000983def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
984 ADCX32rm, ADCX64rm,
985 ADOX32rm, ADOX64rm,
986 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000987
988def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
989 let Latency = 6;
990 let NumMicroOps = 2;
991 let ResourceCycles = [1,1];
992}
Craig Topper5a69a002018-03-21 06:28:42 +0000993def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
994 "BLSI(32|64)rm",
995 "BLSMSK(32|64)rm",
996 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +0000997 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000998
999def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
1000 let Latency = 6;
1001 let NumMicroOps = 2;
1002 let ResourceCycles = [1,1];
1003}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001004def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +00001005 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001006 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001007
1008def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1009 let Latency = 6;
1010 let NumMicroOps = 2;
1011 let ResourceCycles = [1,1];
1012}
Craig Topper2d451e72018-03-18 08:38:06 +00001013def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001014def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001015
1016def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1017 let Latency = 6;
1018 let NumMicroOps = 4;
1019 let ResourceCycles = [1,1,2];
1020}
Craig Topper5a69a002018-03-21 06:28:42 +00001021def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1022 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001023
1024def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1025 let Latency = 6;
1026 let NumMicroOps = 4;
1027 let ResourceCycles = [1,1,1,1];
1028}
1029def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1030
1031def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1032 let Latency = 6;
1033 let NumMicroOps = 4;
1034 let ResourceCycles = [1,1,1,1];
1035}
Craig Topper5a69a002018-03-21 06:28:42 +00001036def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1037 "BTR(16|32|64)mi8",
1038 "BTS(16|32|64)mi8",
1039 "SAR(8|16|32|64)m1",
1040 "SAR(8|16|32|64)mi",
1041 "SHL(8|16|32|64)m1",
1042 "SHL(8|16|32|64)mi",
1043 "SHR(8|16|32|64)m1",
1044 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001045
1046def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1047 let Latency = 6;
1048 let NumMicroOps = 4;
1049 let ResourceCycles = [1,1,1,1];
1050}
Craig Topperf0d04262018-04-06 16:16:48 +00001051def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1052 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001053
1054def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1055 let Latency = 6;
1056 let NumMicroOps = 6;
1057 let ResourceCycles = [1,5];
1058}
1059def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1060
Gadi Haber323f2e12017-10-24 20:19:47 +00001061def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1062 let Latency = 7;
1063 let NumMicroOps = 2;
1064 let ResourceCycles = [1,1];
1065}
Craig Topper5a69a002018-03-21 06:28:42 +00001066def: InstRW<[BWWriteResGroup73], (instregex "VPSLLDYrm",
1067 "VPSLLQYrm",
1068 "VPSLLVQYrm",
1069 "VPSLLWYrm",
1070 "VPSRADYrm",
1071 "VPSRAWYrm",
1072 "VPSRLDYrm",
1073 "VPSRLQYrm",
1074 "VPSRLVQYrm",
1075 "VPSRLWYrm",
1076 "VTESTPDYrm",
1077 "VTESTPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001078
1079def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1080 let Latency = 7;
1081 let NumMicroOps = 2;
1082 let ResourceCycles = [1,1];
1083}
Craig Topper5a69a002018-03-21 06:28:42 +00001084def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1085 "FCOM64m",
1086 "FCOMP32m",
1087 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001088
1089def BWWriteResGroup75 : SchedWriteRes<[BWPort5,BWPort23]> {
1090 let Latency = 7;
1091 let NumMicroOps = 2;
1092 let ResourceCycles = [1,1];
1093}
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +00001094def: InstRW<[BWWriteResGroup75], (instregex "VPACKSSDWYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001095 "VPACKSSWBYrm",
1096 "VPACKUSDWYrm",
1097 "VPACKUSWBYrm",
1098 "VPALIGNRYrmi",
1099 "VPBLENDWYrmi",
Craig Topper5a69a002018-03-21 06:28:42 +00001100 "VPSHUFBYrm",
1101 "VPSHUFDYmi",
1102 "VPSHUFHWYmi",
1103 "VPSHUFLWYmi",
1104 "VPUNPCKHBWYrm",
1105 "VPUNPCKHDQYrm",
1106 "VPUNPCKHQDQYrm",
1107 "VPUNPCKHWDYrm",
1108 "VPUNPCKLBWYrm",
1109 "VPUNPCKLDQYrm",
1110 "VPUNPCKLQDQYrm",
Simon Pilgrimdd8eae12018-05-01 14:25:01 +00001111 "VPUNPCKLWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001112
1113def BWWriteResGroup76 : SchedWriteRes<[BWPort23,BWPort15]> {
1114 let Latency = 7;
1115 let NumMicroOps = 2;
1116 let ResourceCycles = [1,1];
1117}
Craig Topper5a69a002018-03-21 06:28:42 +00001118def: InstRW<[BWWriteResGroup76], (instregex "VPABSBYrm",
1119 "VPABSDYrm",
1120 "VPABSWYrm",
1121 "VPADDBYrm",
1122 "VPADDDYrm",
1123 "VPADDQYrm",
1124 "VPADDSBYrm",
1125 "VPADDSWYrm",
1126 "VPADDUSBYrm",
1127 "VPADDUSWYrm",
1128 "VPADDWYrm",
1129 "VPAVGBYrm",
1130 "VPAVGWYrm",
1131 "VPCMPEQBYrm",
1132 "VPCMPEQDYrm",
1133 "VPCMPEQQYrm",
1134 "VPCMPEQWYrm",
1135 "VPCMPGTBYrm",
1136 "VPCMPGTDYrm",
1137 "VPCMPGTWYrm",
1138 "VPMAXSBYrm",
1139 "VPMAXSDYrm",
1140 "VPMAXSWYrm",
1141 "VPMAXUBYrm",
1142 "VPMAXUDYrm",
1143 "VPMAXUWYrm",
1144 "VPMINSBYrm",
1145 "VPMINSDYrm",
1146 "VPMINSWYrm",
1147 "VPMINUBYrm",
1148 "VPMINUDYrm",
1149 "VPMINUWYrm",
1150 "VPSIGNBYrm",
1151 "VPSIGNDYrm",
1152 "VPSIGNWYrm",
1153 "VPSUBBYrm",
1154 "VPSUBDYrm",
1155 "VPSUBQYrm",
1156 "VPSUBSBYrm",
1157 "VPSUBSWYrm",
1158 "VPSUBUSBYrm",
1159 "VPSUBUSWYrm",
1160 "VPSUBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001161
1162def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1163 let Latency = 7;
1164 let NumMicroOps = 2;
1165 let ResourceCycles = [1,1];
1166}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001167def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001168
Gadi Haber323f2e12017-10-24 20:19:47 +00001169def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1170 let Latency = 7;
1171 let NumMicroOps = 3;
1172 let ResourceCycles = [2,1];
1173}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001174def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001175 "MMX_PACKSSWBirm",
1176 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001177 "VMASKMOVPDrm",
1178 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001179 "VPMASKMOVDrm",
1180 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001181
1182def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1183 let Latency = 7;
1184 let NumMicroOps = 3;
1185 let ResourceCycles = [1,2];
1186}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001187def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1188 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001189
1190def BWWriteResGroup81 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1191 let Latency = 7;
1192 let NumMicroOps = 3;
1193 let ResourceCycles = [1,1,1];
1194}
Simon Pilgrimd5ada492018-04-29 15:33:15 +00001195def: InstRW<[BWWriteResGroup81], (instregex "(V?)PSLLDrm",
1196 "(V?)PSLLQrm",
1197 "(V?)PSLLWrm",
1198 "(V?)PSRADrm",
1199 "(V?)PSRAWrm",
1200 "(V?)PSRLDrm",
1201 "(V?)PSRLQrm",
1202 "(V?)PSRLWrm",
1203 "(V?)PTESTrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001204
1205def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1206 let Latency = 7;
1207 let NumMicroOps = 3;
1208 let ResourceCycles = [1,1,1];
1209}
1210def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1211
Gadi Haber323f2e12017-10-24 20:19:47 +00001212def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1213 let Latency = 7;
1214 let NumMicroOps = 3;
1215 let ResourceCycles = [1,1,1];
1216}
Craig Topper5a69a002018-03-21 06:28:42 +00001217def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1218 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001219
Gadi Haber323f2e12017-10-24 20:19:47 +00001220def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1221 let Latency = 7;
1222 let NumMicroOps = 3;
1223 let ResourceCycles = [1,1,1];
1224}
Craig Topperf4cd9082018-01-19 05:47:32 +00001225def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001226
1227def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1228 let Latency = 7;
1229 let NumMicroOps = 5;
1230 let ResourceCycles = [1,1,1,2];
1231}
Craig Topper5a69a002018-03-21 06:28:42 +00001232def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1233 "ROL(8|16|32|64)mi",
1234 "ROR(8|16|32|64)m1",
1235 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001236
1237def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1238 let Latency = 7;
1239 let NumMicroOps = 5;
1240 let ResourceCycles = [1,1,1,2];
1241}
Craig Topper5a69a002018-03-21 06:28:42 +00001242def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001243
1244def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1245 let Latency = 7;
1246 let NumMicroOps = 5;
1247 let ResourceCycles = [1,1,1,1,1];
1248}
Craig Topper5a69a002018-03-21 06:28:42 +00001249def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1250 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001251
1252def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1253 let Latency = 7;
1254 let NumMicroOps = 7;
1255 let ResourceCycles = [2,2,1,2];
1256}
Craig Topper2d451e72018-03-18 08:38:06 +00001257def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001258
1259def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1260 let Latency = 8;
1261 let NumMicroOps = 2;
1262 let ResourceCycles = [1,1];
1263}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001264def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001265 "PDEP(32|64)rm",
1266 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001267 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001268
1269def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001270 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001271 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001272 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001273}
Craig Topperf846e2d2018-04-19 05:34:05 +00001274def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001275
Craig Topperf846e2d2018-04-19 05:34:05 +00001276def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1277 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001278 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001279 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001280}
Craig Topper5a69a002018-03-21 06:28:42 +00001281def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001282
Gadi Haber323f2e12017-10-24 20:19:47 +00001283def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1284 let Latency = 8;
1285 let NumMicroOps = 2;
1286 let ResourceCycles = [1,1];
1287}
Craig Topper5a69a002018-03-21 06:28:42 +00001288def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1289 "VPMOVSXBQYrm",
1290 "VPMOVSXBWYrm",
1291 "VPMOVSXDQYrm",
1292 "VPMOVSXWDYrm",
1293 "VPMOVSXWQYrm",
1294 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001295
1296def BWWriteResGroup93 : SchedWriteRes<[BWPort01,BWPort23]> {
1297 let Latency = 8;
1298 let NumMicroOps = 2;
1299 let ResourceCycles = [1,1];
1300}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001301def: InstRW<[BWWriteResGroup93], (instregex "(V?)MULPDrm",
1302 "(V?)MULPSrm",
1303 "(V?)MULSDrm",
1304 "(V?)MULSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001305
1306def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1307 let Latency = 8;
1308 let NumMicroOps = 3;
1309 let ResourceCycles = [2,1];
1310}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001311def: InstRW<[BWWriteResGroup94], (instregex "VMASKMOVPDYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001312 "VMASKMOVPSYrm",
1313 "VPBLENDVBYrm",
1314 "VPMASKMOVDYrm",
1315 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001316
1317def BWWriteResGroup95 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1318 let Latency = 8;
1319 let NumMicroOps = 4;
1320 let ResourceCycles = [2,1,1];
1321}
Craig Topper5a69a002018-03-21 06:28:42 +00001322def: InstRW<[BWWriteResGroup95], (instregex "VPSLLVDrm",
1323 "VPSRAVDrm",
1324 "VPSRLVDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001325
Gadi Haber323f2e12017-10-24 20:19:47 +00001326def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1327 let Latency = 8;
1328 let NumMicroOps = 5;
1329 let ResourceCycles = [1,1,1,2];
1330}
Craig Topper5a69a002018-03-21 06:28:42 +00001331def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1332 "RCL(8|16|32|64)mi",
1333 "RCR(8|16|32|64)m1",
1334 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001335
1336def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1337 let Latency = 8;
1338 let NumMicroOps = 5;
1339 let ResourceCycles = [1,1,2,1];
1340}
Craig Topper13a16502018-03-19 00:56:09 +00001341def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001342
1343def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1344 let Latency = 8;
1345 let NumMicroOps = 6;
1346 let ResourceCycles = [1,1,1,3];
1347}
Craig Topper9f834812018-04-01 21:54:24 +00001348def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001349
1350def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1351 let Latency = 8;
1352 let NumMicroOps = 6;
1353 let ResourceCycles = [1,1,1,2,1];
1354}
Craig Topper9f834812018-04-01 21:54:24 +00001355def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001356 "CMPXCHG(8|16|32|64)rm",
1357 "ROL(8|16|32|64)mCL",
1358 "SAR(8|16|32|64)mCL",
1359 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001360 "SHL(8|16|32|64)mCL",
1361 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001362def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1363 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001364
1365def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1366 let Latency = 9;
1367 let NumMicroOps = 2;
1368 let ResourceCycles = [1,1];
1369}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001370def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1371 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001372 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001373 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001374
1375def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1376 let Latency = 9;
1377 let NumMicroOps = 2;
1378 let ResourceCycles = [1,1];
1379}
Craig Topper5a69a002018-03-21 06:28:42 +00001380def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1381 "VPERM2I128rm",
1382 "VPERMDYrm",
1383 "VPERMPDYmi",
1384 "VPERMPSYrm",
1385 "VPERMQYmi",
1386 "VPMOVZXBDYrm",
1387 "VPMOVZXBQYrm",
1388 "VPMOVZXBWYrm",
1389 "VPMOVZXDQYrm",
1390 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001391
1392def BWWriteResGroup103 : SchedWriteRes<[BWPort01,BWPort23]> {
1393 let Latency = 9;
1394 let NumMicroOps = 2;
1395 let ResourceCycles = [1,1];
1396}
Craig Topper5a69a002018-03-21 06:28:42 +00001397def: InstRW<[BWWriteResGroup103], (instregex "VMULPDYrm",
1398 "VMULPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001399
1400def BWWriteResGroup104 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1401 let Latency = 9;
1402 let NumMicroOps = 3;
1403 let ResourceCycles = [1,1,1];
1404}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001405def: InstRW<[BWWriteResGroup104], (instregex "(V?)DPPDrri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001406
1407def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1408 let Latency = 9;
1409 let NumMicroOps = 3;
1410 let ResourceCycles = [1,1,1];
1411}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001412def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1413 "(V?)CVTSD2SIrm",
1414 "(V?)CVTSS2SI64rm",
1415 "(V?)CVTSS2SIrm",
1416 "(V?)CVTTSD2SI64rm",
1417 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001418 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001419 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001420
1421def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1422 let Latency = 9;
1423 let NumMicroOps = 3;
1424 let ResourceCycles = [1,1,1];
1425}
1426def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1427
1428def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1429 let Latency = 9;
1430 let NumMicroOps = 3;
1431 let ResourceCycles = [1,1,1];
1432}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001433def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001434def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001435 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001436 "CVTTPD2DQrm",
1437 "MMX_CVTPD2PIirm",
1438 "MMX_CVTPI2PDirm",
1439 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001440 "(V?)CVTDQ2PDrm",
1441 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001442
1443def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1444 let Latency = 9;
1445 let NumMicroOps = 3;
1446 let ResourceCycles = [1,1,1];
1447}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001448def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1449 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001450
1451def BWWriteResGroup109 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1452 let Latency = 9;
1453 let NumMicroOps = 4;
1454 let ResourceCycles = [2,1,1];
1455}
Craig Topper5a69a002018-03-21 06:28:42 +00001456def: InstRW<[BWWriteResGroup109], (instregex "VPSLLVDYrm",
1457 "VPSRAVDYrm",
1458 "VPSRLVDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001459
1460def BWWriteResGroup110 : SchedWriteRes<[BWPort5,BWPort23,BWPort15]> {
1461 let Latency = 9;
1462 let NumMicroOps = 4;
1463 let ResourceCycles = [2,1,1];
1464}
Craig Topper5a69a002018-03-21 06:28:42 +00001465def: InstRW<[BWWriteResGroup110], (instregex "VPHADDDYrm",
1466 "VPHADDSWYrm",
1467 "VPHADDWYrm",
1468 "VPHSUBDYrm",
1469 "VPHSUBSWYrm",
1470 "VPHSUBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001471
1472def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1473 let Latency = 9;
1474 let NumMicroOps = 4;
1475 let ResourceCycles = [1,1,1,1];
1476}
Craig Topper5a69a002018-03-21 06:28:42 +00001477def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1478 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001479
1480def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1481 let Latency = 9;
1482 let NumMicroOps = 5;
1483 let ResourceCycles = [1,1,3];
1484}
1485def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1486
1487def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1488 let Latency = 9;
1489 let NumMicroOps = 5;
1490 let ResourceCycles = [1,2,1,1];
1491}
Craig Topper5a69a002018-03-21 06:28:42 +00001492def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1493 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001494
Gadi Haber323f2e12017-10-24 20:19:47 +00001495def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1496 let Latency = 10;
1497 let NumMicroOps = 2;
1498 let ResourceCycles = [1,1];
1499}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001500def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001501
Gadi Haber323f2e12017-10-24 20:19:47 +00001502def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1503 let Latency = 10;
1504 let NumMicroOps = 3;
1505 let ResourceCycles = [2,1];
1506}
Craig Topper5a69a002018-03-21 06:28:42 +00001507def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1508 "FICOM32m",
1509 "FICOMP16m",
1510 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001511
1512def BWWriteResGroup118 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1513 let Latency = 10;
1514 let NumMicroOps = 3;
1515 let ResourceCycles = [1,1,1];
1516}
1517def: InstRW<[BWWriteResGroup118], (instregex "VPTESTYrm")>;
1518
Gadi Haber323f2e12017-10-24 20:19:47 +00001519def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1520 let Latency = 10;
1521 let NumMicroOps = 4;
1522 let ResourceCycles = [1,1,1,1];
1523}
1524def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1525
1526def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001527 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001528 let NumMicroOps = 4;
1529 let ResourceCycles = [1,1,1,1];
1530}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001531def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001532
Craig Topper8104f262018-04-02 05:33:28 +00001533def BWWriteResGroup122 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001534 let Latency = 11;
1535 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001536 let ResourceCycles = [1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001537}
Craig Topper8104f262018-04-02 05:33:28 +00001538def: InstRW<[BWWriteResGroup122], (instregex "(V?)DIVPSrr")>;
1539
1540def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1541 let Latency = 11;
1542 let NumMicroOps = 1;
1543 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1544}
1545def: InstRW<[BWWriteResGroup122_1], (instregex "(V?)DIVSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001546
1547def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1548 let Latency = 11;
1549 let NumMicroOps = 2;
1550 let ResourceCycles = [1,1];
1551}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001552def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001553 "VPCMPGTQYrm",
1554 "VPMADDUBSWYrm",
1555 "VPMADDWDYrm",
1556 "VPMULDQYrm",
1557 "VPMULHRSWYrm",
1558 "VPMULHUWYrm",
1559 "VPMULHWYrm",
1560 "VPMULLWYrm",
1561 "VPMULUDQYrm",
1562 "VPSADBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001563
Gadi Haber323f2e12017-10-24 20:19:47 +00001564def BWWriteResGroup126 : SchedWriteRes<[BWPort0,BWPort015]> {
1565 let Latency = 11;
1566 let NumMicroOps = 3;
1567 let ResourceCycles = [2,1];
1568}
Craig Topper5a69a002018-03-21 06:28:42 +00001569def: InstRW<[BWWriteResGroup126], (instregex "VRCPPSYr",
1570 "VRSQRTPSYr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001571
1572def BWWriteResGroup127 : SchedWriteRes<[BWPort1,BWPort23]> {
1573 let Latency = 11;
1574 let NumMicroOps = 3;
1575 let ResourceCycles = [2,1];
1576}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001577def: InstRW<[BWWriteResGroup127], (instregex "(V?)ROUNDPDm",
1578 "(V?)ROUNDPSm",
1579 "(V?)ROUNDSDm",
1580 "(V?)ROUNDSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001581
1582def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1583 let Latency = 11;
1584 let NumMicroOps = 3;
1585 let ResourceCycles = [1,1,1];
1586}
1587def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1588
Gadi Haber323f2e12017-10-24 20:19:47 +00001589def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1590 let Latency = 11;
1591 let NumMicroOps = 6;
1592 let ResourceCycles = [1,1,1,1,2];
1593}
Craig Topper5a69a002018-03-21 06:28:42 +00001594def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1595 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001596
1597def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1598 let Latency = 11;
1599 let NumMicroOps = 7;
1600 let ResourceCycles = [2,2,3];
1601}
Craig Topper5a69a002018-03-21 06:28:42 +00001602def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1603 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001604
1605def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1606 let Latency = 11;
1607 let NumMicroOps = 9;
1608 let ResourceCycles = [1,4,1,3];
1609}
1610def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1611
1612def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1613 let Latency = 11;
1614 let NumMicroOps = 11;
1615 let ResourceCycles = [2,9];
1616}
Craig Topper2d451e72018-03-18 08:38:06 +00001617def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1618def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001619
Gadi Haber323f2e12017-10-24 20:19:47 +00001620def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1621 let Latency = 12;
1622 let NumMicroOps = 3;
1623 let ResourceCycles = [2,1];
1624}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001625def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m",
Craig Topper40d3b322018-03-22 21:55:20 +00001626 "VROUNDPDYm",
1627 "VROUNDPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001628
Craig Topper8104f262018-04-02 05:33:28 +00001629def BWWriteResGroup137 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001630 let Latency = 11;
Gadi Haber323f2e12017-10-24 20:19:47 +00001631 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001632 let ResourceCycles = [1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001633}
Craig Topper8104f262018-04-02 05:33:28 +00001634def: InstRW<[BWWriteResGroup137], (instregex "(V?)SQRTPSr")>;
1635
1636def BWWriteResGroup137_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1637 let Latency = 11;
1638 let NumMicroOps = 1;
1639 let ResourceCycles = [1,4];
1640}
1641def: InstRW<[BWWriteResGroup137_1], (instregex "(V?)SQRTSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001642
1643def BWWriteResGroup138 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1644 let Latency = 13;
1645 let NumMicroOps = 4;
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001646 let ResourceCycles = [1,2,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001647}
1648def: InstRW<[BWWriteResGroup138], (instregex "VMPSADBWYrmi")>;
1649
Craig Topper8104f262018-04-02 05:33:28 +00001650def BWWriteResGroup139 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001651 let Latency = 14;
1652 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001653 let ResourceCycles = [1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001654}
Craig Topper8104f262018-04-02 05:33:28 +00001655def: InstRW<[BWWriteResGroup139], (instregex "(V?)DIVPDrr")>;
1656
1657def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1658 let Latency = 14;
1659 let NumMicroOps = 1;
1660 let ResourceCycles = [1,4];
1661}
1662def: InstRW<[BWWriteResGroup139_1], (instregex "(V?)DIVSDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001663
Gadi Haber323f2e12017-10-24 20:19:47 +00001664def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1665 let Latency = 14;
1666 let NumMicroOps = 3;
1667 let ResourceCycles = [1,1,1];
1668}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001669def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001670
1671def BWWriteResGroup142 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1672 let Latency = 14;
1673 let NumMicroOps = 4;
1674 let ResourceCycles = [2,1,1];
1675}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001676def: InstRW<[BWWriteResGroup142], (instregex "(V?)DPPS(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001677
1678def BWWriteResGroup143 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1679 let Latency = 14;
1680 let NumMicroOps = 4;
1681 let ResourceCycles = [1,1,1,1];
1682}
Craig Topper5a69a002018-03-21 06:28:42 +00001683def: InstRW<[BWWriteResGroup143], (instregex "(V?)DPPDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001684
1685def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1686 let Latency = 14;
1687 let NumMicroOps = 8;
1688 let ResourceCycles = [2,2,1,3];
1689}
1690def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1691
1692def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1693 let Latency = 14;
1694 let NumMicroOps = 10;
1695 let ResourceCycles = [2,3,1,4];
1696}
1697def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1698
1699def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1700 let Latency = 14;
1701 let NumMicroOps = 12;
1702 let ResourceCycles = [2,1,4,5];
1703}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001704def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001705
1706def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1707 let Latency = 15;
1708 let NumMicroOps = 1;
1709 let ResourceCycles = [1];
1710}
Craig Topper5a69a002018-03-21 06:28:42 +00001711def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1712 "DIVR_FST0r",
1713 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001714
Gadi Haber323f2e12017-10-24 20:19:47 +00001715def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1716 let Latency = 15;
1717 let NumMicroOps = 10;
1718 let ResourceCycles = [1,1,1,4,1,2];
1719}
Craig Topper13a16502018-03-19 00:56:09 +00001720def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001721
Craig Topper8104f262018-04-02 05:33:28 +00001722def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001723 let Latency = 16;
1724 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001725 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001726}
Craig Topper5a69a002018-03-21 06:28:42 +00001727def: InstRW<[BWWriteResGroup150], (instregex "(V?)DIVPSrm",
1728 "(V?)DIVSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001729
1730def BWWriteResGroup151 : SchedWriteRes<[BWPort0,BWPort23]> {
1731 let Latency = 16;
1732 let NumMicroOps = 3;
1733 let ResourceCycles = [2,1];
1734}
1735def: InstRW<[BWWriteResGroup151], (instregex "VPMULLDYrm")>;
1736
Gadi Haber323f2e12017-10-24 20:19:47 +00001737def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1738 let Latency = 16;
1739 let NumMicroOps = 14;
1740 let ResourceCycles = [1,1,1,4,2,5];
1741}
1742def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1743
1744def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1745 let Latency = 16;
1746 let NumMicroOps = 16;
1747 let ResourceCycles = [16];
1748}
Craig Topper5a69a002018-03-21 06:28:42 +00001749def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001750
Craig Topper8104f262018-04-02 05:33:28 +00001751def BWWriteResGroup155 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001752 let Latency = 17;
1753 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001754 let ResourceCycles = [2,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001755}
1756def: InstRW<[BWWriteResGroup155], (instregex "VDIVPSYrr")>;
1757
1758def BWWriteResGroup156 : SchedWriteRes<[BWPort0,BWPort23,BWPort015]> {
1759 let Latency = 17;
1760 let NumMicroOps = 4;
1761 let ResourceCycles = [2,1,1];
1762}
Craig Topper5a69a002018-03-21 06:28:42 +00001763def: InstRW<[BWWriteResGroup156], (instregex "VRCPPSYm",
1764 "VRSQRTPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001765
Craig Topper8104f262018-04-02 05:33:28 +00001766def BWWriteResGroup157 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001767 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001768 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001769 let ResourceCycles = [1,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001770}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001771def: InstRW<[BWWriteResGroup157], (instregex "(V?)SQRTPSm",
1772 "(V?)SQRTSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001773
Gadi Haber323f2e12017-10-24 20:19:47 +00001774def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1775 let Latency = 18;
1776 let NumMicroOps = 8;
1777 let ResourceCycles = [1,1,1,5];
1778}
Craig Topper5a69a002018-03-21 06:28:42 +00001779def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001780def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001781
1782def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1783 let Latency = 18;
1784 let NumMicroOps = 11;
1785 let ResourceCycles = [2,1,1,3,1,3];
1786}
Craig Topper13a16502018-03-19 00:56:09 +00001787def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001788
Craig Topper8104f262018-04-02 05:33:28 +00001789def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001790 let Latency = 19;
1791 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001792 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001793}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001794def: InstRW<[BWWriteResGroup161], (instregex "(V?)DIVPDrm",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001795 "(V?)DIVSDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001796
Gadi Haber323f2e12017-10-24 20:19:47 +00001797def BWWriteResGroup163 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1798 let Latency = 19;
1799 let NumMicroOps = 5;
1800 let ResourceCycles = [2,1,1,1];
1801}
Craig Topper5a69a002018-03-21 06:28:42 +00001802def: InstRW<[BWWriteResGroup163], (instregex "(V?)DPPSrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001803
Gadi Haber323f2e12017-10-24 20:19:47 +00001804def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1805 let Latency = 20;
1806 let NumMicroOps = 1;
1807 let ResourceCycles = [1];
1808}
Craig Topper5a69a002018-03-21 06:28:42 +00001809def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1810 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001811 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001812
1813def BWWriteResGroup166 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1814 let Latency = 20;
1815 let NumMicroOps = 5;
1816 let ResourceCycles = [2,1,1,1];
1817}
1818def: InstRW<[BWWriteResGroup166], (instregex "VDPPSYrmi")>;
1819
1820def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1821 let Latency = 20;
1822 let NumMicroOps = 8;
1823 let ResourceCycles = [1,1,1,1,1,1,2];
1824}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001825def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001826
Craig Topper8104f262018-04-02 05:33:28 +00001827def BWWriteResGroup168 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001828 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001829 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001830 let ResourceCycles = [1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001831}
Craig Topper8104f262018-04-02 05:33:28 +00001832def: InstRW<[BWWriteResGroup168], (instregex "(V?)SQRTPDr")>;
1833
1834def BWWriteResGroup168_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1835 let Latency = 16;
1836 let NumMicroOps = 1;
1837 let ResourceCycles = [1,8];
1838}
1839def: InstRW<[BWWriteResGroup168_1], (instregex "(V?)SQRTSDr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001840
1841def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1842 let Latency = 21;
1843 let NumMicroOps = 2;
1844 let ResourceCycles = [1,1];
1845}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001846def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001847
Craig Topper8104f262018-04-02 05:33:28 +00001848def BWWriteResGroup170 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001849 let Latency = 21;
1850 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001851 let ResourceCycles = [2,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001852}
1853def: InstRW<[BWWriteResGroup170], (instregex "VSQRTPSYr")>;
1854
1855def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1856 let Latency = 21;
1857 let NumMicroOps = 19;
1858 let ResourceCycles = [2,1,4,1,1,4,6];
1859}
1860def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1861
1862def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1863 let Latency = 22;
1864 let NumMicroOps = 18;
1865 let ResourceCycles = [1,1,16];
1866}
1867def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1868
Craig Topper8104f262018-04-02 05:33:28 +00001869def BWWriteResGroup173 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001870 let Latency = 23;
1871 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001872 let ResourceCycles = [2,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001873}
1874def: InstRW<[BWWriteResGroup173], (instregex "VDIVPDYrr")>;
1875
Craig Topper8104f262018-04-02 05:33:28 +00001876def BWWriteResGroup174 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001877 let Latency = 23;
1878 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001879 let ResourceCycles = [2,1,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001880}
1881def: InstRW<[BWWriteResGroup174], (instregex "VDIVPSYrm")>;
1882
Gadi Haber323f2e12017-10-24 20:19:47 +00001883def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1884 let Latency = 23;
1885 let NumMicroOps = 19;
1886 let ResourceCycles = [3,1,15];
1887}
Craig Topper391c6f92017-12-10 01:24:08 +00001888def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001889
1890def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1891 let Latency = 24;
1892 let NumMicroOps = 3;
1893 let ResourceCycles = [1,1,1];
1894}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001895def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001896
Craig Topper8104f262018-04-02 05:33:28 +00001897def BWWriteResGroup179 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001898 let Latency = 21;
Gadi Haber323f2e12017-10-24 20:19:47 +00001899 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001900 let ResourceCycles = [1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001901}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001902def: InstRW<[BWWriteResGroup179], (instregex "(V?)SQRTPDm",
1903 "(V?)SQRTSDm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001904
1905def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1906 let Latency = 26;
1907 let NumMicroOps = 2;
1908 let ResourceCycles = [1,1];
1909}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001910def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001911
Craig Topper8104f262018-04-02 05:33:28 +00001912def BWWriteResGroup181 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001913 let Latency = 27;
1914 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001915 let ResourceCycles = [2,1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001916}
1917def: InstRW<[BWWriteResGroup181], (instregex "VSQRTPSYm")>;
1918
1919def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1920 let Latency = 29;
1921 let NumMicroOps = 3;
1922 let ResourceCycles = [1,1,1];
1923}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001924def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001925
Craig Topper8104f262018-04-02 05:33:28 +00001926def BWWriteResGroup183 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001927 let Latency = 29;
1928 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001929 let ResourceCycles = [2,1,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001930}
1931def: InstRW<[BWWriteResGroup183], (instregex "VDIVPDYrm")>;
1932
1933def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1934 let Latency = 22;
1935 let NumMicroOps = 7;
1936 let ResourceCycles = [1,3,2,1];
1937}
Craig Topper17a31182017-12-16 18:35:29 +00001938def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001939
1940def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1941 let Latency = 23;
1942 let NumMicroOps = 9;
1943 let ResourceCycles = [1,3,4,1];
1944}
Craig Topper17a31182017-12-16 18:35:29 +00001945def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001946
1947def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1948 let Latency = 24;
1949 let NumMicroOps = 9;
1950 let ResourceCycles = [1,5,2,1];
1951}
Craig Topper17a31182017-12-16 18:35:29 +00001952def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001953
1954def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1955 let Latency = 25;
1956 let NumMicroOps = 7;
1957 let ResourceCycles = [1,3,2,1];
1958}
Craig Topper17a31182017-12-16 18:35:29 +00001959def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1960 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001961
1962def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1963 let Latency = 26;
1964 let NumMicroOps = 9;
1965 let ResourceCycles = [1,5,2,1];
1966}
Craig Topper17a31182017-12-16 18:35:29 +00001967def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001968
1969def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1970 let Latency = 26;
1971 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001972 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001973}
Craig Topper17a31182017-12-16 18:35:29 +00001974def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001975
1976def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1977 let Latency = 27;
1978 let NumMicroOps = 9;
1979 let ResourceCycles = [1,5,2,1];
1980}
Craig Topper17a31182017-12-16 18:35:29 +00001981def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001982
Gadi Haber323f2e12017-10-24 20:19:47 +00001983def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1984 let Latency = 29;
1985 let NumMicroOps = 27;
1986 let ResourceCycles = [1,5,1,1,19];
1987}
1988def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1989
1990def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1991 let Latency = 30;
1992 let NumMicroOps = 28;
1993 let ResourceCycles = [1,6,1,1,19];
1994}
Craig Topper2d451e72018-03-18 08:38:06 +00001995def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001996
1997def BWWriteResGroup187 : SchedWriteRes<[BWPort01,BWPort15,BWPort015,BWPort0156]> {
1998 let Latency = 31;
1999 let NumMicroOps = 31;
2000 let ResourceCycles = [8,1,21,1];
2001}
2002def: InstRW<[BWWriteResGroup187], (instregex "MMX_EMMS")>;
2003
Craig Topper8104f262018-04-02 05:33:28 +00002004def BWWriteResGroup189 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
2005 let Latency = 29;
Gadi Haber323f2e12017-10-24 20:19:47 +00002006 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00002007 let ResourceCycles = [2,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00002008}
2009def: InstRW<[BWWriteResGroup189], (instregex "VSQRTPDYr")>;
2010
2011def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
2012 let Latency = 34;
2013 let NumMicroOps = 8;
2014 let ResourceCycles = [2,2,2,1,1];
2015}
Craig Topper13a16502018-03-19 00:56:09 +00002016def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002017
2018def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
2019 let Latency = 34;
2020 let NumMicroOps = 23;
2021 let ResourceCycles = [1,5,3,4,10];
2022}
Craig Topper5a69a002018-03-21 06:28:42 +00002023def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
2024 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002025
2026def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
2027 let Latency = 35;
2028 let NumMicroOps = 8;
2029 let ResourceCycles = [2,2,2,1,1];
2030}
Craig Topper13a16502018-03-19 00:56:09 +00002031def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002032
2033def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
2034 let Latency = 35;
2035 let NumMicroOps = 23;
2036 let ResourceCycles = [1,5,2,1,4,10];
2037}
Craig Topper5a69a002018-03-21 06:28:42 +00002038def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
2039 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002040
Craig Topper8104f262018-04-02 05:33:28 +00002041def BWWriteResGroup195 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
2042 let Latency = 35;
Gadi Haber323f2e12017-10-24 20:19:47 +00002043 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00002044 let ResourceCycles = [2,1,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00002045}
2046def: InstRW<[BWWriteResGroup195], (instregex "VSQRTPDYm")>;
2047
2048def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
2049 let Latency = 42;
2050 let NumMicroOps = 22;
2051 let ResourceCycles = [2,20];
2052}
Craig Topper2d451e72018-03-18 08:38:06 +00002053def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002054
2055def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
2056 let Latency = 60;
2057 let NumMicroOps = 64;
2058 let ResourceCycles = [2,2,8,1,10,2,39];
2059}
2060def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002061
2062def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
2063 let Latency = 63;
2064 let NumMicroOps = 88;
2065 let ResourceCycles = [4,4,31,1,2,1,45];
2066}
Craig Topper2d451e72018-03-18 08:38:06 +00002067def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002068
2069def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
2070 let Latency = 63;
2071 let NumMicroOps = 90;
2072 let ResourceCycles = [4,2,33,1,2,1,47];
2073}
Craig Topper2d451e72018-03-18 08:38:06 +00002074def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002075
2076def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
2077 let Latency = 75;
2078 let NumMicroOps = 15;
2079 let ResourceCycles = [6,3,6];
2080}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00002081def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002082
2083def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
2084 let Latency = 80;
2085 let NumMicroOps = 32;
2086 let ResourceCycles = [7,7,3,3,1,11];
2087}
2088def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
2089
2090def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
2091 let Latency = 115;
2092 let NumMicroOps = 100;
2093 let ResourceCycles = [9,9,11,8,1,11,21,30];
2094}
2095def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002096
2097} // SchedModel
2098