blob: 93adb100b76e48c1ca92946bde23e3ab73dc70a2 [file] [log] [blame]
Gadi Haber323f2e12017-10-24 20:19:47 +00001//=- X86SchedBroadwell.td - X86 Broadwell Scheduling ---------*- tablegen -*-=//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the machine model for Broadwell to support instruction
11// scheduling and other instruction cost heuristics.
12//
13//===----------------------------------------------------------------------===//
Clement Courbet0f1da8f2018-05-02 13:54:38 +000014
Gadi Haber323f2e12017-10-24 20:19:47 +000015def BroadwellModel : SchedMachineModel {
Simon Pilgrimf7d2a932018-04-24 13:21:41 +000016 // All x86 instructions are modeled as a single micro-op, and BW can decode 4
Gadi Haber323f2e12017-10-24 20:19:47 +000017 // instructions per cycle.
18 let IssueWidth = 4;
19 let MicroOpBufferSize = 192; // Based on the reorder buffer.
20 let LoadLatency = 5;
21 let MispredictPenalty = 16;
22
23 // Based on the LSD (loop-stream detector) queue size and benchmarking data.
24 let LoopMicroOpBufferSize = 50;
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000025
Simon Pilgrimc21deec2018-03-24 19:37:28 +000026 // This flag is set to allow the scheduler to assign a default model to
Simon Pilgrim68f9acc2017-12-12 16:12:53 +000027 // unrecognized opcodes.
28 let CompleteModel = 0;
Gadi Haber323f2e12017-10-24 20:19:47 +000029}
30
31let SchedModel = BroadwellModel in {
32
33// Broadwell can issue micro-ops to 8 different ports in one cycle.
34
35// Ports 0, 1, 5, and 6 handle all computation.
36// Port 4 gets the data half of stores. Store data can be available later than
37// the store address, but since we don't model the latency of stores, we can
38// ignore that.
39// Ports 2 and 3 are identical. They handle loads and the address half of
40// stores. Port 7 can handle address calculations.
41def BWPort0 : ProcResource<1>;
42def BWPort1 : ProcResource<1>;
43def BWPort2 : ProcResource<1>;
44def BWPort3 : ProcResource<1>;
45def BWPort4 : ProcResource<1>;
46def BWPort5 : ProcResource<1>;
47def BWPort6 : ProcResource<1>;
48def BWPort7 : ProcResource<1>;
49
50// Many micro-ops are capable of issuing on multiple ports.
51def BWPort01 : ProcResGroup<[BWPort0, BWPort1]>;
52def BWPort23 : ProcResGroup<[BWPort2, BWPort3]>;
53def BWPort237 : ProcResGroup<[BWPort2, BWPort3, BWPort7]>;
54def BWPort04 : ProcResGroup<[BWPort0, BWPort4]>;
55def BWPort05 : ProcResGroup<[BWPort0, BWPort5]>;
56def BWPort06 : ProcResGroup<[BWPort0, BWPort6]>;
57def BWPort15 : ProcResGroup<[BWPort1, BWPort5]>;
58def BWPort16 : ProcResGroup<[BWPort1, BWPort6]>;
59def BWPort56 : ProcResGroup<[BWPort5, BWPort6]>;
60def BWPort015 : ProcResGroup<[BWPort0, BWPort1, BWPort5]>;
61def BWPort056 : ProcResGroup<[BWPort0, BWPort5, BWPort6]>;
62def BWPort0156: ProcResGroup<[BWPort0, BWPort1, BWPort5, BWPort6]>;
63
64// 60 Entry Unified Scheduler
65def BWPortAny : ProcResGroup<[BWPort0, BWPort1, BWPort2, BWPort3, BWPort4,
66 BWPort5, BWPort6, BWPort7]> {
67 let BufferSize=60;
68}
69
Simon Pilgrim30c38c32018-03-19 14:46:07 +000070// Integer division issued on port 0.
Craig Topper8104f262018-04-02 05:33:28 +000071def BWDivider : ProcResource<1>;
72// FP division and sqrt on port 0.
73def BWFPDivider : ProcResource<1>;
Simon Pilgrim30c38c32018-03-19 14:46:07 +000074
Gadi Haber323f2e12017-10-24 20:19:47 +000075// Loads are 5 cycles, so ReadAfterLd registers needn't be available until 5
76// cycles after the memory operand.
77def : ReadAdvance<ReadAfterLd, 5>;
78
79// Many SchedWrites are defined in pairs with and without a folded load.
80// Instructions with folded loads are usually micro-fused, so they only appear
81// as two micro-ops when queued in the reservation station.
82// This multiclass defines the resource usage for variants with and without
83// folded loads.
84multiclass BWWriteResPair<X86FoldableSchedWrite SchedRW,
Simon Pilgrim30c38c32018-03-19 14:46:07 +000085 list<ProcResourceKind> ExePorts,
Simon Pilgrime3547af2018-03-25 10:21:19 +000086 int Lat, list<int> Res = [1], int UOps = 1,
87 int LoadLat = 5> {
Gadi Haber323f2e12017-10-24 20:19:47 +000088 // Register variant is using a single cycle on ExePort.
Simon Pilgrim30c38c32018-03-19 14:46:07 +000089 def : WriteRes<SchedRW, ExePorts> {
90 let Latency = Lat;
91 let ResourceCycles = Res;
92 let NumMicroOps = UOps;
93 }
Gadi Haber323f2e12017-10-24 20:19:47 +000094
Simon Pilgrime3547af2018-03-25 10:21:19 +000095 // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to
96 // the latency (default = 5).
Simon Pilgrim30c38c32018-03-19 14:46:07 +000097 def : WriteRes<SchedRW.Folded, !listconcat([BWPort23], ExePorts)> {
Simon Pilgrime3547af2018-03-25 10:21:19 +000098 let Latency = !add(Lat, LoadLat);
Simon Pilgrim30c38c32018-03-19 14:46:07 +000099 let ResourceCycles = !listconcat([1], Res);
Simon Pilgrime3547af2018-03-25 10:21:19 +0000100 let NumMicroOps = !add(UOps, 1);
Gadi Haber323f2e12017-10-24 20:19:47 +0000101 }
102}
103
Craig Topperf131b602018-04-06 16:16:46 +0000104// A folded store needs a cycle on port 4 for the store data, and an extra port
105// 2/3/7 cycle to recompute the address.
106def : WriteRes<WriteRMW, [BWPort237,BWPort4]>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000107
108// Arithmetic.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000109defm : BWWriteResPair<WriteALU, [BWPort0156], 1>; // Simple integer ALU op.
110defm : BWWriteResPair<WriteIMul, [BWPort1], 3>; // Integer multiplication.
111defm : BWWriteResPair<WriteIDiv, [BWPort0, BWDivider], 25, [1, 10]>;
Simon Pilgrim28e7bcb2018-03-26 21:06:14 +0000112defm : BWWriteResPair<WriteCRC32, [BWPort1], 3>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000113def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, high part.
Gadi Haber323f2e12017-10-24 20:19:47 +0000114
115def : WriteRes<WriteLEA, [BWPort15]>; // LEA instructions can't fold loads.
116
Craig Topperb7baa352018-04-08 17:53:18 +0000117defm : BWWriteResPair<WriteCMOV, [BWPort06], 1>; // Conditional move.
118def : WriteRes<WriteSETCC, [BWPort06]>; // Setcc.
119def : WriteRes<WriteSETCCStore, [BWPort06,BWPort4,BWPort237]> {
120 let Latency = 2;
121 let NumMicroOps = 3;
122}
123
Simon Pilgrimf33d9052018-03-26 18:19:28 +0000124// Bit counts.
125defm : BWWriteResPair<WriteBitScan, [BWPort1], 3>;
126defm : BWWriteResPair<WriteLZCNT, [BWPort1], 3>;
127defm : BWWriteResPair<WriteTZCNT, [BWPort1], 3>;
128defm : BWWriteResPair<WritePOPCNT, [BWPort1], 3>;
129
Gadi Haber323f2e12017-10-24 20:19:47 +0000130// Integer shifts and rotates.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000131defm : BWWriteResPair<WriteShift, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000132
Craig Topper89310f52018-03-29 20:41:39 +0000133// BMI1 BEXTR, BMI2 BZHI
134defm : BWWriteResPair<WriteBEXTR, [BWPort06,BWPort15], 2, [1,1], 2>;
135defm : BWWriteResPair<WriteBZHI, [BWPort15], 1>;
136
Gadi Haber323f2e12017-10-24 20:19:47 +0000137// Loads, stores, and moves, not folded with other operations.
138def : WriteRes<WriteLoad, [BWPort23]> { let Latency = 5; }
139def : WriteRes<WriteStore, [BWPort237, BWPort4]>;
140def : WriteRes<WriteMove, [BWPort0156]>;
141
142// Idioms that clear a register, like xorps %xmm0, %xmm0.
143// These can often bypass execution ports completely.
144def : WriteRes<WriteZero, []>;
145
Sanjoy Das1074eb22017-12-12 19:11:31 +0000146// Treat misc copies as a move.
147def : InstRW<[WriteMove], (instrs COPY)>;
148
Gadi Haber323f2e12017-10-24 20:19:47 +0000149// Branches don't produce values, so they have no latency, but they still
150// consume resources. Indirect branches can fold loads.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000151defm : BWWriteResPair<WriteJump, [BWPort06], 1>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000152
153// Floating point. This covers both scalar and vector operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000154def : WriteRes<WriteFLoad, [BWPort23]> { let Latency = 5; }
155def : WriteRes<WriteFStore, [BWPort237, BWPort4]>;
156def : WriteRes<WriteFMove, [BWPort5]>;
157
Simon Pilgrim21caf012018-05-01 18:22:53 +0000158defm : BWWriteResPair<WriteFAdd, [BWPort1], 3, [1], 1, 5>; // Floating point add/sub.
Clement Courbet0f1da8f2018-05-02 13:54:38 +0000159defm : BWWriteResPair<WriteFAddY, [BWPort1], 3, [1], 1, 6>; // Floating point add/sub (YMM/ZMM).
Simon Pilgrim21caf012018-05-01 18:22:53 +0000160defm : BWWriteResPair<WriteFCmp, [BWPort1], 3, [1], 1, 5>; // Floating point compare.
Clement Courbet0f1da8f2018-05-02 13:54:38 +0000161defm : BWWriteResPair<WriteFCmpY, [BWPort1], 3, [1], 1, 6>; // Floating point compare (YMM/ZMM).
Simon Pilgrim21caf012018-05-01 18:22:53 +0000162defm : BWWriteResPair<WriteFCom, [BWPort1], 3>; // Floating point compare to flags.
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000163defm : BWWriteResPair<WriteFMul, [BWPort01], 3, [1], 1, 5>; // Floating point multiplication.
164defm : BWWriteResPair<WriteFMulY, [BWPort01], 3, [1], 1, 6>; // Floating point multiplication (YMM/ZMM).
Simon Pilgrim21caf012018-05-01 18:22:53 +0000165defm : BWWriteResPair<WriteFDiv, [BWPort0], 12, [1], 1, 5>; // 10-14 cycles. // Floating point division.
166defm : BWWriteResPair<WriteFDivY, [BWPort0], 12, [1], 1, 7>; // 10-14 cycles. // Floating point division (YMM/ZMM).
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000167
168defm : X86WriteRes<WriteFSqrt, [BWPort0,BWFPDivider], 11, [1,4], 1>; // Floating point square root.
169defm : X86WriteRes<WriteFSqrtLd, [BWPort0,BWPort23,BWFPDivider], 16, [1,1,7], 2>;
170defm : BWWriteResPair<WriteFSqrtX, [BWPort0,BWFPDivider], 11, [1,7], 1, 5>; // Floating point square root (XMM).
171defm : BWWriteResPair<WriteFSqrtY, [BWPort0,BWPort015,BWFPDivider], 21, [2,1,14], 3, 6>; // Floating point square root (YMM).
172defm : BWWriteResPair<WriteFSqrtZ, [BWPort0,BWPort015,BWFPDivider], 21, [2,1,14], 3, 6>; // Floating point square root (ZMM).
173defm : X86WriteRes<WriteFSqrt64, [BWPort0,BWFPDivider], 16, [1,8], 1>; // Floating point double square root.
174defm : X86WriteRes<WriteFSqrt64Ld, [BWPort0,BWPort23,BWFPDivider], 21, [1,1,14], 2>;
175defm : BWWriteResPair<WriteFSqrt64X, [BWPort0,BWFPDivider], 16, [1,14],1, 5>; // Floating point double square root (XMM).
176defm : BWWriteResPair<WriteFSqrt64Y, [BWPort0,BWPort015,BWFPDivider], 29, [2,1,28], 3, 6>; // Floating point double square root (YMM).
177defm : BWWriteResPair<WriteFSqrt64Z, [BWPort0,BWPort015,BWFPDivider], 29, [2,1,28], 3, 6>; // Floating point double square root (ZMM).
178defm : BWWriteResPair<WriteFSqrt80, [BWPort0,BWFPDivider], 23, [1,9]>; // Floating point long double square root.
179
Simon Pilgrimc7088682018-05-01 18:06:07 +0000180defm : BWWriteResPair<WriteFRcp, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000181defm : BWWriteResPair<WriteFRcpX, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal estimate (XMM).
182defm : BWWriteResPair<WriteFRcpY, [BWPort0,BWPort015], 11, [2,1], 3, 6>; // Floating point reciprocal estimate (YMM/ZMM).
183
Simon Pilgrimc7088682018-05-01 18:06:07 +0000184defm : BWWriteResPair<WriteFRsqrt, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal square root estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000185defm : BWWriteResPair<WriteFRsqrtX,[BWPort0], 5, [1], 1, 5>; // Floating point reciprocal square root estimate (XMM).
186defm : BWWriteResPair<WriteFRsqrtY,[BWPort0,BWPort015], 11, [2,1], 3, 6>; // Floating point reciprocal square root estimate (YMM/ZMM).
187
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000188defm : BWWriteResPair<WriteFMA, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add.
Simon Pilgrim67cc2462018-05-04 15:20:18 +0000189defm : BWWriteResPair<WriteFMAX, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add (XMM).
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000190defm : BWWriteResPair<WriteFMAY, [BWPort01], 5, [1], 1, 6>; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000191defm : BWWriteResPair<WriteDPPD, [BWPort0,BWPort1,BWPort5], 9, [1,1,1], 3, 5>; // Floating point double dot product.
192defm : BWWriteResPair<WriteDPPS, [BWPort0,BWPort1,BWPort5], 14, [2,1,1], 4, 5>; // Floating point single dot product.
193defm : BWWriteResPair<WriteDPPSY, [BWPort0,BWPort1,BWPort5], 14, [2,1,1], 4, 6>; // Floating point single dot product (YMM).
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000194defm : BWWriteResPair<WriteFSign, [BWPort5], 1>; // Floating point fabs/fchs.
195defm : X86WriteRes<WriteFRnd, [BWPort23], 6, [1], 1>; // Floating point rounding.
196defm : X86WriteRes<WriteFRndY, [BWPort23], 6, [1], 1>; // Floating point rounding (YMM/ZMM).
197defm : X86WriteRes<WriteFRndLd, [BWPort1,BWPort23], 11, [2,1], 3>;
198defm : X86WriteRes<WriteFRndYLd, [BWPort1,BWPort23], 12, [2,1], 3>;
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000199defm : BWWriteResPair<WriteFLogic, [BWPort5], 1, [1], 1, 5>; // Floating point and/or/xor logicals.
200defm : BWWriteResPair<WriteFLogicY, [BWPort5], 1, [1], 1, 6>; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000201defm : BWWriteResPair<WriteFShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector shuffles.
202defm : BWWriteResPair<WriteFShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000203defm : BWWriteResPair<WriteFVarShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector variable shuffles.
204defm : BWWriteResPair<WriteFVarShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
205defm : BWWriteResPair<WriteFBlend, [BWPort015], 1, [1], 1, 5>; // Floating point vector blends.
206defm : BWWriteResPair<WriteFBlendY, [BWPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000207defm : BWWriteResPair<WriteFVarBlend, [BWPort5], 2, [2], 2, 5>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000208defm : BWWriteResPair<WriteFVarBlendY, [BWPort5], 2, [2], 2, 6>; // Fp vector variable blends.
Gadi Haber323f2e12017-10-24 20:19:47 +0000209
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000210def : WriteRes<WriteCvtF2FSt, [BWPort1,BWPort4,BWPort237]> {
211 let Latency = 4;
212 let NumMicroOps = 3;
213 let ResourceCycles = [1,1,1];
214}
215
Gadi Haber323f2e12017-10-24 20:19:47 +0000216// FMA Scheduling helper class.
217// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
218
219// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000220def : WriteRes<WriteVecLoad, [BWPort23]> { let Latency = 5; }
221def : WriteRes<WriteVecStore, [BWPort237, BWPort4]>;
222def : WriteRes<WriteVecMove, [BWPort015]>;
Simon Pilgrim0e51a122018-05-04 18:16:13 +0000223defm : X86WriteRes<WriteEMMS, [BWPort01,BWPort15,BWPort015,BWPort0156], 31, [8,1,21,1], 31>;
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000224
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000225defm : BWWriteResPair<WriteVecALU, [BWPort15], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
226defm : BWWriteResPair<WriteVecALUY, [BWPort15], 1, [1], 1, 6>; // Vector integer ALU op, no logicals (YMM/ZMM).
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000227defm : BWWriteResPair<WriteVecLogic, [BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
228defm : BWWriteResPair<WriteVecLogicY,[BWPort015], 1, [1], 1, 6>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000229defm : BWWriteResPair<WriteVecIMul, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000230defm : BWWriteResPair<WriteVecIMulX, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000231defm : BWWriteResPair<WriteVecIMulY, [BWPort0], 5, [1], 1, 6>; // Vector integer multiply.
232defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // Vector PMULLD.
233defm : BWWriteResPair<WritePMULLDY, [BWPort0], 10, [2], 2, 6>; // Vector PMULLD (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000234defm : BWWriteResPair<WriteShuffle, [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000235defm : BWWriteResPair<WriteShuffleY, [BWPort5], 1, [1], 1, 6>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000236defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000237defm : BWWriteResPair<WriteVarShuffleY,[BWPort5], 1, [1], 1, 6>; // Vector variable shuffles (YMM/ZMM).
238defm : BWWriteResPair<WriteBlend, [BWPort5], 1, [1], 1, 5>; // Vector blends.
239defm : BWWriteResPair<WriteBlendY, [BWPort5], 1, [1], 1, 6>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000240defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000241defm : BWWriteResPair<WriteVarBlendY, [BWPort5], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000242defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000243defm : BWWriteResPair<WriteMPSADY, [BWPort0, BWPort5], 7, [1, 2], 3, 6>; // Vector MPSAD.
244defm : BWWriteResPair<WritePSADBW, [BWPort0], 5, [1], 1, 5>; // Vector PSADBW.
245defm : BWWriteResPair<WritePSADBWY, [BWPort0], 5, [1], 1, 6>; // Vector PSADBW (YMM/ZMM).
246defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000247
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000248// Vector integer shifts.
249defm : BWWriteResPair<WriteVecShift, [BWPort0], 1, [1], 1, 5>;
250defm : BWWriteResPair<WriteVecShiftX, [BWPort0,BWPort5], 2, [1,1], 2, 5>;
251defm : X86WriteRes<WriteVecShiftY, [BWPort0,BWPort5], 4, [1,1], 2>;
252defm : X86WriteRes<WriteVecShiftYLd, [BWPort0,BWPort23], 7, [1,1], 2>;
253
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000254defm : BWWriteResPair<WriteVecShiftImm, [BWPort0], 1, [1], 1, 5>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000255defm : BWWriteResPair<WriteVecShiftImmX, [BWPort0], 1, [1], 1, 5>; // Vector integer immediate shifts (XMM).
256defm : BWWriteResPair<WriteVecShiftImmY, [BWPort0], 1, [1], 1, 6>; // Vector integer immediate shifts (YMM/ZMM).
257defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 3, [2,1], 3, 5>; // Variable vector shifts.
258defm : BWWriteResPair<WriteVarVecShiftY, [BWPort0, BWPort5], 3, [2,1], 3, 6>; // Variable vector shifts (YMM/ZMM).
259
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000260// Vector insert/extract operations.
261def : WriteRes<WriteVecInsert, [BWPort5]> {
262 let Latency = 2;
263 let NumMicroOps = 2;
264 let ResourceCycles = [2];
265}
266def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
267 let Latency = 6;
268 let NumMicroOps = 2;
269}
270
271def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
272 let Latency = 2;
273 let NumMicroOps = 2;
274}
275def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
276 let Latency = 2;
277 let NumMicroOps = 3;
278}
279
Gadi Haber323f2e12017-10-24 20:19:47 +0000280// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000281defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
282defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
283defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000284
285// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000286
Gadi Haber323f2e12017-10-24 20:19:47 +0000287// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000288def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000289 let Latency = 11;
290 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000291 let ResourceCycles = [3];
292}
293def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000294 let Latency = 16;
295 let NumMicroOps = 4;
296 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000297}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000298
299// Packed Compare Explicit Length Strings, Return Mask
300def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
301 let Latency = 19;
302 let NumMicroOps = 9;
303 let ResourceCycles = [4,3,1,1];
304}
305def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
306 let Latency = 24;
307 let NumMicroOps = 10;
308 let ResourceCycles = [4,3,1,1,1];
309}
310
311// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000312def : WriteRes<WritePCmpIStrI, [BWPort0]> {
313 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000314 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000315 let ResourceCycles = [3];
316}
317def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000318 let Latency = 16;
319 let NumMicroOps = 4;
320 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000321}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000322
323// Packed Compare Explicit Length Strings, Return Index
324def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
325 let Latency = 18;
326 let NumMicroOps = 8;
327 let ResourceCycles = [4,3,1];
328}
329def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
330 let Latency = 23;
331 let NumMicroOps = 9;
332 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000333}
334
Simon Pilgrima2f26782018-03-27 20:38:54 +0000335// MOVMSK Instructions.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000336def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
337def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
338def : WriteRes<WriteVecMOVMSKY, [BWPort0]> { let Latency = 3; }
339def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
Simon Pilgrima2f26782018-03-27 20:38:54 +0000340
Gadi Haber323f2e12017-10-24 20:19:47 +0000341// AES instructions.
342def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
343 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000344 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000345 let ResourceCycles = [1];
346}
347def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000348 let Latency = 12;
349 let NumMicroOps = 2;
350 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000351}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000352
Gadi Haber323f2e12017-10-24 20:19:47 +0000353def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
354 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000355 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000356 let ResourceCycles = [2];
357}
358def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000359 let Latency = 19;
360 let NumMicroOps = 3;
361 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000362}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000363
364def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
365 let Latency = 29;
366 let NumMicroOps = 11;
367 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000368}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000369def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
370 let Latency = 33;
371 let NumMicroOps = 11;
372 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000373}
374
375// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000376defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000377
378// Catch-all for expensive system instructions.
379def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
380
381// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000382defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
383defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
384defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
385defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
Gadi Haber323f2e12017-10-24 20:19:47 +0000386
387// Old microcoded instructions that nobody use.
388def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
389
390// Fence instructions.
391def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
392
Craig Topper05242bf2018-04-21 18:07:36 +0000393// Load/store MXCSR.
394def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
395def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
396
Gadi Haber323f2e12017-10-24 20:19:47 +0000397// Nop, not very useful expect it provides a model for nops!
398def : WriteRes<WriteNop, []>;
399
400////////////////////////////////////////////////////////////////////////////////
401// Horizontal add/sub instructions.
402////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000403
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000404defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3, 5>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000405defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000406defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3, 5>;
407defm : BWWriteResPair<WritePHAddY, [BWPort5,BWPort15], 3, [2,1], 3, 6>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000408
409// Remaining instrs.
410
411def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
412 let Latency = 1;
413 let NumMicroOps = 1;
414 let ResourceCycles = [1];
415}
Craig Topper5a69a002018-03-21 06:28:42 +0000416def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
417 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000418 "(V?)MOVPDI2DIrr",
419 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000420 "VPSLLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000421 "VPSRLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000422 "VTESTPD(Y?)rr",
423 "VTESTPS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000424
425def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
426 let Latency = 1;
427 let NumMicroOps = 1;
428 let ResourceCycles = [1];
429}
Craig Topper5a69a002018-03-21 06:28:42 +0000430def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
431 "COM_FST0r",
432 "UCOM_FPr",
433 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000434
435def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
436 let Latency = 1;
437 let NumMicroOps = 1;
438 let ResourceCycles = [1];
439}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000440def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000441 "MMX_MOVD64to64rr",
442 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000443 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000444 "(V?)MOVDI2PDIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000445
446def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
447 let Latency = 1;
448 let NumMicroOps = 1;
449 let ResourceCycles = [1];
450}
451def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
452
453def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
454 let Latency = 1;
455 let NumMicroOps = 1;
456 let ResourceCycles = [1];
457}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000458def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000459
460def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
461 let Latency = 1;
462 let NumMicroOps = 1;
463 let ResourceCycles = [1];
464}
Craig Topperfbe31322018-04-05 21:56:19 +0000465def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000466def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
467 "ADC(16|32|64)i",
468 "ADC(8|16|32|64)rr",
469 "ADCX(32|64)rr",
470 "ADOX(32|64)rr",
471 "BT(16|32|64)ri8",
472 "BT(16|32|64)rr",
473 "BTC(16|32|64)ri8",
474 "BTC(16|32|64)rr",
475 "BTR(16|32|64)ri8",
476 "BTR(16|32|64)rr",
477 "BTS(16|32|64)ri8",
478 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000479 "SBB(16|32|64)ri",
480 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000481 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000482
483def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
484 let Latency = 1;
485 let NumMicroOps = 1;
486 let ResourceCycles = [1];
487}
Craig Topper5a69a002018-03-21 06:28:42 +0000488def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
489 "BLSI(32|64)rr",
490 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000491 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000492
493def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
494 let Latency = 1;
495 let NumMicroOps = 1;
496 let ResourceCycles = [1];
497}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000498def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000499 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000500
501def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
502 let Latency = 1;
503 let NumMicroOps = 1;
504 let ResourceCycles = [1];
505}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000506def: InstRW<[BWWriteResGroup9], (instrs LAHF, SAHF)>; // TODO: This doesnt match Agner's data
507def: InstRW<[BWWriteResGroup9], (instregex "NOOP",
Craig Topper5a69a002018-03-21 06:28:42 +0000508 "SGDT64m",
509 "SIDT64m",
Craig Topper5a69a002018-03-21 06:28:42 +0000510 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000511 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000512 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000513
514def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
515 let Latency = 1;
516 let NumMicroOps = 2;
517 let ResourceCycles = [1,1];
518}
Craig Topper5a69a002018-03-21 06:28:42 +0000519def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
520 "MMX_MOVD64from64rm",
521 "MMX_MOVD64mr",
522 "MMX_MOVNTQmr",
523 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000524 "MOVNTI_64mr",
525 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000526 "ST_FP(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000527 "VEXTRACTF128mr",
528 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000529 "(V?)MOVAPD(Y?)mr",
530 "(V?)MOVAPS(Y?)mr",
531 "(V?)MOVDQA(Y?)mr",
532 "(V?)MOVDQU(Y?)mr",
533 "(V?)MOVHPDmr",
534 "(V?)MOVHPSmr",
535 "(V?)MOVLPDmr",
536 "(V?)MOVLPSmr",
537 "(V?)MOVNTDQ(V?)mr",
538 "(V?)MOVNTPD(V?)mr",
539 "(V?)MOVNTPS(V?)mr",
540 "(V?)MOVPDI2DImr",
541 "(V?)MOVPQI2QImr",
542 "(V?)MOVPQIto64mr",
543 "(V?)MOVSDmr",
544 "(V?)MOVSSmr",
545 "(V?)MOVUPD(Y?)mr",
546 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000547
Gadi Haber323f2e12017-10-24 20:19:47 +0000548def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
549 let Latency = 2;
550 let NumMicroOps = 2;
551 let ResourceCycles = [2];
552}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000553def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000554
555def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
556 let Latency = 2;
557 let NumMicroOps = 2;
558 let ResourceCycles = [2];
559}
Craig Topper5a69a002018-03-21 06:28:42 +0000560def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
561 "ROL(8|16|32|64)ri",
562 "ROR(8|16|32|64)r1",
563 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000564
565def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
566 let Latency = 2;
567 let NumMicroOps = 2;
568 let ResourceCycles = [2];
569}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000570def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
571 MFENCE,
572 WAIT,
573 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000574
575def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
576 let Latency = 2;
577 let NumMicroOps = 2;
578 let ResourceCycles = [1,1];
579}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000580def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000581 "(V?)CVTPS2PDrr",
582 "(V?)CVTSS2SDrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000583 "(V?)PTESTrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000584
585def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
586 let Latency = 2;
587 let NumMicroOps = 2;
588 let ResourceCycles = [1,1];
589}
590def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
591
592def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
593 let Latency = 2;
594 let NumMicroOps = 2;
595 let ResourceCycles = [1,1];
596}
597def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
598
599def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
600 let Latency = 2;
601 let NumMicroOps = 2;
602 let ResourceCycles = [1,1];
603}
604def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
605
606def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
607 let Latency = 2;
608 let NumMicroOps = 2;
609 let ResourceCycles = [1,1];
610}
Craig Topper498875f2018-04-04 17:54:19 +0000611def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
612
613def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
614 let Latency = 1;
615 let NumMicroOps = 1;
616 let ResourceCycles = [1];
617}
618def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000619
620def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
621 let Latency = 2;
622 let NumMicroOps = 2;
623 let ResourceCycles = [1,1];
624}
Craig Topper2d451e72018-03-18 08:38:06 +0000625def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000626def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000627def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
628 "ADC8ri",
629 "CMOV(A|BE)(16|32|64)rr",
630 "SBB8i8",
631 "SBB8ri",
632 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000633
Gadi Haber323f2e12017-10-24 20:19:47 +0000634def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
635 let Latency = 2;
636 let NumMicroOps = 3;
637 let ResourceCycles = [1,1,1];
638}
639def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
640
Gadi Haber323f2e12017-10-24 20:19:47 +0000641def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
642 let Latency = 2;
643 let NumMicroOps = 3;
644 let ResourceCycles = [1,1,1];
645}
646def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
647
648def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
649 let Latency = 2;
650 let NumMicroOps = 3;
651 let ResourceCycles = [1,1,1];
652}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000653def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
654 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000655def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000656 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000657
Gadi Haber323f2e12017-10-24 20:19:47 +0000658def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
659 let Latency = 3;
660 let NumMicroOps = 1;
661 let ResourceCycles = [1];
662}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000663def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000664 "PDEP(32|64)rr",
665 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000666 "SHLD(16|32|64)rri8",
667 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000668 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000669
670def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000671 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000672 let NumMicroOps = 2;
673 let ResourceCycles = [1,1];
674}
Clement Courbet327fac42018-03-07 08:14:02 +0000675def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000676
677def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
678 let Latency = 3;
679 let NumMicroOps = 1;
680 let ResourceCycles = [1];
681}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000682def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
683 "VPBROADCASTWrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000684 "VPMOVSXBDYrr",
685 "VPMOVSXBQYrr",
686 "VPMOVSXBWYrr",
687 "VPMOVSXDQYrr",
688 "VPMOVSXWDYrr",
689 "VPMOVSXWQYrr",
690 "VPMOVZXBDYrr",
691 "VPMOVZXBQYrr",
692 "VPMOVZXBWYrr",
693 "VPMOVZXDQYrr",
694 "VPMOVZXWDYrr",
695 "VPMOVZXWQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000696
Gadi Haber323f2e12017-10-24 20:19:47 +0000697def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000698 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000699 let NumMicroOps = 3;
700 let ResourceCycles = [3];
701}
Craig Topperb5f26592018-04-19 18:00:17 +0000702def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
703 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
704 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000705
Gadi Haber323f2e12017-10-24 20:19:47 +0000706def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
707 let Latency = 3;
708 let NumMicroOps = 3;
709 let ResourceCycles = [2,1];
710}
Craig Topper5a69a002018-03-21 06:28:42 +0000711def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
712 "MMX_PACKSSWBirr",
713 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000714
715def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
716 let Latency = 3;
717 let NumMicroOps = 3;
718 let ResourceCycles = [1,2];
719}
720def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
721
722def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
723 let Latency = 3;
724 let NumMicroOps = 3;
725 let ResourceCycles = [1,2];
726}
Craig Topper5a69a002018-03-21 06:28:42 +0000727def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
728 "RCL(8|16|32|64)ri",
729 "RCR(8|16|32|64)r1",
730 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000731
732def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
733 let Latency = 3;
734 let NumMicroOps = 3;
735 let ResourceCycles = [2,1];
736}
Craig Topper5a69a002018-03-21 06:28:42 +0000737def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
738 "ROR(8|16|32|64)rCL",
739 "SAR(8|16|32|64)rCL",
740 "SHL(8|16|32|64)rCL",
741 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000742
743def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
744 let Latency = 3;
745 let NumMicroOps = 4;
746 let ResourceCycles = [1,1,1,1];
747}
748def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
749
750def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
751 let Latency = 3;
752 let NumMicroOps = 4;
753 let ResourceCycles = [1,1,1,1];
754}
Craig Topper5a69a002018-03-21 06:28:42 +0000755def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
756 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000757
758def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
759 let Latency = 4;
760 let NumMicroOps = 2;
761 let ResourceCycles = [1,1];
762}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000763def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
764 "(V?)CVTSD2SIrr",
765 "(V?)CVTSS2SI64rr",
766 "(V?)CVTSS2SIrr",
767 "(V?)CVTTSD2SI64rr",
768 "(V?)CVTTSD2SIrr",
769 "(V?)CVTTSS2SI64rr",
770 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000771
772def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
773 let Latency = 4;
774 let NumMicroOps = 2;
775 let ResourceCycles = [1,1];
776}
Craig Topper5a69a002018-03-21 06:28:42 +0000777def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000778 "VPTESTYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000779
780def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
781 let Latency = 4;
782 let NumMicroOps = 2;
783 let ResourceCycles = [1,1];
784}
785def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
786
787def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
788 let Latency = 4;
789 let NumMicroOps = 2;
790 let ResourceCycles = [1,1];
791}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000792def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000793def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000794 "MMX_CVTPI2PDirr",
795 "MMX_CVTPS2PIirr",
796 "MMX_CVTTPD2PIirr",
797 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000798 "(V?)CVTDQ2PDrr",
799 "(V?)CVTPD2DQrr",
800 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000801 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000802 "(V?)CVTSD2SSrr",
803 "(V?)CVTSI642SDrr",
804 "(V?)CVTSI2SDrr",
805 "(V?)CVTSI2SSrr",
806 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000807
808def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
809 let Latency = 4;
810 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000811 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000812}
Craig Topper5a69a002018-03-21 06:28:42 +0000813def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000814
815def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
816 let Latency = 4;
817 let NumMicroOps = 3;
818 let ResourceCycles = [1,1,1];
819}
820def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
821
822def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
823 let Latency = 4;
824 let NumMicroOps = 3;
825 let ResourceCycles = [1,1,1];
826}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000827def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
828 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000829
830def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
831 let Latency = 4;
832 let NumMicroOps = 4;
833 let ResourceCycles = [4];
834}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000835def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000836
837def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
838 let Latency = 4;
839 let NumMicroOps = 4;
840 let ResourceCycles = [1,3];
841}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000842def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000843
844def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
845 let Latency = 5;
846 let NumMicroOps = 1;
847 let ResourceCycles = [1];
848}
Simon Pilgrima53d3302018-05-02 16:16:24 +0000849def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr",
850 "MUL_FPrST0",
851 "MUL_FST0r",
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000852 "MUL_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000853
Gadi Haber323f2e12017-10-24 20:19:47 +0000854def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
855 let Latency = 5;
856 let NumMicroOps = 1;
857 let ResourceCycles = [1];
858}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000859def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000860 "MOVSX(16|32|64)rm32",
861 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000862 "MOVZX(16|32|64)rm16",
863 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000864 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000865 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000866 "(V?)MOVSHDUPrm",
867 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000868 "VPBROADCASTDrm",
869 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000870
871def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
872 let Latency = 5;
873 let NumMicroOps = 3;
874 let ResourceCycles = [1,2];
875}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000876def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000877
878def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
879 let Latency = 5;
880 let NumMicroOps = 3;
881 let ResourceCycles = [1,1,1];
882}
883def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
884
885def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000886 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000887 let NumMicroOps = 3;
888 let ResourceCycles = [1,1,1];
889}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000890def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000891
892def BWWriteResGroup53 : SchedWriteRes<[BWPort0,BWPort4,BWPort237,BWPort15]> {
893 let Latency = 5;
894 let NumMicroOps = 4;
895 let ResourceCycles = [1,1,1,1];
896}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000897def: InstRW<[BWWriteResGroup53], (instregex "VMASKMOVPD(Y?)mr",
898 "VMASKMOVPS(Y?)mr",
899 "VPMASKMOVD(Y?)mr",
900 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000901
902def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
903 let Latency = 5;
904 let NumMicroOps = 5;
905 let ResourceCycles = [1,4];
906}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000907def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000908
909def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
910 let Latency = 5;
911 let NumMicroOps = 5;
912 let ResourceCycles = [1,4];
913}
914def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
915
916def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
917 let Latency = 5;
918 let NumMicroOps = 5;
919 let ResourceCycles = [2,3];
920}
Craig Topper5a69a002018-03-21 06:28:42 +0000921def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000922
923def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
924 let Latency = 5;
925 let NumMicroOps = 6;
926 let ResourceCycles = [1,1,4];
927}
Craig Topper5a69a002018-03-21 06:28:42 +0000928def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000929
930def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
931 let Latency = 6;
932 let NumMicroOps = 1;
933 let ResourceCycles = [1];
934}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000935def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000936 "VBROADCASTF128",
937 "VBROADCASTI128",
938 "VBROADCASTSDYrm",
939 "VBROADCASTSSYrm",
940 "VLDDQUYrm",
941 "VMOVAPDYrm",
942 "VMOVAPSYrm",
943 "VMOVDDUPYrm",
944 "VMOVDQAYrm",
945 "VMOVDQUYrm",
946 "VMOVNTDQAYrm",
947 "VMOVSHDUPYrm",
948 "VMOVSLDUPYrm",
949 "VMOVUPDYrm",
950 "VMOVUPSYrm",
951 "VPBROADCASTDYrm",
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000952 "VPBROADCASTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000953
954def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
955 let Latency = 6;
956 let NumMicroOps = 2;
957 let ResourceCycles = [1,1];
958}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000959def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000960 "(V?)CVTPS2PDrm",
961 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000962 "VPSLLVQrm",
963 "VPSRLVQrm",
964 "VTESTPDrm",
965 "VTESTPSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000966
967def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
968 let Latency = 6;
969 let NumMicroOps = 2;
970 let ResourceCycles = [1,1];
971}
Craig Topper5a69a002018-03-21 06:28:42 +0000972def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
973 "VCVTPD2DQYrr",
974 "VCVTPD2PSYrr",
975 "VCVTPS2PHYrr",
976 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000977
Gadi Haber323f2e12017-10-24 20:19:47 +0000978def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
979 let Latency = 6;
980 let NumMicroOps = 2;
981 let ResourceCycles = [1,1];
982}
Craig Topper5a69a002018-03-21 06:28:42 +0000983def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
984 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000985
986def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
987 let Latency = 6;
988 let NumMicroOps = 2;
989 let ResourceCycles = [1,1];
990}
Craig Topperdfccafe2018-04-18 06:41:25 +0000991def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +0000992def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
993 ADCX32rm, ADCX64rm,
994 ADOX32rm, ADOX64rm,
995 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000996
997def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
998 let Latency = 6;
999 let NumMicroOps = 2;
1000 let ResourceCycles = [1,1];
1001}
Craig Topper5a69a002018-03-21 06:28:42 +00001002def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
1003 "BLSI(32|64)rm",
1004 "BLSMSK(32|64)rm",
1005 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001006 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001007
1008def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
1009 let Latency = 6;
1010 let NumMicroOps = 2;
1011 let ResourceCycles = [1,1];
1012}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001013def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +00001014 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001015 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001016
1017def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1018 let Latency = 6;
1019 let NumMicroOps = 2;
1020 let ResourceCycles = [1,1];
1021}
Craig Topper2d451e72018-03-18 08:38:06 +00001022def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001023def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001024
1025def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1026 let Latency = 6;
1027 let NumMicroOps = 4;
1028 let ResourceCycles = [1,1,2];
1029}
Craig Topper5a69a002018-03-21 06:28:42 +00001030def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1031 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001032
1033def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1034 let Latency = 6;
1035 let NumMicroOps = 4;
1036 let ResourceCycles = [1,1,1,1];
1037}
1038def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1039
1040def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1041 let Latency = 6;
1042 let NumMicroOps = 4;
1043 let ResourceCycles = [1,1,1,1];
1044}
Craig Topper5a69a002018-03-21 06:28:42 +00001045def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1046 "BTR(16|32|64)mi8",
1047 "BTS(16|32|64)mi8",
1048 "SAR(8|16|32|64)m1",
1049 "SAR(8|16|32|64)mi",
1050 "SHL(8|16|32|64)m1",
1051 "SHL(8|16|32|64)mi",
1052 "SHR(8|16|32|64)m1",
1053 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001054
1055def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1056 let Latency = 6;
1057 let NumMicroOps = 4;
1058 let ResourceCycles = [1,1,1,1];
1059}
Craig Topperf0d04262018-04-06 16:16:48 +00001060def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1061 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001062
1063def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1064 let Latency = 6;
1065 let NumMicroOps = 6;
1066 let ResourceCycles = [1,5];
1067}
1068def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1069
Gadi Haber323f2e12017-10-24 20:19:47 +00001070def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1071 let Latency = 7;
1072 let NumMicroOps = 2;
1073 let ResourceCycles = [1,1];
1074}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001075def: InstRW<[BWWriteResGroup73], (instregex "VPSLLVQYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001076 "VPSRLVQYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001077 "VTESTPDYrm",
1078 "VTESTPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001079
1080def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1081 let Latency = 7;
1082 let NumMicroOps = 2;
1083 let ResourceCycles = [1,1];
1084}
Craig Topper5a69a002018-03-21 06:28:42 +00001085def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1086 "FCOM64m",
1087 "FCOMP32m",
1088 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001089
Gadi Haber323f2e12017-10-24 20:19:47 +00001090def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1091 let Latency = 7;
1092 let NumMicroOps = 2;
1093 let ResourceCycles = [1,1];
1094}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001095def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001096
Gadi Haber323f2e12017-10-24 20:19:47 +00001097def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1098 let Latency = 7;
1099 let NumMicroOps = 3;
1100 let ResourceCycles = [2,1];
1101}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001102def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001103 "MMX_PACKSSWBirm",
1104 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001105 "VMASKMOVPDrm",
1106 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001107 "VPMASKMOVDrm",
1108 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001109
1110def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1111 let Latency = 7;
1112 let NumMicroOps = 3;
1113 let ResourceCycles = [1,2];
1114}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001115def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1116 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001117
1118def BWWriteResGroup81 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1119 let Latency = 7;
1120 let NumMicroOps = 3;
1121 let ResourceCycles = [1,1,1];
1122}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001123def: InstRW<[BWWriteResGroup81], (instregex "(V?)PTESTrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001124
1125def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1126 let Latency = 7;
1127 let NumMicroOps = 3;
1128 let ResourceCycles = [1,1,1];
1129}
1130def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1131
Gadi Haber323f2e12017-10-24 20:19:47 +00001132def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1133 let Latency = 7;
1134 let NumMicroOps = 3;
1135 let ResourceCycles = [1,1,1];
1136}
Craig Topper5a69a002018-03-21 06:28:42 +00001137def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1138 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001139
Gadi Haber323f2e12017-10-24 20:19:47 +00001140def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1141 let Latency = 7;
1142 let NumMicroOps = 3;
1143 let ResourceCycles = [1,1,1];
1144}
Craig Topperf4cd9082018-01-19 05:47:32 +00001145def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001146
1147def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1148 let Latency = 7;
1149 let NumMicroOps = 5;
1150 let ResourceCycles = [1,1,1,2];
1151}
Craig Topper5a69a002018-03-21 06:28:42 +00001152def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1153 "ROL(8|16|32|64)mi",
1154 "ROR(8|16|32|64)m1",
1155 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001156
1157def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1158 let Latency = 7;
1159 let NumMicroOps = 5;
1160 let ResourceCycles = [1,1,1,2];
1161}
Craig Topper5a69a002018-03-21 06:28:42 +00001162def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001163
1164def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1165 let Latency = 7;
1166 let NumMicroOps = 5;
1167 let ResourceCycles = [1,1,1,1,1];
1168}
Craig Topper5a69a002018-03-21 06:28:42 +00001169def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1170 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001171
1172def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1173 let Latency = 7;
1174 let NumMicroOps = 7;
1175 let ResourceCycles = [2,2,1,2];
1176}
Craig Topper2d451e72018-03-18 08:38:06 +00001177def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001178
1179def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1180 let Latency = 8;
1181 let NumMicroOps = 2;
1182 let ResourceCycles = [1,1];
1183}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001184def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001185 "PDEP(32|64)rm",
1186 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001187 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001188
1189def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001190 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001191 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001192 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001193}
Craig Topperf846e2d2018-04-19 05:34:05 +00001194def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001195
Craig Topperf846e2d2018-04-19 05:34:05 +00001196def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1197 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001198 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001199 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001200}
Craig Topper5a69a002018-03-21 06:28:42 +00001201def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001202
Gadi Haber323f2e12017-10-24 20:19:47 +00001203def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1204 let Latency = 8;
1205 let NumMicroOps = 2;
1206 let ResourceCycles = [1,1];
1207}
Craig Topper5a69a002018-03-21 06:28:42 +00001208def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1209 "VPMOVSXBQYrm",
1210 "VPMOVSXBWYrm",
1211 "VPMOVSXDQYrm",
1212 "VPMOVSXWDYrm",
1213 "VPMOVSXWQYrm",
1214 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001215
Gadi Haber323f2e12017-10-24 20:19:47 +00001216def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1217 let Latency = 8;
1218 let NumMicroOps = 3;
1219 let ResourceCycles = [2,1];
1220}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001221def: InstRW<[BWWriteResGroup94], (instregex "VMASKMOVPDYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001222 "VMASKMOVPSYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001223 "VPMASKMOVDYrm",
1224 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001225
Gadi Haber323f2e12017-10-24 20:19:47 +00001226def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1227 let Latency = 8;
1228 let NumMicroOps = 5;
1229 let ResourceCycles = [1,1,1,2];
1230}
Craig Topper5a69a002018-03-21 06:28:42 +00001231def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1232 "RCL(8|16|32|64)mi",
1233 "RCR(8|16|32|64)m1",
1234 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001235
1236def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1237 let Latency = 8;
1238 let NumMicroOps = 5;
1239 let ResourceCycles = [1,1,2,1];
1240}
Craig Topper13a16502018-03-19 00:56:09 +00001241def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001242
1243def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1244 let Latency = 8;
1245 let NumMicroOps = 6;
1246 let ResourceCycles = [1,1,1,3];
1247}
Craig Topper9f834812018-04-01 21:54:24 +00001248def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001249
1250def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1251 let Latency = 8;
1252 let NumMicroOps = 6;
1253 let ResourceCycles = [1,1,1,2,1];
1254}
Craig Topper9f834812018-04-01 21:54:24 +00001255def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001256 "CMPXCHG(8|16|32|64)rm",
1257 "ROL(8|16|32|64)mCL",
1258 "SAR(8|16|32|64)mCL",
1259 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001260 "SHL(8|16|32|64)mCL",
1261 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001262def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1263 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001264
1265def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1266 let Latency = 9;
1267 let NumMicroOps = 2;
1268 let ResourceCycles = [1,1];
1269}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001270def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1271 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001272 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001273 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001274
1275def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1276 let Latency = 9;
1277 let NumMicroOps = 2;
1278 let ResourceCycles = [1,1];
1279}
Craig Topper5a69a002018-03-21 06:28:42 +00001280def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1281 "VPERM2I128rm",
1282 "VPERMDYrm",
1283 "VPERMPDYmi",
1284 "VPERMPSYrm",
1285 "VPERMQYmi",
1286 "VPMOVZXBDYrm",
1287 "VPMOVZXBQYrm",
1288 "VPMOVZXBWYrm",
1289 "VPMOVZXDQYrm",
1290 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001291
Gadi Haber323f2e12017-10-24 20:19:47 +00001292def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1293 let Latency = 9;
1294 let NumMicroOps = 3;
1295 let ResourceCycles = [1,1,1];
1296}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001297def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1298 "(V?)CVTSD2SIrm",
1299 "(V?)CVTSS2SI64rm",
1300 "(V?)CVTSS2SIrm",
1301 "(V?)CVTTSD2SI64rm",
1302 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001303 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001304 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001305
1306def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1307 let Latency = 9;
1308 let NumMicroOps = 3;
1309 let ResourceCycles = [1,1,1];
1310}
1311def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1312
1313def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1314 let Latency = 9;
1315 let NumMicroOps = 3;
1316 let ResourceCycles = [1,1,1];
1317}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001318def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001319def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001320 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001321 "CVTTPD2DQrm",
1322 "MMX_CVTPD2PIirm",
1323 "MMX_CVTPI2PDirm",
1324 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001325 "(V?)CVTDQ2PDrm",
1326 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001327
1328def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1329 let Latency = 9;
1330 let NumMicroOps = 3;
1331 let ResourceCycles = [1,1,1];
1332}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001333def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1334 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001335
Gadi Haber323f2e12017-10-24 20:19:47 +00001336def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1337 let Latency = 9;
1338 let NumMicroOps = 4;
1339 let ResourceCycles = [1,1,1,1];
1340}
Craig Topper5a69a002018-03-21 06:28:42 +00001341def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1342 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001343
1344def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1345 let Latency = 9;
1346 let NumMicroOps = 5;
1347 let ResourceCycles = [1,1,3];
1348}
1349def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1350
1351def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1352 let Latency = 9;
1353 let NumMicroOps = 5;
1354 let ResourceCycles = [1,2,1,1];
1355}
Craig Topper5a69a002018-03-21 06:28:42 +00001356def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1357 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001358
Gadi Haber323f2e12017-10-24 20:19:47 +00001359def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1360 let Latency = 10;
1361 let NumMicroOps = 2;
1362 let ResourceCycles = [1,1];
1363}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001364def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001365
Gadi Haber323f2e12017-10-24 20:19:47 +00001366def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1367 let Latency = 10;
1368 let NumMicroOps = 3;
1369 let ResourceCycles = [2,1];
1370}
Craig Topper5a69a002018-03-21 06:28:42 +00001371def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1372 "FICOM32m",
1373 "FICOMP16m",
1374 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001375
1376def BWWriteResGroup118 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1377 let Latency = 10;
1378 let NumMicroOps = 3;
1379 let ResourceCycles = [1,1,1];
1380}
1381def: InstRW<[BWWriteResGroup118], (instregex "VPTESTYrm")>;
1382
Gadi Haber323f2e12017-10-24 20:19:47 +00001383def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1384 let Latency = 10;
1385 let NumMicroOps = 4;
1386 let ResourceCycles = [1,1,1,1];
1387}
1388def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1389
1390def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001391 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001392 let NumMicroOps = 4;
1393 let ResourceCycles = [1,1,1,1];
1394}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001395def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001396
Craig Topper8104f262018-04-02 05:33:28 +00001397def BWWriteResGroup122 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001398 let Latency = 11;
1399 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001400 let ResourceCycles = [1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001401}
Craig Topper8104f262018-04-02 05:33:28 +00001402def: InstRW<[BWWriteResGroup122], (instregex "(V?)DIVPSrr")>;
1403
1404def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1405 let Latency = 11;
1406 let NumMicroOps = 1;
1407 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1408}
1409def: InstRW<[BWWriteResGroup122_1], (instregex "(V?)DIVSSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001410
1411def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1412 let Latency = 11;
1413 let NumMicroOps = 2;
1414 let ResourceCycles = [1,1];
1415}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001416def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001417 "VPCMPGTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001418
Gadi Haber323f2e12017-10-24 20:19:47 +00001419def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1420 let Latency = 11;
1421 let NumMicroOps = 3;
1422 let ResourceCycles = [1,1,1];
1423}
1424def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1425
Gadi Haber323f2e12017-10-24 20:19:47 +00001426def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1427 let Latency = 11;
1428 let NumMicroOps = 6;
1429 let ResourceCycles = [1,1,1,1,2];
1430}
Craig Topper5a69a002018-03-21 06:28:42 +00001431def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1432 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001433
1434def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1435 let Latency = 11;
1436 let NumMicroOps = 7;
1437 let ResourceCycles = [2,2,3];
1438}
Craig Topper5a69a002018-03-21 06:28:42 +00001439def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1440 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001441
1442def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1443 let Latency = 11;
1444 let NumMicroOps = 9;
1445 let ResourceCycles = [1,4,1,3];
1446}
1447def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1448
1449def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1450 let Latency = 11;
1451 let NumMicroOps = 11;
1452 let ResourceCycles = [2,9];
1453}
Craig Topper2d451e72018-03-18 08:38:06 +00001454def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1455def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001456
Gadi Haber323f2e12017-10-24 20:19:47 +00001457def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1458 let Latency = 12;
1459 let NumMicroOps = 3;
1460 let ResourceCycles = [2,1];
1461}
Simon Pilgrimbe51b202018-05-04 12:59:24 +00001462def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001463
Craig Topper8104f262018-04-02 05:33:28 +00001464def BWWriteResGroup139 : SchedWriteRes<[BWPort0,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001465 let Latency = 14;
1466 let NumMicroOps = 1;
Craig Topper8104f262018-04-02 05:33:28 +00001467 let ResourceCycles = [1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001468}
Craig Topper8104f262018-04-02 05:33:28 +00001469def: InstRW<[BWWriteResGroup139], (instregex "(V?)DIVPDrr")>;
1470
1471def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1472 let Latency = 14;
1473 let NumMicroOps = 1;
1474 let ResourceCycles = [1,4];
1475}
1476def: InstRW<[BWWriteResGroup139_1], (instregex "(V?)DIVSDrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001477
Gadi Haber323f2e12017-10-24 20:19:47 +00001478def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1479 let Latency = 14;
1480 let NumMicroOps = 3;
1481 let ResourceCycles = [1,1,1];
1482}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001483def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001484
Gadi Haber323f2e12017-10-24 20:19:47 +00001485def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1486 let Latency = 14;
1487 let NumMicroOps = 8;
1488 let ResourceCycles = [2,2,1,3];
1489}
1490def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1491
1492def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1493 let Latency = 14;
1494 let NumMicroOps = 10;
1495 let ResourceCycles = [2,3,1,4];
1496}
1497def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1498
1499def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1500 let Latency = 14;
1501 let NumMicroOps = 12;
1502 let ResourceCycles = [2,1,4,5];
1503}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001504def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001505
1506def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1507 let Latency = 15;
1508 let NumMicroOps = 1;
1509 let ResourceCycles = [1];
1510}
Craig Topper5a69a002018-03-21 06:28:42 +00001511def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1512 "DIVR_FST0r",
1513 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001514
Gadi Haber323f2e12017-10-24 20:19:47 +00001515def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1516 let Latency = 15;
1517 let NumMicroOps = 10;
1518 let ResourceCycles = [1,1,1,4,1,2];
1519}
Craig Topper13a16502018-03-19 00:56:09 +00001520def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001521
Craig Topper8104f262018-04-02 05:33:28 +00001522def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001523 let Latency = 16;
1524 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001525 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001526}
Craig Topper5a69a002018-03-21 06:28:42 +00001527def: InstRW<[BWWriteResGroup150], (instregex "(V?)DIVPSrm",
1528 "(V?)DIVSSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001529
Gadi Haber323f2e12017-10-24 20:19:47 +00001530def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1531 let Latency = 16;
1532 let NumMicroOps = 14;
1533 let ResourceCycles = [1,1,1,4,2,5];
1534}
1535def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1536
1537def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1538 let Latency = 16;
1539 let NumMicroOps = 16;
1540 let ResourceCycles = [16];
1541}
Craig Topper5a69a002018-03-21 06:28:42 +00001542def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001543
Craig Topper8104f262018-04-02 05:33:28 +00001544def BWWriteResGroup155 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001545 let Latency = 17;
1546 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001547 let ResourceCycles = [2,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001548}
1549def: InstRW<[BWWriteResGroup155], (instregex "VDIVPSYrr")>;
1550
Gadi Haber323f2e12017-10-24 20:19:47 +00001551def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1552 let Latency = 18;
1553 let NumMicroOps = 8;
1554 let ResourceCycles = [1,1,1,5];
1555}
Craig Topper5a69a002018-03-21 06:28:42 +00001556def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001557def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001558
1559def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1560 let Latency = 18;
1561 let NumMicroOps = 11;
1562 let ResourceCycles = [2,1,1,3,1,3];
1563}
Craig Topper13a16502018-03-19 00:56:09 +00001564def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001565
Craig Topper8104f262018-04-02 05:33:28 +00001566def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001567 let Latency = 19;
1568 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001569 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001570}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001571def: InstRW<[BWWriteResGroup161], (instregex "(V?)DIVPDrm",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001572 "(V?)DIVSDrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001573
Gadi Haber323f2e12017-10-24 20:19:47 +00001574def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1575 let Latency = 20;
1576 let NumMicroOps = 1;
1577 let ResourceCycles = [1];
1578}
Craig Topper5a69a002018-03-21 06:28:42 +00001579def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1580 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001581 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001582
Gadi Haber323f2e12017-10-24 20:19:47 +00001583def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1584 let Latency = 20;
1585 let NumMicroOps = 8;
1586 let ResourceCycles = [1,1,1,1,1,1,2];
1587}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001588def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001589
Gadi Haber323f2e12017-10-24 20:19:47 +00001590def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1591 let Latency = 21;
1592 let NumMicroOps = 2;
1593 let ResourceCycles = [1,1];
1594}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001595def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001596
Gadi Haber323f2e12017-10-24 20:19:47 +00001597def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1598 let Latency = 21;
1599 let NumMicroOps = 19;
1600 let ResourceCycles = [2,1,4,1,1,4,6];
1601}
1602def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1603
1604def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1605 let Latency = 22;
1606 let NumMicroOps = 18;
1607 let ResourceCycles = [1,1,16];
1608}
1609def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1610
Craig Topper8104f262018-04-02 05:33:28 +00001611def BWWriteResGroup173 : SchedWriteRes<[BWPort0,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001612 let Latency = 23;
1613 let NumMicroOps = 3;
Craig Topper8104f262018-04-02 05:33:28 +00001614 let ResourceCycles = [2,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001615}
1616def: InstRW<[BWWriteResGroup173], (instregex "VDIVPDYrr")>;
1617
Craig Topper8104f262018-04-02 05:33:28 +00001618def BWWriteResGroup174 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001619 let Latency = 23;
1620 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001621 let ResourceCycles = [2,1,1,10];
Gadi Haber323f2e12017-10-24 20:19:47 +00001622}
1623def: InstRW<[BWWriteResGroup174], (instregex "VDIVPSYrm")>;
1624
Gadi Haber323f2e12017-10-24 20:19:47 +00001625def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1626 let Latency = 23;
1627 let NumMicroOps = 19;
1628 let ResourceCycles = [3,1,15];
1629}
Craig Topper391c6f92017-12-10 01:24:08 +00001630def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001631
1632def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1633 let Latency = 24;
1634 let NumMicroOps = 3;
1635 let ResourceCycles = [1,1,1];
1636}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001637def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001638
Gadi Haber323f2e12017-10-24 20:19:47 +00001639def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1640 let Latency = 26;
1641 let NumMicroOps = 2;
1642 let ResourceCycles = [1,1];
1643}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001644def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001645
Gadi Haber323f2e12017-10-24 20:19:47 +00001646def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1647 let Latency = 29;
1648 let NumMicroOps = 3;
1649 let ResourceCycles = [1,1,1];
1650}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001651def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001652
Craig Topper8104f262018-04-02 05:33:28 +00001653def BWWriteResGroup183 : SchedWriteRes<[BWPort0,BWPort23,BWPort015,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001654 let Latency = 29;
1655 let NumMicroOps = 4;
Craig Topper8104f262018-04-02 05:33:28 +00001656 let ResourceCycles = [2,1,1,16];
Gadi Haber323f2e12017-10-24 20:19:47 +00001657}
1658def: InstRW<[BWWriteResGroup183], (instregex "VDIVPDYrm")>;
1659
1660def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1661 let Latency = 22;
1662 let NumMicroOps = 7;
1663 let ResourceCycles = [1,3,2,1];
1664}
Craig Topper17a31182017-12-16 18:35:29 +00001665def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001666
1667def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1668 let Latency = 23;
1669 let NumMicroOps = 9;
1670 let ResourceCycles = [1,3,4,1];
1671}
Craig Topper17a31182017-12-16 18:35:29 +00001672def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001673
1674def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1675 let Latency = 24;
1676 let NumMicroOps = 9;
1677 let ResourceCycles = [1,5,2,1];
1678}
Craig Topper17a31182017-12-16 18:35:29 +00001679def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001680
1681def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1682 let Latency = 25;
1683 let NumMicroOps = 7;
1684 let ResourceCycles = [1,3,2,1];
1685}
Craig Topper17a31182017-12-16 18:35:29 +00001686def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1687 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001688
1689def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1690 let Latency = 26;
1691 let NumMicroOps = 9;
1692 let ResourceCycles = [1,5,2,1];
1693}
Craig Topper17a31182017-12-16 18:35:29 +00001694def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001695
1696def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1697 let Latency = 26;
1698 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001699 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001700}
Craig Topper17a31182017-12-16 18:35:29 +00001701def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001702
1703def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1704 let Latency = 27;
1705 let NumMicroOps = 9;
1706 let ResourceCycles = [1,5,2,1];
1707}
Craig Topper17a31182017-12-16 18:35:29 +00001708def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001709
Gadi Haber323f2e12017-10-24 20:19:47 +00001710def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1711 let Latency = 29;
1712 let NumMicroOps = 27;
1713 let ResourceCycles = [1,5,1,1,19];
1714}
1715def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1716
1717def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1718 let Latency = 30;
1719 let NumMicroOps = 28;
1720 let ResourceCycles = [1,6,1,1,19];
1721}
Craig Topper2d451e72018-03-18 08:38:06 +00001722def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001723
Gadi Haber323f2e12017-10-24 20:19:47 +00001724def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1725 let Latency = 34;
1726 let NumMicroOps = 8;
1727 let ResourceCycles = [2,2,2,1,1];
1728}
Craig Topper13a16502018-03-19 00:56:09 +00001729def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001730
1731def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
1732 let Latency = 34;
1733 let NumMicroOps = 23;
1734 let ResourceCycles = [1,5,3,4,10];
1735}
Craig Topper5a69a002018-03-21 06:28:42 +00001736def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
1737 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001738
1739def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1740 let Latency = 35;
1741 let NumMicroOps = 8;
1742 let ResourceCycles = [2,2,2,1,1];
1743}
Craig Topper13a16502018-03-19 00:56:09 +00001744def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001745
1746def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1747 let Latency = 35;
1748 let NumMicroOps = 23;
1749 let ResourceCycles = [1,5,2,1,4,10];
1750}
Craig Topper5a69a002018-03-21 06:28:42 +00001751def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
1752 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001753
Gadi Haber323f2e12017-10-24 20:19:47 +00001754def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
1755 let Latency = 42;
1756 let NumMicroOps = 22;
1757 let ResourceCycles = [2,20];
1758}
Craig Topper2d451e72018-03-18 08:38:06 +00001759def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001760
1761def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
1762 let Latency = 60;
1763 let NumMicroOps = 64;
1764 let ResourceCycles = [2,2,8,1,10,2,39];
1765}
1766def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001767
1768def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1769 let Latency = 63;
1770 let NumMicroOps = 88;
1771 let ResourceCycles = [4,4,31,1,2,1,45];
1772}
Craig Topper2d451e72018-03-18 08:38:06 +00001773def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001774
1775def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1776 let Latency = 63;
1777 let NumMicroOps = 90;
1778 let ResourceCycles = [4,2,33,1,2,1,47];
1779}
Craig Topper2d451e72018-03-18 08:38:06 +00001780def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001781
1782def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
1783 let Latency = 75;
1784 let NumMicroOps = 15;
1785 let ResourceCycles = [6,3,6];
1786}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00001787def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001788
1789def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
1790 let Latency = 80;
1791 let NumMicroOps = 32;
1792 let ResourceCycles = [7,7,3,3,1,11];
1793}
1794def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
1795
1796def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
1797 let Latency = 115;
1798 let NumMicroOps = 100;
1799 let ResourceCycles = [9,9,11,8,1,11,21,30];
1800}
1801def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001802
1803} // SchedModel
1804