blob: 01a92dc8ffeb65ca60dc7e8a7110aad08c5865a4 [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 Pilgrimf7dd6062018-05-03 13:27:10 +0000202defm : BWWriteResPair<WriteVecALU, [BWPort15], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
203defm : BWWriteResPair<WriteVecALUY, [BWPort15], 1, [1], 1, 6>; // Vector integer ALU op, no logicals (YMM/ZMM).
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000204defm : BWWriteResPair<WriteVecLogic, [BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
205defm : BWWriteResPair<WriteVecLogicY,[BWPort015], 1, [1], 1, 6>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000206defm : BWWriteResPair<WriteVecShift, [BWPort0], 1>; // Vector integer shifts.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000207defm : BWWriteResPair<WriteVecIMul, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
208defm : BWWriteResPair<WriteVecIMulY, [BWPort0], 5, [1], 1, 6>; // Vector integer multiply.
209defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // Vector PMULLD.
210defm : BWWriteResPair<WritePMULLDY, [BWPort0], 10, [2], 2, 6>; // Vector PMULLD (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000211defm : BWWriteResPair<WriteShuffle, [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000212defm : BWWriteResPair<WriteShuffleY, [BWPort5], 1, [1], 1, 6>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000213defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000214defm : BWWriteResPair<WriteVarShuffleY,[BWPort5], 1, [1], 1, 6>; // Vector variable shuffles (YMM/ZMM).
215defm : BWWriteResPair<WriteBlend, [BWPort5], 1, [1], 1, 5>; // Vector blends.
216defm : BWWriteResPair<WriteBlendY, [BWPort5], 1, [1], 1, 6>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000217defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000218defm : BWWriteResPair<WriteVarBlendY, [BWPort5], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000219defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000220defm : BWWriteResPair<WriteMPSADY, [BWPort0, BWPort5], 7, [1, 2], 3, 6>; // Vector MPSAD.
221defm : BWWriteResPair<WritePSADBW, [BWPort0], 5, [1], 1, 5>; // Vector PSADBW.
222defm : BWWriteResPair<WritePSADBWY, [BWPort0], 5, [1], 1, 6>; // Vector PSADBW (YMM/ZMM).
223defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000224
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000225// Vector insert/extract operations.
226def : WriteRes<WriteVecInsert, [BWPort5]> {
227 let Latency = 2;
228 let NumMicroOps = 2;
229 let ResourceCycles = [2];
230}
231def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
232 let Latency = 6;
233 let NumMicroOps = 2;
234}
235
236def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
237 let Latency = 2;
238 let NumMicroOps = 2;
239}
240def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
241 let Latency = 2;
242 let NumMicroOps = 3;
243}
244
Gadi Haber323f2e12017-10-24 20:19:47 +0000245// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000246defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
247defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
248defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000249
250// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000251
Gadi Haber323f2e12017-10-24 20:19:47 +0000252// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000253def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000254 let Latency = 11;
255 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000256 let ResourceCycles = [3];
257}
258def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000259 let Latency = 16;
260 let NumMicroOps = 4;
261 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000262}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000263
264// Packed Compare Explicit Length Strings, Return Mask
265def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
266 let Latency = 19;
267 let NumMicroOps = 9;
268 let ResourceCycles = [4,3,1,1];
269}
270def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
271 let Latency = 24;
272 let NumMicroOps = 10;
273 let ResourceCycles = [4,3,1,1,1];
274}
275
276// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000277def : WriteRes<WritePCmpIStrI, [BWPort0]> {
278 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000279 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000280 let ResourceCycles = [3];
281}
282def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000283 let Latency = 16;
284 let NumMicroOps = 4;
285 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000286}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000287
288// Packed Compare Explicit Length Strings, Return Index
289def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
290 let Latency = 18;
291 let NumMicroOps = 8;
292 let ResourceCycles = [4,3,1];
293}
294def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
295 let Latency = 23;
296 let NumMicroOps = 9;
297 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000298}
299
Simon Pilgrima2f26782018-03-27 20:38:54 +0000300// MOVMSK Instructions.
301def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
302def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
303def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
304
Gadi Haber323f2e12017-10-24 20:19:47 +0000305// AES instructions.
306def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
307 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000308 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000309 let ResourceCycles = [1];
310}
311def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000312 let Latency = 12;
313 let NumMicroOps = 2;
314 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000315}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000316
Gadi Haber323f2e12017-10-24 20:19:47 +0000317def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
318 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000319 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000320 let ResourceCycles = [2];
321}
322def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000323 let Latency = 19;
324 let NumMicroOps = 3;
325 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000326}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000327
328def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
329 let Latency = 29;
330 let NumMicroOps = 11;
331 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000332}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000333def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
334 let Latency = 33;
335 let NumMicroOps = 11;
336 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000337}
338
339// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000340defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000341
342// Catch-all for expensive system instructions.
343def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
344
345// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000346defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
347defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
348defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
349defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
350defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 2, [2, 1]>; // Variable vector shifts.
Gadi Haber323f2e12017-10-24 20:19:47 +0000351
352// Old microcoded instructions that nobody use.
353def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
354
355// Fence instructions.
356def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
357
Craig Topper05242bf2018-04-21 18:07:36 +0000358// Load/store MXCSR.
359def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
360def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
361
Gadi Haber323f2e12017-10-24 20:19:47 +0000362// Nop, not very useful expect it provides a model for nops!
363def : WriteRes<WriteNop, []>;
364
365////////////////////////////////////////////////////////////////////////////////
366// Horizontal add/sub instructions.
367////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000368
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000369defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3, 5>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000370defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000371defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3, 5>;
372defm : BWWriteResPair<WritePHAddY, [BWPort5,BWPort15], 3, [2,1], 3, 6>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000373
374// Remaining instrs.
375
376def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
377 let Latency = 1;
378 let NumMicroOps = 1;
379 let ResourceCycles = [1];
380}
Craig Topper5a69a002018-03-21 06:28:42 +0000381def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
382 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000383 "(V?)MOVPDI2DIrr",
384 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000385 "VPSLLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000386 "VPSRLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000387 "VTESTPD(Y?)rr",
388 "VTESTPS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000389
390def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
391 let Latency = 1;
392 let NumMicroOps = 1;
393 let ResourceCycles = [1];
394}
Craig Topper5a69a002018-03-21 06:28:42 +0000395def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
396 "COM_FST0r",
397 "UCOM_FPr",
398 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000399
400def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
401 let Latency = 1;
402 let NumMicroOps = 1;
403 let ResourceCycles = [1];
404}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000405def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000406 "MMX_MOVD64to64rr",
407 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000408 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000409 "(V?)MOVDI2PDIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000410
411def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
412 let Latency = 1;
413 let NumMicroOps = 1;
414 let ResourceCycles = [1];
415}
416def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
417
418def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
419 let Latency = 1;
420 let NumMicroOps = 1;
421 let ResourceCycles = [1];
422}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000423def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000424
425def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
426 let Latency = 1;
427 let NumMicroOps = 1;
428 let ResourceCycles = [1];
429}
Craig Topperfbe31322018-04-05 21:56:19 +0000430def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000431def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
432 "ADC(16|32|64)i",
433 "ADC(8|16|32|64)rr",
434 "ADCX(32|64)rr",
435 "ADOX(32|64)rr",
436 "BT(16|32|64)ri8",
437 "BT(16|32|64)rr",
438 "BTC(16|32|64)ri8",
439 "BTC(16|32|64)rr",
440 "BTR(16|32|64)ri8",
441 "BTR(16|32|64)rr",
442 "BTS(16|32|64)ri8",
443 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000444 "SBB(16|32|64)ri",
445 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000446 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000447
448def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
449 let Latency = 1;
450 let NumMicroOps = 1;
451 let ResourceCycles = [1];
452}
Craig Topper5a69a002018-03-21 06:28:42 +0000453def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
454 "BLSI(32|64)rr",
455 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000456 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000457
458def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
459 let Latency = 1;
460 let NumMicroOps = 1;
461 let ResourceCycles = [1];
462}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000463def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000464 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000465
466def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
467 let Latency = 1;
468 let NumMicroOps = 1;
469 let ResourceCycles = [1];
470}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000471def: InstRW<[BWWriteResGroup9], (instrs LAHF, SAHF)>; // TODO: This doesnt match Agner's data
472def: InstRW<[BWWriteResGroup9], (instregex "NOOP",
Craig Topper5a69a002018-03-21 06:28:42 +0000473 "SGDT64m",
474 "SIDT64m",
Craig Topper5a69a002018-03-21 06:28:42 +0000475 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000476 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000477 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000478
479def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
480 let Latency = 1;
481 let NumMicroOps = 2;
482 let ResourceCycles = [1,1];
483}
Craig Topper5a69a002018-03-21 06:28:42 +0000484def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
485 "MMX_MOVD64from64rm",
486 "MMX_MOVD64mr",
487 "MMX_MOVNTQmr",
488 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000489 "MOVNTI_64mr",
490 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000491 "ST_FP(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000492 "VEXTRACTF128mr",
493 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000494 "(V?)MOVAPD(Y?)mr",
495 "(V?)MOVAPS(Y?)mr",
496 "(V?)MOVDQA(Y?)mr",
497 "(V?)MOVDQU(Y?)mr",
498 "(V?)MOVHPDmr",
499 "(V?)MOVHPSmr",
500 "(V?)MOVLPDmr",
501 "(V?)MOVLPSmr",
502 "(V?)MOVNTDQ(V?)mr",
503 "(V?)MOVNTPD(V?)mr",
504 "(V?)MOVNTPS(V?)mr",
505 "(V?)MOVPDI2DImr",
506 "(V?)MOVPQI2QImr",
507 "(V?)MOVPQIto64mr",
508 "(V?)MOVSDmr",
509 "(V?)MOVSSmr",
510 "(V?)MOVUPD(Y?)mr",
511 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000512
Gadi Haber323f2e12017-10-24 20:19:47 +0000513def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
514 let Latency = 2;
515 let NumMicroOps = 2;
516 let ResourceCycles = [2];
517}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000518def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000519
520def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
521 let Latency = 2;
522 let NumMicroOps = 2;
523 let ResourceCycles = [2];
524}
Craig Topper5a69a002018-03-21 06:28:42 +0000525def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
526 "ROL(8|16|32|64)ri",
527 "ROR(8|16|32|64)r1",
528 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000529
530def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
531 let Latency = 2;
532 let NumMicroOps = 2;
533 let ResourceCycles = [2];
534}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000535def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
536 MFENCE,
537 WAIT,
538 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000539
540def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
541 let Latency = 2;
542 let NumMicroOps = 2;
543 let ResourceCycles = [1,1];
544}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000545def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000546 "(V?)CVTPS2PDrr",
547 "(V?)CVTSS2SDrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000548 "(V?)PSLLDrr",
549 "(V?)PSLLQrr",
550 "(V?)PSLLWrr",
551 "(V?)PSRADrr",
552 "(V?)PSRAWrr",
553 "(V?)PSRLDrr",
554 "(V?)PSRLQrr",
555 "(V?)PSRLWrr",
556 "(V?)PTESTrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000557
558def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
559 let Latency = 2;
560 let NumMicroOps = 2;
561 let ResourceCycles = [1,1];
562}
563def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
564
565def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
566 let Latency = 2;
567 let NumMicroOps = 2;
568 let ResourceCycles = [1,1];
569}
570def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
571
572def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
573 let Latency = 2;
574 let NumMicroOps = 2;
575 let ResourceCycles = [1,1];
576}
577def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
578
579def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
580 let Latency = 2;
581 let NumMicroOps = 2;
582 let ResourceCycles = [1,1];
583}
Craig Topper498875f2018-04-04 17:54:19 +0000584def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
585
586def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
587 let Latency = 1;
588 let NumMicroOps = 1;
589 let ResourceCycles = [1];
590}
591def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000592
593def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
594 let Latency = 2;
595 let NumMicroOps = 2;
596 let ResourceCycles = [1,1];
597}
Craig Topper2d451e72018-03-18 08:38:06 +0000598def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000599def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000600def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
601 "ADC8ri",
602 "CMOV(A|BE)(16|32|64)rr",
603 "SBB8i8",
604 "SBB8ri",
605 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000606
Gadi Haber323f2e12017-10-24 20:19:47 +0000607def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
608 let Latency = 2;
609 let NumMicroOps = 3;
610 let ResourceCycles = [1,1,1];
611}
612def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
613
Gadi Haber323f2e12017-10-24 20:19:47 +0000614def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
615 let Latency = 2;
616 let NumMicroOps = 3;
617 let ResourceCycles = [1,1,1];
618}
619def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
620
621def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
622 let Latency = 2;
623 let NumMicroOps = 3;
624 let ResourceCycles = [1,1,1];
625}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000626def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
627 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000628def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000629 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000630
Gadi Haber323f2e12017-10-24 20:19:47 +0000631def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
632 let Latency = 3;
633 let NumMicroOps = 1;
634 let ResourceCycles = [1];
635}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000636def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000637 "PDEP(32|64)rr",
638 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000639 "SHLD(16|32|64)rri8",
640 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000641 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000642
643def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000644 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000645 let NumMicroOps = 2;
646 let ResourceCycles = [1,1];
647}
Clement Courbet327fac42018-03-07 08:14:02 +0000648def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000649
650def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
651 let Latency = 3;
652 let NumMicroOps = 1;
653 let ResourceCycles = [1];
654}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000655def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
656 "VPBROADCASTWrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000657 "VPMOVSXBDYrr",
658 "VPMOVSXBQYrr",
659 "VPMOVSXBWYrr",
660 "VPMOVSXDQYrr",
661 "VPMOVSXWDYrr",
662 "VPMOVSXWQYrr",
663 "VPMOVZXBDYrr",
664 "VPMOVZXBQYrr",
665 "VPMOVZXBWYrr",
666 "VPMOVZXDQYrr",
667 "VPMOVZXWDYrr",
668 "VPMOVZXWQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000669
Gadi Haber323f2e12017-10-24 20:19:47 +0000670def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000671 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000672 let NumMicroOps = 3;
673 let ResourceCycles = [3];
674}
Craig Topperb5f26592018-04-19 18:00:17 +0000675def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
676 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
677 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000678
679def BWWriteResGroup31 : SchedWriteRes<[BWPort0,BWPort5]> {
680 let Latency = 3;
681 let NumMicroOps = 3;
682 let ResourceCycles = [2,1];
683}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000684def: InstRW<[BWWriteResGroup31], (instregex "VPSLLVD(Y?)rr",
685 "VPSRAVD(Y?)rr",
686 "VPSRLVD(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000687
Gadi Haber323f2e12017-10-24 20:19:47 +0000688def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
689 let Latency = 3;
690 let NumMicroOps = 3;
691 let ResourceCycles = [2,1];
692}
Craig Topper5a69a002018-03-21 06:28:42 +0000693def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
694 "MMX_PACKSSWBirr",
695 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000696
697def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
698 let Latency = 3;
699 let NumMicroOps = 3;
700 let ResourceCycles = [1,2];
701}
702def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
703
704def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
705 let Latency = 3;
706 let NumMicroOps = 3;
707 let ResourceCycles = [1,2];
708}
Craig Topper5a69a002018-03-21 06:28:42 +0000709def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
710 "RCL(8|16|32|64)ri",
711 "RCR(8|16|32|64)r1",
712 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000713
714def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
715 let Latency = 3;
716 let NumMicroOps = 3;
717 let ResourceCycles = [2,1];
718}
Craig Topper5a69a002018-03-21 06:28:42 +0000719def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
720 "ROR(8|16|32|64)rCL",
721 "SAR(8|16|32|64)rCL",
722 "SHL(8|16|32|64)rCL",
723 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000724
725def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
726 let Latency = 3;
727 let NumMicroOps = 4;
728 let ResourceCycles = [1,1,1,1];
729}
730def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
731
732def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
733 let Latency = 3;
734 let NumMicroOps = 4;
735 let ResourceCycles = [1,1,1,1];
736}
Craig Topper5a69a002018-03-21 06:28:42 +0000737def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
738 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000739
740def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
741 let Latency = 4;
742 let NumMicroOps = 2;
743 let ResourceCycles = [1,1];
744}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000745def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
746 "(V?)CVTSD2SIrr",
747 "(V?)CVTSS2SI64rr",
748 "(V?)CVTSS2SIrr",
749 "(V?)CVTTSD2SI64rr",
750 "(V?)CVTTSD2SIrr",
751 "(V?)CVTTSS2SI64rr",
752 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000753
754def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
755 let Latency = 4;
756 let NumMicroOps = 2;
757 let ResourceCycles = [1,1];
758}
Craig Topper5a69a002018-03-21 06:28:42 +0000759def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr",
760 "VPSLLDYrr",
761 "VPSLLQYrr",
762 "VPSLLWYrr",
763 "VPSRADYrr",
764 "VPSRAWYrr",
765 "VPSRLDYrr",
766 "VPSRLQYrr",
767 "VPSRLWYrr",
768 "VPTESTYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000769
770def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
771 let Latency = 4;
772 let NumMicroOps = 2;
773 let ResourceCycles = [1,1];
774}
775def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
776
777def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
778 let Latency = 4;
779 let NumMicroOps = 2;
780 let ResourceCycles = [1,1];
781}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000782def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000783def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000784 "MMX_CVTPI2PDirr",
785 "MMX_CVTPS2PIirr",
786 "MMX_CVTTPD2PIirr",
787 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000788 "(V?)CVTDQ2PDrr",
789 "(V?)CVTPD2DQrr",
790 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000791 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000792 "(V?)CVTSD2SSrr",
793 "(V?)CVTSI642SDrr",
794 "(V?)CVTSI2SDrr",
795 "(V?)CVTSI2SSrr",
796 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000797
798def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
799 let Latency = 4;
800 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000801 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000802}
Craig Topper5a69a002018-03-21 06:28:42 +0000803def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000804
805def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
806 let Latency = 4;
807 let NumMicroOps = 3;
808 let ResourceCycles = [1,1,1];
809}
810def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
811
812def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
813 let Latency = 4;
814 let NumMicroOps = 3;
815 let ResourceCycles = [1,1,1];
816}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000817def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
818 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000819
820def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
821 let Latency = 4;
822 let NumMicroOps = 4;
823 let ResourceCycles = [4];
824}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000825def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000826
827def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
828 let Latency = 4;
829 let NumMicroOps = 4;
830 let ResourceCycles = [1,3];
831}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000832def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000833
834def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
835 let Latency = 5;
836 let NumMicroOps = 1;
837 let ResourceCycles = [1];
838}
Simon Pilgrima53d3302018-05-02 16:16:24 +0000839def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr",
840 "MUL_FPrST0",
841 "MUL_FST0r",
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000842 "MUL_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000843
Gadi Haber323f2e12017-10-24 20:19:47 +0000844def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
845 let Latency = 5;
846 let NumMicroOps = 1;
847 let ResourceCycles = [1];
848}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000849def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000850 "MOVSX(16|32|64)rm32",
851 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000852 "MOVZX(16|32|64)rm16",
853 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000854 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000855 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000856 "(V?)MOVSHDUPrm",
857 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000858 "VPBROADCASTDrm",
859 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000860
861def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
862 let Latency = 5;
863 let NumMicroOps = 3;
864 let ResourceCycles = [1,2];
865}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000866def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000867
868def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
869 let Latency = 5;
870 let NumMicroOps = 3;
871 let ResourceCycles = [1,1,1];
872}
873def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
874
875def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000876 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000877 let NumMicroOps = 3;
878 let ResourceCycles = [1,1,1];
879}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000880def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000881
882def BWWriteResGroup53 : SchedWriteRes<[BWPort0,BWPort4,BWPort237,BWPort15]> {
883 let Latency = 5;
884 let NumMicroOps = 4;
885 let ResourceCycles = [1,1,1,1];
886}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000887def: InstRW<[BWWriteResGroup53], (instregex "VMASKMOVPD(Y?)mr",
888 "VMASKMOVPS(Y?)mr",
889 "VPMASKMOVD(Y?)mr",
890 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000891
892def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
893 let Latency = 5;
894 let NumMicroOps = 5;
895 let ResourceCycles = [1,4];
896}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000897def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000898
899def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
900 let Latency = 5;
901 let NumMicroOps = 5;
902 let ResourceCycles = [1,4];
903}
904def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
905
906def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
907 let Latency = 5;
908 let NumMicroOps = 5;
909 let ResourceCycles = [2,3];
910}
Craig Topper5a69a002018-03-21 06:28:42 +0000911def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000912
913def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
914 let Latency = 5;
915 let NumMicroOps = 6;
916 let ResourceCycles = [1,1,4];
917}
Craig Topper5a69a002018-03-21 06:28:42 +0000918def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000919
920def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
921 let Latency = 6;
922 let NumMicroOps = 1;
923 let ResourceCycles = [1];
924}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000925def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000926 "VBROADCASTF128",
927 "VBROADCASTI128",
928 "VBROADCASTSDYrm",
929 "VBROADCASTSSYrm",
930 "VLDDQUYrm",
931 "VMOVAPDYrm",
932 "VMOVAPSYrm",
933 "VMOVDDUPYrm",
934 "VMOVDQAYrm",
935 "VMOVDQUYrm",
936 "VMOVNTDQAYrm",
937 "VMOVSHDUPYrm",
938 "VMOVSLDUPYrm",
939 "VMOVUPDYrm",
940 "VMOVUPSYrm",
941 "VPBROADCASTDYrm",
942 "VPBROADCASTQYrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000943 "(V?)ROUNDPD(Y?)r",
944 "(V?)ROUNDPS(Y?)r",
945 "(V?)ROUNDSDr",
946 "(V?)ROUNDSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000947
948def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
949 let Latency = 6;
950 let NumMicroOps = 2;
951 let ResourceCycles = [1,1];
952}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000953def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000954 "(V?)CVTPS2PDrm",
955 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000956 "VPSLLVQrm",
957 "VPSRLVQrm",
958 "VTESTPDrm",
959 "VTESTPSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000960
961def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
962 let Latency = 6;
963 let NumMicroOps = 2;
964 let ResourceCycles = [1,1];
965}
Craig Topper5a69a002018-03-21 06:28:42 +0000966def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
967 "VCVTPD2DQYrr",
968 "VCVTPD2PSYrr",
969 "VCVTPS2PHYrr",
970 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000971
Gadi Haber323f2e12017-10-24 20:19:47 +0000972def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
973 let Latency = 6;
974 let NumMicroOps = 2;
975 let ResourceCycles = [1,1];
976}
Craig Topper5a69a002018-03-21 06:28:42 +0000977def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
978 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000979
980def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
981 let Latency = 6;
982 let NumMicroOps = 2;
983 let ResourceCycles = [1,1];
984}
Craig Topperdfccafe2018-04-18 06:41:25 +0000985def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +0000986def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
987 ADCX32rm, ADCX64rm,
988 ADOX32rm, ADOX64rm,
989 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000990
991def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
992 let Latency = 6;
993 let NumMicroOps = 2;
994 let ResourceCycles = [1,1];
995}
Craig Topper5a69a002018-03-21 06:28:42 +0000996def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
997 "BLSI(32|64)rm",
998 "BLSMSK(32|64)rm",
999 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001000 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001001
1002def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
1003 let Latency = 6;
1004 let NumMicroOps = 2;
1005 let ResourceCycles = [1,1];
1006}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001007def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +00001008 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001009 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001010
1011def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1012 let Latency = 6;
1013 let NumMicroOps = 2;
1014 let ResourceCycles = [1,1];
1015}
Craig Topper2d451e72018-03-18 08:38:06 +00001016def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001017def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001018
1019def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1020 let Latency = 6;
1021 let NumMicroOps = 4;
1022 let ResourceCycles = [1,1,2];
1023}
Craig Topper5a69a002018-03-21 06:28:42 +00001024def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1025 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001026
1027def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1028 let Latency = 6;
1029 let NumMicroOps = 4;
1030 let ResourceCycles = [1,1,1,1];
1031}
1032def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1033
1034def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1035 let Latency = 6;
1036 let NumMicroOps = 4;
1037 let ResourceCycles = [1,1,1,1];
1038}
Craig Topper5a69a002018-03-21 06:28:42 +00001039def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1040 "BTR(16|32|64)mi8",
1041 "BTS(16|32|64)mi8",
1042 "SAR(8|16|32|64)m1",
1043 "SAR(8|16|32|64)mi",
1044 "SHL(8|16|32|64)m1",
1045 "SHL(8|16|32|64)mi",
1046 "SHR(8|16|32|64)m1",
1047 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001048
1049def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1050 let Latency = 6;
1051 let NumMicroOps = 4;
1052 let ResourceCycles = [1,1,1,1];
1053}
Craig Topperf0d04262018-04-06 16:16:48 +00001054def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1055 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001056
1057def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1058 let Latency = 6;
1059 let NumMicroOps = 6;
1060 let ResourceCycles = [1,5];
1061}
1062def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1063
Gadi Haber323f2e12017-10-24 20:19:47 +00001064def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1065 let Latency = 7;
1066 let NumMicroOps = 2;
1067 let ResourceCycles = [1,1];
1068}
Craig Topper5a69a002018-03-21 06:28:42 +00001069def: InstRW<[BWWriteResGroup73], (instregex "VPSLLDYrm",
1070 "VPSLLQYrm",
1071 "VPSLLVQYrm",
1072 "VPSLLWYrm",
1073 "VPSRADYrm",
1074 "VPSRAWYrm",
1075 "VPSRLDYrm",
1076 "VPSRLQYrm",
1077 "VPSRLVQYrm",
1078 "VPSRLWYrm",
1079 "VTESTPDYrm",
1080 "VTESTPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001081
1082def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1083 let Latency = 7;
1084 let NumMicroOps = 2;
1085 let ResourceCycles = [1,1];
1086}
Craig Topper5a69a002018-03-21 06:28:42 +00001087def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1088 "FCOM64m",
1089 "FCOMP32m",
1090 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001091
Gadi Haber323f2e12017-10-24 20:19:47 +00001092def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1093 let Latency = 7;
1094 let NumMicroOps = 2;
1095 let ResourceCycles = [1,1];
1096}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001097def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001098
Gadi Haber323f2e12017-10-24 20:19:47 +00001099def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1100 let Latency = 7;
1101 let NumMicroOps = 3;
1102 let ResourceCycles = [2,1];
1103}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001104def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001105 "MMX_PACKSSWBirm",
1106 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001107 "VMASKMOVPDrm",
1108 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001109 "VPMASKMOVDrm",
1110 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001111
1112def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1113 let Latency = 7;
1114 let NumMicroOps = 3;
1115 let ResourceCycles = [1,2];
1116}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001117def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1118 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001119
1120def BWWriteResGroup81 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1121 let Latency = 7;
1122 let NumMicroOps = 3;
1123 let ResourceCycles = [1,1,1];
1124}
Simon Pilgrimd5ada492018-04-29 15:33:15 +00001125def: InstRW<[BWWriteResGroup81], (instregex "(V?)PSLLDrm",
1126 "(V?)PSLLQrm",
1127 "(V?)PSLLWrm",
1128 "(V?)PSRADrm",
1129 "(V?)PSRAWrm",
1130 "(V?)PSRLDrm",
1131 "(V?)PSRLQrm",
1132 "(V?)PSRLWrm",
1133 "(V?)PTESTrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001134
1135def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1136 let Latency = 7;
1137 let NumMicroOps = 3;
1138 let ResourceCycles = [1,1,1];
1139}
1140def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1141
Gadi Haber323f2e12017-10-24 20:19:47 +00001142def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1143 let Latency = 7;
1144 let NumMicroOps = 3;
1145 let ResourceCycles = [1,1,1];
1146}
Craig Topper5a69a002018-03-21 06:28:42 +00001147def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1148 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001149
Gadi Haber323f2e12017-10-24 20:19:47 +00001150def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1151 let Latency = 7;
1152 let NumMicroOps = 3;
1153 let ResourceCycles = [1,1,1];
1154}
Craig Topperf4cd9082018-01-19 05:47:32 +00001155def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001156
1157def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1158 let Latency = 7;
1159 let NumMicroOps = 5;
1160 let ResourceCycles = [1,1,1,2];
1161}
Craig Topper5a69a002018-03-21 06:28:42 +00001162def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1163 "ROL(8|16|32|64)mi",
1164 "ROR(8|16|32|64)m1",
1165 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001166
1167def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1168 let Latency = 7;
1169 let NumMicroOps = 5;
1170 let ResourceCycles = [1,1,1,2];
1171}
Craig Topper5a69a002018-03-21 06:28:42 +00001172def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001173
1174def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1175 let Latency = 7;
1176 let NumMicroOps = 5;
1177 let ResourceCycles = [1,1,1,1,1];
1178}
Craig Topper5a69a002018-03-21 06:28:42 +00001179def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1180 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001181
1182def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1183 let Latency = 7;
1184 let NumMicroOps = 7;
1185 let ResourceCycles = [2,2,1,2];
1186}
Craig Topper2d451e72018-03-18 08:38:06 +00001187def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001188
1189def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1190 let Latency = 8;
1191 let NumMicroOps = 2;
1192 let ResourceCycles = [1,1];
1193}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001194def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001195 "PDEP(32|64)rm",
1196 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001197 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001198
1199def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001200 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001201 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001202 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001203}
Craig Topperf846e2d2018-04-19 05:34:05 +00001204def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001205
Craig Topperf846e2d2018-04-19 05:34:05 +00001206def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1207 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001208 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001209 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001210}
Craig Topper5a69a002018-03-21 06:28:42 +00001211def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001212
Gadi Haber323f2e12017-10-24 20:19:47 +00001213def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1214 let Latency = 8;
1215 let NumMicroOps = 2;
1216 let ResourceCycles = [1,1];
1217}
Craig Topper5a69a002018-03-21 06:28:42 +00001218def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1219 "VPMOVSXBQYrm",
1220 "VPMOVSXBWYrm",
1221 "VPMOVSXDQYrm",
1222 "VPMOVSXWDYrm",
1223 "VPMOVSXWQYrm",
1224 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001225
Gadi Haber323f2e12017-10-24 20:19:47 +00001226def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1227 let Latency = 8;
1228 let NumMicroOps = 3;
1229 let ResourceCycles = [2,1];
1230}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001231def: InstRW<[BWWriteResGroup94], (instregex "VMASKMOVPDYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001232 "VMASKMOVPSYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001233 "VPMASKMOVDYrm",
1234 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001235
1236def BWWriteResGroup95 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1237 let Latency = 8;
1238 let NumMicroOps = 4;
1239 let ResourceCycles = [2,1,1];
1240}
Craig Topper5a69a002018-03-21 06:28:42 +00001241def: InstRW<[BWWriteResGroup95], (instregex "VPSLLVDrm",
1242 "VPSRAVDrm",
1243 "VPSRLVDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001244
Gadi Haber323f2e12017-10-24 20:19:47 +00001245def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1246 let Latency = 8;
1247 let NumMicroOps = 5;
1248 let ResourceCycles = [1,1,1,2];
1249}
Craig Topper5a69a002018-03-21 06:28:42 +00001250def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1251 "RCL(8|16|32|64)mi",
1252 "RCR(8|16|32|64)m1",
1253 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001254
1255def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1256 let Latency = 8;
1257 let NumMicroOps = 5;
1258 let ResourceCycles = [1,1,2,1];
1259}
Craig Topper13a16502018-03-19 00:56:09 +00001260def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001261
1262def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1263 let Latency = 8;
1264 let NumMicroOps = 6;
1265 let ResourceCycles = [1,1,1,3];
1266}
Craig Topper9f834812018-04-01 21:54:24 +00001267def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001268
1269def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1270 let Latency = 8;
1271 let NumMicroOps = 6;
1272 let ResourceCycles = [1,1,1,2,1];
1273}
Craig Topper9f834812018-04-01 21:54:24 +00001274def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001275 "CMPXCHG(8|16|32|64)rm",
1276 "ROL(8|16|32|64)mCL",
1277 "SAR(8|16|32|64)mCL",
1278 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001279 "SHL(8|16|32|64)mCL",
1280 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001281def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1282 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001283
1284def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1285 let Latency = 9;
1286 let NumMicroOps = 2;
1287 let ResourceCycles = [1,1];
1288}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001289def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1290 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001291 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001292 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001293
1294def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1295 let Latency = 9;
1296 let NumMicroOps = 2;
1297 let ResourceCycles = [1,1];
1298}
Craig Topper5a69a002018-03-21 06:28:42 +00001299def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1300 "VPERM2I128rm",
1301 "VPERMDYrm",
1302 "VPERMPDYmi",
1303 "VPERMPSYrm",
1304 "VPERMQYmi",
1305 "VPMOVZXBDYrm",
1306 "VPMOVZXBQYrm",
1307 "VPMOVZXBWYrm",
1308 "VPMOVZXDQYrm",
1309 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001310
Gadi Haber323f2e12017-10-24 20:19:47 +00001311def BWWriteResGroup104 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1312 let Latency = 9;
1313 let NumMicroOps = 3;
1314 let ResourceCycles = [1,1,1];
1315}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001316def: InstRW<[BWWriteResGroup104], (instregex "(V?)DPPDrri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001317
1318def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1319 let Latency = 9;
1320 let NumMicroOps = 3;
1321 let ResourceCycles = [1,1,1];
1322}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001323def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1324 "(V?)CVTSD2SIrm",
1325 "(V?)CVTSS2SI64rm",
1326 "(V?)CVTSS2SIrm",
1327 "(V?)CVTTSD2SI64rm",
1328 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001329 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001330 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001331
1332def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1333 let Latency = 9;
1334 let NumMicroOps = 3;
1335 let ResourceCycles = [1,1,1];
1336}
1337def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1338
1339def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1340 let Latency = 9;
1341 let NumMicroOps = 3;
1342 let ResourceCycles = [1,1,1];
1343}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001344def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001345def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001346 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001347 "CVTTPD2DQrm",
1348 "MMX_CVTPD2PIirm",
1349 "MMX_CVTPI2PDirm",
1350 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001351 "(V?)CVTDQ2PDrm",
1352 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001353
1354def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1355 let Latency = 9;
1356 let NumMicroOps = 3;
1357 let ResourceCycles = [1,1,1];
1358}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001359def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1360 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001361
1362def BWWriteResGroup109 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1363 let Latency = 9;
1364 let NumMicroOps = 4;
1365 let ResourceCycles = [2,1,1];
1366}
Craig Topper5a69a002018-03-21 06:28:42 +00001367def: InstRW<[BWWriteResGroup109], (instregex "VPSLLVDYrm",
1368 "VPSRAVDYrm",
1369 "VPSRLVDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001370
Gadi Haber323f2e12017-10-24 20:19:47 +00001371def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1372 let Latency = 9;
1373 let NumMicroOps = 4;
1374 let ResourceCycles = [1,1,1,1];
1375}
Craig Topper5a69a002018-03-21 06:28:42 +00001376def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1377 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001378
1379def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1380 let Latency = 9;
1381 let NumMicroOps = 5;
1382 let ResourceCycles = [1,1,3];
1383}
1384def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1385
1386def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1387 let Latency = 9;
1388 let NumMicroOps = 5;
1389 let ResourceCycles = [1,2,1,1];
1390}
Craig Topper5a69a002018-03-21 06:28:42 +00001391def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1392 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001393
Gadi Haber323f2e12017-10-24 20:19:47 +00001394def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1395 let Latency = 10;
1396 let NumMicroOps = 2;
1397 let ResourceCycles = [1,1];
1398}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001399def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001400
Gadi Haber323f2e12017-10-24 20:19:47 +00001401def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1402 let Latency = 10;
1403 let NumMicroOps = 3;
1404 let ResourceCycles = [2,1];
1405}
Craig Topper5a69a002018-03-21 06:28:42 +00001406def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1407 "FICOM32m",
1408 "FICOMP16m",
1409 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001410
1411def BWWriteResGroup118 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1412 let Latency = 10;
1413 let NumMicroOps = 3;
1414 let ResourceCycles = [1,1,1];
1415}
1416def: InstRW<[BWWriteResGroup118], (instregex "VPTESTYrm")>;
1417
Gadi Haber323f2e12017-10-24 20:19:47 +00001418def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1419 let Latency = 10;
1420 let NumMicroOps = 4;
1421 let ResourceCycles = [1,1,1,1];
1422}
1423def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1424
1425def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001426 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001427 let NumMicroOps = 4;
1428 let ResourceCycles = [1,1,1,1];
1429}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001430def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001431
Craig Topper8104f262018-04-02 05:33:28 +00001432def BWWriteResGroup122 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001433 let Latency = 11;
1434 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001435 let ResourceCycles = [1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001436}
Craig Topper8104f262018-04-02 05:33:28 +00001437def: InstRW<[BWWriteResGroup122], (instregex "(V?)DIVPSrr")>;
1438
1439def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1440 let Latency = 11;
1441 let NumMicroOps = 1;
1442 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1443}
1444def: InstRW<[BWWriteResGroup122_1], (instregex "(V?)DIVSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001445
1446def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1447 let Latency = 11;
1448 let NumMicroOps = 2;
1449 let ResourceCycles = [1,1];
1450}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001451def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001452 "VPCMPGTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001453
Gadi Haber323f2e12017-10-24 20:19:47 +00001454def BWWriteResGroup126 : SchedWriteRes<[BWPort0,BWPort015]> {
1455 let Latency = 11;
1456 let NumMicroOps = 3;
1457 let ResourceCycles = [2,1];
1458}
Craig Topper5a69a002018-03-21 06:28:42 +00001459def: InstRW<[BWWriteResGroup126], (instregex "VRCPPSYr",
1460 "VRSQRTPSYr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001461
1462def BWWriteResGroup127 : SchedWriteRes<[BWPort1,BWPort23]> {
1463 let Latency = 11;
1464 let NumMicroOps = 3;
1465 let ResourceCycles = [2,1];
1466}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001467def: InstRW<[BWWriteResGroup127], (instregex "(V?)ROUNDPDm",
1468 "(V?)ROUNDPSm",
1469 "(V?)ROUNDSDm",
1470 "(V?)ROUNDSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001471
1472def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1473 let Latency = 11;
1474 let NumMicroOps = 3;
1475 let ResourceCycles = [1,1,1];
1476}
1477def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1478
Gadi Haber323f2e12017-10-24 20:19:47 +00001479def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1480 let Latency = 11;
1481 let NumMicroOps = 6;
1482 let ResourceCycles = [1,1,1,1,2];
1483}
Craig Topper5a69a002018-03-21 06:28:42 +00001484def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1485 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001486
1487def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1488 let Latency = 11;
1489 let NumMicroOps = 7;
1490 let ResourceCycles = [2,2,3];
1491}
Craig Topper5a69a002018-03-21 06:28:42 +00001492def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1493 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001494
1495def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1496 let Latency = 11;
1497 let NumMicroOps = 9;
1498 let ResourceCycles = [1,4,1,3];
1499}
1500def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1501
1502def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1503 let Latency = 11;
1504 let NumMicroOps = 11;
1505 let ResourceCycles = [2,9];
1506}
Craig Topper2d451e72018-03-18 08:38:06 +00001507def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1508def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001509
Gadi Haber323f2e12017-10-24 20:19:47 +00001510def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1511 let Latency = 12;
1512 let NumMicroOps = 3;
1513 let ResourceCycles = [2,1];
1514}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001515def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m",
Craig Topper40d3b322018-03-22 21:55:20 +00001516 "VROUNDPDYm",
1517 "VROUNDPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001518
Craig Topper8104f262018-04-02 05:33:28 +00001519def BWWriteResGroup137 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001520 let Latency = 11;
Gadi Haber323f2e12017-10-24 20:19:47 +00001521 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001522 let ResourceCycles = [1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001523}
Craig Topper8104f262018-04-02 05:33:28 +00001524def: InstRW<[BWWriteResGroup137], (instregex "(V?)SQRTPSr")>;
1525
1526def BWWriteResGroup137_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1527 let Latency = 11;
1528 let NumMicroOps = 1;
1529 let ResourceCycles = [1,4];
1530}
1531def: InstRW<[BWWriteResGroup137_1], (instregex "(V?)SQRTSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001532
Craig Topper8104f262018-04-02 05:33:28 +00001533def BWWriteResGroup139 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001534 let Latency = 14;
1535 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001536 let ResourceCycles = [1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001537}
Craig Topper8104f262018-04-02 05:33:28 +00001538def: InstRW<[BWWriteResGroup139], (instregex "(V?)DIVPDrr")>;
1539
1540def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1541 let Latency = 14;
1542 let NumMicroOps = 1;
1543 let ResourceCycles = [1,4];
1544}
1545def: InstRW<[BWWriteResGroup139_1], (instregex "(V?)DIVSDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001546
Gadi Haber323f2e12017-10-24 20:19:47 +00001547def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1548 let Latency = 14;
1549 let NumMicroOps = 3;
1550 let ResourceCycles = [1,1,1];
1551}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001552def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001553
1554def BWWriteResGroup142 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1555 let Latency = 14;
1556 let NumMicroOps = 4;
1557 let ResourceCycles = [2,1,1];
1558}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001559def: InstRW<[BWWriteResGroup142], (instregex "(V?)DPPS(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001560
1561def BWWriteResGroup143 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1562 let Latency = 14;
1563 let NumMicroOps = 4;
1564 let ResourceCycles = [1,1,1,1];
1565}
Craig Topper5a69a002018-03-21 06:28:42 +00001566def: InstRW<[BWWriteResGroup143], (instregex "(V?)DPPDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001567
1568def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1569 let Latency = 14;
1570 let NumMicroOps = 8;
1571 let ResourceCycles = [2,2,1,3];
1572}
1573def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1574
1575def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1576 let Latency = 14;
1577 let NumMicroOps = 10;
1578 let ResourceCycles = [2,3,1,4];
1579}
1580def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1581
1582def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1583 let Latency = 14;
1584 let NumMicroOps = 12;
1585 let ResourceCycles = [2,1,4,5];
1586}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001587def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001588
1589def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1590 let Latency = 15;
1591 let NumMicroOps = 1;
1592 let ResourceCycles = [1];
1593}
Craig Topper5a69a002018-03-21 06:28:42 +00001594def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1595 "DIVR_FST0r",
1596 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001597
Gadi Haber323f2e12017-10-24 20:19:47 +00001598def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1599 let Latency = 15;
1600 let NumMicroOps = 10;
1601 let ResourceCycles = [1,1,1,4,1,2];
1602}
Craig Topper13a16502018-03-19 00:56:09 +00001603def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001604
Craig Topper8104f262018-04-02 05:33:28 +00001605def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001606 let Latency = 16;
1607 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001608 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001609}
Craig Topper5a69a002018-03-21 06:28:42 +00001610def: InstRW<[BWWriteResGroup150], (instregex "(V?)DIVPSrm",
1611 "(V?)DIVSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001612
Gadi Haber323f2e12017-10-24 20:19:47 +00001613def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1614 let Latency = 16;
1615 let NumMicroOps = 14;
1616 let ResourceCycles = [1,1,1,4,2,5];
1617}
1618def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1619
1620def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1621 let Latency = 16;
1622 let NumMicroOps = 16;
1623 let ResourceCycles = [16];
1624}
Craig Topper5a69a002018-03-21 06:28:42 +00001625def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001626
Craig Topper8104f262018-04-02 05:33:28 +00001627def BWWriteResGroup155 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001628 let Latency = 17;
1629 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001630 let ResourceCycles = [2,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001631}
1632def: InstRW<[BWWriteResGroup155], (instregex "VDIVPSYrr")>;
1633
1634def BWWriteResGroup156 : SchedWriteRes<[BWPort0,BWPort23,BWPort015]> {
1635 let Latency = 17;
1636 let NumMicroOps = 4;
1637 let ResourceCycles = [2,1,1];
1638}
Craig Topper5a69a002018-03-21 06:28:42 +00001639def: InstRW<[BWWriteResGroup156], (instregex "VRCPPSYm",
1640 "VRSQRTPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001641
Craig Topper8104f262018-04-02 05:33:28 +00001642def BWWriteResGroup157 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001643 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001644 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001645 let ResourceCycles = [1,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001646}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001647def: InstRW<[BWWriteResGroup157], (instregex "(V?)SQRTPSm",
1648 "(V?)SQRTSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001649
Gadi Haber323f2e12017-10-24 20:19:47 +00001650def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1651 let Latency = 18;
1652 let NumMicroOps = 8;
1653 let ResourceCycles = [1,1,1,5];
1654}
Craig Topper5a69a002018-03-21 06:28:42 +00001655def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001656def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001657
1658def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1659 let Latency = 18;
1660 let NumMicroOps = 11;
1661 let ResourceCycles = [2,1,1,3,1,3];
1662}
Craig Topper13a16502018-03-19 00:56:09 +00001663def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001664
Craig Topper8104f262018-04-02 05:33:28 +00001665def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001666 let Latency = 19;
1667 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001668 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001669}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001670def: InstRW<[BWWriteResGroup161], (instregex "(V?)DIVPDrm",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001671 "(V?)DIVSDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001672
Gadi Haber323f2e12017-10-24 20:19:47 +00001673def BWWriteResGroup163 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1674 let Latency = 19;
1675 let NumMicroOps = 5;
1676 let ResourceCycles = [2,1,1,1];
1677}
Craig Topper5a69a002018-03-21 06:28:42 +00001678def: InstRW<[BWWriteResGroup163], (instregex "(V?)DPPSrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001679
Gadi Haber323f2e12017-10-24 20:19:47 +00001680def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1681 let Latency = 20;
1682 let NumMicroOps = 1;
1683 let ResourceCycles = [1];
1684}
Craig Topper5a69a002018-03-21 06:28:42 +00001685def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1686 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001687 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001688
1689def BWWriteResGroup166 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1690 let Latency = 20;
1691 let NumMicroOps = 5;
1692 let ResourceCycles = [2,1,1,1];
1693}
1694def: InstRW<[BWWriteResGroup166], (instregex "VDPPSYrmi")>;
1695
1696def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1697 let Latency = 20;
1698 let NumMicroOps = 8;
1699 let ResourceCycles = [1,1,1,1,1,1,2];
1700}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001701def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001702
Craig Topper8104f262018-04-02 05:33:28 +00001703def BWWriteResGroup168 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001704 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001705 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001706 let ResourceCycles = [1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001707}
Craig Topper8104f262018-04-02 05:33:28 +00001708def: InstRW<[BWWriteResGroup168], (instregex "(V?)SQRTPDr")>;
1709
1710def BWWriteResGroup168_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1711 let Latency = 16;
1712 let NumMicroOps = 1;
1713 let ResourceCycles = [1,8];
1714}
1715def: InstRW<[BWWriteResGroup168_1], (instregex "(V?)SQRTSDr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001716
1717def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1718 let Latency = 21;
1719 let NumMicroOps = 2;
1720 let ResourceCycles = [1,1];
1721}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001722def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001723
Craig Topper8104f262018-04-02 05:33:28 +00001724def BWWriteResGroup170 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001725 let Latency = 21;
1726 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001727 let ResourceCycles = [2,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001728}
1729def: InstRW<[BWWriteResGroup170], (instregex "VSQRTPSYr")>;
1730
1731def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1732 let Latency = 21;
1733 let NumMicroOps = 19;
1734 let ResourceCycles = [2,1,4,1,1,4,6];
1735}
1736def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1737
1738def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1739 let Latency = 22;
1740 let NumMicroOps = 18;
1741 let ResourceCycles = [1,1,16];
1742}
1743def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1744
Craig Topper8104f262018-04-02 05:33:28 +00001745def BWWriteResGroup173 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001746 let Latency = 23;
1747 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001748 let ResourceCycles = [2,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001749}
1750def: InstRW<[BWWriteResGroup173], (instregex "VDIVPDYrr")>;
1751
Craig Topper8104f262018-04-02 05:33:28 +00001752def BWWriteResGroup174 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001753 let Latency = 23;
1754 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001755 let ResourceCycles = [2,1,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001756}
1757def: InstRW<[BWWriteResGroup174], (instregex "VDIVPSYrm")>;
1758
Gadi Haber323f2e12017-10-24 20:19:47 +00001759def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1760 let Latency = 23;
1761 let NumMicroOps = 19;
1762 let ResourceCycles = [3,1,15];
1763}
Craig Topper391c6f92017-12-10 01:24:08 +00001764def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001765
1766def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1767 let Latency = 24;
1768 let NumMicroOps = 3;
1769 let ResourceCycles = [1,1,1];
1770}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001771def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001772
Craig Topper8104f262018-04-02 05:33:28 +00001773def BWWriteResGroup179 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001774 let Latency = 21;
Gadi Haber323f2e12017-10-24 20:19:47 +00001775 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001776 let ResourceCycles = [1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001777}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001778def: InstRW<[BWWriteResGroup179], (instregex "(V?)SQRTPDm",
1779 "(V?)SQRTSDm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001780
1781def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1782 let Latency = 26;
1783 let NumMicroOps = 2;
1784 let ResourceCycles = [1,1];
1785}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001786def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001787
Craig Topper8104f262018-04-02 05:33:28 +00001788def BWWriteResGroup181 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001789 let Latency = 27;
1790 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001791 let ResourceCycles = [2,1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001792}
1793def: InstRW<[BWWriteResGroup181], (instregex "VSQRTPSYm")>;
1794
1795def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1796 let Latency = 29;
1797 let NumMicroOps = 3;
1798 let ResourceCycles = [1,1,1];
1799}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001800def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001801
Craig Topper8104f262018-04-02 05:33:28 +00001802def BWWriteResGroup183 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001803 let Latency = 29;
1804 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001805 let ResourceCycles = [2,1,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001806}
1807def: InstRW<[BWWriteResGroup183], (instregex "VDIVPDYrm")>;
1808
1809def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1810 let Latency = 22;
1811 let NumMicroOps = 7;
1812 let ResourceCycles = [1,3,2,1];
1813}
Craig Topper17a31182017-12-16 18:35:29 +00001814def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001815
1816def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1817 let Latency = 23;
1818 let NumMicroOps = 9;
1819 let ResourceCycles = [1,3,4,1];
1820}
Craig Topper17a31182017-12-16 18:35:29 +00001821def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001822
1823def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1824 let Latency = 24;
1825 let NumMicroOps = 9;
1826 let ResourceCycles = [1,5,2,1];
1827}
Craig Topper17a31182017-12-16 18:35:29 +00001828def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001829
1830def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1831 let Latency = 25;
1832 let NumMicroOps = 7;
1833 let ResourceCycles = [1,3,2,1];
1834}
Craig Topper17a31182017-12-16 18:35:29 +00001835def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1836 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001837
1838def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1839 let Latency = 26;
1840 let NumMicroOps = 9;
1841 let ResourceCycles = [1,5,2,1];
1842}
Craig Topper17a31182017-12-16 18:35:29 +00001843def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001844
1845def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1846 let Latency = 26;
1847 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001848 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001849}
Craig Topper17a31182017-12-16 18:35:29 +00001850def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001851
1852def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1853 let Latency = 27;
1854 let NumMicroOps = 9;
1855 let ResourceCycles = [1,5,2,1];
1856}
Craig Topper17a31182017-12-16 18:35:29 +00001857def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001858
Gadi Haber323f2e12017-10-24 20:19:47 +00001859def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1860 let Latency = 29;
1861 let NumMicroOps = 27;
1862 let ResourceCycles = [1,5,1,1,19];
1863}
1864def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1865
1866def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1867 let Latency = 30;
1868 let NumMicroOps = 28;
1869 let ResourceCycles = [1,6,1,1,19];
1870}
Craig Topper2d451e72018-03-18 08:38:06 +00001871def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001872
1873def BWWriteResGroup187 : SchedWriteRes<[BWPort01,BWPort15,BWPort015,BWPort0156]> {
1874 let Latency = 31;
1875 let NumMicroOps = 31;
1876 let ResourceCycles = [8,1,21,1];
1877}
1878def: InstRW<[BWWriteResGroup187], (instregex "MMX_EMMS")>;
1879
Craig Topper8104f262018-04-02 05:33:28 +00001880def BWWriteResGroup189 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
1881 let Latency = 29;
Gadi Haber323f2e12017-10-24 20:19:47 +00001882 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001883 let ResourceCycles = [2,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00001884}
1885def: InstRW<[BWWriteResGroup189], (instregex "VSQRTPDYr")>;
1886
1887def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1888 let Latency = 34;
1889 let NumMicroOps = 8;
1890 let ResourceCycles = [2,2,2,1,1];
1891}
Craig Topper13a16502018-03-19 00:56:09 +00001892def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001893
1894def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
1895 let Latency = 34;
1896 let NumMicroOps = 23;
1897 let ResourceCycles = [1,5,3,4,10];
1898}
Craig Topper5a69a002018-03-21 06:28:42 +00001899def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
1900 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001901
1902def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1903 let Latency = 35;
1904 let NumMicroOps = 8;
1905 let ResourceCycles = [2,2,2,1,1];
1906}
Craig Topper13a16502018-03-19 00:56:09 +00001907def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001908
1909def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1910 let Latency = 35;
1911 let NumMicroOps = 23;
1912 let ResourceCycles = [1,5,2,1,4,10];
1913}
Craig Topper5a69a002018-03-21 06:28:42 +00001914def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
1915 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001916
Craig Topper8104f262018-04-02 05:33:28 +00001917def BWWriteResGroup195 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
1918 let Latency = 35;
Gadi Haber323f2e12017-10-24 20:19:47 +00001919 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001920 let ResourceCycles = [2,1,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00001921}
1922def: InstRW<[BWWriteResGroup195], (instregex "VSQRTPDYm")>;
1923
1924def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
1925 let Latency = 42;
1926 let NumMicroOps = 22;
1927 let ResourceCycles = [2,20];
1928}
Craig Topper2d451e72018-03-18 08:38:06 +00001929def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001930
1931def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
1932 let Latency = 60;
1933 let NumMicroOps = 64;
1934 let ResourceCycles = [2,2,8,1,10,2,39];
1935}
1936def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001937
1938def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1939 let Latency = 63;
1940 let NumMicroOps = 88;
1941 let ResourceCycles = [4,4,31,1,2,1,45];
1942}
Craig Topper2d451e72018-03-18 08:38:06 +00001943def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001944
1945def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1946 let Latency = 63;
1947 let NumMicroOps = 90;
1948 let ResourceCycles = [4,2,33,1,2,1,47];
1949}
Craig Topper2d451e72018-03-18 08:38:06 +00001950def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001951
1952def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
1953 let Latency = 75;
1954 let NumMicroOps = 15;
1955 let ResourceCycles = [6,3,6];
1956}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00001957def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001958
1959def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
1960 let Latency = 80;
1961 let NumMicroOps = 32;
1962 let ResourceCycles = [7,7,3,3,1,11];
1963}
1964def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
1965
1966def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
1967 let Latency = 115;
1968 let NumMicroOps = 100;
1969 let ResourceCycles = [9,9,11,8,1,11,21,30];
1970}
1971def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001972
1973} // SchedModel
1974