blob: 175b09562319fca4c7bfaf6635feb091f0dea94f [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>;
Simon Pilgrimab34aa82018-05-09 11:01:16 +0000167defm : X86WriteRes<WriteFStore, [BWPort237,BWPort4], 1, [1,1], 2>;
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000168defm : 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>;
Simon Pilgrimab34aa82018-05-09 11:01:16 +0000261defm : X86WriteRes<WriteVecStore, [BWPort237,BWPort4], 1, [1,1], 2>;
Simon Pilgrimb0a3be02018-05-08 12:17:55 +0000262defm : 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.
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000268defm : BWWriteResPair<WriteVecALUX, [BWPort15], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000269defm : BWWriteResPair<WriteVecALUY, [BWPort15], 1, [1], 1, 6>; // Vector integer ALU op, no logicals (YMM/ZMM).
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000270defm : BWWriteResPair<WriteVecLogic, [BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000271defm : BWWriteResPair<WriteVecLogicX,[BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000272defm : BWWriteResPair<WriteVecLogicY,[BWPort015], 1, [1], 1, 6>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrim210286e2018-05-08 10:28:03 +0000273defm : BWWriteResPair<WriteVecTest, [BWPort0,BWPort5], 2, [1,1], 2, 5>; // Vector integer TEST instructions.
274defm : BWWriteResPair<WriteVecTestY, [BWPort0,BWPort5], 4, [1,1], 2, 6>; // Vector integer TEST instructions (YMM/ZMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000275defm : BWWriteResPair<WriteVecIMul, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000276defm : BWWriteResPair<WriteVecIMulX, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000277defm : BWWriteResPair<WriteVecIMulY, [BWPort0], 5, [1], 1, 6>; // Vector integer multiply.
278defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // Vector PMULLD.
279defm : BWWriteResPair<WritePMULLDY, [BWPort0], 10, [2], 2, 6>; // Vector PMULLD (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000280defm : BWWriteResPair<WriteShuffle, [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000281defm : BWWriteResPair<WriteShuffleX, [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000282defm : BWWriteResPair<WriteShuffleY, [BWPort5], 1, [1], 1, 6>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000283defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000284defm : BWWriteResPair<WriteVarShuffleX,[BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000285defm : BWWriteResPair<WriteVarShuffleY,[BWPort5], 1, [1], 1, 6>; // Vector variable shuffles (YMM/ZMM).
286defm : BWWriteResPair<WriteBlend, [BWPort5], 1, [1], 1, 5>; // Vector blends.
287defm : BWWriteResPair<WriteBlendY, [BWPort5], 1, [1], 1, 6>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000288defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000289defm : BWWriteResPair<WriteVarBlendY, [BWPort5], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000290defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000291defm : BWWriteResPair<WriteMPSADY, [BWPort0, BWPort5], 7, [1, 2], 3, 6>; // Vector MPSAD.
292defm : BWWriteResPair<WritePSADBW, [BWPort0], 5, [1], 1, 5>; // Vector PSADBW.
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000293defm : BWWriteResPair<WritePSADBWX, [BWPort0], 5, [1], 1, 5>; // Vector PSADBW.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000294defm : BWWriteResPair<WritePSADBWY, [BWPort0], 5, [1], 1, 6>; // Vector PSADBW (YMM/ZMM).
295defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000296
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000297// Vector integer shifts.
298defm : BWWriteResPair<WriteVecShift, [BWPort0], 1, [1], 1, 5>;
299defm : BWWriteResPair<WriteVecShiftX, [BWPort0,BWPort5], 2, [1,1], 2, 5>;
300defm : X86WriteRes<WriteVecShiftY, [BWPort0,BWPort5], 4, [1,1], 2>;
301defm : X86WriteRes<WriteVecShiftYLd, [BWPort0,BWPort23], 7, [1,1], 2>;
302
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000303defm : BWWriteResPair<WriteVecShiftImm, [BWPort0], 1, [1], 1, 5>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000304defm : BWWriteResPair<WriteVecShiftImmX, [BWPort0], 1, [1], 1, 5>; // Vector integer immediate shifts (XMM).
305defm : BWWriteResPair<WriteVecShiftImmY, [BWPort0], 1, [1], 1, 6>; // Vector integer immediate shifts (YMM/ZMM).
306defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 3, [2,1], 3, 5>; // Variable vector shifts.
307defm : BWWriteResPair<WriteVarVecShiftY, [BWPort0, BWPort5], 3, [2,1], 3, 6>; // Variable vector shifts (YMM/ZMM).
308
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000309// Vector insert/extract operations.
310def : WriteRes<WriteVecInsert, [BWPort5]> {
311 let Latency = 2;
312 let NumMicroOps = 2;
313 let ResourceCycles = [2];
314}
315def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
316 let Latency = 6;
317 let NumMicroOps = 2;
318}
319
320def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
321 let Latency = 2;
322 let NumMicroOps = 2;
323}
324def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
325 let Latency = 2;
326 let NumMicroOps = 3;
327}
328
Gadi Haber323f2e12017-10-24 20:19:47 +0000329// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000330defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
331defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
332defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000333
334// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000335
Gadi Haber323f2e12017-10-24 20:19:47 +0000336// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000337def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000338 let Latency = 11;
339 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000340 let ResourceCycles = [3];
341}
342def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000343 let Latency = 16;
344 let NumMicroOps = 4;
345 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000346}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000347
348// Packed Compare Explicit Length Strings, Return Mask
349def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
350 let Latency = 19;
351 let NumMicroOps = 9;
352 let ResourceCycles = [4,3,1,1];
353}
354def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
355 let Latency = 24;
356 let NumMicroOps = 10;
357 let ResourceCycles = [4,3,1,1,1];
358}
359
360// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000361def : WriteRes<WritePCmpIStrI, [BWPort0]> {
362 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000363 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000364 let ResourceCycles = [3];
365}
366def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000367 let Latency = 16;
368 let NumMicroOps = 4;
369 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000370}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000371
372// Packed Compare Explicit Length Strings, Return Index
373def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
374 let Latency = 18;
375 let NumMicroOps = 8;
376 let ResourceCycles = [4,3,1];
377}
378def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
379 let Latency = 23;
380 let NumMicroOps = 9;
381 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000382}
383
Simon Pilgrima2f26782018-03-27 20:38:54 +0000384// MOVMSK Instructions.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000385def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
386def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
387def : WriteRes<WriteVecMOVMSKY, [BWPort0]> { let Latency = 3; }
388def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
Simon Pilgrima2f26782018-03-27 20:38:54 +0000389
Gadi Haber323f2e12017-10-24 20:19:47 +0000390// AES instructions.
391def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
392 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000393 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000394 let ResourceCycles = [1];
395}
396def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000397 let Latency = 12;
398 let NumMicroOps = 2;
399 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000400}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000401
Gadi Haber323f2e12017-10-24 20:19:47 +0000402def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
403 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000404 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000405 let ResourceCycles = [2];
406}
407def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000408 let Latency = 19;
409 let NumMicroOps = 3;
410 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000411}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000412
413def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
414 let Latency = 29;
415 let NumMicroOps = 11;
416 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000417}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000418def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
419 let Latency = 33;
420 let NumMicroOps = 11;
421 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000422}
423
424// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000425defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000426
427// Catch-all for expensive system instructions.
428def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
429
430// AVX2.
Simon Pilgrimca7981a2018-05-09 19:27:48 +0000431defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3, [1], 1, 6>; // Fp 256-bit width vector shuffles.
432defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3, [1], 1, 6>; // Fp 256-bit width vector variable shuffles.
433defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3, [1], 1, 6>; // 256-bit width vector shuffles.
434defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3, [1], 1, 6>; // 256-bit width vector variable shuffles.
Gadi Haber323f2e12017-10-24 20:19:47 +0000435
436// Old microcoded instructions that nobody use.
437def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
438
439// Fence instructions.
440def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
441
Craig Topper05242bf2018-04-21 18:07:36 +0000442// Load/store MXCSR.
443def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
444def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
445
Gadi Haber323f2e12017-10-24 20:19:47 +0000446// Nop, not very useful expect it provides a model for nops!
447def : WriteRes<WriteNop, []>;
448
449////////////////////////////////////////////////////////////////////////////////
450// Horizontal add/sub instructions.
451////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000452
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000453defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3, 5>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000454defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000455defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3, 5>;
Simon Pilgrim38ac0e92018-05-10 17:06:09 +0000456defm : BWWriteResPair<WritePHAddX, [BWPort5,BWPort15], 3, [2,1], 3, 5>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000457defm : BWWriteResPair<WritePHAddY, [BWPort5,BWPort15], 3, [2,1], 3, 6>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000458
459// Remaining instrs.
460
461def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
462 let Latency = 1;
463 let NumMicroOps = 1;
464 let ResourceCycles = [1];
465}
Craig Topper5a69a002018-03-21 06:28:42 +0000466def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
467 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000468 "(V?)MOVPDI2DIrr",
469 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000470 "VPSLLVQ(Y?)rr",
Simon Pilgrim210286e2018-05-08 10:28:03 +0000471 "VPSRLVQ(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000472
473def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
474 let Latency = 1;
475 let NumMicroOps = 1;
476 let ResourceCycles = [1];
477}
Simon Pilgrima3686c92018-05-10 19:08:06 +0000478def: InstRW<[BWWriteResGroup2], (instregex "COM(P?)_FST0r",
479 "UCOM_F(P?)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000480
481def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
482 let Latency = 1;
483 let NumMicroOps = 1;
484 let ResourceCycles = [1];
485}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000486def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000487 "MMX_MOVD64to64rr",
488 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000489 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000490 "(V?)MOVDI2PDIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000491
492def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
493 let Latency = 1;
494 let NumMicroOps = 1;
495 let ResourceCycles = [1];
496}
497def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
498
499def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
500 let Latency = 1;
501 let NumMicroOps = 1;
502 let ResourceCycles = [1];
503}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000504def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000505
506def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
507 let Latency = 1;
508 let NumMicroOps = 1;
509 let ResourceCycles = [1];
510}
Craig Topperfbe31322018-04-05 21:56:19 +0000511def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000512def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
513 "ADC(16|32|64)i",
514 "ADC(8|16|32|64)rr",
515 "ADCX(32|64)rr",
516 "ADOX(32|64)rr",
517 "BT(16|32|64)ri8",
518 "BT(16|32|64)rr",
519 "BTC(16|32|64)ri8",
520 "BTC(16|32|64)rr",
521 "BTR(16|32|64)ri8",
522 "BTR(16|32|64)rr",
523 "BTS(16|32|64)ri8",
524 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000525 "SBB(16|32|64)ri",
526 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000527 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000528
529def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
530 let Latency = 1;
531 let NumMicroOps = 1;
532 let ResourceCycles = [1];
533}
Craig Topper5a69a002018-03-21 06:28:42 +0000534def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
535 "BLSI(32|64)rr",
536 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000537 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000538
539def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
540 let Latency = 1;
541 let NumMicroOps = 1;
542 let ResourceCycles = [1];
543}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000544def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000545 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000546
547def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
548 let Latency = 1;
549 let NumMicroOps = 1;
550 let ResourceCycles = [1];
551}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000552def: InstRW<[BWWriteResGroup9], (instrs LAHF, SAHF)>; // TODO: This doesnt match Agner's data
553def: InstRW<[BWWriteResGroup9], (instregex "NOOP",
Craig Topper5a69a002018-03-21 06:28:42 +0000554 "SGDT64m",
555 "SIDT64m",
Craig Topper5a69a002018-03-21 06:28:42 +0000556 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000557 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000558 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000559
560def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
561 let Latency = 1;
562 let NumMicroOps = 2;
563 let ResourceCycles = [1,1];
564}
Craig Topper5a69a002018-03-21 06:28:42 +0000565def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
566 "MMX_MOVD64from64rm",
567 "MMX_MOVD64mr",
568 "MMX_MOVNTQmr",
569 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000570 "MOVNTI_64mr",
571 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000572 "ST_FP(32|64|80)m",
Simon Pilgrimd5d4cdb2018-05-09 19:04:15 +0000573 "(V?)MOV(H|L)(PD|PS)mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000574 "(V?)MOVPDI2DImr",
575 "(V?)MOVPQI2QImr",
576 "(V?)MOVPQIto64mr",
Simon Pilgrimd5d4cdb2018-05-09 19:04:15 +0000577 "(V?)MOV(SD|SS)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000578
Gadi Haber323f2e12017-10-24 20:19:47 +0000579def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
580 let Latency = 2;
581 let NumMicroOps = 2;
582 let ResourceCycles = [2];
583}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000584def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000585
586def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
587 let Latency = 2;
588 let NumMicroOps = 2;
589 let ResourceCycles = [2];
590}
Craig Topper5a69a002018-03-21 06:28:42 +0000591def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
592 "ROL(8|16|32|64)ri",
593 "ROR(8|16|32|64)r1",
594 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000595
596def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
597 let Latency = 2;
598 let NumMicroOps = 2;
599 let ResourceCycles = [2];
600}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000601def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
602 MFENCE,
603 WAIT,
604 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000605
606def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
607 let Latency = 2;
608 let NumMicroOps = 2;
609 let ResourceCycles = [1,1];
610}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000611def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000612 "(V?)CVTPS2PDrr",
Simon Pilgrim210286e2018-05-08 10:28:03 +0000613 "(V?)CVTSS2SDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000614
615def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
616 let Latency = 2;
617 let NumMicroOps = 2;
618 let ResourceCycles = [1,1];
619}
620def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
621
622def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
623 let Latency = 2;
624 let NumMicroOps = 2;
625 let ResourceCycles = [1,1];
626}
627def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
628
629def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
630 let Latency = 2;
631 let NumMicroOps = 2;
632 let ResourceCycles = [1,1];
633}
Simon Pilgrima3686c92018-05-10 19:08:06 +0000634def: InstRW<[BWWriteResGroup18], (instrs SFENCE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000635
636def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
637 let Latency = 2;
638 let NumMicroOps = 2;
639 let ResourceCycles = [1,1];
640}
Craig Topper498875f2018-04-04 17:54:19 +0000641def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
642
643def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
644 let Latency = 1;
645 let NumMicroOps = 1;
646 let ResourceCycles = [1];
647}
648def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000649
650def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
651 let Latency = 2;
652 let NumMicroOps = 2;
653 let ResourceCycles = [1,1];
654}
Craig Topper2d451e72018-03-18 08:38:06 +0000655def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000656def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000657def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
658 "ADC8ri",
659 "CMOV(A|BE)(16|32|64)rr",
660 "SBB8i8",
661 "SBB8ri",
662 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000663
Gadi Haber323f2e12017-10-24 20:19:47 +0000664def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
665 let Latency = 2;
666 let NumMicroOps = 3;
667 let ResourceCycles = [1,1,1];
668}
Simon Pilgrima3686c92018-05-10 19:08:06 +0000669def: InstRW<[BWWriteResGroup22], (instrs FNSTCW16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000670
Gadi Haber323f2e12017-10-24 20:19:47 +0000671def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
672 let Latency = 2;
673 let NumMicroOps = 3;
674 let ResourceCycles = [1,1,1];
675}
676def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
677
678def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
679 let Latency = 2;
680 let NumMicroOps = 3;
681 let ResourceCycles = [1,1,1];
682}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000683def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
684 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000685def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000686 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000687
Gadi Haber323f2e12017-10-24 20:19:47 +0000688def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
689 let Latency = 3;
690 let NumMicroOps = 1;
691 let ResourceCycles = [1];
692}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000693def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000694 "PDEP(32|64)rr",
695 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000696 "SHLD(16|32|64)rri8",
697 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000698 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000699
700def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000701 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000702 let NumMicroOps = 2;
703 let ResourceCycles = [1,1];
704}
Clement Courbet327fac42018-03-07 08:14:02 +0000705def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000706
707def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
708 let Latency = 3;
709 let NumMicroOps = 1;
710 let ResourceCycles = [1];
711}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000712def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
Simon Pilgrime480ed02018-05-07 18:25:19 +0000713 "VPBROADCASTWrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000714
Gadi Haber323f2e12017-10-24 20:19:47 +0000715def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000716 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000717 let NumMicroOps = 3;
718 let ResourceCycles = [3];
719}
Craig Topperb5f26592018-04-19 18:00:17 +0000720def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
721 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
722 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000723
Gadi Haber323f2e12017-10-24 20:19:47 +0000724def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
725 let Latency = 3;
726 let NumMicroOps = 3;
727 let ResourceCycles = [2,1];
728}
Craig Topper5a69a002018-03-21 06:28:42 +0000729def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
730 "MMX_PACKSSWBirr",
731 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000732
733def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
734 let Latency = 3;
735 let NumMicroOps = 3;
736 let ResourceCycles = [1,2];
737}
738def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
739
740def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
741 let Latency = 3;
742 let NumMicroOps = 3;
743 let ResourceCycles = [1,2];
744}
Craig Topper5a69a002018-03-21 06:28:42 +0000745def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
746 "RCL(8|16|32|64)ri",
747 "RCR(8|16|32|64)r1",
748 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000749
750def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
751 let Latency = 3;
752 let NumMicroOps = 3;
753 let ResourceCycles = [2,1];
754}
Craig Topper5a69a002018-03-21 06:28:42 +0000755def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
756 "ROR(8|16|32|64)rCL",
757 "SAR(8|16|32|64)rCL",
758 "SHL(8|16|32|64)rCL",
759 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000760
761def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
762 let Latency = 3;
763 let NumMicroOps = 4;
764 let ResourceCycles = [1,1,1,1];
765}
766def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
767
768def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
769 let Latency = 3;
770 let NumMicroOps = 4;
771 let ResourceCycles = [1,1,1,1];
772}
Simon Pilgrima3686c92018-05-10 19:08:06 +0000773def: InstRW<[BWWriteResGroup38], (instrs CALL64pcrel32)>;
774def: InstRW<[BWWriteResGroup38], (instregex "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000775
776def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
777 let Latency = 4;
778 let NumMicroOps = 2;
779 let ResourceCycles = [1,1];
780}
Simon Pilgrimd5d4cdb2018-05-09 19:04:15 +0000781def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVT(T?)SD2SI64rr",
782 "(V?)CVT(T?)SD2SIrr",
783 "(V?)CVT(T?)SS2SI64rr",
784 "(V?)CVT(T?)SS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000785
786def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
787 let Latency = 4;
788 let NumMicroOps = 2;
789 let ResourceCycles = [1,1];
790}
Simon Pilgrim210286e2018-05-08 10:28:03 +0000791def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000792
793def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
794 let Latency = 4;
795 let NumMicroOps = 2;
796 let ResourceCycles = [1,1];
797}
Simon Pilgrima3686c92018-05-10 19:08:06 +0000798def: InstRW<[BWWriteResGroup41], (instrs FNSTSW16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000799
800def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
801 let Latency = 4;
802 let NumMicroOps = 2;
803 let ResourceCycles = [1,1];
804}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000805def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimd5d4cdb2018-05-09 19:04:15 +0000806def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPI2PDirr",
807 "MMX_CVT(T?)PD2PIirr",
808 "MMX_CVT(T?)PS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000809 "(V?)CVTDQ2PDrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000810 "(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",
Simon Pilgrimd5d4cdb2018-05-09 19:04:15 +0000816 "(V?)CVT(T?)PD2DQrr")>;
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}
Simon Pilgrima3686c92018-05-10 19:08:06 +0000830def: InstRW<[BWWriteResGroup43], (instrs FNSTSWm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000831
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",
Simon Pilgrima3686c92018-05-10 19:08:06 +0000860 "MUL_(FPrST0|FST0r|FrST0)")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000861
Gadi Haber323f2e12017-10-24 20:19:47 +0000862def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
863 let Latency = 5;
864 let NumMicroOps = 1;
865 let ResourceCycles = [1];
866}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000867def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000868 "MOVSX(16|32|64)rm32",
869 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000870 "MOVZX(16|32|64)rm16",
871 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000872 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000873 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000874 "(V?)MOVSHDUPrm",
875 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000876 "VPBROADCASTDrm",
877 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000878
879def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
880 let Latency = 5;
881 let NumMicroOps = 3;
882 let ResourceCycles = [1,2];
883}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000884def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000885
886def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
887 let Latency = 5;
888 let NumMicroOps = 3;
889 let ResourceCycles = [1,1,1];
890}
891def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
892
893def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000894 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000895 let NumMicroOps = 3;
896 let ResourceCycles = [1,1,1];
897}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000898def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000899
Gadi Haber323f2e12017-10-24 20:19:47 +0000900def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
901 let Latency = 5;
902 let NumMicroOps = 5;
903 let ResourceCycles = [1,4];
904}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000905def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000906
907def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
908 let Latency = 5;
909 let NumMicroOps = 5;
910 let ResourceCycles = [1,4];
911}
Simon Pilgrima3686c92018-05-10 19:08:06 +0000912def: InstRW<[BWWriteResGroup55], (instrs XSETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000913
914def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
915 let Latency = 5;
916 let NumMicroOps = 5;
917 let ResourceCycles = [2,3];
918}
Craig Topper5a69a002018-03-21 06:28:42 +0000919def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000920
921def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
922 let Latency = 5;
923 let NumMicroOps = 6;
924 let ResourceCycles = [1,1,4];
925}
Simon Pilgrima3686c92018-05-10 19:08:06 +0000926def: InstRW<[BWWriteResGroup57], (instregex "PUSHF(16|64)")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000927
928def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
929 let Latency = 6;
930 let NumMicroOps = 1;
931 let ResourceCycles = [1];
932}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000933def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000934 "VBROADCASTF128",
935 "VBROADCASTI128",
936 "VBROADCASTSDYrm",
937 "VBROADCASTSSYrm",
938 "VLDDQUYrm",
939 "VMOVAPDYrm",
940 "VMOVAPSYrm",
941 "VMOVDDUPYrm",
942 "VMOVDQAYrm",
943 "VMOVDQUYrm",
944 "VMOVNTDQAYrm",
945 "VMOVSHDUPYrm",
946 "VMOVSLDUPYrm",
947 "VMOVUPDYrm",
948 "VMOVUPSYrm",
949 "VPBROADCASTDYrm",
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000950 "VPBROADCASTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000951
952def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
953 let Latency = 6;
954 let NumMicroOps = 2;
955 let ResourceCycles = [1,1];
956}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000957def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000958 "(V?)CVTPS2PDrm",
959 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000960 "VPSLLVQrm",
Simon Pilgrim210286e2018-05-08 10:28:03 +0000961 "VPSRLVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000962
963def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
964 let Latency = 6;
965 let NumMicroOps = 2;
966 let ResourceCycles = [1,1];
967}
Craig Topper5a69a002018-03-21 06:28:42 +0000968def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000969 "VCVTPD2PSYrr",
970 "VCVTPS2PHYrr",
Simon Pilgrimd5d4cdb2018-05-09 19:04:15 +0000971 "VCVT(T?)PD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000972
Gadi Haber323f2e12017-10-24 20:19:47 +0000973def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
974 let Latency = 6;
975 let NumMicroOps = 2;
976 let ResourceCycles = [1,1];
977}
Craig Topper5a69a002018-03-21 06:28:42 +0000978def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
979 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000980
981def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
982 let Latency = 6;
983 let NumMicroOps = 2;
984 let ResourceCycles = [1,1];
985}
Craig Topperdfccafe2018-04-18 06:41:25 +0000986def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +0000987def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
988 ADCX32rm, ADCX64rm,
989 ADOX32rm, ADOX64rm,
990 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000991
992def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
993 let Latency = 6;
994 let NumMicroOps = 2;
995 let ResourceCycles = [1,1];
996}
Craig Topper5a69a002018-03-21 06:28:42 +0000997def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
998 "BLSI(32|64)rm",
999 "BLSMSK(32|64)rm",
1000 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001001 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001002
1003def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
1004 let Latency = 6;
1005 let NumMicroOps = 2;
1006 let ResourceCycles = [1,1];
1007}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001008def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +00001009 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001010 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001011
1012def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1013 let Latency = 6;
1014 let NumMicroOps = 2;
1015 let ResourceCycles = [1,1];
1016}
Craig Topper2d451e72018-03-18 08:38:06 +00001017def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001018def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001019
1020def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1021 let Latency = 6;
1022 let NumMicroOps = 4;
1023 let ResourceCycles = [1,1,2];
1024}
Craig Topper5a69a002018-03-21 06:28:42 +00001025def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1026 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001027
1028def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1029 let Latency = 6;
1030 let NumMicroOps = 4;
1031 let ResourceCycles = [1,1,1,1];
1032}
1033def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1034
1035def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1036 let Latency = 6;
1037 let NumMicroOps = 4;
1038 let ResourceCycles = [1,1,1,1];
1039}
Craig Topper5a69a002018-03-21 06:28:42 +00001040def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1041 "BTR(16|32|64)mi8",
1042 "BTS(16|32|64)mi8",
1043 "SAR(8|16|32|64)m1",
1044 "SAR(8|16|32|64)mi",
1045 "SHL(8|16|32|64)m1",
1046 "SHL(8|16|32|64)mi",
1047 "SHR(8|16|32|64)m1",
1048 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001049
1050def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1051 let Latency = 6;
1052 let NumMicroOps = 4;
1053 let ResourceCycles = [1,1,1,1];
1054}
Craig Topperf0d04262018-04-06 16:16:48 +00001055def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1056 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001057
1058def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1059 let Latency = 6;
1060 let NumMicroOps = 6;
1061 let ResourceCycles = [1,5];
1062}
Simon Pilgrima3686c92018-05-10 19:08:06 +00001063def: InstRW<[BWWriteResGroup71], (instrs STD)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001064
Gadi Haber323f2e12017-10-24 20:19:47 +00001065def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1066 let Latency = 7;
1067 let NumMicroOps = 2;
1068 let ResourceCycles = [1,1];
1069}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001070def: InstRW<[BWWriteResGroup73], (instregex "VPSLLVQYrm",
Simon Pilgrim210286e2018-05-08 10:28:03 +00001071 "VPSRLVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001072
1073def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1074 let Latency = 7;
1075 let NumMicroOps = 2;
1076 let ResourceCycles = [1,1];
1077}
Simon Pilgrima3686c92018-05-10 19:08:06 +00001078def: InstRW<[BWWriteResGroup74], (instregex "FCOM(P?)(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001079
Gadi Haber323f2e12017-10-24 20:19:47 +00001080def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1081 let Latency = 7;
1082 let NumMicroOps = 2;
1083 let ResourceCycles = [1,1];
1084}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001085def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001086
Gadi Haber323f2e12017-10-24 20:19:47 +00001087def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1088 let Latency = 7;
1089 let NumMicroOps = 3;
1090 let ResourceCycles = [2,1];
1091}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001092def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001093 "MMX_PACKSSWBirm",
Simon Pilgrimb0a3be02018-05-08 12:17:55 +00001094 "MMX_PACKUSWBirm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001095
1096def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1097 let Latency = 7;
1098 let NumMicroOps = 3;
1099 let ResourceCycles = [1,2];
1100}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001101def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1102 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001103
Gadi Haber323f2e12017-10-24 20:19:47 +00001104def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1105 let Latency = 7;
1106 let NumMicroOps = 3;
1107 let ResourceCycles = [1,1,1];
1108}
Simon Pilgrima3686c92018-05-10 19:08:06 +00001109def: InstRW<[BWWriteResGroup82], (instrs FLDCW16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001110
Gadi Haber323f2e12017-10-24 20:19:47 +00001111def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1112 let Latency = 7;
1113 let NumMicroOps = 3;
1114 let ResourceCycles = [1,1,1];
1115}
Simon Pilgrima3686c92018-05-10 19:08:06 +00001116def: InstRW<[BWWriteResGroup84], (instrs LRETQ, RETQ)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001117
Gadi Haber323f2e12017-10-24 20:19:47 +00001118def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1119 let Latency = 7;
1120 let NumMicroOps = 3;
1121 let ResourceCycles = [1,1,1];
1122}
Craig Topperf4cd9082018-01-19 05:47:32 +00001123def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001124
1125def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1126 let Latency = 7;
1127 let NumMicroOps = 5;
1128 let ResourceCycles = [1,1,1,2];
1129}
Craig Topper5a69a002018-03-21 06:28:42 +00001130def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1131 "ROL(8|16|32|64)mi",
1132 "ROR(8|16|32|64)m1",
1133 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001134
1135def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1136 let Latency = 7;
1137 let NumMicroOps = 5;
1138 let ResourceCycles = [1,1,1,2];
1139}
Craig Topper5a69a002018-03-21 06:28:42 +00001140def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001141
1142def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1143 let Latency = 7;
1144 let NumMicroOps = 5;
1145 let ResourceCycles = [1,1,1,1,1];
1146}
Craig Topper5a69a002018-03-21 06:28:42 +00001147def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1148 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001149
1150def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1151 let Latency = 7;
1152 let NumMicroOps = 7;
1153 let ResourceCycles = [2,2,1,2];
1154}
Craig Topper2d451e72018-03-18 08:38:06 +00001155def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001156
1157def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1158 let Latency = 8;
1159 let NumMicroOps = 2;
1160 let ResourceCycles = [1,1];
1161}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001162def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001163 "PDEP(32|64)rm",
1164 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001165 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001166
1167def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001168 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001169 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001170 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001171}
Craig Topperf846e2d2018-04-19 05:34:05 +00001172def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001173
Craig Topperf846e2d2018-04-19 05:34:05 +00001174def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1175 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001176 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001177 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001178}
Craig Topper5a69a002018-03-21 06:28:42 +00001179def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001180
Gadi Haber323f2e12017-10-24 20:19:47 +00001181def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1182 let Latency = 8;
1183 let NumMicroOps = 2;
1184 let ResourceCycles = [1,1];
1185}
Craig Topper5a69a002018-03-21 06:28:42 +00001186def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1187 "VPMOVSXBQYrm",
1188 "VPMOVSXBWYrm",
1189 "VPMOVSXDQYrm",
1190 "VPMOVSXWDYrm",
1191 "VPMOVSXWQYrm",
1192 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001193
Gadi Haber323f2e12017-10-24 20:19:47 +00001194def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1195 let Latency = 8;
1196 let NumMicroOps = 5;
1197 let ResourceCycles = [1,1,1,2];
1198}
Craig Topper5a69a002018-03-21 06:28:42 +00001199def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1200 "RCL(8|16|32|64)mi",
1201 "RCR(8|16|32|64)m1",
1202 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001203
1204def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1205 let Latency = 8;
1206 let NumMicroOps = 5;
1207 let ResourceCycles = [1,1,2,1];
1208}
Craig Topper13a16502018-03-19 00:56:09 +00001209def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001210
1211def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1212 let Latency = 8;
1213 let NumMicroOps = 6;
1214 let ResourceCycles = [1,1,1,3];
1215}
Craig Topper9f834812018-04-01 21:54:24 +00001216def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001217
1218def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1219 let Latency = 8;
1220 let NumMicroOps = 6;
1221 let ResourceCycles = [1,1,1,2,1];
1222}
Craig Topper9f834812018-04-01 21:54:24 +00001223def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001224 "CMPXCHG(8|16|32|64)rm",
1225 "ROL(8|16|32|64)mCL",
1226 "SAR(8|16|32|64)mCL",
1227 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001228 "SHL(8|16|32|64)mCL",
1229 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001230def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1231 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001232
1233def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1234 let Latency = 9;
1235 let NumMicroOps = 2;
1236 let ResourceCycles = [1,1];
1237}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001238def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1239 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001240 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001241 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001242
Gadi Haber323f2e12017-10-24 20:19:47 +00001243def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1244 let Latency = 9;
1245 let NumMicroOps = 3;
1246 let ResourceCycles = [1,1,1];
1247}
Simon Pilgrimd5d4cdb2018-05-09 19:04:15 +00001248def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSS2SI(64)?rm",
1249 "(V?)CVT(T?)SD2SI64rm",
1250 "(V?)CVT(T?)SD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001251 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001252 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001253
1254def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1255 let Latency = 9;
1256 let NumMicroOps = 3;
1257 let ResourceCycles = [1,1,1];
1258}
1259def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1260
1261def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1262 let Latency = 9;
1263 let NumMicroOps = 3;
1264 let ResourceCycles = [1,1,1];
1265}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001266def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimd5d4cdb2018-05-09 19:04:15 +00001267def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2PSrm",
1268 "CVT(T?)PD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001269 "MMX_CVTPI2PDirm",
Simon Pilgrimd5d4cdb2018-05-09 19:04:15 +00001270 "MMX_CVT(T?)PD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001271 "(V?)CVTDQ2PDrm",
1272 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001273
1274def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1275 let Latency = 9;
1276 let NumMicroOps = 3;
1277 let ResourceCycles = [1,1,1];
1278}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001279def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1280 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001281
Gadi Haber323f2e12017-10-24 20:19:47 +00001282def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1283 let Latency = 9;
1284 let NumMicroOps = 4;
1285 let ResourceCycles = [1,1,1,1];
1286}
Craig Topper5a69a002018-03-21 06:28:42 +00001287def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1288 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001289
1290def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1291 let Latency = 9;
1292 let NumMicroOps = 5;
1293 let ResourceCycles = [1,1,3];
1294}
1295def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1296
1297def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1298 let Latency = 9;
1299 let NumMicroOps = 5;
1300 let ResourceCycles = [1,2,1,1];
1301}
Craig Topper5a69a002018-03-21 06:28:42 +00001302def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1303 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001304
Gadi Haber323f2e12017-10-24 20:19:47 +00001305def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1306 let Latency = 10;
1307 let NumMicroOps = 2;
1308 let ResourceCycles = [1,1];
1309}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001310def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001311
Gadi Haber323f2e12017-10-24 20:19:47 +00001312def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1313 let Latency = 10;
1314 let NumMicroOps = 3;
1315 let ResourceCycles = [2,1];
1316}
Simon Pilgrima3686c92018-05-10 19:08:06 +00001317def: InstRW<[BWWriteResGroup117], (instregex "FICOM(P?)(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001318
Gadi Haber323f2e12017-10-24 20:19:47 +00001319def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1320 let Latency = 10;
1321 let NumMicroOps = 4;
1322 let ResourceCycles = [1,1,1,1];
1323}
1324def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1325
1326def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001327 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001328 let NumMicroOps = 4;
1329 let ResourceCycles = [1,1,1,1];
1330}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001331def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001332
Craig Topper8104f262018-04-02 05:33:28 +00001333def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1334 let Latency = 11;
1335 let NumMicroOps = 1;
1336 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1337}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001338def : SchedAlias<WriteFDiv, BWWriteResGroup122_1>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001339
1340def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1341 let Latency = 11;
1342 let NumMicroOps = 2;
1343 let ResourceCycles = [1,1];
1344}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001345def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001346 "VPCMPGTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001347
Gadi Haber323f2e12017-10-24 20:19:47 +00001348def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1349 let Latency = 11;
1350 let NumMicroOps = 3;
1351 let ResourceCycles = [1,1,1];
1352}
1353def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1354
Gadi Haber323f2e12017-10-24 20:19:47 +00001355def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1356 let Latency = 11;
1357 let NumMicroOps = 6;
1358 let ResourceCycles = [1,1,1,1,2];
1359}
Craig Topper5a69a002018-03-21 06:28:42 +00001360def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1361 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001362
1363def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1364 let Latency = 11;
1365 let NumMicroOps = 7;
1366 let ResourceCycles = [2,2,3];
1367}
Craig Topper5a69a002018-03-21 06:28:42 +00001368def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1369 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001370
1371def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1372 let Latency = 11;
1373 let NumMicroOps = 9;
1374 let ResourceCycles = [1,4,1,3];
1375}
1376def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1377
1378def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1379 let Latency = 11;
1380 let NumMicroOps = 11;
1381 let ResourceCycles = [2,9];
1382}
Craig Topper2d451e72018-03-18 08:38:06 +00001383def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1384def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001385
Gadi Haber323f2e12017-10-24 20:19:47 +00001386def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1387 let Latency = 12;
1388 let NumMicroOps = 3;
1389 let ResourceCycles = [2,1];
1390}
Simon Pilgrimbe51b202018-05-04 12:59:24 +00001391def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001392
Craig Topper8104f262018-04-02 05:33:28 +00001393def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1394 let Latency = 14;
1395 let NumMicroOps = 1;
1396 let ResourceCycles = [1,4];
1397}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001398def : SchedAlias<WriteFDiv64, BWWriteResGroup139_1>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001399
Gadi Haber323f2e12017-10-24 20:19:47 +00001400def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1401 let Latency = 14;
1402 let NumMicroOps = 3;
1403 let ResourceCycles = [1,1,1];
1404}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001405def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001406
Gadi Haber323f2e12017-10-24 20:19:47 +00001407def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1408 let Latency = 14;
1409 let NumMicroOps = 8;
1410 let ResourceCycles = [2,2,1,3];
1411}
1412def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1413
1414def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1415 let Latency = 14;
1416 let NumMicroOps = 10;
1417 let ResourceCycles = [2,3,1,4];
1418}
1419def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1420
1421def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1422 let Latency = 14;
1423 let NumMicroOps = 12;
1424 let ResourceCycles = [2,1,4,5];
1425}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001426def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001427
1428def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1429 let Latency = 15;
1430 let NumMicroOps = 1;
1431 let ResourceCycles = [1];
1432}
Simon Pilgrima3686c92018-05-10 19:08:06 +00001433def: InstRW<[BWWriteResGroup147], (instregex "DIVR_(FPrST0|FST0r|FrST0)")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001434
Gadi Haber323f2e12017-10-24 20:19:47 +00001435def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1436 let Latency = 15;
1437 let NumMicroOps = 10;
1438 let ResourceCycles = [1,1,1,4,1,2];
1439}
Craig Topper13a16502018-03-19 00:56:09 +00001440def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001441
Craig Topper8104f262018-04-02 05:33:28 +00001442def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001443 let Latency = 16;
1444 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001445 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001446}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001447def : SchedAlias<WriteFDivLd, BWWriteResGroup150>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001448
Gadi Haber323f2e12017-10-24 20:19:47 +00001449def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1450 let Latency = 16;
1451 let NumMicroOps = 14;
1452 let ResourceCycles = [1,1,1,4,2,5];
1453}
Simon Pilgrima3686c92018-05-10 19:08:06 +00001454def: InstRW<[BWWriteResGroup153], (instrs CMPXCHG8B)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001455
1456def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1457 let Latency = 16;
1458 let NumMicroOps = 16;
1459 let ResourceCycles = [16];
1460}
Craig Topper5a69a002018-03-21 06:28:42 +00001461def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001462
Gadi Haber323f2e12017-10-24 20:19:47 +00001463def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1464 let Latency = 18;
1465 let NumMicroOps = 8;
1466 let ResourceCycles = [1,1,1,5];
1467}
Craig Topper5a69a002018-03-21 06:28:42 +00001468def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001469def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001470
1471def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1472 let Latency = 18;
1473 let NumMicroOps = 11;
1474 let ResourceCycles = [2,1,1,3,1,3];
1475}
Craig Topper13a16502018-03-19 00:56:09 +00001476def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001477
Craig Topper8104f262018-04-02 05:33:28 +00001478def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001479 let Latency = 19;
1480 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001481 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001482}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001483def : SchedAlias<WriteFDiv64Ld, BWWriteResGroup161>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001484
Gadi Haber323f2e12017-10-24 20:19:47 +00001485def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1486 let Latency = 20;
1487 let NumMicroOps = 1;
1488 let ResourceCycles = [1];
1489}
Simon Pilgrima3686c92018-05-10 19:08:06 +00001490def: InstRW<[BWWriteResGroup165], (instregex "DIV_(FPrST0|FST0r|FrST0)")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001491
Gadi Haber323f2e12017-10-24 20:19:47 +00001492def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1493 let Latency = 20;
1494 let NumMicroOps = 8;
1495 let ResourceCycles = [1,1,1,1,1,1,2];
1496}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001497def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001498
Gadi Haber323f2e12017-10-24 20:19:47 +00001499def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1500 let Latency = 21;
1501 let NumMicroOps = 2;
1502 let ResourceCycles = [1,1];
1503}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001504def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001505
Gadi Haber323f2e12017-10-24 20:19:47 +00001506def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1507 let Latency = 21;
1508 let NumMicroOps = 19;
1509 let ResourceCycles = [2,1,4,1,1,4,6];
1510}
Simon Pilgrima3686c92018-05-10 19:08:06 +00001511def: InstRW<[BWWriteResGroup171], (instrs CMPXCHG16B)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001512
1513def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1514 let Latency = 22;
1515 let NumMicroOps = 18;
1516 let ResourceCycles = [1,1,16];
1517}
1518def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1519
Gadi Haber323f2e12017-10-24 20:19:47 +00001520def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1521 let Latency = 23;
1522 let NumMicroOps = 19;
1523 let ResourceCycles = [3,1,15];
1524}
Craig Topper391c6f92017-12-10 01:24:08 +00001525def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001526
1527def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1528 let Latency = 24;
1529 let NumMicroOps = 3;
1530 let ResourceCycles = [1,1,1];
1531}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001532def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001533
Gadi Haber323f2e12017-10-24 20:19:47 +00001534def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1535 let Latency = 26;
1536 let NumMicroOps = 2;
1537 let ResourceCycles = [1,1];
1538}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001539def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001540
Gadi Haber323f2e12017-10-24 20:19:47 +00001541def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1542 let Latency = 29;
1543 let NumMicroOps = 3;
1544 let ResourceCycles = [1,1,1];
1545}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001546def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001547
Gadi Haber323f2e12017-10-24 20:19:47 +00001548def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1549 let Latency = 22;
1550 let NumMicroOps = 7;
1551 let ResourceCycles = [1,3,2,1];
1552}
Craig Topper17a31182017-12-16 18:35:29 +00001553def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001554
1555def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1556 let Latency = 23;
1557 let NumMicroOps = 9;
1558 let ResourceCycles = [1,3,4,1];
1559}
Craig Topper17a31182017-12-16 18:35:29 +00001560def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001561
1562def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1563 let Latency = 24;
1564 let NumMicroOps = 9;
1565 let ResourceCycles = [1,5,2,1];
1566}
Craig Topper17a31182017-12-16 18:35:29 +00001567def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001568
1569def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1570 let Latency = 25;
1571 let NumMicroOps = 7;
1572 let ResourceCycles = [1,3,2,1];
1573}
Craig Topper17a31182017-12-16 18:35:29 +00001574def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1575 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001576
1577def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1578 let Latency = 26;
1579 let NumMicroOps = 9;
1580 let ResourceCycles = [1,5,2,1];
1581}
Craig Topper17a31182017-12-16 18:35:29 +00001582def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001583
1584def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1585 let Latency = 26;
1586 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001587 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001588}
Craig Topper17a31182017-12-16 18:35:29 +00001589def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001590
1591def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1592 let Latency = 27;
1593 let NumMicroOps = 9;
1594 let ResourceCycles = [1,5,2,1];
1595}
Craig Topper17a31182017-12-16 18:35:29 +00001596def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001597
Gadi Haber323f2e12017-10-24 20:19:47 +00001598def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1599 let Latency = 29;
1600 let NumMicroOps = 27;
1601 let ResourceCycles = [1,5,1,1,19];
1602}
Simon Pilgrima3686c92018-05-10 19:08:06 +00001603def: InstRW<[BWWriteResGroup185], (instrs XSAVE64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001604
1605def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1606 let Latency = 30;
1607 let NumMicroOps = 28;
1608 let ResourceCycles = [1,6,1,1,19];
1609}
Simon Pilgrima3686c92018-05-10 19:08:06 +00001610def: InstRW<[BWWriteResGroup186], (instrs XSAVE)>;
1611def: InstRW<[BWWriteResGroup186], (instregex "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001612
Gadi Haber323f2e12017-10-24 20:19:47 +00001613def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1614 let Latency = 34;
1615 let NumMicroOps = 8;
1616 let ResourceCycles = [2,2,2,1,1];
1617}
Craig Topper13a16502018-03-19 00:56:09 +00001618def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001619
1620def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
1621 let Latency = 34;
1622 let NumMicroOps = 23;
1623 let ResourceCycles = [1,5,3,4,10];
1624}
Craig Topper5a69a002018-03-21 06:28:42 +00001625def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
1626 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001627
1628def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1629 let Latency = 35;
1630 let NumMicroOps = 8;
1631 let ResourceCycles = [2,2,2,1,1];
1632}
Craig Topper13a16502018-03-19 00:56:09 +00001633def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001634
1635def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1636 let Latency = 35;
1637 let NumMicroOps = 23;
1638 let ResourceCycles = [1,5,2,1,4,10];
1639}
Craig Topper5a69a002018-03-21 06:28:42 +00001640def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
1641 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001642
Gadi Haber323f2e12017-10-24 20:19:47 +00001643def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
1644 let Latency = 42;
1645 let NumMicroOps = 22;
1646 let ResourceCycles = [2,20];
1647}
Craig Topper2d451e72018-03-18 08:38:06 +00001648def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001649
1650def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
1651 let Latency = 60;
1652 let NumMicroOps = 64;
1653 let ResourceCycles = [2,2,8,1,10,2,39];
1654}
Simon Pilgrima3686c92018-05-10 19:08:06 +00001655def: InstRW<[BWWriteResGroup197], (instrs FLDENVm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001656
1657def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1658 let Latency = 63;
1659 let NumMicroOps = 88;
1660 let ResourceCycles = [4,4,31,1,2,1,45];
1661}
Craig Topper2d451e72018-03-18 08:38:06 +00001662def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001663
1664def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1665 let Latency = 63;
1666 let NumMicroOps = 90;
1667 let ResourceCycles = [4,2,33,1,2,1,47];
1668}
Craig Topper2d451e72018-03-18 08:38:06 +00001669def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001670
1671def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
1672 let Latency = 75;
1673 let NumMicroOps = 15;
1674 let ResourceCycles = [6,3,6];
1675}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00001676def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001677
1678def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
1679 let Latency = 80;
1680 let NumMicroOps = 32;
1681 let ResourceCycles = [7,7,3,3,1,11];
1682}
1683def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
1684
1685def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
1686 let Latency = 115;
1687 let NumMicroOps = 100;
1688 let ResourceCycles = [9,9,11,8,1,11,21,30];
1689}
Simon Pilgrima3686c92018-05-10 19:08:06 +00001690def: InstRW<[BWWriteResGroup202], (instrs FSTENVm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001691
1692} // SchedModel
1693