blob: 4532ddc73992868c6dc7cb2fe1397e780dcc200c [file] [log] [blame]
Nadav Roteme7b6a8a2013-03-28 22:34:46 +00001//=- X86SchedHaswell.td - X86 Haswell 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 Haswell to support instruction
11// scheduling and other instruction cost heuristics.
12//
13//===----------------------------------------------------------------------===//
14
15def HaswellModel : SchedMachineModel {
16 // All x86 instructions are modeled as a single micro-op, and HW can decode 4
17 // instructions per cycle.
18 let IssueWidth = 4;
Andrew Trick18dc3da2013-06-15 04:50:02 +000019 let MicroOpBufferSize = 192; // Based on the reorder buffer.
Gadi Haber2cf601f2017-12-08 09:48:44 +000020 let LoadLatency = 5;
Nadav Roteme7b6a8a2013-03-28 22:34:46 +000021 let MispredictPenalty = 16;
Andrew Trickb6854d82013-09-25 18:14:12 +000022
Hal Finkel6532c202014-05-08 09:14:44 +000023 // Based on the LSD (loop-stream detector) queue size and benchmarking data.
24 let LoopMicroOpBufferSize = 50;
25
Simon Pilgrim2b5967f2018-03-24 18:36:01 +000026 // This flag is set to allow the scheduler to assign a default model to
Gadi Haberd76f7b82017-08-28 10:04:16 +000027 // unrecognized opcodes.
Andrew Trickb6854d82013-09-25 18:14:12 +000028 let CompleteModel = 0;
Nadav Roteme7b6a8a2013-03-28 22:34:46 +000029}
30
31let SchedModel = HaswellModel in {
32
33// Haswell can issue micro-ops to 8 different ports in one cycle.
34
Quentin Colombet9e16c8a2014-01-29 18:26:59 +000035// Ports 0, 1, 5, and 6 handle all computation.
Nadav Roteme7b6a8a2013-03-28 22:34:46 +000036// 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 HWPort0 : ProcResource<1>;
42def HWPort1 : ProcResource<1>;
43def HWPort2 : ProcResource<1>;
44def HWPort3 : ProcResource<1>;
45def HWPort4 : ProcResource<1>;
46def HWPort5 : ProcResource<1>;
47def HWPort6 : ProcResource<1>;
48def HWPort7 : ProcResource<1>;
49
50// Many micro-ops are capable of issuing on multiple ports.
Quentin Colombet0bc907e2014-08-18 17:55:26 +000051def HWPort01 : ProcResGroup<[HWPort0, HWPort1]>;
Nadav Roteme7b6a8a2013-03-28 22:34:46 +000052def HWPort23 : ProcResGroup<[HWPort2, HWPort3]>;
53def HWPort237 : ProcResGroup<[HWPort2, HWPort3, HWPort7]>;
Quentin Colombetf68e0942014-08-18 17:55:36 +000054def HWPort04 : ProcResGroup<[HWPort0, HWPort4]>;
Nadav Roteme7b6a8a2013-03-28 22:34:46 +000055def HWPort05 : ProcResGroup<[HWPort0, HWPort5]>;
Quentin Colombet7e939fb42014-08-18 17:56:01 +000056def HWPort06 : ProcResGroup<[HWPort0, HWPort6]>;
Nadav Roteme7b6a8a2013-03-28 22:34:46 +000057def HWPort15 : ProcResGroup<[HWPort1, HWPort5]>;
Quentin Colombetca498512014-02-24 19:33:51 +000058def HWPort16 : ProcResGroup<[HWPort1, HWPort6]>;
Quentin Colombet7e939fb42014-08-18 17:56:01 +000059def HWPort56 : ProcResGroup<[HWPort5, HWPort6]>;
Nadav Roteme7b6a8a2013-03-28 22:34:46 +000060def HWPort015 : ProcResGroup<[HWPort0, HWPort1, HWPort5]>;
Quentin Colombet7e939fb42014-08-18 17:56:01 +000061def HWPort056 : ProcResGroup<[HWPort0, HWPort5, HWPort6]>;
Nadav Roteme7b6a8a2013-03-28 22:34:46 +000062def HWPort0156: ProcResGroup<[HWPort0, HWPort1, HWPort5, HWPort6]>;
63
Andrew Trick40c4f382013-06-15 04:50:06 +000064// 60 Entry Unified Scheduler
65def HWPortAny : ProcResGroup<[HWPort0, HWPort1, HWPort2, HWPort3, HWPort4,
66 HWPort5, HWPort6, HWPort7]> {
67 let BufferSize=60;
68}
69
Andrew Tricke1d88cf2013-04-02 01:58:47 +000070// Integer division issued on port 0.
71def HWDivider : ProcResource<1>;
Nadav Roteme7b6a8a2013-03-28 22:34:46 +000072
Gadi Haber2cf601f2017-12-08 09:48:44 +000073// Loads are 5 cycles, so ReadAfterLd registers needn't be available until 5
Nadav Roteme7b6a8a2013-03-28 22:34:46 +000074// cycles after the memory operand.
Gadi Haber2cf601f2017-12-08 09:48:44 +000075def : ReadAdvance<ReadAfterLd, 5>;
Nadav Roteme7b6a8a2013-03-28 22:34:46 +000076
77// Many SchedWrites are defined in pairs with and without a folded load.
78// Instructions with folded loads are usually micro-fused, so they only appear
79// as two micro-ops when queued in the reservation station.
80// This multiclass defines the resource usage for variants with and without
81// folded loads.
82multiclass HWWriteResPair<X86FoldableSchedWrite SchedRW,
Simon Pilgrim30c38c32018-03-19 14:46:07 +000083 list<ProcResourceKind> ExePorts,
Simon Pilgrime3547af2018-03-25 10:21:19 +000084 int Lat, list<int> Res = [1], int UOps = 1,
85 int LoadLat = 5> {
Nadav Roteme7b6a8a2013-03-28 22:34:46 +000086 // Register variant is using a single cycle on ExePort.
Simon Pilgrim30c38c32018-03-19 14:46:07 +000087 def : WriteRes<SchedRW, ExePorts> {
88 let Latency = Lat;
89 let ResourceCycles = Res;
90 let NumMicroOps = UOps;
91 }
Nadav Roteme7b6a8a2013-03-28 22:34:46 +000092
Simon Pilgrime3547af2018-03-25 10:21:19 +000093 // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to
94 // the latency (default = 5).
Simon Pilgrim30c38c32018-03-19 14:46:07 +000095 def : WriteRes<SchedRW.Folded, !listconcat([HWPort23], ExePorts)> {
Simon Pilgrime3547af2018-03-25 10:21:19 +000096 let Latency = !add(Lat, LoadLat);
Simon Pilgrim30c38c32018-03-19 14:46:07 +000097 let ResourceCycles = !listconcat([1], Res);
Simon Pilgrime3547af2018-03-25 10:21:19 +000098 let NumMicroOps = !add(UOps, 1);
Nadav Roteme7b6a8a2013-03-28 22:34:46 +000099 }
100}
101
102// A folded store needs a cycle on port 4 for the store data, but it does not
103// need an extra port 2/3 cycle to recompute the address.
104def : WriteRes<WriteRMW, [HWPort4]>;
105
Quentin Colombet9e16c8a2014-01-29 18:26:59 +0000106// Store_addr on 237.
107// Store_data on 4.
Nadav Roteme7b6a8a2013-03-28 22:34:46 +0000108def : WriteRes<WriteStore, [HWPort237, HWPort4]>;
Gadi Haber2cf601f2017-12-08 09:48:44 +0000109def : WriteRes<WriteLoad, [HWPort23]> { let Latency = 5; }
Nadav Roteme7b6a8a2013-03-28 22:34:46 +0000110def : WriteRes<WriteMove, [HWPort0156]>;
111def : WriteRes<WriteZero, []>;
112
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000113defm : HWWriteResPair<WriteALU, [HWPort0156], 1>;
114defm : HWWriteResPair<WriteIMul, [HWPort1], 3>;
Andrew Trick7201f4f2013-06-21 18:33:04 +0000115def : WriteRes<WriteIMulH, []> { let Latency = 3; }
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000116defm : HWWriteResPair<WriteShift, [HWPort06], 1>;
117defm : HWWriteResPair<WriteJump, [HWPort06], 1>;
Nadav Roteme7b6a8a2013-03-28 22:34:46 +0000118
119// This is for simple LEAs with one or two input operands.
120// The complex ones can only execute on port 1, and they require two cycles on
121// the port to read all inputs. We don't model that.
122def : WriteRes<WriteLEA, [HWPort15]>;
123
124// This is quite rough, latency depends on the dividend.
Simon Pilgrim68a8fbc2018-03-25 20:16:53 +0000125defm : HWWriteResPair<WriteIDiv, [HWPort0, HWDivider], 25, [1,10], 1, 4>;
Nadav Roteme7b6a8a2013-03-28 22:34:46 +0000126// Scalar and vector floating point.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000127def : WriteRes<WriteFStore, [HWPort237, HWPort4]>;
128def : WriteRes<WriteFLoad, [HWPort23]> { let Latency = 5; }
129def : WriteRes<WriteFMove, [HWPort5]>;
130
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000131defm : HWWriteResPair<WriteFAdd, [HWPort1], 3>;
132defm : HWWriteResPair<WriteFMul, [HWPort0], 5>;
133defm : HWWriteResPair<WriteFDiv, [HWPort0], 12>; // 10-14 cycles.
134defm : HWWriteResPair<WriteFRcp, [HWPort0], 5>;
135defm : HWWriteResPair<WriteFRsqrt, [HWPort0], 5>;
136defm : HWWriteResPair<WriteFSqrt, [HWPort0], 15>;
137defm : HWWriteResPair<WriteCvtF2I, [HWPort1], 3>;
138defm : HWWriteResPair<WriteCvtI2F, [HWPort1], 4>;
139defm : HWWriteResPair<WriteCvtF2F, [HWPort1], 3>;
140defm : HWWriteResPair<WriteFMA, [HWPort01], 5>;
141defm : HWWriteResPair<WriteFShuffle, [HWPort5], 1>;
142defm : HWWriteResPair<WriteFBlend, [HWPort015], 1>;
143defm : HWWriteResPair<WriteFShuffle256, [HWPort5], 3>;
144defm : HWWriteResPair<WriteFVarBlend, [HWPort5], 2, [2]>;
Nadav Roteme7b6a8a2013-03-28 22:34:46 +0000145
146// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000147def : WriteRes<WriteVecStore, [HWPort237, HWPort4]>;
148def : WriteRes<WriteVecLoad, [HWPort23]> { let Latency = 5; }
149def : WriteRes<WriteVecMove, [HWPort015]>;
150
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000151defm : HWWriteResPair<WriteVecShift, [HWPort0], 1>;
152defm : HWWriteResPair<WriteVecLogic, [HWPort015], 1>;
153defm : HWWriteResPair<WriteVecALU, [HWPort15], 1>;
154defm : HWWriteResPair<WriteVecIMul, [HWPort0], 5>;
155defm : HWWriteResPair<WriteShuffle, [HWPort5], 1>;
156defm : HWWriteResPair<WriteBlend, [HWPort15], 1>;
157defm : HWWriteResPair<WriteShuffle256, [HWPort5], 3>;
158defm : HWWriteResPair<WriteVarBlend, [HWPort5], 2, [2]>;
159defm : HWWriteResPair<WriteVarVecShift, [HWPort0, HWPort5], 2, [2, 1]>;
160defm : HWWriteResPair<WriteMPSAD, [HWPort0, HWPort5], 6, [1, 2]>;
Quentin Colombetca498512014-02-24 19:33:51 +0000161
162// String instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000163
Quentin Colombetca498512014-02-24 19:33:51 +0000164// Packed Compare Implicit Length Strings, Return Mask
165def : WriteRes<WritePCmpIStrM, [HWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000166 let Latency = 11;
167 let NumMicroOps = 3;
Quentin Colombetca498512014-02-24 19:33:51 +0000168 let ResourceCycles = [3];
169}
170def : WriteRes<WritePCmpIStrMLd, [HWPort0, HWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000171 let Latency = 17;
172 let NumMicroOps = 4;
173 let ResourceCycles = [3,1];
Quentin Colombetca498512014-02-24 19:33:51 +0000174}
175
176// Packed Compare Explicit Length Strings, Return Mask
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000177def : WriteRes<WritePCmpEStrM, [HWPort0, HWPort5, HWPort015, HWPort0156]> {
178 let Latency = 19;
179 let NumMicroOps = 9;
180 let ResourceCycles = [4,3,1,1];
Quentin Colombetca498512014-02-24 19:33:51 +0000181}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000182def : WriteRes<WritePCmpEStrMLd, [HWPort0, HWPort5, HWPort23, HWPort015, HWPort0156]> {
183 let Latency = 25;
184 let NumMicroOps = 10;
185 let ResourceCycles = [4,3,1,1,1];
Quentin Colombetca498512014-02-24 19:33:51 +0000186}
187
188// Packed Compare Implicit Length Strings, Return Index
189def : WriteRes<WritePCmpIStrI, [HWPort0]> {
190 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000191 let NumMicroOps = 3;
Quentin Colombetca498512014-02-24 19:33:51 +0000192 let ResourceCycles = [3];
193}
194def : WriteRes<WritePCmpIStrILd, [HWPort0, HWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000195 let Latency = 17;
196 let NumMicroOps = 4;
197 let ResourceCycles = [3,1];
Quentin Colombetca498512014-02-24 19:33:51 +0000198}
199
200// Packed Compare Explicit Length Strings, Return Index
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000201def : WriteRes<WritePCmpEStrI, [HWPort0, HWPort5, HWPort0156]> {
202 let Latency = 18;
203 let NumMicroOps = 8;
204 let ResourceCycles = [4,3,1];
Quentin Colombetca498512014-02-24 19:33:51 +0000205}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000206def : WriteRes<WritePCmpEStrILd, [HWPort0, HWPort5, HWPort23, HWPort0156]> {
207 let Latency = 24;
208 let NumMicroOps = 9;
209 let ResourceCycles = [4,3,1,1];
Quentin Colombetca498512014-02-24 19:33:51 +0000210}
211
212// AES Instructions.
213def : WriteRes<WriteAESDecEnc, [HWPort5]> {
214 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000215 let NumMicroOps = 1;
Quentin Colombetca498512014-02-24 19:33:51 +0000216 let ResourceCycles = [1];
217}
218def : WriteRes<WriteAESDecEncLd, [HWPort5, HWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000219 let Latency = 13;
220 let NumMicroOps = 2;
221 let ResourceCycles = [1,1];
Quentin Colombetca498512014-02-24 19:33:51 +0000222}
223
224def : WriteRes<WriteAESIMC, [HWPort5]> {
225 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000226 let NumMicroOps = 2;
Quentin Colombetca498512014-02-24 19:33:51 +0000227 let ResourceCycles = [2];
228}
229def : WriteRes<WriteAESIMCLd, [HWPort5, HWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000230 let Latency = 20;
231 let NumMicroOps = 3;
232 let ResourceCycles = [2,1];
Quentin Colombetca498512014-02-24 19:33:51 +0000233}
234
Simon Pilgrim7684e052018-03-22 13:18:08 +0000235def : WriteRes<WriteAESKeyGen, [HWPort0,HWPort5,HWPort015]> {
236 let Latency = 29;
237 let NumMicroOps = 11;
238 let ResourceCycles = [2,7,2];
Quentin Colombetca498512014-02-24 19:33:51 +0000239}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000240def : WriteRes<WriteAESKeyGenLd, [HWPort0,HWPort5,HWPort23,HWPort015]> {
241 let Latency = 34;
242 let NumMicroOps = 11;
243 let ResourceCycles = [2,7,1,1];
Quentin Colombetca498512014-02-24 19:33:51 +0000244}
245
246// Carry-less multiplication instructions.
247def : WriteRes<WriteCLMul, [HWPort0, HWPort5]> {
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000248 let Latency = 11;
249 let NumMicroOps = 3;
250 let ResourceCycles = [2,1];
Quentin Colombetca498512014-02-24 19:33:51 +0000251}
252def : WriteRes<WriteCLMulLd, [HWPort0, HWPort5, HWPort23]> {
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000253 let Latency = 17;
254 let NumMicroOps = 4;
255 let ResourceCycles = [2,1,1];
Quentin Colombetca498512014-02-24 19:33:51 +0000256}
Nadav Roteme7b6a8a2013-03-28 22:34:46 +0000257
258def : WriteRes<WriteSystem, [HWPort0156]> { let Latency = 100; }
259def : WriteRes<WriteMicrocoded, [HWPort0156]> { let Latency = 100; }
Quentin Colombetca498512014-02-24 19:33:51 +0000260def : WriteRes<WriteFence, [HWPort23, HWPort4]>;
261def : WriteRes<WriteNop, []>;
Quentin Colombet35d37b72014-08-18 17:55:08 +0000262
Michael Zuckermanf6684002017-06-28 11:23:31 +0000263//================ Exceptions ================//
264
265//-- Specific Scheduling Models --//
266
267// Starting with P0.
268def WriteP0 : SchedWriteRes<[HWPort0]>;
269
Michael Zuckermanf6684002017-06-28 11:23:31 +0000270def WriteP01 : SchedWriteRes<[HWPort01]>;
271
272def Write2P01 : SchedWriteRes<[HWPort01]> {
273 let NumMicroOps = 2;
274}
275def Write3P01 : SchedWriteRes<[HWPort01]> {
276 let NumMicroOps = 3;
277}
278
Michael Zuckermanf6684002017-06-28 11:23:31 +0000279def WriteP0156_P23 : SchedWriteRes<[HWPort0156, HWPort23]> {
280 let NumMicroOps = 2;
281}
282
283def Write2P0156_P23 : SchedWriteRes<[HWPort0156, HWPort23]> {
284 let NumMicroOps = 3;
285 let ResourceCycles = [2, 1];
286}
287
Michael Zuckermanf6684002017-06-28 11:23:31 +0000288// Starting with P1.
289def WriteP1 : SchedWriteRes<[HWPort1]>;
290
Michael Zuckermanf6684002017-06-28 11:23:31 +0000291
292def Write2P1 : SchedWriteRes<[HWPort1]> {
293 let NumMicroOps = 2;
294 let ResourceCycles = [2];
295}
Michael Zuckermanf6684002017-06-28 11:23:31 +0000296
297// Notation:
298// - r: register.
299// - mm: 64 bit mmx register.
300// - x = 128 bit xmm register.
301// - (x)mm = mmx or xmm register.
302// - y = 256 bit ymm register.
303// - v = any vector register.
304// - m = memory.
305
306//=== Integer Instructions ===//
307//-- Move instructions --//
308
Michael Zuckermanf6684002017-06-28 11:23:31 +0000309// XLAT.
310def WriteXLAT : SchedWriteRes<[]> {
311 let Latency = 7;
312 let NumMicroOps = 3;
313}
314def : InstRW<[WriteXLAT], (instregex "XLAT")>;
315
Michael Zuckermanf6684002017-06-28 11:23:31 +0000316// PUSHA.
317def WritePushA : SchedWriteRes<[]> {
318 let NumMicroOps = 19;
319}
320def : InstRW<[WritePushA], (instregex "PUSHA(16|32)")>;
321
Michael Zuckermanf6684002017-06-28 11:23:31 +0000322// POPA.
323def WritePopA : SchedWriteRes<[]> {
324 let NumMicroOps = 18;
325}
326def : InstRW<[WritePopA], (instregex "POPA(16|32)")>;
327
Michael Zuckermanf6684002017-06-28 11:23:31 +0000328//-- Arithmetic instructions --//
329
Michael Zuckermanf6684002017-06-28 11:23:31 +0000330// DIV.
331// r8.
332def WriteDiv8 : SchedWriteRes<[HWPort0, HWPort1, HWPort5, HWPort6]> {
333 let Latency = 22;
334 let NumMicroOps = 9;
335}
336def : InstRW<[WriteDiv8], (instregex "DIV8r")>;
337
Michael Zuckermanf6684002017-06-28 11:23:31 +0000338// IDIV.
339// r8.
340def WriteIDiv8 : SchedWriteRes<[HWPort0, HWPort1, HWPort5, HWPort6]> {
341 let Latency = 23;
342 let NumMicroOps = 9;
343}
344def : InstRW<[WriteIDiv8], (instregex "IDIV8r")>;
345
Michael Zuckermanf6684002017-06-28 11:23:31 +0000346// BT.
Michael Zuckermanf6684002017-06-28 11:23:31 +0000347// m,r.
348def WriteBTmr : SchedWriteRes<[]> {
349 let NumMicroOps = 10;
350}
351def : InstRW<[WriteBTmr], (instregex "BT(16|32|64)mr")>;
352
Michael Zuckermanf6684002017-06-28 11:23:31 +0000353// BTR BTS BTC.
Michael Zuckermanf6684002017-06-28 11:23:31 +0000354// m,r.
355def WriteBTRSCmr : SchedWriteRes<[]> {
356 let NumMicroOps = 11;
357}
358def : InstRW<[WriteBTRSCmr], (instregex "BT(R|S|C)(16|32|64)mr")>;
359
Michael Zuckermanf6684002017-06-28 11:23:31 +0000360//-- Control transfer instructions --//
361
Michael Zuckermanf6684002017-06-28 11:23:31 +0000362// CALL.
Michael Zuckermanf6684002017-06-28 11:23:31 +0000363// i.
364def WriteRETI : SchedWriteRes<[HWPort23, HWPort6, HWPort015]> {
365 let NumMicroOps = 4;
366 let ResourceCycles = [1, 2, 1];
367}
368def : InstRW<[WriteRETI], (instregex "RETI(L|Q|W)", "LRETI(L|Q|W)")>;
369
370// BOUND.
371// r,m.
372def WriteBOUND : SchedWriteRes<[]> {
373 let NumMicroOps = 15;
374}
375def : InstRW<[WriteBOUND], (instregex "BOUNDS(16|32)rm")>;
376
377// INTO.
378def WriteINTO : SchedWriteRes<[]> {
379 let NumMicroOps = 4;
380}
381def : InstRW<[WriteINTO], (instregex "INTO")>;
382
383//-- String instructions --//
384
385// LODSB/W.
386def : InstRW<[Write2P0156_P23], (instregex "LODS(B|W)")>;
387
388// LODSD/Q.
389def : InstRW<[WriteP0156_P23], (instregex "LODS(L|Q)")>;
390
Michael Zuckermanf6684002017-06-28 11:23:31 +0000391// MOVS.
392def WriteMOVS : SchedWriteRes<[HWPort23, HWPort4, HWPort0156]> {
393 let Latency = 4;
394 let NumMicroOps = 5;
395 let ResourceCycles = [2, 1, 2];
396}
Craig Topper2d451e72018-03-18 08:38:06 +0000397def : InstRW<[WriteMOVS], (instrs MOVSB, MOVSL, MOVSQ, MOVSW)>;
Michael Zuckermanf6684002017-06-28 11:23:31 +0000398
Michael Zuckermanf6684002017-06-28 11:23:31 +0000399// CMPS.
400def WriteCMPS : SchedWriteRes<[HWPort23, HWPort0156]> {
401 let Latency = 4;
402 let NumMicroOps = 5;
403 let ResourceCycles = [2, 3];
404}
405def : InstRW<[WriteCMPS], (instregex "CMPS(B|L|Q|W)")>;
406
Michael Zuckermanf6684002017-06-28 11:23:31 +0000407//-- Other --//
408
Gadi Haberd76f7b82017-08-28 10:04:16 +0000409// RDPMC.f
Michael Zuckermanf6684002017-06-28 11:23:31 +0000410def WriteRDPMC : SchedWriteRes<[]> {
411 let NumMicroOps = 34;
412}
413def : InstRW<[WriteRDPMC], (instregex "RDPMC")>;
414
415// RDRAND.
416def WriteRDRAND : SchedWriteRes<[HWPort23, HWPort015]> {
417 let NumMicroOps = 17;
418 let ResourceCycles = [1, 16];
419}
420def : InstRW<[WriteRDRAND], (instregex "RDRAND(16|32|64)r")>;
421
422//=== Floating Point x87 Instructions ===//
423//-- Move instructions --//
424
425// FLD.
426// m80.
427def : InstRW<[WriteP01], (instregex "LD_Frr")>;
428
Michael Zuckermanf6684002017-06-28 11:23:31 +0000429// FBLD.
430// m80.
431def WriteFBLD : SchedWriteRes<[]> {
432 let Latency = 47;
433 let NumMicroOps = 43;
434}
435def : InstRW<[WriteFBLD], (instregex "FBLDm")>;
436
437// FST(P).
438// r.
439def : InstRW<[WriteP01], (instregex "ST_(F|FP)rr")>;
440
Michael Zuckermanf6684002017-06-28 11:23:31 +0000441// FLDZ.
442def : InstRW<[WriteP01], (instregex "LD_F0")>;
443
Michael Zuckermanf6684002017-06-28 11:23:31 +0000444// FLDPI FLDL2E etc.
Simon Pilgrim62690e92018-03-20 15:44:47 +0000445def : InstRW<[Write2P01], (instregex "FLDPI", "FLDL2(T|E)", "FLDL(G|N)2")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +0000446
Michael Zuckermanf6684002017-06-28 11:23:31 +0000447// FFREE.
448def : InstRW<[WriteP01], (instregex "FFREE")>;
449
450// FNSAVE.
451def WriteFNSAVE : SchedWriteRes<[]> {
452 let NumMicroOps = 147;
453}
454def : InstRW<[WriteFNSAVE], (instregex "FSAVEm")>;
455
456// FRSTOR.
457def WriteFRSTOR : SchedWriteRes<[]> {
458 let NumMicroOps = 90;
459}
460def : InstRW<[WriteFRSTOR], (instregex "FRSTORm")>;
461
462//-- Arithmetic instructions --//
463
464// FABS.
465def : InstRW<[WriteP0], (instregex "ABS_F")>;
466
467// FCHS.
468def : InstRW<[WriteP0], (instregex "CHS_F")>;
469
Michael Zuckermanf6684002017-06-28 11:23:31 +0000470// FCOMPP FUCOMPP.
471// r.
472def : InstRW<[Write2P01], (instregex "FCOMPP", "UCOM_FPPr")>;
473
474// FCOMI(P) FUCOMI(P).
475// m.
476def : InstRW<[Write3P01], (instregex "COM_FIr", "COM_FIPr", "UCOM_FIr",
477 "UCOM_FIPr")>;
478
Michael Zuckermanf6684002017-06-28 11:23:31 +0000479// FTST.
480def : InstRW<[WriteP1], (instregex "TST_F")>;
481
482// FXAM.
483def : InstRW<[Write2P1], (instregex "FXAM")>;
484
485// FPREM.
486def WriteFPREM : SchedWriteRes<[]> {
487 let Latency = 19;
488 let NumMicroOps = 28;
489}
Craig Topper2d451e72018-03-18 08:38:06 +0000490def : InstRW<[WriteFPREM], (instrs FPREM)>;
Michael Zuckermanf6684002017-06-28 11:23:31 +0000491
492// FPREM1.
493def WriteFPREM1 : SchedWriteRes<[]> {
494 let Latency = 27;
495 let NumMicroOps = 41;
496}
Craig Topper2d451e72018-03-18 08:38:06 +0000497def : InstRW<[WriteFPREM1], (instrs FPREM1)>;
Michael Zuckermanf6684002017-06-28 11:23:31 +0000498
499// FRNDINT.
500def WriteFRNDINT : SchedWriteRes<[]> {
501 let Latency = 11;
502 let NumMicroOps = 17;
503}
504def : InstRW<[WriteFRNDINT], (instregex "FRNDINT")>;
505
506//-- Math instructions --//
507
508// FSCALE.
509def WriteFSCALE : SchedWriteRes<[]> {
510 let Latency = 75; // 49-125
511 let NumMicroOps = 50; // 25-75
512}
513def : InstRW<[WriteFSCALE], (instregex "FSCALE")>;
514
515// FXTRACT.
516def WriteFXTRACT : SchedWriteRes<[]> {
517 let Latency = 15;
518 let NumMicroOps = 17;
519}
520def : InstRW<[WriteFXTRACT], (instregex "FXTRACT")>;
521
Andrew V. Tischenko8cb1d092017-06-08 16:44:13 +0000522////////////////////////////////////////////////////////////////////////////////
523// Horizontal add/sub instructions.
524////////////////////////////////////////////////////////////////////////////////
525
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000526defm : HWWriteResPair<WriteFHAdd, [HWPort1, HWPort5], 5, [1, 2], 3>;
527defm : HWWriteResPair<WritePHAdd, [HWPort1, HWPort5], 3, [1, 2], 3>;
Andrew V. Tischenko8cb1d092017-06-08 16:44:13 +0000528
Michael Zuckermanf6684002017-06-28 11:23:31 +0000529//=== Floating Point XMM and YMM Instructions ===//
Gadi Haber13759a72017-06-27 15:05:13 +0000530
Gadi Haberd76f7b82017-08-28 10:04:16 +0000531// Remaining instrs.
Michael Zuckermanf6684002017-06-28 11:23:31 +0000532
Gadi Haberd76f7b82017-08-28 10:04:16 +0000533def HWWriteResGroup0 : SchedWriteRes<[HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +0000534 let Latency = 6;
Gadi Haberd76f7b82017-08-28 10:04:16 +0000535 let NumMicroOps = 1;
536 let ResourceCycles = [1];
537}
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000538def: InstRW<[HWWriteResGroup0], (instregex "VBROADCASTSSrm",
539 "(V?)LDDQUrm",
540 "(V?)MOVAPDrm",
541 "(V?)MOVAPSrm",
542 "(V?)MOVDQArm",
543 "(V?)MOVDQUrm",
544 "(V?)MOVNTDQArm",
545 "(V?)MOVSHDUPrm",
546 "(V?)MOVSLDUPrm",
547 "(V?)MOVUPDrm",
548 "(V?)MOVUPSrm",
549 "VPBROADCASTDrm",
550 "VPBROADCASTQrm",
Craig Topper40d3b322018-03-22 21:55:20 +0000551 "(V?)ROUNDPD(Y?)r",
552 "(V?)ROUNDPS(Y?)r",
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000553 "(V?)ROUNDSDr",
554 "(V?)ROUNDSSr")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +0000555
556def HWWriteResGroup0_1 : SchedWriteRes<[HWPort23]> {
557 let Latency = 7;
558 let NumMicroOps = 1;
559 let ResourceCycles = [1];
560}
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000561def: InstRW<[HWWriteResGroup0_1], (instregex "LD_F32m",
562 "LD_F64m",
563 "LD_F80m",
564 "VBROADCASTF128",
565 "VBROADCASTI128",
566 "VBROADCASTSDYrm",
567 "VBROADCASTSSYrm",
568 "VLDDQUYrm",
569 "VMOVAPDYrm",
570 "VMOVAPSYrm",
571 "VMOVDDUPYrm",
572 "VMOVDQAYrm",
573 "VMOVDQUYrm",
574 "VMOVNTDQAYrm",
575 "VMOVSHDUPYrm",
576 "VMOVSLDUPYrm",
577 "VMOVUPDYrm",
578 "VMOVUPSYrm",
579 "VPBROADCASTDYrm",
580 "VPBROADCASTQYrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +0000581
582def HWWriteResGroup0_2 : SchedWriteRes<[HWPort23]> {
583 let Latency = 5;
584 let NumMicroOps = 1;
585 let ResourceCycles = [1];
586}
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000587def: InstRW<[HWWriteResGroup0_2], (instregex "MMX_MOVD64rm",
588 "MMX_MOVD64to64rm",
589 "MMX_MOVQ64rm",
590 "MOV(8|16|32|64)rm",
591 "MOVSX(16|32|64)rm16",
592 "MOVSX(16|32|64)rm32",
593 "MOVSX(16|32|64)rm8",
594 "MOVZX(16|32|64)rm16",
595 "MOVZX(16|32|64)rm8",
596 "PREFETCHNTA",
597 "PREFETCHT0",
598 "PREFETCHT1",
599 "PREFETCHT2",
600 "(V?)MOV64toPQIrm",
601 "(V?)MOVDDUPrm",
602 "(V?)MOVDI2PDIrm",
603 "(V?)MOVQI2PQIrm",
604 "(V?)MOVSDrm",
605 "(V?)MOVSSrm")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +0000606
Gadi Haberd76f7b82017-08-28 10:04:16 +0000607def HWWriteResGroup1 : SchedWriteRes<[HWPort4,HWPort237]> {
608 let Latency = 1;
Michael Zuckermanf6684002017-06-28 11:23:31 +0000609 let NumMicroOps = 2;
Gadi Haberd76f7b82017-08-28 10:04:16 +0000610 let ResourceCycles = [1,1];
Michael Zuckermanf6684002017-06-28 11:23:31 +0000611}
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000612def: InstRW<[HWWriteResGroup1], (instregex "FBSTPm",
613 "MMX_MOVD64from64rm",
614 "MMX_MOVD64mr",
615 "MMX_MOVNTQmr",
616 "MMX_MOVQ64mr",
617 "MOV(16|32|64)mr",
618 "MOV8mi",
619 "MOV8mr",
620 "MOVNTI_64mr",
621 "MOVNTImr",
622 "ST_FP32m",
623 "ST_FP64m",
624 "ST_FP80m",
625 "VEXTRACTF128mr",
626 "VEXTRACTI128mr",
627 "(V?)MOVAPD(Y?)mr",
628 "(V?)MOVAPS(V?)mr",
629 "(V?)MOVDQA(Y?)mr",
630 "(V?)MOVDQU(Y?)mr",
631 "(V?)MOVHPDmr",
632 "(V?)MOVHPSmr",
633 "(V?)MOVLPDmr",
634 "(V?)MOVLPSmr",
635 "(V?)MOVNTDQ(Y?)mr",
636 "(V?)MOVNTPD(Y?)mr",
637 "(V?)MOVNTPS(Y?)mr",
638 "(V?)MOVPDI2DImr",
639 "(V?)MOVPQI2QImr",
640 "(V?)MOVPQIto64mr",
641 "(V?)MOVSDmr",
642 "(V?)MOVSSmr",
643 "(V?)MOVUPD(Y?)mr",
644 "(V?)MOVUPS(Y?)mr",
645 "VMPTRSTm")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +0000646
Gadi Haberd76f7b82017-08-28 10:04:16 +0000647def HWWriteResGroup2 : SchedWriteRes<[HWPort0]> {
648 let Latency = 1;
649 let NumMicroOps = 1;
650 let ResourceCycles = [1];
651}
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000652def: InstRW<[HWWriteResGroup2], (instregex "MMX_MOVD64from64rr",
653 "MMX_MOVD64grr",
654 "MMX_PMOVMSKBrr",
655 "MMX_PSLLDri",
656 "MMX_PSLLDrr",
657 "MMX_PSLLQri",
658 "MMX_PSLLQrr",
659 "MMX_PSLLWri",
660 "MMX_PSLLWrr",
661 "MMX_PSRADri",
662 "MMX_PSRADrr",
663 "MMX_PSRAWri",
664 "MMX_PSRAWrr",
665 "MMX_PSRLDri",
666 "MMX_PSRLDrr",
667 "MMX_PSRLQri",
668 "MMX_PSRLQrr",
669 "MMX_PSRLWri",
670 "MMX_PSRLWrr",
671 "(V?)MOVPDI2DIrr",
672 "(V?)MOVPQIto64rr",
673 "(V?)PSLLD(Y?)ri",
674 "(V?)PSLLQ(Y?)ri",
675 "VPSLLVQ(Y?)rr",
676 "(V?)PSLLW(Y?)ri",
677 "(V?)PSRAD(Y?)ri",
678 "(V?)PSRAW(Y?)ri",
679 "(V?)PSRLD(Y?)ri",
680 "(V?)PSRLQ(Y?)ri",
681 "VPSRLVQ(Y?)rr",
682 "(V?)PSRLW(Y?)ri",
Simon Pilgrim2b5967f2018-03-24 18:36:01 +0000683 "VTESTPD(Y?)rr",
684 "VTESTPS(Y?)rr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +0000685
686def HWWriteResGroup3 : SchedWriteRes<[HWPort1]> {
687 let Latency = 1;
688 let NumMicroOps = 1;
689 let ResourceCycles = [1];
690}
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000691def: InstRW<[HWWriteResGroup3], (instregex "COMP_FST0r",
692 "COM_FST0r",
693 "UCOM_FPr",
694 "UCOM_Fr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +0000695
696def HWWriteResGroup4 : SchedWriteRes<[HWPort5]> {
697 let Latency = 1;
698 let NumMicroOps = 1;
699 let ResourceCycles = [1];
700}
Simon Pilgrim2b5967f2018-03-24 18:36:01 +0000701def: InstRW<[HWWriteResGroup4], (instregex "MMX_MOVD64rr",
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000702 "MMX_MOVD64to64rr",
703 "MMX_MOVQ2DQrr",
704 "MMX_PALIGNRrri",
705 "MMX_PSHUFBrr",
706 "MMX_PSHUFWri",
707 "MMX_PUNPCKHBWirr",
708 "MMX_PUNPCKHDQirr",
709 "MMX_PUNPCKHWDirr",
710 "MMX_PUNPCKLBWirr",
711 "MMX_PUNPCKLDQirr",
712 "MMX_PUNPCKLWDirr",
Simon Pilgrim2b5967f2018-03-24 18:36:01 +0000713 "(V?)ANDNPD(Y?)rr",
714 "(V?)ANDNPS(Y?)rr",
715 "(V?)ANDPD(Y?)rr",
716 "(V?)ANDPS(Y?)rr",
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000717 "VBROADCASTSSrr",
Simon Pilgrim2b5967f2018-03-24 18:36:01 +0000718 "(V?)INSERTPSrr",
719 "(V?)MOV64toPQIrr",
720 "(V?)MOVAPD(Y?)rr",
721 "(V?)MOVAPS(Y?)rr",
722 "(V?)MOVDDUP(Y?)rr",
723 "(V?)MOVDI2PDIrr",
724 "(V?)MOVHLPSrr",
725 "(V?)MOVLHPSrr",
726 "(V?)MOVSDrr",
727 "(V?)MOVSHDUP(Y?)rr",
728 "(V?)MOVSLDUP(Y?)rr",
729 "(V?)MOVSSrr",
730 "(V?)MOVUPD(Y?)rr",
731 "(V?)MOVUPS(Y?)rr",
732 "(V?)ORPD(Y?)rr",
733 "(V?)ORPS(Y?)rr",
734 "(V?)PACKSSDW(Y?)rr",
735 "(V?)PACKSSWB(Y?)rr",
736 "(V?)PACKUSDW(Y?)rr",
737 "(V?)PACKUSWB(Y?)rr",
738 "(V?)PALIGNR(Y?)rri",
739 "(V?)PBLENDW(Y?)rri",
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000740 "VPBROADCASTDrr",
741 "VPBROADCASTQrr",
Simon Pilgrim2b5967f2018-03-24 18:36:01 +0000742 "VPERMILPD(Y?)ri",
743 "VPERMILPD(Y?)rr",
744 "VPERMILPS(Y?)ri",
745 "VPERMILPS(Y?)rr",
746 "(V?)PMOVSXBDrr",
747 "(V?)PMOVSXBQrr",
748 "(V?)PMOVSXBWrr",
749 "(V?)PMOVSXDQrr",
750 "(V?)PMOVSXWDrr",
751 "(V?)PMOVSXWQrr",
752 "(V?)PMOVZXBDrr",
753 "(V?)PMOVZXBQrr",
754 "(V?)PMOVZXBWrr",
755 "(V?)PMOVZXDQrr",
756 "(V?)PMOVZXWDrr",
757 "(V?)PMOVZXWQrr",
758 "(V?)PSHUFB(Y?)rr",
759 "(V?)PSHUFD(Y?)ri",
760 "(V?)PSHUFHW(Y?)ri",
761 "(V?)PSHUFLW(Y?)ri",
762 "(V?)PSLLDQ(Y?)ri",
763 "(V?)PSRLDQ(Y?)ri",
764 "(V?)PUNPCKHBW(Y?)rr",
765 "(V?)PUNPCKHDQ(Y?)rr",
766 "(V?)PUNPCKHQDQ(Y?)rr",
767 "(V?)PUNPCKHWD(Y?)rr",
768 "(V?)PUNPCKLBW(Y?)rr",
769 "(V?)PUNPCKLDQ(Y?)rr",
770 "(V?)PUNPCKLQDQ(Y?)rr",
771 "(V?)PUNPCKLWD(Y?)rr",
772 "(V?)SHUFPD(Y?)rri",
773 "(V?)SHUFPS(Y?)rri",
774 "(V?)UNPCKHPD(Y?)rr",
775 "(V?)UNPCKHPS(Y?)rr",
776 "(V?)UNPCKLPD(Y?)rr",
777 "(V?)UNPCKLPS(Y?)rr",
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000778 "(V?)XORPD(Y?)rr",
779 "(V?)XORPS(Y?)rr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +0000780
781def HWWriteResGroup5 : SchedWriteRes<[HWPort6]> {
782 let Latency = 1;
783 let NumMicroOps = 1;
784 let ResourceCycles = [1];
785}
786def: InstRW<[HWWriteResGroup5], (instregex "JMP(16|32|64)r")>;
787
788def HWWriteResGroup6 : SchedWriteRes<[HWPort01]> {
789 let Latency = 1;
790 let NumMicroOps = 1;
791 let ResourceCycles = [1];
792}
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000793def: InstRW<[HWWriteResGroup6], (instregex "FINCSTP",
794 "FNOP")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +0000795
796def HWWriteResGroup7 : SchedWriteRes<[HWPort06]> {
797 let Latency = 1;
798 let NumMicroOps = 1;
799 let ResourceCycles = [1];
800}
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000801def: InstRW<[HWWriteResGroup7], (instregex "BT(16|32|64)ri8",
802 "BT(16|32|64)rr",
803 "BTC(16|32|64)ri8",
804 "BTC(16|32|64)rr",
805 "BTR(16|32|64)ri8",
806 "BTR(16|32|64)rr",
807 "BTS(16|32|64)ri8",
808 "BTS(16|32|64)rr",
809 "CDQ",
810 "CQO",
811 "J(A|AE|B|BE|E|G|GE|L|LE|NE|NO|NP|NS|O|P|S)_1",
812 "J(A|AE|B|BE|E|G|GE|L|LE|NE|NO|NP|NS|O|P|S)_4",
813 "JMP_1",
814 "JMP_4",
815 "RORX(32|64)ri",
816 "SAR(8|16|32|64)r1",
817 "SAR(8|16|32|64)ri",
818 "SARX(32|64)rr",
819 "SET(AE|B|E|G|GE|L|LE|NE|NO|NP|NS|O|P|S)r",
820 "SHL(8|16|32|64)r1",
821 "SHL(8|16|32|64)ri",
822 "SHLX(32|64)rr",
823 "SHR(8|16|32|64)r1",
824 "SHR(8|16|32|64)ri",
825 "SHRX(32|64)rr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +0000826
827def HWWriteResGroup8 : SchedWriteRes<[HWPort15]> {
828 let Latency = 1;
829 let NumMicroOps = 1;
830 let ResourceCycles = [1];
831}
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000832def: InstRW<[HWWriteResGroup8], (instregex "ANDN(32|64)rr",
833 "BLSI(32|64)rr",
834 "BLSMSK(32|64)rr",
835 "BLSR(32|64)rr",
836 "BZHI(32|64)rr",
837 "LEA(16|32|64)(_32)?r",
838 "MMX_PABSBrr",
839 "MMX_PABSDrr",
840 "MMX_PABSWrr",
841 "MMX_PADDBirr",
842 "MMX_PADDDirr",
843 "MMX_PADDQirr",
844 "MMX_PADDSBirr",
845 "MMX_PADDSWirr",
846 "MMX_PADDUSBirr",
847 "MMX_PADDUSWirr",
848 "MMX_PADDWirr",
849 "MMX_PAVGBirr",
850 "MMX_PAVGWirr",
851 "MMX_PCMPEQBirr",
852 "MMX_PCMPEQDirr",
853 "MMX_PCMPEQWirr",
854 "MMX_PCMPGTBirr",
855 "MMX_PCMPGTDirr",
856 "MMX_PCMPGTWirr",
857 "MMX_PMAXSWirr",
858 "MMX_PMAXUBirr",
859 "MMX_PMINSWirr",
860 "MMX_PMINUBirr",
861 "MMX_PSIGNBrr",
862 "MMX_PSIGNDrr",
863 "MMX_PSIGNWrr",
864 "MMX_PSUBBirr",
865 "MMX_PSUBDirr",
866 "MMX_PSUBQirr",
867 "MMX_PSUBSBirr",
868 "MMX_PSUBSWirr",
869 "MMX_PSUBUSBirr",
870 "MMX_PSUBUSWirr",
871 "MMX_PSUBWirr",
Simon Pilgrim2b5967f2018-03-24 18:36:01 +0000872 "(V?)PABSB(Y?)rr",
873 "(V?)PABSD(Y?)rr",
874 "(V?)PABSW(Y?)rr",
875 "(V?)PADDB(Y?)rr",
876 "(V?)PADDD(Y?)rr",
877 "(V?)PADDQ(Y?)rr",
878 "(V?)PADDSB(Y?)rr",
879 "(V?)PADDSW(Y?)rr",
880 "(V?)PADDUSB(Y?)rr",
881 "(V?)PADDUSW(Y?)rr",
882 "(V?)PADDW(Y?)rr",
883 "(V?)PAVGB(Y?)rr",
884 "(V?)PAVGW(Y?)rr",
885 "(V?)PCMPEQB(Y?)rr",
886 "(V?)PCMPEQD(Y?)rr",
887 "(V?)PCMPEQQ(Y?)rr",
888 "(V?)PCMPEQW(Y?)rr",
889 "(V?)PCMPGTB(Y?)rr",
890 "(V?)PCMPGTD(Y?)rr",
891 "(V?)PCMPGTW(Y?)rr",
892 "(V?)PMAXSB(Y?)rr",
893 "(V?)PMAXSD(Y?)rr",
894 "(V?)PMAXSW(Y?)rr",
895 "(V?)PMAXUB(Y?)rr",
896 "(V?)PMAXUD(Y?)rr",
897 "(V?)PMAXUW(Y?)rr",
898 "(V?)PMINSB(Y?)rr",
899 "(V?)PMINSD(Y?)rr",
900 "(V?)PMINSW(Y?)rr",
901 "(V?)PMINUB(Y?)rr",
902 "(V?)PMINUD(Y?)rr",
903 "(V?)PMINUW(Y?)rr",
904 "(V?)PSIGNB(Y?)rr",
905 "(V?)PSIGND(Y?)rr",
906 "(V?)PSIGNW(Y?)rr",
907 "(V?)PSUBB(Y?)rr",
908 "(V?)PSUBD(Y?)rr",
909 "(V?)PSUBQ(Y?)rr",
910 "(V?)PSUBSB(Y?)rr",
911 "(V?)PSUBSW(Y?)rr",
912 "(V?)PSUBUSB(Y?)rr",
913 "(V?)PSUBUSW(Y?)rr",
914 "(V?)PSUBW(Y?)rr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +0000915
916def HWWriteResGroup9 : SchedWriteRes<[HWPort015]> {
917 let Latency = 1;
918 let NumMicroOps = 1;
919 let ResourceCycles = [1];
920}
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000921def: InstRW<[HWWriteResGroup9], (instregex "MMX_MOVQ64rr",
922 "MMX_PANDNirr",
923 "MMX_PANDirr",
924 "MMX_PORirr",
925 "MMX_PXORirr",
926 "(V?)BLENDPD(Y?)rri",
927 "(V?)BLENDPS(Y?)rri",
928 "(V?)MOVDQA(Y?)rr",
929 "(V?)MOVDQU(Y?)rr",
930 "(V?)MOVPQI2QIrr",
931 "VMOVZPQILo2PQIrr",
932 "(V?)PANDN(Y?)rr",
933 "(V?)PAND(Y?)rr",
934 "VPBLENDD(Y?)rri",
935 "(V?)POR(Y?)rr",
936 "(V?)PXOR(Y?)rr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +0000937
938def HWWriteResGroup10 : SchedWriteRes<[HWPort0156]> {
939 let Latency = 1;
940 let NumMicroOps = 1;
941 let ResourceCycles = [1];
942}
Craig Topper2d451e72018-03-18 08:38:06 +0000943def: InstRW<[HWWriteResGroup10], (instrs CWDE)>;
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000944def: InstRW<[HWWriteResGroup10], (instregex "ADD(8|16|32|64)ri",
945 "ADD(8|16|32|64)rr",
946 "ADD(8|16|32|64)i",
947 "AND(8|16|32|64)ri",
948 "AND(8|16|32|64)rr",
949 "AND(8|16|32|64)i",
950 "CBW",
951 "CLC",
952 "CMC",
953 "CMP(8|16|32|64)ri",
954 "CMP(8|16|32|64)rr",
955 "CMP(8|16|32|64)i",
956 "DEC(8|16|32|64)r",
957 "INC(8|16|32|64)r",
958 "LAHF",
959 "MOV(8|16|32|64)rr",
960 "MOV(8|16|32|64)ri",
961 "MOVSX(16|32|64)rr16",
962 "MOVSX(16|32|64)rr32",
963 "MOVSX(16|32|64)rr8",
964 "MOVZX(16|32|64)rr16",
965 "MOVZX(16|32|64)rr8",
966 "NEG(8|16|32|64)r",
967 "NOOP",
968 "NOT(8|16|32|64)r",
969 "OR(8|16|32|64)ri",
970 "OR(8|16|32|64)rr",
971 "OR(8|16|32|64)i",
972 "SAHF",
973 "SGDT64m",
974 "SIDT64m",
975 "SLDT64m",
976 "SMSW16m",
977 "STC",
978 "STRm",
979 "SUB(8|16|32|64)ri",
980 "SUB(8|16|32|64)rr",
981 "SUB(8|16|32|64)i",
982 "SYSCALL",
983 "TEST(8|16|32|64)rr",
984 "TEST(8|16|32|64)i",
985 "TEST(8|16|32|64)ri",
986 "XCHG(16|32|64)rr",
987 "XOR(8|16|32|64)ri",
988 "XOR(8|16|32|64)rr",
989 "XOR(8|16|32|64)i")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +0000990
991def HWWriteResGroup11 : SchedWriteRes<[HWPort0,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +0000992 let Latency = 6;
Gadi Haberd76f7b82017-08-28 10:04:16 +0000993 let NumMicroOps = 2;
994 let ResourceCycles = [1,1];
995}
Simon Pilgrimec2f8782018-03-21 16:19:03 +0000996def: InstRW<[HWWriteResGroup11], (instregex "MMX_PSLLDrm",
997 "MMX_PSLLQrm",
998 "MMX_PSLLWrm",
999 "MMX_PSRADrm",
1000 "MMX_PSRAWrm",
1001 "MMX_PSRLDrm",
1002 "MMX_PSRLQrm",
1003 "MMX_PSRLWrm",
1004 "VCVTPH2PSrm",
1005 "(V?)CVTPS2PDrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001006
Gadi Haber2cf601f2017-12-08 09:48:44 +00001007def HWWriteResGroup11_1 : SchedWriteRes<[HWPort0,HWPort23]> {
1008 let Latency = 7;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001009 let NumMicroOps = 2;
1010 let ResourceCycles = [1,1];
1011}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001012def: InstRW<[HWWriteResGroup11_1], (instregex "VCVTPH2PSYrm",
1013 "(V?)CVTSS2SDrm",
1014 "VPSLLVQrm",
1015 "VPSRLVQrm",
1016 "VTESTPDrm",
1017 "VTESTPSrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00001018
1019def HWWriteResGroup11_2 : SchedWriteRes<[HWPort0,HWPort23]> {
1020 let Latency = 8;
1021 let NumMicroOps = 2;
1022 let ResourceCycles = [1,1];
1023}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001024def: InstRW<[HWWriteResGroup11_2], (instregex "VPSLLDYrm",
1025 "VPSLLQYrm",
1026 "VPSLLVQYrm",
1027 "VPSLLWYrm",
1028 "VPSRADYrm",
1029 "VPSRAWYrm",
1030 "VPSRLDYrm",
1031 "VPSRLQYrm",
1032 "VPSRLVQYrm",
1033 "VPSRLWYrm",
1034 "VTESTPDYrm",
1035 "VTESTPSYrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00001036
1037def HWWriteResGroup12 : SchedWriteRes<[HWPort1,HWPort23]> {
1038 let Latency = 8;
1039 let NumMicroOps = 2;
1040 let ResourceCycles = [1,1];
1041}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001042def: InstRW<[HWWriteResGroup12], (instrs MUL8m, MUL16m,
1043 IMUL8m, IMUL16m,
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001044 IMUL16rm, IMUL16rmi, IMUL16rmi8, IMUL32rm, IMUL32rmi, IMUL32rmi8, IMUL64rm, IMUL64rmi32, IMUL64rmi8)>;
1045def: InstRW<[HWWriteResGroup12], (instregex "BSF(16|32|64)rm",
1046 "BSR(16|32|64)rm",
1047 "FCOM32m",
1048 "FCOM64m",
1049 "FCOMP32m",
1050 "FCOMP64m",
1051 "LZCNT(16|32|64)rm",
1052 "MMX_CVTPI2PSirm",
1053 "MMX_CVTPS2PIirm",
1054 "MMX_CVTTPS2PIirm",
1055 "PDEP(32|64)rm",
1056 "PEXT(32|64)rm",
1057 "POPCNT(16|32|64)rm",
1058 "TZCNT(16|32|64)rm",
1059 "(V?)ADDSDrm",
1060 "(V?)ADDSSrm",
1061 "(V?)CMPSDrm",
1062 "(V?)CMPSSrm",
1063 "(V?)COMISDrm",
1064 "(V?)COMISSrm",
1065 "(V?)MAX(C?)SDrm",
1066 "(V?)MAX(C?)SSrm",
1067 "(V?)MIN(C?)SDrm",
1068 "(V?)MIN(C?)SSrm",
1069 "(V?)SUBSDrm",
1070 "(V?)SUBSSrm",
1071 "(V?)UCOMISDrm",
1072 "(V?)UCOMISSrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001073
1074def HWWriteResGroup13 : SchedWriteRes<[HWPort5,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001075 let Latency = 7;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001076 let NumMicroOps = 2;
1077 let ResourceCycles = [1,1];
1078}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001079def: InstRW<[HWWriteResGroup13], (instregex "PUNPCKLWDrm",
1080 "(V?)ANDNPDrm",
1081 "(V?)ANDNPSrm",
1082 "(V?)ANDPDrm",
1083 "(V?)ANDPSrm",
1084 "(V?)INSERTPSrm",
1085 "(V?)ORPDrm",
1086 "(V?)ORPSrm",
1087 "(V?)PACKSSDWrm",
1088 "(V?)PACKSSWBrm",
1089 "(V?)PACKUSDWrm",
1090 "(V?)PACKUSWBrm",
1091 "(V?)PALIGNRrmi",
1092 "(V?)PBLENDWrmi",
1093 "VPERMILPDmi",
1094 "VPERMILPDrm",
1095 "VPERMILPSmi",
1096 "VPERMILPSrm",
1097 "(V?)PSHUFBrm",
1098 "(V?)PSHUFDmi",
1099 "(V?)PSHUFHWmi",
1100 "(V?)PSHUFLWmi",
1101 "(V?)PUNPCKHBWrm",
1102 "(V?)PUNPCKHDQrm",
1103 "(V?)PUNPCKHQDQrm",
1104 "(V?)PUNPCKHWDrm",
1105 "(V?)PUNPCKLBWrm",
1106 "(V?)PUNPCKLDQrm",
1107 "(V?)PUNPCKLQDQrm",
1108 "(V?)PUNPCKLWDrm",
1109 "(V?)SHUFPDrmi",
1110 "(V?)SHUFPSrmi",
1111 "(V?)UNPCKHPDrm",
1112 "(V?)UNPCKHPSrm",
1113 "(V?)UNPCKLPDrm",
1114 "(V?)UNPCKLPSrm",
1115 "(V?)XORPDrm",
1116 "(V?)XORPSrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001117
Gadi Haber2cf601f2017-12-08 09:48:44 +00001118def HWWriteResGroup13_1 : SchedWriteRes<[HWPort5,HWPort23]> {
1119 let Latency = 8;
1120 let NumMicroOps = 2;
1121 let ResourceCycles = [1,1];
1122}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001123def: InstRW<[HWWriteResGroup13_1], (instregex "VANDNPDYrm",
1124 "VANDNPSYrm",
1125 "VANDPDYrm",
1126 "VANDPSYrm",
1127 "VORPDYrm",
1128 "VORPSYrm",
1129 "VPACKSSDWYrm",
1130 "VPACKSSWBYrm",
1131 "VPACKUSDWYrm",
1132 "VPACKUSWBYrm",
1133 "VPALIGNRYrmi",
1134 "VPBLENDWYrmi",
1135 "VPERMILPDYmi",
1136 "VPERMILPDYrm",
1137 "VPERMILPSYmi",
1138 "VPERMILPSYrm",
1139 "VPMOVSXBDYrm",
1140 "VPMOVSXBQYrm",
1141 "VPMOVSXWQYrm",
1142 "VPSHUFBYrm",
1143 "VPSHUFDYmi",
1144 "VPSHUFHWYmi",
1145 "VPSHUFLWYmi",
1146 "VPUNPCKHBWYrm",
1147 "VPUNPCKHDQYrm",
1148 "VPUNPCKHQDQYrm",
1149 "VPUNPCKHWDYrm",
1150 "VPUNPCKLBWYrm",
1151 "VPUNPCKLDQYrm",
1152 "VPUNPCKLQDQYrm",
1153 "VPUNPCKLWDYrm",
1154 "VSHUFPDYrmi",
1155 "VSHUFPSYrmi",
1156 "VUNPCKHPDYrm",
1157 "VUNPCKHPSYrm",
1158 "VUNPCKLPDYrm",
1159 "VUNPCKLPSYrm",
1160 "VXORPDYrm",
1161 "VXORPSYrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00001162
1163def HWWriteResGroup13_2 : SchedWriteRes<[HWPort5,HWPort23]> {
1164 let Latency = 6;
1165 let NumMicroOps = 2;
1166 let ResourceCycles = [1,1];
1167}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001168def: InstRW<[HWWriteResGroup13_2], (instregex "MMX_PALIGNRrmi",
1169 "MMX_PINSRWrm",
1170 "MMX_PSHUFBrm",
1171 "MMX_PSHUFWmi",
1172 "MMX_PUNPCKHBWirm",
1173 "MMX_PUNPCKHDQirm",
1174 "MMX_PUNPCKHWDirm",
1175 "MMX_PUNPCKLBWirm",
1176 "MMX_PUNPCKLDQirm",
1177 "MMX_PUNPCKLWDirm",
1178 "(V?)MOVHPDrm",
1179 "(V?)MOVHPSrm",
1180 "(V?)MOVLPDrm",
1181 "(V?)MOVLPSrm",
1182 "(V?)PINSRBrm",
1183 "(V?)PINSRDrm",
1184 "(V?)PINSRQrm",
1185 "(V?)PINSRWrm",
1186 "(V?)PMOVSXBDrm",
1187 "(V?)PMOVSXBQrm",
1188 "(V?)PMOVSXBWrm",
1189 "(V?)PMOVSXDQrm",
1190 "(V?)PMOVSXWDrm",
1191 "(V?)PMOVSXWQrm",
1192 "(V?)PMOVZXBDrm",
1193 "(V?)PMOVZXBQrm",
1194 "(V?)PMOVZXBWrm",
1195 "(V?)PMOVZXDQrm",
1196 "(V?)PMOVZXWDrm",
1197 "(V?)PMOVZXWQrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00001198
Gadi Haberd76f7b82017-08-28 10:04:16 +00001199def HWWriteResGroup14 : SchedWriteRes<[HWPort6,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001200 let Latency = 6;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001201 let NumMicroOps = 2;
1202 let ResourceCycles = [1,1];
1203}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001204def: InstRW<[HWWriteResGroup14], (instregex "FARJMP64",
1205 "JMP(16|32|64)m")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001206
1207def HWWriteResGroup15 : SchedWriteRes<[HWPort23,HWPort06]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001208 let Latency = 6;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001209 let NumMicroOps = 2;
1210 let ResourceCycles = [1,1];
1211}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001212def: InstRW<[HWWriteResGroup15], (instregex "BT(16|32|64)mi8",
1213 "RORX(32|64)mi",
1214 "SARX(32|64)rm",
1215 "SHLX(32|64)rm",
1216 "SHRX(32|64)rm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001217
1218def HWWriteResGroup16 : SchedWriteRes<[HWPort23,HWPort15]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001219 let Latency = 6;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001220 let NumMicroOps = 2;
1221 let ResourceCycles = [1,1];
1222}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001223def: InstRW<[HWWriteResGroup16], (instregex "ANDN(32|64)rm",
1224 "BLSI(32|64)rm",
1225 "BLSMSK(32|64)rm",
1226 "BLSR(32|64)rm",
1227 "BZHI(32|64)rm",
1228 "MMX_PABSBrm",
1229 "MMX_PABSDrm",
1230 "MMX_PABSWrm",
1231 "MMX_PADDBirm",
1232 "MMX_PADDDirm",
1233 "MMX_PADDQirm",
1234 "MMX_PADDSBirm",
1235 "MMX_PADDSWirm",
1236 "MMX_PADDUSBirm",
1237 "MMX_PADDUSWirm",
1238 "MMX_PADDWirm",
1239 "MMX_PAVGBirm",
1240 "MMX_PAVGWirm",
1241 "MMX_PCMPEQBirm",
1242 "MMX_PCMPEQDirm",
1243 "MMX_PCMPEQWirm",
1244 "MMX_PCMPGTBirm",
1245 "MMX_PCMPGTDirm",
1246 "MMX_PCMPGTWirm",
1247 "MMX_PMAXSWirm",
1248 "MMX_PMAXUBirm",
1249 "MMX_PMINSWirm",
1250 "MMX_PMINUBirm",
1251 "MMX_PSIGNBrm",
1252 "MMX_PSIGNDrm",
1253 "MMX_PSIGNWrm",
1254 "MMX_PSUBBirm",
1255 "MMX_PSUBDirm",
1256 "MMX_PSUBQirm",
1257 "MMX_PSUBSBirm",
1258 "MMX_PSUBSWirm",
1259 "MMX_PSUBUSBirm",
1260 "MMX_PSUBUSWirm",
1261 "MMX_PSUBWirm",
1262 "MOVBE(16|32|64)rm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00001263
1264def HWWriteResGroup16_1 : SchedWriteRes<[HWPort23,HWPort15]> {
1265 let Latency = 7;
1266 let NumMicroOps = 2;
1267 let ResourceCycles = [1,1];
1268}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001269def: InstRW<[HWWriteResGroup16_1], (instregex "(V?)PABSBrm",
1270 "(V?)PABSDrm",
1271 "(V?)PABSWrm",
1272 "(V?)PADDBrm",
1273 "(V?)PADDDrm",
1274 "(V?)PADDQrm",
1275 "(V?)PADDSBrm",
1276 "(V?)PADDSWrm",
1277 "(V?)PADDUSBrm",
1278 "(V?)PADDUSWrm",
1279 "(V?)PADDWrm",
1280 "(V?)PAVGBrm",
1281 "(V?)PAVGWrm",
1282 "(V?)PCMPEQBrm",
1283 "(V?)PCMPEQDrm",
1284 "(V?)PCMPEQQrm",
1285 "(V?)PCMPEQWrm",
1286 "(V?)PCMPGTBrm",
1287 "(V?)PCMPGTDrm",
1288 "(V?)PCMPGTWrm",
1289 "(V?)PMAXSBrm",
1290 "(V?)PMAXSDrm",
1291 "(V?)PMAXSWrm",
1292 "(V?)PMAXUBrm",
1293 "(V?)PMAXUDrm",
1294 "(V?)PMAXUWrm",
1295 "(V?)PMINSBrm",
1296 "(V?)PMINSDrm",
1297 "(V?)PMINSWrm",
1298 "(V?)PMINUBrm",
1299 "(V?)PMINUDrm",
1300 "(V?)PMINUWrm",
1301 "(V?)PSIGNBrm",
1302 "(V?)PSIGNDrm",
1303 "(V?)PSIGNWrm",
1304 "(V?)PSUBBrm",
1305 "(V?)PSUBDrm",
1306 "(V?)PSUBQrm",
1307 "(V?)PSUBSBrm",
1308 "(V?)PSUBSWrm",
1309 "(V?)PSUBUSBrm",
1310 "(V?)PSUBUSWrm",
1311 "(V?)PSUBWrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00001312
1313def HWWriteResGroup16_2 : SchedWriteRes<[HWPort23,HWPort15]> {
1314 let Latency = 8;
1315 let NumMicroOps = 2;
1316 let ResourceCycles = [1,1];
1317}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001318def: InstRW<[HWWriteResGroup16_2], (instregex "VPABSBYrm",
1319 "VPABSDYrm",
1320 "VPABSWYrm",
1321 "VPADDBYrm",
1322 "VPADDDYrm",
1323 "VPADDQYrm",
1324 "VPADDSBYrm",
1325 "VPADDSWYrm",
1326 "VPADDUSBYrm",
1327 "VPADDUSWYrm",
1328 "VPADDWYrm",
1329 "VPAVGBYrm",
1330 "VPAVGWYrm",
1331 "VPCMPEQBYrm",
1332 "VPCMPEQDYrm",
1333 "VPCMPEQQYrm",
1334 "VPCMPEQWYrm",
1335 "VPCMPGTBYrm",
1336 "VPCMPGTDYrm",
1337 "VPCMPGTWYrm",
1338 "VPMAXSBYrm",
1339 "VPMAXSDYrm",
1340 "VPMAXSWYrm",
1341 "VPMAXUBYrm",
1342 "VPMAXUDYrm",
1343 "VPMAXUWYrm",
1344 "VPMINSBYrm",
1345 "VPMINSDYrm",
1346 "VPMINSWYrm",
1347 "VPMINUBYrm",
1348 "VPMINUDYrm",
1349 "VPMINUWYrm",
1350 "VPSIGNBYrm",
1351 "VPSIGNDYrm",
1352 "VPSIGNWYrm",
1353 "VPSUBBYrm",
1354 "VPSUBDYrm",
1355 "VPSUBQYrm",
1356 "VPSUBSBYrm",
1357 "VPSUBSWYrm",
1358 "VPSUBUSBYrm",
1359 "VPSUBUSWYrm",
1360 "VPSUBWYrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001361
1362def HWWriteResGroup17 : SchedWriteRes<[HWPort23,HWPort015]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001363 let Latency = 7;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001364 let NumMicroOps = 2;
1365 let ResourceCycles = [1,1];
1366}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001367def: InstRW<[HWWriteResGroup17], (instregex "(V?)BLENDPDrmi",
1368 "(V?)BLENDPSrmi",
1369 "VINSERTF128rm",
1370 "VINSERTI128rm",
1371 "(V?)PANDNrm",
1372 "(V?)PANDrm",
1373 "VPBLENDDrmi",
1374 "(V?)PORrm",
1375 "(V?)PXORrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001376
Gadi Haber2cf601f2017-12-08 09:48:44 +00001377def HWWriteResGroup17_1 : SchedWriteRes<[HWPort23,HWPort015]> {
1378 let Latency = 6;
1379 let NumMicroOps = 2;
1380 let ResourceCycles = [1,1];
1381}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001382def: InstRW<[HWWriteResGroup17_1], (instregex "MMX_PANDNirm",
1383 "MMX_PANDirm",
1384 "MMX_PORirm",
1385 "MMX_PXORirm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00001386
1387def HWWriteResGroup17_2 : SchedWriteRes<[HWPort23,HWPort015]> {
1388 let Latency = 8;
1389 let NumMicroOps = 2;
1390 let ResourceCycles = [1,1];
1391}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001392def: InstRW<[HWWriteResGroup17_2], (instregex "VBLENDPDYrmi",
1393 "VBLENDPSYrmi",
1394 "VPANDNYrm",
1395 "VPANDYrm",
1396 "VPBLENDDYrmi",
1397 "VPORYrm",
1398 "VPXORYrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00001399
Gadi Haberd76f7b82017-08-28 10:04:16 +00001400def HWWriteResGroup18 : SchedWriteRes<[HWPort23,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001401 let Latency = 6;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001402 let NumMicroOps = 2;
1403 let ResourceCycles = [1,1];
1404}
Craig Topper2d451e72018-03-18 08:38:06 +00001405def: InstRW<[HWWriteResGroup18], (instrs POP16r, POP32r, POP64r)>;
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001406def: InstRW<[HWWriteResGroup18], (instregex "ADD(8|16|32|64)rm",
1407 "AND(8|16|32|64)rm",
1408 "CMP(8|16|32|64)mi",
1409 "CMP(8|16|32|64)mr",
1410 "CMP(8|16|32|64)rm",
1411 "OR(8|16|32|64)rm",
1412 "POP(16|32|64)rmr",
1413 "SUB(8|16|32|64)rm",
1414 "TEST(8|16|32|64)mr",
1415 "TEST(8|16|32|64)mi",
1416 "XOR(8|16|32|64)rm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001417
1418def HWWriteResGroup19 : SchedWriteRes<[HWPort237,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001419 let Latency = 2;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001420 let NumMicroOps = 2;
1421 let ResourceCycles = [1,1];
1422}
1423def: InstRW<[HWWriteResGroup19], (instregex "SFENCE")>;
1424
1425def HWWriteResGroup20 : SchedWriteRes<[HWPort4,HWPort5,HWPort237]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001426 let Latency = 2;
Michael Zuckermanf6684002017-06-28 11:23:31 +00001427 let NumMicroOps = 3;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001428 let ResourceCycles = [1,1,1];
Michael Zuckermanf6684002017-06-28 11:23:31 +00001429}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001430def: InstRW<[HWWriteResGroup20], (instregex "(V?)EXTRACTPSmr",
1431 "(V?)PEXTRBmr",
1432 "(V?)PEXTRDmr",
1433 "(V?)PEXTRQmr",
1434 "(V?)PEXTRWmr",
1435 "(V?)STMXCSR")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00001436
Gadi Haberd76f7b82017-08-28 10:04:16 +00001437def HWWriteResGroup21 : SchedWriteRes<[HWPort4,HWPort6,HWPort237]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001438 let Latency = 2;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001439 let NumMicroOps = 3;
1440 let ResourceCycles = [1,1,1];
1441}
1442def: InstRW<[HWWriteResGroup21], (instregex "FNSTCW16m")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00001443
Gadi Haberd76f7b82017-08-28 10:04:16 +00001444def HWWriteResGroup22 : SchedWriteRes<[HWPort4,HWPort237,HWPort06]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001445 let Latency = 2;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001446 let NumMicroOps = 3;
1447 let ResourceCycles = [1,1,1];
1448}
Craig Topperf4cd9082018-01-19 05:47:32 +00001449def: InstRW<[HWWriteResGroup22], (instregex "SET(AE|B|E|G|GE|L|LE|NE|NO|NP|NS|O|P|S)m")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00001450
Gadi Haberd76f7b82017-08-28 10:04:16 +00001451def HWWriteResGroup23 : SchedWriteRes<[HWPort4,HWPort237,HWPort15]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001452 let Latency = 2;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001453 let NumMicroOps = 3;
1454 let ResourceCycles = [1,1,1];
1455}
1456def: InstRW<[HWWriteResGroup23], (instregex "MOVBE(32|64)mr")>;
1457
1458def HWWriteResGroup23_16 : SchedWriteRes<[HWPort06, HWPort237, HWPort4]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001459 let Latency = 2;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001460 let NumMicroOps = 3;
1461 let ResourceCycles = [1,1,1];
1462}
1463def: InstRW<[HWWriteResGroup23_16], (instregex "MOVBE16mr")>;
1464
1465def HWWriteResGroup24 : SchedWriteRes<[HWPort4,HWPort237,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001466 let Latency = 2;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001467 let NumMicroOps = 3;
1468 let ResourceCycles = [1,1,1];
1469}
Craig Topper2d451e72018-03-18 08:38:06 +00001470def: InstRW<[HWWriteResGroup24], (instrs PUSH16r, PUSH32r, PUSH64r)>;
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001471def: InstRW<[HWWriteResGroup24], (instregex "PUSH(16|32|64)rmr",
1472 "PUSH64i8",
1473 "STOSB",
1474 "STOSL",
1475 "STOSQ",
1476 "STOSW")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001477
1478def HWWriteResGroup25 : SchedWriteRes<[HWPort4,HWPort23,HWPort237,HWPort06]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001479 let Latency = 7;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001480 let NumMicroOps = 4;
1481 let ResourceCycles = [1,1,1,1];
1482}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001483def: InstRW<[HWWriteResGroup25], (instregex "BTC(16|32|64)mi8",
1484 "BTR(16|32|64)mi8",
1485 "BTS(16|32|64)mi8",
1486 "SAR(8|16|32|64)m1",
1487 "SAR(8|16|32|64)mi",
1488 "SHL(8|16|32|64)m1",
1489 "SHL(8|16|32|64)mi",
1490 "SHR(8|16|32|64)m1",
1491 "SHR(8|16|32|64)mi")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001492
1493def HWWriteResGroup26 : SchedWriteRes<[HWPort4,HWPort23,HWPort237,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001494 let Latency = 7;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001495 let NumMicroOps = 4;
1496 let ResourceCycles = [1,1,1,1];
1497}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001498def: InstRW<[HWWriteResGroup26], (instregex "ADD(8|16|32|64)mi",
1499 "ADD(8|16|32|64)mr",
1500 "AND(8|16|32|64)mi",
1501 "AND(8|16|32|64)mr",
1502 "DEC(8|16|32|64)m",
1503 "INC(8|16|32|64)m",
1504 "NEG(8|16|32|64)m",
1505 "NOT(8|16|32|64)m",
1506 "OR(8|16|32|64)mi",
1507 "OR(8|16|32|64)mr",
1508 "POP(16|32|64)rmm",
1509 "PUSH(16|32|64)rmm",
1510 "SUB(8|16|32|64)mi",
1511 "SUB(8|16|32|64)mr",
1512 "XOR(8|16|32|64)mi",
1513 "XOR(8|16|32|64)mr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001514
1515def HWWriteResGroup27 : SchedWriteRes<[HWPort5]> {
Michael Zuckermanf6684002017-06-28 11:23:31 +00001516 let Latency = 2;
1517 let NumMicroOps = 2;
Michael Zuckermanf6684002017-06-28 11:23:31 +00001518 let ResourceCycles = [2];
1519}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001520def: InstRW<[HWWriteResGroup27], (instregex "BLENDVPDrr0",
1521 "BLENDVPSrr0",
1522 "MMX_PINSRWrr",
1523 "PBLENDVBrr0",
Simon Pilgrim2b5967f2018-03-24 18:36:01 +00001524 "VBLENDVPD(Y?)rr",
1525 "VBLENDVPS(Y?)rr",
1526 "VPBLENDVB(Y?)rr",
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001527 "(V?)PINSRBrr",
1528 "(V?)PINSRDrr",
1529 "(V?)PINSRQrr",
1530 "(V?)PINSRWrr")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00001531
Gadi Haberd76f7b82017-08-28 10:04:16 +00001532def HWWriteResGroup28 : SchedWriteRes<[HWPort01]> {
1533 let Latency = 2;
1534 let NumMicroOps = 2;
1535 let ResourceCycles = [2];
1536}
1537def: InstRW<[HWWriteResGroup28], (instregex "FDECSTP")>;
1538
1539def HWWriteResGroup29 : SchedWriteRes<[HWPort06]> {
1540 let Latency = 2;
1541 let NumMicroOps = 2;
1542 let ResourceCycles = [2];
1543}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001544def: InstRW<[HWWriteResGroup29], (instregex "ROL(8|16|32|64)r1",
1545 "ROL(8|16|32|64)ri",
1546 "ROR(8|16|32|64)r1",
1547 "ROR(8|16|32|64)ri")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001548
1549def HWWriteResGroup30 : SchedWriteRes<[HWPort0156]> {
1550 let Latency = 2;
1551 let NumMicroOps = 2;
1552 let ResourceCycles = [2];
1553}
1554def: InstRW<[HWWriteResGroup30], (instregex "LFENCE")>;
1555def: InstRW<[HWWriteResGroup30], (instregex "MFENCE")>;
1556def: InstRW<[HWWriteResGroup30], (instregex "WAIT")>;
1557def: InstRW<[HWWriteResGroup30], (instregex "XGETBV")>;
1558
1559def HWWriteResGroup31 : SchedWriteRes<[HWPort0,HWPort5]> {
1560 let Latency = 2;
1561 let NumMicroOps = 2;
1562 let ResourceCycles = [1,1];
1563}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001564def: InstRW<[HWWriteResGroup31], (instregex "MMX_PEXTRWrr",
1565 "VCVTPH2PSYrr",
1566 "VCVTPH2PSrr",
1567 "(V?)CVTPS2PDrr",
1568 "(V?)CVTSS2SDrr",
1569 "(V?)EXTRACTPSrr",
1570 "(V?)PEXTRBrr",
1571 "(V?)PEXTRDrr",
1572 "(V?)PEXTRQrr",
1573 "(V?)PEXTRWrr",
1574 "(V?)PSLLDrr",
1575 "(V?)PSLLQrr",
1576 "(V?)PSLLWrr",
1577 "(V?)PSRADrr",
1578 "(V?)PSRAWrr",
1579 "(V?)PSRLDrr",
1580 "(V?)PSRLQrr",
1581 "(V?)PSRLWrr",
1582 "(V?)PTESTrr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001583
1584def HWWriteResGroup32 : SchedWriteRes<[HWPort6,HWPort0156]> {
1585 let Latency = 2;
1586 let NumMicroOps = 2;
1587 let ResourceCycles = [1,1];
1588}
1589def: InstRW<[HWWriteResGroup32], (instregex "CLFLUSH")>;
1590
1591def HWWriteResGroup33 : SchedWriteRes<[HWPort01,HWPort015]> {
1592 let Latency = 2;
1593 let NumMicroOps = 2;
1594 let ResourceCycles = [1,1];
1595}
1596def: InstRW<[HWWriteResGroup33], (instregex "MMX_MOVDQ2Qrr")>;
1597
1598def HWWriteResGroup34 : SchedWriteRes<[HWPort06,HWPort15]> {
1599 let Latency = 2;
1600 let NumMicroOps = 2;
1601 let ResourceCycles = [1,1];
1602}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001603def: InstRW<[HWWriteResGroup34], (instregex "BEXTR(32|64)rr",
1604 "BSWAP(16|32|64)r")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001605
1606def HWWriteResGroup35 : SchedWriteRes<[HWPort06,HWPort0156]> {
1607 let Latency = 2;
1608 let NumMicroOps = 2;
1609 let ResourceCycles = [1,1];
1610}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001611def: InstRW<[HWWriteResGroup35], (instrs CWD, JCXZ, JECXZ, JRCXZ)>;
1612def: InstRW<[HWWriteResGroup35], (instregex "ADC(8|16|32|64)ri",
1613 "ADC(8|16|32|64)rr",
1614 "ADC(8|16|32|64)i",
1615 "CMOV(AE|B|E|G|GE|L|LE|NE|NO|NP|NS|O|P|S)(16|32|64)rr",
1616 "SBB(8|16|32|64)ri",
1617 "SBB(8|16|32|64)rr",
1618 "SBB(8|16|32|64)i",
1619 "SET(A|BE)r")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001620
1621def HWWriteResGroup36 : SchedWriteRes<[HWPort5,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001622 let Latency = 8;
Michael Zuckermanf6684002017-06-28 11:23:31 +00001623 let NumMicroOps = 3;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001624 let ResourceCycles = [2,1];
Michael Zuckermanf6684002017-06-28 11:23:31 +00001625}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001626def: InstRW<[HWWriteResGroup36], (instregex "BLENDVPDrm0",
1627 "BLENDVPSrm0",
1628 "PBLENDVBrm0",
1629 "VBLENDVPDrm",
1630 "VBLENDVPSrm",
1631 "VMASKMOVPDrm",
1632 "VMASKMOVPSrm",
1633 "VPBLENDVBrm",
1634 "VPMASKMOVDrm",
1635 "VPMASKMOVQrm")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00001636
Gadi Haber2cf601f2017-12-08 09:48:44 +00001637def HWWriteResGroup36_1 : SchedWriteRes<[HWPort5,HWPort23]> {
1638 let Latency = 9;
1639 let NumMicroOps = 3;
1640 let ResourceCycles = [2,1];
1641}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001642def: InstRW<[HWWriteResGroup36_1], (instregex "VBLENDVPDYrm",
1643 "VBLENDVPSYrm",
1644 "VMASKMOVPDYrm",
1645 "VMASKMOVPSYrm",
1646 "VPBLENDVBYrm",
1647 "VPMASKMOVDYrm",
1648 "VPMASKMOVQYrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00001649
1650def HWWriteResGroup36_2 : SchedWriteRes<[HWPort5,HWPort23]> {
1651 let Latency = 7;
1652 let NumMicroOps = 3;
1653 let ResourceCycles = [2,1];
1654}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001655def: InstRW<[HWWriteResGroup36_2], (instregex "MMX_PACKSSDWirm",
1656 "MMX_PACKSSWBirm",
1657 "MMX_PACKUSWBirm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00001658
Gadi Haberd76f7b82017-08-28 10:04:16 +00001659def HWWriteResGroup37 : SchedWriteRes<[HWPort23,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001660 let Latency = 7;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001661 let NumMicroOps = 3;
1662 let ResourceCycles = [1,2];
1663}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001664def: InstRW<[HWWriteResGroup37], (instregex "LEAVE64",
1665 "SCASB",
1666 "SCASL",
1667 "SCASQ",
1668 "SCASW")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001669
1670def HWWriteResGroup38 : SchedWriteRes<[HWPort0,HWPort5,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001671 let Latency = 8;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001672 let NumMicroOps = 3;
1673 let ResourceCycles = [1,1,1];
1674}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001675def: InstRW<[HWWriteResGroup38], (instregex "(V?)PSLLDrm",
1676 "(V?)PSLLQrm",
1677 "(V?)PSLLWrm",
1678 "(V?)PSRADrm",
1679 "(V?)PSRAWrm",
1680 "(V?)PSRLDrm",
1681 "(V?)PSRLQrm",
1682 "(V?)PSRLWrm",
1683 "(V?)PTESTrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001684
1685def HWWriteResGroup39 : SchedWriteRes<[HWPort0,HWPort01,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001686 let Latency = 7;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001687 let NumMicroOps = 3;
1688 let ResourceCycles = [1,1,1];
1689}
1690def: InstRW<[HWWriteResGroup39], (instregex "FLDCW16m")>;
1691
1692def HWWriteResGroup40 : SchedWriteRes<[HWPort0,HWPort23,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001693 let Latency = 7;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001694 let NumMicroOps = 3;
1695 let ResourceCycles = [1,1,1];
1696}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001697def: InstRW<[HWWriteResGroup40], (instregex "(V?)LDMXCSR")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001698
1699def HWWriteResGroup41 : SchedWriteRes<[HWPort6,HWPort23,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001700 let Latency = 7;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001701 let NumMicroOps = 3;
1702 let ResourceCycles = [1,1,1];
1703}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001704def: InstRW<[HWWriteResGroup41], (instregex "LRETQ",
1705 "RETL",
1706 "RETQ")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001707
1708def HWWriteResGroup42 : SchedWriteRes<[HWPort23,HWPort06,HWPort15]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001709 let Latency = 7;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001710 let NumMicroOps = 3;
1711 let ResourceCycles = [1,1,1];
1712}
Craig Toppera42a2ba2017-12-16 18:35:31 +00001713def: InstRW<[HWWriteResGroup42], (instregex "BEXTR(32|64)rm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001714
1715def HWWriteResGroup43 : SchedWriteRes<[HWPort23,HWPort06,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001716 let Latency = 7;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001717 let NumMicroOps = 3;
1718 let ResourceCycles = [1,1,1];
1719}
Craig Topper13a16502018-03-19 00:56:09 +00001720def: InstRW<[HWWriteResGroup43], (instregex "ADC(8|16|32|64)rm")>;
Craig Topperf4cd9082018-01-19 05:47:32 +00001721def: InstRW<[HWWriteResGroup43], (instregex "CMOV(AE|B|E|G|GE|L|LE|NE|NO|NP|NS|O|P|S)(16|32|64)rm")>;
Craig Topper13a16502018-03-19 00:56:09 +00001722def: InstRW<[HWWriteResGroup43], (instregex "SBB(8|16|32|64)rm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001723
1724def HWWriteResGroup44 : SchedWriteRes<[HWPort4,HWPort6,HWPort237,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001725 let Latency = 3;
Michael Zuckermanf6684002017-06-28 11:23:31 +00001726 let NumMicroOps = 4;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001727 let ResourceCycles = [1,1,1,1];
Michael Zuckermanf6684002017-06-28 11:23:31 +00001728}
Gadi Haberd76f7b82017-08-28 10:04:16 +00001729def: InstRW<[HWWriteResGroup44], (instregex "CALL(16|32|64)r")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00001730
Gadi Haberd76f7b82017-08-28 10:04:16 +00001731def HWWriteResGroup45 : SchedWriteRes<[HWPort4,HWPort237,HWPort06,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001732 let Latency = 3;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001733 let NumMicroOps = 4;
1734 let ResourceCycles = [1,1,1,1];
1735}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001736def: InstRW<[HWWriteResGroup45], (instregex "CALL64pcrel32",
1737 "SET(A|BE)m")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001738
1739def HWWriteResGroup46 : SchedWriteRes<[HWPort4,HWPort23,HWPort237,HWPort06]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001740 let Latency = 8;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001741 let NumMicroOps = 5;
1742 let ResourceCycles = [1,1,1,2];
1743}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001744def: InstRW<[HWWriteResGroup46], (instregex "ROL(8|16|32|64)m1",
1745 "ROL(8|16|32|64)mi",
1746 "ROR(8|16|32|64)m1",
1747 "ROR(8|16|32|64)mi")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001748
1749def HWWriteResGroup47 : SchedWriteRes<[HWPort4,HWPort23,HWPort237,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001750 let Latency = 8;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001751 let NumMicroOps = 5;
1752 let ResourceCycles = [1,1,1,2];
1753}
Craig Topper13a16502018-03-19 00:56:09 +00001754def: InstRW<[HWWriteResGroup47], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001755
1756def HWWriteResGroup48 : SchedWriteRes<[HWPort4,HWPort6,HWPort23,HWPort237,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001757 let Latency = 8;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001758 let NumMicroOps = 5;
1759 let ResourceCycles = [1,1,1,1,1];
1760}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001761def: InstRW<[HWWriteResGroup48], (instregex "CALL(16|32|64)m",
1762 "FARCALL64")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001763
1764def HWWriteResGroup49 : SchedWriteRes<[HWPort0]> {
1765 let Latency = 3;
1766 let NumMicroOps = 1;
1767 let ResourceCycles = [1];
1768}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001769def: InstRW<[HWWriteResGroup49], (instregex "(V?)MOVMSKPD(Y?)rr",
1770 "(V?)MOVMSKPS(Y?)rr",
1771 "(V?)PMOVMSKB(Y?)rr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001772
1773def HWWriteResGroup50 : SchedWriteRes<[HWPort1]> {
1774 let Latency = 3;
1775 let NumMicroOps = 1;
1776 let ResourceCycles = [1];
1777}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001778def: InstRW<[HWWriteResGroup50], (instrs MUL8r, IMUL8r, IMUL16rr, IMUL32rr, IMUL32rri, IMUL32rri8, IMUL64rr, IMUL64rri32, IMUL64rri8)>;
1779def: InstRW<[HWWriteResGroup50], (instregex "ADD_FPrST0",
1780 "ADD_FST0r",
1781 "ADD_FrST0",
1782 "BSF(16|32|64)rr",
1783 "BSR(16|32|64)rr",
1784 "LZCNT(16|32|64)rr",
1785 "MMX_CVTPI2PSirr",
1786 "PDEP(32|64)rr",
1787 "PEXT(32|64)rr",
1788 "POPCNT(16|32|64)rr",
1789 "SHLD(16|32|64)rri8",
1790 "SHRD(16|32|64)rri8",
1791 "SUBR_FPrST0",
1792 "SUBR_FST0r",
1793 "SUBR_FrST0",
1794 "SUB_FPrST0",
1795 "SUB_FST0r",
1796 "SUB_FrST0",
1797 "TZCNT(16|32|64)rr",
1798 "(V?)ADDPD(Y?)rr",
1799 "(V?)ADDPS(Y?)rr",
1800 "(V?)ADDSDrr",
1801 "(V?)ADDSSrr",
1802 "(V?)ADDSUBPD(Y?)rr",
1803 "(V?)ADDSUBPS(Y?)rr",
1804 "(V?)CMPPD(Y?)rri",
1805 "(V?)CMPPS(Y?)rri",
1806 "(V?)CMPSDrr",
1807 "(V?)CMPSSrr",
1808 "(V?)COMISDrr",
1809 "(V?)COMISSrr",
1810 "(V?)CVTDQ2PS(Y?)rr",
1811 "(V?)CVTPS2DQ(Y?)rr",
1812 "(V?)CVTTPS2DQ(Y?)rr",
1813 "(V?)MAX(C?)PD(Y?)rr",
1814 "(V?)MAX(C?)PS(Y?)rr",
1815 "(V?)MAX(C?)SDrr",
1816 "(V?)MAX(C?)SSrr",
1817 "(V?)MIN(C?)PD(Y?)rr",
1818 "(V?)MIN(C?)PS(Y?)rr",
1819 "(V?)MIN(C?)SDrr",
1820 "(V?)MIN(C?)SSrr",
1821 "(V?)SUBPD(Y?)rr",
1822 "(V?)SUBPS(Y?)rr",
1823 "(V?)SUBSDrr",
1824 "(V?)SUBSSrr",
1825 "(V?)UCOMISDrr",
1826 "(V?)UCOMISSrr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001827
Clement Courbet327fac42018-03-07 08:14:02 +00001828def HWWriteResGroup50_16i : SchedWriteRes<[HWPort1, HWPort0156]> {
Gadi Haberd76f7b82017-08-28 10:04:16 +00001829 let Latency = 3;
Clement Courbet327fac42018-03-07 08:14:02 +00001830 let NumMicroOps = 2;
1831 let ResourceCycles = [1,1];
Gadi Haberd76f7b82017-08-28 10:04:16 +00001832}
Clement Courbet327fac42018-03-07 08:14:02 +00001833def: InstRW<[HWWriteResGroup50_16i], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001834
1835def HWWriteResGroup51 : SchedWriteRes<[HWPort5]> {
1836 let Latency = 3;
1837 let NumMicroOps = 1;
1838 let ResourceCycles = [1];
1839}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001840def: InstRW<[HWWriteResGroup51], (instregex "VBROADCASTSDYrr",
1841 "VBROADCASTSSYrr",
1842 "VEXTRACTF128rr",
1843 "VEXTRACTI128rr",
1844 "VINSERTF128rr",
1845 "VINSERTI128rr",
1846 "VPBROADCASTBYrr",
1847 "VPBROADCASTBrr",
1848 "VPBROADCASTDYrr",
1849 "VPBROADCASTQYrr",
1850 "VPBROADCASTWYrr",
1851 "VPBROADCASTWrr",
1852 "VPERM2F128rr",
1853 "VPERM2I128rr",
1854 "VPERMDYrr",
1855 "VPERMPDYri",
1856 "VPERMPSYrr",
1857 "VPERMQYri",
1858 "VPMOVSXBDYrr",
1859 "VPMOVSXBQYrr",
1860 "VPMOVSXBWYrr",
1861 "VPMOVSXDQYrr",
1862 "VPMOVSXWDYrr",
1863 "VPMOVSXWQYrr",
1864 "VPMOVZXBDYrr",
1865 "VPMOVZXBQYrr",
1866 "VPMOVZXBWYrr",
1867 "VPMOVZXDQYrr",
1868 "VPMOVZXWDYrr",
1869 "VPMOVZXWQYrr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001870
1871def HWWriteResGroup52 : SchedWriteRes<[HWPort1,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001872 let Latency = 9;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001873 let NumMicroOps = 2;
1874 let ResourceCycles = [1,1];
1875}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001876def: InstRW<[HWWriteResGroup52], (instregex "(V?)ADDPDrm",
1877 "(V?)ADDPSrm",
1878 "(V?)ADDSUBPDrm",
1879 "(V?)ADDSUBPSrm",
1880 "(V?)CMPPDrmi",
1881 "(V?)CMPPSrmi",
1882 "(V?)CVTDQ2PSrm",
1883 "(V?)CVTPS2DQrm",
1884 "(V?)CVTTPS2DQrm",
1885 "(V?)MAX(C?)PDrm",
1886 "(V?)MAX(C?)PSrm",
1887 "(V?)MIN(C?)PDrm",
1888 "(V?)MIN(C?)PSrm",
1889 "(V?)SUBPDrm",
1890 "(V?)SUBPSrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001891
Gadi Haber2cf601f2017-12-08 09:48:44 +00001892def HWWriteResGroup52_1 : SchedWriteRes<[HWPort1,HWPort23]> {
1893 let Latency = 10;
1894 let NumMicroOps = 2;
1895 let ResourceCycles = [1,1];
Gadi Haberd76f7b82017-08-28 10:04:16 +00001896}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001897def: InstRW<[HWWriteResGroup52_1], (instregex "ADD_F32m",
1898 "ADD_F64m",
1899 "ILD_F16m",
1900 "ILD_F32m",
1901 "ILD_F64m",
1902 "SUBR_F32m",
1903 "SUBR_F64m",
1904 "SUB_F32m",
1905 "SUB_F64m",
1906 "VADDPDYrm",
1907 "VADDPSYrm",
1908 "VADDSUBPDYrm",
1909 "VADDSUBPSYrm",
1910 "VCMPPDYrmi",
1911 "VCMPPSYrmi",
1912 "VCVTDQ2PSYrm",
1913 "VCVTPS2DQYrm",
1914 "VCVTTPS2DQYrm",
1915 "VMAX(C?)PDYrm",
1916 "VMAX(C?)PSYrm",
1917 "VMIN(C?)PDYrm",
1918 "VMIN(C?)PSYrm",
1919 "VSUBPDYrm",
1920 "VSUBPSYrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001921
1922def HWWriteResGroup53 : SchedWriteRes<[HWPort5,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00001923 let Latency = 10;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001924 let NumMicroOps = 2;
1925 let ResourceCycles = [1,1];
1926}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001927def: InstRW<[HWWriteResGroup53], (instregex "VPERM2F128rm",
1928 "VPERM2I128rm",
1929 "VPERMDYrm",
1930 "VPERMPDYmi",
1931 "VPERMPSYrm",
1932 "VPERMQYmi",
1933 "VPMOVZXBDYrm",
1934 "VPMOVZXBQYrm",
1935 "VPMOVZXBWYrm",
1936 "VPMOVZXDQYrm",
1937 "VPMOVZXWQYrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001938
Gadi Haber2cf601f2017-12-08 09:48:44 +00001939def HWWriteResGroup53_1 : SchedWriteRes<[HWPort5,HWPort23]> {
1940 let Latency = 9;
1941 let NumMicroOps = 2;
1942 let ResourceCycles = [1,1];
1943}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001944def: InstRW<[HWWriteResGroup53_1], (instregex "VPMOVSXBWYrm",
1945 "VPMOVSXDQYrm",
1946 "VPMOVSXWDYrm",
1947 "VPMOVZXWDYrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00001948
Gadi Haberd76f7b82017-08-28 10:04:16 +00001949def HWWriteResGroup54 : SchedWriteRes<[HWPort0156]> {
1950 let Latency = 3;
1951 let NumMicroOps = 3;
1952 let ResourceCycles = [3];
1953}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001954def: InstRW<[HWWriteResGroup54], (instregex "XADD(8|16|32|64)rr",
1955 "XCHG8rr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001956
1957def HWWriteResGroup55 : SchedWriteRes<[HWPort0,HWPort5]> {
1958 let Latency = 3;
1959 let NumMicroOps = 3;
1960 let ResourceCycles = [2,1];
1961}
Simon Pilgrim2b5967f2018-03-24 18:36:01 +00001962def: InstRW<[HWWriteResGroup55], (instregex "VPSLLVD(Y?)rr",
1963 "VPSRAVD(Y?)rr",
1964 "VPSRLVD(Y?)rr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001965
1966def HWWriteResGroup56 : SchedWriteRes<[HWPort5,HWPort15]> {
1967 let Latency = 3;
1968 let NumMicroOps = 3;
1969 let ResourceCycles = [2,1];
1970}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001971def: InstRW<[HWWriteResGroup56], (instregex "MMX_PHADDDrr",
1972 "MMX_PHADDSWrr",
1973 "MMX_PHADDWrr",
1974 "MMX_PHSUBDrr",
1975 "MMX_PHSUBSWrr",
1976 "MMX_PHSUBWrr",
1977 "(V?)PHADDD(Y?)rr",
1978 "(V?)PHADDSW(Y?)rr",
1979 "(V?)PHADDW(Y?)rr",
1980 "(V?)PHSUBD(Y?)rr",
1981 "(V?)PHSUBSW(Y?)rr",
1982 "(V?)PHSUBW(Y?)rr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001983
1984def HWWriteResGroup57 : SchedWriteRes<[HWPort5,HWPort0156]> {
1985 let Latency = 3;
1986 let NumMicroOps = 3;
1987 let ResourceCycles = [2,1];
1988}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00001989def: InstRW<[HWWriteResGroup57], (instregex "MMX_PACKSSDWirr",
1990 "MMX_PACKSSWBirr",
1991 "MMX_PACKUSWBirr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00001992
1993def HWWriteResGroup58 : SchedWriteRes<[HWPort6,HWPort0156]> {
1994 let Latency = 3;
1995 let NumMicroOps = 3;
1996 let ResourceCycles = [1,2];
1997}
1998def: InstRW<[HWWriteResGroup58], (instregex "CLD")>;
1999
2000def HWWriteResGroup59 : SchedWriteRes<[HWPort06,HWPort0156]> {
2001 let Latency = 3;
2002 let NumMicroOps = 3;
2003 let ResourceCycles = [1,2];
2004}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002005def: InstRW<[HWWriteResGroup59], (instregex "CMOV(A|BE)(16|32|64)rr",
2006 "RCL(8|16|32|64)r1",
2007 "RCL(8|16|32|64)ri",
2008 "RCR(8|16|32|64)r1",
2009 "RCR(8|16|32|64)ri")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002010
2011def HWWriteResGroup60 : SchedWriteRes<[HWPort06,HWPort0156]> {
2012 let Latency = 3;
2013 let NumMicroOps = 3;
2014 let ResourceCycles = [2,1];
2015}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002016def: InstRW<[HWWriteResGroup60], (instregex "ROL(8|16|32|64)rCL",
2017 "ROR(8|16|32|64)rCL",
2018 "SAR(8|16|32|64)rCL",
2019 "SHL(8|16|32|64)rCL",
2020 "SHR(8|16|32|64)rCL")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002021
2022def HWWriteResGroup61 : SchedWriteRes<[HWPort0,HWPort4,HWPort237]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002023 let Latency = 4;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002024 let NumMicroOps = 3;
2025 let ResourceCycles = [1,1,1];
2026}
2027def: InstRW<[HWWriteResGroup61], (instregex "FNSTSWm")>;
2028
2029def HWWriteResGroup62 : SchedWriteRes<[HWPort1,HWPort4,HWPort237]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002030 let Latency = 4;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002031 let NumMicroOps = 3;
2032 let ResourceCycles = [1,1,1];
2033}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002034def: InstRW<[HWWriteResGroup62], (instregex "ISTT_FP16m",
2035 "ISTT_FP32m",
2036 "ISTT_FP64m",
2037 "IST_F16m",
2038 "IST_F32m",
2039 "IST_FP16m",
2040 "IST_FP32m",
2041 "IST_FP64m")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002042
2043def HWWriteResGroup63 : SchedWriteRes<[HWPort0,HWPort5,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002044 let Latency = 10;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002045 let NumMicroOps = 4;
2046 let ResourceCycles = [2,1,1];
2047}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002048def: InstRW<[HWWriteResGroup63], (instregex "VPSLLVDYrm",
2049 "VPSRAVDYrm",
2050 "VPSRLVDYrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00002051
2052def HWWriteResGroup63_1 : SchedWriteRes<[HWPort0,HWPort5,HWPort23]> {
2053 let Latency = 9;
2054 let NumMicroOps = 4;
2055 let ResourceCycles = [2,1,1];
2056}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002057def: InstRW<[HWWriteResGroup63_1], (instregex "VPSLLVDrm",
2058 "VPSRAVDrm",
2059 "VPSRLVDrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002060
2061def HWWriteResGroup64 : SchedWriteRes<[HWPort5,HWPort23,HWPort15]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002062 let Latency = 8;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002063 let NumMicroOps = 4;
2064 let ResourceCycles = [2,1,1];
2065}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002066def: InstRW<[HWWriteResGroup64], (instregex "MMX_PHADDDrm",
2067 "MMX_PHADDSWrm",
2068 "MMX_PHADDWrm",
2069 "MMX_PHSUBDrm",
2070 "MMX_PHSUBSWrm",
2071 "MMX_PHSUBWrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00002072
2073def HWWriteResGroup64_1 : SchedWriteRes<[HWPort5,HWPort23,HWPort15]> {
2074 let Latency = 10;
2075 let NumMicroOps = 4;
2076 let ResourceCycles = [2,1,1];
2077}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002078def: InstRW<[HWWriteResGroup64_1], (instregex "VPHADDDYrm",
2079 "VPHADDSWYrm",
2080 "VPHADDWYrm",
2081 "VPHSUBDYrm",
2082 "VPHSUBSWYrm",
2083 "VPHSUBWYrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00002084
2085def HWWriteResGroup64_2 : SchedWriteRes<[HWPort5,HWPort23,HWPort15]> {
2086 let Latency = 9;
2087 let NumMicroOps = 4;
2088 let ResourceCycles = [2,1,1];
2089}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002090def: InstRW<[HWWriteResGroup64_2], (instregex "(V?)PHADDDrm",
2091 "(V?)PHADDSWrm",
2092 "(V?)PHADDWrm",
2093 "(V?)PHSUBDrm",
2094 "(V?)PHSUBSWrm",
2095 "(V?)PHSUBWrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002096
2097def HWWriteResGroup65 : SchedWriteRes<[HWPort23,HWPort06,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002098 let Latency = 8;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002099 let NumMicroOps = 4;
2100 let ResourceCycles = [1,1,2];
2101}
Craig Topperf4cd9082018-01-19 05:47:32 +00002102def: InstRW<[HWWriteResGroup65], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002103
2104def HWWriteResGroup66 : SchedWriteRes<[HWPort23,HWPort237,HWPort06,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002105 let Latency = 9;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002106 let NumMicroOps = 5;
2107 let ResourceCycles = [1,1,1,2];
2108}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002109def: InstRW<[HWWriteResGroup66], (instregex "RCL(8|16|32|64)m1",
2110 "RCL(8|16|32|64)mi",
2111 "RCR(8|16|32|64)m1",
2112 "RCR(8|16|32|64)mi")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002113
2114def HWWriteResGroup67 : SchedWriteRes<[HWPort23,HWPort237,HWPort06,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002115 let Latency = 9;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002116 let NumMicroOps = 5;
2117 let ResourceCycles = [1,1,2,1];
2118}
Craig Topper13a16502018-03-19 00:56:09 +00002119def: InstRW<[HWWriteResGroup67], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002120
2121def HWWriteResGroup68 : SchedWriteRes<[HWPort4,HWPort23,HWPort237,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002122 let Latency = 9;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002123 let NumMicroOps = 6;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002124 let ResourceCycles = [1,1,1,3];
Michael Zuckermanf6684002017-06-28 11:23:31 +00002125}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002126def: InstRW<[HWWriteResGroup68], (instregex "ADC(8|16|32|64)mi",
2127 "XCHG(8|16|32|64)rm")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002128
Gadi Haberd76f7b82017-08-28 10:04:16 +00002129def HWWriteResGroup69 : SchedWriteRes<[HWPort4,HWPort23,HWPort237,HWPort06,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002130 let Latency = 9;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002131 let NumMicroOps = 6;
2132 let ResourceCycles = [1,1,1,2,1];
Michael Zuckermanf6684002017-06-28 11:23:31 +00002133}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002134def: InstRW<[HWWriteResGroup69], (instregex "ADC(8|16|32|64)mr",
2135 "CMPXCHG(8|16|32|64)rm",
2136 "ROL(8|16|32|64)mCL",
2137 "SAR(8|16|32|64)mCL",
2138 "SBB(8|16|32|64)mi",
2139 "SBB(8|16|32|64)mr",
2140 "SHL(8|16|32|64)mCL",
2141 "SHR(8|16|32|64)mCL")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002142
Gadi Haberd76f7b82017-08-28 10:04:16 +00002143def HWWriteResGroup70 : SchedWriteRes<[HWPort0,HWPort1]> {
2144 let Latency = 4;
2145 let NumMicroOps = 2;
2146 let ResourceCycles = [1,1];
2147}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002148def: InstRW<[HWWriteResGroup70], (instregex "(V?)CVTSD2SI64rr",
2149 "(V?)CVTSD2SIrr",
2150 "(V?)CVTSS2SI64rr",
2151 "(V?)CVTSS2SIrr",
2152 "(V?)CVTTSD2SI64rr",
2153 "(V?)CVTTSD2SIrr",
2154 "(V?)CVTTSS2SI64rr",
2155 "(V?)CVTTSS2SIrr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002156
2157def HWWriteResGroup71 : SchedWriteRes<[HWPort0,HWPort5]> {
2158 let Latency = 4;
2159 let NumMicroOps = 2;
2160 let ResourceCycles = [1,1];
2161}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002162def: InstRW<[HWWriteResGroup71], (instregex "VCVTPS2PDYrr",
2163 "VPSLLDYrr",
2164 "VPSLLQYrr",
2165 "VPSLLWYrr",
2166 "VPSRADYrr",
2167 "VPSRAWYrr",
2168 "VPSRLDYrr",
2169 "VPSRLQYrr",
2170 "VPSRLWYrr",
2171 "VPTESTYrr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002172
2173def HWWriteResGroup72 : SchedWriteRes<[HWPort0,HWPort0156]> {
2174 let Latency = 4;
2175 let NumMicroOps = 2;
2176 let ResourceCycles = [1,1];
2177}
2178def: InstRW<[HWWriteResGroup72], (instregex "FNSTSW16r")>;
2179
2180def HWWriteResGroup73 : SchedWriteRes<[HWPort1,HWPort5]> {
2181 let Latency = 4;
2182 let NumMicroOps = 2;
2183 let ResourceCycles = [1,1];
2184}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002185def: InstRW<[HWWriteResGroup73], (instregex "MMX_CVTPD2PIirr",
2186 "MMX_CVTPI2PDirr",
2187 "MMX_CVTPS2PIirr",
2188 "MMX_CVTTPD2PIirr",
2189 "MMX_CVTTPS2PIirr",
2190 "(V?)CVTDQ2PDrr",
2191 "(V?)CVTPD2DQrr",
2192 "(V?)CVTPD2PSrr",
2193 "VCVTPS2PHrr",
2194 "(V?)CVTSD2SSrr",
2195 "(V?)CVTSI642SDrr",
2196 "(V?)CVTSI2SDrr",
2197 "(V?)CVTSI2SSrr",
2198 "(V?)CVTTPD2DQrr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002199
2200def HWWriteResGroup74 : SchedWriteRes<[HWPort1,HWPort6]> {
2201 let Latency = 4;
2202 let NumMicroOps = 2;
2203 let ResourceCycles = [1,1];
2204}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002205def: InstRW<[HWWriteResGroup74], (instrs IMUL64r, MUL64r, MULX64rr)>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002206
2207def HWWriteResGroup74_16 : SchedWriteRes<[HWPort1, HWPort0156]> {
2208 let Latency = 4;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002209 let NumMicroOps = 4;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002210}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002211def: InstRW<[HWWriteResGroup74_16], (instrs IMUL16r, MUL16r)>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002212
Gadi Haberd76f7b82017-08-28 10:04:16 +00002213def HWWriteResGroup75 : SchedWriteRes<[HWPort1,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002214 let Latency = 11;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002215 let NumMicroOps = 3;
2216 let ResourceCycles = [2,1];
2217}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002218def: InstRW<[HWWriteResGroup75], (instregex "FICOM16m",
2219 "FICOM32m",
2220 "FICOMP16m",
2221 "FICOMP32m")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002222
2223def HWWriteResGroup76 : SchedWriteRes<[HWPort0,HWPort1,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002224 let Latency = 9;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002225 let NumMicroOps = 3;
2226 let ResourceCycles = [1,1,1];
2227}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002228def: InstRW<[HWWriteResGroup76], (instregex "(V?)CVTSD2SI64rm",
2229 "(V?)CVTSD2SIrm",
2230 "(V?)CVTSS2SI64rm",
2231 "(V?)CVTSS2SIrm",
2232 "(V?)CVTTSD2SI64rm",
2233 "(V?)CVTTSD2SIrm",
2234 "VCVTTSS2SI64rm",
2235 "(V?)CVTTSS2SIrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002236
2237def HWWriteResGroup77 : SchedWriteRes<[HWPort0,HWPort5,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002238 let Latency = 10;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002239 let NumMicroOps = 3;
2240 let ResourceCycles = [1,1,1];
2241}
2242def: InstRW<[HWWriteResGroup77], (instregex "VCVTPS2PDYrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00002243
2244def HWWriteResGroup77_1 : SchedWriteRes<[HWPort0,HWPort5,HWPort23]> {
2245 let Latency = 11;
2246 let NumMicroOps = 3;
2247 let ResourceCycles = [1,1,1];
2248}
2249def: InstRW<[HWWriteResGroup77_1], (instregex "VPTESTYrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002250
2251def HWWriteResGroup78 : SchedWriteRes<[HWPort1,HWPort5,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002252 let Latency = 10;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002253 let NumMicroOps = 3;
2254 let ResourceCycles = [1,1,1];
2255}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002256def: InstRW<[HWWriteResGroup78], (instregex "CVTPD2DQrm",
2257 "CVTPD2PSrm",
2258 "CVTTPD2DQrm",
2259 "MMX_CVTPD2PIirm",
2260 "MMX_CVTTPD2PIirm",
2261 "(V?)CVTDQ2PDrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00002262
2263def HWWriteResGroup78_1 : SchedWriteRes<[HWPort1,HWPort5,HWPort23]> {
2264 let Latency = 9;
2265 let NumMicroOps = 3;
2266 let ResourceCycles = [1,1,1];
2267}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002268def: InstRW<[HWWriteResGroup78_1], (instregex "MMX_CVTPI2PDirm",
2269 "(V?)CVTSD2SSrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002270
2271def HWWriteResGroup79 : SchedWriteRes<[HWPort1,HWPort6,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002272 let Latency = 9;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002273 let NumMicroOps = 3;
2274 let ResourceCycles = [1,1,1];
2275}
Craig Topper4a3be6e2018-03-22 19:22:51 +00002276def: InstRW<[HWWriteResGroup79], (instrs IMUL64m, MUL64m, MULX64rm)>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002277
2278def HWWriteResGroup80 : SchedWriteRes<[HWPort5,HWPort23,HWPort015]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002279 let Latency = 9;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002280 let NumMicroOps = 3;
2281 let ResourceCycles = [1,1,1];
2282}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002283def: InstRW<[HWWriteResGroup80], (instregex "VPBROADCASTBYrm",
2284 "VPBROADCASTBrm",
2285 "VPBROADCASTWYrm",
2286 "VPBROADCASTWrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002287
2288def HWWriteResGroup81 : SchedWriteRes<[HWPort0156]> {
2289 let Latency = 4;
2290 let NumMicroOps = 4;
2291 let ResourceCycles = [4];
2292}
2293def: InstRW<[HWWriteResGroup81], (instregex "FNCLEX")>;
2294
2295def HWWriteResGroup82 : SchedWriteRes<[HWPort015,HWPort0156]> {
2296 let Latency = 4;
2297 let NumMicroOps = 4;
2298 let ResourceCycles = [1,3];
2299}
2300def: InstRW<[HWWriteResGroup82], (instregex "VZEROUPPER")>;
2301
2302def HWWriteResGroup83 : SchedWriteRes<[HWPort1,HWPort6,HWPort0156]> {
2303 let Latency = 4;
2304 let NumMicroOps = 4;
2305 let ResourceCycles = [1,1,2];
2306}
2307def: InstRW<[HWWriteResGroup83], (instregex "LAR(16|32|64)rr")>;
2308
2309def HWWriteResGroup84 : SchedWriteRes<[HWPort0,HWPort4,HWPort237,HWPort15]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002310 let Latency = 5;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002311 let NumMicroOps = 4;
2312 let ResourceCycles = [1,1,1,1];
2313}
Simon Pilgrim2b5967f2018-03-24 18:36:01 +00002314def: InstRW<[HWWriteResGroup84], (instregex "VMASKMOVPD(Y?)mr",
2315 "VMASKMOVPS(Y?)mr",
2316 "VPMASKMOVD(Y?)mr",
2317 "VPMASKMOVQ(Y?)mr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002318
2319def HWWriteResGroup85 : SchedWriteRes<[HWPort1,HWPort4,HWPort5,HWPort237]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002320 let Latency = 5;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002321 let NumMicroOps = 4;
2322 let ResourceCycles = [1,1,1,1];
2323}
2324def: InstRW<[HWWriteResGroup85], (instregex "VCVTPS2PHmr")>;
2325
2326def HWWriteResGroup86 : SchedWriteRes<[HWPort1,HWPort23,HWPort237,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002327 let Latency = 10;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002328 let NumMicroOps = 4;
2329 let ResourceCycles = [1,1,1,1];
2330}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002331def: InstRW<[HWWriteResGroup86], (instregex "SHLD(16|32|64)mri8",
2332 "SHRD(16|32|64)mri8")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002333
2334def HWWriteResGroup87 : SchedWriteRes<[HWPort1,HWPort6,HWPort23,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002335 let Latency = 9;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002336 let NumMicroOps = 5;
2337 let ResourceCycles = [1,2,1,1];
2338}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002339def: InstRW<[HWWriteResGroup87], (instregex "LAR(16|32|64)rm",
2340 "LSL(16|32|64)rm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002341
2342def HWWriteResGroup88 : SchedWriteRes<[HWPort4,HWPort237,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002343 let Latency = 5;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002344 let NumMicroOps = 6;
2345 let ResourceCycles = [1,1,4];
2346}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002347def: InstRW<[HWWriteResGroup88], (instregex "PUSHF16",
2348 "PUSHF64")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002349
2350def HWWriteResGroup89 : SchedWriteRes<[HWPort0]> {
Michael Zuckermanf6684002017-06-28 11:23:31 +00002351 let Latency = 5;
2352 let NumMicroOps = 1;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002353 let ResourceCycles = [1];
Michael Zuckermanf6684002017-06-28 11:23:31 +00002354}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002355def: InstRW<[HWWriteResGroup89], (instregex "MMX_PMADDUBSWrr",
2356 "MMX_PMADDWDirr",
2357 "MMX_PMULHRSWrr",
2358 "MMX_PMULHUWirr",
2359 "MMX_PMULHWirr",
2360 "MMX_PMULLWirr",
2361 "MMX_PMULUDQirr",
2362 "MMX_PSADBWirr",
2363 "MUL_FPrST0",
2364 "MUL_FST0r",
2365 "MUL_FrST0",
2366 "(V?)PCMPGTQ(Y?)rr",
2367 "(V?)PHMINPOSUWrr",
2368 "(V?)PMADDUBSW(Y?)rr",
2369 "(V?)PMADDWD(Y?)rr",
2370 "(V?)PMULDQ(Y?)rr",
2371 "(V?)PMULHRSW(Y?)rr",
2372 "(V?)PMULHUW(Y?)rr",
2373 "(V?)PMULHW(Y?)rr",
2374 "(V?)PMULLW(Y?)rr",
2375 "(V?)PMULUDQ(Y?)rr",
2376 "(V?)PSADBW(Y?)rr",
2377 "(V?)RCPPSr",
2378 "(V?)RCPSSr",
2379 "(V?)RSQRTPSr",
2380 "(V?)RSQRTSSr")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002381
Gadi Haberd76f7b82017-08-28 10:04:16 +00002382def HWWriteResGroup90 : SchedWriteRes<[HWPort01]> {
Michael Zuckermanf6684002017-06-28 11:23:31 +00002383 let Latency = 5;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002384 let NumMicroOps = 1;
2385 let ResourceCycles = [1];
Michael Zuckermanf6684002017-06-28 11:23:31 +00002386}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002387def: InstRW<[HWWriteResGroup90], (instregex "(V?)MULPD(Y?)rr",
2388 "(V?)MULPS(Y?)rr",
2389 "(V?)MULSDrr",
2390 "(V?)MULSSrr",
2391 "VF(N)?M(ADD|SUB|ADDSUB|SUBADD)(132|213|231)P(D|S)(Y)?r",
2392 "VF(N)?M(ADD|SUB)(132|213|231)S(D|S)r")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002393
Gadi Haberd76f7b82017-08-28 10:04:16 +00002394def HWWriteResGroup91 : SchedWriteRes<[HWPort0,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002395 let Latency = 10;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002396 let NumMicroOps = 2;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002397 let ResourceCycles = [1,1];
Michael Zuckermanf6684002017-06-28 11:23:31 +00002398}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002399def: InstRW<[HWWriteResGroup91], (instregex "MMX_PMADDUBSWrm",
2400 "MMX_PMADDWDirm",
2401 "MMX_PMULHRSWrm",
2402 "MMX_PMULHUWirm",
2403 "MMX_PMULHWirm",
2404 "MMX_PMULLWirm",
2405 "MMX_PMULUDQirm",
2406 "MMX_PSADBWirm",
2407 "(V?)RCPSSm",
2408 "(V?)RSQRTSSm")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002409
Gadi Haber2cf601f2017-12-08 09:48:44 +00002410def HWWriteResGroup91_1 : SchedWriteRes<[HWPort0,HWPort23]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00002411 let Latency = 16;
2412 let NumMicroOps = 2;
2413 let ResourceCycles = [1,1];
2414}
2415def: InstRW<[HWWriteResGroup91_1], (instregex "(V?)SQRTSSm")>;
2416
2417def HWWriteResGroup91_4 : SchedWriteRes<[HWPort0,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002418 let Latency = 18;
2419 let NumMicroOps = 2;
2420 let ResourceCycles = [1,1];
2421}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00002422def: InstRW<[HWWriteResGroup91_4], (instregex "(V?)DIVSSrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00002423
2424def HWWriteResGroup91_2 : SchedWriteRes<[HWPort0,HWPort23]> {
2425 let Latency = 11;
2426 let NumMicroOps = 2;
2427 let ResourceCycles = [1,1];
2428}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002429def: InstRW<[HWWriteResGroup91_2], (instregex "(V?)PCMPGTQrm",
2430 "(V?)PHMINPOSUWrm",
2431 "(V?)PMADDUBSWrm",
2432 "(V?)PMADDWDrm",
2433 "(V?)PMULDQrm",
2434 "(V?)PMULHRSWrm",
2435 "(V?)PMULHUWrm",
2436 "(V?)PMULHWrm",
2437 "(V?)PMULLWrm",
2438 "(V?)PMULUDQrm",
2439 "(V?)PSADBWrm",
2440 "(V?)RCPPSm",
2441 "(V?)RSQRTPSm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00002442
2443def HWWriteResGroup91_3 : SchedWriteRes<[HWPort0,HWPort23]> {
2444 let Latency = 12;
2445 let NumMicroOps = 2;
2446 let ResourceCycles = [1,1];
2447}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002448def: InstRW<[HWWriteResGroup91_3], (instregex "MUL_F32m",
2449 "MUL_F64m",
2450 "VPCMPGTQYrm",
2451 "VPMADDUBSWYrm",
2452 "VPMADDWDYrm",
2453 "VPMULDQYrm",
2454 "VPMULHRSWYrm",
2455 "VPMULHUWYrm",
2456 "VPMULHWYrm",
2457 "VPMULLWYrm",
2458 "VPMULUDQYrm",
2459 "VPSADBWYrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00002460
Gadi Haberd76f7b82017-08-28 10:04:16 +00002461def HWWriteResGroup92 : SchedWriteRes<[HWPort01,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002462 let Latency = 11;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002463 let NumMicroOps = 2;
2464 let ResourceCycles = [1,1];
2465}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002466def: InstRW<[HWWriteResGroup92], (instregex "(V?)MULPDrm",
2467 "(V?)MULPSrm",
2468 "VF(N)?M(ADD|SUB|ADDSUB|SUBADD)(132|213|231)P(D|S)m")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00002469
2470def HWWriteResGroup92_1 : SchedWriteRes<[HWPort01,HWPort23]> {
2471 let Latency = 12;
2472 let NumMicroOps = 2;
2473 let ResourceCycles = [1,1];
2474}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002475def: InstRW<[HWWriteResGroup92_1], (instregex "VMULPDYrm",
2476 "VMULPSYrm",
2477 "VF(N)?M(ADD|SUB|ADDSUB|SUBADD)(132|213|231)P(D|S)Ym")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00002478
2479def HWWriteResGroup92_2 : SchedWriteRes<[HWPort01,HWPort23]> {
2480 let Latency = 10;
2481 let NumMicroOps = 2;
2482 let ResourceCycles = [1,1];
2483}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002484def: InstRW<[HWWriteResGroup92_2], (instregex "(V?)MULSDrm",
2485 "(V?)MULSSrm",
2486 "VF(N)?M(ADD|SUB)(132|213|231)S(D|S)m")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002487
2488def HWWriteResGroup93 : SchedWriteRes<[HWPort1,HWPort5]> {
2489 let Latency = 5;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002490 let NumMicroOps = 3;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002491 let ResourceCycles = [1,2];
Michael Zuckermanf6684002017-06-28 11:23:31 +00002492}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002493def: InstRW<[HWWriteResGroup93], (instregex "(V?)CVTSI642SSrr",
2494 "(V?)HADDPD(Y?)rr",
2495 "(V?)HADDPS(Y?)rr",
2496 "(V?)HSUBPD(Y?)rr",
2497 "(V?)HSUBPS(Y?)rr")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002498
Gadi Haberd76f7b82017-08-28 10:04:16 +00002499def HWWriteResGroup94 : SchedWriteRes<[HWPort1,HWPort6,HWPort06]> {
2500 let Latency = 5;
2501 let NumMicroOps = 3;
2502 let ResourceCycles = [1,1,1];
2503}
2504def: InstRW<[HWWriteResGroup94], (instregex "STR(16|32|64)r")>;
2505
2506def HWWriteResGroup95 : SchedWriteRes<[HWPort1,HWPort06,HWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00002507 let Latency = 4;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002508 let NumMicroOps = 3;
2509 let ResourceCycles = [1,1,1];
2510}
Craig Topper4a3be6e2018-03-22 19:22:51 +00002511def: InstRW<[HWWriteResGroup95], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002512
2513def HWWriteResGroup96 : SchedWriteRes<[HWPort1,HWPort5,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002514 let Latency = 11;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002515 let NumMicroOps = 4;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002516 let ResourceCycles = [1,2,1];
Michael Zuckermanf6684002017-06-28 11:23:31 +00002517}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002518def: InstRW<[HWWriteResGroup96], (instregex "(V?)HADDPDrm",
2519 "(V?)HADDPSrm",
2520 "(V?)HSUBPDrm",
2521 "(V?)HSUBPSrm")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002522
Gadi Haber2cf601f2017-12-08 09:48:44 +00002523def HWWriteResGroup96_1 : SchedWriteRes<[HWPort1,HWPort5,HWPort23]> {
2524 let Latency = 12;
2525 let NumMicroOps = 4;
2526 let ResourceCycles = [1,2,1];
2527}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002528def: InstRW<[HWWriteResGroup96_1], (instregex "VHADDPDYrm",
2529 "VHADDPSYrm",
2530 "VHSUBPDYrm",
2531 "VHSUBPSYrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00002532
Gadi Haberd76f7b82017-08-28 10:04:16 +00002533def HWWriteResGroup97 : SchedWriteRes<[HWPort0,HWPort1,HWPort5,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002534 let Latency = 10;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002535 let NumMicroOps = 4;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002536 let ResourceCycles = [1,1,1,1];
Michael Zuckermanf6684002017-06-28 11:23:31 +00002537}
Gadi Haberd76f7b82017-08-28 10:04:16 +00002538def: InstRW<[HWWriteResGroup97], (instregex "CVTTSS2SI64rm")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002539
Gadi Haberd76f7b82017-08-28 10:04:16 +00002540def HWWriteResGroup98 : SchedWriteRes<[HWPort1,HWPort23,HWPort06,HWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00002541 let Latency = 9;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002542 let NumMicroOps = 4;
2543 let ResourceCycles = [1,1,1,1];
Michael Zuckermanf6684002017-06-28 11:23:31 +00002544}
Craig Topper4a3be6e2018-03-22 19:22:51 +00002545def: InstRW<[HWWriteResGroup98], (instrs IMUL32m, MUL32m, MULX32rm)>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002546
Gadi Haberd76f7b82017-08-28 10:04:16 +00002547def HWWriteResGroup99 : SchedWriteRes<[HWPort6,HWPort0156]> {
2548 let Latency = 5;
2549 let NumMicroOps = 5;
2550 let ResourceCycles = [1,4];
2551}
2552def: InstRW<[HWWriteResGroup99], (instregex "PAUSE")>;
2553
2554def HWWriteResGroup100 : SchedWriteRes<[HWPort06,HWPort0156]> {
2555 let Latency = 5;
2556 let NumMicroOps = 5;
2557 let ResourceCycles = [1,4];
2558}
2559def: InstRW<[HWWriteResGroup100], (instregex "XSETBV")>;
2560
2561def HWWriteResGroup101 : SchedWriteRes<[HWPort06,HWPort0156]> {
2562 let Latency = 5;
2563 let NumMicroOps = 5;
2564 let ResourceCycles = [2,3];
2565}
Craig Topper13a16502018-03-19 00:56:09 +00002566def: InstRW<[HWWriteResGroup101], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002567
2568def HWWriteResGroup102 : SchedWriteRes<[HWPort1,HWPort5]> {
2569 let Latency = 6;
2570 let NumMicroOps = 2;
2571 let ResourceCycles = [1,1];
2572}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002573def: InstRW<[HWWriteResGroup102], (instregex "VCVTDQ2PDYrr",
2574 "VCVTPD2DQYrr",
2575 "VCVTPD2PSYrr",
2576 "VCVTPS2PHYrr",
2577 "VCVTTPD2DQYrr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002578
2579def HWWriteResGroup103 : SchedWriteRes<[HWPort1,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002580 let Latency = 13;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002581 let NumMicroOps = 3;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002582 let ResourceCycles = [2,1];
Michael Zuckermanf6684002017-06-28 11:23:31 +00002583}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002584def: InstRW<[HWWriteResGroup103], (instregex "ADD_FI16m",
2585 "ADD_FI32m",
2586 "SUBR_FI16m",
2587 "SUBR_FI32m",
2588 "SUB_FI16m",
2589 "SUB_FI32m",
Craig Topper40d3b322018-03-22 21:55:20 +00002590 "VROUNDPDYm",
2591 "VROUNDPSYm")>;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002592
Gadi Haber2cf601f2017-12-08 09:48:44 +00002593def HWWriteResGroup103_1 : SchedWriteRes<[HWPort1,HWPort23]> {
2594 let Latency = 12;
2595 let NumMicroOps = 3;
2596 let ResourceCycles = [2,1];
2597}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002598def: InstRW<[HWWriteResGroup103_1], (instregex "(V?)ROUNDPDm",
2599 "(V?)ROUNDPSm",
2600 "(V?)ROUNDSDm",
2601 "(V?)ROUNDSSm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00002602
Gadi Haberd76f7b82017-08-28 10:04:16 +00002603def HWWriteResGroup104 : SchedWriteRes<[HWPort1,HWPort5,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002604 let Latency = 12;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002605 let NumMicroOps = 3;
2606 let ResourceCycles = [1,1,1];
2607}
2608def: InstRW<[HWWriteResGroup104], (instregex "VCVTDQ2PDYrm")>;
2609
2610def HWWriteResGroup105 : SchedWriteRes<[HWPort1,HWPort06,HWPort0156]> {
2611 let Latency = 6;
2612 let NumMicroOps = 4;
2613 let ResourceCycles = [1,1,2];
2614}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002615def: InstRW<[HWWriteResGroup105], (instregex "SHLD(16|32|64)rrCL",
2616 "SHRD(16|32|64)rrCL")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002617
2618def HWWriteResGroup106 : SchedWriteRes<[HWPort1,HWPort4,HWPort5,HWPort237]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002619 let Latency = 7;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002620 let NumMicroOps = 4;
2621 let ResourceCycles = [1,1,1,1];
2622}
2623def: InstRW<[HWWriteResGroup106], (instregex "VCVTPS2PHYmr")>;
2624
2625def HWWriteResGroup107 : SchedWriteRes<[HWPort1,HWPort6,HWPort06,HWPort0156]> {
2626 let Latency = 6;
2627 let NumMicroOps = 4;
2628 let ResourceCycles = [1,1,1,1];
2629}
2630def: InstRW<[HWWriteResGroup107], (instregex "SLDT(16|32|64)r")>;
2631
2632def HWWriteResGroup108 : SchedWriteRes<[HWPort6,HWPort0156]> {
2633 let Latency = 6;
2634 let NumMicroOps = 6;
2635 let ResourceCycles = [1,5];
2636}
2637def: InstRW<[HWWriteResGroup108], (instregex "STD")>;
2638
2639def HWWriteResGroup109 : SchedWriteRes<[HWPort1,HWPort23,HWPort237,HWPort06,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002640 let Latency = 12;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002641 let NumMicroOps = 6;
2642 let ResourceCycles = [1,1,1,1,2];
2643}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002644def: InstRW<[HWWriteResGroup109], (instregex "SHLD(16|32|64)mrCL",
2645 "SHRD(16|32|64)mrCL")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002646
Gadi Haberd76f7b82017-08-28 10:04:16 +00002647def HWWriteResGroup112 : SchedWriteRes<[HWPort0,HWPort5]> {
2648 let Latency = 7;
2649 let NumMicroOps = 3;
2650 let ResourceCycles = [1,2];
2651}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002652def: InstRW<[HWWriteResGroup112], (instregex "(V?)MPSADBW(Y?)rri")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002653
2654def HWWriteResGroup113 : SchedWriteRes<[HWPort0,HWPort5,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002655 let Latency = 13;
Michael Zuckermanf6684002017-06-28 11:23:31 +00002656 let NumMicroOps = 4;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002657 let ResourceCycles = [1,2,1];
Michael Zuckermanf6684002017-06-28 11:23:31 +00002658}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002659def: InstRW<[HWWriteResGroup113], (instregex "(V?)MPSADBWrmi")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002660
Gadi Haber2cf601f2017-12-08 09:48:44 +00002661def HWWriteResGroup113_1 : SchedWriteRes<[HWPort0,HWPort5,HWPort23]> {
2662 let Latency = 14;
2663 let NumMicroOps = 4;
2664 let ResourceCycles = [1,2,1];
2665}
2666def: InstRW<[HWWriteResGroup113_1], (instregex "VMPSADBWYrmi")>;
2667
Gadi Haberd76f7b82017-08-28 10:04:16 +00002668def HWWriteResGroup114 : SchedWriteRes<[HWPort6,HWPort06,HWPort15,HWPort0156]> {
2669 let Latency = 7;
2670 let NumMicroOps = 7;
2671 let ResourceCycles = [2,2,1,2];
2672}
Craig Topper2d451e72018-03-18 08:38:06 +00002673def: InstRW<[HWWriteResGroup114], (instrs LOOP)>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002674
2675def HWWriteResGroup115 : SchedWriteRes<[HWPort0,HWPort1,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002676 let Latency = 15;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002677 let NumMicroOps = 3;
2678 let ResourceCycles = [1,1,1];
2679}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002680def: InstRW<[HWWriteResGroup115], (instregex "MUL_FI16m",
2681 "MUL_FI32m")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002682
2683def HWWriteResGroup116 : SchedWriteRes<[HWPort0,HWPort1,HWPort5]> {
2684 let Latency = 9;
2685 let NumMicroOps = 3;
2686 let ResourceCycles = [1,1,1];
2687}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002688def: InstRW<[HWWriteResGroup116], (instregex "(V?)DPPDrri")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002689
2690def HWWriteResGroup117 : SchedWriteRes<[HWPort0,HWPort1,HWPort5,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002691 let Latency = 15;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002692 let NumMicroOps = 4;
2693 let ResourceCycles = [1,1,1,1];
2694}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002695def: InstRW<[HWWriteResGroup117], (instregex "(V?)DPPDrmi")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002696
2697def HWWriteResGroup118 : SchedWriteRes<[HWPort0]> {
2698 let Latency = 10;
2699 let NumMicroOps = 2;
2700 let ResourceCycles = [2];
2701}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002702def: InstRW<[HWWriteResGroup118], (instregex "(V?)PMULLD(Y?)rr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002703
2704def HWWriteResGroup119 : SchedWriteRes<[HWPort0,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002705 let Latency = 16;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002706 let NumMicroOps = 3;
2707 let ResourceCycles = [2,1];
2708}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002709def: InstRW<[HWWriteResGroup119], (instregex "(V?)PMULLDrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002710
Gadi Haber2cf601f2017-12-08 09:48:44 +00002711def HWWriteResGroup119_1 : SchedWriteRes<[HWPort0,HWPort23]> {
2712 let Latency = 17;
2713 let NumMicroOps = 3;
2714 let ResourceCycles = [2,1];
2715}
2716def: InstRW<[HWWriteResGroup119_1], (instregex "VPMULLDYrm")>;
2717
Gadi Haberd76f7b82017-08-28 10:04:16 +00002718def HWWriteResGroup120 : SchedWriteRes<[HWPort1,HWPort23,HWPort237,HWPort06,HWPort15,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002719 let Latency = 16;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002720 let NumMicroOps = 10;
2721 let ResourceCycles = [1,1,1,4,1,2];
2722}
Craig Topper13a16502018-03-19 00:56:09 +00002723def: InstRW<[HWWriteResGroup120], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002724
2725def HWWriteResGroup121 : SchedWriteRes<[HWPort0]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00002726 let Latency = 13;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002727 let NumMicroOps = 1;
2728 let ResourceCycles = [1];
2729}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00002730def: InstRW<[HWWriteResGroup121], (instregex "(V?)DIVPSrr",
2731 "(V?)DIVSSrr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002732
Gadi Haberd76f7b82017-08-28 10:04:16 +00002733def HWWriteResGroup125 : SchedWriteRes<[HWPort0,HWPort015]> {
2734 let Latency = 11;
2735 let NumMicroOps = 3;
2736 let ResourceCycles = [2,1];
2737}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002738def: InstRW<[HWWriteResGroup125], (instregex "VRCPPSYr",
2739 "VRSQRTPSYr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002740
Gadi Haberd76f7b82017-08-28 10:04:16 +00002741def HWWriteResGroup128 : SchedWriteRes<[HWPort0,HWPort23,HWPort015]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002742 let Latency = 18;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002743 let NumMicroOps = 4;
2744 let ResourceCycles = [2,1,1];
2745}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002746def: InstRW<[HWWriteResGroup128], (instregex "VRCPPSYm",
2747 "VRSQRTPSYm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002748
2749def HWWriteResGroup129 : SchedWriteRes<[HWPort1,HWPort06,HWPort0156]> {
2750 let Latency = 11;
2751 let NumMicroOps = 7;
2752 let ResourceCycles = [2,2,3];
2753}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002754def: InstRW<[HWWriteResGroup129], (instregex "RCL(16|32|64)rCL",
2755 "RCR(16|32|64)rCL")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002756
2757def HWWriteResGroup130 : SchedWriteRes<[HWPort1,HWPort06,HWPort15,HWPort0156]> {
2758 let Latency = 11;
2759 let NumMicroOps = 9;
2760 let ResourceCycles = [1,4,1,3];
2761}
2762def: InstRW<[HWWriteResGroup130], (instregex "RCL8rCL")>;
2763
2764def HWWriteResGroup131 : SchedWriteRes<[HWPort06,HWPort0156]> {
2765 let Latency = 11;
2766 let NumMicroOps = 11;
2767 let ResourceCycles = [2,9];
2768}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002769def: InstRW<[HWWriteResGroup131], (instrs LOOPE, LOOPNE)>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002770
2771def HWWriteResGroup132 : SchedWriteRes<[HWPort4,HWPort23,HWPort237,HWPort06,HWPort15,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002772 let Latency = 17;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002773 let NumMicroOps = 14;
2774 let ResourceCycles = [1,1,1,4,2,5];
2775}
2776def: InstRW<[HWWriteResGroup132], (instregex "CMPXCHG8B")>;
2777
2778def HWWriteResGroup133 : SchedWriteRes<[HWPort0]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00002779 let Latency = 11;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002780 let NumMicroOps = 1;
2781 let ResourceCycles = [1];
2782}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00002783def: InstRW<[HWWriteResGroup133], (instregex "(V?)SQRTPSr",
2784 "(V?)SQRTSSr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002785
2786def HWWriteResGroup134 : SchedWriteRes<[HWPort0,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002787 let Latency = 19;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002788 let NumMicroOps = 2;
2789 let ResourceCycles = [1,1];
2790}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00002791def: InstRW<[HWWriteResGroup134], (instregex "(V?)DIVPSrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002792
2793def HWWriteResGroup135 : SchedWriteRes<[HWPort1,HWPort23,HWPort237,HWPort06,HWPort15,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002794 let Latency = 19;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002795 let NumMicroOps = 11;
2796 let ResourceCycles = [2,1,1,3,1,3];
2797}
Craig Topper13a16502018-03-19 00:56:09 +00002798def: InstRW<[HWWriteResGroup135], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002799
Gadi Haberd76f7b82017-08-28 10:04:16 +00002800def HWWriteResGroup138 : SchedWriteRes<[HWPort0,HWPort23]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00002801 let Latency = 17;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002802 let NumMicroOps = 2;
2803 let ResourceCycles = [1,1];
2804}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00002805def: InstRW<[HWWriteResGroup138], (instregex "(V?)SQRTPSm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002806
Gadi Haberd76f7b82017-08-28 10:04:16 +00002807def HWWriteResGroup140 : SchedWriteRes<[HWPort0,HWPort1,HWPort5]> {
2808 let Latency = 14;
2809 let NumMicroOps = 4;
2810 let ResourceCycles = [2,1,1];
2811}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002812def: InstRW<[HWWriteResGroup140], (instregex "(V?)DPPS(Y?)rri")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002813
2814def HWWriteResGroup141 : SchedWriteRes<[HWPort0,HWPort1,HWPort5,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002815 let Latency = 20;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002816 let NumMicroOps = 5;
2817 let ResourceCycles = [2,1,1,1];
2818}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002819def: InstRW<[HWWriteResGroup141], (instregex "(V?)DPPSrmi")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002820
Gadi Haber2cf601f2017-12-08 09:48:44 +00002821def HWWriteResGroup141_1 : SchedWriteRes<[HWPort0,HWPort1,HWPort5,HWPort23]> {
2822 let Latency = 21;
2823 let NumMicroOps = 5;
2824 let ResourceCycles = [2,1,1,1];
2825}
2826def: InstRW<[HWWriteResGroup141_1], (instregex "VDPPSYrmi")>;
2827
Gadi Haberd76f7b82017-08-28 10:04:16 +00002828def HWWriteResGroup142 : SchedWriteRes<[HWPort1,HWPort06,HWPort15,HWPort0156]> {
2829 let Latency = 14;
2830 let NumMicroOps = 10;
2831 let ResourceCycles = [2,3,1,4];
2832}
2833def: InstRW<[HWWriteResGroup142], (instregex "RCR8rCL")>;
2834
2835def HWWriteResGroup143 : SchedWriteRes<[HWPort23,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002836 let Latency = 19;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002837 let NumMicroOps = 15;
2838 let ResourceCycles = [1,14];
2839}
2840def: InstRW<[HWWriteResGroup143], (instregex "POPF16")>;
2841
2842def HWWriteResGroup144 : SchedWriteRes<[HWPort4,HWPort5,HWPort6,HWPort23,HWPort237,HWPort06,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002843 let Latency = 21;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002844 let NumMicroOps = 8;
2845 let ResourceCycles = [1,1,1,1,1,1,2];
2846}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002847def: InstRW<[HWWriteResGroup144], (instregex "INSB",
2848 "INSL",
2849 "INSW")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002850
2851def HWWriteResGroup145 : SchedWriteRes<[HWPort5]> {
2852 let Latency = 16;
2853 let NumMicroOps = 16;
2854 let ResourceCycles = [16];
2855}
2856def: InstRW<[HWWriteResGroup145], (instregex "VZEROALL")>;
2857
2858def HWWriteResGroup146 : SchedWriteRes<[HWPort0,HWPort4,HWPort5,HWPort23,HWPort237,HWPort06,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002859 let Latency = 22;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002860 let NumMicroOps = 19;
2861 let ResourceCycles = [2,1,4,1,1,4,6];
2862}
2863def: InstRW<[HWWriteResGroup146], (instregex "CMPXCHG16B")>;
2864
2865def HWWriteResGroup147 : SchedWriteRes<[HWPort0,HWPort1,HWPort5,HWPort6,HWPort01,HWPort0156]> {
2866 let Latency = 17;
2867 let NumMicroOps = 15;
2868 let ResourceCycles = [2,1,2,4,2,4];
2869}
2870def: InstRW<[HWWriteResGroup147], (instregex "XCH_F")>;
2871
Gadi Haberd76f7b82017-08-28 10:04:16 +00002872def HWWriteResGroup149 : SchedWriteRes<[HWPort5,HWPort6,HWPort06,HWPort0156]> {
2873 let Latency = 18;
2874 let NumMicroOps = 8;
2875 let ResourceCycles = [1,1,1,5];
2876}
2877def: InstRW<[HWWriteResGroup149], (instregex "CPUID")>;
Craig Topper2d451e72018-03-18 08:38:06 +00002878def: InstRW<[HWWriteResGroup149], (instrs RDTSC)>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002879
Gadi Haberd76f7b82017-08-28 10:04:16 +00002880def HWWriteResGroup151 : SchedWriteRes<[HWPort6,HWPort23,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002881 let Latency = 23;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002882 let NumMicroOps = 19;
2883 let ResourceCycles = [3,1,15];
2884}
Craig Topper391c6f92017-12-10 01:24:08 +00002885def: InstRW<[HWWriteResGroup151], (instregex "XRSTOR(64)?")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002886
Gadi Haberd76f7b82017-08-28 10:04:16 +00002887def HWWriteResGroup154 : SchedWriteRes<[HWPort0]> {
2888 let Latency = 20;
2889 let NumMicroOps = 1;
2890 let ResourceCycles = [1];
2891}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002892def: InstRW<[HWWriteResGroup154], (instregex "DIV_FPrST0",
2893 "DIV_FST0r",
2894 "DIV_FrST0",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00002895 "(V?)DIVPDrr",
2896 "(V?)DIVSDrr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002897
2898def HWWriteResGroup155 : SchedWriteRes<[HWPort0,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002899 let Latency = 27;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002900 let NumMicroOps = 2;
2901 let ResourceCycles = [1,1];
2902}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002903def: InstRW<[HWWriteResGroup155], (instregex "DIVR_F32m",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00002904 "DIVR_F64m")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00002905
2906def HWWriteResGroup155_1 : SchedWriteRes<[HWPort0,HWPort23]> {
2907 let Latency = 26;
2908 let NumMicroOps = 2;
2909 let ResourceCycles = [1,1];
2910}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00002911def: InstRW<[HWWriteResGroup155_1], (instregex "(V?)DIVPDrm")>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00002912
2913def HWWriteResGroup155_2 : SchedWriteRes<[HWPort0,HWPort23]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00002914 let Latency = 21;
2915 let NumMicroOps = 2;
2916 let ResourceCycles = [1,1];
2917}
2918def: InstRW<[HWWriteResGroup155_2], (instregex "(V?)SQRTSDm")>;
2919
2920def HWWriteResGroup155_3 : SchedWriteRes<[HWPort0,HWPort23]> {
2921 let Latency = 22;
2922 let NumMicroOps = 2;
2923 let ResourceCycles = [1,1];
2924}
2925def: InstRW<[HWWriteResGroup155_3], (instregex "(V?)SQRTPDm")>;
2926
2927def HWWriteResGroup155_4 : SchedWriteRes<[HWPort0,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002928 let Latency = 25;
2929 let NumMicroOps = 2;
2930 let ResourceCycles = [1,1];
2931}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00002932def: InstRW<[HWWriteResGroup155_4], (instregex "(V?)DIVSDrm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002933
2934def HWWriteResGroup156 : SchedWriteRes<[HWPort5,HWPort6,HWPort0156]> {
2935 let Latency = 20;
2936 let NumMicroOps = 10;
2937 let ResourceCycles = [1,2,7];
2938}
2939def: InstRW<[HWWriteResGroup156], (instregex "MWAITrr")>;
2940
2941def HWWriteResGroup157 : SchedWriteRes<[HWPort0]> {
Craig Toppercdfcf8e2018-03-26 05:05:10 +00002942 let Latency = 16;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002943 let NumMicroOps = 1;
2944 let ResourceCycles = [1];
2945}
Craig Toppercdfcf8e2018-03-26 05:05:10 +00002946def: InstRW<[HWWriteResGroup157], (instregex "(V?)SQRTPDr",
2947 "(V?)SQRTSDr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002948
Gadi Haberd76f7b82017-08-28 10:04:16 +00002949def HWWriteResGroup159 : SchedWriteRes<[HWPort0,HWPort015]> {
2950 let Latency = 21;
2951 let NumMicroOps = 3;
2952 let ResourceCycles = [2,1];
2953}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002954def: InstRW<[HWWriteResGroup159], (instregex "VDIVPSYrr",
2955 "VSQRTPSYr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002956
2957def HWWriteResGroup160 : SchedWriteRes<[HWPort0,HWPort23,HWPort015]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002958 let Latency = 28;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002959 let NumMicroOps = 4;
2960 let ResourceCycles = [2,1,1];
2961}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002962def: InstRW<[HWWriteResGroup160], (instregex "VDIVPSYrm",
2963 "VSQRTPSYm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002964
2965def HWWriteResGroup161 : SchedWriteRes<[HWPort0,HWPort1,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002966 let Latency = 30;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002967 let NumMicroOps = 3;
2968 let ResourceCycles = [1,1,1];
2969}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002970def: InstRW<[HWWriteResGroup161], (instregex "DIVR_FI16m",
2971 "DIVR_FI32m")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002972
2973def HWWriteResGroup162 : SchedWriteRes<[HWPort0]> {
2974 let Latency = 24;
2975 let NumMicroOps = 1;
2976 let ResourceCycles = [1];
2977}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002978def: InstRW<[HWWriteResGroup162], (instregex "DIVR_FPrST0",
2979 "DIVR_FST0r",
2980 "DIVR_FrST0")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002981
2982def HWWriteResGroup163 : SchedWriteRes<[HWPort0,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002983 let Latency = 31;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002984 let NumMicroOps = 2;
2985 let ResourceCycles = [1,1];
2986}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00002987def: InstRW<[HWWriteResGroup163], (instregex "DIV_F32m",
2988 "DIV_F64m")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002989
2990def HWWriteResGroup164 : SchedWriteRes<[HWPort4,HWPort6,HWPort23,HWPort237,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002991 let Latency = 30;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002992 let NumMicroOps = 27;
2993 let ResourceCycles = [1,5,1,1,19];
2994}
2995def: InstRW<[HWWriteResGroup164], (instregex "XSAVE64")>;
2996
2997def HWWriteResGroup165 : SchedWriteRes<[HWPort4,HWPort6,HWPort23,HWPort237,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00002998 let Latency = 31;
Gadi Haberd76f7b82017-08-28 10:04:16 +00002999 let NumMicroOps = 28;
3000 let ResourceCycles = [1,6,1,1,19];
3001}
Craig Topper2d451e72018-03-18 08:38:06 +00003002def: InstRW<[HWWriteResGroup165], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003003
3004def HWWriteResGroup166 : SchedWriteRes<[HWPort0,HWPort1,HWPort23]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00003005 let Latency = 34;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003006 let NumMicroOps = 3;
3007 let ResourceCycles = [1,1,1];
3008}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00003009def: InstRW<[HWWriteResGroup166], (instregex "DIV_FI16m",
3010 "DIV_FI32m")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003011
Gadi Haberd76f7b82017-08-28 10:04:16 +00003012def HWWriteResGroup170 : SchedWriteRes<[HWPort5,HWPort6,HWPort23,HWPort06,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00003013 let Latency = 35;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003014 let NumMicroOps = 23;
3015 let ResourceCycles = [1,5,3,4,10];
3016}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00003017def: InstRW<[HWWriteResGroup170], (instregex "IN(8|16|32)ri",
3018 "IN(8|16|32)rr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003019
3020def HWWriteResGroup171 : SchedWriteRes<[HWPort5,HWPort6,HWPort23,HWPort237,HWPort06,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00003021 let Latency = 36;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003022 let NumMicroOps = 23;
3023 let ResourceCycles = [1,5,2,1,4,10];
3024}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00003025def: InstRW<[HWWriteResGroup171], (instregex "OUT(8|16|32)ir",
3026 "OUT(8|16|32)rr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003027
3028def HWWriteResGroup172 : SchedWriteRes<[HWPort01,HWPort15,HWPort015,HWPort0156]> {
3029 let Latency = 31;
3030 let NumMicroOps = 31;
3031 let ResourceCycles = [8,1,21,1];
3032}
3033def: InstRW<[HWWriteResGroup172], (instregex "MMX_EMMS")>;
3034
3035def HWWriteResGroup173 : SchedWriteRes<[HWPort0,HWPort015]> {
3036 let Latency = 35;
3037 let NumMicroOps = 3;
3038 let ResourceCycles = [2,1];
3039}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00003040def: InstRW<[HWWriteResGroup173], (instregex "VDIVPDYrr",
3041 "VSQRTPDYr")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003042
3043def HWWriteResGroup174 : SchedWriteRes<[HWPort0,HWPort23,HWPort015]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00003044 let Latency = 42;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003045 let NumMicroOps = 4;
3046 let ResourceCycles = [2,1,1];
3047}
Simon Pilgrimec2f8782018-03-21 16:19:03 +00003048def: InstRW<[HWWriteResGroup174], (instregex "VDIVPDYrm",
3049 "VSQRTPDYm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003050
3051def HWWriteResGroup175 : SchedWriteRes<[HWPort1,HWPort4,HWPort5,HWPort6,HWPort23,HWPort237,HWPort15,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00003052 let Latency = 41;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003053 let NumMicroOps = 18;
3054 let ResourceCycles = [1,1,2,3,1,1,1,8];
3055}
3056def: InstRW<[HWWriteResGroup175], (instregex "VMCLEARm")>;
3057
3058def HWWriteResGroup176 : SchedWriteRes<[HWPort5,HWPort0156]> {
3059 let Latency = 42;
3060 let NumMicroOps = 22;
3061 let ResourceCycles = [2,20];
3062}
Craig Topper2d451e72018-03-18 08:38:06 +00003063def: InstRW<[HWWriteResGroup176], (instrs RDTSCP)>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003064
3065def HWWriteResGroup177 : SchedWriteRes<[HWPort0,HWPort01,HWPort23,HWPort05,HWPort06,HWPort015,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00003066 let Latency = 61;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003067 let NumMicroOps = 64;
3068 let ResourceCycles = [2,2,8,1,10,2,39];
3069}
3070def: InstRW<[HWWriteResGroup177], (instregex "FLDENVm")>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003071
3072def HWWriteResGroup178 : SchedWriteRes<[HWPort0,HWPort6,HWPort23,HWPort05,HWPort06,HWPort15,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00003073 let Latency = 64;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003074 let NumMicroOps = 88;
3075 let ResourceCycles = [4,4,31,1,2,1,45];
3076}
Craig Topper2d451e72018-03-18 08:38:06 +00003077def: InstRW<[HWWriteResGroup178], (instrs FXRSTOR64)>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003078
3079def HWWriteResGroup179 : SchedWriteRes<[HWPort0,HWPort6,HWPort23,HWPort05,HWPort06,HWPort15,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00003080 let Latency = 64;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003081 let NumMicroOps = 90;
3082 let ResourceCycles = [4,2,33,1,2,1,47];
3083}
Craig Topper2d451e72018-03-18 08:38:06 +00003084def: InstRW<[HWWriteResGroup179], (instrs FXRSTOR)>;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003085
3086def HWWriteResGroup180 : SchedWriteRes<[HWPort5,HWPort01,HWPort0156]> {
3087 let Latency = 75;
3088 let NumMicroOps = 15;
3089 let ResourceCycles = [6,3,6];
3090}
3091def: InstRW<[HWWriteResGroup180], (instregex "FNINIT")>;
3092
3093def HWWriteResGroup181 : SchedWriteRes<[HWPort0,HWPort1,HWPort5,HWPort6,HWPort01,HWPort0156]> {
3094 let Latency = 98;
3095 let NumMicroOps = 32;
3096 let ResourceCycles = [7,7,3,3,1,11];
3097}
3098def: InstRW<[HWWriteResGroup181], (instregex "DIV(16|32|64)r")>;
3099
3100def HWWriteResGroup182 : SchedWriteRes<[HWPort0,HWPort1,HWPort5,HWPort6,HWPort06,HWPort0156]> {
3101 let Latency = 112;
3102 let NumMicroOps = 66;
3103 let ResourceCycles = [4,2,4,8,14,34];
3104}
3105def: InstRW<[HWWriteResGroup182], (instregex "IDIV(16|32|64)r")>;
3106
3107def HWWriteResGroup183 : SchedWriteRes<[HWPort0,HWPort1,HWPort4,HWPort5,HWPort6,HWPort237,HWPort06,HWPort0156]> {
Gadi Haber2cf601f2017-12-08 09:48:44 +00003108 let Latency = 115;
Gadi Haberd76f7b82017-08-28 10:04:16 +00003109 let NumMicroOps = 100;
3110 let ResourceCycles = [9,9,11,8,1,11,21,30];
3111}
3112def: InstRW<[HWWriteResGroup183], (instregex "FSTENVm")>;
Quentin Colombet95e05312014-08-18 17:55:59 +00003113
Gadi Haber2cf601f2017-12-08 09:48:44 +00003114def HWWriteResGroup184 : SchedWriteRes<[HWPort0, HWPort5, HWPort15, HWPort015, HWPort06, HWPort23]> {
3115 let Latency = 26;
3116 let NumMicroOps = 12;
3117 let ResourceCycles = [2,2,1,3,2,2];
3118}
Craig Topper17a31182017-12-16 18:35:29 +00003119def: InstRW<[HWWriteResGroup184], (instrs VGATHERDPDrm,
3120 VPGATHERDQrm,
3121 VPGATHERDDrm)>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00003122
3123def HWWriteResGroup185 : SchedWriteRes<[HWPort0, HWPort5, HWPort06, HWPort15, HWPort015, HWPort23]> {
3124 let Latency = 24;
3125 let NumMicroOps = 22;
3126 let ResourceCycles = [5,3,4,1,5,4];
3127}
Craig Topper17a31182017-12-16 18:35:29 +00003128def: InstRW<[HWWriteResGroup185], (instrs VGATHERQPDYrm,
3129 VPGATHERQQYrm)>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00003130
3131def HWWriteResGroup186 : SchedWriteRes<[HWPort0, HWPort5, HWPort06, HWPort15, HWPort015, HWPort23]> {
3132 let Latency = 28;
3133 let NumMicroOps = 22;
3134 let ResourceCycles = [5,3,4,1,5,4];
3135}
Craig Topper17a31182017-12-16 18:35:29 +00003136def: InstRW<[HWWriteResGroup186], (instrs VPGATHERQDYrm)>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00003137
3138def HWWriteResGroup187 : SchedWriteRes<[HWPort0, HWPort5, HWPort06, HWPort15, HWPort015, HWPort23]> {
3139 let Latency = 25;
3140 let NumMicroOps = 22;
3141 let ResourceCycles = [5,3,4,1,5,4];
3142}
Craig Topper17a31182017-12-16 18:35:29 +00003143def: InstRW<[HWWriteResGroup187], (instrs VPGATHERQDrm)>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00003144
3145def HWWriteResGroup188 : SchedWriteRes<[HWPort0, HWPort5, HWPort06, HWPort15, HWPort015, HWPort23]> {
3146 let Latency = 27;
3147 let NumMicroOps = 20;
3148 let ResourceCycles = [3,3,4,1,5,4];
3149}
Craig Topper17a31182017-12-16 18:35:29 +00003150def: InstRW<[HWWriteResGroup188], (instrs VGATHERDPDYrm,
3151 VPGATHERDQYrm)>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00003152
3153def HWWriteResGroup189 : SchedWriteRes<[HWPort0, HWPort5, HWPort06, HWPort15, HWPort015, HWPort23]> {
3154 let Latency = 27;
3155 let NumMicroOps = 34;
3156 let ResourceCycles = [5,3,8,1,9,8];
3157}
Craig Topper17a31182017-12-16 18:35:29 +00003158def: InstRW<[HWWriteResGroup189], (instrs VGATHERDPSYrm,
3159 VPGATHERDDYrm)>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00003160
3161def HWWriteResGroup190 : SchedWriteRes<[HWPort0, HWPort5, HWPort06, HWPort15, HWPort015, HWPort23]> {
3162 let Latency = 23;
3163 let NumMicroOps = 14;
3164 let ResourceCycles = [3,3,2,1,3,2];
3165}
Craig Topper17a31182017-12-16 18:35:29 +00003166def: InstRW<[HWWriteResGroup190], (instrs VGATHERQPDrm,
3167 VPGATHERQQrm)>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00003168
3169def HWWriteResGroup191 : SchedWriteRes<[HWPort0, HWPort5, HWPort06, HWPort15, HWPort015, HWPort23]> {
3170 let Latency = 28;
3171 let NumMicroOps = 15;
3172 let ResourceCycles = [3,3,2,1,4,2];
3173}
Craig Topper17a31182017-12-16 18:35:29 +00003174def: InstRW<[HWWriteResGroup191], (instrs VGATHERQPSYrm)>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00003175
3176def HWWriteResGroup192 : SchedWriteRes<[HWPort0, HWPort5, HWPort06, HWPort15, HWPort015, HWPort23]> {
3177 let Latency = 25;
3178 let NumMicroOps = 15;
3179 let ResourceCycles = [3,3,2,1,4,2];
3180}
Craig Topper17a31182017-12-16 18:35:29 +00003181def: InstRW<[HWWriteResGroup192], (instrs VGATHERQPSrm,
3182 VGATHERDPSrm)>;
Gadi Haber2cf601f2017-12-08 09:48:44 +00003183
Nadav Roteme7b6a8a2013-03-28 22:34:46 +00003184} // SchedModel