blob: 2c42c4fff091f3898324ec9f34f055a12767739a [file] [log] [blame]
Gadi Haber323f2e12017-10-24 20:19:47 +00001//=- X86SchedBroadwell.td - X86 Broadwell Scheduling ---------*- tablegen -*-=//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the machine model for Broadwell to support instruction
11// scheduling and other instruction cost heuristics.
12//
13//===----------------------------------------------------------------------===//
Clement Courbet0f1da8f2018-05-02 13:54:38 +000014
Gadi Haber323f2e12017-10-24 20:19:47 +000015def BroadwellModel : SchedMachineModel {
Simon Pilgrimf7d2a932018-04-24 13:21:41 +000016 // All x86 instructions are modeled as a single micro-op, and BW can decode 4
Gadi Haber323f2e12017-10-24 20:19:47 +000017 // instructions per cycle.
18 let IssueWidth = 4;
19 let MicroOpBufferSize = 192; // Based on the reorder buffer.
20 let LoadLatency = 5;
21 let MispredictPenalty = 16;
22
23 // Based on the LSD (loop-stream detector) queue size and benchmarking data.
24 let LoopMicroOpBufferSize = 50;
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000025
Simon Pilgrimc21deec2018-03-24 19:37:28 +000026 // This flag is set to allow the scheduler to assign a default model to
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000027 // unrecognized opcodes.
28 let CompleteModel = 0;
Gadi Haber323f2e12017-10-24 20:19:47 +000029}
30
31let SchedModel = BroadwellModel in {
32
33// Broadwell can issue micro-ops to 8 different ports in one cycle.
34
35// Ports 0, 1, 5, and 6 handle all computation.
36// Port 4 gets the data half of stores. Store data can be available later than
37// the store address, but since we don't model the latency of stores, we can
38// ignore that.
39// Ports 2 and 3 are identical. They handle loads and the address half of
40// stores. Port 7 can handle address calculations.
41def BWPort0 : ProcResource<1>;
42def BWPort1 : ProcResource<1>;
43def BWPort2 : ProcResource<1>;
44def BWPort3 : ProcResource<1>;
45def BWPort4 : ProcResource<1>;
46def BWPort5 : ProcResource<1>;
47def BWPort6 : ProcResource<1>;
48def BWPort7 : ProcResource<1>;
49
50// Many micro-ops are capable of issuing on multiple ports.
51def BWPort01 : ProcResGroup<[BWPort0, BWPort1]>;
52def BWPort23 : ProcResGroup<[BWPort2, BWPort3]>;
53def BWPort237 : ProcResGroup<[BWPort2, BWPort3, BWPort7]>;
54def BWPort04 : ProcResGroup<[BWPort0, BWPort4]>;
55def BWPort05 : ProcResGroup<[BWPort0, BWPort5]>;
56def BWPort06 : ProcResGroup<[BWPort0, BWPort6]>;
57def BWPort15 : ProcResGroup<[BWPort1, BWPort5]>;
58def BWPort16 : ProcResGroup<[BWPort1, BWPort6]>;
59def BWPort56 : ProcResGroup<[BWPort5, BWPort6]>;
60def BWPort015 : ProcResGroup<[BWPort0, BWPort1, BWPort5]>;
61def BWPort056 : ProcResGroup<[BWPort0, BWPort5, BWPort6]>;
62def BWPort0156: ProcResGroup<[BWPort0, BWPort1, BWPort5, BWPort6]>;
63
64// 60 Entry Unified Scheduler
65def BWPortAny : ProcResGroup<[BWPort0, BWPort1, BWPort2, BWPort3, BWPort4,
66 BWPort5, BWPort6, BWPort7]> {
67 let BufferSize=60;
68}
69
Simon Pilgrim30c38c32018-03-19 14:46:07 +000070// Integer division issued on port 0.
Craig Topper8104f262018-04-02 05:33:28 +000071def BWDivider : ProcResource<1>;
72// FP division and sqrt on port 0.
73def BWFPDivider : ProcResource<1>;
Simon Pilgrim30c38c32018-03-19 14:46:07 +000074
Gadi Haber323f2e12017-10-24 20:19:47 +000075// Loads are 5 cycles, so ReadAfterLd registers needn't be available until 5
76// cycles after the memory operand.
77def : ReadAdvance<ReadAfterLd, 5>;
78
79// Many SchedWrites are defined in pairs with and without a folded load.
80// Instructions with folded loads are usually micro-fused, so they only appear
81// as two micro-ops when queued in the reservation station.
82// This multiclass defines the resource usage for variants with and without
83// folded loads.
84multiclass BWWriteResPair<X86FoldableSchedWrite SchedRW,
Simon Pilgrim30c38c32018-03-19 14:46:07 +000085 list<ProcResourceKind> ExePorts,
Simon Pilgrime3547af2018-03-25 10:21:19 +000086 int Lat, list<int> Res = [1], int UOps = 1,
87 int LoadLat = 5> {
Gadi Haber323f2e12017-10-24 20:19:47 +000088 // Register variant is using a single cycle on ExePort.
Simon Pilgrim30c38c32018-03-19 14:46:07 +000089 def : WriteRes<SchedRW, ExePorts> {
90 let Latency = Lat;
91 let ResourceCycles = Res;
92 let NumMicroOps = UOps;
93 }
Gadi Haber323f2e12017-10-24 20:19:47 +000094
Simon Pilgrime3547af2018-03-25 10:21:19 +000095 // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to
96 // the latency (default = 5).
Simon Pilgrim30c38c32018-03-19 14:46:07 +000097 def : WriteRes<SchedRW.Folded, !listconcat([BWPort23], ExePorts)> {
Simon Pilgrime3547af2018-03-25 10:21:19 +000098 let Latency = !add(Lat, LoadLat);
Simon Pilgrim30c38c32018-03-19 14:46:07 +000099 let ResourceCycles = !listconcat([1], Res);
Simon Pilgrime3547af2018-03-25 10:21:19 +0000100 let NumMicroOps = !add(UOps, 1);
Gadi Haber323f2e12017-10-24 20:19:47 +0000101 }
102}
103
Craig Topperf131b602018-04-06 16:16:46 +0000104// A folded store needs a cycle on port 4 for the store data, and an extra port
105// 2/3/7 cycle to recompute the address.
106def : WriteRes<WriteRMW, [BWPort237,BWPort4]>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000107
108// Arithmetic.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000109defm : BWWriteResPair<WriteALU, [BWPort0156], 1>; // Simple integer ALU op.
110defm : BWWriteResPair<WriteIMul, [BWPort1], 3>; // Integer multiplication.
Simon Pilgrim25805542018-05-08 13:51:45 +0000111
112defm : BWWriteResPair<WriteDiv8, [BWPort0, BWDivider], 25, [1, 10]>;
113defm : BWWriteResPair<WriteDiv16, [BWPort0, BWDivider], 25, [1, 10]>;
114defm : BWWriteResPair<WriteDiv32, [BWPort0, BWDivider], 25, [1, 10]>;
115defm : BWWriteResPair<WriteDiv64, [BWPort0, BWDivider], 25, [1, 10]>;
116defm : BWWriteResPair<WriteIDiv8, [BWPort0, BWDivider], 25, [1, 10]>;
117defm : BWWriteResPair<WriteIDiv16, [BWPort0, BWDivider], 25, [1, 10]>;
118defm : BWWriteResPair<WriteIDiv32, [BWPort0, BWDivider], 25, [1, 10]>;
119defm : BWWriteResPair<WriteIDiv64, [BWPort0, BWDivider], 25, [1, 10]>;
120
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000121defm : BWWriteResPair<WriteCRC32, [BWPort1], 3>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000122def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, high part.
Gadi Haber323f2e12017-10-24 20:19:47 +0000123
124def : WriteRes<WriteLEA, [BWPort15]>; // LEA instructions can't fold loads.
125
Craig Topperb7baa352018-04-08 17:53:18 +0000126defm : BWWriteResPair<WriteCMOV, [BWPort06], 1>; // Conditional move.
127def : WriteRes<WriteSETCC, [BWPort06]>; // Setcc.
128def : WriteRes<WriteSETCCStore, [BWPort06,BWPort4,BWPort237]> {
129 let Latency = 2;
130 let NumMicroOps = 3;
131}
132
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000133// Bit counts.
134defm : BWWriteResPair<WriteBitScan, [BWPort1], 3>;
135defm : BWWriteResPair<WriteLZCNT, [BWPort1], 3>;
136defm : BWWriteResPair<WriteTZCNT, [BWPort1], 3>;
137defm : BWWriteResPair<WritePOPCNT, [BWPort1], 3>;
138
Gadi Haber323f2e12017-10-24 20:19:47 +0000139// Integer shifts and rotates.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000140defm : BWWriteResPair<WriteShift, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000141
Craig Topper89310f52018-03-29 20:41:39 +0000142// BMI1 BEXTR, BMI2 BZHI
143defm : BWWriteResPair<WriteBEXTR, [BWPort06,BWPort15], 2, [1,1], 2>;
144defm : BWWriteResPair<WriteBZHI, [BWPort15], 1>;
145
Gadi Haber323f2e12017-10-24 20:19:47 +0000146// Loads, stores, and moves, not folded with other operations.
147def : WriteRes<WriteLoad, [BWPort23]> { let Latency = 5; }
148def : WriteRes<WriteStore, [BWPort237, BWPort4]>;
149def : WriteRes<WriteMove, [BWPort0156]>;
150
151// Idioms that clear a register, like xorps %xmm0, %xmm0.
152// These can often bypass execution ports completely.
153def : WriteRes<WriteZero, []>;
154
Sanjoy Das1074eb22017-12-12 19:11:31 +0000155// Treat misc copies as a move.
156def : InstRW<[WriteMove], (instrs COPY)>;
157
Gadi Haber323f2e12017-10-24 20:19:47 +0000158// Branches don't produce values, so they have no latency, but they still
159// consume resources. Indirect branches can fold loads.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000160defm : BWWriteResPair<WriteJump, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000161
162// Floating point. This covers both scalar and vector operations.
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000163defm : X86WriteRes<WriteFLoad, [BWPort23], 5, [1], 1>;
164defm : X86WriteRes<WriteFMaskedLoad, [BWPort23,BWPort5], 7, [1,2], 3>;
165defm : X86WriteRes<WriteFMaskedLoadY, [BWPort23,BWPort5], 8, [1,2], 3>;
166defm : X86WriteRes<WriteFStore, [BWPort237,BWPort4], 1, [1,1], 1>;
167defm : X86WriteRes<WriteFMaskedStore, [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
168defm : X86WriteRes<WriteFMaskedStoreY, [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
169defm : X86WriteRes<WriteFMove, [BWPort5], 1, [1], 1>;
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000170
Simon Pilgrim1233e122018-05-07 20:52:53 +0000171defm : BWWriteResPair<WriteFAdd, [BWPort1], 3, [1], 1, 5>; // Floating point add/sub.
172defm : BWWriteResPair<WriteFAddX, [BWPort1], 3, [1], 1, 5>; // Floating point add/sub (XMM).
173defm : BWWriteResPair<WriteFAddY, [BWPort1], 3, [1], 1, 6>; // Floating point add/sub (YMM/ZMM).
174defm : BWWriteResPair<WriteFAdd64, [BWPort1], 3, [1], 1, 5>; // Floating point double add/sub.
175defm : BWWriteResPair<WriteFAdd64X, [BWPort1], 3, [1], 1, 5>; // Floating point double add/sub (XMM).
176defm : BWWriteResPair<WriteFAdd64Y, [BWPort1], 3, [1], 1, 6>; // Floating point double add/sub (YMM/ZMM).
177
178defm : BWWriteResPair<WriteFCmp, [BWPort1], 3, [1], 1, 5>; // Floating point compare.
179defm : BWWriteResPair<WriteFCmpX, [BWPort1], 3, [1], 1, 5>; // Floating point compare (XMM).
180defm : BWWriteResPair<WriteFCmpY, [BWPort1], 3, [1], 1, 6>; // Floating point compare (YMM/ZMM).
181defm : BWWriteResPair<WriteFCmp64, [BWPort1], 3, [1], 1, 5>; // Floating point double compare.
182defm : BWWriteResPair<WriteFCmp64X, [BWPort1], 3, [1], 1, 5>; // Floating point double compare (XMM).
183defm : BWWriteResPair<WriteFCmp64Y, [BWPort1], 3, [1], 1, 6>; // Floating point double compare (YMM/ZMM).
184
185defm : BWWriteResPair<WriteFCom, [BWPort1], 3>; // Floating point compare to flags.
186
187defm : BWWriteResPair<WriteFMul, [BWPort01], 3, [1], 1, 5>; // Floating point multiplication.
188defm : BWWriteResPair<WriteFMulX, [BWPort01], 3, [1], 1, 5>; // Floating point multiplication (XMM).
189defm : BWWriteResPair<WriteFMulY, [BWPort01], 3, [1], 1, 6>; // Floating point multiplication (YMM/ZMM).
190defm : BWWriteResPair<WriteFMul64, [BWPort01], 3, [1], 1, 5>; // Floating point double multiplication.
191defm : BWWriteResPair<WriteFMul64X, [BWPort01], 3, [1], 1, 5>; // Floating point double multiplication (XMM).
192defm : BWWriteResPair<WriteFMul64Y, [BWPort01], 3, [1], 1, 6>; // Floating point double multiplication (YMM/ZMM).
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000193
194//defm : BWWriteResPair<WriteFDiv, [BWPort0,BWFPDivider], 11, [1,3], 1, 5>; // Floating point division.
195defm : BWWriteResPair<WriteFDivX, [BWPort0,BWFPDivider], 11, [1,5], 1, 5>; // Floating point division (XMM).
196defm : BWWriteResPair<WriteFDivY, [BWPort0,BWPort015,BWFPDivider], 17, [2,1,10], 3, 6>; // Floating point division (YMM).
197defm : BWWriteResPair<WriteFDivZ, [BWPort0,BWPort015,BWFPDivider], 17, [2,1,10], 3, 6>; // Floating point division (ZMM).
198//defm : BWWriteResPair<WriteFDiv64, [BWPort0,BWFPDivider], 14, [1,8], 1, 5>; // Floating point division.
199defm : BWWriteResPair<WriteFDiv64X, [BWPort0,BWFPDivider], 14, [1,8], 1, 5>; // Floating point division (XMM).
200defm : BWWriteResPair<WriteFDiv64Y, [BWPort0,BWPort015,BWFPDivider], 23, [2,1,16], 3, 6>; // Floating point division (YMM).
201defm : BWWriteResPair<WriteFDiv64Z, [BWPort0,BWPort015,BWFPDivider], 23, [2,1,16], 3, 6>; // Floating point division (ZMM).
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000202
203defm : X86WriteRes<WriteFSqrt, [BWPort0,BWFPDivider], 11, [1,4], 1>; // Floating point square root.
204defm : X86WriteRes<WriteFSqrtLd, [BWPort0,BWPort23,BWFPDivider], 16, [1,1,7], 2>;
205defm : BWWriteResPair<WriteFSqrtX, [BWPort0,BWFPDivider], 11, [1,7], 1, 5>; // Floating point square root (XMM).
206defm : BWWriteResPair<WriteFSqrtY, [BWPort0,BWPort015,BWFPDivider], 21, [2,1,14], 3, 6>; // Floating point square root (YMM).
207defm : BWWriteResPair<WriteFSqrtZ, [BWPort0,BWPort015,BWFPDivider], 21, [2,1,14], 3, 6>; // Floating point square root (ZMM).
208defm : X86WriteRes<WriteFSqrt64, [BWPort0,BWFPDivider], 16, [1,8], 1>; // Floating point double square root.
209defm : X86WriteRes<WriteFSqrt64Ld, [BWPort0,BWPort23,BWFPDivider], 21, [1,1,14], 2>;
210defm : BWWriteResPair<WriteFSqrt64X, [BWPort0,BWFPDivider], 16, [1,14],1, 5>; // Floating point double square root (XMM).
211defm : BWWriteResPair<WriteFSqrt64Y, [BWPort0,BWPort015,BWFPDivider], 29, [2,1,28], 3, 6>; // Floating point double square root (YMM).
212defm : BWWriteResPair<WriteFSqrt64Z, [BWPort0,BWPort015,BWFPDivider], 29, [2,1,28], 3, 6>; // Floating point double square root (ZMM).
213defm : BWWriteResPair<WriteFSqrt80, [BWPort0,BWFPDivider], 23, [1,9]>; // Floating point long double square root.
214
Simon Pilgrimc7088682018-05-01 18:06:07 +0000215defm : BWWriteResPair<WriteFRcp, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000216defm : BWWriteResPair<WriteFRcpX, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal estimate (XMM).
217defm : BWWriteResPair<WriteFRcpY, [BWPort0,BWPort015], 11, [2,1], 3, 6>; // Floating point reciprocal estimate (YMM/ZMM).
218
Simon Pilgrimc7088682018-05-01 18:06:07 +0000219defm : BWWriteResPair<WriteFRsqrt, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal square root estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000220defm : BWWriteResPair<WriteFRsqrtX,[BWPort0], 5, [1], 1, 5>; // Floating point reciprocal square root estimate (XMM).
221defm : BWWriteResPair<WriteFRsqrtY,[BWPort0,BWPort015], 11, [2,1], 3, 6>; // Floating point reciprocal square root estimate (YMM/ZMM).
222
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000223defm : BWWriteResPair<WriteFMA, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add.
Simon Pilgrim67cc2462018-05-04 15:20:18 +0000224defm : BWWriteResPair<WriteFMAX, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add (XMM).
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000225defm : BWWriteResPair<WriteFMAY, [BWPort01], 5, [1], 1, 6>; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000226defm : BWWriteResPair<WriteDPPD, [BWPort0,BWPort1,BWPort5], 9, [1,1,1], 3, 5>; // Floating point double dot product.
227defm : BWWriteResPair<WriteDPPS, [BWPort0,BWPort1,BWPort5], 14, [2,1,1], 4, 5>; // Floating point single dot product.
228defm : BWWriteResPair<WriteDPPSY, [BWPort0,BWPort1,BWPort5], 14, [2,1,1], 4, 6>; // Floating point single dot product (YMM).
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000229defm : BWWriteResPair<WriteFSign, [BWPort5], 1>; // Floating point fabs/fchs.
230defm : X86WriteRes<WriteFRnd, [BWPort23], 6, [1], 1>; // Floating point rounding.
231defm : X86WriteRes<WriteFRndY, [BWPort23], 6, [1], 1>; // Floating point rounding (YMM/ZMM).
232defm : X86WriteRes<WriteFRndLd, [BWPort1,BWPort23], 11, [2,1], 3>;
233defm : X86WriteRes<WriteFRndYLd, [BWPort1,BWPort23], 12, [2,1], 3>;
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000234defm : BWWriteResPair<WriteFLogic, [BWPort5], 1, [1], 1, 5>; // Floating point and/or/xor logicals.
235defm : BWWriteResPair<WriteFLogicY, [BWPort5], 1, [1], 1, 6>; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000236defm : BWWriteResPair<WriteFTest, [BWPort0], 1, [1], 1, 5>; // Floating point TEST instructions.
237defm : BWWriteResPair<WriteFTestY, [BWPort0], 1, [1], 1, 6>; // Floating point TEST instructions (YMM/ZMM).
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000238defm : BWWriteResPair<WriteFShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector shuffles.
239defm : BWWriteResPair<WriteFShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000240defm : BWWriteResPair<WriteFVarShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector variable shuffles.
241defm : BWWriteResPair<WriteFVarShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
242defm : BWWriteResPair<WriteFBlend, [BWPort015], 1, [1], 1, 5>; // Floating point vector blends.
243defm : BWWriteResPair<WriteFBlendY, [BWPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000244defm : BWWriteResPair<WriteFVarBlend, [BWPort5], 2, [2], 2, 5>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000245defm : BWWriteResPair<WriteFVarBlendY, [BWPort5], 2, [2], 2, 6>; // Fp vector variable blends.
Gadi Haber323f2e12017-10-24 20:19:47 +0000246
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000247def : WriteRes<WriteCvtF2FSt, [BWPort1,BWPort4,BWPort237]> {
248 let Latency = 4;
249 let NumMicroOps = 3;
250 let ResourceCycles = [1,1,1];
251}
252
Gadi Haber323f2e12017-10-24 20:19:47 +0000253// FMA Scheduling helper class.
254// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
255
256// Vector integer operations.
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000257defm : X86WriteRes<WriteVecLoad, [BWPort23], 5, [1], 1>;
258defm : X86WriteRes<WriteVecMaskedLoad, [BWPort23,BWPort5], 7, [1,2], 3>;
259defm : X86WriteRes<WriteVecMaskedLoadY, [BWPort23,BWPort5], 8, [1,2], 3>;
260defm : X86WriteRes<WriteVecStore, [BWPort237,BWPort4], 1, [1,1], 1>;
261defm : X86WriteRes<WriteVecMaskedStore, [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
262defm : X86WriteRes<WriteVecMaskedStoreY, [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
263defm : X86WriteRes<WriteVecMove, [BWPort015], 1, [1], 1>;
264defm : X86WriteRes<WriteEMMS, [BWPort01,BWPort15,BWPort015,BWPort0156], 31, [8,1,21,1], 31>;
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000265
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000266defm : BWWriteResPair<WriteVecALU, [BWPort15], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
267defm : BWWriteResPair<WriteVecALUY, [BWPort15], 1, [1], 1, 6>; // Vector integer ALU op, no logicals (YMM/ZMM).
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000268defm : BWWriteResPair<WriteVecLogic, [BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
269defm : BWWriteResPair<WriteVecLogicY,[BWPort015], 1, [1], 1, 6>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000270defm : BWWriteResPair<WriteVecTest, [BWPort0,BWPort5], 2, [1,1], 2, 5>; // Vector integer TEST instructions.
271defm : BWWriteResPair<WriteVecTestY, [BWPort0,BWPort5], 4, [1,1], 2, 6>; // Vector integer TEST instructions (YMM/ZMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000272defm : BWWriteResPair<WriteVecIMul, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000273defm : BWWriteResPair<WriteVecIMulX, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000274defm : BWWriteResPair<WriteVecIMulY, [BWPort0], 5, [1], 1, 6>; // Vector integer multiply.
275defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // Vector PMULLD.
276defm : BWWriteResPair<WritePMULLDY, [BWPort0], 10, [2], 2, 6>; // Vector PMULLD (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000277defm : BWWriteResPair<WriteShuffle, [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000278defm : BWWriteResPair<WriteShuffleY, [BWPort5], 1, [1], 1, 6>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000279defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000280defm : BWWriteResPair<WriteVarShuffleY,[BWPort5], 1, [1], 1, 6>; // Vector variable shuffles (YMM/ZMM).
281defm : BWWriteResPair<WriteBlend, [BWPort5], 1, [1], 1, 5>; // Vector blends.
282defm : BWWriteResPair<WriteBlendY, [BWPort5], 1, [1], 1, 6>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000283defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000284defm : BWWriteResPair<WriteVarBlendY, [BWPort5], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000285defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000286defm : BWWriteResPair<WriteMPSADY, [BWPort0, BWPort5], 7, [1, 2], 3, 6>; // Vector MPSAD.
287defm : BWWriteResPair<WritePSADBW, [BWPort0], 5, [1], 1, 5>; // Vector PSADBW.
288defm : BWWriteResPair<WritePSADBWY, [BWPort0], 5, [1], 1, 6>; // Vector PSADBW (YMM/ZMM).
289defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000290
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000291// Vector integer shifts.
292defm : BWWriteResPair<WriteVecShift, [BWPort0], 1, [1], 1, 5>;
293defm : BWWriteResPair<WriteVecShiftX, [BWPort0,BWPort5], 2, [1,1], 2, 5>;
294defm : X86WriteRes<WriteVecShiftY, [BWPort0,BWPort5], 4, [1,1], 2>;
295defm : X86WriteRes<WriteVecShiftYLd, [BWPort0,BWPort23], 7, [1,1], 2>;
296
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000297defm : BWWriteResPair<WriteVecShiftImm, [BWPort0], 1, [1], 1, 5>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000298defm : BWWriteResPair<WriteVecShiftImmX, [BWPort0], 1, [1], 1, 5>; // Vector integer immediate shifts (XMM).
299defm : BWWriteResPair<WriteVecShiftImmY, [BWPort0], 1, [1], 1, 6>; // Vector integer immediate shifts (YMM/ZMM).
300defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 3, [2,1], 3, 5>; // Variable vector shifts.
301defm : BWWriteResPair<WriteVarVecShiftY, [BWPort0, BWPort5], 3, [2,1], 3, 6>; // Variable vector shifts (YMM/ZMM).
302
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000303// Vector insert/extract operations.
304def : WriteRes<WriteVecInsert, [BWPort5]> {
305 let Latency = 2;
306 let NumMicroOps = 2;
307 let ResourceCycles = [2];
308}
309def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
310 let Latency = 6;
311 let NumMicroOps = 2;
312}
313
314def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
315 let Latency = 2;
316 let NumMicroOps = 2;
317}
318def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
319 let Latency = 2;
320 let NumMicroOps = 3;
321}
322
Gadi Haber323f2e12017-10-24 20:19:47 +0000323// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000324defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
325defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
326defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000327
328// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000329
Gadi Haber323f2e12017-10-24 20:19:47 +0000330// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000331def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000332 let Latency = 11;
333 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000334 let ResourceCycles = [3];
335}
336def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000337 let Latency = 16;
338 let NumMicroOps = 4;
339 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000340}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000341
342// Packed Compare Explicit Length Strings, Return Mask
343def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
344 let Latency = 19;
345 let NumMicroOps = 9;
346 let ResourceCycles = [4,3,1,1];
347}
348def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
349 let Latency = 24;
350 let NumMicroOps = 10;
351 let ResourceCycles = [4,3,1,1,1];
352}
353
354// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000355def : WriteRes<WritePCmpIStrI, [BWPort0]> {
356 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000357 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000358 let ResourceCycles = [3];
359}
360def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000361 let Latency = 16;
362 let NumMicroOps = 4;
363 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000364}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000365
366// Packed Compare Explicit Length Strings, Return Index
367def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
368 let Latency = 18;
369 let NumMicroOps = 8;
370 let ResourceCycles = [4,3,1];
371}
372def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
373 let Latency = 23;
374 let NumMicroOps = 9;
375 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000376}
377
Simon Pilgrima2f26782018-03-27 20:38:54 +0000378// MOVMSK Instructions.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000379def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
380def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
381def : WriteRes<WriteVecMOVMSKY, [BWPort0]> { let Latency = 3; }
382def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
Simon Pilgrima2f26782018-03-27 20:38:54 +0000383
Gadi Haber323f2e12017-10-24 20:19:47 +0000384// AES instructions.
385def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
386 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000387 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000388 let ResourceCycles = [1];
389}
390def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000391 let Latency = 12;
392 let NumMicroOps = 2;
393 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000394}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000395
Gadi Haber323f2e12017-10-24 20:19:47 +0000396def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
397 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000398 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000399 let ResourceCycles = [2];
400}
401def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000402 let Latency = 19;
403 let NumMicroOps = 3;
404 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000405}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000406
407def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
408 let Latency = 29;
409 let NumMicroOps = 11;
410 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000411}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000412def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
413 let Latency = 33;
414 let NumMicroOps = 11;
415 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000416}
417
418// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000419defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000420
421// Catch-all for expensive system instructions.
422def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
423
424// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000425defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
426defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
427defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
428defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
Gadi Haber323f2e12017-10-24 20:19:47 +0000429
430// Old microcoded instructions that nobody use.
431def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
432
433// Fence instructions.
434def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
435
Craig Topper05242bf2018-04-21 18:07:36 +0000436// Load/store MXCSR.
437def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
438def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
439
Gadi Haber323f2e12017-10-24 20:19:47 +0000440// Nop, not very useful expect it provides a model for nops!
441def : WriteRes<WriteNop, []>;
442
443////////////////////////////////////////////////////////////////////////////////
444// Horizontal add/sub instructions.
445////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000446
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000447defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3, 5>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000448defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000449defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3, 5>;
450defm : BWWriteResPair<WritePHAddY, [BWPort5,BWPort15], 3, [2,1], 3, 6>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000451
452// Remaining instrs.
453
454def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
455 let Latency = 1;
456 let NumMicroOps = 1;
457 let ResourceCycles = [1];
458}
Craig Topper5a69a002018-03-21 06:28:42 +0000459def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
460 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000461 "(V?)MOVPDI2DIrr",
462 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000463 "VPSLLVQ(Y?)rr",
Simon Pilgrim210286e2018-05-08 10:28:03 +0000464 "VPSRLVQ(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000465
466def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
467 let Latency = 1;
468 let NumMicroOps = 1;
469 let ResourceCycles = [1];
470}
Craig Topper5a69a002018-03-21 06:28:42 +0000471def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
472 "COM_FST0r",
473 "UCOM_FPr",
474 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000475
476def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
477 let Latency = 1;
478 let NumMicroOps = 1;
479 let ResourceCycles = [1];
480}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000481def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000482 "MMX_MOVD64to64rr",
483 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000484 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000485 "(V?)MOVDI2PDIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000486
487def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
488 let Latency = 1;
489 let NumMicroOps = 1;
490 let ResourceCycles = [1];
491}
492def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
493
494def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
495 let Latency = 1;
496 let NumMicroOps = 1;
497 let ResourceCycles = [1];
498}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000499def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000500
501def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
502 let Latency = 1;
503 let NumMicroOps = 1;
504 let ResourceCycles = [1];
505}
Craig Topperfbe31322018-04-05 21:56:19 +0000506def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000507def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
508 "ADC(16|32|64)i",
509 "ADC(8|16|32|64)rr",
510 "ADCX(32|64)rr",
511 "ADOX(32|64)rr",
512 "BT(16|32|64)ri8",
513 "BT(16|32|64)rr",
514 "BTC(16|32|64)ri8",
515 "BTC(16|32|64)rr",
516 "BTR(16|32|64)ri8",
517 "BTR(16|32|64)rr",
518 "BTS(16|32|64)ri8",
519 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000520 "SBB(16|32|64)ri",
521 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000522 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000523
524def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
525 let Latency = 1;
526 let NumMicroOps = 1;
527 let ResourceCycles = [1];
528}
Craig Topper5a69a002018-03-21 06:28:42 +0000529def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
530 "BLSI(32|64)rr",
531 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000532 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000533
534def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
535 let Latency = 1;
536 let NumMicroOps = 1;
537 let ResourceCycles = [1];
538}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000539def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000540 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000541
542def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
543 let Latency = 1;
544 let NumMicroOps = 1;
545 let ResourceCycles = [1];
546}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000547def: InstRW<[BWWriteResGroup9], (instrs LAHF, SAHF)>; // TODO: This doesnt match Agner's data
548def: InstRW<[BWWriteResGroup9], (instregex "NOOP",
Craig Topper5a69a002018-03-21 06:28:42 +0000549 "SGDT64m",
550 "SIDT64m",
Craig Topper5a69a002018-03-21 06:28:42 +0000551 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000552 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000553 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000554
555def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
556 let Latency = 1;
557 let NumMicroOps = 2;
558 let ResourceCycles = [1,1];
559}
Craig Topper5a69a002018-03-21 06:28:42 +0000560def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
561 "MMX_MOVD64from64rm",
562 "MMX_MOVD64mr",
563 "MMX_MOVNTQmr",
564 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000565 "MOVNTI_64mr",
566 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000567 "ST_FP(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000568 "VEXTRACTF128mr",
569 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000570 "(V?)MOVAPD(Y?)mr",
571 "(V?)MOVAPS(Y?)mr",
572 "(V?)MOVDQA(Y?)mr",
573 "(V?)MOVDQU(Y?)mr",
574 "(V?)MOVHPDmr",
575 "(V?)MOVHPSmr",
576 "(V?)MOVLPDmr",
577 "(V?)MOVLPSmr",
578 "(V?)MOVNTDQ(V?)mr",
579 "(V?)MOVNTPD(V?)mr",
580 "(V?)MOVNTPS(V?)mr",
581 "(V?)MOVPDI2DImr",
582 "(V?)MOVPQI2QImr",
583 "(V?)MOVPQIto64mr",
584 "(V?)MOVSDmr",
585 "(V?)MOVSSmr",
586 "(V?)MOVUPD(Y?)mr",
587 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000588
Gadi Haber323f2e12017-10-24 20:19:47 +0000589def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
590 let Latency = 2;
591 let NumMicroOps = 2;
592 let ResourceCycles = [2];
593}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000594def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000595
596def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
597 let Latency = 2;
598 let NumMicroOps = 2;
599 let ResourceCycles = [2];
600}
Craig Topper5a69a002018-03-21 06:28:42 +0000601def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
602 "ROL(8|16|32|64)ri",
603 "ROR(8|16|32|64)r1",
604 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000605
606def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
607 let Latency = 2;
608 let NumMicroOps = 2;
609 let ResourceCycles = [2];
610}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000611def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
612 MFENCE,
613 WAIT,
614 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000615
616def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
617 let Latency = 2;
618 let NumMicroOps = 2;
619 let ResourceCycles = [1,1];
620}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000621def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000622 "(V?)CVTPS2PDrr",
Simon Pilgrim210286e2018-05-08 10:28:03 +0000623 "(V?)CVTSS2SDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000624
625def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
626 let Latency = 2;
627 let NumMicroOps = 2;
628 let ResourceCycles = [1,1];
629}
630def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
631
632def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
633 let Latency = 2;
634 let NumMicroOps = 2;
635 let ResourceCycles = [1,1];
636}
637def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
638
639def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
640 let Latency = 2;
641 let NumMicroOps = 2;
642 let ResourceCycles = [1,1];
643}
644def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
645
646def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
647 let Latency = 2;
648 let NumMicroOps = 2;
649 let ResourceCycles = [1,1];
650}
Craig Topper498875f2018-04-04 17:54:19 +0000651def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
652
653def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
654 let Latency = 1;
655 let NumMicroOps = 1;
656 let ResourceCycles = [1];
657}
658def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000659
660def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
661 let Latency = 2;
662 let NumMicroOps = 2;
663 let ResourceCycles = [1,1];
664}
Craig Topper2d451e72018-03-18 08:38:06 +0000665def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000666def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000667def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
668 "ADC8ri",
669 "CMOV(A|BE)(16|32|64)rr",
670 "SBB8i8",
671 "SBB8ri",
672 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000673
Gadi Haber323f2e12017-10-24 20:19:47 +0000674def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
675 let Latency = 2;
676 let NumMicroOps = 3;
677 let ResourceCycles = [1,1,1];
678}
679def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
680
Gadi Haber323f2e12017-10-24 20:19:47 +0000681def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
682 let Latency = 2;
683 let NumMicroOps = 3;
684 let ResourceCycles = [1,1,1];
685}
686def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
687
688def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
689 let Latency = 2;
690 let NumMicroOps = 3;
691 let ResourceCycles = [1,1,1];
692}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000693def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
694 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000695def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000696 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000697
Gadi Haber323f2e12017-10-24 20:19:47 +0000698def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
699 let Latency = 3;
700 let NumMicroOps = 1;
701 let ResourceCycles = [1];
702}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000703def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000704 "PDEP(32|64)rr",
705 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000706 "SHLD(16|32|64)rri8",
707 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000708 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000709
710def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000711 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000712 let NumMicroOps = 2;
713 let ResourceCycles = [1,1];
714}
Clement Courbet327fac42018-03-07 08:14:02 +0000715def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000716
717def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
718 let Latency = 3;
719 let NumMicroOps = 1;
720 let ResourceCycles = [1];
721}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000722def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
Simon Pilgrime480ed02018-05-07 18:25:19 +0000723 "VPBROADCASTWrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000724
Gadi Haber323f2e12017-10-24 20:19:47 +0000725def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000726 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000727 let NumMicroOps = 3;
728 let ResourceCycles = [3];
729}
Craig Topperb5f26592018-04-19 18:00:17 +0000730def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
731 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
732 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000733
Gadi Haber323f2e12017-10-24 20:19:47 +0000734def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
735 let Latency = 3;
736 let NumMicroOps = 3;
737 let ResourceCycles = [2,1];
738}
Craig Topper5a69a002018-03-21 06:28:42 +0000739def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
740 "MMX_PACKSSWBirr",
741 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000742
743def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
744 let Latency = 3;
745 let NumMicroOps = 3;
746 let ResourceCycles = [1,2];
747}
748def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
749
750def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
751 let Latency = 3;
752 let NumMicroOps = 3;
753 let ResourceCycles = [1,2];
754}
Craig Topper5a69a002018-03-21 06:28:42 +0000755def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
756 "RCL(8|16|32|64)ri",
757 "RCR(8|16|32|64)r1",
758 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000759
760def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
761 let Latency = 3;
762 let NumMicroOps = 3;
763 let ResourceCycles = [2,1];
764}
Craig Topper5a69a002018-03-21 06:28:42 +0000765def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
766 "ROR(8|16|32|64)rCL",
767 "SAR(8|16|32|64)rCL",
768 "SHL(8|16|32|64)rCL",
769 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000770
771def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
772 let Latency = 3;
773 let NumMicroOps = 4;
774 let ResourceCycles = [1,1,1,1];
775}
776def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
777
778def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
779 let Latency = 3;
780 let NumMicroOps = 4;
781 let ResourceCycles = [1,1,1,1];
782}
Craig Topper5a69a002018-03-21 06:28:42 +0000783def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
784 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000785
786def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
787 let Latency = 4;
788 let NumMicroOps = 2;
789 let ResourceCycles = [1,1];
790}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000791def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
792 "(V?)CVTSD2SIrr",
793 "(V?)CVTSS2SI64rr",
794 "(V?)CVTSS2SIrr",
795 "(V?)CVTTSD2SI64rr",
796 "(V?)CVTTSD2SIrr",
797 "(V?)CVTTSS2SI64rr",
798 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000799
800def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
801 let Latency = 4;
802 let NumMicroOps = 2;
803 let ResourceCycles = [1,1];
804}
Simon Pilgrim210286e2018-05-08 10:28:03 +0000805def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000806
807def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
808 let Latency = 4;
809 let NumMicroOps = 2;
810 let ResourceCycles = [1,1];
811}
812def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
813
814def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
815 let Latency = 4;
816 let NumMicroOps = 2;
817 let ResourceCycles = [1,1];
818}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000819def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000820def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000821 "MMX_CVTPI2PDirr",
822 "MMX_CVTPS2PIirr",
823 "MMX_CVTTPD2PIirr",
824 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000825 "(V?)CVTDQ2PDrr",
826 "(V?)CVTPD2DQrr",
827 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000828 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000829 "(V?)CVTSD2SSrr",
830 "(V?)CVTSI642SDrr",
831 "(V?)CVTSI2SDrr",
832 "(V?)CVTSI2SSrr",
833 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000834
835def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
836 let Latency = 4;
837 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000838 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000839}
Craig Topper5a69a002018-03-21 06:28:42 +0000840def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000841
842def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
843 let Latency = 4;
844 let NumMicroOps = 3;
845 let ResourceCycles = [1,1,1];
846}
847def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
848
849def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
850 let Latency = 4;
851 let NumMicroOps = 3;
852 let ResourceCycles = [1,1,1];
853}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000854def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
855 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000856
857def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
858 let Latency = 4;
859 let NumMicroOps = 4;
860 let ResourceCycles = [4];
861}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000862def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000863
864def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
865 let Latency = 4;
866 let NumMicroOps = 4;
867 let ResourceCycles = [1,3];
868}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000869def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000870
871def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
872 let Latency = 5;
873 let NumMicroOps = 1;
874 let ResourceCycles = [1];
875}
Simon Pilgrima53d3302018-05-02 16:16:24 +0000876def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr",
877 "MUL_FPrST0",
878 "MUL_FST0r",
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000879 "MUL_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000880
Gadi Haber323f2e12017-10-24 20:19:47 +0000881def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
882 let Latency = 5;
883 let NumMicroOps = 1;
884 let ResourceCycles = [1];
885}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000886def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000887 "MOVSX(16|32|64)rm32",
888 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000889 "MOVZX(16|32|64)rm16",
890 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000891 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000892 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000893 "(V?)MOVSHDUPrm",
894 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000895 "VPBROADCASTDrm",
896 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000897
898def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
899 let Latency = 5;
900 let NumMicroOps = 3;
901 let ResourceCycles = [1,2];
902}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000903def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000904
905def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
906 let Latency = 5;
907 let NumMicroOps = 3;
908 let ResourceCycles = [1,1,1];
909}
910def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
911
912def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000913 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000914 let NumMicroOps = 3;
915 let ResourceCycles = [1,1,1];
916}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000917def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000918
Gadi Haber323f2e12017-10-24 20:19:47 +0000919def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
920 let Latency = 5;
921 let NumMicroOps = 5;
922 let ResourceCycles = [1,4];
923}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000924def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000925
926def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
927 let Latency = 5;
928 let NumMicroOps = 5;
929 let ResourceCycles = [1,4];
930}
931def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
932
933def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
934 let Latency = 5;
935 let NumMicroOps = 5;
936 let ResourceCycles = [2,3];
937}
Craig Topper5a69a002018-03-21 06:28:42 +0000938def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000939
940def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
941 let Latency = 5;
942 let NumMicroOps = 6;
943 let ResourceCycles = [1,1,4];
944}
Craig Topper5a69a002018-03-21 06:28:42 +0000945def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000946
947def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
948 let Latency = 6;
949 let NumMicroOps = 1;
950 let ResourceCycles = [1];
951}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000952def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000953 "VBROADCASTF128",
954 "VBROADCASTI128",
955 "VBROADCASTSDYrm",
956 "VBROADCASTSSYrm",
957 "VLDDQUYrm",
958 "VMOVAPDYrm",
959 "VMOVAPSYrm",
960 "VMOVDDUPYrm",
961 "VMOVDQAYrm",
962 "VMOVDQUYrm",
963 "VMOVNTDQAYrm",
964 "VMOVSHDUPYrm",
965 "VMOVSLDUPYrm",
966 "VMOVUPDYrm",
967 "VMOVUPSYrm",
968 "VPBROADCASTDYrm",
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000969 "VPBROADCASTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000970
971def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
972 let Latency = 6;
973 let NumMicroOps = 2;
974 let ResourceCycles = [1,1];
975}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000976def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000977 "(V?)CVTPS2PDrm",
978 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000979 "VPSLLVQrm",
Simon Pilgrim210286e2018-05-08 10:28:03 +0000980 "VPSRLVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000981
982def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
983 let Latency = 6;
984 let NumMicroOps = 2;
985 let ResourceCycles = [1,1];
986}
Craig Topper5a69a002018-03-21 06:28:42 +0000987def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
988 "VCVTPD2DQYrr",
989 "VCVTPD2PSYrr",
990 "VCVTPS2PHYrr",
991 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000992
Gadi Haber323f2e12017-10-24 20:19:47 +0000993def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
994 let Latency = 6;
995 let NumMicroOps = 2;
996 let ResourceCycles = [1,1];
997}
Craig Topper5a69a002018-03-21 06:28:42 +0000998def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
999 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001000
1001def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
1002 let Latency = 6;
1003 let NumMicroOps = 2;
1004 let ResourceCycles = [1,1];
1005}
Craig Topperdfccafe2018-04-18 06:41:25 +00001006def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001007def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
1008 ADCX32rm, ADCX64rm,
1009 ADOX32rm, ADOX64rm,
1010 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001011
1012def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
1013 let Latency = 6;
1014 let NumMicroOps = 2;
1015 let ResourceCycles = [1,1];
1016}
Craig Topper5a69a002018-03-21 06:28:42 +00001017def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
1018 "BLSI(32|64)rm",
1019 "BLSMSK(32|64)rm",
1020 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001021 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001022
1023def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
1024 let Latency = 6;
1025 let NumMicroOps = 2;
1026 let ResourceCycles = [1,1];
1027}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001028def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +00001029 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001030 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001031
1032def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1033 let Latency = 6;
1034 let NumMicroOps = 2;
1035 let ResourceCycles = [1,1];
1036}
Craig Topper2d451e72018-03-18 08:38:06 +00001037def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001038def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001039
1040def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1041 let Latency = 6;
1042 let NumMicroOps = 4;
1043 let ResourceCycles = [1,1,2];
1044}
Craig Topper5a69a002018-03-21 06:28:42 +00001045def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1046 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001047
1048def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1049 let Latency = 6;
1050 let NumMicroOps = 4;
1051 let ResourceCycles = [1,1,1,1];
1052}
1053def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1054
1055def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1056 let Latency = 6;
1057 let NumMicroOps = 4;
1058 let ResourceCycles = [1,1,1,1];
1059}
Craig Topper5a69a002018-03-21 06:28:42 +00001060def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1061 "BTR(16|32|64)mi8",
1062 "BTS(16|32|64)mi8",
1063 "SAR(8|16|32|64)m1",
1064 "SAR(8|16|32|64)mi",
1065 "SHL(8|16|32|64)m1",
1066 "SHL(8|16|32|64)mi",
1067 "SHR(8|16|32|64)m1",
1068 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001069
1070def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1071 let Latency = 6;
1072 let NumMicroOps = 4;
1073 let ResourceCycles = [1,1,1,1];
1074}
Craig Topperf0d04262018-04-06 16:16:48 +00001075def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1076 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001077
1078def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1079 let Latency = 6;
1080 let NumMicroOps = 6;
1081 let ResourceCycles = [1,5];
1082}
1083def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1084
Gadi Haber323f2e12017-10-24 20:19:47 +00001085def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1086 let Latency = 7;
1087 let NumMicroOps = 2;
1088 let ResourceCycles = [1,1];
1089}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001090def: InstRW<[BWWriteResGroup73], (instregex "VPSLLVQYrm",
Simon Pilgrim210286e2018-05-08 10:28:03 +00001091 "VPSRLVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001092
1093def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1094 let Latency = 7;
1095 let NumMicroOps = 2;
1096 let ResourceCycles = [1,1];
1097}
Craig Topper5a69a002018-03-21 06:28:42 +00001098def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1099 "FCOM64m",
1100 "FCOMP32m",
1101 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001102
Gadi Haber323f2e12017-10-24 20:19:47 +00001103def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1104 let Latency = 7;
1105 let NumMicroOps = 2;
1106 let ResourceCycles = [1,1];
1107}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001108def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001109
Gadi Haber323f2e12017-10-24 20:19:47 +00001110def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1111 let Latency = 7;
1112 let NumMicroOps = 3;
1113 let ResourceCycles = [2,1];
1114}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001115def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001116 "MMX_PACKSSWBirm",
Simon Pilgrimb0a3be02018-05-08 12:17:55 +00001117 "MMX_PACKUSWBirm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001118
1119def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1120 let Latency = 7;
1121 let NumMicroOps = 3;
1122 let ResourceCycles = [1,2];
1123}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001124def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1125 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001126
Gadi Haber323f2e12017-10-24 20:19:47 +00001127def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1128 let Latency = 7;
1129 let NumMicroOps = 3;
1130 let ResourceCycles = [1,1,1];
1131}
1132def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1133
Gadi Haber323f2e12017-10-24 20:19:47 +00001134def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1135 let Latency = 7;
1136 let NumMicroOps = 3;
1137 let ResourceCycles = [1,1,1];
1138}
Craig Topper5a69a002018-03-21 06:28:42 +00001139def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1140 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001141
Gadi Haber323f2e12017-10-24 20:19:47 +00001142def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1143 let Latency = 7;
1144 let NumMicroOps = 3;
1145 let ResourceCycles = [1,1,1];
1146}
Craig Topperf4cd9082018-01-19 05:47:32 +00001147def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001148
1149def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1150 let Latency = 7;
1151 let NumMicroOps = 5;
1152 let ResourceCycles = [1,1,1,2];
1153}
Craig Topper5a69a002018-03-21 06:28:42 +00001154def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1155 "ROL(8|16|32|64)mi",
1156 "ROR(8|16|32|64)m1",
1157 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001158
1159def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1160 let Latency = 7;
1161 let NumMicroOps = 5;
1162 let ResourceCycles = [1,1,1,2];
1163}
Craig Topper5a69a002018-03-21 06:28:42 +00001164def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001165
1166def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1167 let Latency = 7;
1168 let NumMicroOps = 5;
1169 let ResourceCycles = [1,1,1,1,1];
1170}
Craig Topper5a69a002018-03-21 06:28:42 +00001171def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1172 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001173
1174def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1175 let Latency = 7;
1176 let NumMicroOps = 7;
1177 let ResourceCycles = [2,2,1,2];
1178}
Craig Topper2d451e72018-03-18 08:38:06 +00001179def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001180
1181def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1182 let Latency = 8;
1183 let NumMicroOps = 2;
1184 let ResourceCycles = [1,1];
1185}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001186def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001187 "PDEP(32|64)rm",
1188 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001189 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001190
1191def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001192 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001193 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001194 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001195}
Craig Topperf846e2d2018-04-19 05:34:05 +00001196def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001197
Craig Topperf846e2d2018-04-19 05:34:05 +00001198def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1199 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001200 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001201 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001202}
Craig Topper5a69a002018-03-21 06:28:42 +00001203def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001204
Gadi Haber323f2e12017-10-24 20:19:47 +00001205def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1206 let Latency = 8;
1207 let NumMicroOps = 2;
1208 let ResourceCycles = [1,1];
1209}
Craig Topper5a69a002018-03-21 06:28:42 +00001210def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1211 "VPMOVSXBQYrm",
1212 "VPMOVSXBWYrm",
1213 "VPMOVSXDQYrm",
1214 "VPMOVSXWDYrm",
1215 "VPMOVSXWQYrm",
1216 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001217
Gadi Haber323f2e12017-10-24 20:19:47 +00001218def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1219 let Latency = 8;
1220 let NumMicroOps = 5;
1221 let ResourceCycles = [1,1,1,2];
1222}
Craig Topper5a69a002018-03-21 06:28:42 +00001223def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1224 "RCL(8|16|32|64)mi",
1225 "RCR(8|16|32|64)m1",
1226 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001227
1228def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1229 let Latency = 8;
1230 let NumMicroOps = 5;
1231 let ResourceCycles = [1,1,2,1];
1232}
Craig Topper13a16502018-03-19 00:56:09 +00001233def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001234
1235def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1236 let Latency = 8;
1237 let NumMicroOps = 6;
1238 let ResourceCycles = [1,1,1,3];
1239}
Craig Topper9f834812018-04-01 21:54:24 +00001240def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001241
1242def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1243 let Latency = 8;
1244 let NumMicroOps = 6;
1245 let ResourceCycles = [1,1,1,2,1];
1246}
Craig Topper9f834812018-04-01 21:54:24 +00001247def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001248 "CMPXCHG(8|16|32|64)rm",
1249 "ROL(8|16|32|64)mCL",
1250 "SAR(8|16|32|64)mCL",
1251 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001252 "SHL(8|16|32|64)mCL",
1253 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001254def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1255 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001256
1257def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1258 let Latency = 9;
1259 let NumMicroOps = 2;
1260 let ResourceCycles = [1,1];
1261}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001262def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1263 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001264 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001265 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001266
1267def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1268 let Latency = 9;
1269 let NumMicroOps = 2;
1270 let ResourceCycles = [1,1];
1271}
Craig Topper5a69a002018-03-21 06:28:42 +00001272def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1273 "VPERM2I128rm",
1274 "VPERMDYrm",
1275 "VPERMPDYmi",
1276 "VPERMPSYrm",
1277 "VPERMQYmi",
1278 "VPMOVZXBDYrm",
1279 "VPMOVZXBQYrm",
1280 "VPMOVZXBWYrm",
1281 "VPMOVZXDQYrm",
1282 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001283
Gadi Haber323f2e12017-10-24 20:19:47 +00001284def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1285 let Latency = 9;
1286 let NumMicroOps = 3;
1287 let ResourceCycles = [1,1,1];
1288}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001289def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1290 "(V?)CVTSD2SIrm",
1291 "(V?)CVTSS2SI64rm",
1292 "(V?)CVTSS2SIrm",
1293 "(V?)CVTTSD2SI64rm",
1294 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001295 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001296 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001297
1298def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1299 let Latency = 9;
1300 let NumMicroOps = 3;
1301 let ResourceCycles = [1,1,1];
1302}
1303def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1304
1305def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1306 let Latency = 9;
1307 let NumMicroOps = 3;
1308 let ResourceCycles = [1,1,1];
1309}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001310def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001311def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001312 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001313 "CVTTPD2DQrm",
1314 "MMX_CVTPD2PIirm",
1315 "MMX_CVTPI2PDirm",
1316 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001317 "(V?)CVTDQ2PDrm",
1318 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001319
1320def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1321 let Latency = 9;
1322 let NumMicroOps = 3;
1323 let ResourceCycles = [1,1,1];
1324}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001325def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1326 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001327
Gadi Haber323f2e12017-10-24 20:19:47 +00001328def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1329 let Latency = 9;
1330 let NumMicroOps = 4;
1331 let ResourceCycles = [1,1,1,1];
1332}
Craig Topper5a69a002018-03-21 06:28:42 +00001333def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1334 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001335
1336def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1337 let Latency = 9;
1338 let NumMicroOps = 5;
1339 let ResourceCycles = [1,1,3];
1340}
1341def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1342
1343def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1344 let Latency = 9;
1345 let NumMicroOps = 5;
1346 let ResourceCycles = [1,2,1,1];
1347}
Craig Topper5a69a002018-03-21 06:28:42 +00001348def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1349 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001350
Gadi Haber323f2e12017-10-24 20:19:47 +00001351def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1352 let Latency = 10;
1353 let NumMicroOps = 2;
1354 let ResourceCycles = [1,1];
1355}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001356def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001357
Gadi Haber323f2e12017-10-24 20:19:47 +00001358def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1359 let Latency = 10;
1360 let NumMicroOps = 3;
1361 let ResourceCycles = [2,1];
1362}
Craig Topper5a69a002018-03-21 06:28:42 +00001363def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1364 "FICOM32m",
1365 "FICOMP16m",
1366 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001367
Gadi Haber323f2e12017-10-24 20:19:47 +00001368def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1369 let Latency = 10;
1370 let NumMicroOps = 4;
1371 let ResourceCycles = [1,1,1,1];
1372}
1373def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1374
1375def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001376 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001377 let NumMicroOps = 4;
1378 let ResourceCycles = [1,1,1,1];
1379}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001380def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001381
Craig Topper8104f262018-04-02 05:33:28 +00001382def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1383 let Latency = 11;
1384 let NumMicroOps = 1;
1385 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1386}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001387def : SchedAlias<WriteFDiv, BWWriteResGroup122_1>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001388
1389def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1390 let Latency = 11;
1391 let NumMicroOps = 2;
1392 let ResourceCycles = [1,1];
1393}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001394def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001395 "VPCMPGTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001396
Gadi Haber323f2e12017-10-24 20:19:47 +00001397def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1398 let Latency = 11;
1399 let NumMicroOps = 3;
1400 let ResourceCycles = [1,1,1];
1401}
1402def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1403
Gadi Haber323f2e12017-10-24 20:19:47 +00001404def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1405 let Latency = 11;
1406 let NumMicroOps = 6;
1407 let ResourceCycles = [1,1,1,1,2];
1408}
Craig Topper5a69a002018-03-21 06:28:42 +00001409def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1410 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001411
1412def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1413 let Latency = 11;
1414 let NumMicroOps = 7;
1415 let ResourceCycles = [2,2,3];
1416}
Craig Topper5a69a002018-03-21 06:28:42 +00001417def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1418 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001419
1420def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1421 let Latency = 11;
1422 let NumMicroOps = 9;
1423 let ResourceCycles = [1,4,1,3];
1424}
1425def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1426
1427def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1428 let Latency = 11;
1429 let NumMicroOps = 11;
1430 let ResourceCycles = [2,9];
1431}
Craig Topper2d451e72018-03-18 08:38:06 +00001432def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1433def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001434
Gadi Haber323f2e12017-10-24 20:19:47 +00001435def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1436 let Latency = 12;
1437 let NumMicroOps = 3;
1438 let ResourceCycles = [2,1];
1439}
Simon Pilgrimbe51b202018-05-04 12:59:24 +00001440def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001441
Craig Topper8104f262018-04-02 05:33:28 +00001442def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1443 let Latency = 14;
1444 let NumMicroOps = 1;
1445 let ResourceCycles = [1,4];
1446}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001447def : SchedAlias<WriteFDiv64, BWWriteResGroup139_1>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001448
Gadi Haber323f2e12017-10-24 20:19:47 +00001449def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1450 let Latency = 14;
1451 let NumMicroOps = 3;
1452 let ResourceCycles = [1,1,1];
1453}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001454def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001455
Gadi Haber323f2e12017-10-24 20:19:47 +00001456def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1457 let Latency = 14;
1458 let NumMicroOps = 8;
1459 let ResourceCycles = [2,2,1,3];
1460}
1461def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1462
1463def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1464 let Latency = 14;
1465 let NumMicroOps = 10;
1466 let ResourceCycles = [2,3,1,4];
1467}
1468def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1469
1470def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1471 let Latency = 14;
1472 let NumMicroOps = 12;
1473 let ResourceCycles = [2,1,4,5];
1474}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001475def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001476
1477def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1478 let Latency = 15;
1479 let NumMicroOps = 1;
1480 let ResourceCycles = [1];
1481}
Craig Topper5a69a002018-03-21 06:28:42 +00001482def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1483 "DIVR_FST0r",
1484 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001485
Gadi Haber323f2e12017-10-24 20:19:47 +00001486def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1487 let Latency = 15;
1488 let NumMicroOps = 10;
1489 let ResourceCycles = [1,1,1,4,1,2];
1490}
Craig Topper13a16502018-03-19 00:56:09 +00001491def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001492
Craig Topper8104f262018-04-02 05:33:28 +00001493def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001494 let Latency = 16;
1495 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001496 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001497}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001498def : SchedAlias<WriteFDivLd, BWWriteResGroup150>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001499
Gadi Haber323f2e12017-10-24 20:19:47 +00001500def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1501 let Latency = 16;
1502 let NumMicroOps = 14;
1503 let ResourceCycles = [1,1,1,4,2,5];
1504}
1505def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1506
1507def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1508 let Latency = 16;
1509 let NumMicroOps = 16;
1510 let ResourceCycles = [16];
1511}
Craig Topper5a69a002018-03-21 06:28:42 +00001512def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001513
Gadi Haber323f2e12017-10-24 20:19:47 +00001514def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1515 let Latency = 18;
1516 let NumMicroOps = 8;
1517 let ResourceCycles = [1,1,1,5];
1518}
Craig Topper5a69a002018-03-21 06:28:42 +00001519def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001520def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001521
1522def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1523 let Latency = 18;
1524 let NumMicroOps = 11;
1525 let ResourceCycles = [2,1,1,3,1,3];
1526}
Craig Topper13a16502018-03-19 00:56:09 +00001527def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001528
Craig Topper8104f262018-04-02 05:33:28 +00001529def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001530 let Latency = 19;
1531 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001532 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001533}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001534def : SchedAlias<WriteFDiv64Ld, BWWriteResGroup161>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001535
Gadi Haber323f2e12017-10-24 20:19:47 +00001536def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1537 let Latency = 20;
1538 let NumMicroOps = 1;
1539 let ResourceCycles = [1];
1540}
Craig Topper5a69a002018-03-21 06:28:42 +00001541def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1542 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001543 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001544
Gadi Haber323f2e12017-10-24 20:19:47 +00001545def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1546 let Latency = 20;
1547 let NumMicroOps = 8;
1548 let ResourceCycles = [1,1,1,1,1,1,2];
1549}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001550def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001551
Gadi Haber323f2e12017-10-24 20:19:47 +00001552def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1553 let Latency = 21;
1554 let NumMicroOps = 2;
1555 let ResourceCycles = [1,1];
1556}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001557def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001558
Gadi Haber323f2e12017-10-24 20:19:47 +00001559def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1560 let Latency = 21;
1561 let NumMicroOps = 19;
1562 let ResourceCycles = [2,1,4,1,1,4,6];
1563}
1564def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1565
1566def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1567 let Latency = 22;
1568 let NumMicroOps = 18;
1569 let ResourceCycles = [1,1,16];
1570}
1571def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1572
Gadi Haber323f2e12017-10-24 20:19:47 +00001573def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1574 let Latency = 23;
1575 let NumMicroOps = 19;
1576 let ResourceCycles = [3,1,15];
1577}
Craig Topper391c6f92017-12-10 01:24:08 +00001578def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001579
1580def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1581 let Latency = 24;
1582 let NumMicroOps = 3;
1583 let ResourceCycles = [1,1,1];
1584}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001585def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001586
Gadi Haber323f2e12017-10-24 20:19:47 +00001587def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1588 let Latency = 26;
1589 let NumMicroOps = 2;
1590 let ResourceCycles = [1,1];
1591}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001592def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001593
Gadi Haber323f2e12017-10-24 20:19:47 +00001594def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1595 let Latency = 29;
1596 let NumMicroOps = 3;
1597 let ResourceCycles = [1,1,1];
1598}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001599def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001600
Gadi Haber323f2e12017-10-24 20:19:47 +00001601def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1602 let Latency = 22;
1603 let NumMicroOps = 7;
1604 let ResourceCycles = [1,3,2,1];
1605}
Craig Topper17a31182017-12-16 18:35:29 +00001606def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001607
1608def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1609 let Latency = 23;
1610 let NumMicroOps = 9;
1611 let ResourceCycles = [1,3,4,1];
1612}
Craig Topper17a31182017-12-16 18:35:29 +00001613def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001614
1615def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1616 let Latency = 24;
1617 let NumMicroOps = 9;
1618 let ResourceCycles = [1,5,2,1];
1619}
Craig Topper17a31182017-12-16 18:35:29 +00001620def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001621
1622def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1623 let Latency = 25;
1624 let NumMicroOps = 7;
1625 let ResourceCycles = [1,3,2,1];
1626}
Craig Topper17a31182017-12-16 18:35:29 +00001627def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1628 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001629
1630def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1631 let Latency = 26;
1632 let NumMicroOps = 9;
1633 let ResourceCycles = [1,5,2,1];
1634}
Craig Topper17a31182017-12-16 18:35:29 +00001635def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001636
1637def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1638 let Latency = 26;
1639 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001640 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001641}
Craig Topper17a31182017-12-16 18:35:29 +00001642def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001643
1644def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1645 let Latency = 27;
1646 let NumMicroOps = 9;
1647 let ResourceCycles = [1,5,2,1];
1648}
Craig Topper17a31182017-12-16 18:35:29 +00001649def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001650
Gadi Haber323f2e12017-10-24 20:19:47 +00001651def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1652 let Latency = 29;
1653 let NumMicroOps = 27;
1654 let ResourceCycles = [1,5,1,1,19];
1655}
1656def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1657
1658def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1659 let Latency = 30;
1660 let NumMicroOps = 28;
1661 let ResourceCycles = [1,6,1,1,19];
1662}
Craig Topper2d451e72018-03-18 08:38:06 +00001663def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001664
Gadi Haber323f2e12017-10-24 20:19:47 +00001665def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1666 let Latency = 34;
1667 let NumMicroOps = 8;
1668 let ResourceCycles = [2,2,2,1,1];
1669}
Craig Topper13a16502018-03-19 00:56:09 +00001670def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001671
1672def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
1673 let Latency = 34;
1674 let NumMicroOps = 23;
1675 let ResourceCycles = [1,5,3,4,10];
1676}
Craig Topper5a69a002018-03-21 06:28:42 +00001677def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
1678 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001679
1680def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1681 let Latency = 35;
1682 let NumMicroOps = 8;
1683 let ResourceCycles = [2,2,2,1,1];
1684}
Craig Topper13a16502018-03-19 00:56:09 +00001685def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001686
1687def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1688 let Latency = 35;
1689 let NumMicroOps = 23;
1690 let ResourceCycles = [1,5,2,1,4,10];
1691}
Craig Topper5a69a002018-03-21 06:28:42 +00001692def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
1693 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001694
Gadi Haber323f2e12017-10-24 20:19:47 +00001695def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
1696 let Latency = 42;
1697 let NumMicroOps = 22;
1698 let ResourceCycles = [2,20];
1699}
Craig Topper2d451e72018-03-18 08:38:06 +00001700def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001701
1702def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
1703 let Latency = 60;
1704 let NumMicroOps = 64;
1705 let ResourceCycles = [2,2,8,1,10,2,39];
1706}
1707def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001708
1709def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1710 let Latency = 63;
1711 let NumMicroOps = 88;
1712 let ResourceCycles = [4,4,31,1,2,1,45];
1713}
Craig Topper2d451e72018-03-18 08:38:06 +00001714def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001715
1716def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1717 let Latency = 63;
1718 let NumMicroOps = 90;
1719 let ResourceCycles = [4,2,33,1,2,1,47];
1720}
Craig Topper2d451e72018-03-18 08:38:06 +00001721def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001722
1723def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
1724 let Latency = 75;
1725 let NumMicroOps = 15;
1726 let ResourceCycles = [6,3,6];
1727}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00001728def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001729
1730def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
1731 let Latency = 80;
1732 let NumMicroOps = 32;
1733 let ResourceCycles = [7,7,3,3,1,11];
1734}
1735def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
1736
1737def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
1738 let Latency = 115;
1739 let NumMicroOps = 100;
1740 let ResourceCycles = [9,9,11,8,1,11,21,30];
1741}
1742def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001743
1744} // SchedModel
1745