blob: 593fb6e819b39c59d62117b2a58e20501674111e [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.
318def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
319def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
320def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
321
Gadi Haber323f2e12017-10-24 20:19:47 +0000322// AES instructions.
323def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
324 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000325 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000326 let ResourceCycles = [1];
327}
328def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000329 let Latency = 12;
330 let NumMicroOps = 2;
331 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000332}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000333
Gadi Haber323f2e12017-10-24 20:19:47 +0000334def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
335 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000336 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000337 let ResourceCycles = [2];
338}
339def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000340 let Latency = 19;
341 let NumMicroOps = 3;
342 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000343}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000344
345def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
346 let Latency = 29;
347 let NumMicroOps = 11;
348 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000349}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000350def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
351 let Latency = 33;
352 let NumMicroOps = 11;
353 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000354}
355
356// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000357defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000358
359// Catch-all for expensive system instructions.
360def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
361
362// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000363defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
364defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
365defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
366defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
Gadi Haber323f2e12017-10-24 20:19:47 +0000367
368// Old microcoded instructions that nobody use.
369def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
370
371// Fence instructions.
372def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
373
Craig Topper05242bf2018-04-21 18:07:36 +0000374// Load/store MXCSR.
375def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
376def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
377
Gadi Haber323f2e12017-10-24 20:19:47 +0000378// Nop, not very useful expect it provides a model for nops!
379def : WriteRes<WriteNop, []>;
380
381////////////////////////////////////////////////////////////////////////////////
382// Horizontal add/sub instructions.
383////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000384
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000385defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3, 5>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000386defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000387defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3, 5>;
388defm : BWWriteResPair<WritePHAddY, [BWPort5,BWPort15], 3, [2,1], 3, 6>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000389
390// Remaining instrs.
391
392def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
393 let Latency = 1;
394 let NumMicroOps = 1;
395 let ResourceCycles = [1];
396}
Craig Topper5a69a002018-03-21 06:28:42 +0000397def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
398 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000399 "(V?)MOVPDI2DIrr",
400 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000401 "VPSLLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000402 "VPSRLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000403 "VTESTPD(Y?)rr",
404 "VTESTPS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000405
406def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
407 let Latency = 1;
408 let NumMicroOps = 1;
409 let ResourceCycles = [1];
410}
Craig Topper5a69a002018-03-21 06:28:42 +0000411def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
412 "COM_FST0r",
413 "UCOM_FPr",
414 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000415
416def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
417 let Latency = 1;
418 let NumMicroOps = 1;
419 let ResourceCycles = [1];
420}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000421def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000422 "MMX_MOVD64to64rr",
423 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000424 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000425 "(V?)MOVDI2PDIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000426
427def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
428 let Latency = 1;
429 let NumMicroOps = 1;
430 let ResourceCycles = [1];
431}
432def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
433
434def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
435 let Latency = 1;
436 let NumMicroOps = 1;
437 let ResourceCycles = [1];
438}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000439def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000440
441def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
442 let Latency = 1;
443 let NumMicroOps = 1;
444 let ResourceCycles = [1];
445}
Craig Topperfbe31322018-04-05 21:56:19 +0000446def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000447def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
448 "ADC(16|32|64)i",
449 "ADC(8|16|32|64)rr",
450 "ADCX(32|64)rr",
451 "ADOX(32|64)rr",
452 "BT(16|32|64)ri8",
453 "BT(16|32|64)rr",
454 "BTC(16|32|64)ri8",
455 "BTC(16|32|64)rr",
456 "BTR(16|32|64)ri8",
457 "BTR(16|32|64)rr",
458 "BTS(16|32|64)ri8",
459 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000460 "SBB(16|32|64)ri",
461 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000462 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000463
464def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
465 let Latency = 1;
466 let NumMicroOps = 1;
467 let ResourceCycles = [1];
468}
Craig Topper5a69a002018-03-21 06:28:42 +0000469def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
470 "BLSI(32|64)rr",
471 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000472 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000473
474def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
475 let Latency = 1;
476 let NumMicroOps = 1;
477 let ResourceCycles = [1];
478}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000479def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000480 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000481
482def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
483 let Latency = 1;
484 let NumMicroOps = 1;
485 let ResourceCycles = [1];
486}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000487def: InstRW<[BWWriteResGroup9], (instrs LAHF, SAHF)>; // TODO: This doesnt match Agner's data
488def: InstRW<[BWWriteResGroup9], (instregex "NOOP",
Craig Topper5a69a002018-03-21 06:28:42 +0000489 "SGDT64m",
490 "SIDT64m",
Craig Topper5a69a002018-03-21 06:28:42 +0000491 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000492 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000493 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000494
495def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
496 let Latency = 1;
497 let NumMicroOps = 2;
498 let ResourceCycles = [1,1];
499}
Craig Topper5a69a002018-03-21 06:28:42 +0000500def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
501 "MMX_MOVD64from64rm",
502 "MMX_MOVD64mr",
503 "MMX_MOVNTQmr",
504 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000505 "MOVNTI_64mr",
506 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000507 "ST_FP(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000508 "VEXTRACTF128mr",
509 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000510 "(V?)MOVAPD(Y?)mr",
511 "(V?)MOVAPS(Y?)mr",
512 "(V?)MOVDQA(Y?)mr",
513 "(V?)MOVDQU(Y?)mr",
514 "(V?)MOVHPDmr",
515 "(V?)MOVHPSmr",
516 "(V?)MOVLPDmr",
517 "(V?)MOVLPSmr",
518 "(V?)MOVNTDQ(V?)mr",
519 "(V?)MOVNTPD(V?)mr",
520 "(V?)MOVNTPS(V?)mr",
521 "(V?)MOVPDI2DImr",
522 "(V?)MOVPQI2QImr",
523 "(V?)MOVPQIto64mr",
524 "(V?)MOVSDmr",
525 "(V?)MOVSSmr",
526 "(V?)MOVUPD(Y?)mr",
527 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000528
Gadi Haber323f2e12017-10-24 20:19:47 +0000529def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
530 let Latency = 2;
531 let NumMicroOps = 2;
532 let ResourceCycles = [2];
533}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000534def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000535
536def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
537 let Latency = 2;
538 let NumMicroOps = 2;
539 let ResourceCycles = [2];
540}
Craig Topper5a69a002018-03-21 06:28:42 +0000541def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
542 "ROL(8|16|32|64)ri",
543 "ROR(8|16|32|64)r1",
544 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000545
546def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
547 let Latency = 2;
548 let NumMicroOps = 2;
549 let ResourceCycles = [2];
550}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000551def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
552 MFENCE,
553 WAIT,
554 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000555
556def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
557 let Latency = 2;
558 let NumMicroOps = 2;
559 let ResourceCycles = [1,1];
560}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000561def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000562 "(V?)CVTPS2PDrr",
563 "(V?)CVTSS2SDrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000564 "(V?)PTESTrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000565
566def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
567 let Latency = 2;
568 let NumMicroOps = 2;
569 let ResourceCycles = [1,1];
570}
571def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
572
573def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
574 let Latency = 2;
575 let NumMicroOps = 2;
576 let ResourceCycles = [1,1];
577}
578def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
579
580def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
581 let Latency = 2;
582 let NumMicroOps = 2;
583 let ResourceCycles = [1,1];
584}
585def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
586
587def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
588 let Latency = 2;
589 let NumMicroOps = 2;
590 let ResourceCycles = [1,1];
591}
Craig Topper498875f2018-04-04 17:54:19 +0000592def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
593
594def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
595 let Latency = 1;
596 let NumMicroOps = 1;
597 let ResourceCycles = [1];
598}
599def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000600
601def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
602 let Latency = 2;
603 let NumMicroOps = 2;
604 let ResourceCycles = [1,1];
605}
Craig Topper2d451e72018-03-18 08:38:06 +0000606def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000607def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000608def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
609 "ADC8ri",
610 "CMOV(A|BE)(16|32|64)rr",
611 "SBB8i8",
612 "SBB8ri",
613 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000614
Gadi Haber323f2e12017-10-24 20:19:47 +0000615def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
616 let Latency = 2;
617 let NumMicroOps = 3;
618 let ResourceCycles = [1,1,1];
619}
620def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
621
Gadi Haber323f2e12017-10-24 20:19:47 +0000622def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
623 let Latency = 2;
624 let NumMicroOps = 3;
625 let ResourceCycles = [1,1,1];
626}
627def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
628
629def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
630 let Latency = 2;
631 let NumMicroOps = 3;
632 let ResourceCycles = [1,1,1];
633}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000634def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
635 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000636def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000637 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000638
Gadi Haber323f2e12017-10-24 20:19:47 +0000639def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
640 let Latency = 3;
641 let NumMicroOps = 1;
642 let ResourceCycles = [1];
643}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000644def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000645 "PDEP(32|64)rr",
646 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000647 "SHLD(16|32|64)rri8",
648 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000649 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000650
651def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000652 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000653 let NumMicroOps = 2;
654 let ResourceCycles = [1,1];
655}
Clement Courbet327fac42018-03-07 08:14:02 +0000656def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000657
658def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
659 let Latency = 3;
660 let NumMicroOps = 1;
661 let ResourceCycles = [1];
662}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000663def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
664 "VPBROADCASTWrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000665 "VPMOVSXBDYrr",
666 "VPMOVSXBQYrr",
667 "VPMOVSXBWYrr",
668 "VPMOVSXDQYrr",
669 "VPMOVSXWDYrr",
670 "VPMOVSXWQYrr",
671 "VPMOVZXBDYrr",
672 "VPMOVZXBQYrr",
673 "VPMOVZXBWYrr",
674 "VPMOVZXDQYrr",
675 "VPMOVZXWDYrr",
676 "VPMOVZXWQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000677
Gadi Haber323f2e12017-10-24 20:19:47 +0000678def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000679 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000680 let NumMicroOps = 3;
681 let ResourceCycles = [3];
682}
Craig Topperb5f26592018-04-19 18:00:17 +0000683def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
684 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
685 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000686
Gadi Haber323f2e12017-10-24 20:19:47 +0000687def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
688 let Latency = 3;
689 let NumMicroOps = 3;
690 let ResourceCycles = [2,1];
691}
Craig Topper5a69a002018-03-21 06:28:42 +0000692def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
693 "MMX_PACKSSWBirr",
694 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000695
696def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
697 let Latency = 3;
698 let NumMicroOps = 3;
699 let ResourceCycles = [1,2];
700}
701def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
702
703def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
704 let Latency = 3;
705 let NumMicroOps = 3;
706 let ResourceCycles = [1,2];
707}
Craig Topper5a69a002018-03-21 06:28:42 +0000708def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
709 "RCL(8|16|32|64)ri",
710 "RCR(8|16|32|64)r1",
711 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000712
713def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
714 let Latency = 3;
715 let NumMicroOps = 3;
716 let ResourceCycles = [2,1];
717}
Craig Topper5a69a002018-03-21 06:28:42 +0000718def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
719 "ROR(8|16|32|64)rCL",
720 "SAR(8|16|32|64)rCL",
721 "SHL(8|16|32|64)rCL",
722 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000723
724def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
725 let Latency = 3;
726 let NumMicroOps = 4;
727 let ResourceCycles = [1,1,1,1];
728}
729def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
730
731def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
732 let Latency = 3;
733 let NumMicroOps = 4;
734 let ResourceCycles = [1,1,1,1];
735}
Craig Topper5a69a002018-03-21 06:28:42 +0000736def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
737 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000738
739def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
740 let Latency = 4;
741 let NumMicroOps = 2;
742 let ResourceCycles = [1,1];
743}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000744def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
745 "(V?)CVTSD2SIrr",
746 "(V?)CVTSS2SI64rr",
747 "(V?)CVTSS2SIrr",
748 "(V?)CVTTSD2SI64rr",
749 "(V?)CVTTSD2SIrr",
750 "(V?)CVTTSS2SI64rr",
751 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000752
753def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
754 let Latency = 4;
755 let NumMicroOps = 2;
756 let ResourceCycles = [1,1];
757}
Craig Topper5a69a002018-03-21 06:28:42 +0000758def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000759 "VPTESTYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000760
761def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
762 let Latency = 4;
763 let NumMicroOps = 2;
764 let ResourceCycles = [1,1];
765}
766def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
767
768def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
769 let Latency = 4;
770 let NumMicroOps = 2;
771 let ResourceCycles = [1,1];
772}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000773def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000774def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000775 "MMX_CVTPI2PDirr",
776 "MMX_CVTPS2PIirr",
777 "MMX_CVTTPD2PIirr",
778 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000779 "(V?)CVTDQ2PDrr",
780 "(V?)CVTPD2DQrr",
781 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000782 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000783 "(V?)CVTSD2SSrr",
784 "(V?)CVTSI642SDrr",
785 "(V?)CVTSI2SDrr",
786 "(V?)CVTSI2SSrr",
787 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000788
789def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
790 let Latency = 4;
791 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000792 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000793}
Craig Topper5a69a002018-03-21 06:28:42 +0000794def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000795
796def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
797 let Latency = 4;
798 let NumMicroOps = 3;
799 let ResourceCycles = [1,1,1];
800}
801def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
802
803def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
804 let Latency = 4;
805 let NumMicroOps = 3;
806 let ResourceCycles = [1,1,1];
807}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000808def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
809 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000810
811def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
812 let Latency = 4;
813 let NumMicroOps = 4;
814 let ResourceCycles = [4];
815}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000816def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000817
818def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
819 let Latency = 4;
820 let NumMicroOps = 4;
821 let ResourceCycles = [1,3];
822}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000823def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000824
825def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
826 let Latency = 5;
827 let NumMicroOps = 1;
828 let ResourceCycles = [1];
829}
Simon Pilgrima53d3302018-05-02 16:16:24 +0000830def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr",
831 "MUL_FPrST0",
832 "MUL_FST0r",
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000833 "MUL_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000834
Gadi Haber323f2e12017-10-24 20:19:47 +0000835def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
836 let Latency = 5;
837 let NumMicroOps = 1;
838 let ResourceCycles = [1];
839}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000840def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000841 "MOVSX(16|32|64)rm32",
842 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000843 "MOVZX(16|32|64)rm16",
844 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000845 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000846 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000847 "(V?)MOVSHDUPrm",
848 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000849 "VPBROADCASTDrm",
850 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000851
852def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
853 let Latency = 5;
854 let NumMicroOps = 3;
855 let ResourceCycles = [1,2];
856}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000857def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000858
859def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
860 let Latency = 5;
861 let NumMicroOps = 3;
862 let ResourceCycles = [1,1,1];
863}
864def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
865
866def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000867 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000868 let NumMicroOps = 3;
869 let ResourceCycles = [1,1,1];
870}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000871def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000872
873def BWWriteResGroup53 : SchedWriteRes<[BWPort0,BWPort4,BWPort237,BWPort15]> {
874 let Latency = 5;
875 let NumMicroOps = 4;
876 let ResourceCycles = [1,1,1,1];
877}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000878def: InstRW<[BWWriteResGroup53], (instregex "VMASKMOVPD(Y?)mr",
879 "VMASKMOVPS(Y?)mr",
880 "VPMASKMOVD(Y?)mr",
881 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000882
883def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
884 let Latency = 5;
885 let NumMicroOps = 5;
886 let ResourceCycles = [1,4];
887}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000888def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000889
890def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
891 let Latency = 5;
892 let NumMicroOps = 5;
893 let ResourceCycles = [1,4];
894}
895def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
896
897def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
898 let Latency = 5;
899 let NumMicroOps = 5;
900 let ResourceCycles = [2,3];
901}
Craig Topper5a69a002018-03-21 06:28:42 +0000902def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000903
904def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
905 let Latency = 5;
906 let NumMicroOps = 6;
907 let ResourceCycles = [1,1,4];
908}
Craig Topper5a69a002018-03-21 06:28:42 +0000909def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000910
911def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
912 let Latency = 6;
913 let NumMicroOps = 1;
914 let ResourceCycles = [1];
915}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000916def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000917 "VBROADCASTF128",
918 "VBROADCASTI128",
919 "VBROADCASTSDYrm",
920 "VBROADCASTSSYrm",
921 "VLDDQUYrm",
922 "VMOVAPDYrm",
923 "VMOVAPSYrm",
924 "VMOVDDUPYrm",
925 "VMOVDQAYrm",
926 "VMOVDQUYrm",
927 "VMOVNTDQAYrm",
928 "VMOVSHDUPYrm",
929 "VMOVSLDUPYrm",
930 "VMOVUPDYrm",
931 "VMOVUPSYrm",
932 "VPBROADCASTDYrm",
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000933 "VPBROADCASTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000934
935def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
936 let Latency = 6;
937 let NumMicroOps = 2;
938 let ResourceCycles = [1,1];
939}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000940def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000941 "(V?)CVTPS2PDrm",
942 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000943 "VPSLLVQrm",
944 "VPSRLVQrm",
945 "VTESTPDrm",
946 "VTESTPSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000947
948def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
949 let Latency = 6;
950 let NumMicroOps = 2;
951 let ResourceCycles = [1,1];
952}
Craig Topper5a69a002018-03-21 06:28:42 +0000953def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
954 "VCVTPD2DQYrr",
955 "VCVTPD2PSYrr",
956 "VCVTPS2PHYrr",
957 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000958
Gadi Haber323f2e12017-10-24 20:19:47 +0000959def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
960 let Latency = 6;
961 let NumMicroOps = 2;
962 let ResourceCycles = [1,1];
963}
Craig Topper5a69a002018-03-21 06:28:42 +0000964def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
965 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000966
967def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
968 let Latency = 6;
969 let NumMicroOps = 2;
970 let ResourceCycles = [1,1];
971}
Craig Topperdfccafe2018-04-18 06:41:25 +0000972def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +0000973def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
974 ADCX32rm, ADCX64rm,
975 ADOX32rm, ADOX64rm,
976 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000977
978def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
979 let Latency = 6;
980 let NumMicroOps = 2;
981 let ResourceCycles = [1,1];
982}
Craig Topper5a69a002018-03-21 06:28:42 +0000983def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
984 "BLSI(32|64)rm",
985 "BLSMSK(32|64)rm",
986 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +0000987 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000988
989def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
990 let Latency = 6;
991 let NumMicroOps = 2;
992 let ResourceCycles = [1,1];
993}
Simon Pilgrim06e16542018-04-22 18:35:53 +0000994def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +0000995 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000996 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000997
998def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
999 let Latency = 6;
1000 let NumMicroOps = 2;
1001 let ResourceCycles = [1,1];
1002}
Craig Topper2d451e72018-03-18 08:38:06 +00001003def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001004def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001005
1006def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1007 let Latency = 6;
1008 let NumMicroOps = 4;
1009 let ResourceCycles = [1,1,2];
1010}
Craig Topper5a69a002018-03-21 06:28:42 +00001011def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1012 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001013
1014def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1015 let Latency = 6;
1016 let NumMicroOps = 4;
1017 let ResourceCycles = [1,1,1,1];
1018}
1019def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1020
1021def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1022 let Latency = 6;
1023 let NumMicroOps = 4;
1024 let ResourceCycles = [1,1,1,1];
1025}
Craig Topper5a69a002018-03-21 06:28:42 +00001026def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1027 "BTR(16|32|64)mi8",
1028 "BTS(16|32|64)mi8",
1029 "SAR(8|16|32|64)m1",
1030 "SAR(8|16|32|64)mi",
1031 "SHL(8|16|32|64)m1",
1032 "SHL(8|16|32|64)mi",
1033 "SHR(8|16|32|64)m1",
1034 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001035
1036def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1037 let Latency = 6;
1038 let NumMicroOps = 4;
1039 let ResourceCycles = [1,1,1,1];
1040}
Craig Topperf0d04262018-04-06 16:16:48 +00001041def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1042 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001043
1044def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1045 let Latency = 6;
1046 let NumMicroOps = 6;
1047 let ResourceCycles = [1,5];
1048}
1049def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1050
Gadi Haber323f2e12017-10-24 20:19:47 +00001051def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1052 let Latency = 7;
1053 let NumMicroOps = 2;
1054 let ResourceCycles = [1,1];
1055}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001056def: InstRW<[BWWriteResGroup73], (instregex "VPSLLVQYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001057 "VPSRLVQYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001058 "VTESTPDYrm",
1059 "VTESTPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001060
1061def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1062 let Latency = 7;
1063 let NumMicroOps = 2;
1064 let ResourceCycles = [1,1];
1065}
Craig Topper5a69a002018-03-21 06:28:42 +00001066def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1067 "FCOM64m",
1068 "FCOMP32m",
1069 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001070
Gadi Haber323f2e12017-10-24 20:19:47 +00001071def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1072 let Latency = 7;
1073 let NumMicroOps = 2;
1074 let ResourceCycles = [1,1];
1075}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001076def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001077
Gadi Haber323f2e12017-10-24 20:19:47 +00001078def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1079 let Latency = 7;
1080 let NumMicroOps = 3;
1081 let ResourceCycles = [2,1];
1082}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001083def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001084 "MMX_PACKSSWBirm",
1085 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001086 "VMASKMOVPDrm",
1087 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001088 "VPMASKMOVDrm",
1089 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001090
1091def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1092 let Latency = 7;
1093 let NumMicroOps = 3;
1094 let ResourceCycles = [1,2];
1095}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001096def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1097 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001098
1099def BWWriteResGroup81 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1100 let Latency = 7;
1101 let NumMicroOps = 3;
1102 let ResourceCycles = [1,1,1];
1103}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001104def: InstRW<[BWWriteResGroup81], (instregex "(V?)PTESTrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001105
1106def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1107 let Latency = 7;
1108 let NumMicroOps = 3;
1109 let ResourceCycles = [1,1,1];
1110}
1111def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1112
Gadi Haber323f2e12017-10-24 20:19:47 +00001113def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1114 let Latency = 7;
1115 let NumMicroOps = 3;
1116 let ResourceCycles = [1,1,1];
1117}
Craig Topper5a69a002018-03-21 06:28:42 +00001118def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1119 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001120
Gadi Haber323f2e12017-10-24 20:19:47 +00001121def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1122 let Latency = 7;
1123 let NumMicroOps = 3;
1124 let ResourceCycles = [1,1,1];
1125}
Craig Topperf4cd9082018-01-19 05:47:32 +00001126def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001127
1128def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1129 let Latency = 7;
1130 let NumMicroOps = 5;
1131 let ResourceCycles = [1,1,1,2];
1132}
Craig Topper5a69a002018-03-21 06:28:42 +00001133def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1134 "ROL(8|16|32|64)mi",
1135 "ROR(8|16|32|64)m1",
1136 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001137
1138def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1139 let Latency = 7;
1140 let NumMicroOps = 5;
1141 let ResourceCycles = [1,1,1,2];
1142}
Craig Topper5a69a002018-03-21 06:28:42 +00001143def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001144
1145def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1146 let Latency = 7;
1147 let NumMicroOps = 5;
1148 let ResourceCycles = [1,1,1,1,1];
1149}
Craig Topper5a69a002018-03-21 06:28:42 +00001150def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1151 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001152
1153def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1154 let Latency = 7;
1155 let NumMicroOps = 7;
1156 let ResourceCycles = [2,2,1,2];
1157}
Craig Topper2d451e72018-03-18 08:38:06 +00001158def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001159
1160def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1161 let Latency = 8;
1162 let NumMicroOps = 2;
1163 let ResourceCycles = [1,1];
1164}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001165def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001166 "PDEP(32|64)rm",
1167 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001168 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001169
1170def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001171 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001172 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001173 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001174}
Craig Topperf846e2d2018-04-19 05:34:05 +00001175def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001176
Craig Topperf846e2d2018-04-19 05:34:05 +00001177def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1178 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001179 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001180 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001181}
Craig Topper5a69a002018-03-21 06:28:42 +00001182def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001183
Gadi Haber323f2e12017-10-24 20:19:47 +00001184def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1185 let Latency = 8;
1186 let NumMicroOps = 2;
1187 let ResourceCycles = [1,1];
1188}
Craig Topper5a69a002018-03-21 06:28:42 +00001189def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1190 "VPMOVSXBQYrm",
1191 "VPMOVSXBWYrm",
1192 "VPMOVSXDQYrm",
1193 "VPMOVSXWDYrm",
1194 "VPMOVSXWQYrm",
1195 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001196
Gadi Haber323f2e12017-10-24 20:19:47 +00001197def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1198 let Latency = 8;
1199 let NumMicroOps = 3;
1200 let ResourceCycles = [2,1];
1201}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001202def: InstRW<[BWWriteResGroup94], (instregex "VMASKMOVPDYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001203 "VMASKMOVPSYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001204 "VPMASKMOVDYrm",
1205 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001206
Gadi Haber323f2e12017-10-24 20:19:47 +00001207def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1208 let Latency = 8;
1209 let NumMicroOps = 5;
1210 let ResourceCycles = [1,1,1,2];
1211}
Craig Topper5a69a002018-03-21 06:28:42 +00001212def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1213 "RCL(8|16|32|64)mi",
1214 "RCR(8|16|32|64)m1",
1215 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001216
1217def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1218 let Latency = 8;
1219 let NumMicroOps = 5;
1220 let ResourceCycles = [1,1,2,1];
1221}
Craig Topper13a16502018-03-19 00:56:09 +00001222def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001223
1224def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1225 let Latency = 8;
1226 let NumMicroOps = 6;
1227 let ResourceCycles = [1,1,1,3];
1228}
Craig Topper9f834812018-04-01 21:54:24 +00001229def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001230
1231def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1232 let Latency = 8;
1233 let NumMicroOps = 6;
1234 let ResourceCycles = [1,1,1,2,1];
1235}
Craig Topper9f834812018-04-01 21:54:24 +00001236def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001237 "CMPXCHG(8|16|32|64)rm",
1238 "ROL(8|16|32|64)mCL",
1239 "SAR(8|16|32|64)mCL",
1240 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001241 "SHL(8|16|32|64)mCL",
1242 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001243def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1244 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001245
1246def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1247 let Latency = 9;
1248 let NumMicroOps = 2;
1249 let ResourceCycles = [1,1];
1250}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001251def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1252 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001253 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001254 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001255
1256def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1257 let Latency = 9;
1258 let NumMicroOps = 2;
1259 let ResourceCycles = [1,1];
1260}
Craig Topper5a69a002018-03-21 06:28:42 +00001261def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1262 "VPERM2I128rm",
1263 "VPERMDYrm",
1264 "VPERMPDYmi",
1265 "VPERMPSYrm",
1266 "VPERMQYmi",
1267 "VPMOVZXBDYrm",
1268 "VPMOVZXBQYrm",
1269 "VPMOVZXBWYrm",
1270 "VPMOVZXDQYrm",
1271 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001272
Gadi Haber323f2e12017-10-24 20:19:47 +00001273def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1274 let Latency = 9;
1275 let NumMicroOps = 3;
1276 let ResourceCycles = [1,1,1];
1277}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001278def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1279 "(V?)CVTSD2SIrm",
1280 "(V?)CVTSS2SI64rm",
1281 "(V?)CVTSS2SIrm",
1282 "(V?)CVTTSD2SI64rm",
1283 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001284 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001285 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001286
1287def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1288 let Latency = 9;
1289 let NumMicroOps = 3;
1290 let ResourceCycles = [1,1,1];
1291}
1292def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1293
1294def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1295 let Latency = 9;
1296 let NumMicroOps = 3;
1297 let ResourceCycles = [1,1,1];
1298}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001299def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001300def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001301 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001302 "CVTTPD2DQrm",
1303 "MMX_CVTPD2PIirm",
1304 "MMX_CVTPI2PDirm",
1305 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001306 "(V?)CVTDQ2PDrm",
1307 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001308
1309def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1310 let Latency = 9;
1311 let NumMicroOps = 3;
1312 let ResourceCycles = [1,1,1];
1313}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001314def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1315 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001316
Gadi Haber323f2e12017-10-24 20:19:47 +00001317def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1318 let Latency = 9;
1319 let NumMicroOps = 4;
1320 let ResourceCycles = [1,1,1,1];
1321}
Craig Topper5a69a002018-03-21 06:28:42 +00001322def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1323 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001324
1325def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1326 let Latency = 9;
1327 let NumMicroOps = 5;
1328 let ResourceCycles = [1,1,3];
1329}
1330def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1331
1332def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1333 let Latency = 9;
1334 let NumMicroOps = 5;
1335 let ResourceCycles = [1,2,1,1];
1336}
Craig Topper5a69a002018-03-21 06:28:42 +00001337def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1338 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001339
Gadi Haber323f2e12017-10-24 20:19:47 +00001340def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1341 let Latency = 10;
1342 let NumMicroOps = 2;
1343 let ResourceCycles = [1,1];
1344}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001345def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001346
Gadi Haber323f2e12017-10-24 20:19:47 +00001347def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1348 let Latency = 10;
1349 let NumMicroOps = 3;
1350 let ResourceCycles = [2,1];
1351}
Craig Topper5a69a002018-03-21 06:28:42 +00001352def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1353 "FICOM32m",
1354 "FICOMP16m",
1355 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001356
1357def BWWriteResGroup118 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1358 let Latency = 10;
1359 let NumMicroOps = 3;
1360 let ResourceCycles = [1,1,1];
1361}
1362def: InstRW<[BWWriteResGroup118], (instregex "VPTESTYrm")>;
1363
Gadi Haber323f2e12017-10-24 20:19:47 +00001364def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1365 let Latency = 10;
1366 let NumMicroOps = 4;
1367 let ResourceCycles = [1,1,1,1];
1368}
1369def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1370
1371def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001372 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001373 let NumMicroOps = 4;
1374 let ResourceCycles = [1,1,1,1];
1375}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001376def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001377
Craig Topper8104f262018-04-02 05:33:28 +00001378def BWWriteResGroup122 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001379 let Latency = 11;
1380 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001381 let ResourceCycles = [1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001382}
Craig Topper8104f262018-04-02 05:33:28 +00001383def: InstRW<[BWWriteResGroup122], (instregex "(V?)DIVPSrr")>;
1384
1385def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1386 let Latency = 11;
1387 let NumMicroOps = 1;
1388 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1389}
1390def: InstRW<[BWWriteResGroup122_1], (instregex "(V?)DIVSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001391
1392def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1393 let Latency = 11;
1394 let NumMicroOps = 2;
1395 let ResourceCycles = [1,1];
1396}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001397def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001398 "VPCMPGTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001399
Gadi Haber323f2e12017-10-24 20:19:47 +00001400def BWWriteResGroup126 : SchedWriteRes<[BWPort0,BWPort015]> {
1401 let Latency = 11;
1402 let NumMicroOps = 3;
1403 let ResourceCycles = [2,1];
1404}
Craig Topper5a69a002018-03-21 06:28:42 +00001405def: InstRW<[BWWriteResGroup126], (instregex "VRCPPSYr",
1406 "VRSQRTPSYr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001407
Gadi Haber323f2e12017-10-24 20:19:47 +00001408def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1409 let Latency = 11;
1410 let NumMicroOps = 3;
1411 let ResourceCycles = [1,1,1];
1412}
1413def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1414
Gadi Haber323f2e12017-10-24 20:19:47 +00001415def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1416 let Latency = 11;
1417 let NumMicroOps = 6;
1418 let ResourceCycles = [1,1,1,1,2];
1419}
Craig Topper5a69a002018-03-21 06:28:42 +00001420def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1421 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001422
1423def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1424 let Latency = 11;
1425 let NumMicroOps = 7;
1426 let ResourceCycles = [2,2,3];
1427}
Craig Topper5a69a002018-03-21 06:28:42 +00001428def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1429 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001430
1431def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1432 let Latency = 11;
1433 let NumMicroOps = 9;
1434 let ResourceCycles = [1,4,1,3];
1435}
1436def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1437
1438def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1439 let Latency = 11;
1440 let NumMicroOps = 11;
1441 let ResourceCycles = [2,9];
1442}
Craig Topper2d451e72018-03-18 08:38:06 +00001443def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1444def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001445
Gadi Haber323f2e12017-10-24 20:19:47 +00001446def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1447 let Latency = 12;
1448 let NumMicroOps = 3;
1449 let ResourceCycles = [2,1];
1450}
Simon Pilgrimbe51b202018-05-04 12:59:24 +00001451def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001452
Craig Topper8104f262018-04-02 05:33:28 +00001453def BWWriteResGroup137 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001454 let Latency = 11;
Gadi Haber323f2e12017-10-24 20:19:47 +00001455 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001456 let ResourceCycles = [1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001457}
Craig Topper8104f262018-04-02 05:33:28 +00001458def: InstRW<[BWWriteResGroup137], (instregex "(V?)SQRTPSr")>;
1459
1460def BWWriteResGroup137_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1461 let Latency = 11;
1462 let NumMicroOps = 1;
1463 let ResourceCycles = [1,4];
1464}
1465def: InstRW<[BWWriteResGroup137_1], (instregex "(V?)SQRTSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001466
Craig Topper8104f262018-04-02 05:33:28 +00001467def BWWriteResGroup139 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001468 let Latency = 14;
1469 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001470 let ResourceCycles = [1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001471}
Craig Topper8104f262018-04-02 05:33:28 +00001472def: InstRW<[BWWriteResGroup139], (instregex "(V?)DIVPDrr")>;
1473
1474def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1475 let Latency = 14;
1476 let NumMicroOps = 1;
1477 let ResourceCycles = [1,4];
1478}
1479def: InstRW<[BWWriteResGroup139_1], (instregex "(V?)DIVSDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001480
Gadi Haber323f2e12017-10-24 20:19:47 +00001481def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1482 let Latency = 14;
1483 let NumMicroOps = 3;
1484 let ResourceCycles = [1,1,1];
1485}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001486def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001487
Gadi Haber323f2e12017-10-24 20:19:47 +00001488def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1489 let Latency = 14;
1490 let NumMicroOps = 8;
1491 let ResourceCycles = [2,2,1,3];
1492}
1493def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1494
1495def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1496 let Latency = 14;
1497 let NumMicroOps = 10;
1498 let ResourceCycles = [2,3,1,4];
1499}
1500def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1501
1502def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1503 let Latency = 14;
1504 let NumMicroOps = 12;
1505 let ResourceCycles = [2,1,4,5];
1506}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001507def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001508
1509def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1510 let Latency = 15;
1511 let NumMicroOps = 1;
1512 let ResourceCycles = [1];
1513}
Craig Topper5a69a002018-03-21 06:28:42 +00001514def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1515 "DIVR_FST0r",
1516 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001517
Gadi Haber323f2e12017-10-24 20:19:47 +00001518def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1519 let Latency = 15;
1520 let NumMicroOps = 10;
1521 let ResourceCycles = [1,1,1,4,1,2];
1522}
Craig Topper13a16502018-03-19 00:56:09 +00001523def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001524
Craig Topper8104f262018-04-02 05:33:28 +00001525def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001526 let Latency = 16;
1527 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001528 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001529}
Craig Topper5a69a002018-03-21 06:28:42 +00001530def: InstRW<[BWWriteResGroup150], (instregex "(V?)DIVPSrm",
1531 "(V?)DIVSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001532
Gadi Haber323f2e12017-10-24 20:19:47 +00001533def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1534 let Latency = 16;
1535 let NumMicroOps = 14;
1536 let ResourceCycles = [1,1,1,4,2,5];
1537}
1538def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1539
1540def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1541 let Latency = 16;
1542 let NumMicroOps = 16;
1543 let ResourceCycles = [16];
1544}
Craig Topper5a69a002018-03-21 06:28:42 +00001545def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001546
Craig Topper8104f262018-04-02 05:33:28 +00001547def BWWriteResGroup155 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001548 let Latency = 17;
1549 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001550 let ResourceCycles = [2,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001551}
1552def: InstRW<[BWWriteResGroup155], (instregex "VDIVPSYrr")>;
1553
1554def BWWriteResGroup156 : SchedWriteRes<[BWPort0,BWPort23,BWPort015]> {
1555 let Latency = 17;
1556 let NumMicroOps = 4;
1557 let ResourceCycles = [2,1,1];
1558}
Craig Topper5a69a002018-03-21 06:28:42 +00001559def: InstRW<[BWWriteResGroup156], (instregex "VRCPPSYm",
1560 "VRSQRTPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001561
Craig Topper8104f262018-04-02 05:33:28 +00001562def BWWriteResGroup157 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001563 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001564 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001565 let ResourceCycles = [1,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001566}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001567def: InstRW<[BWWriteResGroup157], (instregex "(V?)SQRTPSm",
1568 "(V?)SQRTSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001569
Gadi Haber323f2e12017-10-24 20:19:47 +00001570def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1571 let Latency = 18;
1572 let NumMicroOps = 8;
1573 let ResourceCycles = [1,1,1,5];
1574}
Craig Topper5a69a002018-03-21 06:28:42 +00001575def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001576def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001577
1578def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1579 let Latency = 18;
1580 let NumMicroOps = 11;
1581 let ResourceCycles = [2,1,1,3,1,3];
1582}
Craig Topper13a16502018-03-19 00:56:09 +00001583def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001584
Craig Topper8104f262018-04-02 05:33:28 +00001585def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001586 let Latency = 19;
1587 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001588 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001589}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001590def: InstRW<[BWWriteResGroup161], (instregex "(V?)DIVPDrm",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001591 "(V?)DIVSDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001592
Gadi Haber323f2e12017-10-24 20:19:47 +00001593def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1594 let Latency = 20;
1595 let NumMicroOps = 1;
1596 let ResourceCycles = [1];
1597}
Craig Topper5a69a002018-03-21 06:28:42 +00001598def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1599 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001600 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001601
Gadi Haber323f2e12017-10-24 20:19:47 +00001602def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1603 let Latency = 20;
1604 let NumMicroOps = 8;
1605 let ResourceCycles = [1,1,1,1,1,1,2];
1606}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001607def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001608
Craig Topper8104f262018-04-02 05:33:28 +00001609def BWWriteResGroup168 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001610 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001611 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001612 let ResourceCycles = [1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001613}
Craig Topper8104f262018-04-02 05:33:28 +00001614def: InstRW<[BWWriteResGroup168], (instregex "(V?)SQRTPDr")>;
1615
1616def BWWriteResGroup168_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1617 let Latency = 16;
1618 let NumMicroOps = 1;
1619 let ResourceCycles = [1,8];
1620}
1621def: InstRW<[BWWriteResGroup168_1], (instregex "(V?)SQRTSDr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001622
1623def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1624 let Latency = 21;
1625 let NumMicroOps = 2;
1626 let ResourceCycles = [1,1];
1627}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001628def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001629
Craig Topper8104f262018-04-02 05:33:28 +00001630def BWWriteResGroup170 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001631 let Latency = 21;
1632 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001633 let ResourceCycles = [2,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001634}
1635def: InstRW<[BWWriteResGroup170], (instregex "VSQRTPSYr")>;
1636
1637def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1638 let Latency = 21;
1639 let NumMicroOps = 19;
1640 let ResourceCycles = [2,1,4,1,1,4,6];
1641}
1642def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1643
1644def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1645 let Latency = 22;
1646 let NumMicroOps = 18;
1647 let ResourceCycles = [1,1,16];
1648}
1649def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1650
Craig Topper8104f262018-04-02 05:33:28 +00001651def BWWriteResGroup173 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001652 let Latency = 23;
1653 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001654 let ResourceCycles = [2,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001655}
1656def: InstRW<[BWWriteResGroup173], (instregex "VDIVPDYrr")>;
1657
Craig Topper8104f262018-04-02 05:33:28 +00001658def BWWriteResGroup174 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001659 let Latency = 23;
1660 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001661 let ResourceCycles = [2,1,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001662}
1663def: InstRW<[BWWriteResGroup174], (instregex "VDIVPSYrm")>;
1664
Gadi Haber323f2e12017-10-24 20:19:47 +00001665def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1666 let Latency = 23;
1667 let NumMicroOps = 19;
1668 let ResourceCycles = [3,1,15];
1669}
Craig Topper391c6f92017-12-10 01:24:08 +00001670def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001671
1672def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1673 let Latency = 24;
1674 let NumMicroOps = 3;
1675 let ResourceCycles = [1,1,1];
1676}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001677def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001678
Craig Topper8104f262018-04-02 05:33:28 +00001679def BWWriteResGroup179 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001680 let Latency = 21;
Gadi Haber323f2e12017-10-24 20:19:47 +00001681 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001682 let ResourceCycles = [1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001683}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001684def: InstRW<[BWWriteResGroup179], (instregex "(V?)SQRTPDm",
1685 "(V?)SQRTSDm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001686
1687def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1688 let Latency = 26;
1689 let NumMicroOps = 2;
1690 let ResourceCycles = [1,1];
1691}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001692def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001693
Craig Topper8104f262018-04-02 05:33:28 +00001694def BWWriteResGroup181 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001695 let Latency = 27;
1696 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001697 let ResourceCycles = [2,1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001698}
1699def: InstRW<[BWWriteResGroup181], (instregex "VSQRTPSYm")>;
1700
1701def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1702 let Latency = 29;
1703 let NumMicroOps = 3;
1704 let ResourceCycles = [1,1,1];
1705}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001706def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001707
Craig Topper8104f262018-04-02 05:33:28 +00001708def BWWriteResGroup183 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001709 let Latency = 29;
1710 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001711 let ResourceCycles = [2,1,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001712}
1713def: InstRW<[BWWriteResGroup183], (instregex "VDIVPDYrm")>;
1714
1715def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1716 let Latency = 22;
1717 let NumMicroOps = 7;
1718 let ResourceCycles = [1,3,2,1];
1719}
Craig Topper17a31182017-12-16 18:35:29 +00001720def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001721
1722def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1723 let Latency = 23;
1724 let NumMicroOps = 9;
1725 let ResourceCycles = [1,3,4,1];
1726}
Craig Topper17a31182017-12-16 18:35:29 +00001727def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001728
1729def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1730 let Latency = 24;
1731 let NumMicroOps = 9;
1732 let ResourceCycles = [1,5,2,1];
1733}
Craig Topper17a31182017-12-16 18:35:29 +00001734def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001735
1736def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1737 let Latency = 25;
1738 let NumMicroOps = 7;
1739 let ResourceCycles = [1,3,2,1];
1740}
Craig Topper17a31182017-12-16 18:35:29 +00001741def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1742 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001743
1744def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1745 let Latency = 26;
1746 let NumMicroOps = 9;
1747 let ResourceCycles = [1,5,2,1];
1748}
Craig Topper17a31182017-12-16 18:35:29 +00001749def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001750
1751def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1752 let Latency = 26;
1753 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001754 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001755}
Craig Topper17a31182017-12-16 18:35:29 +00001756def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001757
1758def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1759 let Latency = 27;
1760 let NumMicroOps = 9;
1761 let ResourceCycles = [1,5,2,1];
1762}
Craig Topper17a31182017-12-16 18:35:29 +00001763def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001764
Gadi Haber323f2e12017-10-24 20:19:47 +00001765def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1766 let Latency = 29;
1767 let NumMicroOps = 27;
1768 let ResourceCycles = [1,5,1,1,19];
1769}
1770def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1771
1772def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1773 let Latency = 30;
1774 let NumMicroOps = 28;
1775 let ResourceCycles = [1,6,1,1,19];
1776}
Craig Topper2d451e72018-03-18 08:38:06 +00001777def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001778
1779def BWWriteResGroup187 : SchedWriteRes<[BWPort01,BWPort15,BWPort015,BWPort0156]> {
1780 let Latency = 31;
1781 let NumMicroOps = 31;
1782 let ResourceCycles = [8,1,21,1];
1783}
1784def: InstRW<[BWWriteResGroup187], (instregex "MMX_EMMS")>;
1785
Craig Topper8104f262018-04-02 05:33:28 +00001786def BWWriteResGroup189 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
1787 let Latency = 29;
Gadi Haber323f2e12017-10-24 20:19:47 +00001788 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001789 let ResourceCycles = [2,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00001790}
1791def: InstRW<[BWWriteResGroup189], (instregex "VSQRTPDYr")>;
1792
1793def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1794 let Latency = 34;
1795 let NumMicroOps = 8;
1796 let ResourceCycles = [2,2,2,1,1];
1797}
Craig Topper13a16502018-03-19 00:56:09 +00001798def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001799
1800def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
1801 let Latency = 34;
1802 let NumMicroOps = 23;
1803 let ResourceCycles = [1,5,3,4,10];
1804}
Craig Topper5a69a002018-03-21 06:28:42 +00001805def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
1806 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001807
1808def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1809 let Latency = 35;
1810 let NumMicroOps = 8;
1811 let ResourceCycles = [2,2,2,1,1];
1812}
Craig Topper13a16502018-03-19 00:56:09 +00001813def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001814
1815def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1816 let Latency = 35;
1817 let NumMicroOps = 23;
1818 let ResourceCycles = [1,5,2,1,4,10];
1819}
Craig Topper5a69a002018-03-21 06:28:42 +00001820def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
1821 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001822
Craig Topper8104f262018-04-02 05:33:28 +00001823def BWWriteResGroup195 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
1824 let Latency = 35;
Gadi Haber323f2e12017-10-24 20:19:47 +00001825 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001826 let ResourceCycles = [2,1,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00001827}
1828def: InstRW<[BWWriteResGroup195], (instregex "VSQRTPDYm")>;
1829
1830def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
1831 let Latency = 42;
1832 let NumMicroOps = 22;
1833 let ResourceCycles = [2,20];
1834}
Craig Topper2d451e72018-03-18 08:38:06 +00001835def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001836
1837def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
1838 let Latency = 60;
1839 let NumMicroOps = 64;
1840 let ResourceCycles = [2,2,8,1,10,2,39];
1841}
1842def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001843
1844def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1845 let Latency = 63;
1846 let NumMicroOps = 88;
1847 let ResourceCycles = [4,4,31,1,2,1,45];
1848}
Craig Topper2d451e72018-03-18 08:38:06 +00001849def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001850
1851def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1852 let Latency = 63;
1853 let NumMicroOps = 90;
1854 let ResourceCycles = [4,2,33,1,2,1,47];
1855}
Craig Topper2d451e72018-03-18 08:38:06 +00001856def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001857
1858def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
1859 let Latency = 75;
1860 let NumMicroOps = 15;
1861 let ResourceCycles = [6,3,6];
1862}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00001863def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001864
1865def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
1866 let Latency = 80;
1867 let NumMicroOps = 32;
1868 let ResourceCycles = [7,7,3,3,1,11];
1869}
1870def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
1871
1872def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
1873 let Latency = 115;
1874 let NumMicroOps = 100;
1875 let ResourceCycles = [9,9,11,8,1,11,21,30];
1876}
1877def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001878
1879} // SchedModel
1880