blob: a1b6a745249cbab6b3d58b4803898077ef1c3642 [file] [log] [blame]
Gadi Haber323f2e12017-10-24 20:19:47 +00001//=- X86SchedBroadwell.td - X86 Broadwell Scheduling ---------*- tablegen -*-=//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the machine model for Broadwell to support instruction
11// scheduling and other instruction cost heuristics.
12//
13//===----------------------------------------------------------------------===//
Clement Courbet0f1da8f2018-05-02 13:54:38 +000014
Gadi Haber323f2e12017-10-24 20:19:47 +000015def BroadwellModel : SchedMachineModel {
Simon Pilgrimf7d2a932018-04-24 13:21:41 +000016 // All x86 instructions are modeled as a single micro-op, and BW can decode 4
Gadi Haber323f2e12017-10-24 20:19:47 +000017 // instructions per cycle.
18 let IssueWidth = 4;
19 let MicroOpBufferSize = 192; // Based on the reorder buffer.
20 let LoadLatency = 5;
21 let MispredictPenalty = 16;
22
23 // Based on the LSD (loop-stream detector) queue size and benchmarking data.
24 let LoopMicroOpBufferSize = 50;
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000025
Simon Pilgrimc21deec2018-03-24 19:37:28 +000026 // This flag is set to allow the scheduler to assign a default model to
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000027 // unrecognized opcodes.
28 let CompleteModel = 0;
Gadi Haber323f2e12017-10-24 20:19:47 +000029}
30
31let SchedModel = BroadwellModel in {
32
33// Broadwell can issue micro-ops to 8 different ports in one cycle.
34
35// Ports 0, 1, 5, and 6 handle all computation.
36// Port 4 gets the data half of stores. Store data can be available later than
37// the store address, but since we don't model the latency of stores, we can
38// ignore that.
39// Ports 2 and 3 are identical. They handle loads and the address half of
40// stores. Port 7 can handle address calculations.
41def BWPort0 : ProcResource<1>;
42def BWPort1 : ProcResource<1>;
43def BWPort2 : ProcResource<1>;
44def BWPort3 : ProcResource<1>;
45def BWPort4 : ProcResource<1>;
46def BWPort5 : ProcResource<1>;
47def BWPort6 : ProcResource<1>;
48def BWPort7 : ProcResource<1>;
49
50// Many micro-ops are capable of issuing on multiple ports.
51def BWPort01 : ProcResGroup<[BWPort0, BWPort1]>;
52def BWPort23 : ProcResGroup<[BWPort2, BWPort3]>;
53def BWPort237 : ProcResGroup<[BWPort2, BWPort3, BWPort7]>;
54def BWPort04 : ProcResGroup<[BWPort0, BWPort4]>;
55def BWPort05 : ProcResGroup<[BWPort0, BWPort5]>;
56def BWPort06 : ProcResGroup<[BWPort0, BWPort6]>;
57def BWPort15 : ProcResGroup<[BWPort1, BWPort5]>;
58def BWPort16 : ProcResGroup<[BWPort1, BWPort6]>;
59def BWPort56 : ProcResGroup<[BWPort5, BWPort6]>;
60def BWPort015 : ProcResGroup<[BWPort0, BWPort1, BWPort5]>;
61def BWPort056 : ProcResGroup<[BWPort0, BWPort5, BWPort6]>;
62def BWPort0156: ProcResGroup<[BWPort0, BWPort1, BWPort5, BWPort6]>;
63
64// 60 Entry Unified Scheduler
65def BWPortAny : ProcResGroup<[BWPort0, BWPort1, BWPort2, BWPort3, BWPort4,
66 BWPort5, BWPort6, BWPort7]> {
67 let BufferSize=60;
68}
69
Simon Pilgrim30c38c32018-03-19 14:46:07 +000070// Integer division issued on port 0.
Craig Topper8104f262018-04-02 05:33:28 +000071def BWDivider : ProcResource<1>;
72// FP division and sqrt on port 0.
73def BWFPDivider : ProcResource<1>;
Simon Pilgrim30c38c32018-03-19 14:46:07 +000074
Gadi Haber323f2e12017-10-24 20:19:47 +000075// Loads are 5 cycles, so ReadAfterLd registers needn't be available until 5
76// cycles after the memory operand.
77def : ReadAdvance<ReadAfterLd, 5>;
78
79// Many SchedWrites are defined in pairs with and without a folded load.
80// Instructions with folded loads are usually micro-fused, so they only appear
81// as two micro-ops when queued in the reservation station.
82// This multiclass defines the resource usage for variants with and without
83// folded loads.
84multiclass BWWriteResPair<X86FoldableSchedWrite SchedRW,
Simon Pilgrim30c38c32018-03-19 14:46:07 +000085 list<ProcResourceKind> ExePorts,
Simon Pilgrime3547af2018-03-25 10:21:19 +000086 int Lat, list<int> Res = [1], int UOps = 1,
87 int LoadLat = 5> {
Gadi Haber323f2e12017-10-24 20:19:47 +000088 // Register variant is using a single cycle on ExePort.
Simon Pilgrim30c38c32018-03-19 14:46:07 +000089 def : WriteRes<SchedRW, ExePorts> {
90 let Latency = Lat;
91 let ResourceCycles = Res;
92 let NumMicroOps = UOps;
93 }
Gadi Haber323f2e12017-10-24 20:19:47 +000094
Simon Pilgrime3547af2018-03-25 10:21:19 +000095 // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to
96 // the latency (default = 5).
Simon Pilgrim30c38c32018-03-19 14:46:07 +000097 def : WriteRes<SchedRW.Folded, !listconcat([BWPort23], ExePorts)> {
Simon Pilgrime3547af2018-03-25 10:21:19 +000098 let Latency = !add(Lat, LoadLat);
Simon Pilgrim30c38c32018-03-19 14:46:07 +000099 let ResourceCycles = !listconcat([1], Res);
Simon Pilgrime3547af2018-03-25 10:21:19 +0000100 let NumMicroOps = !add(UOps, 1);
Gadi Haber323f2e12017-10-24 20:19:47 +0000101 }
102}
103
Craig Topperf131b602018-04-06 16:16:46 +0000104// A folded store needs a cycle on port 4 for the store data, and an extra port
105// 2/3/7 cycle to recompute the address.
106def : WriteRes<WriteRMW, [BWPort237,BWPort4]>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000107
108// Arithmetic.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000109defm : BWWriteResPair<WriteALU, [BWPort0156], 1>; // Simple integer ALU op.
110defm : BWWriteResPair<WriteIMul, [BWPort1], 3>; // Integer multiplication.
111defm : BWWriteResPair<WriteIDiv, [BWPort0, BWDivider], 25, [1, 10]>;
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000112defm : BWWriteResPair<WriteCRC32, [BWPort1], 3>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000113def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, high part.
Gadi Haber323f2e12017-10-24 20:19:47 +0000114
115def : WriteRes<WriteLEA, [BWPort15]>; // LEA instructions can't fold loads.
116
Craig Topperb7baa352018-04-08 17:53:18 +0000117defm : BWWriteResPair<WriteCMOV, [BWPort06], 1>; // Conditional move.
118def : WriteRes<WriteSETCC, [BWPort06]>; // Setcc.
119def : WriteRes<WriteSETCCStore, [BWPort06,BWPort4,BWPort237]> {
120 let Latency = 2;
121 let NumMicroOps = 3;
122}
123
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000124// Bit counts.
125defm : BWWriteResPair<WriteBitScan, [BWPort1], 3>;
126defm : BWWriteResPair<WriteLZCNT, [BWPort1], 3>;
127defm : BWWriteResPair<WriteTZCNT, [BWPort1], 3>;
128defm : BWWriteResPair<WritePOPCNT, [BWPort1], 3>;
129
Gadi Haber323f2e12017-10-24 20:19:47 +0000130// Integer shifts and rotates.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000131defm : BWWriteResPair<WriteShift, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000132
Craig Topper89310f52018-03-29 20:41:39 +0000133// BMI1 BEXTR, BMI2 BZHI
134defm : BWWriteResPair<WriteBEXTR, [BWPort06,BWPort15], 2, [1,1], 2>;
135defm : BWWriteResPair<WriteBZHI, [BWPort15], 1>;
136
Gadi Haber323f2e12017-10-24 20:19:47 +0000137// Loads, stores, and moves, not folded with other operations.
138def : WriteRes<WriteLoad, [BWPort23]> { let Latency = 5; }
139def : WriteRes<WriteStore, [BWPort237, BWPort4]>;
140def : WriteRes<WriteMove, [BWPort0156]>;
141
142// Idioms that clear a register, like xorps %xmm0, %xmm0.
143// These can often bypass execution ports completely.
144def : WriteRes<WriteZero, []>;
145
Sanjoy Das1074eb22017-12-12 19:11:31 +0000146// Treat misc copies as a move.
147def : InstRW<[WriteMove], (instrs COPY)>;
148
Gadi Haber323f2e12017-10-24 20:19:47 +0000149// Branches don't produce values, so they have no latency, but they still
150// consume resources. Indirect branches can fold loads.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000151defm : BWWriteResPair<WriteJump, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000152
153// Floating point. This covers both scalar and vector operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000154def : WriteRes<WriteFLoad, [BWPort23]> { let Latency = 5; }
155def : WriteRes<WriteFStore, [BWPort237, BWPort4]>;
156def : WriteRes<WriteFMove, [BWPort5]>;
157
Simon Pilgrim21caf012018-05-01 18:22:53 +0000158defm : BWWriteResPair<WriteFAdd, [BWPort1], 3, [1], 1, 5>; // Floating point add/sub.
Clement Courbet0f1da8f2018-05-02 13:54:38 +0000159defm : BWWriteResPair<WriteFAddY, [BWPort1], 3, [1], 1, 6>; // Floating point add/sub (YMM/ZMM).
Simon Pilgrim21caf012018-05-01 18:22:53 +0000160defm : BWWriteResPair<WriteFCmp, [BWPort1], 3, [1], 1, 5>; // Floating point compare.
Clement Courbet0f1da8f2018-05-02 13:54:38 +0000161defm : BWWriteResPair<WriteFCmpY, [BWPort1], 3, [1], 1, 6>; // Floating point compare (YMM/ZMM).
Simon Pilgrim21caf012018-05-01 18:22:53 +0000162defm : BWWriteResPair<WriteFCom, [BWPort1], 3>; // Floating point compare to flags.
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000163defm : BWWriteResPair<WriteFMul, [BWPort01], 3, [1], 1, 5>; // Floating point multiplication.
164defm : BWWriteResPair<WriteFMulY, [BWPort01], 3, [1], 1, 6>; // Floating point multiplication (YMM/ZMM).
Simon Pilgrim21caf012018-05-01 18:22:53 +0000165defm : BWWriteResPair<WriteFDiv, [BWPort0], 12, [1], 1, 5>; // 10-14 cycles. // Floating point division.
166defm : BWWriteResPair<WriteFDivY, [BWPort0], 12, [1], 1, 7>; // 10-14 cycles. // Floating point division (YMM/ZMM).
Simon Pilgrimc7088682018-05-01 18:06:07 +0000167defm : BWWriteResPair<WriteFSqrt, [BWPort0], 15, [1], 1, 5>; // Floating point square root.
168defm : BWWriteResPair<WriteFSqrtY, [BWPort0], 15, [1], 1, 7>; // Floating point square root (YMM/ZMM).
169defm : BWWriteResPair<WriteFRcp, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal estimate.
170defm : BWWriteResPair<WriteFRcpY, [BWPort0], 5, [1], 1, 7>; // Floating point reciprocal estimate (YMM/ZMM).
171defm : BWWriteResPair<WriteFRsqrt, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal square root estimate.
172defm : BWWriteResPair<WriteFRsqrtY,[BWPort0], 5, [1], 1, 7>; // Floating point reciprocal square root estimate (YMM/ZMM).
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000173defm : BWWriteResPair<WriteFMA, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add.
174defm : BWWriteResPair<WriteFMAS, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add (Scalar).
175defm : BWWriteResPair<WriteFMAY, [BWPort01], 5, [1], 1, 6>; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000176defm : BWWriteResPair<WriteFSign, [BWPort5], 1>; // Floating point fabs/fchs.
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000177defm : BWWriteResPair<WriteFLogic, [BWPort5], 1, [1], 1, 5>; // Floating point and/or/xor logicals.
178defm : BWWriteResPair<WriteFLogicY, [BWPort5], 1, [1], 1, 6>; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000179defm : BWWriteResPair<WriteFShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector shuffles.
180defm : BWWriteResPair<WriteFShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000181defm : BWWriteResPair<WriteFVarShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector variable shuffles.
182defm : BWWriteResPair<WriteFVarShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
183defm : BWWriteResPair<WriteFBlend, [BWPort015], 1, [1], 1, 5>; // Floating point vector blends.
184defm : BWWriteResPair<WriteFBlendY, [BWPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000185defm : BWWriteResPair<WriteFVarBlend, [BWPort5], 2, [2], 2, 5>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000186defm : BWWriteResPair<WriteFVarBlendY, [BWPort5], 2, [2], 2, 6>; // Fp vector variable blends.
Gadi Haber323f2e12017-10-24 20:19:47 +0000187
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000188def : WriteRes<WriteCvtF2FSt, [BWPort1,BWPort4,BWPort237]> {
189 let Latency = 4;
190 let NumMicroOps = 3;
191 let ResourceCycles = [1,1,1];
192}
193
Gadi Haber323f2e12017-10-24 20:19:47 +0000194// FMA Scheduling helper class.
195// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
196
197// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000198def : WriteRes<WriteVecLoad, [BWPort23]> { let Latency = 5; }
199def : WriteRes<WriteVecStore, [BWPort237, BWPort4]>;
200def : WriteRes<WriteVecMove, [BWPort015]>;
201
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000202defm : BWWriteResPair<WriteVecALU, [BWPort15], 1>; // Vector integer ALU op, no logicals.
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000203defm : BWWriteResPair<WriteVecLogic, [BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
204defm : BWWriteResPair<WriteVecLogicY,[BWPort015], 1, [1], 1, 6>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000205defm : BWWriteResPair<WriteVecShift, [BWPort0], 1>; // Vector integer shifts.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000206defm : BWWriteResPair<WriteVecIMul, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
207defm : BWWriteResPair<WriteVecIMulY, [BWPort0], 5, [1], 1, 6>; // Vector integer multiply.
208defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // Vector PMULLD.
209defm : BWWriteResPair<WritePMULLDY, [BWPort0], 10, [2], 2, 6>; // Vector PMULLD (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000210defm : BWWriteResPair<WriteShuffle, [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000211defm : BWWriteResPair<WriteShuffleY, [BWPort5], 1, [1], 1, 6>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000212defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000213defm : BWWriteResPair<WriteVarShuffleY,[BWPort5], 1, [1], 1, 6>; // Vector variable shuffles (YMM/ZMM).
214defm : BWWriteResPair<WriteBlend, [BWPort5], 1, [1], 1, 5>; // Vector blends.
215defm : BWWriteResPair<WriteBlendY, [BWPort5], 1, [1], 1, 6>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000216defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000217defm : BWWriteResPair<WriteVarBlendY, [BWPort5], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000218defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000219defm : BWWriteResPair<WriteMPSADY, [BWPort0, BWPort5], 7, [1, 2], 3, 6>; // Vector MPSAD.
220defm : BWWriteResPair<WritePSADBW, [BWPort0], 5, [1], 1, 5>; // Vector PSADBW.
221defm : BWWriteResPair<WritePSADBWY, [BWPort0], 5, [1], 1, 6>; // Vector PSADBW (YMM/ZMM).
222defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000223
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000224// Vector insert/extract operations.
225def : WriteRes<WriteVecInsert, [BWPort5]> {
226 let Latency = 2;
227 let NumMicroOps = 2;
228 let ResourceCycles = [2];
229}
230def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
231 let Latency = 6;
232 let NumMicroOps = 2;
233}
234
235def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
236 let Latency = 2;
237 let NumMicroOps = 2;
238}
239def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
240 let Latency = 2;
241 let NumMicroOps = 3;
242}
243
Gadi Haber323f2e12017-10-24 20:19:47 +0000244// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000245defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
246defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
247defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000248
249// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000250
Gadi Haber323f2e12017-10-24 20:19:47 +0000251// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000252def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000253 let Latency = 11;
254 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000255 let ResourceCycles = [3];
256}
257def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000258 let Latency = 16;
259 let NumMicroOps = 4;
260 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000261}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000262
263// Packed Compare Explicit Length Strings, Return Mask
264def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
265 let Latency = 19;
266 let NumMicroOps = 9;
267 let ResourceCycles = [4,3,1,1];
268}
269def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
270 let Latency = 24;
271 let NumMicroOps = 10;
272 let ResourceCycles = [4,3,1,1,1];
273}
274
275// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000276def : WriteRes<WritePCmpIStrI, [BWPort0]> {
277 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000278 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000279 let ResourceCycles = [3];
280}
281def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000282 let Latency = 16;
283 let NumMicroOps = 4;
284 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000285}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000286
287// Packed Compare Explicit Length Strings, Return Index
288def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
289 let Latency = 18;
290 let NumMicroOps = 8;
291 let ResourceCycles = [4,3,1];
292}
293def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
294 let Latency = 23;
295 let NumMicroOps = 9;
296 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000297}
298
Simon Pilgrima2f26782018-03-27 20:38:54 +0000299// MOVMSK Instructions.
300def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
301def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
302def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
303
Gadi Haber323f2e12017-10-24 20:19:47 +0000304// AES instructions.
305def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
306 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000307 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000308 let ResourceCycles = [1];
309}
310def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000311 let Latency = 12;
312 let NumMicroOps = 2;
313 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000314}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000315
Gadi Haber323f2e12017-10-24 20:19:47 +0000316def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
317 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000318 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000319 let ResourceCycles = [2];
320}
321def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000322 let Latency = 19;
323 let NumMicroOps = 3;
324 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000325}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000326
327def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
328 let Latency = 29;
329 let NumMicroOps = 11;
330 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000331}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000332def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
333 let Latency = 33;
334 let NumMicroOps = 11;
335 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000336}
337
338// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000339defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000340
341// Catch-all for expensive system instructions.
342def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
343
344// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000345defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
346defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
347defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
348defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
349defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 2, [2, 1]>; // Variable vector shifts.
Gadi Haber323f2e12017-10-24 20:19:47 +0000350
351// Old microcoded instructions that nobody use.
352def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
353
354// Fence instructions.
355def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
356
Craig Topper05242bf2018-04-21 18:07:36 +0000357// Load/store MXCSR.
358def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
359def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
360
Gadi Haber323f2e12017-10-24 20:19:47 +0000361// Nop, not very useful expect it provides a model for nops!
362def : WriteRes<WriteNop, []>;
363
364////////////////////////////////////////////////////////////////////////////////
365// Horizontal add/sub instructions.
366////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000367
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000368defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000369defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000370defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000371
372// Remaining instrs.
373
374def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
375 let Latency = 1;
376 let NumMicroOps = 1;
377 let ResourceCycles = [1];
378}
Craig Topper5a69a002018-03-21 06:28:42 +0000379def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
380 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000381 "(V?)MOVPDI2DIrr",
382 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000383 "VPSLLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000384 "VPSRLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000385 "VTESTPD(Y?)rr",
386 "VTESTPS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000387
388def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
389 let Latency = 1;
390 let NumMicroOps = 1;
391 let ResourceCycles = [1];
392}
Craig Topper5a69a002018-03-21 06:28:42 +0000393def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
394 "COM_FST0r",
395 "UCOM_FPr",
396 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000397
398def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
399 let Latency = 1;
400 let NumMicroOps = 1;
401 let ResourceCycles = [1];
402}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000403def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000404 "MMX_MOVD64to64rr",
405 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000406 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000407 "(V?)MOVDI2PDIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000408
409def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
410 let Latency = 1;
411 let NumMicroOps = 1;
412 let ResourceCycles = [1];
413}
414def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
415
416def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
417 let Latency = 1;
418 let NumMicroOps = 1;
419 let ResourceCycles = [1];
420}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000421def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000422
423def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
424 let Latency = 1;
425 let NumMicroOps = 1;
426 let ResourceCycles = [1];
427}
Craig Topperfbe31322018-04-05 21:56:19 +0000428def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000429def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
430 "ADC(16|32|64)i",
431 "ADC(8|16|32|64)rr",
432 "ADCX(32|64)rr",
433 "ADOX(32|64)rr",
434 "BT(16|32|64)ri8",
435 "BT(16|32|64)rr",
436 "BTC(16|32|64)ri8",
437 "BTC(16|32|64)rr",
438 "BTR(16|32|64)ri8",
439 "BTR(16|32|64)rr",
440 "BTS(16|32|64)ri8",
441 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000442 "SBB(16|32|64)ri",
443 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000444 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000445
446def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
447 let Latency = 1;
448 let NumMicroOps = 1;
449 let ResourceCycles = [1];
450}
Craig Topper5a69a002018-03-21 06:28:42 +0000451def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
452 "BLSI(32|64)rr",
453 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000454 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000455
456def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
457 let Latency = 1;
458 let NumMicroOps = 1;
459 let ResourceCycles = [1];
460}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000461def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000462 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000463
464def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
465 let Latency = 1;
466 let NumMicroOps = 1;
467 let ResourceCycles = [1];
468}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000469def: InstRW<[BWWriteResGroup9], (instrs LAHF, SAHF)>; // TODO: This doesnt match Agner's data
470def: InstRW<[BWWriteResGroup9], (instregex "NOOP",
Craig Topper5a69a002018-03-21 06:28:42 +0000471 "SGDT64m",
472 "SIDT64m",
Craig Topper5a69a002018-03-21 06:28:42 +0000473 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000474 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000475 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000476
477def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
478 let Latency = 1;
479 let NumMicroOps = 2;
480 let ResourceCycles = [1,1];
481}
Craig Topper5a69a002018-03-21 06:28:42 +0000482def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
483 "MMX_MOVD64from64rm",
484 "MMX_MOVD64mr",
485 "MMX_MOVNTQmr",
486 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000487 "MOVNTI_64mr",
488 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000489 "ST_FP(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000490 "VEXTRACTF128mr",
491 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000492 "(V?)MOVAPD(Y?)mr",
493 "(V?)MOVAPS(Y?)mr",
494 "(V?)MOVDQA(Y?)mr",
495 "(V?)MOVDQU(Y?)mr",
496 "(V?)MOVHPDmr",
497 "(V?)MOVHPSmr",
498 "(V?)MOVLPDmr",
499 "(V?)MOVLPSmr",
500 "(V?)MOVNTDQ(V?)mr",
501 "(V?)MOVNTPD(V?)mr",
502 "(V?)MOVNTPS(V?)mr",
503 "(V?)MOVPDI2DImr",
504 "(V?)MOVPQI2QImr",
505 "(V?)MOVPQIto64mr",
506 "(V?)MOVSDmr",
507 "(V?)MOVSSmr",
508 "(V?)MOVUPD(Y?)mr",
509 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000510
Gadi Haber323f2e12017-10-24 20:19:47 +0000511def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
512 let Latency = 2;
513 let NumMicroOps = 2;
514 let ResourceCycles = [2];
515}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000516def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000517
518def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
519 let Latency = 2;
520 let NumMicroOps = 2;
521 let ResourceCycles = [2];
522}
Craig Topper5a69a002018-03-21 06:28:42 +0000523def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
524 "ROL(8|16|32|64)ri",
525 "ROR(8|16|32|64)r1",
526 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000527
528def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
529 let Latency = 2;
530 let NumMicroOps = 2;
531 let ResourceCycles = [2];
532}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000533def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
534 MFENCE,
535 WAIT,
536 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000537
538def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
539 let Latency = 2;
540 let NumMicroOps = 2;
541 let ResourceCycles = [1,1];
542}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000543def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000544 "(V?)CVTPS2PDrr",
545 "(V?)CVTSS2SDrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000546 "(V?)PSLLDrr",
547 "(V?)PSLLQrr",
548 "(V?)PSLLWrr",
549 "(V?)PSRADrr",
550 "(V?)PSRAWrr",
551 "(V?)PSRLDrr",
552 "(V?)PSRLQrr",
553 "(V?)PSRLWrr",
554 "(V?)PTESTrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000555
556def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
557 let Latency = 2;
558 let NumMicroOps = 2;
559 let ResourceCycles = [1,1];
560}
561def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
562
563def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
564 let Latency = 2;
565 let NumMicroOps = 2;
566 let ResourceCycles = [1,1];
567}
568def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
569
570def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
571 let Latency = 2;
572 let NumMicroOps = 2;
573 let ResourceCycles = [1,1];
574}
575def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
576
577def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
578 let Latency = 2;
579 let NumMicroOps = 2;
580 let ResourceCycles = [1,1];
581}
Craig Topper498875f2018-04-04 17:54:19 +0000582def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
583
584def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
585 let Latency = 1;
586 let NumMicroOps = 1;
587 let ResourceCycles = [1];
588}
589def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000590
591def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
592 let Latency = 2;
593 let NumMicroOps = 2;
594 let ResourceCycles = [1,1];
595}
Craig Topper2d451e72018-03-18 08:38:06 +0000596def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000597def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000598def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
599 "ADC8ri",
600 "CMOV(A|BE)(16|32|64)rr",
601 "SBB8i8",
602 "SBB8ri",
603 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000604
Gadi Haber323f2e12017-10-24 20:19:47 +0000605def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
606 let Latency = 2;
607 let NumMicroOps = 3;
608 let ResourceCycles = [1,1,1];
609}
610def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
611
Gadi Haber323f2e12017-10-24 20:19:47 +0000612def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
613 let Latency = 2;
614 let NumMicroOps = 3;
615 let ResourceCycles = [1,1,1];
616}
617def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
618
619def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
620 let Latency = 2;
621 let NumMicroOps = 3;
622 let ResourceCycles = [1,1,1];
623}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000624def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
625 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000626def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000627 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000628
Gadi Haber323f2e12017-10-24 20:19:47 +0000629def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
630 let Latency = 3;
631 let NumMicroOps = 1;
632 let ResourceCycles = [1];
633}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000634def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000635 "PDEP(32|64)rr",
636 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000637 "SHLD(16|32|64)rri8",
638 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000639 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000640
641def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000642 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000643 let NumMicroOps = 2;
644 let ResourceCycles = [1,1];
645}
Clement Courbet327fac42018-03-07 08:14:02 +0000646def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000647
648def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
649 let Latency = 3;
650 let NumMicroOps = 1;
651 let ResourceCycles = [1];
652}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000653def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
654 "VPBROADCASTWrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000655 "VPMOVSXBDYrr",
656 "VPMOVSXBQYrr",
657 "VPMOVSXBWYrr",
658 "VPMOVSXDQYrr",
659 "VPMOVSXWDYrr",
660 "VPMOVSXWQYrr",
661 "VPMOVZXBDYrr",
662 "VPMOVZXBQYrr",
663 "VPMOVZXBWYrr",
664 "VPMOVZXDQYrr",
665 "VPMOVZXWDYrr",
666 "VPMOVZXWQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000667
Gadi Haber323f2e12017-10-24 20:19:47 +0000668def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000669 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000670 let NumMicroOps = 3;
671 let ResourceCycles = [3];
672}
Craig Topperb5f26592018-04-19 18:00:17 +0000673def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
674 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
675 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000676
677def BWWriteResGroup31 : SchedWriteRes<[BWPort0,BWPort5]> {
678 let Latency = 3;
679 let NumMicroOps = 3;
680 let ResourceCycles = [2,1];
681}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000682def: InstRW<[BWWriteResGroup31], (instregex "VPSLLVD(Y?)rr",
683 "VPSRAVD(Y?)rr",
684 "VPSRLVD(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000685
Gadi Haber323f2e12017-10-24 20:19:47 +0000686def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
687 let Latency = 3;
688 let NumMicroOps = 3;
689 let ResourceCycles = [2,1];
690}
Craig Topper5a69a002018-03-21 06:28:42 +0000691def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
692 "MMX_PACKSSWBirr",
693 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000694
695def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
696 let Latency = 3;
697 let NumMicroOps = 3;
698 let ResourceCycles = [1,2];
699}
700def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
701
702def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
703 let Latency = 3;
704 let NumMicroOps = 3;
705 let ResourceCycles = [1,2];
706}
Craig Topper5a69a002018-03-21 06:28:42 +0000707def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
708 "RCL(8|16|32|64)ri",
709 "RCR(8|16|32|64)r1",
710 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000711
712def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
713 let Latency = 3;
714 let NumMicroOps = 3;
715 let ResourceCycles = [2,1];
716}
Craig Topper5a69a002018-03-21 06:28:42 +0000717def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
718 "ROR(8|16|32|64)rCL",
719 "SAR(8|16|32|64)rCL",
720 "SHL(8|16|32|64)rCL",
721 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000722
723def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
724 let Latency = 3;
725 let NumMicroOps = 4;
726 let ResourceCycles = [1,1,1,1];
727}
728def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
729
730def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
731 let Latency = 3;
732 let NumMicroOps = 4;
733 let ResourceCycles = [1,1,1,1];
734}
Craig Topper5a69a002018-03-21 06:28:42 +0000735def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
736 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000737
738def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
739 let Latency = 4;
740 let NumMicroOps = 2;
741 let ResourceCycles = [1,1];
742}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000743def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
744 "(V?)CVTSD2SIrr",
745 "(V?)CVTSS2SI64rr",
746 "(V?)CVTSS2SIrr",
747 "(V?)CVTTSD2SI64rr",
748 "(V?)CVTTSD2SIrr",
749 "(V?)CVTTSS2SI64rr",
750 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000751
752def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
753 let Latency = 4;
754 let NumMicroOps = 2;
755 let ResourceCycles = [1,1];
756}
Craig Topper5a69a002018-03-21 06:28:42 +0000757def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr",
758 "VPSLLDYrr",
759 "VPSLLQYrr",
760 "VPSLLWYrr",
761 "VPSRADYrr",
762 "VPSRAWYrr",
763 "VPSRLDYrr",
764 "VPSRLQYrr",
765 "VPSRLWYrr",
766 "VPTESTYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000767
768def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
769 let Latency = 4;
770 let NumMicroOps = 2;
771 let ResourceCycles = [1,1];
772}
773def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
774
775def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
776 let Latency = 4;
777 let NumMicroOps = 2;
778 let ResourceCycles = [1,1];
779}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000780def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000781def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000782 "MMX_CVTPI2PDirr",
783 "MMX_CVTPS2PIirr",
784 "MMX_CVTTPD2PIirr",
785 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000786 "(V?)CVTDQ2PDrr",
787 "(V?)CVTPD2DQrr",
788 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000789 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000790 "(V?)CVTSD2SSrr",
791 "(V?)CVTSI642SDrr",
792 "(V?)CVTSI2SDrr",
793 "(V?)CVTSI2SSrr",
794 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000795
796def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
797 let Latency = 4;
798 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000799 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000800}
Craig Topper5a69a002018-03-21 06:28:42 +0000801def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000802
803def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
804 let Latency = 4;
805 let NumMicroOps = 3;
806 let ResourceCycles = [1,1,1];
807}
808def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
809
810def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
811 let Latency = 4;
812 let NumMicroOps = 3;
813 let ResourceCycles = [1,1,1];
814}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000815def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
816 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000817
818def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
819 let Latency = 4;
820 let NumMicroOps = 4;
821 let ResourceCycles = [4];
822}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000823def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000824
825def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
826 let Latency = 4;
827 let NumMicroOps = 4;
828 let ResourceCycles = [1,3];
829}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000830def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000831
832def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
833 let Latency = 5;
834 let NumMicroOps = 1;
835 let ResourceCycles = [1];
836}
Simon Pilgrima53d3302018-05-02 16:16:24 +0000837def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr",
838 "MUL_FPrST0",
839 "MUL_FST0r",
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000840 "MUL_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000841
Gadi Haber323f2e12017-10-24 20:19:47 +0000842def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
843 let Latency = 5;
844 let NumMicroOps = 1;
845 let ResourceCycles = [1];
846}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000847def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000848 "MOVSX(16|32|64)rm32",
849 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000850 "MOVZX(16|32|64)rm16",
851 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000852 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000853 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000854 "(V?)MOVSHDUPrm",
855 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000856 "VPBROADCASTDrm",
857 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000858
859def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
860 let Latency = 5;
861 let NumMicroOps = 3;
862 let ResourceCycles = [1,2];
863}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000864def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000865
866def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
867 let Latency = 5;
868 let NumMicroOps = 3;
869 let ResourceCycles = [1,1,1];
870}
871def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
872
873def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000874 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000875 let NumMicroOps = 3;
876 let ResourceCycles = [1,1,1];
877}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000878def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000879
880def BWWriteResGroup53 : SchedWriteRes<[BWPort0,BWPort4,BWPort237,BWPort15]> {
881 let Latency = 5;
882 let NumMicroOps = 4;
883 let ResourceCycles = [1,1,1,1];
884}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000885def: InstRW<[BWWriteResGroup53], (instregex "VMASKMOVPD(Y?)mr",
886 "VMASKMOVPS(Y?)mr",
887 "VPMASKMOVD(Y?)mr",
888 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000889
890def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
891 let Latency = 5;
892 let NumMicroOps = 5;
893 let ResourceCycles = [1,4];
894}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000895def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000896
897def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
898 let Latency = 5;
899 let NumMicroOps = 5;
900 let ResourceCycles = [1,4];
901}
902def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
903
904def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
905 let Latency = 5;
906 let NumMicroOps = 5;
907 let ResourceCycles = [2,3];
908}
Craig Topper5a69a002018-03-21 06:28:42 +0000909def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000910
911def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
912 let Latency = 5;
913 let NumMicroOps = 6;
914 let ResourceCycles = [1,1,4];
915}
Craig Topper5a69a002018-03-21 06:28:42 +0000916def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000917
918def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
919 let Latency = 6;
920 let NumMicroOps = 1;
921 let ResourceCycles = [1];
922}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000923def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000924 "VBROADCASTF128",
925 "VBROADCASTI128",
926 "VBROADCASTSDYrm",
927 "VBROADCASTSSYrm",
928 "VLDDQUYrm",
929 "VMOVAPDYrm",
930 "VMOVAPSYrm",
931 "VMOVDDUPYrm",
932 "VMOVDQAYrm",
933 "VMOVDQUYrm",
934 "VMOVNTDQAYrm",
935 "VMOVSHDUPYrm",
936 "VMOVSLDUPYrm",
937 "VMOVUPDYrm",
938 "VMOVUPSYrm",
939 "VPBROADCASTDYrm",
940 "VPBROADCASTQYrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000941 "(V?)ROUNDPD(Y?)r",
942 "(V?)ROUNDPS(Y?)r",
943 "(V?)ROUNDSDr",
944 "(V?)ROUNDSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000945
946def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
947 let Latency = 6;
948 let NumMicroOps = 2;
949 let ResourceCycles = [1,1];
950}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000951def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000952 "(V?)CVTPS2PDrm",
953 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000954 "VPSLLVQrm",
955 "VPSRLVQrm",
956 "VTESTPDrm",
957 "VTESTPSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000958
959def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
960 let Latency = 6;
961 let NumMicroOps = 2;
962 let ResourceCycles = [1,1];
963}
Craig Topper5a69a002018-03-21 06:28:42 +0000964def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
965 "VCVTPD2DQYrr",
966 "VCVTPD2PSYrr",
967 "VCVTPS2PHYrr",
968 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000969
Gadi Haber323f2e12017-10-24 20:19:47 +0000970def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
971 let Latency = 6;
972 let NumMicroOps = 2;
973 let ResourceCycles = [1,1];
974}
Craig Topper5a69a002018-03-21 06:28:42 +0000975def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
976 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000977
978def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
979 let Latency = 6;
980 let NumMicroOps = 2;
981 let ResourceCycles = [1,1];
982}
Craig Topperdfccafe2018-04-18 06:41:25 +0000983def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +0000984def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
985 ADCX32rm, ADCX64rm,
986 ADOX32rm, ADOX64rm,
987 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000988
989def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
990 let Latency = 6;
991 let NumMicroOps = 2;
992 let ResourceCycles = [1,1];
993}
Craig Topper5a69a002018-03-21 06:28:42 +0000994def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
995 "BLSI(32|64)rm",
996 "BLSMSK(32|64)rm",
997 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +0000998 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000999
1000def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
1001 let Latency = 6;
1002 let NumMicroOps = 2;
1003 let ResourceCycles = [1,1];
1004}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001005def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +00001006 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001007 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001008
1009def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1010 let Latency = 6;
1011 let NumMicroOps = 2;
1012 let ResourceCycles = [1,1];
1013}
Craig Topper2d451e72018-03-18 08:38:06 +00001014def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001015def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001016
1017def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1018 let Latency = 6;
1019 let NumMicroOps = 4;
1020 let ResourceCycles = [1,1,2];
1021}
Craig Topper5a69a002018-03-21 06:28:42 +00001022def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1023 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001024
1025def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1026 let Latency = 6;
1027 let NumMicroOps = 4;
1028 let ResourceCycles = [1,1,1,1];
1029}
1030def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1031
1032def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1033 let Latency = 6;
1034 let NumMicroOps = 4;
1035 let ResourceCycles = [1,1,1,1];
1036}
Craig Topper5a69a002018-03-21 06:28:42 +00001037def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1038 "BTR(16|32|64)mi8",
1039 "BTS(16|32|64)mi8",
1040 "SAR(8|16|32|64)m1",
1041 "SAR(8|16|32|64)mi",
1042 "SHL(8|16|32|64)m1",
1043 "SHL(8|16|32|64)mi",
1044 "SHR(8|16|32|64)m1",
1045 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001046
1047def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1048 let Latency = 6;
1049 let NumMicroOps = 4;
1050 let ResourceCycles = [1,1,1,1];
1051}
Craig Topperf0d04262018-04-06 16:16:48 +00001052def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1053 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001054
1055def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1056 let Latency = 6;
1057 let NumMicroOps = 6;
1058 let ResourceCycles = [1,5];
1059}
1060def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1061
Gadi Haber323f2e12017-10-24 20:19:47 +00001062def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1063 let Latency = 7;
1064 let NumMicroOps = 2;
1065 let ResourceCycles = [1,1];
1066}
Craig Topper5a69a002018-03-21 06:28:42 +00001067def: InstRW<[BWWriteResGroup73], (instregex "VPSLLDYrm",
1068 "VPSLLQYrm",
1069 "VPSLLVQYrm",
1070 "VPSLLWYrm",
1071 "VPSRADYrm",
1072 "VPSRAWYrm",
1073 "VPSRLDYrm",
1074 "VPSRLQYrm",
1075 "VPSRLVQYrm",
1076 "VPSRLWYrm",
1077 "VTESTPDYrm",
1078 "VTESTPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001079
1080def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1081 let Latency = 7;
1082 let NumMicroOps = 2;
1083 let ResourceCycles = [1,1];
1084}
Craig Topper5a69a002018-03-21 06:28:42 +00001085def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1086 "FCOM64m",
1087 "FCOMP32m",
1088 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001089
Gadi Haber323f2e12017-10-24 20:19:47 +00001090def BWWriteResGroup76 : SchedWriteRes<[BWPort23,BWPort15]> {
1091 let Latency = 7;
1092 let NumMicroOps = 2;
1093 let ResourceCycles = [1,1];
1094}
Craig Topper5a69a002018-03-21 06:28:42 +00001095def: InstRW<[BWWriteResGroup76], (instregex "VPABSBYrm",
1096 "VPABSDYrm",
1097 "VPABSWYrm",
1098 "VPADDBYrm",
1099 "VPADDDYrm",
1100 "VPADDQYrm",
1101 "VPADDSBYrm",
1102 "VPADDSWYrm",
1103 "VPADDUSBYrm",
1104 "VPADDUSWYrm",
1105 "VPADDWYrm",
1106 "VPAVGBYrm",
1107 "VPAVGWYrm",
1108 "VPCMPEQBYrm",
1109 "VPCMPEQDYrm",
1110 "VPCMPEQQYrm",
1111 "VPCMPEQWYrm",
1112 "VPCMPGTBYrm",
1113 "VPCMPGTDYrm",
1114 "VPCMPGTWYrm",
1115 "VPMAXSBYrm",
1116 "VPMAXSDYrm",
1117 "VPMAXSWYrm",
1118 "VPMAXUBYrm",
1119 "VPMAXUDYrm",
1120 "VPMAXUWYrm",
1121 "VPMINSBYrm",
1122 "VPMINSDYrm",
1123 "VPMINSWYrm",
1124 "VPMINUBYrm",
1125 "VPMINUDYrm",
1126 "VPMINUWYrm",
1127 "VPSIGNBYrm",
1128 "VPSIGNDYrm",
1129 "VPSIGNWYrm",
1130 "VPSUBBYrm",
1131 "VPSUBDYrm",
1132 "VPSUBQYrm",
1133 "VPSUBSBYrm",
1134 "VPSUBSWYrm",
1135 "VPSUBUSBYrm",
1136 "VPSUBUSWYrm",
1137 "VPSUBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001138
1139def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1140 let Latency = 7;
1141 let NumMicroOps = 2;
1142 let ResourceCycles = [1,1];
1143}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001144def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001145
Gadi Haber323f2e12017-10-24 20:19:47 +00001146def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1147 let Latency = 7;
1148 let NumMicroOps = 3;
1149 let ResourceCycles = [2,1];
1150}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001151def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001152 "MMX_PACKSSWBirm",
1153 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001154 "VMASKMOVPDrm",
1155 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001156 "VPMASKMOVDrm",
1157 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001158
1159def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1160 let Latency = 7;
1161 let NumMicroOps = 3;
1162 let ResourceCycles = [1,2];
1163}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001164def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1165 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001166
1167def BWWriteResGroup81 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1168 let Latency = 7;
1169 let NumMicroOps = 3;
1170 let ResourceCycles = [1,1,1];
1171}
Simon Pilgrimd5ada492018-04-29 15:33:15 +00001172def: InstRW<[BWWriteResGroup81], (instregex "(V?)PSLLDrm",
1173 "(V?)PSLLQrm",
1174 "(V?)PSLLWrm",
1175 "(V?)PSRADrm",
1176 "(V?)PSRAWrm",
1177 "(V?)PSRLDrm",
1178 "(V?)PSRLQrm",
1179 "(V?)PSRLWrm",
1180 "(V?)PTESTrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001181
1182def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1183 let Latency = 7;
1184 let NumMicroOps = 3;
1185 let ResourceCycles = [1,1,1];
1186}
1187def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1188
Gadi Haber323f2e12017-10-24 20:19:47 +00001189def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1190 let Latency = 7;
1191 let NumMicroOps = 3;
1192 let ResourceCycles = [1,1,1];
1193}
Craig Topper5a69a002018-03-21 06:28:42 +00001194def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1195 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001196
Gadi Haber323f2e12017-10-24 20:19:47 +00001197def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1198 let Latency = 7;
1199 let NumMicroOps = 3;
1200 let ResourceCycles = [1,1,1];
1201}
Craig Topperf4cd9082018-01-19 05:47:32 +00001202def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001203
1204def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1205 let Latency = 7;
1206 let NumMicroOps = 5;
1207 let ResourceCycles = [1,1,1,2];
1208}
Craig Topper5a69a002018-03-21 06:28:42 +00001209def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1210 "ROL(8|16|32|64)mi",
1211 "ROR(8|16|32|64)m1",
1212 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001213
1214def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1215 let Latency = 7;
1216 let NumMicroOps = 5;
1217 let ResourceCycles = [1,1,1,2];
1218}
Craig Topper5a69a002018-03-21 06:28:42 +00001219def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001220
1221def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1222 let Latency = 7;
1223 let NumMicroOps = 5;
1224 let ResourceCycles = [1,1,1,1,1];
1225}
Craig Topper5a69a002018-03-21 06:28:42 +00001226def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1227 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001228
1229def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1230 let Latency = 7;
1231 let NumMicroOps = 7;
1232 let ResourceCycles = [2,2,1,2];
1233}
Craig Topper2d451e72018-03-18 08:38:06 +00001234def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001235
1236def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1237 let Latency = 8;
1238 let NumMicroOps = 2;
1239 let ResourceCycles = [1,1];
1240}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001241def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001242 "PDEP(32|64)rm",
1243 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001244 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001245
1246def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001247 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001248 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001249 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001250}
Craig Topperf846e2d2018-04-19 05:34:05 +00001251def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001252
Craig Topperf846e2d2018-04-19 05:34:05 +00001253def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1254 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001255 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001256 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001257}
Craig Topper5a69a002018-03-21 06:28:42 +00001258def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001259
Gadi Haber323f2e12017-10-24 20:19:47 +00001260def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1261 let Latency = 8;
1262 let NumMicroOps = 2;
1263 let ResourceCycles = [1,1];
1264}
Craig Topper5a69a002018-03-21 06:28:42 +00001265def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1266 "VPMOVSXBQYrm",
1267 "VPMOVSXBWYrm",
1268 "VPMOVSXDQYrm",
1269 "VPMOVSXWDYrm",
1270 "VPMOVSXWQYrm",
1271 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001272
Gadi Haber323f2e12017-10-24 20:19:47 +00001273def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1274 let Latency = 8;
1275 let NumMicroOps = 3;
1276 let ResourceCycles = [2,1];
1277}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001278def: InstRW<[BWWriteResGroup94], (instregex "VMASKMOVPDYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001279 "VMASKMOVPSYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001280 "VPMASKMOVDYrm",
1281 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001282
1283def BWWriteResGroup95 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1284 let Latency = 8;
1285 let NumMicroOps = 4;
1286 let ResourceCycles = [2,1,1];
1287}
Craig Topper5a69a002018-03-21 06:28:42 +00001288def: InstRW<[BWWriteResGroup95], (instregex "VPSLLVDrm",
1289 "VPSRAVDrm",
1290 "VPSRLVDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001291
Gadi Haber323f2e12017-10-24 20:19:47 +00001292def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1293 let Latency = 8;
1294 let NumMicroOps = 5;
1295 let ResourceCycles = [1,1,1,2];
1296}
Craig Topper5a69a002018-03-21 06:28:42 +00001297def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1298 "RCL(8|16|32|64)mi",
1299 "RCR(8|16|32|64)m1",
1300 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001301
1302def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1303 let Latency = 8;
1304 let NumMicroOps = 5;
1305 let ResourceCycles = [1,1,2,1];
1306}
Craig Topper13a16502018-03-19 00:56:09 +00001307def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001308
1309def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1310 let Latency = 8;
1311 let NumMicroOps = 6;
1312 let ResourceCycles = [1,1,1,3];
1313}
Craig Topper9f834812018-04-01 21:54:24 +00001314def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001315
1316def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1317 let Latency = 8;
1318 let NumMicroOps = 6;
1319 let ResourceCycles = [1,1,1,2,1];
1320}
Craig Topper9f834812018-04-01 21:54:24 +00001321def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001322 "CMPXCHG(8|16|32|64)rm",
1323 "ROL(8|16|32|64)mCL",
1324 "SAR(8|16|32|64)mCL",
1325 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001326 "SHL(8|16|32|64)mCL",
1327 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001328def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1329 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001330
1331def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1332 let Latency = 9;
1333 let NumMicroOps = 2;
1334 let ResourceCycles = [1,1];
1335}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001336def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1337 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001338 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001339 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001340
1341def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1342 let Latency = 9;
1343 let NumMicroOps = 2;
1344 let ResourceCycles = [1,1];
1345}
Craig Topper5a69a002018-03-21 06:28:42 +00001346def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1347 "VPERM2I128rm",
1348 "VPERMDYrm",
1349 "VPERMPDYmi",
1350 "VPERMPSYrm",
1351 "VPERMQYmi",
1352 "VPMOVZXBDYrm",
1353 "VPMOVZXBQYrm",
1354 "VPMOVZXBWYrm",
1355 "VPMOVZXDQYrm",
1356 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001357
Gadi Haber323f2e12017-10-24 20:19:47 +00001358def BWWriteResGroup104 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1359 let Latency = 9;
1360 let NumMicroOps = 3;
1361 let ResourceCycles = [1,1,1];
1362}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001363def: InstRW<[BWWriteResGroup104], (instregex "(V?)DPPDrri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001364
1365def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1366 let Latency = 9;
1367 let NumMicroOps = 3;
1368 let ResourceCycles = [1,1,1];
1369}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001370def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1371 "(V?)CVTSD2SIrm",
1372 "(V?)CVTSS2SI64rm",
1373 "(V?)CVTSS2SIrm",
1374 "(V?)CVTTSD2SI64rm",
1375 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001376 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001377 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001378
1379def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1380 let Latency = 9;
1381 let NumMicroOps = 3;
1382 let ResourceCycles = [1,1,1];
1383}
1384def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1385
1386def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1387 let Latency = 9;
1388 let NumMicroOps = 3;
1389 let ResourceCycles = [1,1,1];
1390}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001391def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001392def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001393 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001394 "CVTTPD2DQrm",
1395 "MMX_CVTPD2PIirm",
1396 "MMX_CVTPI2PDirm",
1397 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001398 "(V?)CVTDQ2PDrm",
1399 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001400
1401def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1402 let Latency = 9;
1403 let NumMicroOps = 3;
1404 let ResourceCycles = [1,1,1];
1405}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001406def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1407 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001408
1409def BWWriteResGroup109 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1410 let Latency = 9;
1411 let NumMicroOps = 4;
1412 let ResourceCycles = [2,1,1];
1413}
Craig Topper5a69a002018-03-21 06:28:42 +00001414def: InstRW<[BWWriteResGroup109], (instregex "VPSLLVDYrm",
1415 "VPSRAVDYrm",
1416 "VPSRLVDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001417
1418def BWWriteResGroup110 : SchedWriteRes<[BWPort5,BWPort23,BWPort15]> {
1419 let Latency = 9;
1420 let NumMicroOps = 4;
1421 let ResourceCycles = [2,1,1];
1422}
Craig Topper5a69a002018-03-21 06:28:42 +00001423def: InstRW<[BWWriteResGroup110], (instregex "VPHADDDYrm",
1424 "VPHADDSWYrm",
1425 "VPHADDWYrm",
1426 "VPHSUBDYrm",
1427 "VPHSUBSWYrm",
1428 "VPHSUBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001429
1430def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1431 let Latency = 9;
1432 let NumMicroOps = 4;
1433 let ResourceCycles = [1,1,1,1];
1434}
Craig Topper5a69a002018-03-21 06:28:42 +00001435def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1436 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001437
1438def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1439 let Latency = 9;
1440 let NumMicroOps = 5;
1441 let ResourceCycles = [1,1,3];
1442}
1443def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1444
1445def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1446 let Latency = 9;
1447 let NumMicroOps = 5;
1448 let ResourceCycles = [1,2,1,1];
1449}
Craig Topper5a69a002018-03-21 06:28:42 +00001450def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1451 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001452
Gadi Haber323f2e12017-10-24 20:19:47 +00001453def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1454 let Latency = 10;
1455 let NumMicroOps = 2;
1456 let ResourceCycles = [1,1];
1457}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001458def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001459
Gadi Haber323f2e12017-10-24 20:19:47 +00001460def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1461 let Latency = 10;
1462 let NumMicroOps = 3;
1463 let ResourceCycles = [2,1];
1464}
Craig Topper5a69a002018-03-21 06:28:42 +00001465def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1466 "FICOM32m",
1467 "FICOMP16m",
1468 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001469
1470def BWWriteResGroup118 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1471 let Latency = 10;
1472 let NumMicroOps = 3;
1473 let ResourceCycles = [1,1,1];
1474}
1475def: InstRW<[BWWriteResGroup118], (instregex "VPTESTYrm")>;
1476
Gadi Haber323f2e12017-10-24 20:19:47 +00001477def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1478 let Latency = 10;
1479 let NumMicroOps = 4;
1480 let ResourceCycles = [1,1,1,1];
1481}
1482def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1483
1484def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001485 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001486 let NumMicroOps = 4;
1487 let ResourceCycles = [1,1,1,1];
1488}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001489def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001490
Craig Topper8104f262018-04-02 05:33:28 +00001491def BWWriteResGroup122 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001492 let Latency = 11;
1493 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001494 let ResourceCycles = [1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001495}
Craig Topper8104f262018-04-02 05:33:28 +00001496def: InstRW<[BWWriteResGroup122], (instregex "(V?)DIVPSrr")>;
1497
1498def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1499 let Latency = 11;
1500 let NumMicroOps = 1;
1501 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1502}
1503def: InstRW<[BWWriteResGroup122_1], (instregex "(V?)DIVSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001504
1505def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1506 let Latency = 11;
1507 let NumMicroOps = 2;
1508 let ResourceCycles = [1,1];
1509}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001510def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001511 "VPCMPGTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001512
Gadi Haber323f2e12017-10-24 20:19:47 +00001513def BWWriteResGroup126 : SchedWriteRes<[BWPort0,BWPort015]> {
1514 let Latency = 11;
1515 let NumMicroOps = 3;
1516 let ResourceCycles = [2,1];
1517}
Craig Topper5a69a002018-03-21 06:28:42 +00001518def: InstRW<[BWWriteResGroup126], (instregex "VRCPPSYr",
1519 "VRSQRTPSYr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001520
1521def BWWriteResGroup127 : SchedWriteRes<[BWPort1,BWPort23]> {
1522 let Latency = 11;
1523 let NumMicroOps = 3;
1524 let ResourceCycles = [2,1];
1525}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001526def: InstRW<[BWWriteResGroup127], (instregex "(V?)ROUNDPDm",
1527 "(V?)ROUNDPSm",
1528 "(V?)ROUNDSDm",
1529 "(V?)ROUNDSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001530
1531def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1532 let Latency = 11;
1533 let NumMicroOps = 3;
1534 let ResourceCycles = [1,1,1];
1535}
1536def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1537
Gadi Haber323f2e12017-10-24 20:19:47 +00001538def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1539 let Latency = 11;
1540 let NumMicroOps = 6;
1541 let ResourceCycles = [1,1,1,1,2];
1542}
Craig Topper5a69a002018-03-21 06:28:42 +00001543def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1544 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001545
1546def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1547 let Latency = 11;
1548 let NumMicroOps = 7;
1549 let ResourceCycles = [2,2,3];
1550}
Craig Topper5a69a002018-03-21 06:28:42 +00001551def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1552 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001553
1554def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1555 let Latency = 11;
1556 let NumMicroOps = 9;
1557 let ResourceCycles = [1,4,1,3];
1558}
1559def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1560
1561def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1562 let Latency = 11;
1563 let NumMicroOps = 11;
1564 let ResourceCycles = [2,9];
1565}
Craig Topper2d451e72018-03-18 08:38:06 +00001566def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1567def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001568
Gadi Haber323f2e12017-10-24 20:19:47 +00001569def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1570 let Latency = 12;
1571 let NumMicroOps = 3;
1572 let ResourceCycles = [2,1];
1573}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001574def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m",
Craig Topper40d3b322018-03-22 21:55:20 +00001575 "VROUNDPDYm",
1576 "VROUNDPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001577
Craig Topper8104f262018-04-02 05:33:28 +00001578def BWWriteResGroup137 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001579 let Latency = 11;
Gadi Haber323f2e12017-10-24 20:19:47 +00001580 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001581 let ResourceCycles = [1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001582}
Craig Topper8104f262018-04-02 05:33:28 +00001583def: InstRW<[BWWriteResGroup137], (instregex "(V?)SQRTPSr")>;
1584
1585def BWWriteResGroup137_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1586 let Latency = 11;
1587 let NumMicroOps = 1;
1588 let ResourceCycles = [1,4];
1589}
1590def: InstRW<[BWWriteResGroup137_1], (instregex "(V?)SQRTSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001591
Craig Topper8104f262018-04-02 05:33:28 +00001592def BWWriteResGroup139 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001593 let Latency = 14;
1594 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001595 let ResourceCycles = [1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001596}
Craig Topper8104f262018-04-02 05:33:28 +00001597def: InstRW<[BWWriteResGroup139], (instregex "(V?)DIVPDrr")>;
1598
1599def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1600 let Latency = 14;
1601 let NumMicroOps = 1;
1602 let ResourceCycles = [1,4];
1603}
1604def: InstRW<[BWWriteResGroup139_1], (instregex "(V?)DIVSDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001605
Gadi Haber323f2e12017-10-24 20:19:47 +00001606def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1607 let Latency = 14;
1608 let NumMicroOps = 3;
1609 let ResourceCycles = [1,1,1];
1610}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001611def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001612
1613def BWWriteResGroup142 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1614 let Latency = 14;
1615 let NumMicroOps = 4;
1616 let ResourceCycles = [2,1,1];
1617}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001618def: InstRW<[BWWriteResGroup142], (instregex "(V?)DPPS(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001619
1620def BWWriteResGroup143 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1621 let Latency = 14;
1622 let NumMicroOps = 4;
1623 let ResourceCycles = [1,1,1,1];
1624}
Craig Topper5a69a002018-03-21 06:28:42 +00001625def: InstRW<[BWWriteResGroup143], (instregex "(V?)DPPDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001626
1627def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1628 let Latency = 14;
1629 let NumMicroOps = 8;
1630 let ResourceCycles = [2,2,1,3];
1631}
1632def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1633
1634def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1635 let Latency = 14;
1636 let NumMicroOps = 10;
1637 let ResourceCycles = [2,3,1,4];
1638}
1639def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1640
1641def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1642 let Latency = 14;
1643 let NumMicroOps = 12;
1644 let ResourceCycles = [2,1,4,5];
1645}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001646def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001647
1648def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1649 let Latency = 15;
1650 let NumMicroOps = 1;
1651 let ResourceCycles = [1];
1652}
Craig Topper5a69a002018-03-21 06:28:42 +00001653def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1654 "DIVR_FST0r",
1655 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001656
Gadi Haber323f2e12017-10-24 20:19:47 +00001657def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1658 let Latency = 15;
1659 let NumMicroOps = 10;
1660 let ResourceCycles = [1,1,1,4,1,2];
1661}
Craig Topper13a16502018-03-19 00:56:09 +00001662def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001663
Craig Topper8104f262018-04-02 05:33:28 +00001664def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001665 let Latency = 16;
1666 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001667 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001668}
Craig Topper5a69a002018-03-21 06:28:42 +00001669def: InstRW<[BWWriteResGroup150], (instregex "(V?)DIVPSrm",
1670 "(V?)DIVSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001671
Gadi Haber323f2e12017-10-24 20:19:47 +00001672def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1673 let Latency = 16;
1674 let NumMicroOps = 14;
1675 let ResourceCycles = [1,1,1,4,2,5];
1676}
1677def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1678
1679def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1680 let Latency = 16;
1681 let NumMicroOps = 16;
1682 let ResourceCycles = [16];
1683}
Craig Topper5a69a002018-03-21 06:28:42 +00001684def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001685
Craig Topper8104f262018-04-02 05:33:28 +00001686def BWWriteResGroup155 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001687 let Latency = 17;
1688 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001689 let ResourceCycles = [2,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001690}
1691def: InstRW<[BWWriteResGroup155], (instregex "VDIVPSYrr")>;
1692
1693def BWWriteResGroup156 : SchedWriteRes<[BWPort0,BWPort23,BWPort015]> {
1694 let Latency = 17;
1695 let NumMicroOps = 4;
1696 let ResourceCycles = [2,1,1];
1697}
Craig Topper5a69a002018-03-21 06:28:42 +00001698def: InstRW<[BWWriteResGroup156], (instregex "VRCPPSYm",
1699 "VRSQRTPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001700
Craig Topper8104f262018-04-02 05:33:28 +00001701def BWWriteResGroup157 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001702 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001703 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001704 let ResourceCycles = [1,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001705}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001706def: InstRW<[BWWriteResGroup157], (instregex "(V?)SQRTPSm",
1707 "(V?)SQRTSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001708
Gadi Haber323f2e12017-10-24 20:19:47 +00001709def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1710 let Latency = 18;
1711 let NumMicroOps = 8;
1712 let ResourceCycles = [1,1,1,5];
1713}
Craig Topper5a69a002018-03-21 06:28:42 +00001714def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001715def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001716
1717def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1718 let Latency = 18;
1719 let NumMicroOps = 11;
1720 let ResourceCycles = [2,1,1,3,1,3];
1721}
Craig Topper13a16502018-03-19 00:56:09 +00001722def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001723
Craig Topper8104f262018-04-02 05:33:28 +00001724def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001725 let Latency = 19;
1726 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001727 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001728}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001729def: InstRW<[BWWriteResGroup161], (instregex "(V?)DIVPDrm",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001730 "(V?)DIVSDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001731
Gadi Haber323f2e12017-10-24 20:19:47 +00001732def BWWriteResGroup163 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1733 let Latency = 19;
1734 let NumMicroOps = 5;
1735 let ResourceCycles = [2,1,1,1];
1736}
Craig Topper5a69a002018-03-21 06:28:42 +00001737def: InstRW<[BWWriteResGroup163], (instregex "(V?)DPPSrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001738
Gadi Haber323f2e12017-10-24 20:19:47 +00001739def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1740 let Latency = 20;
1741 let NumMicroOps = 1;
1742 let ResourceCycles = [1];
1743}
Craig Topper5a69a002018-03-21 06:28:42 +00001744def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1745 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001746 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001747
1748def BWWriteResGroup166 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1749 let Latency = 20;
1750 let NumMicroOps = 5;
1751 let ResourceCycles = [2,1,1,1];
1752}
1753def: InstRW<[BWWriteResGroup166], (instregex "VDPPSYrmi")>;
1754
1755def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1756 let Latency = 20;
1757 let NumMicroOps = 8;
1758 let ResourceCycles = [1,1,1,1,1,1,2];
1759}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001760def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001761
Craig Topper8104f262018-04-02 05:33:28 +00001762def BWWriteResGroup168 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001763 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001764 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001765 let ResourceCycles = [1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001766}
Craig Topper8104f262018-04-02 05:33:28 +00001767def: InstRW<[BWWriteResGroup168], (instregex "(V?)SQRTPDr")>;
1768
1769def BWWriteResGroup168_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1770 let Latency = 16;
1771 let NumMicroOps = 1;
1772 let ResourceCycles = [1,8];
1773}
1774def: InstRW<[BWWriteResGroup168_1], (instregex "(V?)SQRTSDr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001775
1776def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1777 let Latency = 21;
1778 let NumMicroOps = 2;
1779 let ResourceCycles = [1,1];
1780}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001781def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001782
Craig Topper8104f262018-04-02 05:33:28 +00001783def BWWriteResGroup170 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001784 let Latency = 21;
1785 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001786 let ResourceCycles = [2,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001787}
1788def: InstRW<[BWWriteResGroup170], (instregex "VSQRTPSYr")>;
1789
1790def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1791 let Latency = 21;
1792 let NumMicroOps = 19;
1793 let ResourceCycles = [2,1,4,1,1,4,6];
1794}
1795def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1796
1797def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1798 let Latency = 22;
1799 let NumMicroOps = 18;
1800 let ResourceCycles = [1,1,16];
1801}
1802def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1803
Craig Topper8104f262018-04-02 05:33:28 +00001804def BWWriteResGroup173 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001805 let Latency = 23;
1806 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001807 let ResourceCycles = [2,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001808}
1809def: InstRW<[BWWriteResGroup173], (instregex "VDIVPDYrr")>;
1810
Craig Topper8104f262018-04-02 05:33:28 +00001811def BWWriteResGroup174 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001812 let Latency = 23;
1813 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001814 let ResourceCycles = [2,1,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001815}
1816def: InstRW<[BWWriteResGroup174], (instregex "VDIVPSYrm")>;
1817
Gadi Haber323f2e12017-10-24 20:19:47 +00001818def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1819 let Latency = 23;
1820 let NumMicroOps = 19;
1821 let ResourceCycles = [3,1,15];
1822}
Craig Topper391c6f92017-12-10 01:24:08 +00001823def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001824
1825def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1826 let Latency = 24;
1827 let NumMicroOps = 3;
1828 let ResourceCycles = [1,1,1];
1829}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001830def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001831
Craig Topper8104f262018-04-02 05:33:28 +00001832def BWWriteResGroup179 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001833 let Latency = 21;
Gadi Haber323f2e12017-10-24 20:19:47 +00001834 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001835 let ResourceCycles = [1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001836}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001837def: InstRW<[BWWriteResGroup179], (instregex "(V?)SQRTPDm",
1838 "(V?)SQRTSDm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001839
1840def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1841 let Latency = 26;
1842 let NumMicroOps = 2;
1843 let ResourceCycles = [1,1];
1844}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001845def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001846
Craig Topper8104f262018-04-02 05:33:28 +00001847def BWWriteResGroup181 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001848 let Latency = 27;
1849 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001850 let ResourceCycles = [2,1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001851}
1852def: InstRW<[BWWriteResGroup181], (instregex "VSQRTPSYm")>;
1853
1854def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1855 let Latency = 29;
1856 let NumMicroOps = 3;
1857 let ResourceCycles = [1,1,1];
1858}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001859def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001860
Craig Topper8104f262018-04-02 05:33:28 +00001861def BWWriteResGroup183 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001862 let Latency = 29;
1863 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001864 let ResourceCycles = [2,1,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001865}
1866def: InstRW<[BWWriteResGroup183], (instregex "VDIVPDYrm")>;
1867
1868def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1869 let Latency = 22;
1870 let NumMicroOps = 7;
1871 let ResourceCycles = [1,3,2,1];
1872}
Craig Topper17a31182017-12-16 18:35:29 +00001873def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001874
1875def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1876 let Latency = 23;
1877 let NumMicroOps = 9;
1878 let ResourceCycles = [1,3,4,1];
1879}
Craig Topper17a31182017-12-16 18:35:29 +00001880def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001881
1882def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1883 let Latency = 24;
1884 let NumMicroOps = 9;
1885 let ResourceCycles = [1,5,2,1];
1886}
Craig Topper17a31182017-12-16 18:35:29 +00001887def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001888
1889def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1890 let Latency = 25;
1891 let NumMicroOps = 7;
1892 let ResourceCycles = [1,3,2,1];
1893}
Craig Topper17a31182017-12-16 18:35:29 +00001894def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1895 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001896
1897def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1898 let Latency = 26;
1899 let NumMicroOps = 9;
1900 let ResourceCycles = [1,5,2,1];
1901}
Craig Topper17a31182017-12-16 18:35:29 +00001902def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001903
1904def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1905 let Latency = 26;
1906 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001907 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001908}
Craig Topper17a31182017-12-16 18:35:29 +00001909def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001910
1911def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1912 let Latency = 27;
1913 let NumMicroOps = 9;
1914 let ResourceCycles = [1,5,2,1];
1915}
Craig Topper17a31182017-12-16 18:35:29 +00001916def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001917
Gadi Haber323f2e12017-10-24 20:19:47 +00001918def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1919 let Latency = 29;
1920 let NumMicroOps = 27;
1921 let ResourceCycles = [1,5,1,1,19];
1922}
1923def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1924
1925def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1926 let Latency = 30;
1927 let NumMicroOps = 28;
1928 let ResourceCycles = [1,6,1,1,19];
1929}
Craig Topper2d451e72018-03-18 08:38:06 +00001930def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001931
1932def BWWriteResGroup187 : SchedWriteRes<[BWPort01,BWPort15,BWPort015,BWPort0156]> {
1933 let Latency = 31;
1934 let NumMicroOps = 31;
1935 let ResourceCycles = [8,1,21,1];
1936}
1937def: InstRW<[BWWriteResGroup187], (instregex "MMX_EMMS")>;
1938
Craig Topper8104f262018-04-02 05:33:28 +00001939def BWWriteResGroup189 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
1940 let Latency = 29;
Gadi Haber323f2e12017-10-24 20:19:47 +00001941 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001942 let ResourceCycles = [2,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00001943}
1944def: InstRW<[BWWriteResGroup189], (instregex "VSQRTPDYr")>;
1945
1946def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1947 let Latency = 34;
1948 let NumMicroOps = 8;
1949 let ResourceCycles = [2,2,2,1,1];
1950}
Craig Topper13a16502018-03-19 00:56:09 +00001951def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001952
1953def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
1954 let Latency = 34;
1955 let NumMicroOps = 23;
1956 let ResourceCycles = [1,5,3,4,10];
1957}
Craig Topper5a69a002018-03-21 06:28:42 +00001958def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
1959 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001960
1961def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1962 let Latency = 35;
1963 let NumMicroOps = 8;
1964 let ResourceCycles = [2,2,2,1,1];
1965}
Craig Topper13a16502018-03-19 00:56:09 +00001966def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001967
1968def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1969 let Latency = 35;
1970 let NumMicroOps = 23;
1971 let ResourceCycles = [1,5,2,1,4,10];
1972}
Craig Topper5a69a002018-03-21 06:28:42 +00001973def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
1974 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001975
Craig Topper8104f262018-04-02 05:33:28 +00001976def BWWriteResGroup195 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
1977 let Latency = 35;
Gadi Haber323f2e12017-10-24 20:19:47 +00001978 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001979 let ResourceCycles = [2,1,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00001980}
1981def: InstRW<[BWWriteResGroup195], (instregex "VSQRTPDYm")>;
1982
1983def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
1984 let Latency = 42;
1985 let NumMicroOps = 22;
1986 let ResourceCycles = [2,20];
1987}
Craig Topper2d451e72018-03-18 08:38:06 +00001988def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001989
1990def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
1991 let Latency = 60;
1992 let NumMicroOps = 64;
1993 let ResourceCycles = [2,2,8,1,10,2,39];
1994}
1995def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001996
1997def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1998 let Latency = 63;
1999 let NumMicroOps = 88;
2000 let ResourceCycles = [4,4,31,1,2,1,45];
2001}
Craig Topper2d451e72018-03-18 08:38:06 +00002002def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002003
2004def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
2005 let Latency = 63;
2006 let NumMicroOps = 90;
2007 let ResourceCycles = [4,2,33,1,2,1,47];
2008}
Craig Topper2d451e72018-03-18 08:38:06 +00002009def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002010
2011def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
2012 let Latency = 75;
2013 let NumMicroOps = 15;
2014 let ResourceCycles = [6,3,6];
2015}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00002016def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002017
2018def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
2019 let Latency = 80;
2020 let NumMicroOps = 32;
2021 let ResourceCycles = [7,7,3,3,1,11];
2022}
2023def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
2024
2025def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
2026 let Latency = 115;
2027 let NumMicroOps = 100;
2028 let ResourceCycles = [9,9,11,8,1,11,21,30];
2029}
2030def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002031
2032} // SchedModel
2033