blob: 4549856acb43f8cd2178ce8900c9f46f09196fae [file] [log] [blame]
Gadi Haber323f2e12017-10-24 20:19:47 +00001//=- X86SchedBroadwell.td - X86 Broadwell Scheduling ---------*- tablegen -*-=//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the machine model for Broadwell to support instruction
11// scheduling and other instruction cost heuristics.
12//
13//===----------------------------------------------------------------------===//
Clement Courbet0f1da8f2018-05-02 13:54:38 +000014
Gadi Haber323f2e12017-10-24 20:19:47 +000015def BroadwellModel : SchedMachineModel {
Simon Pilgrimf7d2a932018-04-24 13:21:41 +000016 // All x86 instructions are modeled as a single micro-op, and BW can decode 4
Gadi Haber323f2e12017-10-24 20:19:47 +000017 // instructions per cycle.
18 let IssueWidth = 4;
19 let MicroOpBufferSize = 192; // Based on the reorder buffer.
20 let LoadLatency = 5;
21 let MispredictPenalty = 16;
22
23 // Based on the LSD (loop-stream detector) queue size and benchmarking data.
24 let LoopMicroOpBufferSize = 50;
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000025
Simon Pilgrimc21deec2018-03-24 19:37:28 +000026 // This flag is set to allow the scheduler to assign a default model to
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000027 // unrecognized opcodes.
28 let CompleteModel = 0;
Gadi Haber323f2e12017-10-24 20:19:47 +000029}
30
31let SchedModel = BroadwellModel in {
32
33// Broadwell can issue micro-ops to 8 different ports in one cycle.
34
35// Ports 0, 1, 5, and 6 handle all computation.
36// Port 4 gets the data half of stores. Store data can be available later than
37// the store address, but since we don't model the latency of stores, we can
38// ignore that.
39// Ports 2 and 3 are identical. They handle loads and the address half of
40// stores. Port 7 can handle address calculations.
41def BWPort0 : ProcResource<1>;
42def BWPort1 : ProcResource<1>;
43def BWPort2 : ProcResource<1>;
44def BWPort3 : ProcResource<1>;
45def BWPort4 : ProcResource<1>;
46def BWPort5 : ProcResource<1>;
47def BWPort6 : ProcResource<1>;
48def BWPort7 : ProcResource<1>;
49
50// Many micro-ops are capable of issuing on multiple ports.
51def BWPort01 : ProcResGroup<[BWPort0, BWPort1]>;
52def BWPort23 : ProcResGroup<[BWPort2, BWPort3]>;
53def BWPort237 : ProcResGroup<[BWPort2, BWPort3, BWPort7]>;
54def BWPort04 : ProcResGroup<[BWPort0, BWPort4]>;
55def BWPort05 : ProcResGroup<[BWPort0, BWPort5]>;
56def BWPort06 : ProcResGroup<[BWPort0, BWPort6]>;
57def BWPort15 : ProcResGroup<[BWPort1, BWPort5]>;
58def BWPort16 : ProcResGroup<[BWPort1, BWPort6]>;
59def BWPort56 : ProcResGroup<[BWPort5, BWPort6]>;
60def BWPort015 : ProcResGroup<[BWPort0, BWPort1, BWPort5]>;
61def BWPort056 : ProcResGroup<[BWPort0, BWPort5, BWPort6]>;
62def BWPort0156: ProcResGroup<[BWPort0, BWPort1, BWPort5, BWPort6]>;
63
64// 60 Entry Unified Scheduler
65def BWPortAny : ProcResGroup<[BWPort0, BWPort1, BWPort2, BWPort3, BWPort4,
66 BWPort5, BWPort6, BWPort7]> {
67 let BufferSize=60;
68}
69
Simon Pilgrim30c38c32018-03-19 14:46:07 +000070// Integer division issued on port 0.
Craig Topper8104f262018-04-02 05:33:28 +000071def BWDivider : ProcResource<1>;
72// FP division and sqrt on port 0.
73def BWFPDivider : ProcResource<1>;
Simon Pilgrim30c38c32018-03-19 14:46:07 +000074
Gadi Haber323f2e12017-10-24 20:19:47 +000075// Loads are 5 cycles, so ReadAfterLd registers needn't be available until 5
76// cycles after the memory operand.
77def : ReadAdvance<ReadAfterLd, 5>;
78
79// Many SchedWrites are defined in pairs with and without a folded load.
80// Instructions with folded loads are usually micro-fused, so they only appear
81// as two micro-ops when queued in the reservation station.
82// This multiclass defines the resource usage for variants with and without
83// folded loads.
84multiclass BWWriteResPair<X86FoldableSchedWrite SchedRW,
Simon Pilgrim30c38c32018-03-19 14:46:07 +000085 list<ProcResourceKind> ExePorts,
Simon Pilgrime3547af2018-03-25 10:21:19 +000086 int Lat, list<int> Res = [1], int UOps = 1,
87 int LoadLat = 5> {
Gadi Haber323f2e12017-10-24 20:19:47 +000088 // Register variant is using a single cycle on ExePort.
Simon Pilgrim30c38c32018-03-19 14:46:07 +000089 def : WriteRes<SchedRW, ExePorts> {
90 let Latency = Lat;
91 let ResourceCycles = Res;
92 let NumMicroOps = UOps;
93 }
Gadi Haber323f2e12017-10-24 20:19:47 +000094
Simon Pilgrime3547af2018-03-25 10:21:19 +000095 // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to
96 // the latency (default = 5).
Simon Pilgrim30c38c32018-03-19 14:46:07 +000097 def : WriteRes<SchedRW.Folded, !listconcat([BWPort23], ExePorts)> {
Simon Pilgrime3547af2018-03-25 10:21:19 +000098 let Latency = !add(Lat, LoadLat);
Simon Pilgrim30c38c32018-03-19 14:46:07 +000099 let ResourceCycles = !listconcat([1], Res);
Simon Pilgrime3547af2018-03-25 10:21:19 +0000100 let NumMicroOps = !add(UOps, 1);
Gadi Haber323f2e12017-10-24 20:19:47 +0000101 }
102}
103
Craig Topperf131b602018-04-06 16:16:46 +0000104// A folded store needs a cycle on port 4 for the store data, and an extra port
105// 2/3/7 cycle to recompute the address.
106def : WriteRes<WriteRMW, [BWPort237,BWPort4]>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000107
108// Arithmetic.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000109defm : BWWriteResPair<WriteALU, [BWPort0156], 1>; // Simple integer ALU op.
110defm : BWWriteResPair<WriteIMul, [BWPort1], 3>; // Integer multiplication.
111defm : BWWriteResPair<WriteIDiv, [BWPort0, BWDivider], 25, [1, 10]>;
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000112defm : BWWriteResPair<WriteCRC32, [BWPort1], 3>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000113def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, high part.
Gadi Haber323f2e12017-10-24 20:19:47 +0000114
115def : WriteRes<WriteLEA, [BWPort15]>; // LEA instructions can't fold loads.
116
Craig Topperb7baa352018-04-08 17:53:18 +0000117defm : BWWriteResPair<WriteCMOV, [BWPort06], 1>; // Conditional move.
118def : WriteRes<WriteSETCC, [BWPort06]>; // Setcc.
119def : WriteRes<WriteSETCCStore, [BWPort06,BWPort4,BWPort237]> {
120 let Latency = 2;
121 let NumMicroOps = 3;
122}
123
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000124// Bit counts.
125defm : BWWriteResPair<WriteBitScan, [BWPort1], 3>;
126defm : BWWriteResPair<WriteLZCNT, [BWPort1], 3>;
127defm : BWWriteResPair<WriteTZCNT, [BWPort1], 3>;
128defm : BWWriteResPair<WritePOPCNT, [BWPort1], 3>;
129
Gadi Haber323f2e12017-10-24 20:19:47 +0000130// Integer shifts and rotates.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000131defm : BWWriteResPair<WriteShift, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000132
Craig Topper89310f52018-03-29 20:41:39 +0000133// BMI1 BEXTR, BMI2 BZHI
134defm : BWWriteResPair<WriteBEXTR, [BWPort06,BWPort15], 2, [1,1], 2>;
135defm : BWWriteResPair<WriteBZHI, [BWPort15], 1>;
136
Gadi Haber323f2e12017-10-24 20:19:47 +0000137// Loads, stores, and moves, not folded with other operations.
138def : WriteRes<WriteLoad, [BWPort23]> { let Latency = 5; }
139def : WriteRes<WriteStore, [BWPort237, BWPort4]>;
140def : WriteRes<WriteMove, [BWPort0156]>;
141
142// Idioms that clear a register, like xorps %xmm0, %xmm0.
143// These can often bypass execution ports completely.
144def : WriteRes<WriteZero, []>;
145
Sanjoy Das1074eb22017-12-12 19:11:31 +0000146// Treat misc copies as a move.
147def : InstRW<[WriteMove], (instrs COPY)>;
148
Gadi Haber323f2e12017-10-24 20:19:47 +0000149// Branches don't produce values, so they have no latency, but they still
150// consume resources. Indirect branches can fold loads.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000151defm : BWWriteResPair<WriteJump, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000152
153// Floating point. This covers both scalar and vector operations.
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000154defm : X86WriteRes<WriteFLoad, [BWPort23], 5, [1], 1>;
155defm : X86WriteRes<WriteFMaskedLoad, [BWPort23,BWPort5], 7, [1,2], 3>;
156defm : X86WriteRes<WriteFMaskedLoadY, [BWPort23,BWPort5], 8, [1,2], 3>;
157defm : X86WriteRes<WriteFStore, [BWPort237,BWPort4], 1, [1,1], 1>;
158defm : X86WriteRes<WriteFMaskedStore, [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
159defm : X86WriteRes<WriteFMaskedStoreY, [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
160defm : X86WriteRes<WriteFMove, [BWPort5], 1, [1], 1>;
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000161
Simon Pilgrim1233e122018-05-07 20:52:53 +0000162defm : BWWriteResPair<WriteFAdd, [BWPort1], 3, [1], 1, 5>; // Floating point add/sub.
163defm : BWWriteResPair<WriteFAddX, [BWPort1], 3, [1], 1, 5>; // Floating point add/sub (XMM).
164defm : BWWriteResPair<WriteFAddY, [BWPort1], 3, [1], 1, 6>; // Floating point add/sub (YMM/ZMM).
165defm : BWWriteResPair<WriteFAdd64, [BWPort1], 3, [1], 1, 5>; // Floating point double add/sub.
166defm : BWWriteResPair<WriteFAdd64X, [BWPort1], 3, [1], 1, 5>; // Floating point double add/sub (XMM).
167defm : BWWriteResPair<WriteFAdd64Y, [BWPort1], 3, [1], 1, 6>; // Floating point double add/sub (YMM/ZMM).
168
169defm : BWWriteResPair<WriteFCmp, [BWPort1], 3, [1], 1, 5>; // Floating point compare.
170defm : BWWriteResPair<WriteFCmpX, [BWPort1], 3, [1], 1, 5>; // Floating point compare (XMM).
171defm : BWWriteResPair<WriteFCmpY, [BWPort1], 3, [1], 1, 6>; // Floating point compare (YMM/ZMM).
172defm : BWWriteResPair<WriteFCmp64, [BWPort1], 3, [1], 1, 5>; // Floating point double compare.
173defm : BWWriteResPair<WriteFCmp64X, [BWPort1], 3, [1], 1, 5>; // Floating point double compare (XMM).
174defm : BWWriteResPair<WriteFCmp64Y, [BWPort1], 3, [1], 1, 6>; // Floating point double compare (YMM/ZMM).
175
176defm : BWWriteResPair<WriteFCom, [BWPort1], 3>; // Floating point compare to flags.
177
178defm : BWWriteResPair<WriteFMul, [BWPort01], 3, [1], 1, 5>; // Floating point multiplication.
179defm : BWWriteResPair<WriteFMulX, [BWPort01], 3, [1], 1, 5>; // Floating point multiplication (XMM).
180defm : BWWriteResPair<WriteFMulY, [BWPort01], 3, [1], 1, 6>; // Floating point multiplication (YMM/ZMM).
181defm : BWWriteResPair<WriteFMul64, [BWPort01], 3, [1], 1, 5>; // Floating point double multiplication.
182defm : BWWriteResPair<WriteFMul64X, [BWPort01], 3, [1], 1, 5>; // Floating point double multiplication (XMM).
183defm : BWWriteResPair<WriteFMul64Y, [BWPort01], 3, [1], 1, 6>; // Floating point double multiplication (YMM/ZMM).
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000184
185//defm : BWWriteResPair<WriteFDiv, [BWPort0,BWFPDivider], 11, [1,3], 1, 5>; // Floating point division.
186defm : BWWriteResPair<WriteFDivX, [BWPort0,BWFPDivider], 11, [1,5], 1, 5>; // Floating point division (XMM).
187defm : BWWriteResPair<WriteFDivY, [BWPort0,BWPort015,BWFPDivider], 17, [2,1,10], 3, 6>; // Floating point division (YMM).
188defm : BWWriteResPair<WriteFDivZ, [BWPort0,BWPort015,BWFPDivider], 17, [2,1,10], 3, 6>; // Floating point division (ZMM).
189//defm : BWWriteResPair<WriteFDiv64, [BWPort0,BWFPDivider], 14, [1,8], 1, 5>; // Floating point division.
190defm : BWWriteResPair<WriteFDiv64X, [BWPort0,BWFPDivider], 14, [1,8], 1, 5>; // Floating point division (XMM).
191defm : BWWriteResPair<WriteFDiv64Y, [BWPort0,BWPort015,BWFPDivider], 23, [2,1,16], 3, 6>; // Floating point division (YMM).
192defm : BWWriteResPair<WriteFDiv64Z, [BWPort0,BWPort015,BWFPDivider], 23, [2,1,16], 3, 6>; // Floating point division (ZMM).
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000193
194defm : X86WriteRes<WriteFSqrt, [BWPort0,BWFPDivider], 11, [1,4], 1>; // Floating point square root.
195defm : X86WriteRes<WriteFSqrtLd, [BWPort0,BWPort23,BWFPDivider], 16, [1,1,7], 2>;
196defm : BWWriteResPair<WriteFSqrtX, [BWPort0,BWFPDivider], 11, [1,7], 1, 5>; // Floating point square root (XMM).
197defm : BWWriteResPair<WriteFSqrtY, [BWPort0,BWPort015,BWFPDivider], 21, [2,1,14], 3, 6>; // Floating point square root (YMM).
198defm : BWWriteResPair<WriteFSqrtZ, [BWPort0,BWPort015,BWFPDivider], 21, [2,1,14], 3, 6>; // Floating point square root (ZMM).
199defm : X86WriteRes<WriteFSqrt64, [BWPort0,BWFPDivider], 16, [1,8], 1>; // Floating point double square root.
200defm : X86WriteRes<WriteFSqrt64Ld, [BWPort0,BWPort23,BWFPDivider], 21, [1,1,14], 2>;
201defm : BWWriteResPair<WriteFSqrt64X, [BWPort0,BWFPDivider], 16, [1,14],1, 5>; // Floating point double square root (XMM).
202defm : BWWriteResPair<WriteFSqrt64Y, [BWPort0,BWPort015,BWFPDivider], 29, [2,1,28], 3, 6>; // Floating point double square root (YMM).
203defm : BWWriteResPair<WriteFSqrt64Z, [BWPort0,BWPort015,BWFPDivider], 29, [2,1,28], 3, 6>; // Floating point double square root (ZMM).
204defm : BWWriteResPair<WriteFSqrt80, [BWPort0,BWFPDivider], 23, [1,9]>; // Floating point long double square root.
205
Simon Pilgrimc7088682018-05-01 18:06:07 +0000206defm : BWWriteResPair<WriteFRcp, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000207defm : BWWriteResPair<WriteFRcpX, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal estimate (XMM).
208defm : BWWriteResPair<WriteFRcpY, [BWPort0,BWPort015], 11, [2,1], 3, 6>; // Floating point reciprocal estimate (YMM/ZMM).
209
Simon Pilgrimc7088682018-05-01 18:06:07 +0000210defm : BWWriteResPair<WriteFRsqrt, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal square root estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000211defm : BWWriteResPair<WriteFRsqrtX,[BWPort0], 5, [1], 1, 5>; // Floating point reciprocal square root estimate (XMM).
212defm : BWWriteResPair<WriteFRsqrtY,[BWPort0,BWPort015], 11, [2,1], 3, 6>; // Floating point reciprocal square root estimate (YMM/ZMM).
213
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000214defm : BWWriteResPair<WriteFMA, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add.
Simon Pilgrim67cc2462018-05-04 15:20:18 +0000215defm : BWWriteResPair<WriteFMAX, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add (XMM).
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000216defm : BWWriteResPair<WriteFMAY, [BWPort01], 5, [1], 1, 6>; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000217defm : BWWriteResPair<WriteDPPD, [BWPort0,BWPort1,BWPort5], 9, [1,1,1], 3, 5>; // Floating point double dot product.
218defm : BWWriteResPair<WriteDPPS, [BWPort0,BWPort1,BWPort5], 14, [2,1,1], 4, 5>; // Floating point single dot product.
219defm : BWWriteResPair<WriteDPPSY, [BWPort0,BWPort1,BWPort5], 14, [2,1,1], 4, 6>; // Floating point single dot product (YMM).
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000220defm : BWWriteResPair<WriteFSign, [BWPort5], 1>; // Floating point fabs/fchs.
221defm : X86WriteRes<WriteFRnd, [BWPort23], 6, [1], 1>; // Floating point rounding.
222defm : X86WriteRes<WriteFRndY, [BWPort23], 6, [1], 1>; // Floating point rounding (YMM/ZMM).
223defm : X86WriteRes<WriteFRndLd, [BWPort1,BWPort23], 11, [2,1], 3>;
224defm : X86WriteRes<WriteFRndYLd, [BWPort1,BWPort23], 12, [2,1], 3>;
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000225defm : BWWriteResPair<WriteFLogic, [BWPort5], 1, [1], 1, 5>; // Floating point and/or/xor logicals.
226defm : BWWriteResPair<WriteFLogicY, [BWPort5], 1, [1], 1, 6>; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000227defm : BWWriteResPair<WriteFTest, [BWPort0], 1, [1], 1, 5>; // Floating point TEST instructions.
228defm : BWWriteResPair<WriteFTestY, [BWPort0], 1, [1], 1, 6>; // Floating point TEST instructions (YMM/ZMM).
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000229defm : BWWriteResPair<WriteFShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector shuffles.
230defm : BWWriteResPair<WriteFShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000231defm : BWWriteResPair<WriteFVarShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector variable shuffles.
232defm : BWWriteResPair<WriteFVarShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
233defm : BWWriteResPair<WriteFBlend, [BWPort015], 1, [1], 1, 5>; // Floating point vector blends.
234defm : BWWriteResPair<WriteFBlendY, [BWPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000235defm : BWWriteResPair<WriteFVarBlend, [BWPort5], 2, [2], 2, 5>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000236defm : BWWriteResPair<WriteFVarBlendY, [BWPort5], 2, [2], 2, 6>; // Fp vector variable blends.
Gadi Haber323f2e12017-10-24 20:19:47 +0000237
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000238def : WriteRes<WriteCvtF2FSt, [BWPort1,BWPort4,BWPort237]> {
239 let Latency = 4;
240 let NumMicroOps = 3;
241 let ResourceCycles = [1,1,1];
242}
243
Gadi Haber323f2e12017-10-24 20:19:47 +0000244// FMA Scheduling helper class.
245// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
246
247// Vector integer operations.
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000248defm : X86WriteRes<WriteVecLoad, [BWPort23], 5, [1], 1>;
249defm : X86WriteRes<WriteVecMaskedLoad, [BWPort23,BWPort5], 7, [1,2], 3>;
250defm : X86WriteRes<WriteVecMaskedLoadY, [BWPort23,BWPort5], 8, [1,2], 3>;
251defm : X86WriteRes<WriteVecStore, [BWPort237,BWPort4], 1, [1,1], 1>;
252defm : X86WriteRes<WriteVecMaskedStore, [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
253defm : X86WriteRes<WriteVecMaskedStoreY, [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
254defm : X86WriteRes<WriteVecMove, [BWPort015], 1, [1], 1>;
255defm : X86WriteRes<WriteEMMS, [BWPort01,BWPort15,BWPort015,BWPort0156], 31, [8,1,21,1], 31>;
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000256
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000257defm : BWWriteResPair<WriteVecALU, [BWPort15], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
258defm : BWWriteResPair<WriteVecALUY, [BWPort15], 1, [1], 1, 6>; // Vector integer ALU op, no logicals (YMM/ZMM).
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000259defm : BWWriteResPair<WriteVecLogic, [BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
260defm : BWWriteResPair<WriteVecLogicY,[BWPort015], 1, [1], 1, 6>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000261defm : BWWriteResPair<WriteVecTest, [BWPort0,BWPort5], 2, [1,1], 2, 5>; // Vector integer TEST instructions.
262defm : BWWriteResPair<WriteVecTestY, [BWPort0,BWPort5], 4, [1,1], 2, 6>; // Vector integer TEST instructions (YMM/ZMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000263defm : BWWriteResPair<WriteVecIMul, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000264defm : BWWriteResPair<WriteVecIMulX, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000265defm : BWWriteResPair<WriteVecIMulY, [BWPort0], 5, [1], 1, 6>; // Vector integer multiply.
266defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // Vector PMULLD.
267defm : BWWriteResPair<WritePMULLDY, [BWPort0], 10, [2], 2, 6>; // Vector PMULLD (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000268defm : BWWriteResPair<WriteShuffle, [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000269defm : BWWriteResPair<WriteShuffleY, [BWPort5], 1, [1], 1, 6>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000270defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000271defm : BWWriteResPair<WriteVarShuffleY,[BWPort5], 1, [1], 1, 6>; // Vector variable shuffles (YMM/ZMM).
272defm : BWWriteResPair<WriteBlend, [BWPort5], 1, [1], 1, 5>; // Vector blends.
273defm : BWWriteResPair<WriteBlendY, [BWPort5], 1, [1], 1, 6>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000274defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000275defm : BWWriteResPair<WriteVarBlendY, [BWPort5], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000276defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000277defm : BWWriteResPair<WriteMPSADY, [BWPort0, BWPort5], 7, [1, 2], 3, 6>; // Vector MPSAD.
278defm : BWWriteResPair<WritePSADBW, [BWPort0], 5, [1], 1, 5>; // Vector PSADBW.
279defm : BWWriteResPair<WritePSADBWY, [BWPort0], 5, [1], 1, 6>; // Vector PSADBW (YMM/ZMM).
280defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000281
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000282// Vector integer shifts.
283defm : BWWriteResPair<WriteVecShift, [BWPort0], 1, [1], 1, 5>;
284defm : BWWriteResPair<WriteVecShiftX, [BWPort0,BWPort5], 2, [1,1], 2, 5>;
285defm : X86WriteRes<WriteVecShiftY, [BWPort0,BWPort5], 4, [1,1], 2>;
286defm : X86WriteRes<WriteVecShiftYLd, [BWPort0,BWPort23], 7, [1,1], 2>;
287
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000288defm : BWWriteResPair<WriteVecShiftImm, [BWPort0], 1, [1], 1, 5>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000289defm : BWWriteResPair<WriteVecShiftImmX, [BWPort0], 1, [1], 1, 5>; // Vector integer immediate shifts (XMM).
290defm : BWWriteResPair<WriteVecShiftImmY, [BWPort0], 1, [1], 1, 6>; // Vector integer immediate shifts (YMM/ZMM).
291defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 3, [2,1], 3, 5>; // Variable vector shifts.
292defm : BWWriteResPair<WriteVarVecShiftY, [BWPort0, BWPort5], 3, [2,1], 3, 6>; // Variable vector shifts (YMM/ZMM).
293
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000294// Vector insert/extract operations.
295def : WriteRes<WriteVecInsert, [BWPort5]> {
296 let Latency = 2;
297 let NumMicroOps = 2;
298 let ResourceCycles = [2];
299}
300def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
301 let Latency = 6;
302 let NumMicroOps = 2;
303}
304
305def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
306 let Latency = 2;
307 let NumMicroOps = 2;
308}
309def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
310 let Latency = 2;
311 let NumMicroOps = 3;
312}
313
Gadi Haber323f2e12017-10-24 20:19:47 +0000314// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000315defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
316defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
317defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000318
319// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000320
Gadi Haber323f2e12017-10-24 20:19:47 +0000321// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000322def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000323 let Latency = 11;
324 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000325 let ResourceCycles = [3];
326}
327def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000328 let Latency = 16;
329 let NumMicroOps = 4;
330 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000331}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000332
333// Packed Compare Explicit Length Strings, Return Mask
334def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
335 let Latency = 19;
336 let NumMicroOps = 9;
337 let ResourceCycles = [4,3,1,1];
338}
339def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
340 let Latency = 24;
341 let NumMicroOps = 10;
342 let ResourceCycles = [4,3,1,1,1];
343}
344
345// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000346def : WriteRes<WritePCmpIStrI, [BWPort0]> {
347 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000348 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000349 let ResourceCycles = [3];
350}
351def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000352 let Latency = 16;
353 let NumMicroOps = 4;
354 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000355}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000356
357// Packed Compare Explicit Length Strings, Return Index
358def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
359 let Latency = 18;
360 let NumMicroOps = 8;
361 let ResourceCycles = [4,3,1];
362}
363def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
364 let Latency = 23;
365 let NumMicroOps = 9;
366 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000367}
368
Simon Pilgrima2f26782018-03-27 20:38:54 +0000369// MOVMSK Instructions.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000370def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
371def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
372def : WriteRes<WriteVecMOVMSKY, [BWPort0]> { let Latency = 3; }
373def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
Simon Pilgrima2f26782018-03-27 20:38:54 +0000374
Gadi Haber323f2e12017-10-24 20:19:47 +0000375// AES instructions.
376def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
377 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000378 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000379 let ResourceCycles = [1];
380}
381def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000382 let Latency = 12;
383 let NumMicroOps = 2;
384 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000385}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000386
Gadi Haber323f2e12017-10-24 20:19:47 +0000387def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
388 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000389 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000390 let ResourceCycles = [2];
391}
392def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000393 let Latency = 19;
394 let NumMicroOps = 3;
395 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000396}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000397
398def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
399 let Latency = 29;
400 let NumMicroOps = 11;
401 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000402}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000403def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
404 let Latency = 33;
405 let NumMicroOps = 11;
406 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000407}
408
409// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000410defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000411
412// Catch-all for expensive system instructions.
413def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
414
415// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000416defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
417defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
418defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
419defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
Gadi Haber323f2e12017-10-24 20:19:47 +0000420
421// Old microcoded instructions that nobody use.
422def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
423
424// Fence instructions.
425def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
426
Craig Topper05242bf2018-04-21 18:07:36 +0000427// Load/store MXCSR.
428def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
429def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
430
Gadi Haber323f2e12017-10-24 20:19:47 +0000431// Nop, not very useful expect it provides a model for nops!
432def : WriteRes<WriteNop, []>;
433
434////////////////////////////////////////////////////////////////////////////////
435// Horizontal add/sub instructions.
436////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000437
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000438defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3, 5>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000439defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000440defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3, 5>;
441defm : BWWriteResPair<WritePHAddY, [BWPort5,BWPort15], 3, [2,1], 3, 6>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000442
443// Remaining instrs.
444
445def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
446 let Latency = 1;
447 let NumMicroOps = 1;
448 let ResourceCycles = [1];
449}
Craig Topper5a69a002018-03-21 06:28:42 +0000450def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
451 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000452 "(V?)MOVPDI2DIrr",
453 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000454 "VPSLLVQ(Y?)rr",
Simon Pilgrim210286e2018-05-08 10:28:03 +0000455 "VPSRLVQ(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000456
457def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
458 let Latency = 1;
459 let NumMicroOps = 1;
460 let ResourceCycles = [1];
461}
Craig Topper5a69a002018-03-21 06:28:42 +0000462def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
463 "COM_FST0r",
464 "UCOM_FPr",
465 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000466
467def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
468 let Latency = 1;
469 let NumMicroOps = 1;
470 let ResourceCycles = [1];
471}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000472def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000473 "MMX_MOVD64to64rr",
474 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000475 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000476 "(V?)MOVDI2PDIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000477
478def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
479 let Latency = 1;
480 let NumMicroOps = 1;
481 let ResourceCycles = [1];
482}
483def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
484
485def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
486 let Latency = 1;
487 let NumMicroOps = 1;
488 let ResourceCycles = [1];
489}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000490def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000491
492def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
493 let Latency = 1;
494 let NumMicroOps = 1;
495 let ResourceCycles = [1];
496}
Craig Topperfbe31322018-04-05 21:56:19 +0000497def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000498def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
499 "ADC(16|32|64)i",
500 "ADC(8|16|32|64)rr",
501 "ADCX(32|64)rr",
502 "ADOX(32|64)rr",
503 "BT(16|32|64)ri8",
504 "BT(16|32|64)rr",
505 "BTC(16|32|64)ri8",
506 "BTC(16|32|64)rr",
507 "BTR(16|32|64)ri8",
508 "BTR(16|32|64)rr",
509 "BTS(16|32|64)ri8",
510 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000511 "SBB(16|32|64)ri",
512 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000513 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000514
515def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
516 let Latency = 1;
517 let NumMicroOps = 1;
518 let ResourceCycles = [1];
519}
Craig Topper5a69a002018-03-21 06:28:42 +0000520def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
521 "BLSI(32|64)rr",
522 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000523 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000524
525def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
526 let Latency = 1;
527 let NumMicroOps = 1;
528 let ResourceCycles = [1];
529}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000530def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000531 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000532
533def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
534 let Latency = 1;
535 let NumMicroOps = 1;
536 let ResourceCycles = [1];
537}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000538def: InstRW<[BWWriteResGroup9], (instrs LAHF, SAHF)>; // TODO: This doesnt match Agner's data
539def: InstRW<[BWWriteResGroup9], (instregex "NOOP",
Craig Topper5a69a002018-03-21 06:28:42 +0000540 "SGDT64m",
541 "SIDT64m",
Craig Topper5a69a002018-03-21 06:28:42 +0000542 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000543 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000544 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000545
546def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
547 let Latency = 1;
548 let NumMicroOps = 2;
549 let ResourceCycles = [1,1];
550}
Craig Topper5a69a002018-03-21 06:28:42 +0000551def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
552 "MMX_MOVD64from64rm",
553 "MMX_MOVD64mr",
554 "MMX_MOVNTQmr",
555 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000556 "MOVNTI_64mr",
557 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000558 "ST_FP(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000559 "VEXTRACTF128mr",
560 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000561 "(V?)MOVAPD(Y?)mr",
562 "(V?)MOVAPS(Y?)mr",
563 "(V?)MOVDQA(Y?)mr",
564 "(V?)MOVDQU(Y?)mr",
565 "(V?)MOVHPDmr",
566 "(V?)MOVHPSmr",
567 "(V?)MOVLPDmr",
568 "(V?)MOVLPSmr",
569 "(V?)MOVNTDQ(V?)mr",
570 "(V?)MOVNTPD(V?)mr",
571 "(V?)MOVNTPS(V?)mr",
572 "(V?)MOVPDI2DImr",
573 "(V?)MOVPQI2QImr",
574 "(V?)MOVPQIto64mr",
575 "(V?)MOVSDmr",
576 "(V?)MOVSSmr",
577 "(V?)MOVUPD(Y?)mr",
578 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000579
Gadi Haber323f2e12017-10-24 20:19:47 +0000580def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
581 let Latency = 2;
582 let NumMicroOps = 2;
583 let ResourceCycles = [2];
584}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000585def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000586
587def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
588 let Latency = 2;
589 let NumMicroOps = 2;
590 let ResourceCycles = [2];
591}
Craig Topper5a69a002018-03-21 06:28:42 +0000592def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
593 "ROL(8|16|32|64)ri",
594 "ROR(8|16|32|64)r1",
595 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000596
597def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
598 let Latency = 2;
599 let NumMicroOps = 2;
600 let ResourceCycles = [2];
601}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000602def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
603 MFENCE,
604 WAIT,
605 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000606
607def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
608 let Latency = 2;
609 let NumMicroOps = 2;
610 let ResourceCycles = [1,1];
611}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000612def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000613 "(V?)CVTPS2PDrr",
Simon Pilgrim210286e2018-05-08 10:28:03 +0000614 "(V?)CVTSS2SDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000615
616def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
617 let Latency = 2;
618 let NumMicroOps = 2;
619 let ResourceCycles = [1,1];
620}
621def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
622
623def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
624 let Latency = 2;
625 let NumMicroOps = 2;
626 let ResourceCycles = [1,1];
627}
628def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
629
630def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
631 let Latency = 2;
632 let NumMicroOps = 2;
633 let ResourceCycles = [1,1];
634}
635def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
636
637def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
638 let Latency = 2;
639 let NumMicroOps = 2;
640 let ResourceCycles = [1,1];
641}
Craig Topper498875f2018-04-04 17:54:19 +0000642def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
643
644def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
645 let Latency = 1;
646 let NumMicroOps = 1;
647 let ResourceCycles = [1];
648}
649def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000650
651def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
652 let Latency = 2;
653 let NumMicroOps = 2;
654 let ResourceCycles = [1,1];
655}
Craig Topper2d451e72018-03-18 08:38:06 +0000656def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000657def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000658def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
659 "ADC8ri",
660 "CMOV(A|BE)(16|32|64)rr",
661 "SBB8i8",
662 "SBB8ri",
663 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000664
Gadi Haber323f2e12017-10-24 20:19:47 +0000665def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
666 let Latency = 2;
667 let NumMicroOps = 3;
668 let ResourceCycles = [1,1,1];
669}
670def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
671
Gadi Haber323f2e12017-10-24 20:19:47 +0000672def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
673 let Latency = 2;
674 let NumMicroOps = 3;
675 let ResourceCycles = [1,1,1];
676}
677def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
678
679def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
680 let Latency = 2;
681 let NumMicroOps = 3;
682 let ResourceCycles = [1,1,1];
683}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000684def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
685 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000686def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000687 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000688
Gadi Haber323f2e12017-10-24 20:19:47 +0000689def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
690 let Latency = 3;
691 let NumMicroOps = 1;
692 let ResourceCycles = [1];
693}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000694def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000695 "PDEP(32|64)rr",
696 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000697 "SHLD(16|32|64)rri8",
698 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000699 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000700
701def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000702 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000703 let NumMicroOps = 2;
704 let ResourceCycles = [1,1];
705}
Clement Courbet327fac42018-03-07 08:14:02 +0000706def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000707
708def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
709 let Latency = 3;
710 let NumMicroOps = 1;
711 let ResourceCycles = [1];
712}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000713def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
Simon Pilgrime480ed02018-05-07 18:25:19 +0000714 "VPBROADCASTWrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000715
Gadi Haber323f2e12017-10-24 20:19:47 +0000716def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000717 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000718 let NumMicroOps = 3;
719 let ResourceCycles = [3];
720}
Craig Topperb5f26592018-04-19 18:00:17 +0000721def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
722 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
723 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000724
Gadi Haber323f2e12017-10-24 20:19:47 +0000725def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
726 let Latency = 3;
727 let NumMicroOps = 3;
728 let ResourceCycles = [2,1];
729}
Craig Topper5a69a002018-03-21 06:28:42 +0000730def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
731 "MMX_PACKSSWBirr",
732 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000733
734def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
735 let Latency = 3;
736 let NumMicroOps = 3;
737 let ResourceCycles = [1,2];
738}
739def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
740
741def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
742 let Latency = 3;
743 let NumMicroOps = 3;
744 let ResourceCycles = [1,2];
745}
Craig Topper5a69a002018-03-21 06:28:42 +0000746def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
747 "RCL(8|16|32|64)ri",
748 "RCR(8|16|32|64)r1",
749 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000750
751def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
752 let Latency = 3;
753 let NumMicroOps = 3;
754 let ResourceCycles = [2,1];
755}
Craig Topper5a69a002018-03-21 06:28:42 +0000756def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
757 "ROR(8|16|32|64)rCL",
758 "SAR(8|16|32|64)rCL",
759 "SHL(8|16|32|64)rCL",
760 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000761
762def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
763 let Latency = 3;
764 let NumMicroOps = 4;
765 let ResourceCycles = [1,1,1,1];
766}
767def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
768
769def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
770 let Latency = 3;
771 let NumMicroOps = 4;
772 let ResourceCycles = [1,1,1,1];
773}
Craig Topper5a69a002018-03-21 06:28:42 +0000774def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
775 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000776
777def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
778 let Latency = 4;
779 let NumMicroOps = 2;
780 let ResourceCycles = [1,1];
781}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000782def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
783 "(V?)CVTSD2SIrr",
784 "(V?)CVTSS2SI64rr",
785 "(V?)CVTSS2SIrr",
786 "(V?)CVTTSD2SI64rr",
787 "(V?)CVTTSD2SIrr",
788 "(V?)CVTTSS2SI64rr",
789 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000790
791def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
792 let Latency = 4;
793 let NumMicroOps = 2;
794 let ResourceCycles = [1,1];
795}
Simon Pilgrim210286e2018-05-08 10:28:03 +0000796def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000797
798def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
799 let Latency = 4;
800 let NumMicroOps = 2;
801 let ResourceCycles = [1,1];
802}
803def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
804
805def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
806 let Latency = 4;
807 let NumMicroOps = 2;
808 let ResourceCycles = [1,1];
809}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000810def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000811def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000812 "MMX_CVTPI2PDirr",
813 "MMX_CVTPS2PIirr",
814 "MMX_CVTTPD2PIirr",
815 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000816 "(V?)CVTDQ2PDrr",
817 "(V?)CVTPD2DQrr",
818 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000819 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000820 "(V?)CVTSD2SSrr",
821 "(V?)CVTSI642SDrr",
822 "(V?)CVTSI2SDrr",
823 "(V?)CVTSI2SSrr",
824 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000825
826def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
827 let Latency = 4;
828 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000829 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000830}
Craig Topper5a69a002018-03-21 06:28:42 +0000831def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000832
833def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
834 let Latency = 4;
835 let NumMicroOps = 3;
836 let ResourceCycles = [1,1,1];
837}
838def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
839
840def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
841 let Latency = 4;
842 let NumMicroOps = 3;
843 let ResourceCycles = [1,1,1];
844}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000845def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
846 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000847
848def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
849 let Latency = 4;
850 let NumMicroOps = 4;
851 let ResourceCycles = [4];
852}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000853def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000854
855def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
856 let Latency = 4;
857 let NumMicroOps = 4;
858 let ResourceCycles = [1,3];
859}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000860def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000861
862def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
863 let Latency = 5;
864 let NumMicroOps = 1;
865 let ResourceCycles = [1];
866}
Simon Pilgrima53d3302018-05-02 16:16:24 +0000867def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr",
868 "MUL_FPrST0",
869 "MUL_FST0r",
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000870 "MUL_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000871
Gadi Haber323f2e12017-10-24 20:19:47 +0000872def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
873 let Latency = 5;
874 let NumMicroOps = 1;
875 let ResourceCycles = [1];
876}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000877def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000878 "MOVSX(16|32|64)rm32",
879 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000880 "MOVZX(16|32|64)rm16",
881 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000882 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000883 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000884 "(V?)MOVSHDUPrm",
885 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000886 "VPBROADCASTDrm",
887 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000888
889def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
890 let Latency = 5;
891 let NumMicroOps = 3;
892 let ResourceCycles = [1,2];
893}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000894def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000895
896def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
897 let Latency = 5;
898 let NumMicroOps = 3;
899 let ResourceCycles = [1,1,1];
900}
901def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
902
903def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000904 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000905 let NumMicroOps = 3;
906 let ResourceCycles = [1,1,1];
907}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000908def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000909
Gadi Haber323f2e12017-10-24 20:19:47 +0000910def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
911 let Latency = 5;
912 let NumMicroOps = 5;
913 let ResourceCycles = [1,4];
914}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000915def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000916
917def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
918 let Latency = 5;
919 let NumMicroOps = 5;
920 let ResourceCycles = [1,4];
921}
922def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
923
924def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
925 let Latency = 5;
926 let NumMicroOps = 5;
927 let ResourceCycles = [2,3];
928}
Craig Topper5a69a002018-03-21 06:28:42 +0000929def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000930
931def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
932 let Latency = 5;
933 let NumMicroOps = 6;
934 let ResourceCycles = [1,1,4];
935}
Craig Topper5a69a002018-03-21 06:28:42 +0000936def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000937
938def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
939 let Latency = 6;
940 let NumMicroOps = 1;
941 let ResourceCycles = [1];
942}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000943def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000944 "VBROADCASTF128",
945 "VBROADCASTI128",
946 "VBROADCASTSDYrm",
947 "VBROADCASTSSYrm",
948 "VLDDQUYrm",
949 "VMOVAPDYrm",
950 "VMOVAPSYrm",
951 "VMOVDDUPYrm",
952 "VMOVDQAYrm",
953 "VMOVDQUYrm",
954 "VMOVNTDQAYrm",
955 "VMOVSHDUPYrm",
956 "VMOVSLDUPYrm",
957 "VMOVUPDYrm",
958 "VMOVUPSYrm",
959 "VPBROADCASTDYrm",
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000960 "VPBROADCASTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000961
962def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
963 let Latency = 6;
964 let NumMicroOps = 2;
965 let ResourceCycles = [1,1];
966}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000967def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000968 "(V?)CVTPS2PDrm",
969 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000970 "VPSLLVQrm",
Simon Pilgrim210286e2018-05-08 10:28:03 +0000971 "VPSRLVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000972
973def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
974 let Latency = 6;
975 let NumMicroOps = 2;
976 let ResourceCycles = [1,1];
977}
Craig Topper5a69a002018-03-21 06:28:42 +0000978def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
979 "VCVTPD2DQYrr",
980 "VCVTPD2PSYrr",
981 "VCVTPS2PHYrr",
982 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000983
Gadi Haber323f2e12017-10-24 20:19:47 +0000984def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
985 let Latency = 6;
986 let NumMicroOps = 2;
987 let ResourceCycles = [1,1];
988}
Craig Topper5a69a002018-03-21 06:28:42 +0000989def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
990 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000991
992def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
993 let Latency = 6;
994 let NumMicroOps = 2;
995 let ResourceCycles = [1,1];
996}
Craig Topperdfccafe2018-04-18 06:41:25 +0000997def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +0000998def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
999 ADCX32rm, ADCX64rm,
1000 ADOX32rm, ADOX64rm,
1001 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001002
1003def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
1004 let Latency = 6;
1005 let NumMicroOps = 2;
1006 let ResourceCycles = [1,1];
1007}
Craig Topper5a69a002018-03-21 06:28:42 +00001008def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
1009 "BLSI(32|64)rm",
1010 "BLSMSK(32|64)rm",
1011 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001012 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001013
1014def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
1015 let Latency = 6;
1016 let NumMicroOps = 2;
1017 let ResourceCycles = [1,1];
1018}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001019def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +00001020 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001021 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001022
1023def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1024 let Latency = 6;
1025 let NumMicroOps = 2;
1026 let ResourceCycles = [1,1];
1027}
Craig Topper2d451e72018-03-18 08:38:06 +00001028def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001029def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001030
1031def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1032 let Latency = 6;
1033 let NumMicroOps = 4;
1034 let ResourceCycles = [1,1,2];
1035}
Craig Topper5a69a002018-03-21 06:28:42 +00001036def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1037 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001038
1039def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1040 let Latency = 6;
1041 let NumMicroOps = 4;
1042 let ResourceCycles = [1,1,1,1];
1043}
1044def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1045
1046def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1047 let Latency = 6;
1048 let NumMicroOps = 4;
1049 let ResourceCycles = [1,1,1,1];
1050}
Craig Topper5a69a002018-03-21 06:28:42 +00001051def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1052 "BTR(16|32|64)mi8",
1053 "BTS(16|32|64)mi8",
1054 "SAR(8|16|32|64)m1",
1055 "SAR(8|16|32|64)mi",
1056 "SHL(8|16|32|64)m1",
1057 "SHL(8|16|32|64)mi",
1058 "SHR(8|16|32|64)m1",
1059 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001060
1061def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1062 let Latency = 6;
1063 let NumMicroOps = 4;
1064 let ResourceCycles = [1,1,1,1];
1065}
Craig Topperf0d04262018-04-06 16:16:48 +00001066def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1067 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001068
1069def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1070 let Latency = 6;
1071 let NumMicroOps = 6;
1072 let ResourceCycles = [1,5];
1073}
1074def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1075
Gadi Haber323f2e12017-10-24 20:19:47 +00001076def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1077 let Latency = 7;
1078 let NumMicroOps = 2;
1079 let ResourceCycles = [1,1];
1080}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001081def: InstRW<[BWWriteResGroup73], (instregex "VPSLLVQYrm",
Simon Pilgrim210286e2018-05-08 10:28:03 +00001082 "VPSRLVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001083
1084def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1085 let Latency = 7;
1086 let NumMicroOps = 2;
1087 let ResourceCycles = [1,1];
1088}
Craig Topper5a69a002018-03-21 06:28:42 +00001089def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1090 "FCOM64m",
1091 "FCOMP32m",
1092 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001093
Gadi Haber323f2e12017-10-24 20:19:47 +00001094def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1095 let Latency = 7;
1096 let NumMicroOps = 2;
1097 let ResourceCycles = [1,1];
1098}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001099def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001100
Gadi Haber323f2e12017-10-24 20:19:47 +00001101def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1102 let Latency = 7;
1103 let NumMicroOps = 3;
1104 let ResourceCycles = [2,1];
1105}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001106def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001107 "MMX_PACKSSWBirm",
Simon Pilgrimb0a3be02018-05-08 12:17:55 +00001108 "MMX_PACKUSWBirm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001109
1110def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1111 let Latency = 7;
1112 let NumMicroOps = 3;
1113 let ResourceCycles = [1,2];
1114}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001115def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1116 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001117
Gadi Haber323f2e12017-10-24 20:19:47 +00001118def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1119 let Latency = 7;
1120 let NumMicroOps = 3;
1121 let ResourceCycles = [1,1,1];
1122}
1123def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1124
Gadi Haber323f2e12017-10-24 20:19:47 +00001125def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1126 let Latency = 7;
1127 let NumMicroOps = 3;
1128 let ResourceCycles = [1,1,1];
1129}
Craig Topper5a69a002018-03-21 06:28:42 +00001130def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1131 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001132
Gadi Haber323f2e12017-10-24 20:19:47 +00001133def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1134 let Latency = 7;
1135 let NumMicroOps = 3;
1136 let ResourceCycles = [1,1,1];
1137}
Craig Topperf4cd9082018-01-19 05:47:32 +00001138def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001139
1140def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1141 let Latency = 7;
1142 let NumMicroOps = 5;
1143 let ResourceCycles = [1,1,1,2];
1144}
Craig Topper5a69a002018-03-21 06:28:42 +00001145def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1146 "ROL(8|16|32|64)mi",
1147 "ROR(8|16|32|64)m1",
1148 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001149
1150def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1151 let Latency = 7;
1152 let NumMicroOps = 5;
1153 let ResourceCycles = [1,1,1,2];
1154}
Craig Topper5a69a002018-03-21 06:28:42 +00001155def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001156
1157def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1158 let Latency = 7;
1159 let NumMicroOps = 5;
1160 let ResourceCycles = [1,1,1,1,1];
1161}
Craig Topper5a69a002018-03-21 06:28:42 +00001162def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1163 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001164
1165def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1166 let Latency = 7;
1167 let NumMicroOps = 7;
1168 let ResourceCycles = [2,2,1,2];
1169}
Craig Topper2d451e72018-03-18 08:38:06 +00001170def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001171
1172def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1173 let Latency = 8;
1174 let NumMicroOps = 2;
1175 let ResourceCycles = [1,1];
1176}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001177def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001178 "PDEP(32|64)rm",
1179 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001180 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001181
1182def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001183 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001184 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001185 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001186}
Craig Topperf846e2d2018-04-19 05:34:05 +00001187def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001188
Craig Topperf846e2d2018-04-19 05:34:05 +00001189def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1190 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001191 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001192 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001193}
Craig Topper5a69a002018-03-21 06:28:42 +00001194def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001195
Gadi Haber323f2e12017-10-24 20:19:47 +00001196def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1197 let Latency = 8;
1198 let NumMicroOps = 2;
1199 let ResourceCycles = [1,1];
1200}
Craig Topper5a69a002018-03-21 06:28:42 +00001201def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1202 "VPMOVSXBQYrm",
1203 "VPMOVSXBWYrm",
1204 "VPMOVSXDQYrm",
1205 "VPMOVSXWDYrm",
1206 "VPMOVSXWQYrm",
1207 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001208
Gadi Haber323f2e12017-10-24 20:19:47 +00001209def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1210 let Latency = 8;
1211 let NumMicroOps = 5;
1212 let ResourceCycles = [1,1,1,2];
1213}
Craig Topper5a69a002018-03-21 06:28:42 +00001214def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1215 "RCL(8|16|32|64)mi",
1216 "RCR(8|16|32|64)m1",
1217 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001218
1219def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1220 let Latency = 8;
1221 let NumMicroOps = 5;
1222 let ResourceCycles = [1,1,2,1];
1223}
Craig Topper13a16502018-03-19 00:56:09 +00001224def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001225
1226def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1227 let Latency = 8;
1228 let NumMicroOps = 6;
1229 let ResourceCycles = [1,1,1,3];
1230}
Craig Topper9f834812018-04-01 21:54:24 +00001231def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001232
1233def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1234 let Latency = 8;
1235 let NumMicroOps = 6;
1236 let ResourceCycles = [1,1,1,2,1];
1237}
Craig Topper9f834812018-04-01 21:54:24 +00001238def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001239 "CMPXCHG(8|16|32|64)rm",
1240 "ROL(8|16|32|64)mCL",
1241 "SAR(8|16|32|64)mCL",
1242 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001243 "SHL(8|16|32|64)mCL",
1244 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001245def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1246 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001247
1248def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1249 let Latency = 9;
1250 let NumMicroOps = 2;
1251 let ResourceCycles = [1,1];
1252}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001253def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1254 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001255 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001256 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001257
1258def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1259 let Latency = 9;
1260 let NumMicroOps = 2;
1261 let ResourceCycles = [1,1];
1262}
Craig Topper5a69a002018-03-21 06:28:42 +00001263def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1264 "VPERM2I128rm",
1265 "VPERMDYrm",
1266 "VPERMPDYmi",
1267 "VPERMPSYrm",
1268 "VPERMQYmi",
1269 "VPMOVZXBDYrm",
1270 "VPMOVZXBQYrm",
1271 "VPMOVZXBWYrm",
1272 "VPMOVZXDQYrm",
1273 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001274
Gadi Haber323f2e12017-10-24 20:19:47 +00001275def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1276 let Latency = 9;
1277 let NumMicroOps = 3;
1278 let ResourceCycles = [1,1,1];
1279}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001280def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1281 "(V?)CVTSD2SIrm",
1282 "(V?)CVTSS2SI64rm",
1283 "(V?)CVTSS2SIrm",
1284 "(V?)CVTTSD2SI64rm",
1285 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001286 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001287 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001288
1289def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1290 let Latency = 9;
1291 let NumMicroOps = 3;
1292 let ResourceCycles = [1,1,1];
1293}
1294def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1295
1296def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1297 let Latency = 9;
1298 let NumMicroOps = 3;
1299 let ResourceCycles = [1,1,1];
1300}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001301def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001302def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001303 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001304 "CVTTPD2DQrm",
1305 "MMX_CVTPD2PIirm",
1306 "MMX_CVTPI2PDirm",
1307 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001308 "(V?)CVTDQ2PDrm",
1309 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001310
1311def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1312 let Latency = 9;
1313 let NumMicroOps = 3;
1314 let ResourceCycles = [1,1,1];
1315}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001316def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1317 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001318
Gadi Haber323f2e12017-10-24 20:19:47 +00001319def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1320 let Latency = 9;
1321 let NumMicroOps = 4;
1322 let ResourceCycles = [1,1,1,1];
1323}
Craig Topper5a69a002018-03-21 06:28:42 +00001324def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1325 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001326
1327def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1328 let Latency = 9;
1329 let NumMicroOps = 5;
1330 let ResourceCycles = [1,1,3];
1331}
1332def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1333
1334def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1335 let Latency = 9;
1336 let NumMicroOps = 5;
1337 let ResourceCycles = [1,2,1,1];
1338}
Craig Topper5a69a002018-03-21 06:28:42 +00001339def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1340 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001341
Gadi Haber323f2e12017-10-24 20:19:47 +00001342def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1343 let Latency = 10;
1344 let NumMicroOps = 2;
1345 let ResourceCycles = [1,1];
1346}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001347def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001348
Gadi Haber323f2e12017-10-24 20:19:47 +00001349def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1350 let Latency = 10;
1351 let NumMicroOps = 3;
1352 let ResourceCycles = [2,1];
1353}
Craig Topper5a69a002018-03-21 06:28:42 +00001354def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1355 "FICOM32m",
1356 "FICOMP16m",
1357 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001358
Gadi Haber323f2e12017-10-24 20:19:47 +00001359def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1360 let Latency = 10;
1361 let NumMicroOps = 4;
1362 let ResourceCycles = [1,1,1,1];
1363}
1364def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1365
1366def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001367 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001368 let NumMicroOps = 4;
1369 let ResourceCycles = [1,1,1,1];
1370}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001371def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001372
Craig Topper8104f262018-04-02 05:33:28 +00001373def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1374 let Latency = 11;
1375 let NumMicroOps = 1;
1376 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1377}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001378def : SchedAlias<WriteFDiv, BWWriteResGroup122_1>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001379
1380def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1381 let Latency = 11;
1382 let NumMicroOps = 2;
1383 let ResourceCycles = [1,1];
1384}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001385def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001386 "VPCMPGTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001387
Gadi Haber323f2e12017-10-24 20:19:47 +00001388def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1389 let Latency = 11;
1390 let NumMicroOps = 3;
1391 let ResourceCycles = [1,1,1];
1392}
1393def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1394
Gadi Haber323f2e12017-10-24 20:19:47 +00001395def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1396 let Latency = 11;
1397 let NumMicroOps = 6;
1398 let ResourceCycles = [1,1,1,1,2];
1399}
Craig Topper5a69a002018-03-21 06:28:42 +00001400def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1401 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001402
1403def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1404 let Latency = 11;
1405 let NumMicroOps = 7;
1406 let ResourceCycles = [2,2,3];
1407}
Craig Topper5a69a002018-03-21 06:28:42 +00001408def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1409 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001410
1411def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1412 let Latency = 11;
1413 let NumMicroOps = 9;
1414 let ResourceCycles = [1,4,1,3];
1415}
1416def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1417
1418def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1419 let Latency = 11;
1420 let NumMicroOps = 11;
1421 let ResourceCycles = [2,9];
1422}
Craig Topper2d451e72018-03-18 08:38:06 +00001423def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1424def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001425
Gadi Haber323f2e12017-10-24 20:19:47 +00001426def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1427 let Latency = 12;
1428 let NumMicroOps = 3;
1429 let ResourceCycles = [2,1];
1430}
Simon Pilgrimbe51b202018-05-04 12:59:24 +00001431def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001432
Craig Topper8104f262018-04-02 05:33:28 +00001433def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1434 let Latency = 14;
1435 let NumMicroOps = 1;
1436 let ResourceCycles = [1,4];
1437}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001438def : SchedAlias<WriteFDiv64, BWWriteResGroup139_1>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001439
Gadi Haber323f2e12017-10-24 20:19:47 +00001440def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1441 let Latency = 14;
1442 let NumMicroOps = 3;
1443 let ResourceCycles = [1,1,1];
1444}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001445def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001446
Gadi Haber323f2e12017-10-24 20:19:47 +00001447def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1448 let Latency = 14;
1449 let NumMicroOps = 8;
1450 let ResourceCycles = [2,2,1,3];
1451}
1452def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1453
1454def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1455 let Latency = 14;
1456 let NumMicroOps = 10;
1457 let ResourceCycles = [2,3,1,4];
1458}
1459def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1460
1461def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1462 let Latency = 14;
1463 let NumMicroOps = 12;
1464 let ResourceCycles = [2,1,4,5];
1465}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001466def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001467
1468def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1469 let Latency = 15;
1470 let NumMicroOps = 1;
1471 let ResourceCycles = [1];
1472}
Craig Topper5a69a002018-03-21 06:28:42 +00001473def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1474 "DIVR_FST0r",
1475 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001476
Gadi Haber323f2e12017-10-24 20:19:47 +00001477def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1478 let Latency = 15;
1479 let NumMicroOps = 10;
1480 let ResourceCycles = [1,1,1,4,1,2];
1481}
Craig Topper13a16502018-03-19 00:56:09 +00001482def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001483
Craig Topper8104f262018-04-02 05:33:28 +00001484def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001485 let Latency = 16;
1486 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001487 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001488}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001489def : SchedAlias<WriteFDivLd, BWWriteResGroup150>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001490
Gadi Haber323f2e12017-10-24 20:19:47 +00001491def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1492 let Latency = 16;
1493 let NumMicroOps = 14;
1494 let ResourceCycles = [1,1,1,4,2,5];
1495}
1496def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1497
1498def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1499 let Latency = 16;
1500 let NumMicroOps = 16;
1501 let ResourceCycles = [16];
1502}
Craig Topper5a69a002018-03-21 06:28:42 +00001503def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001504
Gadi Haber323f2e12017-10-24 20:19:47 +00001505def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1506 let Latency = 18;
1507 let NumMicroOps = 8;
1508 let ResourceCycles = [1,1,1,5];
1509}
Craig Topper5a69a002018-03-21 06:28:42 +00001510def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001511def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001512
1513def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1514 let Latency = 18;
1515 let NumMicroOps = 11;
1516 let ResourceCycles = [2,1,1,3,1,3];
1517}
Craig Topper13a16502018-03-19 00:56:09 +00001518def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001519
Craig Topper8104f262018-04-02 05:33:28 +00001520def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001521 let Latency = 19;
1522 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001523 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001524}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001525def : SchedAlias<WriteFDiv64Ld, BWWriteResGroup161>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001526
Gadi Haber323f2e12017-10-24 20:19:47 +00001527def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1528 let Latency = 20;
1529 let NumMicroOps = 1;
1530 let ResourceCycles = [1];
1531}
Craig Topper5a69a002018-03-21 06:28:42 +00001532def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1533 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001534 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001535
Gadi Haber323f2e12017-10-24 20:19:47 +00001536def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1537 let Latency = 20;
1538 let NumMicroOps = 8;
1539 let ResourceCycles = [1,1,1,1,1,1,2];
1540}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001541def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001542
Gadi Haber323f2e12017-10-24 20:19:47 +00001543def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1544 let Latency = 21;
1545 let NumMicroOps = 2;
1546 let ResourceCycles = [1,1];
1547}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001548def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001549
Gadi Haber323f2e12017-10-24 20:19:47 +00001550def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1551 let Latency = 21;
1552 let NumMicroOps = 19;
1553 let ResourceCycles = [2,1,4,1,1,4,6];
1554}
1555def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1556
1557def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1558 let Latency = 22;
1559 let NumMicroOps = 18;
1560 let ResourceCycles = [1,1,16];
1561}
1562def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1563
Gadi Haber323f2e12017-10-24 20:19:47 +00001564def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1565 let Latency = 23;
1566 let NumMicroOps = 19;
1567 let ResourceCycles = [3,1,15];
1568}
Craig Topper391c6f92017-12-10 01:24:08 +00001569def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001570
1571def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1572 let Latency = 24;
1573 let NumMicroOps = 3;
1574 let ResourceCycles = [1,1,1];
1575}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001576def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001577
Gadi Haber323f2e12017-10-24 20:19:47 +00001578def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1579 let Latency = 26;
1580 let NumMicroOps = 2;
1581 let ResourceCycles = [1,1];
1582}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001583def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001584
Gadi Haber323f2e12017-10-24 20:19:47 +00001585def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1586 let Latency = 29;
1587 let NumMicroOps = 3;
1588 let ResourceCycles = [1,1,1];
1589}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001590def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001591
Gadi Haber323f2e12017-10-24 20:19:47 +00001592def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1593 let Latency = 22;
1594 let NumMicroOps = 7;
1595 let ResourceCycles = [1,3,2,1];
1596}
Craig Topper17a31182017-12-16 18:35:29 +00001597def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001598
1599def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1600 let Latency = 23;
1601 let NumMicroOps = 9;
1602 let ResourceCycles = [1,3,4,1];
1603}
Craig Topper17a31182017-12-16 18:35:29 +00001604def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001605
1606def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1607 let Latency = 24;
1608 let NumMicroOps = 9;
1609 let ResourceCycles = [1,5,2,1];
1610}
Craig Topper17a31182017-12-16 18:35:29 +00001611def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001612
1613def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1614 let Latency = 25;
1615 let NumMicroOps = 7;
1616 let ResourceCycles = [1,3,2,1];
1617}
Craig Topper17a31182017-12-16 18:35:29 +00001618def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1619 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001620
1621def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1622 let Latency = 26;
1623 let NumMicroOps = 9;
1624 let ResourceCycles = [1,5,2,1];
1625}
Craig Topper17a31182017-12-16 18:35:29 +00001626def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001627
1628def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1629 let Latency = 26;
1630 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001631 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001632}
Craig Topper17a31182017-12-16 18:35:29 +00001633def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001634
1635def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1636 let Latency = 27;
1637 let NumMicroOps = 9;
1638 let ResourceCycles = [1,5,2,1];
1639}
Craig Topper17a31182017-12-16 18:35:29 +00001640def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001641
Gadi Haber323f2e12017-10-24 20:19:47 +00001642def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1643 let Latency = 29;
1644 let NumMicroOps = 27;
1645 let ResourceCycles = [1,5,1,1,19];
1646}
1647def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1648
1649def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1650 let Latency = 30;
1651 let NumMicroOps = 28;
1652 let ResourceCycles = [1,6,1,1,19];
1653}
Craig Topper2d451e72018-03-18 08:38:06 +00001654def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001655
Gadi Haber323f2e12017-10-24 20:19:47 +00001656def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1657 let Latency = 34;
1658 let NumMicroOps = 8;
1659 let ResourceCycles = [2,2,2,1,1];
1660}
Craig Topper13a16502018-03-19 00:56:09 +00001661def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001662
1663def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
1664 let Latency = 34;
1665 let NumMicroOps = 23;
1666 let ResourceCycles = [1,5,3,4,10];
1667}
Craig Topper5a69a002018-03-21 06:28:42 +00001668def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
1669 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001670
1671def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1672 let Latency = 35;
1673 let NumMicroOps = 8;
1674 let ResourceCycles = [2,2,2,1,1];
1675}
Craig Topper13a16502018-03-19 00:56:09 +00001676def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001677
1678def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1679 let Latency = 35;
1680 let NumMicroOps = 23;
1681 let ResourceCycles = [1,5,2,1,4,10];
1682}
Craig Topper5a69a002018-03-21 06:28:42 +00001683def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
1684 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001685
Gadi Haber323f2e12017-10-24 20:19:47 +00001686def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
1687 let Latency = 42;
1688 let NumMicroOps = 22;
1689 let ResourceCycles = [2,20];
1690}
Craig Topper2d451e72018-03-18 08:38:06 +00001691def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001692
1693def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
1694 let Latency = 60;
1695 let NumMicroOps = 64;
1696 let ResourceCycles = [2,2,8,1,10,2,39];
1697}
1698def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001699
1700def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1701 let Latency = 63;
1702 let NumMicroOps = 88;
1703 let ResourceCycles = [4,4,31,1,2,1,45];
1704}
Craig Topper2d451e72018-03-18 08:38:06 +00001705def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001706
1707def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1708 let Latency = 63;
1709 let NumMicroOps = 90;
1710 let ResourceCycles = [4,2,33,1,2,1,47];
1711}
Craig Topper2d451e72018-03-18 08:38:06 +00001712def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001713
1714def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
1715 let Latency = 75;
1716 let NumMicroOps = 15;
1717 let ResourceCycles = [6,3,6];
1718}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00001719def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001720
1721def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
1722 let Latency = 80;
1723 let NumMicroOps = 32;
1724 let ResourceCycles = [7,7,3,3,1,11];
1725}
1726def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
1727
1728def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
1729 let Latency = 115;
1730 let NumMicroOps = 100;
1731 let ResourceCycles = [9,9,11,8,1,11,21,30];
1732}
1733def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001734
1735} // SchedModel
1736