blob: 21d0c8a629d141e8f4c991ef29ae5ce325d2505d [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.
Simon Pilgrim67cc2462018-05-04 15:20:18 +0000174defm : BWWriteResPair<WriteFMAX, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add (XMM).
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000175defm : 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.
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000214defm : BWWriteResPair<WriteVecIMulX, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000215defm : BWWriteResPair<WriteVecIMulY, [BWPort0], 5, [1], 1, 6>; // Vector integer multiply.
216defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // Vector PMULLD.
217defm : BWWriteResPair<WritePMULLDY, [BWPort0], 10, [2], 2, 6>; // Vector PMULLD (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000218defm : BWWriteResPair<WriteShuffle, [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000219defm : BWWriteResPair<WriteShuffleY, [BWPort5], 1, [1], 1, 6>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000220defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000221defm : BWWriteResPair<WriteVarShuffleY,[BWPort5], 1, [1], 1, 6>; // Vector variable shuffles (YMM/ZMM).
222defm : BWWriteResPair<WriteBlend, [BWPort5], 1, [1], 1, 5>; // Vector blends.
223defm : BWWriteResPair<WriteBlendY, [BWPort5], 1, [1], 1, 6>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000224defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000225defm : BWWriteResPair<WriteVarBlendY, [BWPort5], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000226defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000227defm : BWWriteResPair<WriteMPSADY, [BWPort0, BWPort5], 7, [1, 2], 3, 6>; // Vector MPSAD.
228defm : BWWriteResPair<WritePSADBW, [BWPort0], 5, [1], 1, 5>; // Vector PSADBW.
229defm : BWWriteResPair<WritePSADBWY, [BWPort0], 5, [1], 1, 6>; // Vector PSADBW (YMM/ZMM).
230defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000231
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000232// Vector integer shifts.
233defm : BWWriteResPair<WriteVecShift, [BWPort0], 1, [1], 1, 5>;
234defm : BWWriteResPair<WriteVecShiftX, [BWPort0,BWPort5], 2, [1,1], 2, 5>;
235defm : X86WriteRes<WriteVecShiftY, [BWPort0,BWPort5], 4, [1,1], 2>;
236defm : X86WriteRes<WriteVecShiftYLd, [BWPort0,BWPort23], 7, [1,1], 2>;
237
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000238defm : BWWriteResPair<WriteVecShiftImm, [BWPort0], 1, [1], 1, 5>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000239defm : BWWriteResPair<WriteVecShiftImmX, [BWPort0], 1, [1], 1, 5>; // Vector integer immediate shifts (XMM).
240defm : BWWriteResPair<WriteVecShiftImmY, [BWPort0], 1, [1], 1, 6>; // Vector integer immediate shifts (YMM/ZMM).
241defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 3, [2,1], 3, 5>; // Variable vector shifts.
242defm : BWWriteResPair<WriteVarVecShiftY, [BWPort0, BWPort5], 3, [2,1], 3, 6>; // Variable vector shifts (YMM/ZMM).
243
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000244// Vector insert/extract operations.
245def : WriteRes<WriteVecInsert, [BWPort5]> {
246 let Latency = 2;
247 let NumMicroOps = 2;
248 let ResourceCycles = [2];
249}
250def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
251 let Latency = 6;
252 let NumMicroOps = 2;
253}
254
255def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
256 let Latency = 2;
257 let NumMicroOps = 2;
258}
259def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
260 let Latency = 2;
261 let NumMicroOps = 3;
262}
263
Gadi Haber323f2e12017-10-24 20:19:47 +0000264// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000265defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
266defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
267defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000268
269// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000270
Gadi Haber323f2e12017-10-24 20:19:47 +0000271// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000272def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000273 let Latency = 11;
274 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000275 let ResourceCycles = [3];
276}
277def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000278 let Latency = 16;
279 let NumMicroOps = 4;
280 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000281}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000282
283// Packed Compare Explicit Length Strings, Return Mask
284def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
285 let Latency = 19;
286 let NumMicroOps = 9;
287 let ResourceCycles = [4,3,1,1];
288}
289def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
290 let Latency = 24;
291 let NumMicroOps = 10;
292 let ResourceCycles = [4,3,1,1,1];
293}
294
295// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000296def : WriteRes<WritePCmpIStrI, [BWPort0]> {
297 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000298 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000299 let ResourceCycles = [3];
300}
301def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000302 let Latency = 16;
303 let NumMicroOps = 4;
304 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000305}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000306
307// Packed Compare Explicit Length Strings, Return Index
308def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
309 let Latency = 18;
310 let NumMicroOps = 8;
311 let ResourceCycles = [4,3,1];
312}
313def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
314 let Latency = 23;
315 let NumMicroOps = 9;
316 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000317}
318
Simon Pilgrima2f26782018-03-27 20:38:54 +0000319// MOVMSK Instructions.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000320def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
321def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
322def : WriteRes<WriteVecMOVMSKY, [BWPort0]> { let Latency = 3; }
323def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
Simon Pilgrima2f26782018-03-27 20:38:54 +0000324
Gadi Haber323f2e12017-10-24 20:19:47 +0000325// AES instructions.
326def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
327 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000328 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000329 let ResourceCycles = [1];
330}
331def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000332 let Latency = 12;
333 let NumMicroOps = 2;
334 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000335}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000336
Gadi Haber323f2e12017-10-24 20:19:47 +0000337def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
338 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000339 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000340 let ResourceCycles = [2];
341}
342def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000343 let Latency = 19;
344 let NumMicroOps = 3;
345 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000346}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000347
348def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
349 let Latency = 29;
350 let NumMicroOps = 11;
351 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000352}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000353def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
354 let Latency = 33;
355 let NumMicroOps = 11;
356 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000357}
358
359// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000360defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000361
362// Catch-all for expensive system instructions.
363def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
364
365// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000366defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
367defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
368defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
369defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
Gadi Haber323f2e12017-10-24 20:19:47 +0000370
371// Old microcoded instructions that nobody use.
372def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
373
374// Fence instructions.
375def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
376
Craig Topper05242bf2018-04-21 18:07:36 +0000377// Load/store MXCSR.
378def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
379def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
380
Gadi Haber323f2e12017-10-24 20:19:47 +0000381// Nop, not very useful expect it provides a model for nops!
382def : WriteRes<WriteNop, []>;
383
384////////////////////////////////////////////////////////////////////////////////
385// Horizontal add/sub instructions.
386////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000387
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000388defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3, 5>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000389defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000390defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3, 5>;
391defm : BWWriteResPair<WritePHAddY, [BWPort5,BWPort15], 3, [2,1], 3, 6>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000392
393// Remaining instrs.
394
395def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
396 let Latency = 1;
397 let NumMicroOps = 1;
398 let ResourceCycles = [1];
399}
Craig Topper5a69a002018-03-21 06:28:42 +0000400def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
401 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000402 "(V?)MOVPDI2DIrr",
403 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000404 "VPSLLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000405 "VPSRLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000406 "VTESTPD(Y?)rr",
407 "VTESTPS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000408
409def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
410 let Latency = 1;
411 let NumMicroOps = 1;
412 let ResourceCycles = [1];
413}
Craig Topper5a69a002018-03-21 06:28:42 +0000414def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
415 "COM_FST0r",
416 "UCOM_FPr",
417 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000418
419def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
420 let Latency = 1;
421 let NumMicroOps = 1;
422 let ResourceCycles = [1];
423}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000424def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000425 "MMX_MOVD64to64rr",
426 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000427 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000428 "(V?)MOVDI2PDIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000429
430def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
431 let Latency = 1;
432 let NumMicroOps = 1;
433 let ResourceCycles = [1];
434}
435def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
436
437def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
438 let Latency = 1;
439 let NumMicroOps = 1;
440 let ResourceCycles = [1];
441}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000442def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000443
444def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
445 let Latency = 1;
446 let NumMicroOps = 1;
447 let ResourceCycles = [1];
448}
Craig Topperfbe31322018-04-05 21:56:19 +0000449def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000450def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
451 "ADC(16|32|64)i",
452 "ADC(8|16|32|64)rr",
453 "ADCX(32|64)rr",
454 "ADOX(32|64)rr",
455 "BT(16|32|64)ri8",
456 "BT(16|32|64)rr",
457 "BTC(16|32|64)ri8",
458 "BTC(16|32|64)rr",
459 "BTR(16|32|64)ri8",
460 "BTR(16|32|64)rr",
461 "BTS(16|32|64)ri8",
462 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000463 "SBB(16|32|64)ri",
464 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000465 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000466
467def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
468 let Latency = 1;
469 let NumMicroOps = 1;
470 let ResourceCycles = [1];
471}
Craig Topper5a69a002018-03-21 06:28:42 +0000472def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
473 "BLSI(32|64)rr",
474 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000475 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000476
477def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
478 let Latency = 1;
479 let NumMicroOps = 1;
480 let ResourceCycles = [1];
481}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000482def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000483 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000484
485def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
486 let Latency = 1;
487 let NumMicroOps = 1;
488 let ResourceCycles = [1];
489}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000490def: InstRW<[BWWriteResGroup9], (instrs LAHF, SAHF)>; // TODO: This doesnt match Agner's data
491def: InstRW<[BWWriteResGroup9], (instregex "NOOP",
Craig Topper5a69a002018-03-21 06:28:42 +0000492 "SGDT64m",
493 "SIDT64m",
Craig Topper5a69a002018-03-21 06:28:42 +0000494 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000495 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000496 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000497
498def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
499 let Latency = 1;
500 let NumMicroOps = 2;
501 let ResourceCycles = [1,1];
502}
Craig Topper5a69a002018-03-21 06:28:42 +0000503def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
504 "MMX_MOVD64from64rm",
505 "MMX_MOVD64mr",
506 "MMX_MOVNTQmr",
507 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000508 "MOVNTI_64mr",
509 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000510 "ST_FP(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000511 "VEXTRACTF128mr",
512 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000513 "(V?)MOVAPD(Y?)mr",
514 "(V?)MOVAPS(Y?)mr",
515 "(V?)MOVDQA(Y?)mr",
516 "(V?)MOVDQU(Y?)mr",
517 "(V?)MOVHPDmr",
518 "(V?)MOVHPSmr",
519 "(V?)MOVLPDmr",
520 "(V?)MOVLPSmr",
521 "(V?)MOVNTDQ(V?)mr",
522 "(V?)MOVNTPD(V?)mr",
523 "(V?)MOVNTPS(V?)mr",
524 "(V?)MOVPDI2DImr",
525 "(V?)MOVPQI2QImr",
526 "(V?)MOVPQIto64mr",
527 "(V?)MOVSDmr",
528 "(V?)MOVSSmr",
529 "(V?)MOVUPD(Y?)mr",
530 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000531
Gadi Haber323f2e12017-10-24 20:19:47 +0000532def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
533 let Latency = 2;
534 let NumMicroOps = 2;
535 let ResourceCycles = [2];
536}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000537def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000538
539def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
540 let Latency = 2;
541 let NumMicroOps = 2;
542 let ResourceCycles = [2];
543}
Craig Topper5a69a002018-03-21 06:28:42 +0000544def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
545 "ROL(8|16|32|64)ri",
546 "ROR(8|16|32|64)r1",
547 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000548
549def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
550 let Latency = 2;
551 let NumMicroOps = 2;
552 let ResourceCycles = [2];
553}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000554def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
555 MFENCE,
556 WAIT,
557 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000558
559def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
560 let Latency = 2;
561 let NumMicroOps = 2;
562 let ResourceCycles = [1,1];
563}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000564def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000565 "(V?)CVTPS2PDrr",
566 "(V?)CVTSS2SDrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000567 "(V?)PTESTrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000568
569def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
570 let Latency = 2;
571 let NumMicroOps = 2;
572 let ResourceCycles = [1,1];
573}
574def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
575
576def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
577 let Latency = 2;
578 let NumMicroOps = 2;
579 let ResourceCycles = [1,1];
580}
581def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
582
583def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
584 let Latency = 2;
585 let NumMicroOps = 2;
586 let ResourceCycles = [1,1];
587}
588def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
589
590def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
591 let Latency = 2;
592 let NumMicroOps = 2;
593 let ResourceCycles = [1,1];
594}
Craig Topper498875f2018-04-04 17:54:19 +0000595def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
596
597def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
598 let Latency = 1;
599 let NumMicroOps = 1;
600 let ResourceCycles = [1];
601}
602def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000603
604def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
605 let Latency = 2;
606 let NumMicroOps = 2;
607 let ResourceCycles = [1,1];
608}
Craig Topper2d451e72018-03-18 08:38:06 +0000609def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000610def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000611def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
612 "ADC8ri",
613 "CMOV(A|BE)(16|32|64)rr",
614 "SBB8i8",
615 "SBB8ri",
616 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000617
Gadi Haber323f2e12017-10-24 20:19:47 +0000618def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
619 let Latency = 2;
620 let NumMicroOps = 3;
621 let ResourceCycles = [1,1,1];
622}
623def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
624
Gadi Haber323f2e12017-10-24 20:19:47 +0000625def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
626 let Latency = 2;
627 let NumMicroOps = 3;
628 let ResourceCycles = [1,1,1];
629}
630def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
631
632def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
633 let Latency = 2;
634 let NumMicroOps = 3;
635 let ResourceCycles = [1,1,1];
636}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000637def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
638 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000639def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000640 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000641
Gadi Haber323f2e12017-10-24 20:19:47 +0000642def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
643 let Latency = 3;
644 let NumMicroOps = 1;
645 let ResourceCycles = [1];
646}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000647def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000648 "PDEP(32|64)rr",
649 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000650 "SHLD(16|32|64)rri8",
651 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000652 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000653
654def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000655 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000656 let NumMicroOps = 2;
657 let ResourceCycles = [1,1];
658}
Clement Courbet327fac42018-03-07 08:14:02 +0000659def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000660
661def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
662 let Latency = 3;
663 let NumMicroOps = 1;
664 let ResourceCycles = [1];
665}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000666def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
667 "VPBROADCASTWrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000668 "VPMOVSXBDYrr",
669 "VPMOVSXBQYrr",
670 "VPMOVSXBWYrr",
671 "VPMOVSXDQYrr",
672 "VPMOVSXWDYrr",
673 "VPMOVSXWQYrr",
674 "VPMOVZXBDYrr",
675 "VPMOVZXBQYrr",
676 "VPMOVZXBWYrr",
677 "VPMOVZXDQYrr",
678 "VPMOVZXWDYrr",
679 "VPMOVZXWQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000680
Gadi Haber323f2e12017-10-24 20:19:47 +0000681def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000682 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000683 let NumMicroOps = 3;
684 let ResourceCycles = [3];
685}
Craig Topperb5f26592018-04-19 18:00:17 +0000686def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
687 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
688 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000689
Gadi Haber323f2e12017-10-24 20:19:47 +0000690def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
691 let Latency = 3;
692 let NumMicroOps = 3;
693 let ResourceCycles = [2,1];
694}
Craig Topper5a69a002018-03-21 06:28:42 +0000695def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
696 "MMX_PACKSSWBirr",
697 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000698
699def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
700 let Latency = 3;
701 let NumMicroOps = 3;
702 let ResourceCycles = [1,2];
703}
704def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
705
706def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
707 let Latency = 3;
708 let NumMicroOps = 3;
709 let ResourceCycles = [1,2];
710}
Craig Topper5a69a002018-03-21 06:28:42 +0000711def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
712 "RCL(8|16|32|64)ri",
713 "RCR(8|16|32|64)r1",
714 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000715
716def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
717 let Latency = 3;
718 let NumMicroOps = 3;
719 let ResourceCycles = [2,1];
720}
Craig Topper5a69a002018-03-21 06:28:42 +0000721def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
722 "ROR(8|16|32|64)rCL",
723 "SAR(8|16|32|64)rCL",
724 "SHL(8|16|32|64)rCL",
725 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000726
727def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
728 let Latency = 3;
729 let NumMicroOps = 4;
730 let ResourceCycles = [1,1,1,1];
731}
732def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
733
734def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
735 let Latency = 3;
736 let NumMicroOps = 4;
737 let ResourceCycles = [1,1,1,1];
738}
Craig Topper5a69a002018-03-21 06:28:42 +0000739def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
740 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000741
742def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
743 let Latency = 4;
744 let NumMicroOps = 2;
745 let ResourceCycles = [1,1];
746}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000747def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
748 "(V?)CVTSD2SIrr",
749 "(V?)CVTSS2SI64rr",
750 "(V?)CVTSS2SIrr",
751 "(V?)CVTTSD2SI64rr",
752 "(V?)CVTTSD2SIrr",
753 "(V?)CVTTSS2SI64rr",
754 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000755
756def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
757 let Latency = 4;
758 let NumMicroOps = 2;
759 let ResourceCycles = [1,1];
760}
Craig Topper5a69a002018-03-21 06:28:42 +0000761def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000762 "VPTESTYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000763
764def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
765 let Latency = 4;
766 let NumMicroOps = 2;
767 let ResourceCycles = [1,1];
768}
769def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
770
771def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
772 let Latency = 4;
773 let NumMicroOps = 2;
774 let ResourceCycles = [1,1];
775}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000776def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000777def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000778 "MMX_CVTPI2PDirr",
779 "MMX_CVTPS2PIirr",
780 "MMX_CVTTPD2PIirr",
781 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000782 "(V?)CVTDQ2PDrr",
783 "(V?)CVTPD2DQrr",
784 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000785 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000786 "(V?)CVTSD2SSrr",
787 "(V?)CVTSI642SDrr",
788 "(V?)CVTSI2SDrr",
789 "(V?)CVTSI2SSrr",
790 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000791
792def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
793 let Latency = 4;
794 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000795 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000796}
Craig Topper5a69a002018-03-21 06:28:42 +0000797def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000798
799def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
800 let Latency = 4;
801 let NumMicroOps = 3;
802 let ResourceCycles = [1,1,1];
803}
804def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
805
806def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
807 let Latency = 4;
808 let NumMicroOps = 3;
809 let ResourceCycles = [1,1,1];
810}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000811def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
812 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000813
814def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
815 let Latency = 4;
816 let NumMicroOps = 4;
817 let ResourceCycles = [4];
818}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000819def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000820
821def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
822 let Latency = 4;
823 let NumMicroOps = 4;
824 let ResourceCycles = [1,3];
825}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000826def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000827
828def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
829 let Latency = 5;
830 let NumMicroOps = 1;
831 let ResourceCycles = [1];
832}
Simon Pilgrima53d3302018-05-02 16:16:24 +0000833def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr",
834 "MUL_FPrST0",
835 "MUL_FST0r",
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000836 "MUL_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000837
Gadi Haber323f2e12017-10-24 20:19:47 +0000838def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
839 let Latency = 5;
840 let NumMicroOps = 1;
841 let ResourceCycles = [1];
842}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000843def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000844 "MOVSX(16|32|64)rm32",
845 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000846 "MOVZX(16|32|64)rm16",
847 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000848 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000849 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000850 "(V?)MOVSHDUPrm",
851 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000852 "VPBROADCASTDrm",
853 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000854
855def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
856 let Latency = 5;
857 let NumMicroOps = 3;
858 let ResourceCycles = [1,2];
859}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000860def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000861
862def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
863 let Latency = 5;
864 let NumMicroOps = 3;
865 let ResourceCycles = [1,1,1];
866}
867def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
868
869def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000870 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000871 let NumMicroOps = 3;
872 let ResourceCycles = [1,1,1];
873}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000874def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000875
876def BWWriteResGroup53 : SchedWriteRes<[BWPort0,BWPort4,BWPort237,BWPort15]> {
877 let Latency = 5;
878 let NumMicroOps = 4;
879 let ResourceCycles = [1,1,1,1];
880}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000881def: InstRW<[BWWriteResGroup53], (instregex "VMASKMOVPD(Y?)mr",
882 "VMASKMOVPS(Y?)mr",
883 "VPMASKMOVD(Y?)mr",
884 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000885
886def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
887 let Latency = 5;
888 let NumMicroOps = 5;
889 let ResourceCycles = [1,4];
890}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000891def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000892
893def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
894 let Latency = 5;
895 let NumMicroOps = 5;
896 let ResourceCycles = [1,4];
897}
898def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
899
900def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
901 let Latency = 5;
902 let NumMicroOps = 5;
903 let ResourceCycles = [2,3];
904}
Craig Topper5a69a002018-03-21 06:28:42 +0000905def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000906
907def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
908 let Latency = 5;
909 let NumMicroOps = 6;
910 let ResourceCycles = [1,1,4];
911}
Craig Topper5a69a002018-03-21 06:28:42 +0000912def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000913
914def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
915 let Latency = 6;
916 let NumMicroOps = 1;
917 let ResourceCycles = [1];
918}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000919def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000920 "VBROADCASTF128",
921 "VBROADCASTI128",
922 "VBROADCASTSDYrm",
923 "VBROADCASTSSYrm",
924 "VLDDQUYrm",
925 "VMOVAPDYrm",
926 "VMOVAPSYrm",
927 "VMOVDDUPYrm",
928 "VMOVDQAYrm",
929 "VMOVDQUYrm",
930 "VMOVNTDQAYrm",
931 "VMOVSHDUPYrm",
932 "VMOVSLDUPYrm",
933 "VMOVUPDYrm",
934 "VMOVUPSYrm",
935 "VPBROADCASTDYrm",
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000936 "VPBROADCASTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000937
938def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
939 let Latency = 6;
940 let NumMicroOps = 2;
941 let ResourceCycles = [1,1];
942}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000943def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000944 "(V?)CVTPS2PDrm",
945 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000946 "VPSLLVQrm",
947 "VPSRLVQrm",
948 "VTESTPDrm",
949 "VTESTPSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000950
951def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
952 let Latency = 6;
953 let NumMicroOps = 2;
954 let ResourceCycles = [1,1];
955}
Craig Topper5a69a002018-03-21 06:28:42 +0000956def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
957 "VCVTPD2DQYrr",
958 "VCVTPD2PSYrr",
959 "VCVTPS2PHYrr",
960 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000961
Gadi Haber323f2e12017-10-24 20:19:47 +0000962def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
963 let Latency = 6;
964 let NumMicroOps = 2;
965 let ResourceCycles = [1,1];
966}
Craig Topper5a69a002018-03-21 06:28:42 +0000967def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
968 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000969
970def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
971 let Latency = 6;
972 let NumMicroOps = 2;
973 let ResourceCycles = [1,1];
974}
Craig Topperdfccafe2018-04-18 06:41:25 +0000975def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +0000976def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
977 ADCX32rm, ADCX64rm,
978 ADOX32rm, ADOX64rm,
979 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000980
981def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
982 let Latency = 6;
983 let NumMicroOps = 2;
984 let ResourceCycles = [1,1];
985}
Craig Topper5a69a002018-03-21 06:28:42 +0000986def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
987 "BLSI(32|64)rm",
988 "BLSMSK(32|64)rm",
989 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +0000990 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000991
992def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
993 let Latency = 6;
994 let NumMicroOps = 2;
995 let ResourceCycles = [1,1];
996}
Simon Pilgrim06e16542018-04-22 18:35:53 +0000997def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +0000998 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000999 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001000
1001def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1002 let Latency = 6;
1003 let NumMicroOps = 2;
1004 let ResourceCycles = [1,1];
1005}
Craig Topper2d451e72018-03-18 08:38:06 +00001006def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001007def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001008
1009def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1010 let Latency = 6;
1011 let NumMicroOps = 4;
1012 let ResourceCycles = [1,1,2];
1013}
Craig Topper5a69a002018-03-21 06:28:42 +00001014def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1015 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001016
1017def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1018 let Latency = 6;
1019 let NumMicroOps = 4;
1020 let ResourceCycles = [1,1,1,1];
1021}
1022def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1023
1024def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1025 let Latency = 6;
1026 let NumMicroOps = 4;
1027 let ResourceCycles = [1,1,1,1];
1028}
Craig Topper5a69a002018-03-21 06:28:42 +00001029def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1030 "BTR(16|32|64)mi8",
1031 "BTS(16|32|64)mi8",
1032 "SAR(8|16|32|64)m1",
1033 "SAR(8|16|32|64)mi",
1034 "SHL(8|16|32|64)m1",
1035 "SHL(8|16|32|64)mi",
1036 "SHR(8|16|32|64)m1",
1037 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001038
1039def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1040 let Latency = 6;
1041 let NumMicroOps = 4;
1042 let ResourceCycles = [1,1,1,1];
1043}
Craig Topperf0d04262018-04-06 16:16:48 +00001044def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1045 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001046
1047def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1048 let Latency = 6;
1049 let NumMicroOps = 6;
1050 let ResourceCycles = [1,5];
1051}
1052def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1053
Gadi Haber323f2e12017-10-24 20:19:47 +00001054def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1055 let Latency = 7;
1056 let NumMicroOps = 2;
1057 let ResourceCycles = [1,1];
1058}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001059def: InstRW<[BWWriteResGroup73], (instregex "VPSLLVQYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001060 "VPSRLVQYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001061 "VTESTPDYrm",
1062 "VTESTPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001063
1064def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1065 let Latency = 7;
1066 let NumMicroOps = 2;
1067 let ResourceCycles = [1,1];
1068}
Craig Topper5a69a002018-03-21 06:28:42 +00001069def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1070 "FCOM64m",
1071 "FCOMP32m",
1072 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001073
Gadi Haber323f2e12017-10-24 20:19:47 +00001074def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1075 let Latency = 7;
1076 let NumMicroOps = 2;
1077 let ResourceCycles = [1,1];
1078}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001079def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001080
Gadi Haber323f2e12017-10-24 20:19:47 +00001081def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1082 let Latency = 7;
1083 let NumMicroOps = 3;
1084 let ResourceCycles = [2,1];
1085}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001086def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001087 "MMX_PACKSSWBirm",
1088 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001089 "VMASKMOVPDrm",
1090 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001091 "VPMASKMOVDrm",
1092 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001093
1094def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1095 let Latency = 7;
1096 let NumMicroOps = 3;
1097 let ResourceCycles = [1,2];
1098}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001099def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1100 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001101
1102def BWWriteResGroup81 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1103 let Latency = 7;
1104 let NumMicroOps = 3;
1105 let ResourceCycles = [1,1,1];
1106}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001107def: InstRW<[BWWriteResGroup81], (instregex "(V?)PTESTrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001108
1109def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1110 let Latency = 7;
1111 let NumMicroOps = 3;
1112 let ResourceCycles = [1,1,1];
1113}
1114def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1115
Gadi Haber323f2e12017-10-24 20:19:47 +00001116def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1117 let Latency = 7;
1118 let NumMicroOps = 3;
1119 let ResourceCycles = [1,1,1];
1120}
Craig Topper5a69a002018-03-21 06:28:42 +00001121def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1122 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001123
Gadi Haber323f2e12017-10-24 20:19:47 +00001124def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1125 let Latency = 7;
1126 let NumMicroOps = 3;
1127 let ResourceCycles = [1,1,1];
1128}
Craig Topperf4cd9082018-01-19 05:47:32 +00001129def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001130
1131def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1132 let Latency = 7;
1133 let NumMicroOps = 5;
1134 let ResourceCycles = [1,1,1,2];
1135}
Craig Topper5a69a002018-03-21 06:28:42 +00001136def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1137 "ROL(8|16|32|64)mi",
1138 "ROR(8|16|32|64)m1",
1139 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001140
1141def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1142 let Latency = 7;
1143 let NumMicroOps = 5;
1144 let ResourceCycles = [1,1,1,2];
1145}
Craig Topper5a69a002018-03-21 06:28:42 +00001146def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001147
1148def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1149 let Latency = 7;
1150 let NumMicroOps = 5;
1151 let ResourceCycles = [1,1,1,1,1];
1152}
Craig Topper5a69a002018-03-21 06:28:42 +00001153def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1154 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001155
1156def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1157 let Latency = 7;
1158 let NumMicroOps = 7;
1159 let ResourceCycles = [2,2,1,2];
1160}
Craig Topper2d451e72018-03-18 08:38:06 +00001161def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001162
1163def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1164 let Latency = 8;
1165 let NumMicroOps = 2;
1166 let ResourceCycles = [1,1];
1167}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001168def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001169 "PDEP(32|64)rm",
1170 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001171 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001172
1173def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001174 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001175 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001176 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001177}
Craig Topperf846e2d2018-04-19 05:34:05 +00001178def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001179
Craig Topperf846e2d2018-04-19 05:34:05 +00001180def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1181 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001182 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001183 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001184}
Craig Topper5a69a002018-03-21 06:28:42 +00001185def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001186
Gadi Haber323f2e12017-10-24 20:19:47 +00001187def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1188 let Latency = 8;
1189 let NumMicroOps = 2;
1190 let ResourceCycles = [1,1];
1191}
Craig Topper5a69a002018-03-21 06:28:42 +00001192def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1193 "VPMOVSXBQYrm",
1194 "VPMOVSXBWYrm",
1195 "VPMOVSXDQYrm",
1196 "VPMOVSXWDYrm",
1197 "VPMOVSXWQYrm",
1198 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001199
Gadi Haber323f2e12017-10-24 20:19:47 +00001200def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1201 let Latency = 8;
1202 let NumMicroOps = 3;
1203 let ResourceCycles = [2,1];
1204}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001205def: InstRW<[BWWriteResGroup94], (instregex "VMASKMOVPDYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001206 "VMASKMOVPSYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001207 "VPMASKMOVDYrm",
1208 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001209
Gadi Haber323f2e12017-10-24 20:19:47 +00001210def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1211 let Latency = 8;
1212 let NumMicroOps = 5;
1213 let ResourceCycles = [1,1,1,2];
1214}
Craig Topper5a69a002018-03-21 06:28:42 +00001215def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1216 "RCL(8|16|32|64)mi",
1217 "RCR(8|16|32|64)m1",
1218 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001219
1220def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1221 let Latency = 8;
1222 let NumMicroOps = 5;
1223 let ResourceCycles = [1,1,2,1];
1224}
Craig Topper13a16502018-03-19 00:56:09 +00001225def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001226
1227def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1228 let Latency = 8;
1229 let NumMicroOps = 6;
1230 let ResourceCycles = [1,1,1,3];
1231}
Craig Topper9f834812018-04-01 21:54:24 +00001232def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001233
1234def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1235 let Latency = 8;
1236 let NumMicroOps = 6;
1237 let ResourceCycles = [1,1,1,2,1];
1238}
Craig Topper9f834812018-04-01 21:54:24 +00001239def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001240 "CMPXCHG(8|16|32|64)rm",
1241 "ROL(8|16|32|64)mCL",
1242 "SAR(8|16|32|64)mCL",
1243 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001244 "SHL(8|16|32|64)mCL",
1245 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001246def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1247 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001248
1249def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1250 let Latency = 9;
1251 let NumMicroOps = 2;
1252 let ResourceCycles = [1,1];
1253}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001254def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1255 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001256 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001257 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001258
1259def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1260 let Latency = 9;
1261 let NumMicroOps = 2;
1262 let ResourceCycles = [1,1];
1263}
Craig Topper5a69a002018-03-21 06:28:42 +00001264def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1265 "VPERM2I128rm",
1266 "VPERMDYrm",
1267 "VPERMPDYmi",
1268 "VPERMPSYrm",
1269 "VPERMQYmi",
1270 "VPMOVZXBDYrm",
1271 "VPMOVZXBQYrm",
1272 "VPMOVZXBWYrm",
1273 "VPMOVZXDQYrm",
1274 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001275
Gadi Haber323f2e12017-10-24 20:19:47 +00001276def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1277 let Latency = 9;
1278 let NumMicroOps = 3;
1279 let ResourceCycles = [1,1,1];
1280}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001281def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1282 "(V?)CVTSD2SIrm",
1283 "(V?)CVTSS2SI64rm",
1284 "(V?)CVTSS2SIrm",
1285 "(V?)CVTTSD2SI64rm",
1286 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001287 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001288 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001289
1290def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1291 let Latency = 9;
1292 let NumMicroOps = 3;
1293 let ResourceCycles = [1,1,1];
1294}
1295def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1296
1297def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1298 let Latency = 9;
1299 let NumMicroOps = 3;
1300 let ResourceCycles = [1,1,1];
1301}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001302def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001303def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001304 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001305 "CVTTPD2DQrm",
1306 "MMX_CVTPD2PIirm",
1307 "MMX_CVTPI2PDirm",
1308 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001309 "(V?)CVTDQ2PDrm",
1310 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001311
1312def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1313 let Latency = 9;
1314 let NumMicroOps = 3;
1315 let ResourceCycles = [1,1,1];
1316}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001317def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1318 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001319
Gadi Haber323f2e12017-10-24 20:19:47 +00001320def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1321 let Latency = 9;
1322 let NumMicroOps = 4;
1323 let ResourceCycles = [1,1,1,1];
1324}
Craig Topper5a69a002018-03-21 06:28:42 +00001325def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1326 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001327
1328def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1329 let Latency = 9;
1330 let NumMicroOps = 5;
1331 let ResourceCycles = [1,1,3];
1332}
1333def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1334
1335def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1336 let Latency = 9;
1337 let NumMicroOps = 5;
1338 let ResourceCycles = [1,2,1,1];
1339}
Craig Topper5a69a002018-03-21 06:28:42 +00001340def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1341 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001342
Gadi Haber323f2e12017-10-24 20:19:47 +00001343def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1344 let Latency = 10;
1345 let NumMicroOps = 2;
1346 let ResourceCycles = [1,1];
1347}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001348def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001349
Gadi Haber323f2e12017-10-24 20:19:47 +00001350def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1351 let Latency = 10;
1352 let NumMicroOps = 3;
1353 let ResourceCycles = [2,1];
1354}
Craig Topper5a69a002018-03-21 06:28:42 +00001355def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1356 "FICOM32m",
1357 "FICOMP16m",
1358 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001359
1360def BWWriteResGroup118 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1361 let Latency = 10;
1362 let NumMicroOps = 3;
1363 let ResourceCycles = [1,1,1];
1364}
1365def: InstRW<[BWWriteResGroup118], (instregex "VPTESTYrm")>;
1366
Gadi Haber323f2e12017-10-24 20:19:47 +00001367def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1368 let Latency = 10;
1369 let NumMicroOps = 4;
1370 let ResourceCycles = [1,1,1,1];
1371}
1372def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1373
1374def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001375 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001376 let NumMicroOps = 4;
1377 let ResourceCycles = [1,1,1,1];
1378}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001379def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001380
Craig Topper8104f262018-04-02 05:33:28 +00001381def BWWriteResGroup122 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001382 let Latency = 11;
1383 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001384 let ResourceCycles = [1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001385}
Craig Topper8104f262018-04-02 05:33:28 +00001386def: InstRW<[BWWriteResGroup122], (instregex "(V?)DIVPSrr")>;
1387
1388def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1389 let Latency = 11;
1390 let NumMicroOps = 1;
1391 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1392}
1393def: InstRW<[BWWriteResGroup122_1], (instregex "(V?)DIVSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001394
1395def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1396 let Latency = 11;
1397 let NumMicroOps = 2;
1398 let ResourceCycles = [1,1];
1399}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001400def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001401 "VPCMPGTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001402
Gadi Haber323f2e12017-10-24 20:19:47 +00001403def BWWriteResGroup126 : SchedWriteRes<[BWPort0,BWPort015]> {
1404 let Latency = 11;
1405 let NumMicroOps = 3;
1406 let ResourceCycles = [2,1];
1407}
Craig Topper5a69a002018-03-21 06:28:42 +00001408def: InstRW<[BWWriteResGroup126], (instregex "VRCPPSYr",
1409 "VRSQRTPSYr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001410
Gadi Haber323f2e12017-10-24 20:19:47 +00001411def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1412 let Latency = 11;
1413 let NumMicroOps = 3;
1414 let ResourceCycles = [1,1,1];
1415}
1416def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1417
Gadi Haber323f2e12017-10-24 20:19:47 +00001418def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1419 let Latency = 11;
1420 let NumMicroOps = 6;
1421 let ResourceCycles = [1,1,1,1,2];
1422}
Craig Topper5a69a002018-03-21 06:28:42 +00001423def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1424 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001425
1426def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1427 let Latency = 11;
1428 let NumMicroOps = 7;
1429 let ResourceCycles = [2,2,3];
1430}
Craig Topper5a69a002018-03-21 06:28:42 +00001431def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1432 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001433
1434def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1435 let Latency = 11;
1436 let NumMicroOps = 9;
1437 let ResourceCycles = [1,4,1,3];
1438}
1439def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1440
1441def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1442 let Latency = 11;
1443 let NumMicroOps = 11;
1444 let ResourceCycles = [2,9];
1445}
Craig Topper2d451e72018-03-18 08:38:06 +00001446def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1447def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001448
Gadi Haber323f2e12017-10-24 20:19:47 +00001449def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1450 let Latency = 12;
1451 let NumMicroOps = 3;
1452 let ResourceCycles = [2,1];
1453}
Simon Pilgrimbe51b202018-05-04 12:59:24 +00001454def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001455
Craig Topper8104f262018-04-02 05:33:28 +00001456def BWWriteResGroup137 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001457 let Latency = 11;
Gadi Haber323f2e12017-10-24 20:19:47 +00001458 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001459 let ResourceCycles = [1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001460}
Craig Topper8104f262018-04-02 05:33:28 +00001461def: InstRW<[BWWriteResGroup137], (instregex "(V?)SQRTPSr")>;
1462
1463def BWWriteResGroup137_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1464 let Latency = 11;
1465 let NumMicroOps = 1;
1466 let ResourceCycles = [1,4];
1467}
1468def: InstRW<[BWWriteResGroup137_1], (instregex "(V?)SQRTSSr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001469
Craig Topper8104f262018-04-02 05:33:28 +00001470def BWWriteResGroup139 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001471 let Latency = 14;
1472 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001473 let ResourceCycles = [1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001474}
Craig Topper8104f262018-04-02 05:33:28 +00001475def: InstRW<[BWWriteResGroup139], (instregex "(V?)DIVPDrr")>;
1476
1477def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1478 let Latency = 14;
1479 let NumMicroOps = 1;
1480 let ResourceCycles = [1,4];
1481}
1482def: InstRW<[BWWriteResGroup139_1], (instregex "(V?)DIVSDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001483
Gadi Haber323f2e12017-10-24 20:19:47 +00001484def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1485 let Latency = 14;
1486 let NumMicroOps = 3;
1487 let ResourceCycles = [1,1,1];
1488}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001489def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001490
Gadi Haber323f2e12017-10-24 20:19:47 +00001491def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1492 let Latency = 14;
1493 let NumMicroOps = 8;
1494 let ResourceCycles = [2,2,1,3];
1495}
1496def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1497
1498def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1499 let Latency = 14;
1500 let NumMicroOps = 10;
1501 let ResourceCycles = [2,3,1,4];
1502}
1503def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1504
1505def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1506 let Latency = 14;
1507 let NumMicroOps = 12;
1508 let ResourceCycles = [2,1,4,5];
1509}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001510def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001511
1512def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1513 let Latency = 15;
1514 let NumMicroOps = 1;
1515 let ResourceCycles = [1];
1516}
Craig Topper5a69a002018-03-21 06:28:42 +00001517def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1518 "DIVR_FST0r",
1519 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001520
Gadi Haber323f2e12017-10-24 20:19:47 +00001521def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1522 let Latency = 15;
1523 let NumMicroOps = 10;
1524 let ResourceCycles = [1,1,1,4,1,2];
1525}
Craig Topper13a16502018-03-19 00:56:09 +00001526def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001527
Craig Topper8104f262018-04-02 05:33:28 +00001528def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001529 let Latency = 16;
1530 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001531 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001532}
Craig Topper5a69a002018-03-21 06:28:42 +00001533def: InstRW<[BWWriteResGroup150], (instregex "(V?)DIVPSrm",
1534 "(V?)DIVSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001535
Gadi Haber323f2e12017-10-24 20:19:47 +00001536def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1537 let Latency = 16;
1538 let NumMicroOps = 14;
1539 let ResourceCycles = [1,1,1,4,2,5];
1540}
1541def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1542
1543def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1544 let Latency = 16;
1545 let NumMicroOps = 16;
1546 let ResourceCycles = [16];
1547}
Craig Topper5a69a002018-03-21 06:28:42 +00001548def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001549
Craig Topper8104f262018-04-02 05:33:28 +00001550def BWWriteResGroup155 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001551 let Latency = 17;
1552 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001553 let ResourceCycles = [2,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001554}
1555def: InstRW<[BWWriteResGroup155], (instregex "VDIVPSYrr")>;
1556
1557def BWWriteResGroup156 : SchedWriteRes<[BWPort0,BWPort23,BWPort015]> {
1558 let Latency = 17;
1559 let NumMicroOps = 4;
1560 let ResourceCycles = [2,1,1];
1561}
Craig Topper5a69a002018-03-21 06:28:42 +00001562def: InstRW<[BWWriteResGroup156], (instregex "VRCPPSYm",
1563 "VRSQRTPSYm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001564
Craig Topper8104f262018-04-02 05:33:28 +00001565def BWWriteResGroup157 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001566 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001567 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001568 let ResourceCycles = [1,1,7];
Gadi Haber323f2e12017-10-24 20:19:47 +00001569}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001570def: InstRW<[BWWriteResGroup157], (instregex "(V?)SQRTPSm",
1571 "(V?)SQRTSSm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001572
Gadi Haber323f2e12017-10-24 20:19:47 +00001573def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1574 let Latency = 18;
1575 let NumMicroOps = 8;
1576 let ResourceCycles = [1,1,1,5];
1577}
Craig Topper5a69a002018-03-21 06:28:42 +00001578def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001579def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001580
1581def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1582 let Latency = 18;
1583 let NumMicroOps = 11;
1584 let ResourceCycles = [2,1,1,3,1,3];
1585}
Craig Topper13a16502018-03-19 00:56:09 +00001586def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001587
Craig Topper8104f262018-04-02 05:33:28 +00001588def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001589 let Latency = 19;
1590 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001591 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001592}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001593def: InstRW<[BWWriteResGroup161], (instregex "(V?)DIVPDrm",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001594 "(V?)DIVSDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001595
Gadi Haber323f2e12017-10-24 20:19:47 +00001596def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1597 let Latency = 20;
1598 let NumMicroOps = 1;
1599 let ResourceCycles = [1];
1600}
Craig Topper5a69a002018-03-21 06:28:42 +00001601def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1602 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001603 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001604
Gadi Haber323f2e12017-10-24 20:19:47 +00001605def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1606 let Latency = 20;
1607 let NumMicroOps = 8;
1608 let ResourceCycles = [1,1,1,1,1,1,2];
1609}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001610def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001611
Craig Topper8104f262018-04-02 05:33:28 +00001612def BWWriteResGroup168 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001613 let Latency = 16;
Gadi Haber323f2e12017-10-24 20:19:47 +00001614 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001615 let ResourceCycles = [1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001616}
Craig Topper8104f262018-04-02 05:33:28 +00001617def: InstRW<[BWWriteResGroup168], (instregex "(V?)SQRTPDr")>;
1618
1619def BWWriteResGroup168_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1620 let Latency = 16;
1621 let NumMicroOps = 1;
1622 let ResourceCycles = [1,8];
1623}
1624def: InstRW<[BWWriteResGroup168_1], (instregex "(V?)SQRTSDr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001625
1626def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1627 let Latency = 21;
1628 let NumMicroOps = 2;
1629 let ResourceCycles = [1,1];
1630}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001631def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001632
Craig Topper8104f262018-04-02 05:33:28 +00001633def BWWriteResGroup170 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001634 let Latency = 21;
1635 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001636 let ResourceCycles = [2,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001637}
1638def: InstRW<[BWWriteResGroup170], (instregex "VSQRTPSYr")>;
1639
1640def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1641 let Latency = 21;
1642 let NumMicroOps = 19;
1643 let ResourceCycles = [2,1,4,1,1,4,6];
1644}
1645def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1646
1647def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1648 let Latency = 22;
1649 let NumMicroOps = 18;
1650 let ResourceCycles = [1,1,16];
1651}
1652def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1653
Craig Topper8104f262018-04-02 05:33:28 +00001654def BWWriteResGroup173 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001655 let Latency = 23;
1656 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001657 let ResourceCycles = [2,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001658}
1659def: InstRW<[BWWriteResGroup173], (instregex "VDIVPDYrr")>;
1660
Craig Topper8104f262018-04-02 05:33:28 +00001661def BWWriteResGroup174 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001662 let Latency = 23;
1663 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001664 let ResourceCycles = [2,1,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001665}
1666def: InstRW<[BWWriteResGroup174], (instregex "VDIVPSYrm")>;
1667
Gadi Haber323f2e12017-10-24 20:19:47 +00001668def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1669 let Latency = 23;
1670 let NumMicroOps = 19;
1671 let ResourceCycles = [3,1,15];
1672}
Craig Topper391c6f92017-12-10 01:24:08 +00001673def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001674
1675def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1676 let Latency = 24;
1677 let NumMicroOps = 3;
1678 let ResourceCycles = [1,1,1];
1679}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001680def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001681
Craig Topper8104f262018-04-02 05:33:28 +00001682def BWWriteResGroup179 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001683 let Latency = 21;
Gadi Haber323f2e12017-10-24 20:19:47 +00001684 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001685 let ResourceCycles = [1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001686}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001687def: InstRW<[BWWriteResGroup179], (instregex "(V?)SQRTPDm",
1688 "(V?)SQRTSDm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001689
1690def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1691 let Latency = 26;
1692 let NumMicroOps = 2;
1693 let ResourceCycles = [1,1];
1694}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001695def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001696
Craig Topper8104f262018-04-02 05:33:28 +00001697def BWWriteResGroup181 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001698 let Latency = 27;
1699 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001700 let ResourceCycles = [2,1,1,14];
Gadi Haber323f2e12017-10-24 20:19:47 +00001701}
1702def: InstRW<[BWWriteResGroup181], (instregex "VSQRTPSYm")>;
1703
1704def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1705 let Latency = 29;
1706 let NumMicroOps = 3;
1707 let ResourceCycles = [1,1,1];
1708}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001709def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001710
Craig Topper8104f262018-04-02 05:33:28 +00001711def BWWriteResGroup183 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001712 let Latency = 29;
1713 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001714 let ResourceCycles = [2,1,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001715}
1716def: InstRW<[BWWriteResGroup183], (instregex "VDIVPDYrm")>;
1717
1718def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1719 let Latency = 22;
1720 let NumMicroOps = 7;
1721 let ResourceCycles = [1,3,2,1];
1722}
Craig Topper17a31182017-12-16 18:35:29 +00001723def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001724
1725def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1726 let Latency = 23;
1727 let NumMicroOps = 9;
1728 let ResourceCycles = [1,3,4,1];
1729}
Craig Topper17a31182017-12-16 18:35:29 +00001730def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001731
1732def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1733 let Latency = 24;
1734 let NumMicroOps = 9;
1735 let ResourceCycles = [1,5,2,1];
1736}
Craig Topper17a31182017-12-16 18:35:29 +00001737def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001738
1739def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1740 let Latency = 25;
1741 let NumMicroOps = 7;
1742 let ResourceCycles = [1,3,2,1];
1743}
Craig Topper17a31182017-12-16 18:35:29 +00001744def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1745 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001746
1747def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1748 let Latency = 26;
1749 let NumMicroOps = 9;
1750 let ResourceCycles = [1,5,2,1];
1751}
Craig Topper17a31182017-12-16 18:35:29 +00001752def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001753
1754def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1755 let Latency = 26;
1756 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001757 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001758}
Craig Topper17a31182017-12-16 18:35:29 +00001759def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001760
1761def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1762 let Latency = 27;
1763 let NumMicroOps = 9;
1764 let ResourceCycles = [1,5,2,1];
1765}
Craig Topper17a31182017-12-16 18:35:29 +00001766def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001767
Gadi Haber323f2e12017-10-24 20:19:47 +00001768def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1769 let Latency = 29;
1770 let NumMicroOps = 27;
1771 let ResourceCycles = [1,5,1,1,19];
1772}
1773def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1774
1775def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1776 let Latency = 30;
1777 let NumMicroOps = 28;
1778 let ResourceCycles = [1,6,1,1,19];
1779}
Craig Topper2d451e72018-03-18 08:38:06 +00001780def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001781
1782def BWWriteResGroup187 : SchedWriteRes<[BWPort01,BWPort15,BWPort015,BWPort0156]> {
1783 let Latency = 31;
1784 let NumMicroOps = 31;
1785 let ResourceCycles = [8,1,21,1];
1786}
1787def: InstRW<[BWWriteResGroup187], (instregex "MMX_EMMS")>;
1788
Craig Topper8104f262018-04-02 05:33:28 +00001789def BWWriteResGroup189 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
1790 let Latency = 29;
Gadi Haber323f2e12017-10-24 20:19:47 +00001791 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001792 let ResourceCycles = [2,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00001793}
1794def: InstRW<[BWWriteResGroup189], (instregex "VSQRTPDYr")>;
1795
1796def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1797 let Latency = 34;
1798 let NumMicroOps = 8;
1799 let ResourceCycles = [2,2,2,1,1];
1800}
Craig Topper13a16502018-03-19 00:56:09 +00001801def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001802
1803def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
1804 let Latency = 34;
1805 let NumMicroOps = 23;
1806 let ResourceCycles = [1,5,3,4,10];
1807}
Craig Topper5a69a002018-03-21 06:28:42 +00001808def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
1809 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001810
1811def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1812 let Latency = 35;
1813 let NumMicroOps = 8;
1814 let ResourceCycles = [2,2,2,1,1];
1815}
Craig Topper13a16502018-03-19 00:56:09 +00001816def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001817
1818def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1819 let Latency = 35;
1820 let NumMicroOps = 23;
1821 let ResourceCycles = [1,5,2,1,4,10];
1822}
Craig Topper5a69a002018-03-21 06:28:42 +00001823def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
1824 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001825
Craig Topper8104f262018-04-02 05:33:28 +00001826def BWWriteResGroup195 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
1827 let Latency = 35;
Gadi Haber323f2e12017-10-24 20:19:47 +00001828 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001829 let ResourceCycles = [2,1,1,28];
Gadi Haber323f2e12017-10-24 20:19:47 +00001830}
1831def: InstRW<[BWWriteResGroup195], (instregex "VSQRTPDYm")>;
1832
1833def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
1834 let Latency = 42;
1835 let NumMicroOps = 22;
1836 let ResourceCycles = [2,20];
1837}
Craig Topper2d451e72018-03-18 08:38:06 +00001838def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001839
1840def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
1841 let Latency = 60;
1842 let NumMicroOps = 64;
1843 let ResourceCycles = [2,2,8,1,10,2,39];
1844}
1845def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001846
1847def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1848 let Latency = 63;
1849 let NumMicroOps = 88;
1850 let ResourceCycles = [4,4,31,1,2,1,45];
1851}
Craig Topper2d451e72018-03-18 08:38:06 +00001852def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001853
1854def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1855 let Latency = 63;
1856 let NumMicroOps = 90;
1857 let ResourceCycles = [4,2,33,1,2,1,47];
1858}
Craig Topper2d451e72018-03-18 08:38:06 +00001859def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001860
1861def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
1862 let Latency = 75;
1863 let NumMicroOps = 15;
1864 let ResourceCycles = [6,3,6];
1865}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00001866def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001867
1868def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
1869 let Latency = 80;
1870 let NumMicroOps = 32;
1871 let ResourceCycles = [7,7,3,3,1,11];
1872}
1873def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
1874
1875def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
1876 let Latency = 115;
1877 let NumMicroOps = 100;
1878 let ResourceCycles = [9,9,11,8,1,11,21,30];
1879}
1880def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001881
1882} // SchedModel
1883