blob: 5aac5957b2288868b97fd986787d21978960c6bd [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 Pilgrim542b20d2018-05-03 22:31:19 +0000176defm : BWWriteResPair<WriteDPPD, [BWPort0,BWPort1,BWPort5], 9, [1,1,1], 3, 5>; // Floating point double dot product.
177defm : BWWriteResPair<WriteDPPS, [BWPort0,BWPort1,BWPort5], 14, [2,1,1], 4, 5>; // Floating point single dot product.
178defm : BWWriteResPair<WriteDPPSY, [BWPort0,BWPort1,BWPort5], 14, [2,1,1], 4, 6>; // Floating point single dot product (YMM).
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000179defm : BWWriteResPair<WriteFSign, [BWPort5], 1>; // Floating point fabs/fchs.
180defm : X86WriteRes<WriteFRnd, [BWPort23], 6, [1], 1>; // Floating point rounding.
181defm : X86WriteRes<WriteFRndY, [BWPort23], 6, [1], 1>; // Floating point rounding (YMM/ZMM).
182defm : X86WriteRes<WriteFRndLd, [BWPort1,BWPort23], 11, [2,1], 3>;
183defm : X86WriteRes<WriteFRndYLd, [BWPort1,BWPort23], 12, [2,1], 3>;
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000184defm : BWWriteResPair<WriteFLogic, [BWPort5], 1, [1], 1, 5>; // Floating point and/or/xor logicals.
185defm : BWWriteResPair<WriteFLogicY, [BWPort5], 1, [1], 1, 6>; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000186defm : BWWriteResPair<WriteFShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector shuffles.
187defm : BWWriteResPair<WriteFShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000188defm : BWWriteResPair<WriteFVarShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector variable shuffles.
189defm : BWWriteResPair<WriteFVarShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
190defm : BWWriteResPair<WriteFBlend, [BWPort015], 1, [1], 1, 5>; // Floating point vector blends.
191defm : BWWriteResPair<WriteFBlendY, [BWPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000192defm : BWWriteResPair<WriteFVarBlend, [BWPort5], 2, [2], 2, 5>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000193defm : BWWriteResPair<WriteFVarBlendY, [BWPort5], 2, [2], 2, 6>; // Fp vector variable blends.
Gadi Haber323f2e12017-10-24 20:19:47 +0000194
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000195def : WriteRes<WriteCvtF2FSt, [BWPort1,BWPort4,BWPort237]> {
196 let Latency = 4;
197 let NumMicroOps = 3;
198 let ResourceCycles = [1,1,1];
199}
200
Gadi Haber323f2e12017-10-24 20:19:47 +0000201// FMA Scheduling helper class.
202// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
203
204// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000205def : WriteRes<WriteVecLoad, [BWPort23]> { let Latency = 5; }
206def : WriteRes<WriteVecStore, [BWPort237, BWPort4]>;
207def : WriteRes<WriteVecMove, [BWPort015]>;
208
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000209defm : BWWriteResPair<WriteVecALU, [BWPort15], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
210defm : BWWriteResPair<WriteVecALUY, [BWPort15], 1, [1], 1, 6>; // Vector integer ALU op, no logicals (YMM/ZMM).
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000211defm : BWWriteResPair<WriteVecLogic, [BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
212defm : BWWriteResPair<WriteVecLogicY,[BWPort015], 1, [1], 1, 6>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000213defm : BWWriteResPair<WriteVecIMul, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
214defm : BWWriteResPair<WriteVecIMulY, [BWPort0], 5, [1], 1, 6>; // Vector integer multiply.
215defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // Vector PMULLD.
216defm : BWWriteResPair<WritePMULLDY, [BWPort0], 10, [2], 2, 6>; // Vector PMULLD (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000217defm : BWWriteResPair<WriteShuffle, [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000218defm : BWWriteResPair<WriteShuffleY, [BWPort5], 1, [1], 1, 6>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000219defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000220defm : BWWriteResPair<WriteVarShuffleY,[BWPort5], 1, [1], 1, 6>; // Vector variable shuffles (YMM/ZMM).
221defm : BWWriteResPair<WriteBlend, [BWPort5], 1, [1], 1, 5>; // Vector blends.
222defm : BWWriteResPair<WriteBlendY, [BWPort5], 1, [1], 1, 6>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000223defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000224defm : BWWriteResPair<WriteVarBlendY, [BWPort5], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000225defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000226defm : BWWriteResPair<WriteMPSADY, [BWPort0, BWPort5], 7, [1, 2], 3, 6>; // Vector MPSAD.
227defm : BWWriteResPair<WritePSADBW, [BWPort0], 5, [1], 1, 5>; // Vector PSADBW.
228defm : BWWriteResPair<WritePSADBWY, [BWPort0], 5, [1], 1, 6>; // Vector PSADBW (YMM/ZMM).
229defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000230
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000231// Vector integer shifts.
232defm : BWWriteResPair<WriteVecShift, [BWPort0], 1, [1], 1, 5>;
233defm : BWWriteResPair<WriteVecShiftX, [BWPort0,BWPort5], 2, [1,1], 2, 5>;
234defm : X86WriteRes<WriteVecShiftY, [BWPort0,BWPort5], 4, [1,1], 2>;
235defm : X86WriteRes<WriteVecShiftYLd, [BWPort0,BWPort23], 7, [1,1], 2>;
236
237defm : BWWriteResPair<WriteVecShiftImmX, [BWPort0], 1, [1], 1, 5>; // Vector integer immediate shifts (XMM).
238defm : BWWriteResPair<WriteVecShiftImmY, [BWPort0], 1, [1], 1, 6>; // Vector integer immediate shifts (YMM/ZMM).
239defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 3, [2,1], 3, 5>; // Variable vector shifts.
240defm : BWWriteResPair<WriteVarVecShiftY, [BWPort0, BWPort5], 3, [2,1], 3, 6>; // Variable vector shifts (YMM/ZMM).
241
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000242// Vector insert/extract operations.
243def : WriteRes<WriteVecInsert, [BWPort5]> {
244 let Latency = 2;
245 let NumMicroOps = 2;
246 let ResourceCycles = [2];
247}
248def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
249 let Latency = 6;
250 let NumMicroOps = 2;
251}
252
253def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
254 let Latency = 2;
255 let NumMicroOps = 2;
256}
257def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
258 let Latency = 2;
259 let NumMicroOps = 3;
260}
261
Gadi Haber323f2e12017-10-24 20:19:47 +0000262// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000263defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
264defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
265defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000266
267// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000268
Gadi Haber323f2e12017-10-24 20:19:47 +0000269// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000270def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000271 let Latency = 11;
272 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000273 let ResourceCycles = [3];
274}
275def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000276 let Latency = 16;
277 let NumMicroOps = 4;
278 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000279}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000280
281// Packed Compare Explicit Length Strings, Return Mask
282def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
283 let Latency = 19;
284 let NumMicroOps = 9;
285 let ResourceCycles = [4,3,1,1];
286}
287def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
288 let Latency = 24;
289 let NumMicroOps = 10;
290 let ResourceCycles = [4,3,1,1,1];
291}
292
293// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000294def : WriteRes<WritePCmpIStrI, [BWPort0]> {
295 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000296 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000297 let ResourceCycles = [3];
298}
299def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000300 let Latency = 16;
301 let NumMicroOps = 4;
302 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000303}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000304
305// Packed Compare Explicit Length Strings, Return Index
306def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
307 let Latency = 18;
308 let NumMicroOps = 8;
309 let ResourceCycles = [4,3,1];
310}
311def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
312 let Latency = 23;
313 let NumMicroOps = 9;
314 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000315}
316
Simon Pilgrima2f26782018-03-27 20:38:54 +0000317// MOVMSK Instructions.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000318def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
319def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
320def : WriteRes<WriteVecMOVMSKY, [BWPort0]> { let Latency = 3; }
321def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
Simon Pilgrima2f26782018-03-27 20:38:54 +0000322
Gadi Haber323f2e12017-10-24 20:19:47 +0000323// AES instructions.
324def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
325 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000326 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000327 let ResourceCycles = [1];
328}
329def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000330 let Latency = 12;
331 let NumMicroOps = 2;
332 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000333}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000334
Gadi Haber323f2e12017-10-24 20:19:47 +0000335def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
336 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000337 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000338 let ResourceCycles = [2];
339}
340def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000341 let Latency = 19;
342 let NumMicroOps = 3;
343 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000344}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000345
346def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
347 let Latency = 29;
348 let NumMicroOps = 11;
349 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000350}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000351def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
352 let Latency = 33;
353 let NumMicroOps = 11;
354 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000355}
356
357// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000358defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000359
360// Catch-all for expensive system instructions.
361def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
362
363// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000364defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
365defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
366defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
367defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
Gadi Haber323f2e12017-10-24 20:19:47 +0000368
369// Old microcoded instructions that nobody use.
370def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
371
372// Fence instructions.
373def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
374
Craig Topper05242bf2018-04-21 18:07:36 +0000375// Load/store MXCSR.
376def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
377def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
378
Gadi Haber323f2e12017-10-24 20:19:47 +0000379// Nop, not very useful expect it provides a model for nops!
380def : WriteRes<WriteNop, []>;
381
382////////////////////////////////////////////////////////////////////////////////
383// Horizontal add/sub instructions.
384////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000385
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000386defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3, 5>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000387defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000388defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3, 5>;
389defm : BWWriteResPair<WritePHAddY, [BWPort5,BWPort15], 3, [2,1], 3, 6>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000390
391// Remaining instrs.
392
393def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
394 let Latency = 1;
395 let NumMicroOps = 1;
396 let ResourceCycles = [1];
397}
Craig Topper5a69a002018-03-21 06:28:42 +0000398def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
399 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000400 "(V?)MOVPDI2DIrr",
401 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000402 "VPSLLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000403 "VPSRLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000404 "VTESTPD(Y?)rr",
405 "VTESTPS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000406
407def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
408 let Latency = 1;
409 let NumMicroOps = 1;
410 let ResourceCycles = [1];
411}
Craig Topper5a69a002018-03-21 06:28:42 +0000412def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
413 "COM_FST0r",
414 "UCOM_FPr",
415 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000416
417def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
418 let Latency = 1;
419 let NumMicroOps = 1;
420 let ResourceCycles = [1];
421}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000422def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000423 "MMX_MOVD64to64rr",
424 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000425 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000426 "(V?)MOVDI2PDIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000427
428def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
429 let Latency = 1;
430 let NumMicroOps = 1;
431 let ResourceCycles = [1];
432}
433def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
434
435def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
436 let Latency = 1;
437 let NumMicroOps = 1;
438 let ResourceCycles = [1];
439}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000440def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000441
442def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
443 let Latency = 1;
444 let NumMicroOps = 1;
445 let ResourceCycles = [1];
446}
Craig Topperfbe31322018-04-05 21:56:19 +0000447def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000448def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
449 "ADC(16|32|64)i",
450 "ADC(8|16|32|64)rr",
451 "ADCX(32|64)rr",
452 "ADOX(32|64)rr",
453 "BT(16|32|64)ri8",
454 "BT(16|32|64)rr",
455 "BTC(16|32|64)ri8",
456 "BTC(16|32|64)rr",
457 "BTR(16|32|64)ri8",
458 "BTR(16|32|64)rr",
459 "BTS(16|32|64)ri8",
460 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000461 "SBB(16|32|64)ri",
462 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000463 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000464
465def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
466 let Latency = 1;
467 let NumMicroOps = 1;
468 let ResourceCycles = [1];
469}
Craig Topper5a69a002018-03-21 06:28:42 +0000470def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
471 "BLSI(32|64)rr",
472 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000473 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000474
475def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
476 let Latency = 1;
477 let NumMicroOps = 1;
478 let ResourceCycles = [1];
479}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000480def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000481 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000482
483def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
484 let Latency = 1;
485 let NumMicroOps = 1;
486 let ResourceCycles = [1];
487}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000488def: InstRW<[BWWriteResGroup9], (instrs LAHF, SAHF)>; // TODO: This doesnt match Agner's data
489def: InstRW<[BWWriteResGroup9], (instregex "NOOP",
Craig Topper5a69a002018-03-21 06:28:42 +0000490 "SGDT64m",
491 "SIDT64m",
Craig Topper5a69a002018-03-21 06:28:42 +0000492 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000493 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000494 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000495
496def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
497 let Latency = 1;
498 let NumMicroOps = 2;
499 let ResourceCycles = [1,1];
500}
Craig Topper5a69a002018-03-21 06:28:42 +0000501def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
502 "MMX_MOVD64from64rm",
503 "MMX_MOVD64mr",
504 "MMX_MOVNTQmr",
505 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000506 "MOVNTI_64mr",
507 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000508 "ST_FP(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000509 "VEXTRACTF128mr",
510 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000511 "(V?)MOVAPD(Y?)mr",
512 "(V?)MOVAPS(Y?)mr",
513 "(V?)MOVDQA(Y?)mr",
514 "(V?)MOVDQU(Y?)mr",
515 "(V?)MOVHPDmr",
516 "(V?)MOVHPSmr",
517 "(V?)MOVLPDmr",
518 "(V?)MOVLPSmr",
519 "(V?)MOVNTDQ(V?)mr",
520 "(V?)MOVNTPD(V?)mr",
521 "(V?)MOVNTPS(V?)mr",
522 "(V?)MOVPDI2DImr",
523 "(V?)MOVPQI2QImr",
524 "(V?)MOVPQIto64mr",
525 "(V?)MOVSDmr",
526 "(V?)MOVSSmr",
527 "(V?)MOVUPD(Y?)mr",
528 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000529
Gadi Haber323f2e12017-10-24 20:19:47 +0000530def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
531 let Latency = 2;
532 let NumMicroOps = 2;
533 let ResourceCycles = [2];
534}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000535def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000536
537def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
538 let Latency = 2;
539 let NumMicroOps = 2;
540 let ResourceCycles = [2];
541}
Craig Topper5a69a002018-03-21 06:28:42 +0000542def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
543 "ROL(8|16|32|64)ri",
544 "ROR(8|16|32|64)r1",
545 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000546
547def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
548 let Latency = 2;
549 let NumMicroOps = 2;
550 let ResourceCycles = [2];
551}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000552def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
553 MFENCE,
554 WAIT,
555 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000556
557def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
558 let Latency = 2;
559 let NumMicroOps = 2;
560 let ResourceCycles = [1,1];
561}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000562def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000563 "(V?)CVTPS2PDrr",
564 "(V?)CVTSS2SDrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000565 "(V?)PTESTrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000566
567def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
568 let Latency = 2;
569 let NumMicroOps = 2;
570 let ResourceCycles = [1,1];
571}
572def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
573
574def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
575 let Latency = 2;
576 let NumMicroOps = 2;
577 let ResourceCycles = [1,1];
578}
579def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
580
581def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
582 let Latency = 2;
583 let NumMicroOps = 2;
584 let ResourceCycles = [1,1];
585}
586def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
587
588def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
589 let Latency = 2;
590 let NumMicroOps = 2;
591 let ResourceCycles = [1,1];
592}
Craig Topper498875f2018-04-04 17:54:19 +0000593def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
594
595def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
596 let Latency = 1;
597 let NumMicroOps = 1;
598 let ResourceCycles = [1];
599}
600def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000601
602def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
603 let Latency = 2;
604 let NumMicroOps = 2;
605 let ResourceCycles = [1,1];
606}
Craig Topper2d451e72018-03-18 08:38:06 +0000607def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000608def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000609def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
610 "ADC8ri",
611 "CMOV(A|BE)(16|32|64)rr",
612 "SBB8i8",
613 "SBB8ri",
614 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000615
Gadi Haber323f2e12017-10-24 20:19:47 +0000616def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
617 let Latency = 2;
618 let NumMicroOps = 3;
619 let ResourceCycles = [1,1,1];
620}
621def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
622
Gadi Haber323f2e12017-10-24 20:19:47 +0000623def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
624 let Latency = 2;
625 let NumMicroOps = 3;
626 let ResourceCycles = [1,1,1];
627}
628def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
629
630def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
631 let Latency = 2;
632 let NumMicroOps = 3;
633 let ResourceCycles = [1,1,1];
634}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000635def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
636 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000637def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000638 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000639
Gadi Haber323f2e12017-10-24 20:19:47 +0000640def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
641 let Latency = 3;
642 let NumMicroOps = 1;
643 let ResourceCycles = [1];
644}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000645def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000646 "PDEP(32|64)rr",
647 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000648 "SHLD(16|32|64)rri8",
649 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000650 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000651
652def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000653 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000654 let NumMicroOps = 2;
655 let ResourceCycles = [1,1];
656}
Clement Courbet327fac42018-03-07 08:14:02 +0000657def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000658
659def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
660 let Latency = 3;
661 let NumMicroOps = 1;
662 let ResourceCycles = [1];
663}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000664def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
665 "VPBROADCASTWrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000666 "VPMOVSXBDYrr",
667 "VPMOVSXBQYrr",
668 "VPMOVSXBWYrr",
669 "VPMOVSXDQYrr",
670 "VPMOVSXWDYrr",
671 "VPMOVSXWQYrr",
672 "VPMOVZXBDYrr",
673 "VPMOVZXBQYrr",
674 "VPMOVZXBWYrr",
675 "VPMOVZXDQYrr",
676 "VPMOVZXWDYrr",
677 "VPMOVZXWQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000678
Gadi Haber323f2e12017-10-24 20:19:47 +0000679def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000680 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000681 let NumMicroOps = 3;
682 let ResourceCycles = [3];
683}
Craig Topperb5f26592018-04-19 18:00:17 +0000684def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
685 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
686 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000687
Gadi Haber323f2e12017-10-24 20:19:47 +0000688def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
689 let Latency = 3;
690 let NumMicroOps = 3;
691 let ResourceCycles = [2,1];
692}
Craig Topper5a69a002018-03-21 06:28:42 +0000693def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
694 "MMX_PACKSSWBirr",
695 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000696
697def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
698 let Latency = 3;
699 let NumMicroOps = 3;
700 let ResourceCycles = [1,2];
701}
702def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
703
704def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
705 let Latency = 3;
706 let NumMicroOps = 3;
707 let ResourceCycles = [1,2];
708}
Craig Topper5a69a002018-03-21 06:28:42 +0000709def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
710 "RCL(8|16|32|64)ri",
711 "RCR(8|16|32|64)r1",
712 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000713
714def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
715 let Latency = 3;
716 let NumMicroOps = 3;
717 let ResourceCycles = [2,1];
718}
Craig Topper5a69a002018-03-21 06:28:42 +0000719def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
720 "ROR(8|16|32|64)rCL",
721 "SAR(8|16|32|64)rCL",
722 "SHL(8|16|32|64)rCL",
723 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000724
725def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
726 let Latency = 3;
727 let NumMicroOps = 4;
728 let ResourceCycles = [1,1,1,1];
729}
730def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
731
732def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
733 let Latency = 3;
734 let NumMicroOps = 4;
735 let ResourceCycles = [1,1,1,1];
736}
Craig Topper5a69a002018-03-21 06:28:42 +0000737def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
738 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000739
740def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
741 let Latency = 4;
742 let NumMicroOps = 2;
743 let ResourceCycles = [1,1];
744}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000745def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
746 "(V?)CVTSD2SIrr",
747 "(V?)CVTSS2SI64rr",
748 "(V?)CVTSS2SIrr",
749 "(V?)CVTTSD2SI64rr",
750 "(V?)CVTTSD2SIrr",
751 "(V?)CVTTSS2SI64rr",
752 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000753
754def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
755 let Latency = 4;
756 let NumMicroOps = 2;
757 let ResourceCycles = [1,1];
758}
Craig Topper5a69a002018-03-21 06:28:42 +0000759def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000760 "VPTESTYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000761
762def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
763 let Latency = 4;
764 let NumMicroOps = 2;
765 let ResourceCycles = [1,1];
766}
767def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
768
769def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
770 let Latency = 4;
771 let NumMicroOps = 2;
772 let ResourceCycles = [1,1];
773}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000774def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000775def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000776 "MMX_CVTPI2PDirr",
777 "MMX_CVTPS2PIirr",
778 "MMX_CVTTPD2PIirr",
779 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000780 "(V?)CVTDQ2PDrr",
781 "(V?)CVTPD2DQrr",
782 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000783 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000784 "(V?)CVTSD2SSrr",
785 "(V?)CVTSI642SDrr",
786 "(V?)CVTSI2SDrr",
787 "(V?)CVTSI2SSrr",
788 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000789
790def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
791 let Latency = 4;
792 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000793 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000794}
Craig Topper5a69a002018-03-21 06:28:42 +0000795def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000796
797def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
798 let Latency = 4;
799 let NumMicroOps = 3;
800 let ResourceCycles = [1,1,1];
801}
802def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
803
804def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
805 let Latency = 4;
806 let NumMicroOps = 3;
807 let ResourceCycles = [1,1,1];
808}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000809def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
810 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000811
812def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
813 let Latency = 4;
814 let NumMicroOps = 4;
815 let ResourceCycles = [4];
816}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000817def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000818
819def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
820 let Latency = 4;
821 let NumMicroOps = 4;
822 let ResourceCycles = [1,3];
823}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000824def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000825
826def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
827 let Latency = 5;
828 let NumMicroOps = 1;
829 let ResourceCycles = [1];
830}
Simon Pilgrima53d3302018-05-02 16:16:24 +0000831def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr",
832 "MUL_FPrST0",
833 "MUL_FST0r",
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000834 "MUL_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000835
Gadi Haber323f2e12017-10-24 20:19:47 +0000836def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
837 let Latency = 5;
838 let NumMicroOps = 1;
839 let ResourceCycles = [1];
840}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000841def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000842 "MOVSX(16|32|64)rm32",
843 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000844 "MOVZX(16|32|64)rm16",
845 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000846 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000847 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000848 "(V?)MOVSHDUPrm",
849 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000850 "VPBROADCASTDrm",
851 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000852
853def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
854 let Latency = 5;
855 let NumMicroOps = 3;
856 let ResourceCycles = [1,2];
857}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000858def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000859
860def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
861 let Latency = 5;
862 let NumMicroOps = 3;
863 let ResourceCycles = [1,1,1];
864}
865def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
866
867def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000868 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000869 let NumMicroOps = 3;
870 let ResourceCycles = [1,1,1];
871}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000872def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000873
874def BWWriteResGroup53 : SchedWriteRes<[BWPort0,BWPort4,BWPort237,BWPort15]> {
875 let Latency = 5;
876 let NumMicroOps = 4;
877 let ResourceCycles = [1,1,1,1];
878}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000879def: InstRW<[BWWriteResGroup53], (instregex "VMASKMOVPD(Y?)mr",
880 "VMASKMOVPS(Y?)mr",
881 "VPMASKMOVD(Y?)mr",
882 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000883
884def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
885 let Latency = 5;
886 let NumMicroOps = 5;
887 let ResourceCycles = [1,4];
888}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000889def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000890
891def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
892 let Latency = 5;
893 let NumMicroOps = 5;
894 let ResourceCycles = [1,4];
895}
896def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
897
898def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
899 let Latency = 5;
900 let NumMicroOps = 5;
901 let ResourceCycles = [2,3];
902}
Craig Topper5a69a002018-03-21 06:28:42 +0000903def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000904
905def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
906 let Latency = 5;
907 let NumMicroOps = 6;
908 let ResourceCycles = [1,1,4];
909}
Craig Topper5a69a002018-03-21 06:28:42 +0000910def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000911
912def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
913 let Latency = 6;
914 let NumMicroOps = 1;
915 let ResourceCycles = [1];
916}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000917def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000918 "VBROADCASTF128",
919 "VBROADCASTI128",
920 "VBROADCASTSDYrm",
921 "VBROADCASTSSYrm",
922 "VLDDQUYrm",
923 "VMOVAPDYrm",
924 "VMOVAPSYrm",
925 "VMOVDDUPYrm",
926 "VMOVDQAYrm",
927 "VMOVDQUYrm",
928 "VMOVNTDQAYrm",
929 "VMOVSHDUPYrm",
930 "VMOVSLDUPYrm",
931 "VMOVUPDYrm",
932 "VMOVUPSYrm",
933 "VPBROADCASTDYrm",
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000934 "VPBROADCASTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000935
936def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
937 let Latency = 6;
938 let NumMicroOps = 2;
939 let ResourceCycles = [1,1];
940}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000941def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000942 "(V?)CVTPS2PDrm",
943 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000944 "VPSLLVQrm",
945 "VPSRLVQrm",
946 "VTESTPDrm",
947 "VTESTPSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000948
949def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
950 let Latency = 6;
951 let NumMicroOps = 2;
952 let ResourceCycles = [1,1];
953}
Craig Topper5a69a002018-03-21 06:28:42 +0000954def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
955 "VCVTPD2DQYrr",
956 "VCVTPD2PSYrr",
957 "VCVTPS2PHYrr",
958 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000959
Gadi Haber323f2e12017-10-24 20:19:47 +0000960def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
961 let Latency = 6;
962 let NumMicroOps = 2;
963 let ResourceCycles = [1,1];
964}
Craig Topper5a69a002018-03-21 06:28:42 +0000965def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
966 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000967
968def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
969 let Latency = 6;
970 let NumMicroOps = 2;
971 let ResourceCycles = [1,1];
972}
Craig Topperdfccafe2018-04-18 06:41:25 +0000973def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +0000974def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
975 ADCX32rm, ADCX64rm,
976 ADOX32rm, ADOX64rm,
977 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000978
979def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
980 let Latency = 6;
981 let NumMicroOps = 2;
982 let ResourceCycles = [1,1];
983}
Craig Topper5a69a002018-03-21 06:28:42 +0000984def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
985 "BLSI(32|64)rm",
986 "BLSMSK(32|64)rm",
987 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +0000988 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000989
990def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
991 let Latency = 6;
992 let NumMicroOps = 2;
993 let ResourceCycles = [1,1];
994}
Simon Pilgrim06e16542018-04-22 18:35:53 +0000995def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +0000996 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000997 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000998
999def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1000 let Latency = 6;
1001 let NumMicroOps = 2;
1002 let ResourceCycles = [1,1];
1003}
Craig Topper2d451e72018-03-18 08:38:06 +00001004def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001005def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001006
1007def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1008 let Latency = 6;
1009 let NumMicroOps = 4;
1010 let ResourceCycles = [1,1,2];
1011}
Craig Topper5a69a002018-03-21 06:28:42 +00001012def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1013 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001014
1015def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1016 let Latency = 6;
1017 let NumMicroOps = 4;
1018 let ResourceCycles = [1,1,1,1];
1019}
1020def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1021
1022def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1023 let Latency = 6;
1024 let NumMicroOps = 4;
1025 let ResourceCycles = [1,1,1,1];
1026}
Craig Topper5a69a002018-03-21 06:28:42 +00001027def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1028 "BTR(16|32|64)mi8",
1029 "BTS(16|32|64)mi8",
1030 "SAR(8|16|32|64)m1",
1031 "SAR(8|16|32|64)mi",
1032 "SHL(8|16|32|64)m1",
1033 "SHL(8|16|32|64)mi",
1034 "SHR(8|16|32|64)m1",
1035 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001036
1037def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1038 let Latency = 6;
1039 let NumMicroOps = 4;
1040 let ResourceCycles = [1,1,1,1];
1041}
Craig Topperf0d04262018-04-06 16:16:48 +00001042def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1043 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001044
1045def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1046 let Latency = 6;
1047 let NumMicroOps = 6;
1048 let ResourceCycles = [1,5];
1049}
1050def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1051
Gadi Haber323f2e12017-10-24 20:19:47 +00001052def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1053 let Latency = 7;
1054 let NumMicroOps = 2;
1055 let ResourceCycles = [1,1];
1056}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001057def: InstRW<[BWWriteResGroup73], (instregex "VPSLLVQYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001058 "VPSRLVQYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001059 "VTESTPDYrm",
1060 "VTESTPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001061
1062def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1063 let Latency = 7;
1064 let NumMicroOps = 2;
1065 let ResourceCycles = [1,1];
1066}
Craig Topper5a69a002018-03-21 06:28:42 +00001067def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1068 "FCOM64m",
1069 "FCOMP32m",
1070 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001071
Gadi Haber323f2e12017-10-24 20:19:47 +00001072def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1073 let Latency = 7;
1074 let NumMicroOps = 2;
1075 let ResourceCycles = [1,1];
1076}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001077def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001078
Gadi Haber323f2e12017-10-24 20:19:47 +00001079def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1080 let Latency = 7;
1081 let NumMicroOps = 3;
1082 let ResourceCycles = [2,1];
1083}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001084def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001085 "MMX_PACKSSWBirm",
1086 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001087 "VMASKMOVPDrm",
1088 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001089 "VPMASKMOVDrm",
1090 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001091
1092def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1093 let Latency = 7;
1094 let NumMicroOps = 3;
1095 let ResourceCycles = [1,2];
1096}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001097def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1098 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001099
1100def BWWriteResGroup81 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1101 let Latency = 7;
1102 let NumMicroOps = 3;
1103 let ResourceCycles = [1,1,1];
1104}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001105def: InstRW<[BWWriteResGroup81], (instregex "(V?)PTESTrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001106
1107def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1108 let Latency = 7;
1109 let NumMicroOps = 3;
1110 let ResourceCycles = [1,1,1];
1111}
1112def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1113
Gadi Haber323f2e12017-10-24 20:19:47 +00001114def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1115 let Latency = 7;
1116 let NumMicroOps = 3;
1117 let ResourceCycles = [1,1,1];
1118}
Craig Topper5a69a002018-03-21 06:28:42 +00001119def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1120 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001121
Gadi Haber323f2e12017-10-24 20:19:47 +00001122def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1123 let Latency = 7;
1124 let NumMicroOps = 3;
1125 let ResourceCycles = [1,1,1];
1126}
Craig Topperf4cd9082018-01-19 05:47:32 +00001127def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001128
1129def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1130 let Latency = 7;
1131 let NumMicroOps = 5;
1132 let ResourceCycles = [1,1,1,2];
1133}
Craig Topper5a69a002018-03-21 06:28:42 +00001134def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1135 "ROL(8|16|32|64)mi",
1136 "ROR(8|16|32|64)m1",
1137 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001138
1139def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1140 let Latency = 7;
1141 let NumMicroOps = 5;
1142 let ResourceCycles = [1,1,1,2];
1143}
Craig Topper5a69a002018-03-21 06:28:42 +00001144def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001145
1146def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1147 let Latency = 7;
1148 let NumMicroOps = 5;
1149 let ResourceCycles = [1,1,1,1,1];
1150}
Craig Topper5a69a002018-03-21 06:28:42 +00001151def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1152 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001153
1154def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1155 let Latency = 7;
1156 let NumMicroOps = 7;
1157 let ResourceCycles = [2,2,1,2];
1158}
Craig Topper2d451e72018-03-18 08:38:06 +00001159def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001160
1161def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1162 let Latency = 8;
1163 let NumMicroOps = 2;
1164 let ResourceCycles = [1,1];
1165}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001166def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001167 "PDEP(32|64)rm",
1168 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001169 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001170
1171def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001172 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001173 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001174 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001175}
Craig Topperf846e2d2018-04-19 05:34:05 +00001176def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001177
Craig Topperf846e2d2018-04-19 05:34:05 +00001178def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1179 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001180 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001181 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001182}
Craig Topper5a69a002018-03-21 06:28:42 +00001183def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001184
Gadi Haber323f2e12017-10-24 20:19:47 +00001185def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1186 let Latency = 8;
1187 let NumMicroOps = 2;
1188 let ResourceCycles = [1,1];
1189}
Craig Topper5a69a002018-03-21 06:28:42 +00001190def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1191 "VPMOVSXBQYrm",
1192 "VPMOVSXBWYrm",
1193 "VPMOVSXDQYrm",
1194 "VPMOVSXWDYrm",
1195 "VPMOVSXWQYrm",
1196 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001197
Gadi Haber323f2e12017-10-24 20:19:47 +00001198def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1199 let Latency = 8;
1200 let NumMicroOps = 3;
1201 let ResourceCycles = [2,1];
1202}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001203def: InstRW<[BWWriteResGroup94], (instregex "VMASKMOVPDYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001204 "VMASKMOVPSYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001205 "VPMASKMOVDYrm",
1206 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001207
Gadi Haber323f2e12017-10-24 20:19:47 +00001208def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1209 let Latency = 8;
1210 let NumMicroOps = 5;
1211 let ResourceCycles = [1,1,1,2];
1212}
Craig Topper5a69a002018-03-21 06:28:42 +00001213def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1214 "RCL(8|16|32|64)mi",
1215 "RCR(8|16|32|64)m1",
1216 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001217
1218def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1219 let Latency = 8;
1220 let NumMicroOps = 5;
1221 let ResourceCycles = [1,1,2,1];
1222}
Craig Topper13a16502018-03-19 00:56:09 +00001223def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001224
1225def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1226 let Latency = 8;
1227 let NumMicroOps = 6;
1228 let ResourceCycles = [1,1,1,3];
1229}
Craig Topper9f834812018-04-01 21:54:24 +00001230def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001231
1232def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1233 let Latency = 8;
1234 let NumMicroOps = 6;
1235 let ResourceCycles = [1,1,1,2,1];
1236}
Craig Topper9f834812018-04-01 21:54:24 +00001237def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001238 "CMPXCHG(8|16|32|64)rm",
1239 "ROL(8|16|32|64)mCL",
1240 "SAR(8|16|32|64)mCL",
1241 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001242 "SHL(8|16|32|64)mCL",
1243 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001244def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1245 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001246
1247def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1248 let Latency = 9;
1249 let NumMicroOps = 2;
1250 let ResourceCycles = [1,1];
1251}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001252def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1253 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001254 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001255 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001256
1257def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1258 let Latency = 9;
1259 let NumMicroOps = 2;
1260 let ResourceCycles = [1,1];
1261}
Craig Topper5a69a002018-03-21 06:28:42 +00001262def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1263 "VPERM2I128rm",
1264 "VPERMDYrm",
1265 "VPERMPDYmi",
1266 "VPERMPSYrm",
1267 "VPERMQYmi",
1268 "VPMOVZXBDYrm",
1269 "VPMOVZXBQYrm",
1270 "VPMOVZXBWYrm",
1271 "VPMOVZXDQYrm",
1272 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001273
Gadi Haber323f2e12017-10-24 20:19:47 +00001274def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1275 let Latency = 9;
1276 let NumMicroOps = 3;
1277 let ResourceCycles = [1,1,1];
1278}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001279def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1280 "(V?)CVTSD2SIrm",
1281 "(V?)CVTSS2SI64rm",
1282 "(V?)CVTSS2SIrm",
1283 "(V?)CVTTSD2SI64rm",
1284 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001285 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001286 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001287
1288def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1289 let Latency = 9;
1290 let NumMicroOps = 3;
1291 let ResourceCycles = [1,1,1];
1292}
1293def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1294
1295def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1296 let Latency = 9;
1297 let NumMicroOps = 3;
1298 let ResourceCycles = [1,1,1];
1299}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001300def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001301def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001302 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001303 "CVTTPD2DQrm",
1304 "MMX_CVTPD2PIirm",
1305 "MMX_CVTPI2PDirm",
1306 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001307 "(V?)CVTDQ2PDrm",
1308 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001309
1310def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1311 let Latency = 9;
1312 let NumMicroOps = 3;
1313 let ResourceCycles = [1,1,1];
1314}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001315def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1316 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001317
Gadi Haber323f2e12017-10-24 20:19:47 +00001318def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1319 let Latency = 9;
1320 let NumMicroOps = 4;
1321 let ResourceCycles = [1,1,1,1];
1322}
Craig Topper5a69a002018-03-21 06:28:42 +00001323def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1324 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001325
1326def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1327 let Latency = 9;
1328 let NumMicroOps = 5;
1329 let ResourceCycles = [1,1,3];
1330}
1331def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1332
1333def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1334 let Latency = 9;
1335 let NumMicroOps = 5;
1336 let ResourceCycles = [1,2,1,1];
1337}
Craig Topper5a69a002018-03-21 06:28:42 +00001338def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1339 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001340
Gadi Haber323f2e12017-10-24 20:19:47 +00001341def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1342 let Latency = 10;
1343 let NumMicroOps = 2;
1344 let ResourceCycles = [1,1];
1345}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001346def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001347
Gadi Haber323f2e12017-10-24 20:19:47 +00001348def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1349 let Latency = 10;
1350 let NumMicroOps = 3;
1351 let ResourceCycles = [2,1];
1352}
Craig Topper5a69a002018-03-21 06:28:42 +00001353def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1354 "FICOM32m",
1355 "FICOMP16m",
1356 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001357
1358def BWWriteResGroup118 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1359 let Latency = 10;
1360 let NumMicroOps = 3;
1361 let ResourceCycles = [1,1,1];
1362}
1363def: InstRW<[BWWriteResGroup118], (instregex "VPTESTYrm")>;
1364
Gadi Haber323f2e12017-10-24 20:19:47 +00001365def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1366 let Latency = 10;
1367 let NumMicroOps = 4;
1368 let ResourceCycles = [1,1,1,1];
1369}
1370def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1371
1372def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001373 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001374 let NumMicroOps = 4;
1375 let ResourceCycles = [1,1,1,1];
1376}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001377def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001378
Craig Topper8104f262018-04-02 05:33:28 +00001379def BWWriteResGroup122 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001380 let Latency = 11;
1381 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001382 let ResourceCycles = [1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001383}
Craig Topper8104f262018-04-02 05:33:28 +00001384def: InstRW<[BWWriteResGroup122], (instregex "(V?)DIVPSrr")>;
1385
1386def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1387 let Latency = 11;
1388 let NumMicroOps = 1;
1389 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1390}
1391def: InstRW<[BWWriteResGroup122_1], (instregex "(V?)DIVSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001392
1393def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1394 let Latency = 11;
1395 let NumMicroOps = 2;
1396 let ResourceCycles = [1,1];
1397}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001398def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001399 "VPCMPGTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001400
Gadi Haber323f2e12017-10-24 20:19:47 +00001401def BWWriteResGroup126 : SchedWriteRes<[BWPort0,BWPort015]> {
1402 let Latency = 11;
1403 let NumMicroOps = 3;
1404 let ResourceCycles = [2,1];
1405}
Craig Topper5a69a002018-03-21 06:28:42 +00001406def: InstRW<[BWWriteResGroup126], (instregex "VRCPPSYr",
1407 "VRSQRTPSYr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001408
Gadi Haber323f2e12017-10-24 20:19:47 +00001409def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1410 let Latency = 11;
1411 let NumMicroOps = 3;
1412 let ResourceCycles = [1,1,1];
1413}
1414def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1415
Gadi Haber323f2e12017-10-24 20:19:47 +00001416def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1417 let Latency = 11;
1418 let NumMicroOps = 6;
1419 let ResourceCycles = [1,1,1,1,2];
1420}
Craig Topper5a69a002018-03-21 06:28:42 +00001421def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1422 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001423
1424def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1425 let Latency = 11;
1426 let NumMicroOps = 7;
1427 let ResourceCycles = [2,2,3];
1428}
Craig Topper5a69a002018-03-21 06:28:42 +00001429def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1430 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001431
1432def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1433 let Latency = 11;
1434 let NumMicroOps = 9;
1435 let ResourceCycles = [1,4,1,3];
1436}
1437def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1438
1439def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1440 let Latency = 11;
1441 let NumMicroOps = 11;
1442 let ResourceCycles = [2,9];
1443}
Craig Topper2d451e72018-03-18 08:38:06 +00001444def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1445def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001446
Gadi Haber323f2e12017-10-24 20:19:47 +00001447def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1448 let Latency = 12;
1449 let NumMicroOps = 3;
1450 let ResourceCycles = [2,1];
1451}
Simon Pilgrimbe51b202018-05-04 12:59:24 +00001452def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001453
Craig Topper8104f262018-04-02 05:33:28 +00001454def BWWriteResGroup137 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001455 let Latency = 11;
Gadi Haber323f2e12017-10-24 20:19:47 +00001456 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001457 let ResourceCycles = [1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001458}
Craig Topper8104f262018-04-02 05:33:28 +00001459def: InstRW<[BWWriteResGroup137], (instregex "(V?)SQRTPSr")>;
1460
1461def BWWriteResGroup137_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1462 let Latency = 11;
1463 let NumMicroOps = 1;
1464 let ResourceCycles = [1,4];
1465}
1466def: InstRW<[BWWriteResGroup137_1], (instregex "(V?)SQRTSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001467
Craig Topper8104f262018-04-02 05:33:28 +00001468def BWWriteResGroup139 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001469 let Latency = 14;
1470 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001471 let ResourceCycles = [1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001472}
Craig Topper8104f262018-04-02 05:33:28 +00001473def: InstRW<[BWWriteResGroup139], (instregex "(V?)DIVPDrr")>;
1474
1475def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1476 let Latency = 14;
1477 let NumMicroOps = 1;
1478 let ResourceCycles = [1,4];
1479}
1480def: InstRW<[BWWriteResGroup139_1], (instregex "(V?)DIVSDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001481
Gadi Haber323f2e12017-10-24 20:19:47 +00001482def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1483 let Latency = 14;
1484 let NumMicroOps = 3;
1485 let ResourceCycles = [1,1,1];
1486}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001487def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001488
Gadi Haber323f2e12017-10-24 20:19:47 +00001489def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1490 let Latency = 14;
1491 let NumMicroOps = 8;
1492 let ResourceCycles = [2,2,1,3];
1493}
1494def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1495
1496def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1497 let Latency = 14;
1498 let NumMicroOps = 10;
1499 let ResourceCycles = [2,3,1,4];
1500}
1501def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1502
1503def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1504 let Latency = 14;
1505 let NumMicroOps = 12;
1506 let ResourceCycles = [2,1,4,5];
1507}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001508def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001509
1510def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1511 let Latency = 15;
1512 let NumMicroOps = 1;
1513 let ResourceCycles = [1];
1514}
Craig Topper5a69a002018-03-21 06:28:42 +00001515def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1516 "DIVR_FST0r",
1517 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001518
Gadi Haber323f2e12017-10-24 20:19:47 +00001519def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1520 let Latency = 15;
1521 let NumMicroOps = 10;
1522 let ResourceCycles = [1,1,1,4,1,2];
1523}
Craig Topper13a16502018-03-19 00:56:09 +00001524def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001525
Craig Topper8104f262018-04-02 05:33:28 +00001526def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001527 let Latency = 16;
1528 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001529 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001530}
Craig Topper5a69a002018-03-21 06:28:42 +00001531def: InstRW<[BWWriteResGroup150], (instregex "(V?)DIVPSrm",
1532 "(V?)DIVSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001533
Gadi Haber323f2e12017-10-24 20:19:47 +00001534def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1535 let Latency = 16;
1536 let NumMicroOps = 14;
1537 let ResourceCycles = [1,1,1,4,2,5];
1538}
1539def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1540
1541def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1542 let Latency = 16;
1543 let NumMicroOps = 16;
1544 let ResourceCycles = [16];
1545}
Craig Topper5a69a002018-03-21 06:28:42 +00001546def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001547
Craig Topper8104f262018-04-02 05:33:28 +00001548def BWWriteResGroup155 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001549 let Latency = 17;
1550 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001551 let ResourceCycles = [2,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001552}
1553def: InstRW<[BWWriteResGroup155], (instregex "VDIVPSYrr")>;
1554
1555def BWWriteResGroup156 : SchedWriteRes<[BWPort0,BWPort23,BWPort015]> {
1556 let Latency = 17;
1557 let NumMicroOps = 4;
1558 let ResourceCycles = [2,1,1];
1559}
Craig Topper5a69a002018-03-21 06:28:42 +00001560def: InstRW<[BWWriteResGroup156], (instregex "VRCPPSYm",
1561 "VRSQRTPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001562
Craig Topper8104f262018-04-02 05:33:28 +00001563def BWWriteResGroup157 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001564 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001565 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001566 let ResourceCycles = [1,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001567}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001568def: InstRW<[BWWriteResGroup157], (instregex "(V?)SQRTPSm",
1569 "(V?)SQRTSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001570
Gadi Haber323f2e12017-10-24 20:19:47 +00001571def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1572 let Latency = 18;
1573 let NumMicroOps = 8;
1574 let ResourceCycles = [1,1,1,5];
1575}
Craig Topper5a69a002018-03-21 06:28:42 +00001576def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001577def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001578
1579def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1580 let Latency = 18;
1581 let NumMicroOps = 11;
1582 let ResourceCycles = [2,1,1,3,1,3];
1583}
Craig Topper13a16502018-03-19 00:56:09 +00001584def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001585
Craig Topper8104f262018-04-02 05:33:28 +00001586def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001587 let Latency = 19;
1588 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001589 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001590}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001591def: InstRW<[BWWriteResGroup161], (instregex "(V?)DIVPDrm",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001592 "(V?)DIVSDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001593
Gadi Haber323f2e12017-10-24 20:19:47 +00001594def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1595 let Latency = 20;
1596 let NumMicroOps = 1;
1597 let ResourceCycles = [1];
1598}
Craig Topper5a69a002018-03-21 06:28:42 +00001599def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1600 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001601 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001602
Gadi Haber323f2e12017-10-24 20:19:47 +00001603def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1604 let Latency = 20;
1605 let NumMicroOps = 8;
1606 let ResourceCycles = [1,1,1,1,1,1,2];
1607}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001608def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001609
Craig Topper8104f262018-04-02 05:33:28 +00001610def BWWriteResGroup168 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001611 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001612 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001613 let ResourceCycles = [1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001614}
Craig Topper8104f262018-04-02 05:33:28 +00001615def: InstRW<[BWWriteResGroup168], (instregex "(V?)SQRTPDr")>;
1616
1617def BWWriteResGroup168_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1618 let Latency = 16;
1619 let NumMicroOps = 1;
1620 let ResourceCycles = [1,8];
1621}
1622def: InstRW<[BWWriteResGroup168_1], (instregex "(V?)SQRTSDr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001623
1624def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1625 let Latency = 21;
1626 let NumMicroOps = 2;
1627 let ResourceCycles = [1,1];
1628}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001629def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001630
Craig Topper8104f262018-04-02 05:33:28 +00001631def BWWriteResGroup170 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001632 let Latency = 21;
1633 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001634 let ResourceCycles = [2,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001635}
1636def: InstRW<[BWWriteResGroup170], (instregex "VSQRTPSYr")>;
1637
1638def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1639 let Latency = 21;
1640 let NumMicroOps = 19;
1641 let ResourceCycles = [2,1,4,1,1,4,6];
1642}
1643def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1644
1645def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1646 let Latency = 22;
1647 let NumMicroOps = 18;
1648 let ResourceCycles = [1,1,16];
1649}
1650def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1651
Craig Topper8104f262018-04-02 05:33:28 +00001652def BWWriteResGroup173 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001653 let Latency = 23;
1654 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001655 let ResourceCycles = [2,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001656}
1657def: InstRW<[BWWriteResGroup173], (instregex "VDIVPDYrr")>;
1658
Craig Topper8104f262018-04-02 05:33:28 +00001659def BWWriteResGroup174 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001660 let Latency = 23;
1661 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001662 let ResourceCycles = [2,1,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001663}
1664def: InstRW<[BWWriteResGroup174], (instregex "VDIVPSYrm")>;
1665
Gadi Haber323f2e12017-10-24 20:19:47 +00001666def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1667 let Latency = 23;
1668 let NumMicroOps = 19;
1669 let ResourceCycles = [3,1,15];
1670}
Craig Topper391c6f92017-12-10 01:24:08 +00001671def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001672
1673def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1674 let Latency = 24;
1675 let NumMicroOps = 3;
1676 let ResourceCycles = [1,1,1];
1677}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001678def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001679
Craig Topper8104f262018-04-02 05:33:28 +00001680def BWWriteResGroup179 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001681 let Latency = 21;
Gadi Haber323f2e12017-10-24 20:19:47 +00001682 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001683 let ResourceCycles = [1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001684}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001685def: InstRW<[BWWriteResGroup179], (instregex "(V?)SQRTPDm",
1686 "(V?)SQRTSDm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001687
1688def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1689 let Latency = 26;
1690 let NumMicroOps = 2;
1691 let ResourceCycles = [1,1];
1692}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001693def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001694
Craig Topper8104f262018-04-02 05:33:28 +00001695def BWWriteResGroup181 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001696 let Latency = 27;
1697 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001698 let ResourceCycles = [2,1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001699}
1700def: InstRW<[BWWriteResGroup181], (instregex "VSQRTPSYm")>;
1701
1702def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1703 let Latency = 29;
1704 let NumMicroOps = 3;
1705 let ResourceCycles = [1,1,1];
1706}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001707def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001708
Craig Topper8104f262018-04-02 05:33:28 +00001709def BWWriteResGroup183 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001710 let Latency = 29;
1711 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001712 let ResourceCycles = [2,1,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001713}
1714def: InstRW<[BWWriteResGroup183], (instregex "VDIVPDYrm")>;
1715
1716def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1717 let Latency = 22;
1718 let NumMicroOps = 7;
1719 let ResourceCycles = [1,3,2,1];
1720}
Craig Topper17a31182017-12-16 18:35:29 +00001721def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001722
1723def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1724 let Latency = 23;
1725 let NumMicroOps = 9;
1726 let ResourceCycles = [1,3,4,1];
1727}
Craig Topper17a31182017-12-16 18:35:29 +00001728def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001729
1730def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1731 let Latency = 24;
1732 let NumMicroOps = 9;
1733 let ResourceCycles = [1,5,2,1];
1734}
Craig Topper17a31182017-12-16 18:35:29 +00001735def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001736
1737def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1738 let Latency = 25;
1739 let NumMicroOps = 7;
1740 let ResourceCycles = [1,3,2,1];
1741}
Craig Topper17a31182017-12-16 18:35:29 +00001742def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1743 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001744
1745def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1746 let Latency = 26;
1747 let NumMicroOps = 9;
1748 let ResourceCycles = [1,5,2,1];
1749}
Craig Topper17a31182017-12-16 18:35:29 +00001750def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001751
1752def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1753 let Latency = 26;
1754 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001755 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001756}
Craig Topper17a31182017-12-16 18:35:29 +00001757def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001758
1759def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1760 let Latency = 27;
1761 let NumMicroOps = 9;
1762 let ResourceCycles = [1,5,2,1];
1763}
Craig Topper17a31182017-12-16 18:35:29 +00001764def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001765
Gadi Haber323f2e12017-10-24 20:19:47 +00001766def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1767 let Latency = 29;
1768 let NumMicroOps = 27;
1769 let ResourceCycles = [1,5,1,1,19];
1770}
1771def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1772
1773def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1774 let Latency = 30;
1775 let NumMicroOps = 28;
1776 let ResourceCycles = [1,6,1,1,19];
1777}
Craig Topper2d451e72018-03-18 08:38:06 +00001778def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001779
1780def BWWriteResGroup187 : SchedWriteRes<[BWPort01,BWPort15,BWPort015,BWPort0156]> {
1781 let Latency = 31;
1782 let NumMicroOps = 31;
1783 let ResourceCycles = [8,1,21,1];
1784}
1785def: InstRW<[BWWriteResGroup187], (instregex "MMX_EMMS")>;
1786
Craig Topper8104f262018-04-02 05:33:28 +00001787def BWWriteResGroup189 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
1788 let Latency = 29;
Gadi Haber323f2e12017-10-24 20:19:47 +00001789 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001790 let ResourceCycles = [2,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00001791}
1792def: InstRW<[BWWriteResGroup189], (instregex "VSQRTPDYr")>;
1793
1794def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1795 let Latency = 34;
1796 let NumMicroOps = 8;
1797 let ResourceCycles = [2,2,2,1,1];
1798}
Craig Topper13a16502018-03-19 00:56:09 +00001799def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001800
1801def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
1802 let Latency = 34;
1803 let NumMicroOps = 23;
1804 let ResourceCycles = [1,5,3,4,10];
1805}
Craig Topper5a69a002018-03-21 06:28:42 +00001806def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
1807 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001808
1809def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1810 let Latency = 35;
1811 let NumMicroOps = 8;
1812 let ResourceCycles = [2,2,2,1,1];
1813}
Craig Topper13a16502018-03-19 00:56:09 +00001814def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001815
1816def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1817 let Latency = 35;
1818 let NumMicroOps = 23;
1819 let ResourceCycles = [1,5,2,1,4,10];
1820}
Craig Topper5a69a002018-03-21 06:28:42 +00001821def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
1822 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001823
Craig Topper8104f262018-04-02 05:33:28 +00001824def BWWriteResGroup195 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
1825 let Latency = 35;
Gadi Haber323f2e12017-10-24 20:19:47 +00001826 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001827 let ResourceCycles = [2,1,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00001828}
1829def: InstRW<[BWWriteResGroup195], (instregex "VSQRTPDYm")>;
1830
1831def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
1832 let Latency = 42;
1833 let NumMicroOps = 22;
1834 let ResourceCycles = [2,20];
1835}
Craig Topper2d451e72018-03-18 08:38:06 +00001836def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001837
1838def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
1839 let Latency = 60;
1840 let NumMicroOps = 64;
1841 let ResourceCycles = [2,2,8,1,10,2,39];
1842}
1843def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001844
1845def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1846 let Latency = 63;
1847 let NumMicroOps = 88;
1848 let ResourceCycles = [4,4,31,1,2,1,45];
1849}
Craig Topper2d451e72018-03-18 08:38:06 +00001850def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001851
1852def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1853 let Latency = 63;
1854 let NumMicroOps = 90;
1855 let ResourceCycles = [4,2,33,1,2,1,47];
1856}
Craig Topper2d451e72018-03-18 08:38:06 +00001857def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001858
1859def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
1860 let Latency = 75;
1861 let NumMicroOps = 15;
1862 let ResourceCycles = [6,3,6];
1863}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00001864def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001865
1866def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
1867 let Latency = 80;
1868 let NumMicroOps = 32;
1869 let ResourceCycles = [7,7,3,3,1,11];
1870}
1871def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
1872
1873def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
1874 let Latency = 115;
1875 let NumMicroOps = 100;
1876 let ResourceCycles = [9,9,11,8,1,11,21,30];
1877}
1878def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001879
1880} // SchedModel
1881