blob: ee29d634a9aef50058f54ebc86d40ee8c97bf521 [file] [log] [blame]
Gadi Haber323f2e12017-10-24 20:19:47 +00001//=- X86SchedBroadwell.td - X86 Broadwell Scheduling ---------*- tablegen -*-=//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the machine model for Broadwell to support instruction
11// scheduling and other instruction cost heuristics.
12//
13//===----------------------------------------------------------------------===//
Clement Courbet0f1da8f2018-05-02 13:54:38 +000014
Gadi Haber323f2e12017-10-24 20:19:47 +000015def BroadwellModel : SchedMachineModel {
Simon Pilgrimf7d2a932018-04-24 13:21:41 +000016 // All x86 instructions are modeled as a single micro-op, and BW can decode 4
Gadi Haber323f2e12017-10-24 20:19:47 +000017 // instructions per cycle.
18 let IssueWidth = 4;
19 let MicroOpBufferSize = 192; // Based on the reorder buffer.
20 let LoadLatency = 5;
21 let MispredictPenalty = 16;
22
23 // Based on the LSD (loop-stream detector) queue size and benchmarking data.
24 let LoopMicroOpBufferSize = 50;
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000025
Simon Pilgrimc21deec2018-03-24 19:37:28 +000026 // This flag is set to allow the scheduler to assign a default model to
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000027 // unrecognized opcodes.
28 let CompleteModel = 0;
Gadi Haber323f2e12017-10-24 20:19:47 +000029}
30
31let SchedModel = BroadwellModel in {
32
33// Broadwell can issue micro-ops to 8 different ports in one cycle.
34
35// Ports 0, 1, 5, and 6 handle all computation.
36// Port 4 gets the data half of stores. Store data can be available later than
37// the store address, but since we don't model the latency of stores, we can
38// ignore that.
39// Ports 2 and 3 are identical. They handle loads and the address half of
40// stores. Port 7 can handle address calculations.
41def BWPort0 : ProcResource<1>;
42def BWPort1 : ProcResource<1>;
43def BWPort2 : ProcResource<1>;
44def BWPort3 : ProcResource<1>;
45def BWPort4 : ProcResource<1>;
46def BWPort5 : ProcResource<1>;
47def BWPort6 : ProcResource<1>;
48def BWPort7 : ProcResource<1>;
49
50// Many micro-ops are capable of issuing on multiple ports.
51def BWPort01 : ProcResGroup<[BWPort0, BWPort1]>;
52def BWPort23 : ProcResGroup<[BWPort2, BWPort3]>;
53def BWPort237 : ProcResGroup<[BWPort2, BWPort3, BWPort7]>;
54def BWPort04 : ProcResGroup<[BWPort0, BWPort4]>;
55def BWPort05 : ProcResGroup<[BWPort0, BWPort5]>;
56def BWPort06 : ProcResGroup<[BWPort0, BWPort6]>;
57def BWPort15 : ProcResGroup<[BWPort1, BWPort5]>;
58def BWPort16 : ProcResGroup<[BWPort1, BWPort6]>;
59def BWPort56 : ProcResGroup<[BWPort5, BWPort6]>;
60def BWPort015 : ProcResGroup<[BWPort0, BWPort1, BWPort5]>;
61def BWPort056 : ProcResGroup<[BWPort0, BWPort5, BWPort6]>;
62def BWPort0156: ProcResGroup<[BWPort0, BWPort1, BWPort5, BWPort6]>;
63
64// 60 Entry Unified Scheduler
65def BWPortAny : ProcResGroup<[BWPort0, BWPort1, BWPort2, BWPort3, BWPort4,
66 BWPort5, BWPort6, BWPort7]> {
67 let BufferSize=60;
68}
69
Simon Pilgrim30c38c32018-03-19 14:46:07 +000070// Integer division issued on port 0.
Craig Topper8104f262018-04-02 05:33:28 +000071def BWDivider : ProcResource<1>;
72// FP division and sqrt on port 0.
73def BWFPDivider : ProcResource<1>;
Simon Pilgrim30c38c32018-03-19 14:46:07 +000074
Gadi Haber323f2e12017-10-24 20:19:47 +000075// Loads are 5 cycles, so ReadAfterLd registers needn't be available until 5
76// cycles after the memory operand.
77def : ReadAdvance<ReadAfterLd, 5>;
78
79// Many SchedWrites are defined in pairs with and without a folded load.
80// Instructions with folded loads are usually micro-fused, so they only appear
81// as two micro-ops when queued in the reservation station.
82// This multiclass defines the resource usage for variants with and without
83// folded loads.
84multiclass BWWriteResPair<X86FoldableSchedWrite SchedRW,
Simon Pilgrim30c38c32018-03-19 14:46:07 +000085 list<ProcResourceKind> ExePorts,
Simon Pilgrime3547af2018-03-25 10:21:19 +000086 int Lat, list<int> Res = [1], int UOps = 1,
87 int LoadLat = 5> {
Gadi Haber323f2e12017-10-24 20:19:47 +000088 // Register variant is using a single cycle on ExePort.
Simon Pilgrim30c38c32018-03-19 14:46:07 +000089 def : WriteRes<SchedRW, ExePorts> {
90 let Latency = Lat;
91 let ResourceCycles = Res;
92 let NumMicroOps = UOps;
93 }
Gadi Haber323f2e12017-10-24 20:19:47 +000094
Simon Pilgrime3547af2018-03-25 10:21:19 +000095 // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to
96 // the latency (default = 5).
Simon Pilgrim30c38c32018-03-19 14:46:07 +000097 def : WriteRes<SchedRW.Folded, !listconcat([BWPort23], ExePorts)> {
Simon Pilgrime3547af2018-03-25 10:21:19 +000098 let Latency = !add(Lat, LoadLat);
Simon Pilgrim30c38c32018-03-19 14:46:07 +000099 let ResourceCycles = !listconcat([1], Res);
Simon Pilgrime3547af2018-03-25 10:21:19 +0000100 let NumMicroOps = !add(UOps, 1);
Gadi Haber323f2e12017-10-24 20:19:47 +0000101 }
102}
103
Craig Topperf131b602018-04-06 16:16:46 +0000104// A folded store needs a cycle on port 4 for the store data, and an extra port
105// 2/3/7 cycle to recompute the address.
106def : WriteRes<WriteRMW, [BWPort237,BWPort4]>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000107
108// Arithmetic.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000109defm : BWWriteResPair<WriteALU, [BWPort0156], 1>; // Simple integer ALU op.
110defm : BWWriteResPair<WriteIMul, [BWPort1], 3>; // Integer multiplication.
111defm : BWWriteResPair<WriteIDiv, [BWPort0, BWDivider], 25, [1, 10]>;
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000112defm : BWWriteResPair<WriteCRC32, [BWPort1], 3>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000113def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, high part.
Gadi Haber323f2e12017-10-24 20:19:47 +0000114
115def : WriteRes<WriteLEA, [BWPort15]>; // LEA instructions can't fold loads.
116
Craig Topperb7baa352018-04-08 17:53:18 +0000117defm : BWWriteResPair<WriteCMOV, [BWPort06], 1>; // Conditional move.
118def : WriteRes<WriteSETCC, [BWPort06]>; // Setcc.
119def : WriteRes<WriteSETCCStore, [BWPort06,BWPort4,BWPort237]> {
120 let Latency = 2;
121 let NumMicroOps = 3;
122}
123
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000124// Bit counts.
125defm : BWWriteResPair<WriteBitScan, [BWPort1], 3>;
126defm : BWWriteResPair<WriteLZCNT, [BWPort1], 3>;
127defm : BWWriteResPair<WriteTZCNT, [BWPort1], 3>;
128defm : BWWriteResPair<WritePOPCNT, [BWPort1], 3>;
129
Gadi Haber323f2e12017-10-24 20:19:47 +0000130// Integer shifts and rotates.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000131defm : BWWriteResPair<WriteShift, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000132
Craig Topper89310f52018-03-29 20:41:39 +0000133// BMI1 BEXTR, BMI2 BZHI
134defm : BWWriteResPair<WriteBEXTR, [BWPort06,BWPort15], 2, [1,1], 2>;
135defm : BWWriteResPair<WriteBZHI, [BWPort15], 1>;
136
Gadi Haber323f2e12017-10-24 20:19:47 +0000137// Loads, stores, and moves, not folded with other operations.
138def : WriteRes<WriteLoad, [BWPort23]> { let Latency = 5; }
139def : WriteRes<WriteStore, [BWPort237, BWPort4]>;
140def : WriteRes<WriteMove, [BWPort0156]>;
141
142// Idioms that clear a register, like xorps %xmm0, %xmm0.
143// These can often bypass execution ports completely.
144def : WriteRes<WriteZero, []>;
145
Sanjoy Das1074eb22017-12-12 19:11:31 +0000146// Treat misc copies as a move.
147def : InstRW<[WriteMove], (instrs COPY)>;
148
Gadi Haber323f2e12017-10-24 20:19:47 +0000149// Branches don't produce values, so they have no latency, but they still
150// consume resources. Indirect branches can fold loads.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000151defm : BWWriteResPair<WriteJump, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000152
153// Floating point. This covers both scalar and vector operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000154def : WriteRes<WriteFLoad, [BWPort23]> { let Latency = 5; }
155def : WriteRes<WriteFStore, [BWPort237, BWPort4]>;
156def : WriteRes<WriteFMove, [BWPort5]>;
157
Simon Pilgrim21caf012018-05-01 18:22:53 +0000158defm : BWWriteResPair<WriteFAdd, [BWPort1], 3, [1], 1, 5>; // Floating point add/sub.
Clement Courbet0f1da8f2018-05-02 13:54:38 +0000159defm : BWWriteResPair<WriteFAddY, [BWPort1], 3, [1], 1, 6>; // Floating point add/sub (YMM/ZMM).
Simon Pilgrim21caf012018-05-01 18:22:53 +0000160defm : BWWriteResPair<WriteFCmp, [BWPort1], 3, [1], 1, 5>; // Floating point compare.
Clement Courbet0f1da8f2018-05-02 13:54:38 +0000161defm : BWWriteResPair<WriteFCmpY, [BWPort1], 3, [1], 1, 6>; // Floating point compare (YMM/ZMM).
Simon Pilgrim21caf012018-05-01 18:22:53 +0000162defm : BWWriteResPair<WriteFCom, [BWPort1], 3>; // Floating point compare to flags.
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000163defm : BWWriteResPair<WriteFMul, [BWPort01], 3, [1], 1, 5>; // Floating point multiplication.
164defm : BWWriteResPair<WriteFMulY, [BWPort01], 3, [1], 1, 6>; // Floating point multiplication (YMM/ZMM).
Simon Pilgrim21caf012018-05-01 18:22:53 +0000165defm : BWWriteResPair<WriteFDiv, [BWPort0], 12, [1], 1, 5>; // 10-14 cycles. // Floating point division.
166defm : BWWriteResPair<WriteFDivY, [BWPort0], 12, [1], 1, 7>; // 10-14 cycles. // Floating point division (YMM/ZMM).
Simon Pilgrimc7088682018-05-01 18:06:07 +0000167defm : BWWriteResPair<WriteFSqrt, [BWPort0], 15, [1], 1, 5>; // Floating point square root.
168defm : BWWriteResPair<WriteFSqrtY, [BWPort0], 15, [1], 1, 7>; // Floating point square root (YMM/ZMM).
169defm : BWWriteResPair<WriteFRcp, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal estimate.
170defm : BWWriteResPair<WriteFRcpY, [BWPort0], 5, [1], 1, 7>; // Floating point reciprocal estimate (YMM/ZMM).
171defm : BWWriteResPair<WriteFRsqrt, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal square root estimate.
172defm : BWWriteResPair<WriteFRsqrtY,[BWPort0], 5, [1], 1, 7>; // Floating point reciprocal square root estimate (YMM/ZMM).
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000173defm : BWWriteResPair<WriteFMA, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add.
174defm : BWWriteResPair<WriteFMAS, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add (Scalar).
175defm : BWWriteResPair<WriteFMAY, [BWPort01], 5, [1], 1, 6>; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000176defm : BWWriteResPair<WriteFSign, [BWPort5], 1>; // Floating point fabs/fchs.
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000177defm : BWWriteResPair<WriteFLogic, [BWPort5], 1, [1], 1, 5>; // Floating point and/or/xor logicals.
178defm : BWWriteResPair<WriteFLogicY, [BWPort5], 1, [1], 1, 6>; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000179defm : BWWriteResPair<WriteFShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector shuffles.
180defm : BWWriteResPair<WriteFShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000181defm : BWWriteResPair<WriteFVarShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector variable shuffles.
182defm : BWWriteResPair<WriteFVarShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
183defm : BWWriteResPair<WriteFBlend, [BWPort015], 1, [1], 1, 5>; // Floating point vector blends.
184defm : BWWriteResPair<WriteFBlendY, [BWPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000185defm : BWWriteResPair<WriteFVarBlend, [BWPort5], 2, [2], 2, 5>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000186defm : BWWriteResPair<WriteFVarBlendY, [BWPort5], 2, [2], 2, 6>; // Fp vector variable blends.
Gadi Haber323f2e12017-10-24 20:19:47 +0000187
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000188def : WriteRes<WriteCvtF2FSt, [BWPort1,BWPort4,BWPort237]> {
189 let Latency = 4;
190 let NumMicroOps = 3;
191 let ResourceCycles = [1,1,1];
192}
193
Gadi Haber323f2e12017-10-24 20:19:47 +0000194// FMA Scheduling helper class.
195// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
196
197// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000198def : WriteRes<WriteVecLoad, [BWPort23]> { let Latency = 5; }
199def : WriteRes<WriteVecStore, [BWPort237, BWPort4]>;
200def : WriteRes<WriteVecMove, [BWPort015]>;
201
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000202defm : BWWriteResPair<WriteVecALU, [BWPort15], 1>; // Vector integer ALU op, no logicals.
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000203defm : BWWriteResPair<WriteVecLogic, [BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
204defm : BWWriteResPair<WriteVecLogicY,[BWPort015], 1, [1], 1, 6>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000205defm : BWWriteResPair<WriteVecShift, [BWPort0], 1>; // Vector integer shifts.
206defm : BWWriteResPair<WriteVecIMul, [BWPort0], 5>; // Vector integer multiply.
Craig Topper13a0f832018-03-31 04:54:32 +0000207defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // PMULLD
Simon Pilgrim819f2182018-05-02 17:58:50 +0000208defm : BWWriteResPair<WriteShuffle, [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000209defm : BWWriteResPair<WriteShuffleY, [BWPort5], 1, [1], 1, 6>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000210defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000211defm : BWWriteResPair<WriteVarShuffleY,[BWPort5], 1, [1], 1, 6>; // Vector variable shuffles (YMM/ZMM).
212defm : BWWriteResPair<WriteBlend, [BWPort5], 1, [1], 1, 5>; // Vector blends.
213defm : BWWriteResPair<WriteBlendY, [BWPort5], 1, [1], 1, 6>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000214defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000215defm : BWWriteResPair<WriteVarBlendY, [BWPort5], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000216defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim27bc83e2018-04-24 18:49:25 +0000217defm : BWWriteResPair<WritePSADBW, [BWPort0], 5>; // Vector PSADBW.
218defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000219
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000220// Vector insert/extract operations.
221def : WriteRes<WriteVecInsert, [BWPort5]> {
222 let Latency = 2;
223 let NumMicroOps = 2;
224 let ResourceCycles = [2];
225}
226def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
227 let Latency = 6;
228 let NumMicroOps = 2;
229}
230
231def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
232 let Latency = 2;
233 let NumMicroOps = 2;
234}
235def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
236 let Latency = 2;
237 let NumMicroOps = 3;
238}
239
Gadi Haber323f2e12017-10-24 20:19:47 +0000240// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000241defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
242defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
243defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000244
245// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000246
Gadi Haber323f2e12017-10-24 20:19:47 +0000247// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000248def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000249 let Latency = 11;
250 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000251 let ResourceCycles = [3];
252}
253def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000254 let Latency = 16;
255 let NumMicroOps = 4;
256 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000257}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000258
259// Packed Compare Explicit Length Strings, Return Mask
260def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
261 let Latency = 19;
262 let NumMicroOps = 9;
263 let ResourceCycles = [4,3,1,1];
264}
265def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
266 let Latency = 24;
267 let NumMicroOps = 10;
268 let ResourceCycles = [4,3,1,1,1];
269}
270
271// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000272def : WriteRes<WritePCmpIStrI, [BWPort0]> {
273 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000274 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000275 let ResourceCycles = [3];
276}
277def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000278 let Latency = 16;
279 let NumMicroOps = 4;
280 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000281}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000282
283// Packed Compare Explicit Length Strings, Return Index
284def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
285 let Latency = 18;
286 let NumMicroOps = 8;
287 let ResourceCycles = [4,3,1];
288}
289def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
290 let Latency = 23;
291 let NumMicroOps = 9;
292 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000293}
294
Simon Pilgrima2f26782018-03-27 20:38:54 +0000295// MOVMSK Instructions.
296def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
297def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
298def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
299
Gadi Haber323f2e12017-10-24 20:19:47 +0000300// AES instructions.
301def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
302 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000303 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000304 let ResourceCycles = [1];
305}
306def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000307 let Latency = 12;
308 let NumMicroOps = 2;
309 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000310}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000311
Gadi Haber323f2e12017-10-24 20:19:47 +0000312def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
313 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000314 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000315 let ResourceCycles = [2];
316}
317def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000318 let Latency = 19;
319 let NumMicroOps = 3;
320 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000321}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000322
323def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
324 let Latency = 29;
325 let NumMicroOps = 11;
326 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000327}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000328def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
329 let Latency = 33;
330 let NumMicroOps = 11;
331 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000332}
333
334// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000335defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000336
337// Catch-all for expensive system instructions.
338def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
339
340// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000341defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
342defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
343defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
344defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
345defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 2, [2, 1]>; // Variable vector shifts.
Gadi Haber323f2e12017-10-24 20:19:47 +0000346
347// Old microcoded instructions that nobody use.
348def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
349
350// Fence instructions.
351def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
352
Craig Topper05242bf2018-04-21 18:07:36 +0000353// Load/store MXCSR.
354def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
355def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
356
Gadi Haber323f2e12017-10-24 20:19:47 +0000357// Nop, not very useful expect it provides a model for nops!
358def : WriteRes<WriteNop, []>;
359
360////////////////////////////////////////////////////////////////////////////////
361// Horizontal add/sub instructions.
362////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000363
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000364defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000365defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000366defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000367
368// Remaining instrs.
369
370def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
371 let Latency = 1;
372 let NumMicroOps = 1;
373 let ResourceCycles = [1];
374}
Craig Topper5a69a002018-03-21 06:28:42 +0000375def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
376 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000377 "(V?)MOVPDI2DIrr",
378 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000379 "VPSLLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000380 "VPSRLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000381 "VTESTPD(Y?)rr",
382 "VTESTPS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000383
384def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
385 let Latency = 1;
386 let NumMicroOps = 1;
387 let ResourceCycles = [1];
388}
Craig Topper5a69a002018-03-21 06:28:42 +0000389def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
390 "COM_FST0r",
391 "UCOM_FPr",
392 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000393
394def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
395 let Latency = 1;
396 let NumMicroOps = 1;
397 let ResourceCycles = [1];
398}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000399def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000400 "MMX_MOVD64to64rr",
401 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000402 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000403 "(V?)MOVDI2PDIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000404
405def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
406 let Latency = 1;
407 let NumMicroOps = 1;
408 let ResourceCycles = [1];
409}
410def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
411
412def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
413 let Latency = 1;
414 let NumMicroOps = 1;
415 let ResourceCycles = [1];
416}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000417def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000418
419def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
420 let Latency = 1;
421 let NumMicroOps = 1;
422 let ResourceCycles = [1];
423}
Craig Topperfbe31322018-04-05 21:56:19 +0000424def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000425def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
426 "ADC(16|32|64)i",
427 "ADC(8|16|32|64)rr",
428 "ADCX(32|64)rr",
429 "ADOX(32|64)rr",
430 "BT(16|32|64)ri8",
431 "BT(16|32|64)rr",
432 "BTC(16|32|64)ri8",
433 "BTC(16|32|64)rr",
434 "BTR(16|32|64)ri8",
435 "BTR(16|32|64)rr",
436 "BTS(16|32|64)ri8",
437 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000438 "SBB(16|32|64)ri",
439 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000440 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000441
442def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
443 let Latency = 1;
444 let NumMicroOps = 1;
445 let ResourceCycles = [1];
446}
Craig Topper5a69a002018-03-21 06:28:42 +0000447def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
448 "BLSI(32|64)rr",
449 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000450 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000451
452def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
453 let Latency = 1;
454 let NumMicroOps = 1;
455 let ResourceCycles = [1];
456}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000457def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000458 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000459
460def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
461 let Latency = 1;
462 let NumMicroOps = 1;
463 let ResourceCycles = [1];
464}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000465def: InstRW<[BWWriteResGroup9], (instrs LAHF, SAHF)>; // TODO: This doesnt match Agner's data
466def: InstRW<[BWWriteResGroup9], (instregex "NOOP",
Craig Topper5a69a002018-03-21 06:28:42 +0000467 "SGDT64m",
468 "SIDT64m",
Craig Topper5a69a002018-03-21 06:28:42 +0000469 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000470 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000471 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000472
473def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
474 let Latency = 1;
475 let NumMicroOps = 2;
476 let ResourceCycles = [1,1];
477}
Craig Topper5a69a002018-03-21 06:28:42 +0000478def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
479 "MMX_MOVD64from64rm",
480 "MMX_MOVD64mr",
481 "MMX_MOVNTQmr",
482 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000483 "MOVNTI_64mr",
484 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000485 "ST_FP(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000486 "VEXTRACTF128mr",
487 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000488 "(V?)MOVAPD(Y?)mr",
489 "(V?)MOVAPS(Y?)mr",
490 "(V?)MOVDQA(Y?)mr",
491 "(V?)MOVDQU(Y?)mr",
492 "(V?)MOVHPDmr",
493 "(V?)MOVHPSmr",
494 "(V?)MOVLPDmr",
495 "(V?)MOVLPSmr",
496 "(V?)MOVNTDQ(V?)mr",
497 "(V?)MOVNTPD(V?)mr",
498 "(V?)MOVNTPS(V?)mr",
499 "(V?)MOVPDI2DImr",
500 "(V?)MOVPQI2QImr",
501 "(V?)MOVPQIto64mr",
502 "(V?)MOVSDmr",
503 "(V?)MOVSSmr",
504 "(V?)MOVUPD(Y?)mr",
505 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000506
Gadi Haber323f2e12017-10-24 20:19:47 +0000507def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
508 let Latency = 2;
509 let NumMicroOps = 2;
510 let ResourceCycles = [2];
511}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000512def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000513
514def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
515 let Latency = 2;
516 let NumMicroOps = 2;
517 let ResourceCycles = [2];
518}
Craig Topper5a69a002018-03-21 06:28:42 +0000519def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
520 "ROL(8|16|32|64)ri",
521 "ROR(8|16|32|64)r1",
522 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000523
524def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
525 let Latency = 2;
526 let NumMicroOps = 2;
527 let ResourceCycles = [2];
528}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000529def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
530 MFENCE,
531 WAIT,
532 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000533
534def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
535 let Latency = 2;
536 let NumMicroOps = 2;
537 let ResourceCycles = [1,1];
538}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000539def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000540 "(V?)CVTPS2PDrr",
541 "(V?)CVTSS2SDrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000542 "(V?)PSLLDrr",
543 "(V?)PSLLQrr",
544 "(V?)PSLLWrr",
545 "(V?)PSRADrr",
546 "(V?)PSRAWrr",
547 "(V?)PSRLDrr",
548 "(V?)PSRLQrr",
549 "(V?)PSRLWrr",
550 "(V?)PTESTrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000551
552def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
553 let Latency = 2;
554 let NumMicroOps = 2;
555 let ResourceCycles = [1,1];
556}
557def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
558
559def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
560 let Latency = 2;
561 let NumMicroOps = 2;
562 let ResourceCycles = [1,1];
563}
564def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
565
566def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
567 let Latency = 2;
568 let NumMicroOps = 2;
569 let ResourceCycles = [1,1];
570}
571def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
572
573def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
574 let Latency = 2;
575 let NumMicroOps = 2;
576 let ResourceCycles = [1,1];
577}
Craig Topper498875f2018-04-04 17:54:19 +0000578def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
579
580def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
581 let Latency = 1;
582 let NumMicroOps = 1;
583 let ResourceCycles = [1];
584}
585def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000586
587def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
588 let Latency = 2;
589 let NumMicroOps = 2;
590 let ResourceCycles = [1,1];
591}
Craig Topper2d451e72018-03-18 08:38:06 +0000592def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000593def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000594def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
595 "ADC8ri",
596 "CMOV(A|BE)(16|32|64)rr",
597 "SBB8i8",
598 "SBB8ri",
599 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000600
Gadi Haber323f2e12017-10-24 20:19:47 +0000601def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
602 let Latency = 2;
603 let NumMicroOps = 3;
604 let ResourceCycles = [1,1,1];
605}
606def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
607
Gadi Haber323f2e12017-10-24 20:19:47 +0000608def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
609 let Latency = 2;
610 let NumMicroOps = 3;
611 let ResourceCycles = [1,1,1];
612}
613def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
614
615def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
616 let Latency = 2;
617 let NumMicroOps = 3;
618 let ResourceCycles = [1,1,1];
619}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000620def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
621 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000622def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000623 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000624
Gadi Haber323f2e12017-10-24 20:19:47 +0000625def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
626 let Latency = 3;
627 let NumMicroOps = 1;
628 let ResourceCycles = [1];
629}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000630def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000631 "PDEP(32|64)rr",
632 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000633 "SHLD(16|32|64)rri8",
634 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000635 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000636
637def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000638 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000639 let NumMicroOps = 2;
640 let ResourceCycles = [1,1];
641}
Clement Courbet327fac42018-03-07 08:14:02 +0000642def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000643
644def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
645 let Latency = 3;
646 let NumMicroOps = 1;
647 let ResourceCycles = [1];
648}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000649def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
650 "VPBROADCASTWrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000651 "VPMOVSXBDYrr",
652 "VPMOVSXBQYrr",
653 "VPMOVSXBWYrr",
654 "VPMOVSXDQYrr",
655 "VPMOVSXWDYrr",
656 "VPMOVSXWQYrr",
657 "VPMOVZXBDYrr",
658 "VPMOVZXBQYrr",
659 "VPMOVZXBWYrr",
660 "VPMOVZXDQYrr",
661 "VPMOVZXWDYrr",
662 "VPMOVZXWQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000663
Gadi Haber323f2e12017-10-24 20:19:47 +0000664def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000665 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000666 let NumMicroOps = 3;
667 let ResourceCycles = [3];
668}
Craig Topperb5f26592018-04-19 18:00:17 +0000669def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
670 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
671 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000672
673def BWWriteResGroup31 : SchedWriteRes<[BWPort0,BWPort5]> {
674 let Latency = 3;
675 let NumMicroOps = 3;
676 let ResourceCycles = [2,1];
677}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000678def: InstRW<[BWWriteResGroup31], (instregex "VPSLLVD(Y?)rr",
679 "VPSRAVD(Y?)rr",
680 "VPSRLVD(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000681
Gadi Haber323f2e12017-10-24 20:19:47 +0000682def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
683 let Latency = 3;
684 let NumMicroOps = 3;
685 let ResourceCycles = [2,1];
686}
Craig Topper5a69a002018-03-21 06:28:42 +0000687def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
688 "MMX_PACKSSWBirr",
689 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000690
691def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
692 let Latency = 3;
693 let NumMicroOps = 3;
694 let ResourceCycles = [1,2];
695}
696def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
697
698def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
699 let Latency = 3;
700 let NumMicroOps = 3;
701 let ResourceCycles = [1,2];
702}
Craig Topper5a69a002018-03-21 06:28:42 +0000703def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
704 "RCL(8|16|32|64)ri",
705 "RCR(8|16|32|64)r1",
706 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000707
708def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
709 let Latency = 3;
710 let NumMicroOps = 3;
711 let ResourceCycles = [2,1];
712}
Craig Topper5a69a002018-03-21 06:28:42 +0000713def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
714 "ROR(8|16|32|64)rCL",
715 "SAR(8|16|32|64)rCL",
716 "SHL(8|16|32|64)rCL",
717 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000718
719def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
720 let Latency = 3;
721 let NumMicroOps = 4;
722 let ResourceCycles = [1,1,1,1];
723}
724def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
725
726def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
727 let Latency = 3;
728 let NumMicroOps = 4;
729 let ResourceCycles = [1,1,1,1];
730}
Craig Topper5a69a002018-03-21 06:28:42 +0000731def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
732 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000733
734def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
735 let Latency = 4;
736 let NumMicroOps = 2;
737 let ResourceCycles = [1,1];
738}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000739def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
740 "(V?)CVTSD2SIrr",
741 "(V?)CVTSS2SI64rr",
742 "(V?)CVTSS2SIrr",
743 "(V?)CVTTSD2SI64rr",
744 "(V?)CVTTSD2SIrr",
745 "(V?)CVTTSS2SI64rr",
746 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000747
748def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
749 let Latency = 4;
750 let NumMicroOps = 2;
751 let ResourceCycles = [1,1];
752}
Craig Topper5a69a002018-03-21 06:28:42 +0000753def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr",
754 "VPSLLDYrr",
755 "VPSLLQYrr",
756 "VPSLLWYrr",
757 "VPSRADYrr",
758 "VPSRAWYrr",
759 "VPSRLDYrr",
760 "VPSRLQYrr",
761 "VPSRLWYrr",
762 "VPTESTYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000763
764def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
765 let Latency = 4;
766 let NumMicroOps = 2;
767 let ResourceCycles = [1,1];
768}
769def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
770
771def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
772 let Latency = 4;
773 let NumMicroOps = 2;
774 let ResourceCycles = [1,1];
775}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000776def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000777def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000778 "MMX_CVTPI2PDirr",
779 "MMX_CVTPS2PIirr",
780 "MMX_CVTTPD2PIirr",
781 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000782 "(V?)CVTDQ2PDrr",
783 "(V?)CVTPD2DQrr",
784 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000785 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000786 "(V?)CVTSD2SSrr",
787 "(V?)CVTSI642SDrr",
788 "(V?)CVTSI2SDrr",
789 "(V?)CVTSI2SSrr",
790 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000791
792def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
793 let Latency = 4;
794 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000795 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000796}
Craig Topper5a69a002018-03-21 06:28:42 +0000797def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000798
799def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
800 let Latency = 4;
801 let NumMicroOps = 3;
802 let ResourceCycles = [1,1,1];
803}
804def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
805
806def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
807 let Latency = 4;
808 let NumMicroOps = 3;
809 let ResourceCycles = [1,1,1];
810}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000811def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
812 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000813
814def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
815 let Latency = 4;
816 let NumMicroOps = 4;
817 let ResourceCycles = [4];
818}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000819def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000820
821def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
822 let Latency = 4;
823 let NumMicroOps = 4;
824 let ResourceCycles = [1,3];
825}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000826def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000827
828def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
829 let Latency = 5;
830 let NumMicroOps = 1;
831 let ResourceCycles = [1];
832}
Simon Pilgrima53d3302018-05-02 16:16:24 +0000833def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr",
834 "MUL_FPrST0",
835 "MUL_FST0r",
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000836 "MUL_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000837
Gadi Haber323f2e12017-10-24 20:19:47 +0000838def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
839 let Latency = 5;
840 let NumMicroOps = 1;
841 let ResourceCycles = [1];
842}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000843def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000844 "MOVSX(16|32|64)rm32",
845 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000846 "MOVZX(16|32|64)rm16",
847 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000848 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000849 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000850 "(V?)MOVSHDUPrm",
851 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000852 "VPBROADCASTDrm",
853 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000854
855def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
856 let Latency = 5;
857 let NumMicroOps = 3;
858 let ResourceCycles = [1,2];
859}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000860def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000861
862def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
863 let Latency = 5;
864 let NumMicroOps = 3;
865 let ResourceCycles = [1,1,1];
866}
867def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
868
869def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000870 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000871 let NumMicroOps = 3;
872 let ResourceCycles = [1,1,1];
873}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000874def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000875
876def BWWriteResGroup53 : SchedWriteRes<[BWPort0,BWPort4,BWPort237,BWPort15]> {
877 let Latency = 5;
878 let NumMicroOps = 4;
879 let ResourceCycles = [1,1,1,1];
880}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000881def: InstRW<[BWWriteResGroup53], (instregex "VMASKMOVPD(Y?)mr",
882 "VMASKMOVPS(Y?)mr",
883 "VPMASKMOVD(Y?)mr",
884 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000885
886def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
887 let Latency = 5;
888 let NumMicroOps = 5;
889 let ResourceCycles = [1,4];
890}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000891def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000892
893def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
894 let Latency = 5;
895 let NumMicroOps = 5;
896 let ResourceCycles = [1,4];
897}
898def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
899
900def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
901 let Latency = 5;
902 let NumMicroOps = 5;
903 let ResourceCycles = [2,3];
904}
Craig Topper5a69a002018-03-21 06:28:42 +0000905def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000906
907def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
908 let Latency = 5;
909 let NumMicroOps = 6;
910 let ResourceCycles = [1,1,4];
911}
Craig Topper5a69a002018-03-21 06:28:42 +0000912def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000913
914def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
915 let Latency = 6;
916 let NumMicroOps = 1;
917 let ResourceCycles = [1];
918}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000919def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000920 "VBROADCASTF128",
921 "VBROADCASTI128",
922 "VBROADCASTSDYrm",
923 "VBROADCASTSSYrm",
924 "VLDDQUYrm",
925 "VMOVAPDYrm",
926 "VMOVAPSYrm",
927 "VMOVDDUPYrm",
928 "VMOVDQAYrm",
929 "VMOVDQUYrm",
930 "VMOVNTDQAYrm",
931 "VMOVSHDUPYrm",
932 "VMOVSLDUPYrm",
933 "VMOVUPDYrm",
934 "VMOVUPSYrm",
935 "VPBROADCASTDYrm",
936 "VPBROADCASTQYrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000937 "(V?)ROUNDPD(Y?)r",
938 "(V?)ROUNDPS(Y?)r",
939 "(V?)ROUNDSDr",
940 "(V?)ROUNDSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000941
942def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
943 let Latency = 6;
944 let NumMicroOps = 2;
945 let ResourceCycles = [1,1];
946}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000947def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000948 "(V?)CVTPS2PDrm",
949 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000950 "VPSLLVQrm",
951 "VPSRLVQrm",
952 "VTESTPDrm",
953 "VTESTPSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000954
955def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
956 let Latency = 6;
957 let NumMicroOps = 2;
958 let ResourceCycles = [1,1];
959}
Craig Topper5a69a002018-03-21 06:28:42 +0000960def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
961 "VCVTPD2DQYrr",
962 "VCVTPD2PSYrr",
963 "VCVTPS2PHYrr",
964 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000965
Gadi Haber323f2e12017-10-24 20:19:47 +0000966def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
967 let Latency = 6;
968 let NumMicroOps = 2;
969 let ResourceCycles = [1,1];
970}
Craig Topper5a69a002018-03-21 06:28:42 +0000971def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
972 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000973
974def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
975 let Latency = 6;
976 let NumMicroOps = 2;
977 let ResourceCycles = [1,1];
978}
Craig Topperdfccafe2018-04-18 06:41:25 +0000979def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +0000980def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
981 ADCX32rm, ADCX64rm,
982 ADOX32rm, ADOX64rm,
983 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000984
985def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
986 let Latency = 6;
987 let NumMicroOps = 2;
988 let ResourceCycles = [1,1];
989}
Craig Topper5a69a002018-03-21 06:28:42 +0000990def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
991 "BLSI(32|64)rm",
992 "BLSMSK(32|64)rm",
993 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +0000994 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000995
996def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
997 let Latency = 6;
998 let NumMicroOps = 2;
999 let ResourceCycles = [1,1];
1000}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001001def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +00001002 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001003 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001004
1005def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1006 let Latency = 6;
1007 let NumMicroOps = 2;
1008 let ResourceCycles = [1,1];
1009}
Craig Topper2d451e72018-03-18 08:38:06 +00001010def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001011def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001012
1013def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1014 let Latency = 6;
1015 let NumMicroOps = 4;
1016 let ResourceCycles = [1,1,2];
1017}
Craig Topper5a69a002018-03-21 06:28:42 +00001018def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1019 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001020
1021def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1022 let Latency = 6;
1023 let NumMicroOps = 4;
1024 let ResourceCycles = [1,1,1,1];
1025}
1026def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1027
1028def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1029 let Latency = 6;
1030 let NumMicroOps = 4;
1031 let ResourceCycles = [1,1,1,1];
1032}
Craig Topper5a69a002018-03-21 06:28:42 +00001033def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1034 "BTR(16|32|64)mi8",
1035 "BTS(16|32|64)mi8",
1036 "SAR(8|16|32|64)m1",
1037 "SAR(8|16|32|64)mi",
1038 "SHL(8|16|32|64)m1",
1039 "SHL(8|16|32|64)mi",
1040 "SHR(8|16|32|64)m1",
1041 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001042
1043def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1044 let Latency = 6;
1045 let NumMicroOps = 4;
1046 let ResourceCycles = [1,1,1,1];
1047}
Craig Topperf0d04262018-04-06 16:16:48 +00001048def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1049 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001050
1051def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1052 let Latency = 6;
1053 let NumMicroOps = 6;
1054 let ResourceCycles = [1,5];
1055}
1056def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1057
Gadi Haber323f2e12017-10-24 20:19:47 +00001058def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1059 let Latency = 7;
1060 let NumMicroOps = 2;
1061 let ResourceCycles = [1,1];
1062}
Craig Topper5a69a002018-03-21 06:28:42 +00001063def: InstRW<[BWWriteResGroup73], (instregex "VPSLLDYrm",
1064 "VPSLLQYrm",
1065 "VPSLLVQYrm",
1066 "VPSLLWYrm",
1067 "VPSRADYrm",
1068 "VPSRAWYrm",
1069 "VPSRLDYrm",
1070 "VPSRLQYrm",
1071 "VPSRLVQYrm",
1072 "VPSRLWYrm",
1073 "VTESTPDYrm",
1074 "VTESTPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001075
1076def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1077 let Latency = 7;
1078 let NumMicroOps = 2;
1079 let ResourceCycles = [1,1];
1080}
Craig Topper5a69a002018-03-21 06:28:42 +00001081def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1082 "FCOM64m",
1083 "FCOMP32m",
1084 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001085
Gadi Haber323f2e12017-10-24 20:19:47 +00001086def BWWriteResGroup76 : SchedWriteRes<[BWPort23,BWPort15]> {
1087 let Latency = 7;
1088 let NumMicroOps = 2;
1089 let ResourceCycles = [1,1];
1090}
Craig Topper5a69a002018-03-21 06:28:42 +00001091def: InstRW<[BWWriteResGroup76], (instregex "VPABSBYrm",
1092 "VPABSDYrm",
1093 "VPABSWYrm",
1094 "VPADDBYrm",
1095 "VPADDDYrm",
1096 "VPADDQYrm",
1097 "VPADDSBYrm",
1098 "VPADDSWYrm",
1099 "VPADDUSBYrm",
1100 "VPADDUSWYrm",
1101 "VPADDWYrm",
1102 "VPAVGBYrm",
1103 "VPAVGWYrm",
1104 "VPCMPEQBYrm",
1105 "VPCMPEQDYrm",
1106 "VPCMPEQQYrm",
1107 "VPCMPEQWYrm",
1108 "VPCMPGTBYrm",
1109 "VPCMPGTDYrm",
1110 "VPCMPGTWYrm",
1111 "VPMAXSBYrm",
1112 "VPMAXSDYrm",
1113 "VPMAXSWYrm",
1114 "VPMAXUBYrm",
1115 "VPMAXUDYrm",
1116 "VPMAXUWYrm",
1117 "VPMINSBYrm",
1118 "VPMINSDYrm",
1119 "VPMINSWYrm",
1120 "VPMINUBYrm",
1121 "VPMINUDYrm",
1122 "VPMINUWYrm",
1123 "VPSIGNBYrm",
1124 "VPSIGNDYrm",
1125 "VPSIGNWYrm",
1126 "VPSUBBYrm",
1127 "VPSUBDYrm",
1128 "VPSUBQYrm",
1129 "VPSUBSBYrm",
1130 "VPSUBSWYrm",
1131 "VPSUBUSBYrm",
1132 "VPSUBUSWYrm",
1133 "VPSUBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001134
1135def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1136 let Latency = 7;
1137 let NumMicroOps = 2;
1138 let ResourceCycles = [1,1];
1139}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001140def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001141
Gadi Haber323f2e12017-10-24 20:19:47 +00001142def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1143 let Latency = 7;
1144 let NumMicroOps = 3;
1145 let ResourceCycles = [2,1];
1146}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001147def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001148 "MMX_PACKSSWBirm",
1149 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001150 "VMASKMOVPDrm",
1151 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001152 "VPMASKMOVDrm",
1153 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001154
1155def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1156 let Latency = 7;
1157 let NumMicroOps = 3;
1158 let ResourceCycles = [1,2];
1159}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001160def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1161 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001162
1163def BWWriteResGroup81 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1164 let Latency = 7;
1165 let NumMicroOps = 3;
1166 let ResourceCycles = [1,1,1];
1167}
Simon Pilgrimd5ada492018-04-29 15:33:15 +00001168def: InstRW<[BWWriteResGroup81], (instregex "(V?)PSLLDrm",
1169 "(V?)PSLLQrm",
1170 "(V?)PSLLWrm",
1171 "(V?)PSRADrm",
1172 "(V?)PSRAWrm",
1173 "(V?)PSRLDrm",
1174 "(V?)PSRLQrm",
1175 "(V?)PSRLWrm",
1176 "(V?)PTESTrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001177
1178def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1179 let Latency = 7;
1180 let NumMicroOps = 3;
1181 let ResourceCycles = [1,1,1];
1182}
1183def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1184
Gadi Haber323f2e12017-10-24 20:19:47 +00001185def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1186 let Latency = 7;
1187 let NumMicroOps = 3;
1188 let ResourceCycles = [1,1,1];
1189}
Craig Topper5a69a002018-03-21 06:28:42 +00001190def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1191 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001192
Gadi Haber323f2e12017-10-24 20:19:47 +00001193def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1194 let Latency = 7;
1195 let NumMicroOps = 3;
1196 let ResourceCycles = [1,1,1];
1197}
Craig Topperf4cd9082018-01-19 05:47:32 +00001198def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001199
1200def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1201 let Latency = 7;
1202 let NumMicroOps = 5;
1203 let ResourceCycles = [1,1,1,2];
1204}
Craig Topper5a69a002018-03-21 06:28:42 +00001205def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1206 "ROL(8|16|32|64)mi",
1207 "ROR(8|16|32|64)m1",
1208 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001209
1210def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1211 let Latency = 7;
1212 let NumMicroOps = 5;
1213 let ResourceCycles = [1,1,1,2];
1214}
Craig Topper5a69a002018-03-21 06:28:42 +00001215def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001216
1217def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1218 let Latency = 7;
1219 let NumMicroOps = 5;
1220 let ResourceCycles = [1,1,1,1,1];
1221}
Craig Topper5a69a002018-03-21 06:28:42 +00001222def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1223 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001224
1225def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1226 let Latency = 7;
1227 let NumMicroOps = 7;
1228 let ResourceCycles = [2,2,1,2];
1229}
Craig Topper2d451e72018-03-18 08:38:06 +00001230def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001231
1232def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1233 let Latency = 8;
1234 let NumMicroOps = 2;
1235 let ResourceCycles = [1,1];
1236}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001237def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001238 "PDEP(32|64)rm",
1239 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001240 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001241
1242def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001243 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001244 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001245 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001246}
Craig Topperf846e2d2018-04-19 05:34:05 +00001247def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001248
Craig Topperf846e2d2018-04-19 05:34:05 +00001249def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1250 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001251 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001252 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001253}
Craig Topper5a69a002018-03-21 06:28:42 +00001254def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001255
Gadi Haber323f2e12017-10-24 20:19:47 +00001256def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1257 let Latency = 8;
1258 let NumMicroOps = 2;
1259 let ResourceCycles = [1,1];
1260}
Craig Topper5a69a002018-03-21 06:28:42 +00001261def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1262 "VPMOVSXBQYrm",
1263 "VPMOVSXBWYrm",
1264 "VPMOVSXDQYrm",
1265 "VPMOVSXWDYrm",
1266 "VPMOVSXWQYrm",
1267 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001268
Gadi Haber323f2e12017-10-24 20:19:47 +00001269def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1270 let Latency = 8;
1271 let NumMicroOps = 3;
1272 let ResourceCycles = [2,1];
1273}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001274def: InstRW<[BWWriteResGroup94], (instregex "VMASKMOVPDYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001275 "VMASKMOVPSYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001276 "VPMASKMOVDYrm",
1277 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001278
1279def BWWriteResGroup95 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1280 let Latency = 8;
1281 let NumMicroOps = 4;
1282 let ResourceCycles = [2,1,1];
1283}
Craig Topper5a69a002018-03-21 06:28:42 +00001284def: InstRW<[BWWriteResGroup95], (instregex "VPSLLVDrm",
1285 "VPSRAVDrm",
1286 "VPSRLVDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001287
Gadi Haber323f2e12017-10-24 20:19:47 +00001288def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1289 let Latency = 8;
1290 let NumMicroOps = 5;
1291 let ResourceCycles = [1,1,1,2];
1292}
Craig Topper5a69a002018-03-21 06:28:42 +00001293def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1294 "RCL(8|16|32|64)mi",
1295 "RCR(8|16|32|64)m1",
1296 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001297
1298def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1299 let Latency = 8;
1300 let NumMicroOps = 5;
1301 let ResourceCycles = [1,1,2,1];
1302}
Craig Topper13a16502018-03-19 00:56:09 +00001303def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001304
1305def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1306 let Latency = 8;
1307 let NumMicroOps = 6;
1308 let ResourceCycles = [1,1,1,3];
1309}
Craig Topper9f834812018-04-01 21:54:24 +00001310def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001311
1312def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1313 let Latency = 8;
1314 let NumMicroOps = 6;
1315 let ResourceCycles = [1,1,1,2,1];
1316}
Craig Topper9f834812018-04-01 21:54:24 +00001317def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001318 "CMPXCHG(8|16|32|64)rm",
1319 "ROL(8|16|32|64)mCL",
1320 "SAR(8|16|32|64)mCL",
1321 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001322 "SHL(8|16|32|64)mCL",
1323 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001324def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1325 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001326
1327def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1328 let Latency = 9;
1329 let NumMicroOps = 2;
1330 let ResourceCycles = [1,1];
1331}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001332def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1333 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001334 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001335 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001336
1337def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1338 let Latency = 9;
1339 let NumMicroOps = 2;
1340 let ResourceCycles = [1,1];
1341}
Craig Topper5a69a002018-03-21 06:28:42 +00001342def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1343 "VPERM2I128rm",
1344 "VPERMDYrm",
1345 "VPERMPDYmi",
1346 "VPERMPSYrm",
1347 "VPERMQYmi",
1348 "VPMOVZXBDYrm",
1349 "VPMOVZXBQYrm",
1350 "VPMOVZXBWYrm",
1351 "VPMOVZXDQYrm",
1352 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001353
Gadi Haber323f2e12017-10-24 20:19:47 +00001354def BWWriteResGroup104 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1355 let Latency = 9;
1356 let NumMicroOps = 3;
1357 let ResourceCycles = [1,1,1];
1358}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001359def: InstRW<[BWWriteResGroup104], (instregex "(V?)DPPDrri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001360
1361def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1362 let Latency = 9;
1363 let NumMicroOps = 3;
1364 let ResourceCycles = [1,1,1];
1365}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001366def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1367 "(V?)CVTSD2SIrm",
1368 "(V?)CVTSS2SI64rm",
1369 "(V?)CVTSS2SIrm",
1370 "(V?)CVTTSD2SI64rm",
1371 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001372 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001373 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001374
1375def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1376 let Latency = 9;
1377 let NumMicroOps = 3;
1378 let ResourceCycles = [1,1,1];
1379}
1380def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1381
1382def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1383 let Latency = 9;
1384 let NumMicroOps = 3;
1385 let ResourceCycles = [1,1,1];
1386}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001387def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001388def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001389 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001390 "CVTTPD2DQrm",
1391 "MMX_CVTPD2PIirm",
1392 "MMX_CVTPI2PDirm",
1393 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001394 "(V?)CVTDQ2PDrm",
1395 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001396
1397def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1398 let Latency = 9;
1399 let NumMicroOps = 3;
1400 let ResourceCycles = [1,1,1];
1401}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001402def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1403 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001404
1405def BWWriteResGroup109 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1406 let Latency = 9;
1407 let NumMicroOps = 4;
1408 let ResourceCycles = [2,1,1];
1409}
Craig Topper5a69a002018-03-21 06:28:42 +00001410def: InstRW<[BWWriteResGroup109], (instregex "VPSLLVDYrm",
1411 "VPSRAVDYrm",
1412 "VPSRLVDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001413
1414def BWWriteResGroup110 : SchedWriteRes<[BWPort5,BWPort23,BWPort15]> {
1415 let Latency = 9;
1416 let NumMicroOps = 4;
1417 let ResourceCycles = [2,1,1];
1418}
Craig Topper5a69a002018-03-21 06:28:42 +00001419def: InstRW<[BWWriteResGroup110], (instregex "VPHADDDYrm",
1420 "VPHADDSWYrm",
1421 "VPHADDWYrm",
1422 "VPHSUBDYrm",
1423 "VPHSUBSWYrm",
1424 "VPHSUBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001425
1426def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1427 let Latency = 9;
1428 let NumMicroOps = 4;
1429 let ResourceCycles = [1,1,1,1];
1430}
Craig Topper5a69a002018-03-21 06:28:42 +00001431def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1432 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001433
1434def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1435 let Latency = 9;
1436 let NumMicroOps = 5;
1437 let ResourceCycles = [1,1,3];
1438}
1439def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1440
1441def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1442 let Latency = 9;
1443 let NumMicroOps = 5;
1444 let ResourceCycles = [1,2,1,1];
1445}
Craig Topper5a69a002018-03-21 06:28:42 +00001446def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1447 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001448
Gadi Haber323f2e12017-10-24 20:19:47 +00001449def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1450 let Latency = 10;
1451 let NumMicroOps = 2;
1452 let ResourceCycles = [1,1];
1453}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001454def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001455
Gadi Haber323f2e12017-10-24 20:19:47 +00001456def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1457 let Latency = 10;
1458 let NumMicroOps = 3;
1459 let ResourceCycles = [2,1];
1460}
Craig Topper5a69a002018-03-21 06:28:42 +00001461def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1462 "FICOM32m",
1463 "FICOMP16m",
1464 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001465
1466def BWWriteResGroup118 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1467 let Latency = 10;
1468 let NumMicroOps = 3;
1469 let ResourceCycles = [1,1,1];
1470}
1471def: InstRW<[BWWriteResGroup118], (instregex "VPTESTYrm")>;
1472
Gadi Haber323f2e12017-10-24 20:19:47 +00001473def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1474 let Latency = 10;
1475 let NumMicroOps = 4;
1476 let ResourceCycles = [1,1,1,1];
1477}
1478def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1479
1480def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001481 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001482 let NumMicroOps = 4;
1483 let ResourceCycles = [1,1,1,1];
1484}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001485def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001486
Craig Topper8104f262018-04-02 05:33:28 +00001487def BWWriteResGroup122 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001488 let Latency = 11;
1489 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001490 let ResourceCycles = [1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001491}
Craig Topper8104f262018-04-02 05:33:28 +00001492def: InstRW<[BWWriteResGroup122], (instregex "(V?)DIVPSrr")>;
1493
1494def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1495 let Latency = 11;
1496 let NumMicroOps = 1;
1497 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1498}
1499def: InstRW<[BWWriteResGroup122_1], (instregex "(V?)DIVSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001500
1501def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1502 let Latency = 11;
1503 let NumMicroOps = 2;
1504 let ResourceCycles = [1,1];
1505}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001506def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001507 "VPCMPGTQYrm",
1508 "VPMADDUBSWYrm",
1509 "VPMADDWDYrm",
1510 "VPMULDQYrm",
1511 "VPMULHRSWYrm",
1512 "VPMULHUWYrm",
1513 "VPMULHWYrm",
1514 "VPMULLWYrm",
1515 "VPMULUDQYrm",
1516 "VPSADBWYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001517
Gadi Haber323f2e12017-10-24 20:19:47 +00001518def BWWriteResGroup126 : SchedWriteRes<[BWPort0,BWPort015]> {
1519 let Latency = 11;
1520 let NumMicroOps = 3;
1521 let ResourceCycles = [2,1];
1522}
Craig Topper5a69a002018-03-21 06:28:42 +00001523def: InstRW<[BWWriteResGroup126], (instregex "VRCPPSYr",
1524 "VRSQRTPSYr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001525
1526def BWWriteResGroup127 : SchedWriteRes<[BWPort1,BWPort23]> {
1527 let Latency = 11;
1528 let NumMicroOps = 3;
1529 let ResourceCycles = [2,1];
1530}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001531def: InstRW<[BWWriteResGroup127], (instregex "(V?)ROUNDPDm",
1532 "(V?)ROUNDPSm",
1533 "(V?)ROUNDSDm",
1534 "(V?)ROUNDSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001535
1536def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1537 let Latency = 11;
1538 let NumMicroOps = 3;
1539 let ResourceCycles = [1,1,1];
1540}
1541def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1542
Gadi Haber323f2e12017-10-24 20:19:47 +00001543def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1544 let Latency = 11;
1545 let NumMicroOps = 6;
1546 let ResourceCycles = [1,1,1,1,2];
1547}
Craig Topper5a69a002018-03-21 06:28:42 +00001548def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1549 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001550
1551def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1552 let Latency = 11;
1553 let NumMicroOps = 7;
1554 let ResourceCycles = [2,2,3];
1555}
Craig Topper5a69a002018-03-21 06:28:42 +00001556def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1557 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001558
1559def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1560 let Latency = 11;
1561 let NumMicroOps = 9;
1562 let ResourceCycles = [1,4,1,3];
1563}
1564def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1565
1566def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1567 let Latency = 11;
1568 let NumMicroOps = 11;
1569 let ResourceCycles = [2,9];
1570}
Craig Topper2d451e72018-03-18 08:38:06 +00001571def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1572def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001573
Gadi Haber323f2e12017-10-24 20:19:47 +00001574def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1575 let Latency = 12;
1576 let NumMicroOps = 3;
1577 let ResourceCycles = [2,1];
1578}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001579def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m",
Craig Topper40d3b322018-03-22 21:55:20 +00001580 "VROUNDPDYm",
1581 "VROUNDPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001582
Craig Topper8104f262018-04-02 05:33:28 +00001583def BWWriteResGroup137 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001584 let Latency = 11;
Gadi Haber323f2e12017-10-24 20:19:47 +00001585 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001586 let ResourceCycles = [1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001587}
Craig Topper8104f262018-04-02 05:33:28 +00001588def: InstRW<[BWWriteResGroup137], (instregex "(V?)SQRTPSr")>;
1589
1590def BWWriteResGroup137_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1591 let Latency = 11;
1592 let NumMicroOps = 1;
1593 let ResourceCycles = [1,4];
1594}
1595def: InstRW<[BWWriteResGroup137_1], (instregex "(V?)SQRTSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001596
1597def BWWriteResGroup138 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1598 let Latency = 13;
1599 let NumMicroOps = 4;
Clement Courbetd2ff5fb2018-05-02 14:35:48 +00001600 let ResourceCycles = [1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001601}
1602def: InstRW<[BWWriteResGroup138], (instregex "VMPSADBWYrmi")>;
1603
Craig Topper8104f262018-04-02 05:33:28 +00001604def BWWriteResGroup139 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001605 let Latency = 14;
1606 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001607 let ResourceCycles = [1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001608}
Craig Topper8104f262018-04-02 05:33:28 +00001609def: InstRW<[BWWriteResGroup139], (instregex "(V?)DIVPDrr")>;
1610
1611def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1612 let Latency = 14;
1613 let NumMicroOps = 1;
1614 let ResourceCycles = [1,4];
1615}
1616def: InstRW<[BWWriteResGroup139_1], (instregex "(V?)DIVSDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001617
Gadi Haber323f2e12017-10-24 20:19:47 +00001618def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1619 let Latency = 14;
1620 let NumMicroOps = 3;
1621 let ResourceCycles = [1,1,1];
1622}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001623def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001624
1625def BWWriteResGroup142 : SchedWriteRes<[BWPort0,BWPort1,BWPort5]> {
1626 let Latency = 14;
1627 let NumMicroOps = 4;
1628 let ResourceCycles = [2,1,1];
1629}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001630def: InstRW<[BWWriteResGroup142], (instregex "(V?)DPPS(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001631
1632def BWWriteResGroup143 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1633 let Latency = 14;
1634 let NumMicroOps = 4;
1635 let ResourceCycles = [1,1,1,1];
1636}
Craig Topper5a69a002018-03-21 06:28:42 +00001637def: InstRW<[BWWriteResGroup143], (instregex "(V?)DPPDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001638
1639def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1640 let Latency = 14;
1641 let NumMicroOps = 8;
1642 let ResourceCycles = [2,2,1,3];
1643}
1644def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1645
1646def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1647 let Latency = 14;
1648 let NumMicroOps = 10;
1649 let ResourceCycles = [2,3,1,4];
1650}
1651def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1652
1653def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1654 let Latency = 14;
1655 let NumMicroOps = 12;
1656 let ResourceCycles = [2,1,4,5];
1657}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001658def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001659
1660def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1661 let Latency = 15;
1662 let NumMicroOps = 1;
1663 let ResourceCycles = [1];
1664}
Craig Topper5a69a002018-03-21 06:28:42 +00001665def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1666 "DIVR_FST0r",
1667 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001668
Gadi Haber323f2e12017-10-24 20:19:47 +00001669def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1670 let Latency = 15;
1671 let NumMicroOps = 10;
1672 let ResourceCycles = [1,1,1,4,1,2];
1673}
Craig Topper13a16502018-03-19 00:56:09 +00001674def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001675
Craig Topper8104f262018-04-02 05:33:28 +00001676def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001677 let Latency = 16;
1678 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001679 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001680}
Craig Topper5a69a002018-03-21 06:28:42 +00001681def: InstRW<[BWWriteResGroup150], (instregex "(V?)DIVPSrm",
1682 "(V?)DIVSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001683
1684def BWWriteResGroup151 : SchedWriteRes<[BWPort0,BWPort23]> {
1685 let Latency = 16;
1686 let NumMicroOps = 3;
1687 let ResourceCycles = [2,1];
1688}
1689def: InstRW<[BWWriteResGroup151], (instregex "VPMULLDYrm")>;
1690
Gadi Haber323f2e12017-10-24 20:19:47 +00001691def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1692 let Latency = 16;
1693 let NumMicroOps = 14;
1694 let ResourceCycles = [1,1,1,4,2,5];
1695}
1696def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1697
1698def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1699 let Latency = 16;
1700 let NumMicroOps = 16;
1701 let ResourceCycles = [16];
1702}
Craig Topper5a69a002018-03-21 06:28:42 +00001703def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001704
Craig Topper8104f262018-04-02 05:33:28 +00001705def BWWriteResGroup155 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001706 let Latency = 17;
1707 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001708 let ResourceCycles = [2,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001709}
1710def: InstRW<[BWWriteResGroup155], (instregex "VDIVPSYrr")>;
1711
1712def BWWriteResGroup156 : SchedWriteRes<[BWPort0,BWPort23,BWPort015]> {
1713 let Latency = 17;
1714 let NumMicroOps = 4;
1715 let ResourceCycles = [2,1,1];
1716}
Craig Topper5a69a002018-03-21 06:28:42 +00001717def: InstRW<[BWWriteResGroup156], (instregex "VRCPPSYm",
1718 "VRSQRTPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001719
Craig Topper8104f262018-04-02 05:33:28 +00001720def BWWriteResGroup157 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001721 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001722 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001723 let ResourceCycles = [1,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001724}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001725def: InstRW<[BWWriteResGroup157], (instregex "(V?)SQRTPSm",
1726 "(V?)SQRTSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001727
Gadi Haber323f2e12017-10-24 20:19:47 +00001728def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1729 let Latency = 18;
1730 let NumMicroOps = 8;
1731 let ResourceCycles = [1,1,1,5];
1732}
Craig Topper5a69a002018-03-21 06:28:42 +00001733def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001734def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001735
1736def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1737 let Latency = 18;
1738 let NumMicroOps = 11;
1739 let ResourceCycles = [2,1,1,3,1,3];
1740}
Craig Topper13a16502018-03-19 00:56:09 +00001741def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001742
Craig Topper8104f262018-04-02 05:33:28 +00001743def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001744 let Latency = 19;
1745 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001746 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001747}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001748def: InstRW<[BWWriteResGroup161], (instregex "(V?)DIVPDrm",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001749 "(V?)DIVSDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001750
Gadi Haber323f2e12017-10-24 20:19:47 +00001751def BWWriteResGroup163 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1752 let Latency = 19;
1753 let NumMicroOps = 5;
1754 let ResourceCycles = [2,1,1,1];
1755}
Craig Topper5a69a002018-03-21 06:28:42 +00001756def: InstRW<[BWWriteResGroup163], (instregex "(V?)DPPSrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001757
Gadi Haber323f2e12017-10-24 20:19:47 +00001758def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1759 let Latency = 20;
1760 let NumMicroOps = 1;
1761 let ResourceCycles = [1];
1762}
Craig Topper5a69a002018-03-21 06:28:42 +00001763def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1764 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001765 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001766
1767def BWWriteResGroup166 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1768 let Latency = 20;
1769 let NumMicroOps = 5;
1770 let ResourceCycles = [2,1,1,1];
1771}
1772def: InstRW<[BWWriteResGroup166], (instregex "VDPPSYrmi")>;
1773
1774def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1775 let Latency = 20;
1776 let NumMicroOps = 8;
1777 let ResourceCycles = [1,1,1,1,1,1,2];
1778}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001779def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001780
Craig Topper8104f262018-04-02 05:33:28 +00001781def BWWriteResGroup168 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001782 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001783 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001784 let ResourceCycles = [1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001785}
Craig Topper8104f262018-04-02 05:33:28 +00001786def: InstRW<[BWWriteResGroup168], (instregex "(V?)SQRTPDr")>;
1787
1788def BWWriteResGroup168_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1789 let Latency = 16;
1790 let NumMicroOps = 1;
1791 let ResourceCycles = [1,8];
1792}
1793def: InstRW<[BWWriteResGroup168_1], (instregex "(V?)SQRTSDr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001794
1795def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1796 let Latency = 21;
1797 let NumMicroOps = 2;
1798 let ResourceCycles = [1,1];
1799}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001800def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001801
Craig Topper8104f262018-04-02 05:33:28 +00001802def BWWriteResGroup170 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001803 let Latency = 21;
1804 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001805 let ResourceCycles = [2,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001806}
1807def: InstRW<[BWWriteResGroup170], (instregex "VSQRTPSYr")>;
1808
1809def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1810 let Latency = 21;
1811 let NumMicroOps = 19;
1812 let ResourceCycles = [2,1,4,1,1,4,6];
1813}
1814def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1815
1816def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1817 let Latency = 22;
1818 let NumMicroOps = 18;
1819 let ResourceCycles = [1,1,16];
1820}
1821def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1822
Craig Topper8104f262018-04-02 05:33:28 +00001823def BWWriteResGroup173 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001824 let Latency = 23;
1825 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001826 let ResourceCycles = [2,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001827}
1828def: InstRW<[BWWriteResGroup173], (instregex "VDIVPDYrr")>;
1829
Craig Topper8104f262018-04-02 05:33:28 +00001830def BWWriteResGroup174 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001831 let Latency = 23;
1832 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001833 let ResourceCycles = [2,1,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001834}
1835def: InstRW<[BWWriteResGroup174], (instregex "VDIVPSYrm")>;
1836
Gadi Haber323f2e12017-10-24 20:19:47 +00001837def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1838 let Latency = 23;
1839 let NumMicroOps = 19;
1840 let ResourceCycles = [3,1,15];
1841}
Craig Topper391c6f92017-12-10 01:24:08 +00001842def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001843
1844def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1845 let Latency = 24;
1846 let NumMicroOps = 3;
1847 let ResourceCycles = [1,1,1];
1848}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001849def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001850
Craig Topper8104f262018-04-02 05:33:28 +00001851def BWWriteResGroup179 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001852 let Latency = 21;
Gadi Haber323f2e12017-10-24 20:19:47 +00001853 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001854 let ResourceCycles = [1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001855}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001856def: InstRW<[BWWriteResGroup179], (instregex "(V?)SQRTPDm",
1857 "(V?)SQRTSDm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001858
1859def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1860 let Latency = 26;
1861 let NumMicroOps = 2;
1862 let ResourceCycles = [1,1];
1863}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001864def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001865
Craig Topper8104f262018-04-02 05:33:28 +00001866def BWWriteResGroup181 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001867 let Latency = 27;
1868 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001869 let ResourceCycles = [2,1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001870}
1871def: InstRW<[BWWriteResGroup181], (instregex "VSQRTPSYm")>;
1872
1873def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1874 let Latency = 29;
1875 let NumMicroOps = 3;
1876 let ResourceCycles = [1,1,1];
1877}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001878def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001879
Craig Topper8104f262018-04-02 05:33:28 +00001880def BWWriteResGroup183 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001881 let Latency = 29;
1882 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001883 let ResourceCycles = [2,1,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001884}
1885def: InstRW<[BWWriteResGroup183], (instregex "VDIVPDYrm")>;
1886
1887def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1888 let Latency = 22;
1889 let NumMicroOps = 7;
1890 let ResourceCycles = [1,3,2,1];
1891}
Craig Topper17a31182017-12-16 18:35:29 +00001892def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001893
1894def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1895 let Latency = 23;
1896 let NumMicroOps = 9;
1897 let ResourceCycles = [1,3,4,1];
1898}
Craig Topper17a31182017-12-16 18:35:29 +00001899def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001900
1901def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1902 let Latency = 24;
1903 let NumMicroOps = 9;
1904 let ResourceCycles = [1,5,2,1];
1905}
Craig Topper17a31182017-12-16 18:35:29 +00001906def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001907
1908def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1909 let Latency = 25;
1910 let NumMicroOps = 7;
1911 let ResourceCycles = [1,3,2,1];
1912}
Craig Topper17a31182017-12-16 18:35:29 +00001913def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1914 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001915
1916def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1917 let Latency = 26;
1918 let NumMicroOps = 9;
1919 let ResourceCycles = [1,5,2,1];
1920}
Craig Topper17a31182017-12-16 18:35:29 +00001921def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001922
1923def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1924 let Latency = 26;
1925 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001926 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001927}
Craig Topper17a31182017-12-16 18:35:29 +00001928def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001929
1930def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1931 let Latency = 27;
1932 let NumMicroOps = 9;
1933 let ResourceCycles = [1,5,2,1];
1934}
Craig Topper17a31182017-12-16 18:35:29 +00001935def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001936
Gadi Haber323f2e12017-10-24 20:19:47 +00001937def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1938 let Latency = 29;
1939 let NumMicroOps = 27;
1940 let ResourceCycles = [1,5,1,1,19];
1941}
1942def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1943
1944def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1945 let Latency = 30;
1946 let NumMicroOps = 28;
1947 let ResourceCycles = [1,6,1,1,19];
1948}
Craig Topper2d451e72018-03-18 08:38:06 +00001949def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001950
1951def BWWriteResGroup187 : SchedWriteRes<[BWPort01,BWPort15,BWPort015,BWPort0156]> {
1952 let Latency = 31;
1953 let NumMicroOps = 31;
1954 let ResourceCycles = [8,1,21,1];
1955}
1956def: InstRW<[BWWriteResGroup187], (instregex "MMX_EMMS")>;
1957
Craig Topper8104f262018-04-02 05:33:28 +00001958def BWWriteResGroup189 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
1959 let Latency = 29;
Gadi Haber323f2e12017-10-24 20:19:47 +00001960 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001961 let ResourceCycles = [2,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00001962}
1963def: InstRW<[BWWriteResGroup189], (instregex "VSQRTPDYr")>;
1964
1965def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1966 let Latency = 34;
1967 let NumMicroOps = 8;
1968 let ResourceCycles = [2,2,2,1,1];
1969}
Craig Topper13a16502018-03-19 00:56:09 +00001970def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001971
1972def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
1973 let Latency = 34;
1974 let NumMicroOps = 23;
1975 let ResourceCycles = [1,5,3,4,10];
1976}
Craig Topper5a69a002018-03-21 06:28:42 +00001977def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
1978 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001979
1980def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1981 let Latency = 35;
1982 let NumMicroOps = 8;
1983 let ResourceCycles = [2,2,2,1,1];
1984}
Craig Topper13a16502018-03-19 00:56:09 +00001985def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001986
1987def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1988 let Latency = 35;
1989 let NumMicroOps = 23;
1990 let ResourceCycles = [1,5,2,1,4,10];
1991}
Craig Topper5a69a002018-03-21 06:28:42 +00001992def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
1993 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001994
Craig Topper8104f262018-04-02 05:33:28 +00001995def BWWriteResGroup195 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
1996 let Latency = 35;
Gadi Haber323f2e12017-10-24 20:19:47 +00001997 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001998 let ResourceCycles = [2,1,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00001999}
2000def: InstRW<[BWWriteResGroup195], (instregex "VSQRTPDYm")>;
2001
2002def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
2003 let Latency = 42;
2004 let NumMicroOps = 22;
2005 let ResourceCycles = [2,20];
2006}
Craig Topper2d451e72018-03-18 08:38:06 +00002007def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002008
2009def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
2010 let Latency = 60;
2011 let NumMicroOps = 64;
2012 let ResourceCycles = [2,2,8,1,10,2,39];
2013}
2014def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002015
2016def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
2017 let Latency = 63;
2018 let NumMicroOps = 88;
2019 let ResourceCycles = [4,4,31,1,2,1,45];
2020}
Craig Topper2d451e72018-03-18 08:38:06 +00002021def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002022
2023def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
2024 let Latency = 63;
2025 let NumMicroOps = 90;
2026 let ResourceCycles = [4,2,33,1,2,1,47];
2027}
Craig Topper2d451e72018-03-18 08:38:06 +00002028def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002029
2030def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
2031 let Latency = 75;
2032 let NumMicroOps = 15;
2033 let ResourceCycles = [6,3,6];
2034}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00002035def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002036
2037def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
2038 let Latency = 80;
2039 let NumMicroOps = 32;
2040 let ResourceCycles = [7,7,3,3,1,11];
2041}
2042def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
2043
2044def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
2045 let Latency = 115;
2046 let NumMicroOps = 100;
2047 let ResourceCycles = [9,9,11,8,1,11,21,30];
2048}
2049def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00002050
2051} // SchedModel
2052