blob: 59f45c23041352743e4e1da8a72220e5acecc1fb [file] [log] [blame]
Gadi Haber323f2e12017-10-24 20:19:47 +00001//=- X86SchedBroadwell.td - X86 Broadwell Scheduling ---------*- tablegen -*-=//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the machine model for Broadwell to support instruction
11// scheduling and other instruction cost heuristics.
12//
13//===----------------------------------------------------------------------===//
Clement Courbet0f1da8f2018-05-02 13:54:38 +000014
Gadi Haber323f2e12017-10-24 20:19:47 +000015def BroadwellModel : SchedMachineModel {
Simon Pilgrimf7d2a932018-04-24 13:21:41 +000016 // All x86 instructions are modeled as a single micro-op, and BW can decode 4
Gadi Haber323f2e12017-10-24 20:19:47 +000017 // instructions per cycle.
18 let IssueWidth = 4;
19 let MicroOpBufferSize = 192; // Based on the reorder buffer.
20 let LoadLatency = 5;
21 let MispredictPenalty = 16;
22
23 // Based on the LSD (loop-stream detector) queue size and benchmarking data.
24 let LoopMicroOpBufferSize = 50;
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000025
Simon Pilgrimc21deec2018-03-24 19:37:28 +000026 // This flag is set to allow the scheduler to assign a default model to
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000027 // unrecognized opcodes.
28 let CompleteModel = 0;
Gadi Haber323f2e12017-10-24 20:19:47 +000029}
30
31let SchedModel = BroadwellModel in {
32
33// Broadwell can issue micro-ops to 8 different ports in one cycle.
34
35// Ports 0, 1, 5, and 6 handle all computation.
36// Port 4 gets the data half of stores. Store data can be available later than
37// the store address, but since we don't model the latency of stores, we can
38// ignore that.
39// Ports 2 and 3 are identical. They handle loads and the address half of
40// stores. Port 7 can handle address calculations.
41def BWPort0 : ProcResource<1>;
42def BWPort1 : ProcResource<1>;
43def BWPort2 : ProcResource<1>;
44def BWPort3 : ProcResource<1>;
45def BWPort4 : ProcResource<1>;
46def BWPort5 : ProcResource<1>;
47def BWPort6 : ProcResource<1>;
48def BWPort7 : ProcResource<1>;
49
50// Many micro-ops are capable of issuing on multiple ports.
51def BWPort01 : ProcResGroup<[BWPort0, BWPort1]>;
52def BWPort23 : ProcResGroup<[BWPort2, BWPort3]>;
53def BWPort237 : ProcResGroup<[BWPort2, BWPort3, BWPort7]>;
54def BWPort04 : ProcResGroup<[BWPort0, BWPort4]>;
55def BWPort05 : ProcResGroup<[BWPort0, BWPort5]>;
56def BWPort06 : ProcResGroup<[BWPort0, BWPort6]>;
57def BWPort15 : ProcResGroup<[BWPort1, BWPort5]>;
58def BWPort16 : ProcResGroup<[BWPort1, BWPort6]>;
59def BWPort56 : ProcResGroup<[BWPort5, BWPort6]>;
60def BWPort015 : ProcResGroup<[BWPort0, BWPort1, BWPort5]>;
61def BWPort056 : ProcResGroup<[BWPort0, BWPort5, BWPort6]>;
62def BWPort0156: ProcResGroup<[BWPort0, BWPort1, BWPort5, BWPort6]>;
63
64// 60 Entry Unified Scheduler
65def BWPortAny : ProcResGroup<[BWPort0, BWPort1, BWPort2, BWPort3, BWPort4,
66 BWPort5, BWPort6, BWPort7]> {
67 let BufferSize=60;
68}
69
Simon Pilgrim30c38c32018-03-19 14:46:07 +000070// Integer division issued on port 0.
Craig Topper8104f262018-04-02 05:33:28 +000071def BWDivider : ProcResource<1>;
72// FP division and sqrt on port 0.
73def BWFPDivider : ProcResource<1>;
Simon Pilgrim30c38c32018-03-19 14:46:07 +000074
Gadi Haber323f2e12017-10-24 20:19:47 +000075// Loads are 5 cycles, so ReadAfterLd registers needn't be available until 5
76// cycles after the memory operand.
77def : ReadAdvance<ReadAfterLd, 5>;
78
79// Many SchedWrites are defined in pairs with and without a folded load.
80// Instructions with folded loads are usually micro-fused, so they only appear
81// as two micro-ops when queued in the reservation station.
82// This multiclass defines the resource usage for variants with and without
83// folded loads.
84multiclass BWWriteResPair<X86FoldableSchedWrite SchedRW,
Simon Pilgrim30c38c32018-03-19 14:46:07 +000085 list<ProcResourceKind> ExePorts,
Simon Pilgrime3547af2018-03-25 10:21:19 +000086 int Lat, list<int> Res = [1], int UOps = 1,
87 int LoadLat = 5> {
Gadi Haber323f2e12017-10-24 20:19:47 +000088 // Register variant is using a single cycle on ExePort.
Simon Pilgrim30c38c32018-03-19 14:46:07 +000089 def : WriteRes<SchedRW, ExePorts> {
90 let Latency = Lat;
91 let ResourceCycles = Res;
92 let NumMicroOps = UOps;
93 }
Gadi Haber323f2e12017-10-24 20:19:47 +000094
Simon Pilgrime3547af2018-03-25 10:21:19 +000095 // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to
96 // the latency (default = 5).
Simon Pilgrim30c38c32018-03-19 14:46:07 +000097 def : WriteRes<SchedRW.Folded, !listconcat([BWPort23], ExePorts)> {
Simon Pilgrime3547af2018-03-25 10:21:19 +000098 let Latency = !add(Lat, LoadLat);
Simon Pilgrim30c38c32018-03-19 14:46:07 +000099 let ResourceCycles = !listconcat([1], Res);
Simon Pilgrime3547af2018-03-25 10:21:19 +0000100 let NumMicroOps = !add(UOps, 1);
Gadi Haber323f2e12017-10-24 20:19:47 +0000101 }
102}
103
Craig Topperf131b602018-04-06 16:16:46 +0000104// A folded store needs a cycle on port 4 for the store data, and an extra port
105// 2/3/7 cycle to recompute the address.
106def : WriteRes<WriteRMW, [BWPort237,BWPort4]>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000107
108// Arithmetic.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000109defm : BWWriteResPair<WriteALU, [BWPort0156], 1>; // Simple integer ALU op.
110defm : BWWriteResPair<WriteIMul, [BWPort1], 3>; // Integer multiplication.
111defm : BWWriteResPair<WriteIDiv, [BWPort0, BWDivider], 25, [1, 10]>;
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000112defm : BWWriteResPair<WriteCRC32, [BWPort1], 3>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000113def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, high part.
Gadi Haber323f2e12017-10-24 20:19:47 +0000114
115def : WriteRes<WriteLEA, [BWPort15]>; // LEA instructions can't fold loads.
116
Craig Topperb7baa352018-04-08 17:53:18 +0000117defm : BWWriteResPair<WriteCMOV, [BWPort06], 1>; // Conditional move.
118def : WriteRes<WriteSETCC, [BWPort06]>; // Setcc.
119def : WriteRes<WriteSETCCStore, [BWPort06,BWPort4,BWPort237]> {
120 let Latency = 2;
121 let NumMicroOps = 3;
122}
123
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000124// Bit counts.
125defm : BWWriteResPair<WriteBitScan, [BWPort1], 3>;
126defm : BWWriteResPair<WriteLZCNT, [BWPort1], 3>;
127defm : BWWriteResPair<WriteTZCNT, [BWPort1], 3>;
128defm : BWWriteResPair<WritePOPCNT, [BWPort1], 3>;
129
Gadi Haber323f2e12017-10-24 20:19:47 +0000130// Integer shifts and rotates.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000131defm : BWWriteResPair<WriteShift, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000132
Craig Topper89310f52018-03-29 20:41:39 +0000133// BMI1 BEXTR, BMI2 BZHI
134defm : BWWriteResPair<WriteBEXTR, [BWPort06,BWPort15], 2, [1,1], 2>;
135defm : BWWriteResPair<WriteBZHI, [BWPort15], 1>;
136
Gadi Haber323f2e12017-10-24 20:19:47 +0000137// Loads, stores, and moves, not folded with other operations.
138def : WriteRes<WriteLoad, [BWPort23]> { let Latency = 5; }
139def : WriteRes<WriteStore, [BWPort237, BWPort4]>;
140def : WriteRes<WriteMove, [BWPort0156]>;
141
142// Idioms that clear a register, like xorps %xmm0, %xmm0.
143// These can often bypass execution ports completely.
144def : WriteRes<WriteZero, []>;
145
Sanjoy Das1074eb22017-12-12 19:11:31 +0000146// Treat misc copies as a move.
147def : InstRW<[WriteMove], (instrs COPY)>;
148
Gadi Haber323f2e12017-10-24 20:19:47 +0000149// Branches don't produce values, so they have no latency, but they still
150// consume resources. Indirect branches can fold loads.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000151defm : BWWriteResPair<WriteJump, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000152
153// Floating point. This covers both scalar and vector operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000154def : WriteRes<WriteFLoad, [BWPort23]> { let Latency = 5; }
155def : WriteRes<WriteFStore, [BWPort237, BWPort4]>;
156def : WriteRes<WriteFMove, [BWPort5]>;
157
Simon Pilgrim1233e122018-05-07 20:52:53 +0000158defm : BWWriteResPair<WriteFAdd, [BWPort1], 3, [1], 1, 5>; // Floating point add/sub.
159defm : BWWriteResPair<WriteFAddX, [BWPort1], 3, [1], 1, 5>; // Floating point add/sub (XMM).
160defm : BWWriteResPair<WriteFAddY, [BWPort1], 3, [1], 1, 6>; // Floating point add/sub (YMM/ZMM).
161defm : BWWriteResPair<WriteFAdd64, [BWPort1], 3, [1], 1, 5>; // Floating point double add/sub.
162defm : BWWriteResPair<WriteFAdd64X, [BWPort1], 3, [1], 1, 5>; // Floating point double add/sub (XMM).
163defm : BWWriteResPair<WriteFAdd64Y, [BWPort1], 3, [1], 1, 6>; // Floating point double add/sub (YMM/ZMM).
164
165defm : BWWriteResPair<WriteFCmp, [BWPort1], 3, [1], 1, 5>; // Floating point compare.
166defm : BWWriteResPair<WriteFCmpX, [BWPort1], 3, [1], 1, 5>; // Floating point compare (XMM).
167defm : BWWriteResPair<WriteFCmpY, [BWPort1], 3, [1], 1, 6>; // Floating point compare (YMM/ZMM).
168defm : BWWriteResPair<WriteFCmp64, [BWPort1], 3, [1], 1, 5>; // Floating point double compare.
169defm : BWWriteResPair<WriteFCmp64X, [BWPort1], 3, [1], 1, 5>; // Floating point double compare (XMM).
170defm : BWWriteResPair<WriteFCmp64Y, [BWPort1], 3, [1], 1, 6>; // Floating point double compare (YMM/ZMM).
171
172defm : BWWriteResPair<WriteFCom, [BWPort1], 3>; // Floating point compare to flags.
173
174defm : BWWriteResPair<WriteFMul, [BWPort01], 3, [1], 1, 5>; // Floating point multiplication.
175defm : BWWriteResPair<WriteFMulX, [BWPort01], 3, [1], 1, 5>; // Floating point multiplication (XMM).
176defm : BWWriteResPair<WriteFMulY, [BWPort01], 3, [1], 1, 6>; // Floating point multiplication (YMM/ZMM).
177defm : BWWriteResPair<WriteFMul64, [BWPort01], 3, [1], 1, 5>; // Floating point double multiplication.
178defm : BWWriteResPair<WriteFMul64X, [BWPort01], 3, [1], 1, 5>; // Floating point double multiplication (XMM).
179defm : BWWriteResPair<WriteFMul64Y, [BWPort01], 3, [1], 1, 6>; // Floating point double multiplication (YMM/ZMM).
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000180
181//defm : BWWriteResPair<WriteFDiv, [BWPort0,BWFPDivider], 11, [1,3], 1, 5>; // Floating point division.
182defm : BWWriteResPair<WriteFDivX, [BWPort0,BWFPDivider], 11, [1,5], 1, 5>; // Floating point division (XMM).
183defm : BWWriteResPair<WriteFDivY, [BWPort0,BWPort015,BWFPDivider], 17, [2,1,10], 3, 6>; // Floating point division (YMM).
184defm : BWWriteResPair<WriteFDivZ, [BWPort0,BWPort015,BWFPDivider], 17, [2,1,10], 3, 6>; // Floating point division (ZMM).
185//defm : BWWriteResPair<WriteFDiv64, [BWPort0,BWFPDivider], 14, [1,8], 1, 5>; // Floating point division.
186defm : BWWriteResPair<WriteFDiv64X, [BWPort0,BWFPDivider], 14, [1,8], 1, 5>; // Floating point division (XMM).
187defm : BWWriteResPair<WriteFDiv64Y, [BWPort0,BWPort015,BWFPDivider], 23, [2,1,16], 3, 6>; // Floating point division (YMM).
188defm : BWWriteResPair<WriteFDiv64Z, [BWPort0,BWPort015,BWFPDivider], 23, [2,1,16], 3, 6>; // Floating point division (ZMM).
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000189
190defm : X86WriteRes<WriteFSqrt, [BWPort0,BWFPDivider], 11, [1,4], 1>; // Floating point square root.
191defm : X86WriteRes<WriteFSqrtLd, [BWPort0,BWPort23,BWFPDivider], 16, [1,1,7], 2>;
192defm : BWWriteResPair<WriteFSqrtX, [BWPort0,BWFPDivider], 11, [1,7], 1, 5>; // Floating point square root (XMM).
193defm : BWWriteResPair<WriteFSqrtY, [BWPort0,BWPort015,BWFPDivider], 21, [2,1,14], 3, 6>; // Floating point square root (YMM).
194defm : BWWriteResPair<WriteFSqrtZ, [BWPort0,BWPort015,BWFPDivider], 21, [2,1,14], 3, 6>; // Floating point square root (ZMM).
195defm : X86WriteRes<WriteFSqrt64, [BWPort0,BWFPDivider], 16, [1,8], 1>; // Floating point double square root.
196defm : X86WriteRes<WriteFSqrt64Ld, [BWPort0,BWPort23,BWFPDivider], 21, [1,1,14], 2>;
197defm : BWWriteResPair<WriteFSqrt64X, [BWPort0,BWFPDivider], 16, [1,14],1, 5>; // Floating point double square root (XMM).
198defm : BWWriteResPair<WriteFSqrt64Y, [BWPort0,BWPort015,BWFPDivider], 29, [2,1,28], 3, 6>; // Floating point double square root (YMM).
199defm : BWWriteResPair<WriteFSqrt64Z, [BWPort0,BWPort015,BWFPDivider], 29, [2,1,28], 3, 6>; // Floating point double square root (ZMM).
200defm : BWWriteResPair<WriteFSqrt80, [BWPort0,BWFPDivider], 23, [1,9]>; // Floating point long double square root.
201
Simon Pilgrimc7088682018-05-01 18:06:07 +0000202defm : BWWriteResPair<WriteFRcp, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000203defm : BWWriteResPair<WriteFRcpX, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal estimate (XMM).
204defm : BWWriteResPair<WriteFRcpY, [BWPort0,BWPort015], 11, [2,1], 3, 6>; // Floating point reciprocal estimate (YMM/ZMM).
205
Simon Pilgrimc7088682018-05-01 18:06:07 +0000206defm : BWWriteResPair<WriteFRsqrt, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal square root estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000207defm : BWWriteResPair<WriteFRsqrtX,[BWPort0], 5, [1], 1, 5>; // Floating point reciprocal square root estimate (XMM).
208defm : BWWriteResPair<WriteFRsqrtY,[BWPort0,BWPort015], 11, [2,1], 3, 6>; // Floating point reciprocal square root estimate (YMM/ZMM).
209
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000210defm : BWWriteResPair<WriteFMA, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add.
Simon Pilgrim67cc2462018-05-04 15:20:18 +0000211defm : BWWriteResPair<WriteFMAX, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add (XMM).
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000212defm : BWWriteResPair<WriteFMAY, [BWPort01], 5, [1], 1, 6>; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000213defm : BWWriteResPair<WriteDPPD, [BWPort0,BWPort1,BWPort5], 9, [1,1,1], 3, 5>; // Floating point double dot product.
214defm : BWWriteResPair<WriteDPPS, [BWPort0,BWPort1,BWPort5], 14, [2,1,1], 4, 5>; // Floating point single dot product.
215defm : BWWriteResPair<WriteDPPSY, [BWPort0,BWPort1,BWPort5], 14, [2,1,1], 4, 6>; // Floating point single dot product (YMM).
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000216defm : BWWriteResPair<WriteFSign, [BWPort5], 1>; // Floating point fabs/fchs.
217defm : X86WriteRes<WriteFRnd, [BWPort23], 6, [1], 1>; // Floating point rounding.
218defm : X86WriteRes<WriteFRndY, [BWPort23], 6, [1], 1>; // Floating point rounding (YMM/ZMM).
219defm : X86WriteRes<WriteFRndLd, [BWPort1,BWPort23], 11, [2,1], 3>;
220defm : X86WriteRes<WriteFRndYLd, [BWPort1,BWPort23], 12, [2,1], 3>;
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000221defm : BWWriteResPair<WriteFLogic, [BWPort5], 1, [1], 1, 5>; // Floating point and/or/xor logicals.
222defm : BWWriteResPair<WriteFLogicY, [BWPort5], 1, [1], 1, 6>; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000223defm : BWWriteResPair<WriteFTest, [BWPort0], 1, [1], 1, 5>; // Floating point TEST instructions.
224defm : BWWriteResPair<WriteFTestY, [BWPort0], 1, [1], 1, 6>; // Floating point TEST instructions (YMM/ZMM).
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000225defm : BWWriteResPair<WriteFShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector shuffles.
226defm : BWWriteResPair<WriteFShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000227defm : BWWriteResPair<WriteFVarShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector variable shuffles.
228defm : BWWriteResPair<WriteFVarShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
229defm : BWWriteResPair<WriteFBlend, [BWPort015], 1, [1], 1, 5>; // Floating point vector blends.
230defm : BWWriteResPair<WriteFBlendY, [BWPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000231defm : BWWriteResPair<WriteFVarBlend, [BWPort5], 2, [2], 2, 5>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000232defm : BWWriteResPair<WriteFVarBlendY, [BWPort5], 2, [2], 2, 6>; // Fp vector variable blends.
Gadi Haber323f2e12017-10-24 20:19:47 +0000233
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000234def : WriteRes<WriteCvtF2FSt, [BWPort1,BWPort4,BWPort237]> {
235 let Latency = 4;
236 let NumMicroOps = 3;
237 let ResourceCycles = [1,1,1];
238}
239
Gadi Haber323f2e12017-10-24 20:19:47 +0000240// FMA Scheduling helper class.
241// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
242
243// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000244def : WriteRes<WriteVecLoad, [BWPort23]> { let Latency = 5; }
245def : WriteRes<WriteVecStore, [BWPort237, BWPort4]>;
246def : WriteRes<WriteVecMove, [BWPort015]>;
Simon Pilgrim0e51a122018-05-04 18:16:13 +0000247defm : X86WriteRes<WriteEMMS, [BWPort01,BWPort15,BWPort015,BWPort0156], 31, [8,1,21,1], 31>;
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000248
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000249defm : BWWriteResPair<WriteVecALU, [BWPort15], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
250defm : BWWriteResPair<WriteVecALUY, [BWPort15], 1, [1], 1, 6>; // Vector integer ALU op, no logicals (YMM/ZMM).
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000251defm : BWWriteResPair<WriteVecLogic, [BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
252defm : BWWriteResPair<WriteVecLogicY,[BWPort015], 1, [1], 1, 6>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000253defm : BWWriteResPair<WriteVecTest, [BWPort0,BWPort5], 2, [1,1], 2, 5>; // Vector integer TEST instructions.
254defm : BWWriteResPair<WriteVecTestY, [BWPort0,BWPort5], 4, [1,1], 2, 6>; // Vector integer TEST instructions (YMM/ZMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000255defm : BWWriteResPair<WriteVecIMul, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000256defm : BWWriteResPair<WriteVecIMulX, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000257defm : BWWriteResPair<WriteVecIMulY, [BWPort0], 5, [1], 1, 6>; // Vector integer multiply.
258defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // Vector PMULLD.
259defm : BWWriteResPair<WritePMULLDY, [BWPort0], 10, [2], 2, 6>; // Vector PMULLD (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000260defm : BWWriteResPair<WriteShuffle, [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000261defm : BWWriteResPair<WriteShuffleY, [BWPort5], 1, [1], 1, 6>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000262defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000263defm : BWWriteResPair<WriteVarShuffleY,[BWPort5], 1, [1], 1, 6>; // Vector variable shuffles (YMM/ZMM).
264defm : BWWriteResPair<WriteBlend, [BWPort5], 1, [1], 1, 5>; // Vector blends.
265defm : BWWriteResPair<WriteBlendY, [BWPort5], 1, [1], 1, 6>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000266defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000267defm : BWWriteResPair<WriteVarBlendY, [BWPort5], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000268defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000269defm : BWWriteResPair<WriteMPSADY, [BWPort0, BWPort5], 7, [1, 2], 3, 6>; // Vector MPSAD.
270defm : BWWriteResPair<WritePSADBW, [BWPort0], 5, [1], 1, 5>; // Vector PSADBW.
271defm : BWWriteResPair<WritePSADBWY, [BWPort0], 5, [1], 1, 6>; // Vector PSADBW (YMM/ZMM).
272defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000273
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000274// Vector integer shifts.
275defm : BWWriteResPair<WriteVecShift, [BWPort0], 1, [1], 1, 5>;
276defm : BWWriteResPair<WriteVecShiftX, [BWPort0,BWPort5], 2, [1,1], 2, 5>;
277defm : X86WriteRes<WriteVecShiftY, [BWPort0,BWPort5], 4, [1,1], 2>;
278defm : X86WriteRes<WriteVecShiftYLd, [BWPort0,BWPort23], 7, [1,1], 2>;
279
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000280defm : BWWriteResPair<WriteVecShiftImm, [BWPort0], 1, [1], 1, 5>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000281defm : BWWriteResPair<WriteVecShiftImmX, [BWPort0], 1, [1], 1, 5>; // Vector integer immediate shifts (XMM).
282defm : BWWriteResPair<WriteVecShiftImmY, [BWPort0], 1, [1], 1, 6>; // Vector integer immediate shifts (YMM/ZMM).
283defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 3, [2,1], 3, 5>; // Variable vector shifts.
284defm : BWWriteResPair<WriteVarVecShiftY, [BWPort0, BWPort5], 3, [2,1], 3, 6>; // Variable vector shifts (YMM/ZMM).
285
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000286// Vector insert/extract operations.
287def : WriteRes<WriteVecInsert, [BWPort5]> {
288 let Latency = 2;
289 let NumMicroOps = 2;
290 let ResourceCycles = [2];
291}
292def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
293 let Latency = 6;
294 let NumMicroOps = 2;
295}
296
297def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
298 let Latency = 2;
299 let NumMicroOps = 2;
300}
301def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
302 let Latency = 2;
303 let NumMicroOps = 3;
304}
305
Gadi Haber323f2e12017-10-24 20:19:47 +0000306// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000307defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
308defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
309defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000310
311// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000312
Gadi Haber323f2e12017-10-24 20:19:47 +0000313// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000314def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000315 let Latency = 11;
316 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000317 let ResourceCycles = [3];
318}
319def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000320 let Latency = 16;
321 let NumMicroOps = 4;
322 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000323}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000324
325// Packed Compare Explicit Length Strings, Return Mask
326def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
327 let Latency = 19;
328 let NumMicroOps = 9;
329 let ResourceCycles = [4,3,1,1];
330}
331def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
332 let Latency = 24;
333 let NumMicroOps = 10;
334 let ResourceCycles = [4,3,1,1,1];
335}
336
337// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000338def : WriteRes<WritePCmpIStrI, [BWPort0]> {
339 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000340 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000341 let ResourceCycles = [3];
342}
343def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000344 let Latency = 16;
345 let NumMicroOps = 4;
346 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000347}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000348
349// Packed Compare Explicit Length Strings, Return Index
350def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
351 let Latency = 18;
352 let NumMicroOps = 8;
353 let ResourceCycles = [4,3,1];
354}
355def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
356 let Latency = 23;
357 let NumMicroOps = 9;
358 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000359}
360
Simon Pilgrima2f26782018-03-27 20:38:54 +0000361// MOVMSK Instructions.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000362def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
363def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
364def : WriteRes<WriteVecMOVMSKY, [BWPort0]> { let Latency = 3; }
365def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
Simon Pilgrima2f26782018-03-27 20:38:54 +0000366
Gadi Haber323f2e12017-10-24 20:19:47 +0000367// AES instructions.
368def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
369 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000370 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000371 let ResourceCycles = [1];
372}
373def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000374 let Latency = 12;
375 let NumMicroOps = 2;
376 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000377}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000378
Gadi Haber323f2e12017-10-24 20:19:47 +0000379def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
380 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000381 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000382 let ResourceCycles = [2];
383}
384def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000385 let Latency = 19;
386 let NumMicroOps = 3;
387 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000388}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000389
390def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
391 let Latency = 29;
392 let NumMicroOps = 11;
393 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000394}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000395def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
396 let Latency = 33;
397 let NumMicroOps = 11;
398 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000399}
400
401// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000402defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000403
404// Catch-all for expensive system instructions.
405def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
406
407// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000408defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
409defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
410defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
411defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
Gadi Haber323f2e12017-10-24 20:19:47 +0000412
413// Old microcoded instructions that nobody use.
414def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
415
416// Fence instructions.
417def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
418
Craig Topper05242bf2018-04-21 18:07:36 +0000419// Load/store MXCSR.
420def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
421def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
422
Gadi Haber323f2e12017-10-24 20:19:47 +0000423// Nop, not very useful expect it provides a model for nops!
424def : WriteRes<WriteNop, []>;
425
426////////////////////////////////////////////////////////////////////////////////
427// Horizontal add/sub instructions.
428////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000429
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000430defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3, 5>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000431defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000432defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3, 5>;
433defm : BWWriteResPair<WritePHAddY, [BWPort5,BWPort15], 3, [2,1], 3, 6>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000434
435// Remaining instrs.
436
437def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
438 let Latency = 1;
439 let NumMicroOps = 1;
440 let ResourceCycles = [1];
441}
Craig Topper5a69a002018-03-21 06:28:42 +0000442def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
443 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000444 "(V?)MOVPDI2DIrr",
445 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000446 "VPSLLVQ(Y?)rr",
Simon Pilgrim210286e2018-05-08 10:28:03 +0000447 "VPSRLVQ(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000448
449def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
450 let Latency = 1;
451 let NumMicroOps = 1;
452 let ResourceCycles = [1];
453}
Craig Topper5a69a002018-03-21 06:28:42 +0000454def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
455 "COM_FST0r",
456 "UCOM_FPr",
457 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000458
459def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
460 let Latency = 1;
461 let NumMicroOps = 1;
462 let ResourceCycles = [1];
463}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000464def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000465 "MMX_MOVD64to64rr",
466 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000467 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000468 "(V?)MOVDI2PDIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000469
470def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
471 let Latency = 1;
472 let NumMicroOps = 1;
473 let ResourceCycles = [1];
474}
475def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
476
477def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
478 let Latency = 1;
479 let NumMicroOps = 1;
480 let ResourceCycles = [1];
481}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000482def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000483
484def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
485 let Latency = 1;
486 let NumMicroOps = 1;
487 let ResourceCycles = [1];
488}
Craig Topperfbe31322018-04-05 21:56:19 +0000489def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000490def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
491 "ADC(16|32|64)i",
492 "ADC(8|16|32|64)rr",
493 "ADCX(32|64)rr",
494 "ADOX(32|64)rr",
495 "BT(16|32|64)ri8",
496 "BT(16|32|64)rr",
497 "BTC(16|32|64)ri8",
498 "BTC(16|32|64)rr",
499 "BTR(16|32|64)ri8",
500 "BTR(16|32|64)rr",
501 "BTS(16|32|64)ri8",
502 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000503 "SBB(16|32|64)ri",
504 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000505 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000506
507def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
508 let Latency = 1;
509 let NumMicroOps = 1;
510 let ResourceCycles = [1];
511}
Craig Topper5a69a002018-03-21 06:28:42 +0000512def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
513 "BLSI(32|64)rr",
514 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000515 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000516
517def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
518 let Latency = 1;
519 let NumMicroOps = 1;
520 let ResourceCycles = [1];
521}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000522def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000523 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000524
525def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
526 let Latency = 1;
527 let NumMicroOps = 1;
528 let ResourceCycles = [1];
529}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000530def: InstRW<[BWWriteResGroup9], (instrs LAHF, SAHF)>; // TODO: This doesnt match Agner's data
531def: InstRW<[BWWriteResGroup9], (instregex "NOOP",
Craig Topper5a69a002018-03-21 06:28:42 +0000532 "SGDT64m",
533 "SIDT64m",
Craig Topper5a69a002018-03-21 06:28:42 +0000534 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000535 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000536 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000537
538def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
539 let Latency = 1;
540 let NumMicroOps = 2;
541 let ResourceCycles = [1,1];
542}
Craig Topper5a69a002018-03-21 06:28:42 +0000543def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
544 "MMX_MOVD64from64rm",
545 "MMX_MOVD64mr",
546 "MMX_MOVNTQmr",
547 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000548 "MOVNTI_64mr",
549 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000550 "ST_FP(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000551 "VEXTRACTF128mr",
552 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000553 "(V?)MOVAPD(Y?)mr",
554 "(V?)MOVAPS(Y?)mr",
555 "(V?)MOVDQA(Y?)mr",
556 "(V?)MOVDQU(Y?)mr",
557 "(V?)MOVHPDmr",
558 "(V?)MOVHPSmr",
559 "(V?)MOVLPDmr",
560 "(V?)MOVLPSmr",
561 "(V?)MOVNTDQ(V?)mr",
562 "(V?)MOVNTPD(V?)mr",
563 "(V?)MOVNTPS(V?)mr",
564 "(V?)MOVPDI2DImr",
565 "(V?)MOVPQI2QImr",
566 "(V?)MOVPQIto64mr",
567 "(V?)MOVSDmr",
568 "(V?)MOVSSmr",
569 "(V?)MOVUPD(Y?)mr",
570 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000571
Gadi Haber323f2e12017-10-24 20:19:47 +0000572def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
573 let Latency = 2;
574 let NumMicroOps = 2;
575 let ResourceCycles = [2];
576}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000577def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000578
579def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
580 let Latency = 2;
581 let NumMicroOps = 2;
582 let ResourceCycles = [2];
583}
Craig Topper5a69a002018-03-21 06:28:42 +0000584def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
585 "ROL(8|16|32|64)ri",
586 "ROR(8|16|32|64)r1",
587 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000588
589def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
590 let Latency = 2;
591 let NumMicroOps = 2;
592 let ResourceCycles = [2];
593}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000594def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
595 MFENCE,
596 WAIT,
597 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000598
599def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
600 let Latency = 2;
601 let NumMicroOps = 2;
602 let ResourceCycles = [1,1];
603}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000604def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000605 "(V?)CVTPS2PDrr",
Simon Pilgrim210286e2018-05-08 10:28:03 +0000606 "(V?)CVTSS2SDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000607
608def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
609 let Latency = 2;
610 let NumMicroOps = 2;
611 let ResourceCycles = [1,1];
612}
613def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
614
615def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
616 let Latency = 2;
617 let NumMicroOps = 2;
618 let ResourceCycles = [1,1];
619}
620def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
621
622def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
623 let Latency = 2;
624 let NumMicroOps = 2;
625 let ResourceCycles = [1,1];
626}
627def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
628
629def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
630 let Latency = 2;
631 let NumMicroOps = 2;
632 let ResourceCycles = [1,1];
633}
Craig Topper498875f2018-04-04 17:54:19 +0000634def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
635
636def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
637 let Latency = 1;
638 let NumMicroOps = 1;
639 let ResourceCycles = [1];
640}
641def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000642
643def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
644 let Latency = 2;
645 let NumMicroOps = 2;
646 let ResourceCycles = [1,1];
647}
Craig Topper2d451e72018-03-18 08:38:06 +0000648def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000649def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000650def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
651 "ADC8ri",
652 "CMOV(A|BE)(16|32|64)rr",
653 "SBB8i8",
654 "SBB8ri",
655 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000656
Gadi Haber323f2e12017-10-24 20:19:47 +0000657def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
658 let Latency = 2;
659 let NumMicroOps = 3;
660 let ResourceCycles = [1,1,1];
661}
662def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
663
Gadi Haber323f2e12017-10-24 20:19:47 +0000664def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
665 let Latency = 2;
666 let NumMicroOps = 3;
667 let ResourceCycles = [1,1,1];
668}
669def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
670
671def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
672 let Latency = 2;
673 let NumMicroOps = 3;
674 let ResourceCycles = [1,1,1];
675}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000676def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
677 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000678def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000679 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000680
Gadi Haber323f2e12017-10-24 20:19:47 +0000681def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
682 let Latency = 3;
683 let NumMicroOps = 1;
684 let ResourceCycles = [1];
685}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000686def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000687 "PDEP(32|64)rr",
688 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000689 "SHLD(16|32|64)rri8",
690 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000691 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000692
693def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000694 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000695 let NumMicroOps = 2;
696 let ResourceCycles = [1,1];
697}
Clement Courbet327fac42018-03-07 08:14:02 +0000698def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000699
700def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
701 let Latency = 3;
702 let NumMicroOps = 1;
703 let ResourceCycles = [1];
704}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000705def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
Simon Pilgrime480ed02018-05-07 18:25:19 +0000706 "VPBROADCASTWrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000707
Gadi Haber323f2e12017-10-24 20:19:47 +0000708def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000709 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000710 let NumMicroOps = 3;
711 let ResourceCycles = [3];
712}
Craig Topperb5f26592018-04-19 18:00:17 +0000713def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
714 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
715 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000716
Gadi Haber323f2e12017-10-24 20:19:47 +0000717def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
718 let Latency = 3;
719 let NumMicroOps = 3;
720 let ResourceCycles = [2,1];
721}
Craig Topper5a69a002018-03-21 06:28:42 +0000722def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
723 "MMX_PACKSSWBirr",
724 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000725
726def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
727 let Latency = 3;
728 let NumMicroOps = 3;
729 let ResourceCycles = [1,2];
730}
731def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
732
733def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
734 let Latency = 3;
735 let NumMicroOps = 3;
736 let ResourceCycles = [1,2];
737}
Craig Topper5a69a002018-03-21 06:28:42 +0000738def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
739 "RCL(8|16|32|64)ri",
740 "RCR(8|16|32|64)r1",
741 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000742
743def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
744 let Latency = 3;
745 let NumMicroOps = 3;
746 let ResourceCycles = [2,1];
747}
Craig Topper5a69a002018-03-21 06:28:42 +0000748def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
749 "ROR(8|16|32|64)rCL",
750 "SAR(8|16|32|64)rCL",
751 "SHL(8|16|32|64)rCL",
752 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000753
754def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
755 let Latency = 3;
756 let NumMicroOps = 4;
757 let ResourceCycles = [1,1,1,1];
758}
759def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
760
761def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
762 let Latency = 3;
763 let NumMicroOps = 4;
764 let ResourceCycles = [1,1,1,1];
765}
Craig Topper5a69a002018-03-21 06:28:42 +0000766def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
767 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000768
769def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
770 let Latency = 4;
771 let NumMicroOps = 2;
772 let ResourceCycles = [1,1];
773}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000774def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
775 "(V?)CVTSD2SIrr",
776 "(V?)CVTSS2SI64rr",
777 "(V?)CVTSS2SIrr",
778 "(V?)CVTTSD2SI64rr",
779 "(V?)CVTTSD2SIrr",
780 "(V?)CVTTSS2SI64rr",
781 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000782
783def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
784 let Latency = 4;
785 let NumMicroOps = 2;
786 let ResourceCycles = [1,1];
787}
Simon Pilgrim210286e2018-05-08 10:28:03 +0000788def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000789
790def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
791 let Latency = 4;
792 let NumMicroOps = 2;
793 let ResourceCycles = [1,1];
794}
795def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
796
797def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
798 let Latency = 4;
799 let NumMicroOps = 2;
800 let ResourceCycles = [1,1];
801}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000802def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000803def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000804 "MMX_CVTPI2PDirr",
805 "MMX_CVTPS2PIirr",
806 "MMX_CVTTPD2PIirr",
807 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000808 "(V?)CVTDQ2PDrr",
809 "(V?)CVTPD2DQrr",
810 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000811 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000812 "(V?)CVTSD2SSrr",
813 "(V?)CVTSI642SDrr",
814 "(V?)CVTSI2SDrr",
815 "(V?)CVTSI2SSrr",
816 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000817
818def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
819 let Latency = 4;
820 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000821 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000822}
Craig Topper5a69a002018-03-21 06:28:42 +0000823def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000824
825def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
826 let Latency = 4;
827 let NumMicroOps = 3;
828 let ResourceCycles = [1,1,1];
829}
830def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
831
832def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
833 let Latency = 4;
834 let NumMicroOps = 3;
835 let ResourceCycles = [1,1,1];
836}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000837def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
838 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000839
840def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
841 let Latency = 4;
842 let NumMicroOps = 4;
843 let ResourceCycles = [4];
844}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000845def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000846
847def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
848 let Latency = 4;
849 let NumMicroOps = 4;
850 let ResourceCycles = [1,3];
851}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000852def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000853
854def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
855 let Latency = 5;
856 let NumMicroOps = 1;
857 let ResourceCycles = [1];
858}
Simon Pilgrima53d3302018-05-02 16:16:24 +0000859def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr",
860 "MUL_FPrST0",
861 "MUL_FST0r",
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000862 "MUL_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000863
Gadi Haber323f2e12017-10-24 20:19:47 +0000864def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
865 let Latency = 5;
866 let NumMicroOps = 1;
867 let ResourceCycles = [1];
868}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000869def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000870 "MOVSX(16|32|64)rm32",
871 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000872 "MOVZX(16|32|64)rm16",
873 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000874 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000875 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000876 "(V?)MOVSHDUPrm",
877 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000878 "VPBROADCASTDrm",
879 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000880
881def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
882 let Latency = 5;
883 let NumMicroOps = 3;
884 let ResourceCycles = [1,2];
885}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000886def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000887
888def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
889 let Latency = 5;
890 let NumMicroOps = 3;
891 let ResourceCycles = [1,1,1];
892}
893def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
894
895def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000896 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000897 let NumMicroOps = 3;
898 let ResourceCycles = [1,1,1];
899}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000900def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000901
902def BWWriteResGroup53 : SchedWriteRes<[BWPort0,BWPort4,BWPort237,BWPort15]> {
903 let Latency = 5;
904 let NumMicroOps = 4;
905 let ResourceCycles = [1,1,1,1];
906}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000907def: InstRW<[BWWriteResGroup53], (instregex "VMASKMOVPD(Y?)mr",
908 "VMASKMOVPS(Y?)mr",
909 "VPMASKMOVD(Y?)mr",
910 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000911
912def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
913 let Latency = 5;
914 let NumMicroOps = 5;
915 let ResourceCycles = [1,4];
916}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000917def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000918
919def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
920 let Latency = 5;
921 let NumMicroOps = 5;
922 let ResourceCycles = [1,4];
923}
924def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
925
926def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
927 let Latency = 5;
928 let NumMicroOps = 5;
929 let ResourceCycles = [2,3];
930}
Craig Topper5a69a002018-03-21 06:28:42 +0000931def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000932
933def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
934 let Latency = 5;
935 let NumMicroOps = 6;
936 let ResourceCycles = [1,1,4];
937}
Craig Topper5a69a002018-03-21 06:28:42 +0000938def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000939
940def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
941 let Latency = 6;
942 let NumMicroOps = 1;
943 let ResourceCycles = [1];
944}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000945def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000946 "VBROADCASTF128",
947 "VBROADCASTI128",
948 "VBROADCASTSDYrm",
949 "VBROADCASTSSYrm",
950 "VLDDQUYrm",
951 "VMOVAPDYrm",
952 "VMOVAPSYrm",
953 "VMOVDDUPYrm",
954 "VMOVDQAYrm",
955 "VMOVDQUYrm",
956 "VMOVNTDQAYrm",
957 "VMOVSHDUPYrm",
958 "VMOVSLDUPYrm",
959 "VMOVUPDYrm",
960 "VMOVUPSYrm",
961 "VPBROADCASTDYrm",
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000962 "VPBROADCASTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000963
964def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
965 let Latency = 6;
966 let NumMicroOps = 2;
967 let ResourceCycles = [1,1];
968}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000969def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000970 "(V?)CVTPS2PDrm",
971 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000972 "VPSLLVQrm",
Simon Pilgrim210286e2018-05-08 10:28:03 +0000973 "VPSRLVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000974
975def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
976 let Latency = 6;
977 let NumMicroOps = 2;
978 let ResourceCycles = [1,1];
979}
Craig Topper5a69a002018-03-21 06:28:42 +0000980def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
981 "VCVTPD2DQYrr",
982 "VCVTPD2PSYrr",
983 "VCVTPS2PHYrr",
984 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000985
Gadi Haber323f2e12017-10-24 20:19:47 +0000986def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
987 let Latency = 6;
988 let NumMicroOps = 2;
989 let ResourceCycles = [1,1];
990}
Craig Topper5a69a002018-03-21 06:28:42 +0000991def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
992 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000993
994def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
995 let Latency = 6;
996 let NumMicroOps = 2;
997 let ResourceCycles = [1,1];
998}
Craig Topperdfccafe2018-04-18 06:41:25 +0000999def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001000def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
1001 ADCX32rm, ADCX64rm,
1002 ADOX32rm, ADOX64rm,
1003 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001004
1005def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
1006 let Latency = 6;
1007 let NumMicroOps = 2;
1008 let ResourceCycles = [1,1];
1009}
Craig Topper5a69a002018-03-21 06:28:42 +00001010def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
1011 "BLSI(32|64)rm",
1012 "BLSMSK(32|64)rm",
1013 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001014 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001015
1016def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
1017 let Latency = 6;
1018 let NumMicroOps = 2;
1019 let ResourceCycles = [1,1];
1020}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001021def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +00001022 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001023 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001024
1025def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1026 let Latency = 6;
1027 let NumMicroOps = 2;
1028 let ResourceCycles = [1,1];
1029}
Craig Topper2d451e72018-03-18 08:38:06 +00001030def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001031def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001032
1033def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1034 let Latency = 6;
1035 let NumMicroOps = 4;
1036 let ResourceCycles = [1,1,2];
1037}
Craig Topper5a69a002018-03-21 06:28:42 +00001038def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1039 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001040
1041def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1042 let Latency = 6;
1043 let NumMicroOps = 4;
1044 let ResourceCycles = [1,1,1,1];
1045}
1046def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1047
1048def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1049 let Latency = 6;
1050 let NumMicroOps = 4;
1051 let ResourceCycles = [1,1,1,1];
1052}
Craig Topper5a69a002018-03-21 06:28:42 +00001053def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1054 "BTR(16|32|64)mi8",
1055 "BTS(16|32|64)mi8",
1056 "SAR(8|16|32|64)m1",
1057 "SAR(8|16|32|64)mi",
1058 "SHL(8|16|32|64)m1",
1059 "SHL(8|16|32|64)mi",
1060 "SHR(8|16|32|64)m1",
1061 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001062
1063def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1064 let Latency = 6;
1065 let NumMicroOps = 4;
1066 let ResourceCycles = [1,1,1,1];
1067}
Craig Topperf0d04262018-04-06 16:16:48 +00001068def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1069 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001070
1071def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1072 let Latency = 6;
1073 let NumMicroOps = 6;
1074 let ResourceCycles = [1,5];
1075}
1076def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1077
Gadi Haber323f2e12017-10-24 20:19:47 +00001078def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1079 let Latency = 7;
1080 let NumMicroOps = 2;
1081 let ResourceCycles = [1,1];
1082}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001083def: InstRW<[BWWriteResGroup73], (instregex "VPSLLVQYrm",
Simon Pilgrim210286e2018-05-08 10:28:03 +00001084 "VPSRLVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001085
1086def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1087 let Latency = 7;
1088 let NumMicroOps = 2;
1089 let ResourceCycles = [1,1];
1090}
Craig Topper5a69a002018-03-21 06:28:42 +00001091def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1092 "FCOM64m",
1093 "FCOMP32m",
1094 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001095
Gadi Haber323f2e12017-10-24 20:19:47 +00001096def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1097 let Latency = 7;
1098 let NumMicroOps = 2;
1099 let ResourceCycles = [1,1];
1100}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001101def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001102
Gadi Haber323f2e12017-10-24 20:19:47 +00001103def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1104 let Latency = 7;
1105 let NumMicroOps = 3;
1106 let ResourceCycles = [2,1];
1107}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001108def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001109 "MMX_PACKSSWBirm",
1110 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001111 "VMASKMOVPDrm",
1112 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001113 "VPMASKMOVDrm",
1114 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001115
1116def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1117 let Latency = 7;
1118 let NumMicroOps = 3;
1119 let ResourceCycles = [1,2];
1120}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001121def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1122 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001123
Gadi Haber323f2e12017-10-24 20:19:47 +00001124def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1125 let Latency = 7;
1126 let NumMicroOps = 3;
1127 let ResourceCycles = [1,1,1];
1128}
1129def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1130
Gadi Haber323f2e12017-10-24 20:19:47 +00001131def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1132 let Latency = 7;
1133 let NumMicroOps = 3;
1134 let ResourceCycles = [1,1,1];
1135}
Craig Topper5a69a002018-03-21 06:28:42 +00001136def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1137 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001138
Gadi Haber323f2e12017-10-24 20:19:47 +00001139def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1140 let Latency = 7;
1141 let NumMicroOps = 3;
1142 let ResourceCycles = [1,1,1];
1143}
Craig Topperf4cd9082018-01-19 05:47:32 +00001144def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001145
1146def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1147 let Latency = 7;
1148 let NumMicroOps = 5;
1149 let ResourceCycles = [1,1,1,2];
1150}
Craig Topper5a69a002018-03-21 06:28:42 +00001151def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1152 "ROL(8|16|32|64)mi",
1153 "ROR(8|16|32|64)m1",
1154 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001155
1156def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1157 let Latency = 7;
1158 let NumMicroOps = 5;
1159 let ResourceCycles = [1,1,1,2];
1160}
Craig Topper5a69a002018-03-21 06:28:42 +00001161def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001162
1163def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1164 let Latency = 7;
1165 let NumMicroOps = 5;
1166 let ResourceCycles = [1,1,1,1,1];
1167}
Craig Topper5a69a002018-03-21 06:28:42 +00001168def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1169 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001170
1171def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1172 let Latency = 7;
1173 let NumMicroOps = 7;
1174 let ResourceCycles = [2,2,1,2];
1175}
Craig Topper2d451e72018-03-18 08:38:06 +00001176def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001177
1178def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1179 let Latency = 8;
1180 let NumMicroOps = 2;
1181 let ResourceCycles = [1,1];
1182}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001183def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001184 "PDEP(32|64)rm",
1185 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001186 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001187
1188def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001189 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001190 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001191 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001192}
Craig Topperf846e2d2018-04-19 05:34:05 +00001193def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001194
Craig Topperf846e2d2018-04-19 05:34:05 +00001195def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1196 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001197 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001198 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001199}
Craig Topper5a69a002018-03-21 06:28:42 +00001200def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001201
Gadi Haber323f2e12017-10-24 20:19:47 +00001202def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1203 let Latency = 8;
1204 let NumMicroOps = 2;
1205 let ResourceCycles = [1,1];
1206}
Craig Topper5a69a002018-03-21 06:28:42 +00001207def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1208 "VPMOVSXBQYrm",
1209 "VPMOVSXBWYrm",
1210 "VPMOVSXDQYrm",
1211 "VPMOVSXWDYrm",
1212 "VPMOVSXWQYrm",
1213 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001214
Gadi Haber323f2e12017-10-24 20:19:47 +00001215def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1216 let Latency = 8;
1217 let NumMicroOps = 3;
1218 let ResourceCycles = [2,1];
1219}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001220def: InstRW<[BWWriteResGroup94], (instregex "VMASKMOVPDYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001221 "VMASKMOVPSYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001222 "VPMASKMOVDYrm",
1223 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001224
Gadi Haber323f2e12017-10-24 20:19:47 +00001225def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1226 let Latency = 8;
1227 let NumMicroOps = 5;
1228 let ResourceCycles = [1,1,1,2];
1229}
Craig Topper5a69a002018-03-21 06:28:42 +00001230def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1231 "RCL(8|16|32|64)mi",
1232 "RCR(8|16|32|64)m1",
1233 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001234
1235def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1236 let Latency = 8;
1237 let NumMicroOps = 5;
1238 let ResourceCycles = [1,1,2,1];
1239}
Craig Topper13a16502018-03-19 00:56:09 +00001240def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001241
1242def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1243 let Latency = 8;
1244 let NumMicroOps = 6;
1245 let ResourceCycles = [1,1,1,3];
1246}
Craig Topper9f834812018-04-01 21:54:24 +00001247def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001248
1249def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1250 let Latency = 8;
1251 let NumMicroOps = 6;
1252 let ResourceCycles = [1,1,1,2,1];
1253}
Craig Topper9f834812018-04-01 21:54:24 +00001254def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001255 "CMPXCHG(8|16|32|64)rm",
1256 "ROL(8|16|32|64)mCL",
1257 "SAR(8|16|32|64)mCL",
1258 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001259 "SHL(8|16|32|64)mCL",
1260 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001261def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1262 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001263
1264def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1265 let Latency = 9;
1266 let NumMicroOps = 2;
1267 let ResourceCycles = [1,1];
1268}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001269def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1270 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001271 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001272 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001273
1274def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1275 let Latency = 9;
1276 let NumMicroOps = 2;
1277 let ResourceCycles = [1,1];
1278}
Craig Topper5a69a002018-03-21 06:28:42 +00001279def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1280 "VPERM2I128rm",
1281 "VPERMDYrm",
1282 "VPERMPDYmi",
1283 "VPERMPSYrm",
1284 "VPERMQYmi",
1285 "VPMOVZXBDYrm",
1286 "VPMOVZXBQYrm",
1287 "VPMOVZXBWYrm",
1288 "VPMOVZXDQYrm",
1289 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001290
Gadi Haber323f2e12017-10-24 20:19:47 +00001291def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1292 let Latency = 9;
1293 let NumMicroOps = 3;
1294 let ResourceCycles = [1,1,1];
1295}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001296def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1297 "(V?)CVTSD2SIrm",
1298 "(V?)CVTSS2SI64rm",
1299 "(V?)CVTSS2SIrm",
1300 "(V?)CVTTSD2SI64rm",
1301 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001302 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001303 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001304
1305def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1306 let Latency = 9;
1307 let NumMicroOps = 3;
1308 let ResourceCycles = [1,1,1];
1309}
1310def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1311
1312def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1313 let Latency = 9;
1314 let NumMicroOps = 3;
1315 let ResourceCycles = [1,1,1];
1316}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001317def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001318def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001319 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001320 "CVTTPD2DQrm",
1321 "MMX_CVTPD2PIirm",
1322 "MMX_CVTPI2PDirm",
1323 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001324 "(V?)CVTDQ2PDrm",
1325 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001326
1327def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1328 let Latency = 9;
1329 let NumMicroOps = 3;
1330 let ResourceCycles = [1,1,1];
1331}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001332def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1333 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001334
Gadi Haber323f2e12017-10-24 20:19:47 +00001335def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1336 let Latency = 9;
1337 let NumMicroOps = 4;
1338 let ResourceCycles = [1,1,1,1];
1339}
Craig Topper5a69a002018-03-21 06:28:42 +00001340def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1341 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001342
1343def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1344 let Latency = 9;
1345 let NumMicroOps = 5;
1346 let ResourceCycles = [1,1,3];
1347}
1348def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1349
1350def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1351 let Latency = 9;
1352 let NumMicroOps = 5;
1353 let ResourceCycles = [1,2,1,1];
1354}
Craig Topper5a69a002018-03-21 06:28:42 +00001355def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1356 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001357
Gadi Haber323f2e12017-10-24 20:19:47 +00001358def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1359 let Latency = 10;
1360 let NumMicroOps = 2;
1361 let ResourceCycles = [1,1];
1362}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001363def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001364
Gadi Haber323f2e12017-10-24 20:19:47 +00001365def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1366 let Latency = 10;
1367 let NumMicroOps = 3;
1368 let ResourceCycles = [2,1];
1369}
Craig Topper5a69a002018-03-21 06:28:42 +00001370def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1371 "FICOM32m",
1372 "FICOMP16m",
1373 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001374
Gadi Haber323f2e12017-10-24 20:19:47 +00001375def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1376 let Latency = 10;
1377 let NumMicroOps = 4;
1378 let ResourceCycles = [1,1,1,1];
1379}
1380def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1381
1382def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001383 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001384 let NumMicroOps = 4;
1385 let ResourceCycles = [1,1,1,1];
1386}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001387def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001388
Craig Topper8104f262018-04-02 05:33:28 +00001389def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1390 let Latency = 11;
1391 let NumMicroOps = 1;
1392 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1393}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001394def : SchedAlias<WriteFDiv, BWWriteResGroup122_1>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001395
1396def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1397 let Latency = 11;
1398 let NumMicroOps = 2;
1399 let ResourceCycles = [1,1];
1400}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001401def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001402 "VPCMPGTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001403
Gadi Haber323f2e12017-10-24 20:19:47 +00001404def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1405 let Latency = 11;
1406 let NumMicroOps = 3;
1407 let ResourceCycles = [1,1,1];
1408}
1409def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1410
Gadi Haber323f2e12017-10-24 20:19:47 +00001411def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1412 let Latency = 11;
1413 let NumMicroOps = 6;
1414 let ResourceCycles = [1,1,1,1,2];
1415}
Craig Topper5a69a002018-03-21 06:28:42 +00001416def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1417 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001418
1419def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1420 let Latency = 11;
1421 let NumMicroOps = 7;
1422 let ResourceCycles = [2,2,3];
1423}
Craig Topper5a69a002018-03-21 06:28:42 +00001424def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1425 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001426
1427def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1428 let Latency = 11;
1429 let NumMicroOps = 9;
1430 let ResourceCycles = [1,4,1,3];
1431}
1432def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1433
1434def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1435 let Latency = 11;
1436 let NumMicroOps = 11;
1437 let ResourceCycles = [2,9];
1438}
Craig Topper2d451e72018-03-18 08:38:06 +00001439def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1440def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001441
Gadi Haber323f2e12017-10-24 20:19:47 +00001442def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1443 let Latency = 12;
1444 let NumMicroOps = 3;
1445 let ResourceCycles = [2,1];
1446}
Simon Pilgrimbe51b202018-05-04 12:59:24 +00001447def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001448
Craig Topper8104f262018-04-02 05:33:28 +00001449def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1450 let Latency = 14;
1451 let NumMicroOps = 1;
1452 let ResourceCycles = [1,4];
1453}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001454def : SchedAlias<WriteFDiv64, BWWriteResGroup139_1>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001455
Gadi Haber323f2e12017-10-24 20:19:47 +00001456def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1457 let Latency = 14;
1458 let NumMicroOps = 3;
1459 let ResourceCycles = [1,1,1];
1460}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001461def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001462
Gadi Haber323f2e12017-10-24 20:19:47 +00001463def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1464 let Latency = 14;
1465 let NumMicroOps = 8;
1466 let ResourceCycles = [2,2,1,3];
1467}
1468def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1469
1470def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1471 let Latency = 14;
1472 let NumMicroOps = 10;
1473 let ResourceCycles = [2,3,1,4];
1474}
1475def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1476
1477def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1478 let Latency = 14;
1479 let NumMicroOps = 12;
1480 let ResourceCycles = [2,1,4,5];
1481}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001482def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001483
1484def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1485 let Latency = 15;
1486 let NumMicroOps = 1;
1487 let ResourceCycles = [1];
1488}
Craig Topper5a69a002018-03-21 06:28:42 +00001489def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1490 "DIVR_FST0r",
1491 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001492
Gadi Haber323f2e12017-10-24 20:19:47 +00001493def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1494 let Latency = 15;
1495 let NumMicroOps = 10;
1496 let ResourceCycles = [1,1,1,4,1,2];
1497}
Craig Topper13a16502018-03-19 00:56:09 +00001498def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001499
Craig Topper8104f262018-04-02 05:33:28 +00001500def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001501 let Latency = 16;
1502 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001503 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001504}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001505def : SchedAlias<WriteFDivLd, BWWriteResGroup150>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001506
Gadi Haber323f2e12017-10-24 20:19:47 +00001507def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1508 let Latency = 16;
1509 let NumMicroOps = 14;
1510 let ResourceCycles = [1,1,1,4,2,5];
1511}
1512def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1513
1514def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1515 let Latency = 16;
1516 let NumMicroOps = 16;
1517 let ResourceCycles = [16];
1518}
Craig Topper5a69a002018-03-21 06:28:42 +00001519def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001520
Gadi Haber323f2e12017-10-24 20:19:47 +00001521def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1522 let Latency = 18;
1523 let NumMicroOps = 8;
1524 let ResourceCycles = [1,1,1,5];
1525}
Craig Topper5a69a002018-03-21 06:28:42 +00001526def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001527def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001528
1529def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1530 let Latency = 18;
1531 let NumMicroOps = 11;
1532 let ResourceCycles = [2,1,1,3,1,3];
1533}
Craig Topper13a16502018-03-19 00:56:09 +00001534def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001535
Craig Topper8104f262018-04-02 05:33:28 +00001536def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001537 let Latency = 19;
1538 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001539 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001540}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001541def : SchedAlias<WriteFDiv64Ld, BWWriteResGroup161>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001542
Gadi Haber323f2e12017-10-24 20:19:47 +00001543def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1544 let Latency = 20;
1545 let NumMicroOps = 1;
1546 let ResourceCycles = [1];
1547}
Craig Topper5a69a002018-03-21 06:28:42 +00001548def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1549 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001550 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001551
Gadi Haber323f2e12017-10-24 20:19:47 +00001552def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1553 let Latency = 20;
1554 let NumMicroOps = 8;
1555 let ResourceCycles = [1,1,1,1,1,1,2];
1556}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001557def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001558
Gadi Haber323f2e12017-10-24 20:19:47 +00001559def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1560 let Latency = 21;
1561 let NumMicroOps = 2;
1562 let ResourceCycles = [1,1];
1563}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001564def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001565
Gadi Haber323f2e12017-10-24 20:19:47 +00001566def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1567 let Latency = 21;
1568 let NumMicroOps = 19;
1569 let ResourceCycles = [2,1,4,1,1,4,6];
1570}
1571def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1572
1573def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1574 let Latency = 22;
1575 let NumMicroOps = 18;
1576 let ResourceCycles = [1,1,16];
1577}
1578def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1579
Gadi Haber323f2e12017-10-24 20:19:47 +00001580def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1581 let Latency = 23;
1582 let NumMicroOps = 19;
1583 let ResourceCycles = [3,1,15];
1584}
Craig Topper391c6f92017-12-10 01:24:08 +00001585def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001586
1587def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1588 let Latency = 24;
1589 let NumMicroOps = 3;
1590 let ResourceCycles = [1,1,1];
1591}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001592def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001593
Gadi Haber323f2e12017-10-24 20:19:47 +00001594def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1595 let Latency = 26;
1596 let NumMicroOps = 2;
1597 let ResourceCycles = [1,1];
1598}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001599def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001600
Gadi Haber323f2e12017-10-24 20:19:47 +00001601def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1602 let Latency = 29;
1603 let NumMicroOps = 3;
1604 let ResourceCycles = [1,1,1];
1605}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001606def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001607
Gadi Haber323f2e12017-10-24 20:19:47 +00001608def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1609 let Latency = 22;
1610 let NumMicroOps = 7;
1611 let ResourceCycles = [1,3,2,1];
1612}
Craig Topper17a31182017-12-16 18:35:29 +00001613def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001614
1615def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1616 let Latency = 23;
1617 let NumMicroOps = 9;
1618 let ResourceCycles = [1,3,4,1];
1619}
Craig Topper17a31182017-12-16 18:35:29 +00001620def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001621
1622def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1623 let Latency = 24;
1624 let NumMicroOps = 9;
1625 let ResourceCycles = [1,5,2,1];
1626}
Craig Topper17a31182017-12-16 18:35:29 +00001627def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001628
1629def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1630 let Latency = 25;
1631 let NumMicroOps = 7;
1632 let ResourceCycles = [1,3,2,1];
1633}
Craig Topper17a31182017-12-16 18:35:29 +00001634def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1635 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001636
1637def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1638 let Latency = 26;
1639 let NumMicroOps = 9;
1640 let ResourceCycles = [1,5,2,1];
1641}
Craig Topper17a31182017-12-16 18:35:29 +00001642def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001643
1644def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1645 let Latency = 26;
1646 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001647 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001648}
Craig Topper17a31182017-12-16 18:35:29 +00001649def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001650
1651def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1652 let Latency = 27;
1653 let NumMicroOps = 9;
1654 let ResourceCycles = [1,5,2,1];
1655}
Craig Topper17a31182017-12-16 18:35:29 +00001656def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001657
Gadi Haber323f2e12017-10-24 20:19:47 +00001658def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1659 let Latency = 29;
1660 let NumMicroOps = 27;
1661 let ResourceCycles = [1,5,1,1,19];
1662}
1663def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1664
1665def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1666 let Latency = 30;
1667 let NumMicroOps = 28;
1668 let ResourceCycles = [1,6,1,1,19];
1669}
Craig Topper2d451e72018-03-18 08:38:06 +00001670def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001671
Gadi Haber323f2e12017-10-24 20:19:47 +00001672def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1673 let Latency = 34;
1674 let NumMicroOps = 8;
1675 let ResourceCycles = [2,2,2,1,1];
1676}
Craig Topper13a16502018-03-19 00:56:09 +00001677def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001678
1679def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
1680 let Latency = 34;
1681 let NumMicroOps = 23;
1682 let ResourceCycles = [1,5,3,4,10];
1683}
Craig Topper5a69a002018-03-21 06:28:42 +00001684def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
1685 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001686
1687def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1688 let Latency = 35;
1689 let NumMicroOps = 8;
1690 let ResourceCycles = [2,2,2,1,1];
1691}
Craig Topper13a16502018-03-19 00:56:09 +00001692def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001693
1694def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1695 let Latency = 35;
1696 let NumMicroOps = 23;
1697 let ResourceCycles = [1,5,2,1,4,10];
1698}
Craig Topper5a69a002018-03-21 06:28:42 +00001699def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
1700 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001701
Gadi Haber323f2e12017-10-24 20:19:47 +00001702def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
1703 let Latency = 42;
1704 let NumMicroOps = 22;
1705 let ResourceCycles = [2,20];
1706}
Craig Topper2d451e72018-03-18 08:38:06 +00001707def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001708
1709def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
1710 let Latency = 60;
1711 let NumMicroOps = 64;
1712 let ResourceCycles = [2,2,8,1,10,2,39];
1713}
1714def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001715
1716def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1717 let Latency = 63;
1718 let NumMicroOps = 88;
1719 let ResourceCycles = [4,4,31,1,2,1,45];
1720}
Craig Topper2d451e72018-03-18 08:38:06 +00001721def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001722
1723def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1724 let Latency = 63;
1725 let NumMicroOps = 90;
1726 let ResourceCycles = [4,2,33,1,2,1,47];
1727}
Craig Topper2d451e72018-03-18 08:38:06 +00001728def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001729
1730def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
1731 let Latency = 75;
1732 let NumMicroOps = 15;
1733 let ResourceCycles = [6,3,6];
1734}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00001735def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001736
1737def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
1738 let Latency = 80;
1739 let NumMicroOps = 32;
1740 let ResourceCycles = [7,7,3,3,1,11];
1741}
1742def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
1743
1744def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
1745 let Latency = 115;
1746 let NumMicroOps = 100;
1747 let ResourceCycles = [9,9,11,8,1,11,21,30];
1748}
1749def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001750
1751} // SchedModel
1752