blob: d97efee669709154995276fb47d27c22cb066140 [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 Pilgrim2864b462018-05-08 14:55:16 +0000109defm : BWWriteResPair<WriteALU, [BWPort0156], 1>; // Simple integer ALU op.
110defm : BWWriteResPair<WriteIMul, [BWPort1], 3>; // Integer multiplication.
111defm : BWWriteResPair<WriteIMul64, [BWPort1], 3>; // Integer 64-bit multiplication.
Simon Pilgrim25805542018-05-08 13:51:45 +0000112
113defm : BWWriteResPair<WriteDiv8, [BWPort0, BWDivider], 25, [1, 10]>;
114defm : BWWriteResPair<WriteDiv16, [BWPort0, BWDivider], 25, [1, 10]>;
115defm : BWWriteResPair<WriteDiv32, [BWPort0, BWDivider], 25, [1, 10]>;
116defm : BWWriteResPair<WriteDiv64, [BWPort0, BWDivider], 25, [1, 10]>;
117defm : BWWriteResPair<WriteIDiv8, [BWPort0, BWDivider], 25, [1, 10]>;
118defm : BWWriteResPair<WriteIDiv16, [BWPort0, BWDivider], 25, [1, 10]>;
119defm : BWWriteResPair<WriteIDiv32, [BWPort0, BWDivider], 25, [1, 10]>;
120defm : BWWriteResPair<WriteIDiv64, [BWPort0, BWDivider], 25, [1, 10]>;
121
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000122defm : BWWriteResPair<WriteCRC32, [BWPort1], 3>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000123def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, high part.
Gadi Haber323f2e12017-10-24 20:19:47 +0000124
125def : WriteRes<WriteLEA, [BWPort15]>; // LEA instructions can't fold loads.
126
Craig Topperb7baa352018-04-08 17:53:18 +0000127defm : BWWriteResPair<WriteCMOV, [BWPort06], 1>; // Conditional move.
128def : WriteRes<WriteSETCC, [BWPort06]>; // Setcc.
129def : WriteRes<WriteSETCCStore, [BWPort06,BWPort4,BWPort237]> {
130 let Latency = 2;
131 let NumMicroOps = 3;
132}
133
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000134// Bit counts.
135defm : BWWriteResPair<WriteBitScan, [BWPort1], 3>;
136defm : BWWriteResPair<WriteLZCNT, [BWPort1], 3>;
137defm : BWWriteResPair<WriteTZCNT, [BWPort1], 3>;
138defm : BWWriteResPair<WritePOPCNT, [BWPort1], 3>;
139
Gadi Haber323f2e12017-10-24 20:19:47 +0000140// Integer shifts and rotates.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000141defm : BWWriteResPair<WriteShift, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000142
Craig Topper89310f52018-03-29 20:41:39 +0000143// BMI1 BEXTR, BMI2 BZHI
144defm : BWWriteResPair<WriteBEXTR, [BWPort06,BWPort15], 2, [1,1], 2>;
145defm : BWWriteResPair<WriteBZHI, [BWPort15], 1>;
146
Gadi Haber323f2e12017-10-24 20:19:47 +0000147// Loads, stores, and moves, not folded with other operations.
148def : WriteRes<WriteLoad, [BWPort23]> { let Latency = 5; }
149def : WriteRes<WriteStore, [BWPort237, BWPort4]>;
150def : WriteRes<WriteMove, [BWPort0156]>;
151
152// Idioms that clear a register, like xorps %xmm0, %xmm0.
153// These can often bypass execution ports completely.
154def : WriteRes<WriteZero, []>;
155
Sanjoy Das1074eb22017-12-12 19:11:31 +0000156// Treat misc copies as a move.
157def : InstRW<[WriteMove], (instrs COPY)>;
158
Gadi Haber323f2e12017-10-24 20:19:47 +0000159// Branches don't produce values, so they have no latency, but they still
160// consume resources. Indirect branches can fold loads.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000161defm : BWWriteResPair<WriteJump, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000162
163// Floating point. This covers both scalar and vector operations.
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000164defm : X86WriteRes<WriteFLoad, [BWPort23], 5, [1], 1>;
165defm : X86WriteRes<WriteFMaskedLoad, [BWPort23,BWPort5], 7, [1,2], 3>;
166defm : X86WriteRes<WriteFMaskedLoadY, [BWPort23,BWPort5], 8, [1,2], 3>;
167defm : X86WriteRes<WriteFStore, [BWPort237,BWPort4], 1, [1,1], 1>;
168defm : X86WriteRes<WriteFMaskedStore, [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
169defm : X86WriteRes<WriteFMaskedStoreY, [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
170defm : X86WriteRes<WriteFMove, [BWPort5], 1, [1], 1>;
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000171
Simon Pilgrim1233e122018-05-07 20:52:53 +0000172defm : BWWriteResPair<WriteFAdd, [BWPort1], 3, [1], 1, 5>; // Floating point add/sub.
173defm : BWWriteResPair<WriteFAddX, [BWPort1], 3, [1], 1, 5>; // Floating point add/sub (XMM).
174defm : BWWriteResPair<WriteFAddY, [BWPort1], 3, [1], 1, 6>; // Floating point add/sub (YMM/ZMM).
175defm : BWWriteResPair<WriteFAdd64, [BWPort1], 3, [1], 1, 5>; // Floating point double add/sub.
176defm : BWWriteResPair<WriteFAdd64X, [BWPort1], 3, [1], 1, 5>; // Floating point double add/sub (XMM).
177defm : BWWriteResPair<WriteFAdd64Y, [BWPort1], 3, [1], 1, 6>; // Floating point double add/sub (YMM/ZMM).
178
179defm : BWWriteResPair<WriteFCmp, [BWPort1], 3, [1], 1, 5>; // Floating point compare.
180defm : BWWriteResPair<WriteFCmpX, [BWPort1], 3, [1], 1, 5>; // Floating point compare (XMM).
181defm : BWWriteResPair<WriteFCmpY, [BWPort1], 3, [1], 1, 6>; // Floating point compare (YMM/ZMM).
182defm : BWWriteResPair<WriteFCmp64, [BWPort1], 3, [1], 1, 5>; // Floating point double compare.
183defm : BWWriteResPair<WriteFCmp64X, [BWPort1], 3, [1], 1, 5>; // Floating point double compare (XMM).
184defm : BWWriteResPair<WriteFCmp64Y, [BWPort1], 3, [1], 1, 6>; // Floating point double compare (YMM/ZMM).
185
186defm : BWWriteResPair<WriteFCom, [BWPort1], 3>; // Floating point compare to flags.
187
188defm : BWWriteResPair<WriteFMul, [BWPort01], 3, [1], 1, 5>; // Floating point multiplication.
189defm : BWWriteResPair<WriteFMulX, [BWPort01], 3, [1], 1, 5>; // Floating point multiplication (XMM).
190defm : BWWriteResPair<WriteFMulY, [BWPort01], 3, [1], 1, 6>; // Floating point multiplication (YMM/ZMM).
191defm : BWWriteResPair<WriteFMul64, [BWPort01], 3, [1], 1, 5>; // Floating point double multiplication.
192defm : BWWriteResPair<WriteFMul64X, [BWPort01], 3, [1], 1, 5>; // Floating point double multiplication (XMM).
193defm : BWWriteResPair<WriteFMul64Y, [BWPort01], 3, [1], 1, 6>; // Floating point double multiplication (YMM/ZMM).
Simon Pilgrimac5d0a32018-05-07 16:15:46 +0000194
195//defm : BWWriteResPair<WriteFDiv, [BWPort0,BWFPDivider], 11, [1,3], 1, 5>; // Floating point division.
196defm : BWWriteResPair<WriteFDivX, [BWPort0,BWFPDivider], 11, [1,5], 1, 5>; // Floating point division (XMM).
197defm : BWWriteResPair<WriteFDivY, [BWPort0,BWPort015,BWFPDivider], 17, [2,1,10], 3, 6>; // Floating point division (YMM).
198defm : BWWriteResPair<WriteFDivZ, [BWPort0,BWPort015,BWFPDivider], 17, [2,1,10], 3, 6>; // Floating point division (ZMM).
199//defm : BWWriteResPair<WriteFDiv64, [BWPort0,BWFPDivider], 14, [1,8], 1, 5>; // Floating point division.
200defm : BWWriteResPair<WriteFDiv64X, [BWPort0,BWFPDivider], 14, [1,8], 1, 5>; // Floating point division (XMM).
201defm : BWWriteResPair<WriteFDiv64Y, [BWPort0,BWPort015,BWFPDivider], 23, [2,1,16], 3, 6>; // Floating point division (YMM).
202defm : BWWriteResPair<WriteFDiv64Z, [BWPort0,BWPort015,BWFPDivider], 23, [2,1,16], 3, 6>; // Floating point division (ZMM).
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000203
204defm : X86WriteRes<WriteFSqrt, [BWPort0,BWFPDivider], 11, [1,4], 1>; // Floating point square root.
205defm : X86WriteRes<WriteFSqrtLd, [BWPort0,BWPort23,BWFPDivider], 16, [1,1,7], 2>;
206defm : BWWriteResPair<WriteFSqrtX, [BWPort0,BWFPDivider], 11, [1,7], 1, 5>; // Floating point square root (XMM).
207defm : BWWriteResPair<WriteFSqrtY, [BWPort0,BWPort015,BWFPDivider], 21, [2,1,14], 3, 6>; // Floating point square root (YMM).
208defm : BWWriteResPair<WriteFSqrtZ, [BWPort0,BWPort015,BWFPDivider], 21, [2,1,14], 3, 6>; // Floating point square root (ZMM).
209defm : X86WriteRes<WriteFSqrt64, [BWPort0,BWFPDivider], 16, [1,8], 1>; // Floating point double square root.
210defm : X86WriteRes<WriteFSqrt64Ld, [BWPort0,BWPort23,BWFPDivider], 21, [1,1,14], 2>;
211defm : BWWriteResPair<WriteFSqrt64X, [BWPort0,BWFPDivider], 16, [1,14],1, 5>; // Floating point double square root (XMM).
212defm : BWWriteResPair<WriteFSqrt64Y, [BWPort0,BWPort015,BWFPDivider], 29, [2,1,28], 3, 6>; // Floating point double square root (YMM).
213defm : BWWriteResPair<WriteFSqrt64Z, [BWPort0,BWPort015,BWFPDivider], 29, [2,1,28], 3, 6>; // Floating point double square root (ZMM).
214defm : BWWriteResPair<WriteFSqrt80, [BWPort0,BWFPDivider], 23, [1,9]>; // Floating point long double square root.
215
Simon Pilgrimc7088682018-05-01 18:06:07 +0000216defm : BWWriteResPair<WriteFRcp, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000217defm : BWWriteResPair<WriteFRcpX, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal estimate (XMM).
218defm : BWWriteResPair<WriteFRcpY, [BWPort0,BWPort015], 11, [2,1], 3, 6>; // Floating point reciprocal estimate (YMM/ZMM).
219
Simon Pilgrimc7088682018-05-01 18:06:07 +0000220defm : BWWriteResPair<WriteFRsqrt, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal square root estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000221defm : BWWriteResPair<WriteFRsqrtX,[BWPort0], 5, [1], 1, 5>; // Floating point reciprocal square root estimate (XMM).
222defm : BWWriteResPair<WriteFRsqrtY,[BWPort0,BWPort015], 11, [2,1], 3, 6>; // Floating point reciprocal square root estimate (YMM/ZMM).
223
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000224defm : BWWriteResPair<WriteFMA, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add.
Simon Pilgrim67cc2462018-05-04 15:20:18 +0000225defm : BWWriteResPair<WriteFMAX, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add (XMM).
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000226defm : BWWriteResPair<WriteFMAY, [BWPort01], 5, [1], 1, 6>; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000227defm : BWWriteResPair<WriteDPPD, [BWPort0,BWPort1,BWPort5], 9, [1,1,1], 3, 5>; // Floating point double dot product.
228defm : BWWriteResPair<WriteDPPS, [BWPort0,BWPort1,BWPort5], 14, [2,1,1], 4, 5>; // Floating point single dot product.
229defm : BWWriteResPair<WriteDPPSY, [BWPort0,BWPort1,BWPort5], 14, [2,1,1], 4, 6>; // Floating point single dot product (YMM).
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000230defm : BWWriteResPair<WriteFSign, [BWPort5], 1>; // Floating point fabs/fchs.
231defm : X86WriteRes<WriteFRnd, [BWPort23], 6, [1], 1>; // Floating point rounding.
232defm : X86WriteRes<WriteFRndY, [BWPort23], 6, [1], 1>; // Floating point rounding (YMM/ZMM).
233defm : X86WriteRes<WriteFRndLd, [BWPort1,BWPort23], 11, [2,1], 3>;
234defm : X86WriteRes<WriteFRndYLd, [BWPort1,BWPort23], 12, [2,1], 3>;
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000235defm : BWWriteResPair<WriteFLogic, [BWPort5], 1, [1], 1, 5>; // Floating point and/or/xor logicals.
236defm : BWWriteResPair<WriteFLogicY, [BWPort5], 1, [1], 1, 6>; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000237defm : BWWriteResPair<WriteFTest, [BWPort0], 1, [1], 1, 5>; // Floating point TEST instructions.
238defm : BWWriteResPair<WriteFTestY, [BWPort0], 1, [1], 1, 6>; // Floating point TEST instructions (YMM/ZMM).
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000239defm : BWWriteResPair<WriteFShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector shuffles.
240defm : BWWriteResPair<WriteFShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000241defm : BWWriteResPair<WriteFVarShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector variable shuffles.
242defm : BWWriteResPair<WriteFVarShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
243defm : BWWriteResPair<WriteFBlend, [BWPort015], 1, [1], 1, 5>; // Floating point vector blends.
244defm : BWWriteResPair<WriteFBlendY, [BWPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000245defm : BWWriteResPair<WriteFVarBlend, [BWPort5], 2, [2], 2, 5>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000246defm : BWWriteResPair<WriteFVarBlendY, [BWPort5], 2, [2], 2, 6>; // Fp vector variable blends.
Gadi Haber323f2e12017-10-24 20:19:47 +0000247
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000248def : WriteRes<WriteCvtF2FSt, [BWPort1,BWPort4,BWPort237]> {
249 let Latency = 4;
250 let NumMicroOps = 3;
251 let ResourceCycles = [1,1,1];
252}
253
Gadi Haber323f2e12017-10-24 20:19:47 +0000254// FMA Scheduling helper class.
255// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
256
257// Vector integer operations.
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000258defm : X86WriteRes<WriteVecLoad, [BWPort23], 5, [1], 1>;
259defm : X86WriteRes<WriteVecMaskedLoad, [BWPort23,BWPort5], 7, [1,2], 3>;
260defm : X86WriteRes<WriteVecMaskedLoadY, [BWPort23,BWPort5], 8, [1,2], 3>;
261defm : X86WriteRes<WriteVecStore, [BWPort237,BWPort4], 1, [1,1], 1>;
262defm : X86WriteRes<WriteVecMaskedStore, [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
263defm : X86WriteRes<WriteVecMaskedStoreY, [BWPort0,BWPort4,BWPort237,BWPort15], 5, [1,1,1,1], 4>;
264defm : X86WriteRes<WriteVecMove, [BWPort015], 1, [1], 1>;
265defm : X86WriteRes<WriteEMMS, [BWPort01,BWPort15,BWPort015,BWPort0156], 31, [8,1,21,1], 31>;
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000266
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000267defm : BWWriteResPair<WriteVecALU, [BWPort15], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
268defm : BWWriteResPair<WriteVecALUY, [BWPort15], 1, [1], 1, 6>; // Vector integer ALU op, no logicals (YMM/ZMM).
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000269defm : BWWriteResPair<WriteVecLogic, [BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
270defm : BWWriteResPair<WriteVecLogicY,[BWPort015], 1, [1], 1, 6>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000271defm : BWWriteResPair<WriteVecTest, [BWPort0,BWPort5], 2, [1,1], 2, 5>; // Vector integer TEST instructions.
272defm : BWWriteResPair<WriteVecTestY, [BWPort0,BWPort5], 4, [1,1], 2, 6>; // Vector integer TEST instructions (YMM/ZMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000273defm : BWWriteResPair<WriteVecIMul, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000274defm : BWWriteResPair<WriteVecIMulX, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000275defm : BWWriteResPair<WriteVecIMulY, [BWPort0], 5, [1], 1, 6>; // Vector integer multiply.
276defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // Vector PMULLD.
277defm : BWWriteResPair<WritePMULLDY, [BWPort0], 10, [2], 2, 6>; // Vector PMULLD (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000278defm : BWWriteResPair<WriteShuffle, [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000279defm : BWWriteResPair<WriteShuffleY, [BWPort5], 1, [1], 1, 6>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000280defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000281defm : BWWriteResPair<WriteVarShuffleY,[BWPort5], 1, [1], 1, 6>; // Vector variable shuffles (YMM/ZMM).
282defm : BWWriteResPair<WriteBlend, [BWPort5], 1, [1], 1, 5>; // Vector blends.
283defm : BWWriteResPair<WriteBlendY, [BWPort5], 1, [1], 1, 6>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000284defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000285defm : BWWriteResPair<WriteVarBlendY, [BWPort5], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000286defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000287defm : BWWriteResPair<WriteMPSADY, [BWPort0, BWPort5], 7, [1, 2], 3, 6>; // Vector MPSAD.
288defm : BWWriteResPair<WritePSADBW, [BWPort0], 5, [1], 1, 5>; // Vector PSADBW.
289defm : BWWriteResPair<WritePSADBWY, [BWPort0], 5, [1], 1, 6>; // Vector PSADBW (YMM/ZMM).
290defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000291
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000292// Vector integer shifts.
293defm : BWWriteResPair<WriteVecShift, [BWPort0], 1, [1], 1, 5>;
294defm : BWWriteResPair<WriteVecShiftX, [BWPort0,BWPort5], 2, [1,1], 2, 5>;
295defm : X86WriteRes<WriteVecShiftY, [BWPort0,BWPort5], 4, [1,1], 2>;
296defm : X86WriteRes<WriteVecShiftYLd, [BWPort0,BWPort23], 7, [1,1], 2>;
297
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000298defm : BWWriteResPair<WriteVecShiftImm, [BWPort0], 1, [1], 1, 5>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000299defm : BWWriteResPair<WriteVecShiftImmX, [BWPort0], 1, [1], 1, 5>; // Vector integer immediate shifts (XMM).
300defm : BWWriteResPair<WriteVecShiftImmY, [BWPort0], 1, [1], 1, 6>; // Vector integer immediate shifts (YMM/ZMM).
301defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 3, [2,1], 3, 5>; // Variable vector shifts.
302defm : BWWriteResPair<WriteVarVecShiftY, [BWPort0, BWPort5], 3, [2,1], 3, 6>; // Variable vector shifts (YMM/ZMM).
303
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000304// Vector insert/extract operations.
305def : WriteRes<WriteVecInsert, [BWPort5]> {
306 let Latency = 2;
307 let NumMicroOps = 2;
308 let ResourceCycles = [2];
309}
310def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
311 let Latency = 6;
312 let NumMicroOps = 2;
313}
314
315def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
316 let Latency = 2;
317 let NumMicroOps = 2;
318}
319def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
320 let Latency = 2;
321 let NumMicroOps = 3;
322}
323
Gadi Haber323f2e12017-10-24 20:19:47 +0000324// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000325defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
326defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
327defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000328
329// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000330
Gadi Haber323f2e12017-10-24 20:19:47 +0000331// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000332def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000333 let Latency = 11;
334 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000335 let ResourceCycles = [3];
336}
337def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000338 let Latency = 16;
339 let NumMicroOps = 4;
340 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000341}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000342
343// Packed Compare Explicit Length Strings, Return Mask
344def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
345 let Latency = 19;
346 let NumMicroOps = 9;
347 let ResourceCycles = [4,3,1,1];
348}
349def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
350 let Latency = 24;
351 let NumMicroOps = 10;
352 let ResourceCycles = [4,3,1,1,1];
353}
354
355// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000356def : WriteRes<WritePCmpIStrI, [BWPort0]> {
357 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000358 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000359 let ResourceCycles = [3];
360}
361def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000362 let Latency = 16;
363 let NumMicroOps = 4;
364 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000365}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000366
367// Packed Compare Explicit Length Strings, Return Index
368def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
369 let Latency = 18;
370 let NumMicroOps = 8;
371 let ResourceCycles = [4,3,1];
372}
373def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
374 let Latency = 23;
375 let NumMicroOps = 9;
376 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000377}
378
Simon Pilgrima2f26782018-03-27 20:38:54 +0000379// MOVMSK Instructions.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000380def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
381def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
382def : WriteRes<WriteVecMOVMSKY, [BWPort0]> { let Latency = 3; }
383def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
Simon Pilgrima2f26782018-03-27 20:38:54 +0000384
Gadi Haber323f2e12017-10-24 20:19:47 +0000385// AES instructions.
386def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
387 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000388 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000389 let ResourceCycles = [1];
390}
391def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000392 let Latency = 12;
393 let NumMicroOps = 2;
394 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000395}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000396
Gadi Haber323f2e12017-10-24 20:19:47 +0000397def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
398 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000399 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000400 let ResourceCycles = [2];
401}
402def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000403 let Latency = 19;
404 let NumMicroOps = 3;
405 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000406}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000407
408def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
409 let Latency = 29;
410 let NumMicroOps = 11;
411 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000412}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000413def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
414 let Latency = 33;
415 let NumMicroOps = 11;
416 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000417}
418
419// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000420defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000421
422// Catch-all for expensive system instructions.
423def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
424
425// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000426defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
427defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
428defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
429defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
Gadi Haber323f2e12017-10-24 20:19:47 +0000430
431// Old microcoded instructions that nobody use.
432def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
433
434// Fence instructions.
435def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
436
Craig Topper05242bf2018-04-21 18:07:36 +0000437// Load/store MXCSR.
438def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
439def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
440
Gadi Haber323f2e12017-10-24 20:19:47 +0000441// Nop, not very useful expect it provides a model for nops!
442def : WriteRes<WriteNop, []>;
443
444////////////////////////////////////////////////////////////////////////////////
445// Horizontal add/sub instructions.
446////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000447
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000448defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3, 5>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000449defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000450defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3, 5>;
451defm : BWWriteResPair<WritePHAddY, [BWPort5,BWPort15], 3, [2,1], 3, 6>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000452
453// Remaining instrs.
454
455def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
456 let Latency = 1;
457 let NumMicroOps = 1;
458 let ResourceCycles = [1];
459}
Craig Topper5a69a002018-03-21 06:28:42 +0000460def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
461 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000462 "(V?)MOVPDI2DIrr",
463 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000464 "VPSLLVQ(Y?)rr",
Simon Pilgrim210286e2018-05-08 10:28:03 +0000465 "VPSRLVQ(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000466
467def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
468 let Latency = 1;
469 let NumMicroOps = 1;
470 let ResourceCycles = [1];
471}
Craig Topper5a69a002018-03-21 06:28:42 +0000472def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
473 "COM_FST0r",
474 "UCOM_FPr",
475 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000476
477def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
478 let Latency = 1;
479 let NumMicroOps = 1;
480 let ResourceCycles = [1];
481}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000482def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000483 "MMX_MOVD64to64rr",
484 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000485 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000486 "(V?)MOVDI2PDIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000487
488def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
489 let Latency = 1;
490 let NumMicroOps = 1;
491 let ResourceCycles = [1];
492}
493def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
494
495def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
496 let Latency = 1;
497 let NumMicroOps = 1;
498 let ResourceCycles = [1];
499}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000500def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000501
502def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
503 let Latency = 1;
504 let NumMicroOps = 1;
505 let ResourceCycles = [1];
506}
Craig Topperfbe31322018-04-05 21:56:19 +0000507def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000508def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
509 "ADC(16|32|64)i",
510 "ADC(8|16|32|64)rr",
511 "ADCX(32|64)rr",
512 "ADOX(32|64)rr",
513 "BT(16|32|64)ri8",
514 "BT(16|32|64)rr",
515 "BTC(16|32|64)ri8",
516 "BTC(16|32|64)rr",
517 "BTR(16|32|64)ri8",
518 "BTR(16|32|64)rr",
519 "BTS(16|32|64)ri8",
520 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000521 "SBB(16|32|64)ri",
522 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000523 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000524
525def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
526 let Latency = 1;
527 let NumMicroOps = 1;
528 let ResourceCycles = [1];
529}
Craig Topper5a69a002018-03-21 06:28:42 +0000530def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
531 "BLSI(32|64)rr",
532 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000533 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000534
535def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
536 let Latency = 1;
537 let NumMicroOps = 1;
538 let ResourceCycles = [1];
539}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000540def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000541 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000542
543def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
544 let Latency = 1;
545 let NumMicroOps = 1;
546 let ResourceCycles = [1];
547}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000548def: InstRW<[BWWriteResGroup9], (instrs LAHF, SAHF)>; // TODO: This doesnt match Agner's data
549def: InstRW<[BWWriteResGroup9], (instregex "NOOP",
Craig Topper5a69a002018-03-21 06:28:42 +0000550 "SGDT64m",
551 "SIDT64m",
Craig Topper5a69a002018-03-21 06:28:42 +0000552 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000553 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000554 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000555
556def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
557 let Latency = 1;
558 let NumMicroOps = 2;
559 let ResourceCycles = [1,1];
560}
Craig Topper5a69a002018-03-21 06:28:42 +0000561def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
562 "MMX_MOVD64from64rm",
563 "MMX_MOVD64mr",
564 "MMX_MOVNTQmr",
565 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000566 "MOVNTI_64mr",
567 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000568 "ST_FP(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000569 "VEXTRACTF128mr",
570 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000571 "(V?)MOVAPD(Y?)mr",
572 "(V?)MOVAPS(Y?)mr",
573 "(V?)MOVDQA(Y?)mr",
574 "(V?)MOVDQU(Y?)mr",
575 "(V?)MOVHPDmr",
576 "(V?)MOVHPSmr",
577 "(V?)MOVLPDmr",
578 "(V?)MOVLPSmr",
579 "(V?)MOVNTDQ(V?)mr",
580 "(V?)MOVNTPD(V?)mr",
581 "(V?)MOVNTPS(V?)mr",
582 "(V?)MOVPDI2DImr",
583 "(V?)MOVPQI2QImr",
584 "(V?)MOVPQIto64mr",
585 "(V?)MOVSDmr",
586 "(V?)MOVSSmr",
587 "(V?)MOVUPD(Y?)mr",
588 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000589
Gadi Haber323f2e12017-10-24 20:19:47 +0000590def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
591 let Latency = 2;
592 let NumMicroOps = 2;
593 let ResourceCycles = [2];
594}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000595def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000596
597def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
598 let Latency = 2;
599 let NumMicroOps = 2;
600 let ResourceCycles = [2];
601}
Craig Topper5a69a002018-03-21 06:28:42 +0000602def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
603 "ROL(8|16|32|64)ri",
604 "ROR(8|16|32|64)r1",
605 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000606
607def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
608 let Latency = 2;
609 let NumMicroOps = 2;
610 let ResourceCycles = [2];
611}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000612def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
613 MFENCE,
614 WAIT,
615 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000616
617def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
618 let Latency = 2;
619 let NumMicroOps = 2;
620 let ResourceCycles = [1,1];
621}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000622def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000623 "(V?)CVTPS2PDrr",
Simon Pilgrim210286e2018-05-08 10:28:03 +0000624 "(V?)CVTSS2SDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000625
626def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
627 let Latency = 2;
628 let NumMicroOps = 2;
629 let ResourceCycles = [1,1];
630}
631def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
632
633def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
634 let Latency = 2;
635 let NumMicroOps = 2;
636 let ResourceCycles = [1,1];
637}
638def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
639
640def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
641 let Latency = 2;
642 let NumMicroOps = 2;
643 let ResourceCycles = [1,1];
644}
645def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
646
647def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
648 let Latency = 2;
649 let NumMicroOps = 2;
650 let ResourceCycles = [1,1];
651}
Craig Topper498875f2018-04-04 17:54:19 +0000652def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
653
654def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
655 let Latency = 1;
656 let NumMicroOps = 1;
657 let ResourceCycles = [1];
658}
659def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000660
661def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
662 let Latency = 2;
663 let NumMicroOps = 2;
664 let ResourceCycles = [1,1];
665}
Craig Topper2d451e72018-03-18 08:38:06 +0000666def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000667def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000668def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
669 "ADC8ri",
670 "CMOV(A|BE)(16|32|64)rr",
671 "SBB8i8",
672 "SBB8ri",
673 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000674
Gadi Haber323f2e12017-10-24 20:19:47 +0000675def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
676 let Latency = 2;
677 let NumMicroOps = 3;
678 let ResourceCycles = [1,1,1];
679}
680def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
681
Gadi Haber323f2e12017-10-24 20:19:47 +0000682def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
683 let Latency = 2;
684 let NumMicroOps = 3;
685 let ResourceCycles = [1,1,1];
686}
687def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
688
689def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
690 let Latency = 2;
691 let NumMicroOps = 3;
692 let ResourceCycles = [1,1,1];
693}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000694def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
695 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000696def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000697 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000698
Gadi Haber323f2e12017-10-24 20:19:47 +0000699def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
700 let Latency = 3;
701 let NumMicroOps = 1;
702 let ResourceCycles = [1];
703}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000704def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000705 "PDEP(32|64)rr",
706 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000707 "SHLD(16|32|64)rri8",
708 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000709 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000710
711def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000712 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000713 let NumMicroOps = 2;
714 let ResourceCycles = [1,1];
715}
Clement Courbet327fac42018-03-07 08:14:02 +0000716def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000717
718def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
719 let Latency = 3;
720 let NumMicroOps = 1;
721 let ResourceCycles = [1];
722}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000723def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
Simon Pilgrime480ed02018-05-07 18:25:19 +0000724 "VPBROADCASTWrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000725
Gadi Haber323f2e12017-10-24 20:19:47 +0000726def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000727 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000728 let NumMicroOps = 3;
729 let ResourceCycles = [3];
730}
Craig Topperb5f26592018-04-19 18:00:17 +0000731def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
732 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
733 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000734
Gadi Haber323f2e12017-10-24 20:19:47 +0000735def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
736 let Latency = 3;
737 let NumMicroOps = 3;
738 let ResourceCycles = [2,1];
739}
Craig Topper5a69a002018-03-21 06:28:42 +0000740def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
741 "MMX_PACKSSWBirr",
742 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000743
744def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
745 let Latency = 3;
746 let NumMicroOps = 3;
747 let ResourceCycles = [1,2];
748}
749def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
750
751def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
752 let Latency = 3;
753 let NumMicroOps = 3;
754 let ResourceCycles = [1,2];
755}
Craig Topper5a69a002018-03-21 06:28:42 +0000756def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
757 "RCL(8|16|32|64)ri",
758 "RCR(8|16|32|64)r1",
759 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000760
761def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
762 let Latency = 3;
763 let NumMicroOps = 3;
764 let ResourceCycles = [2,1];
765}
Craig Topper5a69a002018-03-21 06:28:42 +0000766def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
767 "ROR(8|16|32|64)rCL",
768 "SAR(8|16|32|64)rCL",
769 "SHL(8|16|32|64)rCL",
770 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000771
772def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
773 let Latency = 3;
774 let NumMicroOps = 4;
775 let ResourceCycles = [1,1,1,1];
776}
777def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
778
779def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
780 let Latency = 3;
781 let NumMicroOps = 4;
782 let ResourceCycles = [1,1,1,1];
783}
Craig Topper5a69a002018-03-21 06:28:42 +0000784def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
785 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000786
787def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
788 let Latency = 4;
789 let NumMicroOps = 2;
790 let ResourceCycles = [1,1];
791}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000792def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
793 "(V?)CVTSD2SIrr",
794 "(V?)CVTSS2SI64rr",
795 "(V?)CVTSS2SIrr",
796 "(V?)CVTTSD2SI64rr",
797 "(V?)CVTTSD2SIrr",
798 "(V?)CVTTSS2SI64rr",
799 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000800
801def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
802 let Latency = 4;
803 let NumMicroOps = 2;
804 let ResourceCycles = [1,1];
805}
Simon Pilgrim210286e2018-05-08 10:28:03 +0000806def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000807
808def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
809 let Latency = 4;
810 let NumMicroOps = 2;
811 let ResourceCycles = [1,1];
812}
813def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
814
815def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
816 let Latency = 4;
817 let NumMicroOps = 2;
818 let ResourceCycles = [1,1];
819}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000820def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000821def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000822 "MMX_CVTPI2PDirr",
823 "MMX_CVTPS2PIirr",
824 "MMX_CVTTPD2PIirr",
825 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000826 "(V?)CVTDQ2PDrr",
827 "(V?)CVTPD2DQrr",
828 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000829 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000830 "(V?)CVTSD2SSrr",
831 "(V?)CVTSI642SDrr",
832 "(V?)CVTSI2SDrr",
833 "(V?)CVTSI2SSrr",
834 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000835
836def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
837 let Latency = 4;
838 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000839 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000840}
Craig Topper5a69a002018-03-21 06:28:42 +0000841def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000842
843def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
844 let Latency = 4;
845 let NumMicroOps = 3;
846 let ResourceCycles = [1,1,1];
847}
848def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
849
850def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
851 let Latency = 4;
852 let NumMicroOps = 3;
853 let ResourceCycles = [1,1,1];
854}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000855def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
856 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000857
858def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
859 let Latency = 4;
860 let NumMicroOps = 4;
861 let ResourceCycles = [4];
862}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000863def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000864
865def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
866 let Latency = 4;
867 let NumMicroOps = 4;
868 let ResourceCycles = [1,3];
869}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000870def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000871
872def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
873 let Latency = 5;
874 let NumMicroOps = 1;
875 let ResourceCycles = [1];
876}
Simon Pilgrima53d3302018-05-02 16:16:24 +0000877def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr",
878 "MUL_FPrST0",
879 "MUL_FST0r",
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000880 "MUL_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000881
Gadi Haber323f2e12017-10-24 20:19:47 +0000882def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
883 let Latency = 5;
884 let NumMicroOps = 1;
885 let ResourceCycles = [1];
886}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000887def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000888 "MOVSX(16|32|64)rm32",
889 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000890 "MOVZX(16|32|64)rm16",
891 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000892 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000893 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000894 "(V?)MOVSHDUPrm",
895 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000896 "VPBROADCASTDrm",
897 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000898
899def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
900 let Latency = 5;
901 let NumMicroOps = 3;
902 let ResourceCycles = [1,2];
903}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000904def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000905
906def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
907 let Latency = 5;
908 let NumMicroOps = 3;
909 let ResourceCycles = [1,1,1];
910}
911def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
912
913def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000914 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000915 let NumMicroOps = 3;
916 let ResourceCycles = [1,1,1];
917}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000918def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000919
Gadi Haber323f2e12017-10-24 20:19:47 +0000920def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
921 let Latency = 5;
922 let NumMicroOps = 5;
923 let ResourceCycles = [1,4];
924}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000925def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000926
927def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
928 let Latency = 5;
929 let NumMicroOps = 5;
930 let ResourceCycles = [1,4];
931}
932def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
933
934def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
935 let Latency = 5;
936 let NumMicroOps = 5;
937 let ResourceCycles = [2,3];
938}
Craig Topper5a69a002018-03-21 06:28:42 +0000939def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000940
941def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
942 let Latency = 5;
943 let NumMicroOps = 6;
944 let ResourceCycles = [1,1,4];
945}
Craig Topper5a69a002018-03-21 06:28:42 +0000946def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000947
948def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
949 let Latency = 6;
950 let NumMicroOps = 1;
951 let ResourceCycles = [1];
952}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000953def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000954 "VBROADCASTF128",
955 "VBROADCASTI128",
956 "VBROADCASTSDYrm",
957 "VBROADCASTSSYrm",
958 "VLDDQUYrm",
959 "VMOVAPDYrm",
960 "VMOVAPSYrm",
961 "VMOVDDUPYrm",
962 "VMOVDQAYrm",
963 "VMOVDQUYrm",
964 "VMOVNTDQAYrm",
965 "VMOVSHDUPYrm",
966 "VMOVSLDUPYrm",
967 "VMOVUPDYrm",
968 "VMOVUPSYrm",
969 "VPBROADCASTDYrm",
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000970 "VPBROADCASTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000971
972def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
973 let Latency = 6;
974 let NumMicroOps = 2;
975 let ResourceCycles = [1,1];
976}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000977def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000978 "(V?)CVTPS2PDrm",
979 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000980 "VPSLLVQrm",
Simon Pilgrim210286e2018-05-08 10:28:03 +0000981 "VPSRLVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000982
983def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
984 let Latency = 6;
985 let NumMicroOps = 2;
986 let ResourceCycles = [1,1];
987}
Craig Topper5a69a002018-03-21 06:28:42 +0000988def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
989 "VCVTPD2DQYrr",
990 "VCVTPD2PSYrr",
991 "VCVTPS2PHYrr",
992 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000993
Gadi Haber323f2e12017-10-24 20:19:47 +0000994def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
995 let Latency = 6;
996 let NumMicroOps = 2;
997 let ResourceCycles = [1,1];
998}
Craig Topper5a69a002018-03-21 06:28:42 +0000999def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
1000 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001001
1002def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
1003 let Latency = 6;
1004 let NumMicroOps = 2;
1005 let ResourceCycles = [1,1];
1006}
Craig Topperdfccafe2018-04-18 06:41:25 +00001007def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001008def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
1009 ADCX32rm, ADCX64rm,
1010 ADOX32rm, ADOX64rm,
1011 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001012
1013def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
1014 let Latency = 6;
1015 let NumMicroOps = 2;
1016 let ResourceCycles = [1,1];
1017}
Craig Topper5a69a002018-03-21 06:28:42 +00001018def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
1019 "BLSI(32|64)rm",
1020 "BLSMSK(32|64)rm",
1021 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001022 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001023
1024def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
1025 let Latency = 6;
1026 let NumMicroOps = 2;
1027 let ResourceCycles = [1,1];
1028}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001029def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +00001030 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001031 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001032
1033def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1034 let Latency = 6;
1035 let NumMicroOps = 2;
1036 let ResourceCycles = [1,1];
1037}
Craig Topper2d451e72018-03-18 08:38:06 +00001038def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001039def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001040
1041def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1042 let Latency = 6;
1043 let NumMicroOps = 4;
1044 let ResourceCycles = [1,1,2];
1045}
Craig Topper5a69a002018-03-21 06:28:42 +00001046def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1047 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001048
1049def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1050 let Latency = 6;
1051 let NumMicroOps = 4;
1052 let ResourceCycles = [1,1,1,1];
1053}
1054def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1055
1056def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1057 let Latency = 6;
1058 let NumMicroOps = 4;
1059 let ResourceCycles = [1,1,1,1];
1060}
Craig Topper5a69a002018-03-21 06:28:42 +00001061def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1062 "BTR(16|32|64)mi8",
1063 "BTS(16|32|64)mi8",
1064 "SAR(8|16|32|64)m1",
1065 "SAR(8|16|32|64)mi",
1066 "SHL(8|16|32|64)m1",
1067 "SHL(8|16|32|64)mi",
1068 "SHR(8|16|32|64)m1",
1069 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001070
1071def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1072 let Latency = 6;
1073 let NumMicroOps = 4;
1074 let ResourceCycles = [1,1,1,1];
1075}
Craig Topperf0d04262018-04-06 16:16:48 +00001076def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1077 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001078
1079def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1080 let Latency = 6;
1081 let NumMicroOps = 6;
1082 let ResourceCycles = [1,5];
1083}
1084def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1085
Gadi Haber323f2e12017-10-24 20:19:47 +00001086def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1087 let Latency = 7;
1088 let NumMicroOps = 2;
1089 let ResourceCycles = [1,1];
1090}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001091def: InstRW<[BWWriteResGroup73], (instregex "VPSLLVQYrm",
Simon Pilgrim210286e2018-05-08 10:28:03 +00001092 "VPSRLVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001093
1094def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1095 let Latency = 7;
1096 let NumMicroOps = 2;
1097 let ResourceCycles = [1,1];
1098}
Craig Topper5a69a002018-03-21 06:28:42 +00001099def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1100 "FCOM64m",
1101 "FCOMP32m",
1102 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001103
Gadi Haber323f2e12017-10-24 20:19:47 +00001104def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1105 let Latency = 7;
1106 let NumMicroOps = 2;
1107 let ResourceCycles = [1,1];
1108}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001109def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001110
Gadi Haber323f2e12017-10-24 20:19:47 +00001111def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1112 let Latency = 7;
1113 let NumMicroOps = 3;
1114 let ResourceCycles = [2,1];
1115}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001116def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001117 "MMX_PACKSSWBirm",
Simon Pilgrimb0a3be02018-05-08 12:17:55 +00001118 "MMX_PACKUSWBirm")>;
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
Gadi Haber323f2e12017-10-24 20:19:47 +00001128def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1129 let Latency = 7;
1130 let NumMicroOps = 3;
1131 let ResourceCycles = [1,1,1];
1132}
1133def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1134
Gadi Haber323f2e12017-10-24 20:19:47 +00001135def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1136 let Latency = 7;
1137 let NumMicroOps = 3;
1138 let ResourceCycles = [1,1,1];
1139}
Craig Topper5a69a002018-03-21 06:28:42 +00001140def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1141 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001142
Gadi Haber323f2e12017-10-24 20:19:47 +00001143def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1144 let Latency = 7;
1145 let NumMicroOps = 3;
1146 let ResourceCycles = [1,1,1];
1147}
Craig Topperf4cd9082018-01-19 05:47:32 +00001148def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001149
1150def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1151 let Latency = 7;
1152 let NumMicroOps = 5;
1153 let ResourceCycles = [1,1,1,2];
1154}
Craig Topper5a69a002018-03-21 06:28:42 +00001155def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1156 "ROL(8|16|32|64)mi",
1157 "ROR(8|16|32|64)m1",
1158 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001159
1160def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1161 let Latency = 7;
1162 let NumMicroOps = 5;
1163 let ResourceCycles = [1,1,1,2];
1164}
Craig Topper5a69a002018-03-21 06:28:42 +00001165def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001166
1167def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1168 let Latency = 7;
1169 let NumMicroOps = 5;
1170 let ResourceCycles = [1,1,1,1,1];
1171}
Craig Topper5a69a002018-03-21 06:28:42 +00001172def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1173 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001174
1175def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1176 let Latency = 7;
1177 let NumMicroOps = 7;
1178 let ResourceCycles = [2,2,1,2];
1179}
Craig Topper2d451e72018-03-18 08:38:06 +00001180def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001181
1182def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1183 let Latency = 8;
1184 let NumMicroOps = 2;
1185 let ResourceCycles = [1,1];
1186}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001187def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001188 "PDEP(32|64)rm",
1189 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001190 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001191
1192def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001193 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001194 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001195 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001196}
Craig Topperf846e2d2018-04-19 05:34:05 +00001197def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001198
Craig Topperf846e2d2018-04-19 05:34:05 +00001199def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1200 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001201 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001202 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001203}
Craig Topper5a69a002018-03-21 06:28:42 +00001204def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001205
Gadi Haber323f2e12017-10-24 20:19:47 +00001206def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1207 let Latency = 8;
1208 let NumMicroOps = 2;
1209 let ResourceCycles = [1,1];
1210}
Craig Topper5a69a002018-03-21 06:28:42 +00001211def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1212 "VPMOVSXBQYrm",
1213 "VPMOVSXBWYrm",
1214 "VPMOVSXDQYrm",
1215 "VPMOVSXWDYrm",
1216 "VPMOVSXWQYrm",
1217 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001218
Gadi Haber323f2e12017-10-24 20:19:47 +00001219def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1220 let Latency = 8;
1221 let NumMicroOps = 5;
1222 let ResourceCycles = [1,1,1,2];
1223}
Craig Topper5a69a002018-03-21 06:28:42 +00001224def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1225 "RCL(8|16|32|64)mi",
1226 "RCR(8|16|32|64)m1",
1227 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001228
1229def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1230 let Latency = 8;
1231 let NumMicroOps = 5;
1232 let ResourceCycles = [1,1,2,1];
1233}
Craig Topper13a16502018-03-19 00:56:09 +00001234def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001235
1236def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1237 let Latency = 8;
1238 let NumMicroOps = 6;
1239 let ResourceCycles = [1,1,1,3];
1240}
Craig Topper9f834812018-04-01 21:54:24 +00001241def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001242
1243def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1244 let Latency = 8;
1245 let NumMicroOps = 6;
1246 let ResourceCycles = [1,1,1,2,1];
1247}
Craig Topper9f834812018-04-01 21:54:24 +00001248def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001249 "CMPXCHG(8|16|32|64)rm",
1250 "ROL(8|16|32|64)mCL",
1251 "SAR(8|16|32|64)mCL",
1252 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001253 "SHL(8|16|32|64)mCL",
1254 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001255def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1256 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001257
1258def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1259 let Latency = 9;
1260 let NumMicroOps = 2;
1261 let ResourceCycles = [1,1];
1262}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001263def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1264 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001265 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001266 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001267
1268def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1269 let Latency = 9;
1270 let NumMicroOps = 2;
1271 let ResourceCycles = [1,1];
1272}
Craig Topper5a69a002018-03-21 06:28:42 +00001273def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1274 "VPERM2I128rm",
1275 "VPERMDYrm",
1276 "VPERMPDYmi",
1277 "VPERMPSYrm",
1278 "VPERMQYmi",
1279 "VPMOVZXBDYrm",
1280 "VPMOVZXBQYrm",
1281 "VPMOVZXBWYrm",
1282 "VPMOVZXDQYrm",
1283 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001284
Gadi Haber323f2e12017-10-24 20:19:47 +00001285def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1286 let Latency = 9;
1287 let NumMicroOps = 3;
1288 let ResourceCycles = [1,1,1];
1289}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001290def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1291 "(V?)CVTSD2SIrm",
1292 "(V?)CVTSS2SI64rm",
1293 "(V?)CVTSS2SIrm",
1294 "(V?)CVTTSD2SI64rm",
1295 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001296 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001297 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001298
1299def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1300 let Latency = 9;
1301 let NumMicroOps = 3;
1302 let ResourceCycles = [1,1,1];
1303}
1304def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1305
1306def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1307 let Latency = 9;
1308 let NumMicroOps = 3;
1309 let ResourceCycles = [1,1,1];
1310}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001311def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001312def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001313 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001314 "CVTTPD2DQrm",
1315 "MMX_CVTPD2PIirm",
1316 "MMX_CVTPI2PDirm",
1317 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001318 "(V?)CVTDQ2PDrm",
1319 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001320
1321def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1322 let Latency = 9;
1323 let NumMicroOps = 3;
1324 let ResourceCycles = [1,1,1];
1325}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001326def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1327 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001328
Gadi Haber323f2e12017-10-24 20:19:47 +00001329def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1330 let Latency = 9;
1331 let NumMicroOps = 4;
1332 let ResourceCycles = [1,1,1,1];
1333}
Craig Topper5a69a002018-03-21 06:28:42 +00001334def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1335 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001336
1337def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1338 let Latency = 9;
1339 let NumMicroOps = 5;
1340 let ResourceCycles = [1,1,3];
1341}
1342def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1343
1344def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1345 let Latency = 9;
1346 let NumMicroOps = 5;
1347 let ResourceCycles = [1,2,1,1];
1348}
Craig Topper5a69a002018-03-21 06:28:42 +00001349def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1350 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001351
Gadi Haber323f2e12017-10-24 20:19:47 +00001352def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1353 let Latency = 10;
1354 let NumMicroOps = 2;
1355 let ResourceCycles = [1,1];
1356}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001357def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001358
Gadi Haber323f2e12017-10-24 20:19:47 +00001359def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1360 let Latency = 10;
1361 let NumMicroOps = 3;
1362 let ResourceCycles = [2,1];
1363}
Craig Topper5a69a002018-03-21 06:28:42 +00001364def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1365 "FICOM32m",
1366 "FICOMP16m",
1367 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001368
Gadi Haber323f2e12017-10-24 20:19:47 +00001369def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1370 let Latency = 10;
1371 let NumMicroOps = 4;
1372 let ResourceCycles = [1,1,1,1];
1373}
1374def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1375
1376def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001377 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001378 let NumMicroOps = 4;
1379 let ResourceCycles = [1,1,1,1];
1380}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001381def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001382
Craig Topper8104f262018-04-02 05:33:28 +00001383def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1384 let Latency = 11;
1385 let NumMicroOps = 1;
1386 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1387}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001388def : SchedAlias<WriteFDiv, BWWriteResGroup122_1>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001389
1390def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1391 let Latency = 11;
1392 let NumMicroOps = 2;
1393 let ResourceCycles = [1,1];
1394}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001395def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001396 "VPCMPGTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001397
Gadi Haber323f2e12017-10-24 20:19:47 +00001398def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1399 let Latency = 11;
1400 let NumMicroOps = 3;
1401 let ResourceCycles = [1,1,1];
1402}
1403def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1404
Gadi Haber323f2e12017-10-24 20:19:47 +00001405def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1406 let Latency = 11;
1407 let NumMicroOps = 6;
1408 let ResourceCycles = [1,1,1,1,2];
1409}
Craig Topper5a69a002018-03-21 06:28:42 +00001410def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1411 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001412
1413def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1414 let Latency = 11;
1415 let NumMicroOps = 7;
1416 let ResourceCycles = [2,2,3];
1417}
Craig Topper5a69a002018-03-21 06:28:42 +00001418def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1419 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001420
1421def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1422 let Latency = 11;
1423 let NumMicroOps = 9;
1424 let ResourceCycles = [1,4,1,3];
1425}
1426def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1427
1428def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1429 let Latency = 11;
1430 let NumMicroOps = 11;
1431 let ResourceCycles = [2,9];
1432}
Craig Topper2d451e72018-03-18 08:38:06 +00001433def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1434def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001435
Gadi Haber323f2e12017-10-24 20:19:47 +00001436def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1437 let Latency = 12;
1438 let NumMicroOps = 3;
1439 let ResourceCycles = [2,1];
1440}
Simon Pilgrimbe51b202018-05-04 12:59:24 +00001441def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001442
Craig Topper8104f262018-04-02 05:33:28 +00001443def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1444 let Latency = 14;
1445 let NumMicroOps = 1;
1446 let ResourceCycles = [1,4];
1447}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001448def : SchedAlias<WriteFDiv64, BWWriteResGroup139_1>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001449
Gadi Haber323f2e12017-10-24 20:19:47 +00001450def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1451 let Latency = 14;
1452 let NumMicroOps = 3;
1453 let ResourceCycles = [1,1,1];
1454}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001455def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001456
Gadi Haber323f2e12017-10-24 20:19:47 +00001457def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1458 let Latency = 14;
1459 let NumMicroOps = 8;
1460 let ResourceCycles = [2,2,1,3];
1461}
1462def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1463
1464def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1465 let Latency = 14;
1466 let NumMicroOps = 10;
1467 let ResourceCycles = [2,3,1,4];
1468}
1469def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1470
1471def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1472 let Latency = 14;
1473 let NumMicroOps = 12;
1474 let ResourceCycles = [2,1,4,5];
1475}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001476def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001477
1478def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1479 let Latency = 15;
1480 let NumMicroOps = 1;
1481 let ResourceCycles = [1];
1482}
Craig Topper5a69a002018-03-21 06:28:42 +00001483def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1484 "DIVR_FST0r",
1485 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001486
Gadi Haber323f2e12017-10-24 20:19:47 +00001487def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1488 let Latency = 15;
1489 let NumMicroOps = 10;
1490 let ResourceCycles = [1,1,1,4,1,2];
1491}
Craig Topper13a16502018-03-19 00:56:09 +00001492def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001493
Craig Topper8104f262018-04-02 05:33:28 +00001494def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001495 let Latency = 16;
1496 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001497 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001498}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001499def : SchedAlias<WriteFDivLd, BWWriteResGroup150>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001500
Gadi Haber323f2e12017-10-24 20:19:47 +00001501def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1502 let Latency = 16;
1503 let NumMicroOps = 14;
1504 let ResourceCycles = [1,1,1,4,2,5];
1505}
1506def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1507
1508def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1509 let Latency = 16;
1510 let NumMicroOps = 16;
1511 let ResourceCycles = [16];
1512}
Craig Topper5a69a002018-03-21 06:28:42 +00001513def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001514
Gadi Haber323f2e12017-10-24 20:19:47 +00001515def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1516 let Latency = 18;
1517 let NumMicroOps = 8;
1518 let ResourceCycles = [1,1,1,5];
1519}
Craig Topper5a69a002018-03-21 06:28:42 +00001520def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001521def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001522
1523def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1524 let Latency = 18;
1525 let NumMicroOps = 11;
1526 let ResourceCycles = [2,1,1,3,1,3];
1527}
Craig Topper13a16502018-03-19 00:56:09 +00001528def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001529
Craig Topper8104f262018-04-02 05:33:28 +00001530def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001531 let Latency = 19;
1532 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001533 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001534}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001535def : SchedAlias<WriteFDiv64Ld, BWWriteResGroup161>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001536
Gadi Haber323f2e12017-10-24 20:19:47 +00001537def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1538 let Latency = 20;
1539 let NumMicroOps = 1;
1540 let ResourceCycles = [1];
1541}
Craig Topper5a69a002018-03-21 06:28:42 +00001542def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1543 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001544 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001545
Gadi Haber323f2e12017-10-24 20:19:47 +00001546def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1547 let Latency = 20;
1548 let NumMicroOps = 8;
1549 let ResourceCycles = [1,1,1,1,1,1,2];
1550}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001551def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001552
Gadi Haber323f2e12017-10-24 20:19:47 +00001553def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1554 let Latency = 21;
1555 let NumMicroOps = 2;
1556 let ResourceCycles = [1,1];
1557}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001558def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001559
Gadi Haber323f2e12017-10-24 20:19:47 +00001560def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1561 let Latency = 21;
1562 let NumMicroOps = 19;
1563 let ResourceCycles = [2,1,4,1,1,4,6];
1564}
1565def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1566
1567def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1568 let Latency = 22;
1569 let NumMicroOps = 18;
1570 let ResourceCycles = [1,1,16];
1571}
1572def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1573
Gadi Haber323f2e12017-10-24 20:19:47 +00001574def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1575 let Latency = 23;
1576 let NumMicroOps = 19;
1577 let ResourceCycles = [3,1,15];
1578}
Craig Topper391c6f92017-12-10 01:24:08 +00001579def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001580
1581def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1582 let Latency = 24;
1583 let NumMicroOps = 3;
1584 let ResourceCycles = [1,1,1];
1585}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001586def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001587
Gadi Haber323f2e12017-10-24 20:19:47 +00001588def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1589 let Latency = 26;
1590 let NumMicroOps = 2;
1591 let ResourceCycles = [1,1];
1592}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001593def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001594
Gadi Haber323f2e12017-10-24 20:19:47 +00001595def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1596 let Latency = 29;
1597 let NumMicroOps = 3;
1598 let ResourceCycles = [1,1,1];
1599}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001600def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001601
Gadi Haber323f2e12017-10-24 20:19:47 +00001602def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1603 let Latency = 22;
1604 let NumMicroOps = 7;
1605 let ResourceCycles = [1,3,2,1];
1606}
Craig Topper17a31182017-12-16 18:35:29 +00001607def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001608
1609def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1610 let Latency = 23;
1611 let NumMicroOps = 9;
1612 let ResourceCycles = [1,3,4,1];
1613}
Craig Topper17a31182017-12-16 18:35:29 +00001614def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001615
1616def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1617 let Latency = 24;
1618 let NumMicroOps = 9;
1619 let ResourceCycles = [1,5,2,1];
1620}
Craig Topper17a31182017-12-16 18:35:29 +00001621def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001622
1623def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1624 let Latency = 25;
1625 let NumMicroOps = 7;
1626 let ResourceCycles = [1,3,2,1];
1627}
Craig Topper17a31182017-12-16 18:35:29 +00001628def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1629 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001630
1631def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1632 let Latency = 26;
1633 let NumMicroOps = 9;
1634 let ResourceCycles = [1,5,2,1];
1635}
Craig Topper17a31182017-12-16 18:35:29 +00001636def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001637
1638def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1639 let Latency = 26;
1640 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001641 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001642}
Craig Topper17a31182017-12-16 18:35:29 +00001643def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001644
1645def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1646 let Latency = 27;
1647 let NumMicroOps = 9;
1648 let ResourceCycles = [1,5,2,1];
1649}
Craig Topper17a31182017-12-16 18:35:29 +00001650def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001651
Gadi Haber323f2e12017-10-24 20:19:47 +00001652def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1653 let Latency = 29;
1654 let NumMicroOps = 27;
1655 let ResourceCycles = [1,5,1,1,19];
1656}
1657def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1658
1659def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1660 let Latency = 30;
1661 let NumMicroOps = 28;
1662 let ResourceCycles = [1,6,1,1,19];
1663}
Craig Topper2d451e72018-03-18 08:38:06 +00001664def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001665
Gadi Haber323f2e12017-10-24 20:19:47 +00001666def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1667 let Latency = 34;
1668 let NumMicroOps = 8;
1669 let ResourceCycles = [2,2,2,1,1];
1670}
Craig Topper13a16502018-03-19 00:56:09 +00001671def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001672
1673def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
1674 let Latency = 34;
1675 let NumMicroOps = 23;
1676 let ResourceCycles = [1,5,3,4,10];
1677}
Craig Topper5a69a002018-03-21 06:28:42 +00001678def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
1679 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001680
1681def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1682 let Latency = 35;
1683 let NumMicroOps = 8;
1684 let ResourceCycles = [2,2,2,1,1];
1685}
Craig Topper13a16502018-03-19 00:56:09 +00001686def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001687
1688def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1689 let Latency = 35;
1690 let NumMicroOps = 23;
1691 let ResourceCycles = [1,5,2,1,4,10];
1692}
Craig Topper5a69a002018-03-21 06:28:42 +00001693def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
1694 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001695
Gadi Haber323f2e12017-10-24 20:19:47 +00001696def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
1697 let Latency = 42;
1698 let NumMicroOps = 22;
1699 let ResourceCycles = [2,20];
1700}
Craig Topper2d451e72018-03-18 08:38:06 +00001701def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001702
1703def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
1704 let Latency = 60;
1705 let NumMicroOps = 64;
1706 let ResourceCycles = [2,2,8,1,10,2,39];
1707}
1708def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001709
1710def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1711 let Latency = 63;
1712 let NumMicroOps = 88;
1713 let ResourceCycles = [4,4,31,1,2,1,45];
1714}
Craig Topper2d451e72018-03-18 08:38:06 +00001715def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001716
1717def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1718 let Latency = 63;
1719 let NumMicroOps = 90;
1720 let ResourceCycles = [4,2,33,1,2,1,47];
1721}
Craig Topper2d451e72018-03-18 08:38:06 +00001722def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001723
1724def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
1725 let Latency = 75;
1726 let NumMicroOps = 15;
1727 let ResourceCycles = [6,3,6];
1728}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00001729def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001730
1731def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
1732 let Latency = 80;
1733 let NumMicroOps = 32;
1734 let ResourceCycles = [7,7,3,3,1,11];
1735}
1736def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
1737
1738def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
1739 let Latency = 115;
1740 let NumMicroOps = 100;
1741 let ResourceCycles = [9,9,11,8,1,11,21,30];
1742}
1743def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001744
1745} // SchedModel
1746