blob: 036cfa54162f51571af349d01c97050836c24fa4 [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 Pilgrimdd8eae12018-05-01 14:25:01 +0000223defm : BWWriteResPair<WriteFShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector shuffles.
224defm : BWWriteResPair<WriteFShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000225defm : BWWriteResPair<WriteFVarShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector variable shuffles.
226defm : BWWriteResPair<WriteFVarShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
227defm : BWWriteResPair<WriteFBlend, [BWPort015], 1, [1], 1, 5>; // Floating point vector blends.
228defm : BWWriteResPair<WriteFBlendY, [BWPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000229defm : BWWriteResPair<WriteFVarBlend, [BWPort5], 2, [2], 2, 5>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000230defm : BWWriteResPair<WriteFVarBlendY, [BWPort5], 2, [2], 2, 6>; // Fp vector variable blends.
Gadi Haber323f2e12017-10-24 20:19:47 +0000231
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000232def : WriteRes<WriteCvtF2FSt, [BWPort1,BWPort4,BWPort237]> {
233 let Latency = 4;
234 let NumMicroOps = 3;
235 let ResourceCycles = [1,1,1];
236}
237
Gadi Haber323f2e12017-10-24 20:19:47 +0000238// FMA Scheduling helper class.
239// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
240
241// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000242def : WriteRes<WriteVecLoad, [BWPort23]> { let Latency = 5; }
243def : WriteRes<WriteVecStore, [BWPort237, BWPort4]>;
244def : WriteRes<WriteVecMove, [BWPort015]>;
Simon Pilgrim0e51a122018-05-04 18:16:13 +0000245defm : X86WriteRes<WriteEMMS, [BWPort01,BWPort15,BWPort015,BWPort0156], 31, [8,1,21,1], 31>;
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000246
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000247defm : BWWriteResPair<WriteVecALU, [BWPort15], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
248defm : BWWriteResPair<WriteVecALUY, [BWPort15], 1, [1], 1, 6>; // Vector integer ALU op, no logicals (YMM/ZMM).
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000249defm : BWWriteResPair<WriteVecLogic, [BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
250defm : BWWriteResPair<WriteVecLogicY,[BWPort015], 1, [1], 1, 6>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000251defm : BWWriteResPair<WriteVecIMul, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000252defm : BWWriteResPair<WriteVecIMulX, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000253defm : BWWriteResPair<WriteVecIMulY, [BWPort0], 5, [1], 1, 6>; // Vector integer multiply.
254defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // Vector PMULLD.
255defm : BWWriteResPair<WritePMULLDY, [BWPort0], 10, [2], 2, 6>; // Vector PMULLD (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000256defm : BWWriteResPair<WriteShuffle, [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000257defm : BWWriteResPair<WriteShuffleY, [BWPort5], 1, [1], 1, 6>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000258defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000259defm : BWWriteResPair<WriteVarShuffleY,[BWPort5], 1, [1], 1, 6>; // Vector variable shuffles (YMM/ZMM).
260defm : BWWriteResPair<WriteBlend, [BWPort5], 1, [1], 1, 5>; // Vector blends.
261defm : BWWriteResPair<WriteBlendY, [BWPort5], 1, [1], 1, 6>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000262defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000263defm : BWWriteResPair<WriteVarBlendY, [BWPort5], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000264defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000265defm : BWWriteResPair<WriteMPSADY, [BWPort0, BWPort5], 7, [1, 2], 3, 6>; // Vector MPSAD.
266defm : BWWriteResPair<WritePSADBW, [BWPort0], 5, [1], 1, 5>; // Vector PSADBW.
267defm : BWWriteResPair<WritePSADBWY, [BWPort0], 5, [1], 1, 6>; // Vector PSADBW (YMM/ZMM).
268defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000269
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000270// Vector integer shifts.
271defm : BWWriteResPair<WriteVecShift, [BWPort0], 1, [1], 1, 5>;
272defm : BWWriteResPair<WriteVecShiftX, [BWPort0,BWPort5], 2, [1,1], 2, 5>;
273defm : X86WriteRes<WriteVecShiftY, [BWPort0,BWPort5], 4, [1,1], 2>;
274defm : X86WriteRes<WriteVecShiftYLd, [BWPort0,BWPort23], 7, [1,1], 2>;
275
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000276defm : BWWriteResPair<WriteVecShiftImm, [BWPort0], 1, [1], 1, 5>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000277defm : BWWriteResPair<WriteVecShiftImmX, [BWPort0], 1, [1], 1, 5>; // Vector integer immediate shifts (XMM).
278defm : BWWriteResPair<WriteVecShiftImmY, [BWPort0], 1, [1], 1, 6>; // Vector integer immediate shifts (YMM/ZMM).
279defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 3, [2,1], 3, 5>; // Variable vector shifts.
280defm : BWWriteResPair<WriteVarVecShiftY, [BWPort0, BWPort5], 3, [2,1], 3, 6>; // Variable vector shifts (YMM/ZMM).
281
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000282// Vector insert/extract operations.
283def : WriteRes<WriteVecInsert, [BWPort5]> {
284 let Latency = 2;
285 let NumMicroOps = 2;
286 let ResourceCycles = [2];
287}
288def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
289 let Latency = 6;
290 let NumMicroOps = 2;
291}
292
293def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
294 let Latency = 2;
295 let NumMicroOps = 2;
296}
297def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
298 let Latency = 2;
299 let NumMicroOps = 3;
300}
301
Gadi Haber323f2e12017-10-24 20:19:47 +0000302// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000303defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
304defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
305defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000306
307// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000308
Gadi Haber323f2e12017-10-24 20:19:47 +0000309// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000310def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000311 let Latency = 11;
312 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000313 let ResourceCycles = [3];
314}
315def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000316 let Latency = 16;
317 let NumMicroOps = 4;
318 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000319}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000320
321// Packed Compare Explicit Length Strings, Return Mask
322def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
323 let Latency = 19;
324 let NumMicroOps = 9;
325 let ResourceCycles = [4,3,1,1];
326}
327def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
328 let Latency = 24;
329 let NumMicroOps = 10;
330 let ResourceCycles = [4,3,1,1,1];
331}
332
333// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000334def : WriteRes<WritePCmpIStrI, [BWPort0]> {
335 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000336 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000337 let ResourceCycles = [3];
338}
339def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000340 let Latency = 16;
341 let NumMicroOps = 4;
342 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000343}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000344
345// Packed Compare Explicit Length Strings, Return Index
346def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
347 let Latency = 18;
348 let NumMicroOps = 8;
349 let ResourceCycles = [4,3,1];
350}
351def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
352 let Latency = 23;
353 let NumMicroOps = 9;
354 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000355}
356
Simon Pilgrima2f26782018-03-27 20:38:54 +0000357// MOVMSK Instructions.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000358def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
359def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
360def : WriteRes<WriteVecMOVMSKY, [BWPort0]> { let Latency = 3; }
361def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
Simon Pilgrima2f26782018-03-27 20:38:54 +0000362
Gadi Haber323f2e12017-10-24 20:19:47 +0000363// AES instructions.
364def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
365 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000366 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000367 let ResourceCycles = [1];
368}
369def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000370 let Latency = 12;
371 let NumMicroOps = 2;
372 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000373}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000374
Gadi Haber323f2e12017-10-24 20:19:47 +0000375def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
376 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000377 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000378 let ResourceCycles = [2];
379}
380def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000381 let Latency = 19;
382 let NumMicroOps = 3;
383 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000384}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000385
386def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
387 let Latency = 29;
388 let NumMicroOps = 11;
389 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000390}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000391def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
392 let Latency = 33;
393 let NumMicroOps = 11;
394 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000395}
396
397// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000398defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000399
400// Catch-all for expensive system instructions.
401def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
402
403// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000404defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
405defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
406defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
407defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
Gadi Haber323f2e12017-10-24 20:19:47 +0000408
409// Old microcoded instructions that nobody use.
410def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
411
412// Fence instructions.
413def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
414
Craig Topper05242bf2018-04-21 18:07:36 +0000415// Load/store MXCSR.
416def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
417def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
418
Gadi Haber323f2e12017-10-24 20:19:47 +0000419// Nop, not very useful expect it provides a model for nops!
420def : WriteRes<WriteNop, []>;
421
422////////////////////////////////////////////////////////////////////////////////
423// Horizontal add/sub instructions.
424////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000425
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000426defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3, 5>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000427defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000428defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3, 5>;
429defm : BWWriteResPair<WritePHAddY, [BWPort5,BWPort15], 3, [2,1], 3, 6>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000430
431// Remaining instrs.
432
433def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
434 let Latency = 1;
435 let NumMicroOps = 1;
436 let ResourceCycles = [1];
437}
Craig Topper5a69a002018-03-21 06:28:42 +0000438def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
439 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000440 "(V?)MOVPDI2DIrr",
441 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000442 "VPSLLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000443 "VPSRLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000444 "VTESTPD(Y?)rr",
445 "VTESTPS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000446
447def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
448 let Latency = 1;
449 let NumMicroOps = 1;
450 let ResourceCycles = [1];
451}
Craig Topper5a69a002018-03-21 06:28:42 +0000452def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
453 "COM_FST0r",
454 "UCOM_FPr",
455 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000456
457def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
458 let Latency = 1;
459 let NumMicroOps = 1;
460 let ResourceCycles = [1];
461}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000462def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000463 "MMX_MOVD64to64rr",
464 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000465 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000466 "(V?)MOVDI2PDIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000467
468def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
469 let Latency = 1;
470 let NumMicroOps = 1;
471 let ResourceCycles = [1];
472}
473def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
474
475def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
476 let Latency = 1;
477 let NumMicroOps = 1;
478 let ResourceCycles = [1];
479}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000480def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000481
482def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
483 let Latency = 1;
484 let NumMicroOps = 1;
485 let ResourceCycles = [1];
486}
Craig Topperfbe31322018-04-05 21:56:19 +0000487def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000488def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
489 "ADC(16|32|64)i",
490 "ADC(8|16|32|64)rr",
491 "ADCX(32|64)rr",
492 "ADOX(32|64)rr",
493 "BT(16|32|64)ri8",
494 "BT(16|32|64)rr",
495 "BTC(16|32|64)ri8",
496 "BTC(16|32|64)rr",
497 "BTR(16|32|64)ri8",
498 "BTR(16|32|64)rr",
499 "BTS(16|32|64)ri8",
500 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000501 "SBB(16|32|64)ri",
502 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000503 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000504
505def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
506 let Latency = 1;
507 let NumMicroOps = 1;
508 let ResourceCycles = [1];
509}
Craig Topper5a69a002018-03-21 06:28:42 +0000510def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
511 "BLSI(32|64)rr",
512 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000513 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000514
515def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
516 let Latency = 1;
517 let NumMicroOps = 1;
518 let ResourceCycles = [1];
519}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000520def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000521 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000522
523def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
524 let Latency = 1;
525 let NumMicroOps = 1;
526 let ResourceCycles = [1];
527}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000528def: InstRW<[BWWriteResGroup9], (instrs LAHF, SAHF)>; // TODO: This doesnt match Agner's data
529def: InstRW<[BWWriteResGroup9], (instregex "NOOP",
Craig Topper5a69a002018-03-21 06:28:42 +0000530 "SGDT64m",
531 "SIDT64m",
Craig Topper5a69a002018-03-21 06:28:42 +0000532 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000533 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000534 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000535
536def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
537 let Latency = 1;
538 let NumMicroOps = 2;
539 let ResourceCycles = [1,1];
540}
Craig Topper5a69a002018-03-21 06:28:42 +0000541def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
542 "MMX_MOVD64from64rm",
543 "MMX_MOVD64mr",
544 "MMX_MOVNTQmr",
545 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000546 "MOVNTI_64mr",
547 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000548 "ST_FP(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000549 "VEXTRACTF128mr",
550 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000551 "(V?)MOVAPD(Y?)mr",
552 "(V?)MOVAPS(Y?)mr",
553 "(V?)MOVDQA(Y?)mr",
554 "(V?)MOVDQU(Y?)mr",
555 "(V?)MOVHPDmr",
556 "(V?)MOVHPSmr",
557 "(V?)MOVLPDmr",
558 "(V?)MOVLPSmr",
559 "(V?)MOVNTDQ(V?)mr",
560 "(V?)MOVNTPD(V?)mr",
561 "(V?)MOVNTPS(V?)mr",
562 "(V?)MOVPDI2DImr",
563 "(V?)MOVPQI2QImr",
564 "(V?)MOVPQIto64mr",
565 "(V?)MOVSDmr",
566 "(V?)MOVSSmr",
567 "(V?)MOVUPD(Y?)mr",
568 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000569
Gadi Haber323f2e12017-10-24 20:19:47 +0000570def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
571 let Latency = 2;
572 let NumMicroOps = 2;
573 let ResourceCycles = [2];
574}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000575def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000576
577def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
578 let Latency = 2;
579 let NumMicroOps = 2;
580 let ResourceCycles = [2];
581}
Craig Topper5a69a002018-03-21 06:28:42 +0000582def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
583 "ROL(8|16|32|64)ri",
584 "ROR(8|16|32|64)r1",
585 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000586
587def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
588 let Latency = 2;
589 let NumMicroOps = 2;
590 let ResourceCycles = [2];
591}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000592def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
593 MFENCE,
594 WAIT,
595 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000596
597def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
598 let Latency = 2;
599 let NumMicroOps = 2;
600 let ResourceCycles = [1,1];
601}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000602def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000603 "(V?)CVTPS2PDrr",
604 "(V?)CVTSS2SDrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000605 "(V?)PTESTrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000606
607def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
608 let Latency = 2;
609 let NumMicroOps = 2;
610 let ResourceCycles = [1,1];
611}
612def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
613
614def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
615 let Latency = 2;
616 let NumMicroOps = 2;
617 let ResourceCycles = [1,1];
618}
619def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
620
621def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
622 let Latency = 2;
623 let NumMicroOps = 2;
624 let ResourceCycles = [1,1];
625}
626def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
627
628def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
629 let Latency = 2;
630 let NumMicroOps = 2;
631 let ResourceCycles = [1,1];
632}
Craig Topper498875f2018-04-04 17:54:19 +0000633def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
634
635def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
636 let Latency = 1;
637 let NumMicroOps = 1;
638 let ResourceCycles = [1];
639}
640def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000641
642def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
643 let Latency = 2;
644 let NumMicroOps = 2;
645 let ResourceCycles = [1,1];
646}
Craig Topper2d451e72018-03-18 08:38:06 +0000647def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000648def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000649def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
650 "ADC8ri",
651 "CMOV(A|BE)(16|32|64)rr",
652 "SBB8i8",
653 "SBB8ri",
654 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000655
Gadi Haber323f2e12017-10-24 20:19:47 +0000656def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
657 let Latency = 2;
658 let NumMicroOps = 3;
659 let ResourceCycles = [1,1,1];
660}
661def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
662
Gadi Haber323f2e12017-10-24 20:19:47 +0000663def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
664 let Latency = 2;
665 let NumMicroOps = 3;
666 let ResourceCycles = [1,1,1];
667}
668def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
669
670def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
671 let Latency = 2;
672 let NumMicroOps = 3;
673 let ResourceCycles = [1,1,1];
674}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000675def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
676 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000677def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000678 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000679
Gadi Haber323f2e12017-10-24 20:19:47 +0000680def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
681 let Latency = 3;
682 let NumMicroOps = 1;
683 let ResourceCycles = [1];
684}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000685def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000686 "PDEP(32|64)rr",
687 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000688 "SHLD(16|32|64)rri8",
689 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000690 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000691
692def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000693 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000694 let NumMicroOps = 2;
695 let ResourceCycles = [1,1];
696}
Clement Courbet327fac42018-03-07 08:14:02 +0000697def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000698
699def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
700 let Latency = 3;
701 let NumMicroOps = 1;
702 let ResourceCycles = [1];
703}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000704def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
Simon Pilgrime480ed02018-05-07 18:25:19 +0000705 "VPBROADCASTWrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000706
Gadi Haber323f2e12017-10-24 20:19:47 +0000707def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000708 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000709 let NumMicroOps = 3;
710 let ResourceCycles = [3];
711}
Craig Topperb5f26592018-04-19 18:00:17 +0000712def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
713 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
714 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000715
Gadi Haber323f2e12017-10-24 20:19:47 +0000716def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
717 let Latency = 3;
718 let NumMicroOps = 3;
719 let ResourceCycles = [2,1];
720}
Craig Topper5a69a002018-03-21 06:28:42 +0000721def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
722 "MMX_PACKSSWBirr",
723 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000724
725def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
726 let Latency = 3;
727 let NumMicroOps = 3;
728 let ResourceCycles = [1,2];
729}
730def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
731
732def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
733 let Latency = 3;
734 let NumMicroOps = 3;
735 let ResourceCycles = [1,2];
736}
Craig Topper5a69a002018-03-21 06:28:42 +0000737def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
738 "RCL(8|16|32|64)ri",
739 "RCR(8|16|32|64)r1",
740 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000741
742def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
743 let Latency = 3;
744 let NumMicroOps = 3;
745 let ResourceCycles = [2,1];
746}
Craig Topper5a69a002018-03-21 06:28:42 +0000747def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
748 "ROR(8|16|32|64)rCL",
749 "SAR(8|16|32|64)rCL",
750 "SHL(8|16|32|64)rCL",
751 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000752
753def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
754 let Latency = 3;
755 let NumMicroOps = 4;
756 let ResourceCycles = [1,1,1,1];
757}
758def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
759
760def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
761 let Latency = 3;
762 let NumMicroOps = 4;
763 let ResourceCycles = [1,1,1,1];
764}
Craig Topper5a69a002018-03-21 06:28:42 +0000765def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
766 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000767
768def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
769 let Latency = 4;
770 let NumMicroOps = 2;
771 let ResourceCycles = [1,1];
772}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000773def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
774 "(V?)CVTSD2SIrr",
775 "(V?)CVTSS2SI64rr",
776 "(V?)CVTSS2SIrr",
777 "(V?)CVTTSD2SI64rr",
778 "(V?)CVTTSD2SIrr",
779 "(V?)CVTTSS2SI64rr",
780 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000781
782def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
783 let Latency = 4;
784 let NumMicroOps = 2;
785 let ResourceCycles = [1,1];
786}
Craig Topper5a69a002018-03-21 06:28:42 +0000787def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000788 "VPTESTYrr")>;
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",
973 "VPSRLVQrm",
974 "VTESTPDrm",
975 "VTESTPSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000976
977def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
978 let Latency = 6;
979 let NumMicroOps = 2;
980 let ResourceCycles = [1,1];
981}
Craig Topper5a69a002018-03-21 06:28:42 +0000982def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
983 "VCVTPD2DQYrr",
984 "VCVTPD2PSYrr",
985 "VCVTPS2PHYrr",
986 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000987
Gadi Haber323f2e12017-10-24 20:19:47 +0000988def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
989 let Latency = 6;
990 let NumMicroOps = 2;
991 let ResourceCycles = [1,1];
992}
Craig Topper5a69a002018-03-21 06:28:42 +0000993def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
994 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000995
996def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
997 let Latency = 6;
998 let NumMicroOps = 2;
999 let ResourceCycles = [1,1];
1000}
Craig Topperdfccafe2018-04-18 06:41:25 +00001001def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001002def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
1003 ADCX32rm, ADCX64rm,
1004 ADOX32rm, ADOX64rm,
1005 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001006
1007def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
1008 let Latency = 6;
1009 let NumMicroOps = 2;
1010 let ResourceCycles = [1,1];
1011}
Craig Topper5a69a002018-03-21 06:28:42 +00001012def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
1013 "BLSI(32|64)rm",
1014 "BLSMSK(32|64)rm",
1015 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001016 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001017
1018def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
1019 let Latency = 6;
1020 let NumMicroOps = 2;
1021 let ResourceCycles = [1,1];
1022}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001023def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +00001024 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001025 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001026
1027def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1028 let Latency = 6;
1029 let NumMicroOps = 2;
1030 let ResourceCycles = [1,1];
1031}
Craig Topper2d451e72018-03-18 08:38:06 +00001032def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001033def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001034
1035def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1036 let Latency = 6;
1037 let NumMicroOps = 4;
1038 let ResourceCycles = [1,1,2];
1039}
Craig Topper5a69a002018-03-21 06:28:42 +00001040def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1041 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001042
1043def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1044 let Latency = 6;
1045 let NumMicroOps = 4;
1046 let ResourceCycles = [1,1,1,1];
1047}
1048def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1049
1050def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1051 let Latency = 6;
1052 let NumMicroOps = 4;
1053 let ResourceCycles = [1,1,1,1];
1054}
Craig Topper5a69a002018-03-21 06:28:42 +00001055def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1056 "BTR(16|32|64)mi8",
1057 "BTS(16|32|64)mi8",
1058 "SAR(8|16|32|64)m1",
1059 "SAR(8|16|32|64)mi",
1060 "SHL(8|16|32|64)m1",
1061 "SHL(8|16|32|64)mi",
1062 "SHR(8|16|32|64)m1",
1063 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001064
1065def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1066 let Latency = 6;
1067 let NumMicroOps = 4;
1068 let ResourceCycles = [1,1,1,1];
1069}
Craig Topperf0d04262018-04-06 16:16:48 +00001070def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1071 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001072
1073def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1074 let Latency = 6;
1075 let NumMicroOps = 6;
1076 let ResourceCycles = [1,5];
1077}
1078def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1079
Gadi Haber323f2e12017-10-24 20:19:47 +00001080def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1081 let Latency = 7;
1082 let NumMicroOps = 2;
1083 let ResourceCycles = [1,1];
1084}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001085def: InstRW<[BWWriteResGroup73], (instregex "VPSLLVQYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001086 "VPSRLVQYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001087 "VTESTPDYrm",
1088 "VTESTPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001089
1090def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1091 let Latency = 7;
1092 let NumMicroOps = 2;
1093 let ResourceCycles = [1,1];
1094}
Craig Topper5a69a002018-03-21 06:28:42 +00001095def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1096 "FCOM64m",
1097 "FCOMP32m",
1098 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001099
Gadi Haber323f2e12017-10-24 20:19:47 +00001100def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1101 let Latency = 7;
1102 let NumMicroOps = 2;
1103 let ResourceCycles = [1,1];
1104}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001105def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001106
Gadi Haber323f2e12017-10-24 20:19:47 +00001107def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1108 let Latency = 7;
1109 let NumMicroOps = 3;
1110 let ResourceCycles = [2,1];
1111}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001112def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001113 "MMX_PACKSSWBirm",
1114 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001115 "VMASKMOVPDrm",
1116 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001117 "VPMASKMOVDrm",
1118 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001119
1120def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1121 let Latency = 7;
1122 let NumMicroOps = 3;
1123 let ResourceCycles = [1,2];
1124}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001125def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1126 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001127
1128def BWWriteResGroup81 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1129 let Latency = 7;
1130 let NumMicroOps = 3;
1131 let ResourceCycles = [1,1,1];
1132}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001133def: InstRW<[BWWriteResGroup81], (instregex "(V?)PTESTrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001134
1135def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1136 let Latency = 7;
1137 let NumMicroOps = 3;
1138 let ResourceCycles = [1,1,1];
1139}
1140def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1141
Gadi Haber323f2e12017-10-24 20:19:47 +00001142def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1143 let Latency = 7;
1144 let NumMicroOps = 3;
1145 let ResourceCycles = [1,1,1];
1146}
Craig Topper5a69a002018-03-21 06:28:42 +00001147def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1148 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001149
Gadi Haber323f2e12017-10-24 20:19:47 +00001150def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1151 let Latency = 7;
1152 let NumMicroOps = 3;
1153 let ResourceCycles = [1,1,1];
1154}
Craig Topperf4cd9082018-01-19 05:47:32 +00001155def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001156
1157def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1158 let Latency = 7;
1159 let NumMicroOps = 5;
1160 let ResourceCycles = [1,1,1,2];
1161}
Craig Topper5a69a002018-03-21 06:28:42 +00001162def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1163 "ROL(8|16|32|64)mi",
1164 "ROR(8|16|32|64)m1",
1165 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001166
1167def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1168 let Latency = 7;
1169 let NumMicroOps = 5;
1170 let ResourceCycles = [1,1,1,2];
1171}
Craig Topper5a69a002018-03-21 06:28:42 +00001172def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001173
1174def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1175 let Latency = 7;
1176 let NumMicroOps = 5;
1177 let ResourceCycles = [1,1,1,1,1];
1178}
Craig Topper5a69a002018-03-21 06:28:42 +00001179def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1180 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001181
1182def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1183 let Latency = 7;
1184 let NumMicroOps = 7;
1185 let ResourceCycles = [2,2,1,2];
1186}
Craig Topper2d451e72018-03-18 08:38:06 +00001187def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001188
1189def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1190 let Latency = 8;
1191 let NumMicroOps = 2;
1192 let ResourceCycles = [1,1];
1193}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001194def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001195 "PDEP(32|64)rm",
1196 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001197 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001198
1199def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001200 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001201 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001202 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001203}
Craig Topperf846e2d2018-04-19 05:34:05 +00001204def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001205
Craig Topperf846e2d2018-04-19 05:34:05 +00001206def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1207 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001208 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001209 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001210}
Craig Topper5a69a002018-03-21 06:28:42 +00001211def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001212
Gadi Haber323f2e12017-10-24 20:19:47 +00001213def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1214 let Latency = 8;
1215 let NumMicroOps = 2;
1216 let ResourceCycles = [1,1];
1217}
Craig Topper5a69a002018-03-21 06:28:42 +00001218def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1219 "VPMOVSXBQYrm",
1220 "VPMOVSXBWYrm",
1221 "VPMOVSXDQYrm",
1222 "VPMOVSXWDYrm",
1223 "VPMOVSXWQYrm",
1224 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001225
Gadi Haber323f2e12017-10-24 20:19:47 +00001226def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1227 let Latency = 8;
1228 let NumMicroOps = 3;
1229 let ResourceCycles = [2,1];
1230}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001231def: InstRW<[BWWriteResGroup94], (instregex "VMASKMOVPDYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001232 "VMASKMOVPSYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001233 "VPMASKMOVDYrm",
1234 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001235
Gadi Haber323f2e12017-10-24 20:19:47 +00001236def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1237 let Latency = 8;
1238 let NumMicroOps = 5;
1239 let ResourceCycles = [1,1,1,2];
1240}
Craig Topper5a69a002018-03-21 06:28:42 +00001241def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1242 "RCL(8|16|32|64)mi",
1243 "RCR(8|16|32|64)m1",
1244 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001245
1246def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1247 let Latency = 8;
1248 let NumMicroOps = 5;
1249 let ResourceCycles = [1,1,2,1];
1250}
Craig Topper13a16502018-03-19 00:56:09 +00001251def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001252
1253def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1254 let Latency = 8;
1255 let NumMicroOps = 6;
1256 let ResourceCycles = [1,1,1,3];
1257}
Craig Topper9f834812018-04-01 21:54:24 +00001258def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001259
1260def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1261 let Latency = 8;
1262 let NumMicroOps = 6;
1263 let ResourceCycles = [1,1,1,2,1];
1264}
Craig Topper9f834812018-04-01 21:54:24 +00001265def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001266 "CMPXCHG(8|16|32|64)rm",
1267 "ROL(8|16|32|64)mCL",
1268 "SAR(8|16|32|64)mCL",
1269 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001270 "SHL(8|16|32|64)mCL",
1271 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001272def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1273 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001274
1275def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1276 let Latency = 9;
1277 let NumMicroOps = 2;
1278 let ResourceCycles = [1,1];
1279}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001280def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1281 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001282 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001283 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001284
1285def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1286 let Latency = 9;
1287 let NumMicroOps = 2;
1288 let ResourceCycles = [1,1];
1289}
Craig Topper5a69a002018-03-21 06:28:42 +00001290def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1291 "VPERM2I128rm",
1292 "VPERMDYrm",
1293 "VPERMPDYmi",
1294 "VPERMPSYrm",
1295 "VPERMQYmi",
1296 "VPMOVZXBDYrm",
1297 "VPMOVZXBQYrm",
1298 "VPMOVZXBWYrm",
1299 "VPMOVZXDQYrm",
1300 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001301
Gadi Haber323f2e12017-10-24 20:19:47 +00001302def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1303 let Latency = 9;
1304 let NumMicroOps = 3;
1305 let ResourceCycles = [1,1,1];
1306}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001307def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1308 "(V?)CVTSD2SIrm",
1309 "(V?)CVTSS2SI64rm",
1310 "(V?)CVTSS2SIrm",
1311 "(V?)CVTTSD2SI64rm",
1312 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001313 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001314 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001315
1316def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1317 let Latency = 9;
1318 let NumMicroOps = 3;
1319 let ResourceCycles = [1,1,1];
1320}
1321def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1322
1323def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1324 let Latency = 9;
1325 let NumMicroOps = 3;
1326 let ResourceCycles = [1,1,1];
1327}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001328def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001329def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001330 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001331 "CVTTPD2DQrm",
1332 "MMX_CVTPD2PIirm",
1333 "MMX_CVTPI2PDirm",
1334 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001335 "(V?)CVTDQ2PDrm",
1336 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001337
1338def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1339 let Latency = 9;
1340 let NumMicroOps = 3;
1341 let ResourceCycles = [1,1,1];
1342}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001343def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1344 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001345
Gadi Haber323f2e12017-10-24 20:19:47 +00001346def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1347 let Latency = 9;
1348 let NumMicroOps = 4;
1349 let ResourceCycles = [1,1,1,1];
1350}
Craig Topper5a69a002018-03-21 06:28:42 +00001351def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1352 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001353
1354def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1355 let Latency = 9;
1356 let NumMicroOps = 5;
1357 let ResourceCycles = [1,1,3];
1358}
1359def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1360
1361def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1362 let Latency = 9;
1363 let NumMicroOps = 5;
1364 let ResourceCycles = [1,2,1,1];
1365}
Craig Topper5a69a002018-03-21 06:28:42 +00001366def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1367 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001368
Gadi Haber323f2e12017-10-24 20:19:47 +00001369def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1370 let Latency = 10;
1371 let NumMicroOps = 2;
1372 let ResourceCycles = [1,1];
1373}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001374def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001375
Gadi Haber323f2e12017-10-24 20:19:47 +00001376def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1377 let Latency = 10;
1378 let NumMicroOps = 3;
1379 let ResourceCycles = [2,1];
1380}
Craig Topper5a69a002018-03-21 06:28:42 +00001381def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1382 "FICOM32m",
1383 "FICOMP16m",
1384 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001385
1386def BWWriteResGroup118 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1387 let Latency = 10;
1388 let NumMicroOps = 3;
1389 let ResourceCycles = [1,1,1];
1390}
1391def: InstRW<[BWWriteResGroup118], (instregex "VPTESTYrm")>;
1392
Gadi Haber323f2e12017-10-24 20:19:47 +00001393def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1394 let Latency = 10;
1395 let NumMicroOps = 4;
1396 let ResourceCycles = [1,1,1,1];
1397}
1398def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1399
1400def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001401 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001402 let NumMicroOps = 4;
1403 let ResourceCycles = [1,1,1,1];
1404}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001405def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001406
Craig Topper8104f262018-04-02 05:33:28 +00001407def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1408 let Latency = 11;
1409 let NumMicroOps = 1;
1410 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1411}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001412def : SchedAlias<WriteFDiv, BWWriteResGroup122_1>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001413
1414def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1415 let Latency = 11;
1416 let NumMicroOps = 2;
1417 let ResourceCycles = [1,1];
1418}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001419def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001420 "VPCMPGTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001421
Gadi Haber323f2e12017-10-24 20:19:47 +00001422def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1423 let Latency = 11;
1424 let NumMicroOps = 3;
1425 let ResourceCycles = [1,1,1];
1426}
1427def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1428
Gadi Haber323f2e12017-10-24 20:19:47 +00001429def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1430 let Latency = 11;
1431 let NumMicroOps = 6;
1432 let ResourceCycles = [1,1,1,1,2];
1433}
Craig Topper5a69a002018-03-21 06:28:42 +00001434def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1435 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001436
1437def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1438 let Latency = 11;
1439 let NumMicroOps = 7;
1440 let ResourceCycles = [2,2,3];
1441}
Craig Topper5a69a002018-03-21 06:28:42 +00001442def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1443 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001444
1445def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1446 let Latency = 11;
1447 let NumMicroOps = 9;
1448 let ResourceCycles = [1,4,1,3];
1449}
1450def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1451
1452def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1453 let Latency = 11;
1454 let NumMicroOps = 11;
1455 let ResourceCycles = [2,9];
1456}
Craig Topper2d451e72018-03-18 08:38:06 +00001457def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1458def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001459
Gadi Haber323f2e12017-10-24 20:19:47 +00001460def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1461 let Latency = 12;
1462 let NumMicroOps = 3;
1463 let ResourceCycles = [2,1];
1464}
Simon Pilgrimbe51b202018-05-04 12:59:24 +00001465def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001466
Craig Topper8104f262018-04-02 05:33:28 +00001467def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1468 let Latency = 14;
1469 let NumMicroOps = 1;
1470 let ResourceCycles = [1,4];
1471}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001472def : SchedAlias<WriteFDiv64, BWWriteResGroup139_1>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001473
Gadi Haber323f2e12017-10-24 20:19:47 +00001474def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1475 let Latency = 14;
1476 let NumMicroOps = 3;
1477 let ResourceCycles = [1,1,1];
1478}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001479def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001480
Gadi Haber323f2e12017-10-24 20:19:47 +00001481def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1482 let Latency = 14;
1483 let NumMicroOps = 8;
1484 let ResourceCycles = [2,2,1,3];
1485}
1486def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1487
1488def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1489 let Latency = 14;
1490 let NumMicroOps = 10;
1491 let ResourceCycles = [2,3,1,4];
1492}
1493def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1494
1495def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1496 let Latency = 14;
1497 let NumMicroOps = 12;
1498 let ResourceCycles = [2,1,4,5];
1499}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001500def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001501
1502def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1503 let Latency = 15;
1504 let NumMicroOps = 1;
1505 let ResourceCycles = [1];
1506}
Craig Topper5a69a002018-03-21 06:28:42 +00001507def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1508 "DIVR_FST0r",
1509 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001510
Gadi Haber323f2e12017-10-24 20:19:47 +00001511def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1512 let Latency = 15;
1513 let NumMicroOps = 10;
1514 let ResourceCycles = [1,1,1,4,1,2];
1515}
Craig Topper13a16502018-03-19 00:56:09 +00001516def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001517
Craig Topper8104f262018-04-02 05:33:28 +00001518def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001519 let Latency = 16;
1520 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001521 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001522}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001523def : SchedAlias<WriteFDivLd, BWWriteResGroup150>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001524
Gadi Haber323f2e12017-10-24 20:19:47 +00001525def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1526 let Latency = 16;
1527 let NumMicroOps = 14;
1528 let ResourceCycles = [1,1,1,4,2,5];
1529}
1530def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1531
1532def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1533 let Latency = 16;
1534 let NumMicroOps = 16;
1535 let ResourceCycles = [16];
1536}
Craig Topper5a69a002018-03-21 06:28:42 +00001537def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001538
Gadi Haber323f2e12017-10-24 20:19:47 +00001539def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1540 let Latency = 18;
1541 let NumMicroOps = 8;
1542 let ResourceCycles = [1,1,1,5];
1543}
Craig Topper5a69a002018-03-21 06:28:42 +00001544def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001545def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001546
1547def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1548 let Latency = 18;
1549 let NumMicroOps = 11;
1550 let ResourceCycles = [2,1,1,3,1,3];
1551}
Craig Topper13a16502018-03-19 00:56:09 +00001552def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001553
Craig Topper8104f262018-04-02 05:33:28 +00001554def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001555 let Latency = 19;
1556 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001557 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001558}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001559def : SchedAlias<WriteFDiv64Ld, BWWriteResGroup161>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001560
Gadi Haber323f2e12017-10-24 20:19:47 +00001561def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1562 let Latency = 20;
1563 let NumMicroOps = 1;
1564 let ResourceCycles = [1];
1565}
Craig Topper5a69a002018-03-21 06:28:42 +00001566def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1567 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001568 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001569
Gadi Haber323f2e12017-10-24 20:19:47 +00001570def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1571 let Latency = 20;
1572 let NumMicroOps = 8;
1573 let ResourceCycles = [1,1,1,1,1,1,2];
1574}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001575def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001576
Gadi Haber323f2e12017-10-24 20:19:47 +00001577def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1578 let Latency = 21;
1579 let NumMicroOps = 2;
1580 let ResourceCycles = [1,1];
1581}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001582def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001583
Gadi Haber323f2e12017-10-24 20:19:47 +00001584def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1585 let Latency = 21;
1586 let NumMicroOps = 19;
1587 let ResourceCycles = [2,1,4,1,1,4,6];
1588}
1589def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1590
1591def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1592 let Latency = 22;
1593 let NumMicroOps = 18;
1594 let ResourceCycles = [1,1,16];
1595}
1596def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1597
Gadi Haber323f2e12017-10-24 20:19:47 +00001598def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1599 let Latency = 23;
1600 let NumMicroOps = 19;
1601 let ResourceCycles = [3,1,15];
1602}
Craig Topper391c6f92017-12-10 01:24:08 +00001603def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001604
1605def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1606 let Latency = 24;
1607 let NumMicroOps = 3;
1608 let ResourceCycles = [1,1,1];
1609}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001610def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001611
Gadi Haber323f2e12017-10-24 20:19:47 +00001612def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1613 let Latency = 26;
1614 let NumMicroOps = 2;
1615 let ResourceCycles = [1,1];
1616}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001617def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001618
Gadi Haber323f2e12017-10-24 20:19:47 +00001619def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1620 let Latency = 29;
1621 let NumMicroOps = 3;
1622 let ResourceCycles = [1,1,1];
1623}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001624def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001625
Gadi Haber323f2e12017-10-24 20:19:47 +00001626def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1627 let Latency = 22;
1628 let NumMicroOps = 7;
1629 let ResourceCycles = [1,3,2,1];
1630}
Craig Topper17a31182017-12-16 18:35:29 +00001631def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001632
1633def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1634 let Latency = 23;
1635 let NumMicroOps = 9;
1636 let ResourceCycles = [1,3,4,1];
1637}
Craig Topper17a31182017-12-16 18:35:29 +00001638def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001639
1640def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1641 let Latency = 24;
1642 let NumMicroOps = 9;
1643 let ResourceCycles = [1,5,2,1];
1644}
Craig Topper17a31182017-12-16 18:35:29 +00001645def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001646
1647def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1648 let Latency = 25;
1649 let NumMicroOps = 7;
1650 let ResourceCycles = [1,3,2,1];
1651}
Craig Topper17a31182017-12-16 18:35:29 +00001652def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1653 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001654
1655def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1656 let Latency = 26;
1657 let NumMicroOps = 9;
1658 let ResourceCycles = [1,5,2,1];
1659}
Craig Topper17a31182017-12-16 18:35:29 +00001660def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001661
1662def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1663 let Latency = 26;
1664 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001665 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001666}
Craig Topper17a31182017-12-16 18:35:29 +00001667def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001668
1669def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1670 let Latency = 27;
1671 let NumMicroOps = 9;
1672 let ResourceCycles = [1,5,2,1];
1673}
Craig Topper17a31182017-12-16 18:35:29 +00001674def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001675
Gadi Haber323f2e12017-10-24 20:19:47 +00001676def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1677 let Latency = 29;
1678 let NumMicroOps = 27;
1679 let ResourceCycles = [1,5,1,1,19];
1680}
1681def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1682
1683def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1684 let Latency = 30;
1685 let NumMicroOps = 28;
1686 let ResourceCycles = [1,6,1,1,19];
1687}
Craig Topper2d451e72018-03-18 08:38:06 +00001688def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001689
Gadi Haber323f2e12017-10-24 20:19:47 +00001690def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1691 let Latency = 34;
1692 let NumMicroOps = 8;
1693 let ResourceCycles = [2,2,2,1,1];
1694}
Craig Topper13a16502018-03-19 00:56:09 +00001695def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001696
1697def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
1698 let Latency = 34;
1699 let NumMicroOps = 23;
1700 let ResourceCycles = [1,5,3,4,10];
1701}
Craig Topper5a69a002018-03-21 06:28:42 +00001702def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
1703 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001704
1705def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1706 let Latency = 35;
1707 let NumMicroOps = 8;
1708 let ResourceCycles = [2,2,2,1,1];
1709}
Craig Topper13a16502018-03-19 00:56:09 +00001710def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001711
1712def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1713 let Latency = 35;
1714 let NumMicroOps = 23;
1715 let ResourceCycles = [1,5,2,1,4,10];
1716}
Craig Topper5a69a002018-03-21 06:28:42 +00001717def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
1718 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001719
Gadi Haber323f2e12017-10-24 20:19:47 +00001720def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
1721 let Latency = 42;
1722 let NumMicroOps = 22;
1723 let ResourceCycles = [2,20];
1724}
Craig Topper2d451e72018-03-18 08:38:06 +00001725def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001726
1727def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
1728 let Latency = 60;
1729 let NumMicroOps = 64;
1730 let ResourceCycles = [2,2,8,1,10,2,39];
1731}
1732def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001733
1734def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1735 let Latency = 63;
1736 let NumMicroOps = 88;
1737 let ResourceCycles = [4,4,31,1,2,1,45];
1738}
Craig Topper2d451e72018-03-18 08:38:06 +00001739def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001740
1741def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1742 let Latency = 63;
1743 let NumMicroOps = 90;
1744 let ResourceCycles = [4,2,33,1,2,1,47];
1745}
Craig Topper2d451e72018-03-18 08:38:06 +00001746def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001747
1748def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
1749 let Latency = 75;
1750 let NumMicroOps = 15;
1751 let ResourceCycles = [6,3,6];
1752}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00001753def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001754
1755def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
1756 let Latency = 80;
1757 let NumMicroOps = 32;
1758 let ResourceCycles = [7,7,3,3,1,11];
1759}
1760def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
1761
1762def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
1763 let Latency = 115;
1764 let NumMicroOps = 100;
1765 let ResourceCycles = [9,9,11,8,1,11,21,30];
1766}
1767def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001768
1769} // SchedModel
1770