blob: 4c2aef0099b6009875f3f3555e50bffd29a27ef4 [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 Pilgrimac5d0a32018-05-07 16:15:46 +0000165
166//defm : BWWriteResPair<WriteFDiv, [BWPort0,BWFPDivider], 11, [1,3], 1, 5>; // Floating point division.
167defm : BWWriteResPair<WriteFDivX, [BWPort0,BWFPDivider], 11, [1,5], 1, 5>; // Floating point division (XMM).
168defm : BWWriteResPair<WriteFDivY, [BWPort0,BWPort015,BWFPDivider], 17, [2,1,10], 3, 6>; // Floating point division (YMM).
169defm : BWWriteResPair<WriteFDivZ, [BWPort0,BWPort015,BWFPDivider], 17, [2,1,10], 3, 6>; // Floating point division (ZMM).
170//defm : BWWriteResPair<WriteFDiv64, [BWPort0,BWFPDivider], 14, [1,8], 1, 5>; // Floating point division.
171defm : BWWriteResPair<WriteFDiv64X, [BWPort0,BWFPDivider], 14, [1,8], 1, 5>; // Floating point division (XMM).
172defm : BWWriteResPair<WriteFDiv64Y, [BWPort0,BWPort015,BWFPDivider], 23, [2,1,16], 3, 6>; // Floating point division (YMM).
173defm : BWWriteResPair<WriteFDiv64Z, [BWPort0,BWPort015,BWFPDivider], 23, [2,1,16], 3, 6>; // Floating point division (ZMM).
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000174
175defm : X86WriteRes<WriteFSqrt, [BWPort0,BWFPDivider], 11, [1,4], 1>; // Floating point square root.
176defm : X86WriteRes<WriteFSqrtLd, [BWPort0,BWPort23,BWFPDivider], 16, [1,1,7], 2>;
177defm : BWWriteResPair<WriteFSqrtX, [BWPort0,BWFPDivider], 11, [1,7], 1, 5>; // Floating point square root (XMM).
178defm : BWWriteResPair<WriteFSqrtY, [BWPort0,BWPort015,BWFPDivider], 21, [2,1,14], 3, 6>; // Floating point square root (YMM).
179defm : BWWriteResPair<WriteFSqrtZ, [BWPort0,BWPort015,BWFPDivider], 21, [2,1,14], 3, 6>; // Floating point square root (ZMM).
180defm : X86WriteRes<WriteFSqrt64, [BWPort0,BWFPDivider], 16, [1,8], 1>; // Floating point double square root.
181defm : X86WriteRes<WriteFSqrt64Ld, [BWPort0,BWPort23,BWFPDivider], 21, [1,1,14], 2>;
182defm : BWWriteResPair<WriteFSqrt64X, [BWPort0,BWFPDivider], 16, [1,14],1, 5>; // Floating point double square root (XMM).
183defm : BWWriteResPair<WriteFSqrt64Y, [BWPort0,BWPort015,BWFPDivider], 29, [2,1,28], 3, 6>; // Floating point double square root (YMM).
184defm : BWWriteResPair<WriteFSqrt64Z, [BWPort0,BWPort015,BWFPDivider], 29, [2,1,28], 3, 6>; // Floating point double square root (ZMM).
185defm : BWWriteResPair<WriteFSqrt80, [BWPort0,BWFPDivider], 23, [1,9]>; // Floating point long double square root.
186
Simon Pilgrimc7088682018-05-01 18:06:07 +0000187defm : BWWriteResPair<WriteFRcp, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000188defm : BWWriteResPair<WriteFRcpX, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal estimate (XMM).
189defm : BWWriteResPair<WriteFRcpY, [BWPort0,BWPort015], 11, [2,1], 3, 6>; // Floating point reciprocal estimate (YMM/ZMM).
190
Simon Pilgrimc7088682018-05-01 18:06:07 +0000191defm : BWWriteResPair<WriteFRsqrt, [BWPort0], 5, [1], 1, 5>; // Floating point reciprocal square root estimate.
Simon Pilgrimf3ae50f2018-05-07 11:50:44 +0000192defm : BWWriteResPair<WriteFRsqrtX,[BWPort0], 5, [1], 1, 5>; // Floating point reciprocal square root estimate (XMM).
193defm : BWWriteResPair<WriteFRsqrtY,[BWPort0,BWPort015], 11, [2,1], 3, 6>; // Floating point reciprocal square root estimate (YMM/ZMM).
194
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000195defm : BWWriteResPair<WriteFMA, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add.
Simon Pilgrim67cc2462018-05-04 15:20:18 +0000196defm : BWWriteResPair<WriteFMAX, [BWPort01], 5, [1], 1, 5>; // Fused Multiply Add (XMM).
Simon Pilgrimdbd1ae72018-04-25 13:07:58 +0000197defm : BWWriteResPair<WriteFMAY, [BWPort01], 5, [1], 1, 6>; // Fused Multiply Add (YMM/ZMM).
Simon Pilgrim542b20d2018-05-03 22:31:19 +0000198defm : BWWriteResPair<WriteDPPD, [BWPort0,BWPort1,BWPort5], 9, [1,1,1], 3, 5>; // Floating point double dot product.
199defm : BWWriteResPair<WriteDPPS, [BWPort0,BWPort1,BWPort5], 14, [2,1,1], 4, 5>; // Floating point single dot product.
200defm : BWWriteResPair<WriteDPPSY, [BWPort0,BWPort1,BWPort5], 14, [2,1,1], 4, 6>; // Floating point single dot product (YMM).
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000201defm : BWWriteResPair<WriteFSign, [BWPort5], 1>; // Floating point fabs/fchs.
202defm : X86WriteRes<WriteFRnd, [BWPort23], 6, [1], 1>; // Floating point rounding.
203defm : X86WriteRes<WriteFRndY, [BWPort23], 6, [1], 1>; // Floating point rounding (YMM/ZMM).
204defm : X86WriteRes<WriteFRndLd, [BWPort1,BWPort23], 11, [2,1], 3>;
205defm : X86WriteRes<WriteFRndYLd, [BWPort1,BWPort23], 12, [2,1], 3>;
Simon Pilgrimb2aa89c2018-04-27 15:50:33 +0000206defm : BWWriteResPair<WriteFLogic, [BWPort5], 1, [1], 1, 5>; // Floating point and/or/xor logicals.
207defm : BWWriteResPair<WriteFLogicY, [BWPort5], 1, [1], 1, 6>; // Floating point and/or/xor logicals (YMM/ZMM).
Simon Pilgrimdd8eae12018-05-01 14:25:01 +0000208defm : BWWriteResPair<WriteFShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector shuffles.
209defm : BWWriteResPair<WriteFShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector shuffles (YMM/ZMM).
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000210defm : BWWriteResPair<WriteFVarShuffle, [BWPort5], 1, [1], 1, 5>; // Floating point vector variable shuffles.
211defm : BWWriteResPair<WriteFVarShuffleY, [BWPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
212defm : BWWriteResPair<WriteFBlend, [BWPort015], 1, [1], 1, 5>; // Floating point vector blends.
213defm : BWWriteResPair<WriteFBlendY, [BWPort015], 1, [1], 1, 6>; // Floating point vector blends.
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000214defm : BWWriteResPair<WriteFVarBlend, [BWPort5], 2, [2], 2, 5>; // Fp vector variable blends.
Simon Pilgrim8a937e02018-04-27 18:19:48 +0000215defm : BWWriteResPair<WriteFVarBlendY, [BWPort5], 2, [2], 2, 6>; // Fp vector variable blends.
Gadi Haber323f2e12017-10-24 20:19:47 +0000216
Simon Pilgrimf0945aa2018-04-24 16:43:07 +0000217def : WriteRes<WriteCvtF2FSt, [BWPort1,BWPort4,BWPort237]> {
218 let Latency = 4;
219 let NumMicroOps = 3;
220 let ResourceCycles = [1,1,1];
221}
222
Gadi Haber323f2e12017-10-24 20:19:47 +0000223// FMA Scheduling helper class.
224// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
225
226// Vector integer operations.
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000227def : WriteRes<WriteVecLoad, [BWPort23]> { let Latency = 5; }
228def : WriteRes<WriteVecStore, [BWPort237, BWPort4]>;
229def : WriteRes<WriteVecMove, [BWPort015]>;
Simon Pilgrim0e51a122018-05-04 18:16:13 +0000230defm : X86WriteRes<WriteEMMS, [BWPort01,BWPort15,BWPort015,BWPort0156], 31, [8,1,21,1], 31>;
Simon Pilgrimfb7aa572018-03-15 14:45:30 +0000231
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000232defm : BWWriteResPair<WriteVecALU, [BWPort15], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
233defm : BWWriteResPair<WriteVecALUY, [BWPort15], 1, [1], 1, 6>; // Vector integer ALU op, no logicals (YMM/ZMM).
Simon Pilgrim57f2b182018-05-01 12:39:17 +0000234defm : BWWriteResPair<WriteVecLogic, [BWPort015], 1, [1], 1, 5>; // Vector integer and/or/xor.
235defm : BWWriteResPair<WriteVecLogicY,[BWPort015], 1, [1], 1, 6>; // Vector integer and/or/xor (YMM/ZMM).
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000236defm : BWWriteResPair<WriteVecIMul, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000237defm : BWWriteResPair<WriteVecIMulX, [BWPort0], 5, [1], 1, 5>; // Vector integer multiply.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000238defm : BWWriteResPair<WriteVecIMulY, [BWPort0], 5, [1], 1, 6>; // Vector integer multiply.
239defm : BWWriteResPair<WritePMULLD, [BWPort0], 10, [2], 2, 5>; // Vector PMULLD.
240defm : BWWriteResPair<WritePMULLDY, [BWPort0], 10, [2], 2, 6>; // Vector PMULLD (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000241defm : BWWriteResPair<WriteShuffle, [BWPort5], 1, [1], 1, 5>; // Vector shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000242defm : BWWriteResPair<WriteShuffleY, [BWPort5], 1, [1], 1, 6>; // Vector shuffles (YMM/ZMM).
Simon Pilgrim819f2182018-05-02 17:58:50 +0000243defm : BWWriteResPair<WriteVarShuffle, [BWPort5], 1, [1], 1, 5>; // Vector variable shuffles.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000244defm : BWWriteResPair<WriteVarShuffleY,[BWPort5], 1, [1], 1, 6>; // Vector variable shuffles (YMM/ZMM).
245defm : BWWriteResPair<WriteBlend, [BWPort5], 1, [1], 1, 5>; // Vector blends.
246defm : BWWriteResPair<WriteBlendY, [BWPort5], 1, [1], 1, 6>; // Vector blends (YMM/ZMM).
Simon Pilgrim96855ec2018-04-22 14:43:12 +0000247defm : BWWriteResPair<WriteVarBlend, [BWPort5], 2, [2], 2, 5>; // Vector variable blends.
Simon Pilgrim6732f6e2018-05-02 18:48:23 +0000248defm : BWWriteResPair<WriteVarBlendY, [BWPort5], 2, [2], 2, 6>; // Vector variable blends (YMM/ZMM).
Simon Pilgrima41ae2f2018-04-22 10:39:16 +0000249defm : BWWriteResPair<WriteMPSAD, [BWPort0, BWPort5], 7, [1, 2], 3, 5>; // Vector MPSAD.
Simon Pilgrim93c878c2018-05-03 10:31:20 +0000250defm : BWWriteResPair<WriteMPSADY, [BWPort0, BWPort5], 7, [1, 2], 3, 6>; // Vector MPSAD.
251defm : BWWriteResPair<WritePSADBW, [BWPort0], 5, [1], 1, 5>; // Vector PSADBW.
252defm : BWWriteResPair<WritePSADBWY, [BWPort0], 5, [1], 1, 6>; // Vector PSADBW (YMM/ZMM).
253defm : BWWriteResPair<WritePHMINPOS, [BWPort0], 5>; // Vector PHMINPOS.
Gadi Haber323f2e12017-10-24 20:19:47 +0000254
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000255// Vector integer shifts.
256defm : BWWriteResPair<WriteVecShift, [BWPort0], 1, [1], 1, 5>;
257defm : BWWriteResPair<WriteVecShiftX, [BWPort0,BWPort5], 2, [1,1], 2, 5>;
258defm : X86WriteRes<WriteVecShiftY, [BWPort0,BWPort5], 4, [1,1], 2>;
259defm : X86WriteRes<WriteVecShiftYLd, [BWPort0,BWPort23], 7, [1,1], 2>;
260
Simon Pilgrimd7ffbc52018-05-04 17:47:46 +0000261defm : BWWriteResPair<WriteVecShiftImm, [BWPort0], 1, [1], 1, 5>;
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +0000262defm : BWWriteResPair<WriteVecShiftImmX, [BWPort0], 1, [1], 1, 5>; // Vector integer immediate shifts (XMM).
263defm : BWWriteResPair<WriteVecShiftImmY, [BWPort0], 1, [1], 1, 6>; // Vector integer immediate shifts (YMM/ZMM).
264defm : BWWriteResPair<WriteVarVecShift, [BWPort0, BWPort5], 3, [2,1], 3, 5>; // Variable vector shifts.
265defm : BWWriteResPair<WriteVarVecShiftY, [BWPort0, BWPort5], 3, [2,1], 3, 6>; // Variable vector shifts (YMM/ZMM).
266
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000267// Vector insert/extract operations.
268def : WriteRes<WriteVecInsert, [BWPort5]> {
269 let Latency = 2;
270 let NumMicroOps = 2;
271 let ResourceCycles = [2];
272}
273def : WriteRes<WriteVecInsertLd, [BWPort5,BWPort23]> {
274 let Latency = 6;
275 let NumMicroOps = 2;
276}
277
278def : WriteRes<WriteVecExtract, [BWPort0,BWPort5]> {
279 let Latency = 2;
280 let NumMicroOps = 2;
281}
282def : WriteRes<WriteVecExtractSt, [BWPort4,BWPort5,BWPort237]> {
283 let Latency = 2;
284 let NumMicroOps = 3;
285}
286
Gadi Haber323f2e12017-10-24 20:19:47 +0000287// Conversion between integer and float.
Simon Pilgrim30c38c32018-03-19 14:46:07 +0000288defm : BWWriteResPair<WriteCvtF2I, [BWPort1], 3>; // Float -> Integer.
289defm : BWWriteResPair<WriteCvtI2F, [BWPort1], 4>; // Integer -> Float.
290defm : BWWriteResPair<WriteCvtF2F, [BWPort1], 3>; // Float -> Float size conversion.
Gadi Haber323f2e12017-10-24 20:19:47 +0000291
292// Strings instructions.
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000293
Gadi Haber323f2e12017-10-24 20:19:47 +0000294// Packed Compare Implicit Length Strings, Return Mask
Gadi Haber323f2e12017-10-24 20:19:47 +0000295def : WriteRes<WritePCmpIStrM, [BWPort0]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000296 let Latency = 11;
297 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000298 let ResourceCycles = [3];
299}
300def : WriteRes<WritePCmpIStrMLd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000301 let Latency = 16;
302 let NumMicroOps = 4;
303 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000304}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000305
306// Packed Compare Explicit Length Strings, Return Mask
307def : WriteRes<WritePCmpEStrM, [BWPort0, BWPort5, BWPort015, BWPort0156]> {
308 let Latency = 19;
309 let NumMicroOps = 9;
310 let ResourceCycles = [4,3,1,1];
311}
312def : WriteRes<WritePCmpEStrMLd, [BWPort0, BWPort5, BWPort23, BWPort015, BWPort0156]> {
313 let Latency = 24;
314 let NumMicroOps = 10;
315 let ResourceCycles = [4,3,1,1,1];
316}
317
318// Packed Compare Implicit Length Strings, Return Index
Gadi Haber323f2e12017-10-24 20:19:47 +0000319def : WriteRes<WritePCmpIStrI, [BWPort0]> {
320 let Latency = 11;
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000321 let NumMicroOps = 3;
Gadi Haber323f2e12017-10-24 20:19:47 +0000322 let ResourceCycles = [3];
323}
324def : WriteRes<WritePCmpIStrILd, [BWPort0, BWPort23]> {
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000325 let Latency = 16;
326 let NumMicroOps = 4;
327 let ResourceCycles = [3,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000328}
Simon Pilgrim53b2c332018-03-22 14:56:18 +0000329
330// Packed Compare Explicit Length Strings, Return Index
331def : WriteRes<WritePCmpEStrI, [BWPort0, BWPort5, BWPort0156]> {
332 let Latency = 18;
333 let NumMicroOps = 8;
334 let ResourceCycles = [4,3,1];
335}
336def : WriteRes<WritePCmpEStrILd, [BWPort0, BWPort5, BWPort23, BWPort0156]> {
337 let Latency = 23;
338 let NumMicroOps = 9;
339 let ResourceCycles = [4,3,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000340}
341
Simon Pilgrima2f26782018-03-27 20:38:54 +0000342// MOVMSK Instructions.
Simon Pilgrimbf4c8c02018-05-04 14:54:33 +0000343def : WriteRes<WriteFMOVMSK, [BWPort0]> { let Latency = 3; }
344def : WriteRes<WriteVecMOVMSK, [BWPort0]> { let Latency = 3; }
345def : WriteRes<WriteVecMOVMSKY, [BWPort0]> { let Latency = 3; }
346def : WriteRes<WriteMMXMOVMSK, [BWPort0]> { let Latency = 1; }
Simon Pilgrima2f26782018-03-27 20:38:54 +0000347
Gadi Haber323f2e12017-10-24 20:19:47 +0000348// AES instructions.
349def : WriteRes<WriteAESDecEnc, [BWPort5]> { // Decryption, encryption.
350 let Latency = 7;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000351 let NumMicroOps = 1;
Gadi Haber323f2e12017-10-24 20:19:47 +0000352 let ResourceCycles = [1];
353}
354def : WriteRes<WriteAESDecEncLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000355 let Latency = 12;
356 let NumMicroOps = 2;
357 let ResourceCycles = [1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000358}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000359
Gadi Haber323f2e12017-10-24 20:19:47 +0000360def : WriteRes<WriteAESIMC, [BWPort5]> { // InvMixColumn.
361 let Latency = 14;
Simon Pilgrim7684e052018-03-22 13:18:08 +0000362 let NumMicroOps = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000363 let ResourceCycles = [2];
364}
365def : WriteRes<WriteAESIMCLd, [BWPort5, BWPort23]> {
Simon Pilgrim7684e052018-03-22 13:18:08 +0000366 let Latency = 19;
367 let NumMicroOps = 3;
368 let ResourceCycles = [2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000369}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000370
371def : WriteRes<WriteAESKeyGen, [BWPort0, BWPort5, BWPort015]> { // Key Generation.
372 let Latency = 29;
373 let NumMicroOps = 11;
374 let ResourceCycles = [2,7,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000375}
Simon Pilgrim7684e052018-03-22 13:18:08 +0000376def : WriteRes<WriteAESKeyGenLd, [BWPort0, BWPort5, BWPort23, BWPort015]> {
377 let Latency = 33;
378 let NumMicroOps = 11;
379 let ResourceCycles = [2,7,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +0000380}
381
382// Carry-less multiplication instructions.
Simon Pilgrim3b2ff1f2018-03-22 13:37:30 +0000383defm : BWWriteResPair<WriteCLMul, [BWPort0], 5>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000384
385// Catch-all for expensive system instructions.
386def : WriteRes<WriteSystem, [BWPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
387
388// AVX2.
Simon Pilgrim819f2182018-05-02 17:58:50 +0000389defm : BWWriteResPair<WriteFShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
390defm : BWWriteResPair<WriteFVarShuffle256, [BWPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
391defm : BWWriteResPair<WriteShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
392defm : BWWriteResPair<WriteVarShuffle256, [BWPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
Gadi Haber323f2e12017-10-24 20:19:47 +0000393
394// Old microcoded instructions that nobody use.
395def : WriteRes<WriteMicrocoded, [BWPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
396
397// Fence instructions.
398def : WriteRes<WriteFence, [BWPort23, BWPort4]>;
399
Craig Topper05242bf2018-04-21 18:07:36 +0000400// Load/store MXCSR.
401def : WriteRes<WriteLDMXCSR, [BWPort0,BWPort23,BWPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
402def : WriteRes<WriteSTMXCSR, [BWPort4,BWPort5,BWPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
403
Gadi Haber323f2e12017-10-24 20:19:47 +0000404// Nop, not very useful expect it provides a model for nops!
405def : WriteRes<WriteNop, []>;
406
407////////////////////////////////////////////////////////////////////////////////
408// Horizontal add/sub instructions.
409////////////////////////////////////////////////////////////////////////////////
Gadi Haber323f2e12017-10-24 20:19:47 +0000410
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000411defm : BWWriteResPair<WriteFHAdd, [BWPort1,BWPort5], 5, [1,2], 3, 5>;
Simon Pilgrimc3c767b2018-04-27 16:11:57 +0000412defm : BWWriteResPair<WriteFHAddY, [BWPort1,BWPort5], 5, [1,2], 3, 6>;
Simon Pilgrimf7dd6062018-05-03 13:27:10 +0000413defm : BWWriteResPair<WritePHAdd, [BWPort5,BWPort15], 3, [2,1], 3, 5>;
414defm : BWWriteResPair<WritePHAddY, [BWPort5,BWPort15], 3, [2,1], 3, 6>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000415
416// Remaining instrs.
417
418def BWWriteResGroup1 : SchedWriteRes<[BWPort0]> {
419 let Latency = 1;
420 let NumMicroOps = 1;
421 let ResourceCycles = [1];
422}
Craig Topper5a69a002018-03-21 06:28:42 +0000423def: InstRW<[BWWriteResGroup1], (instregex "MMX_MOVD64from64rr",
424 "MMX_MOVD64grr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000425 "(V?)MOVPDI2DIrr",
426 "(V?)MOVPQIto64rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000427 "VPSLLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000428 "VPSRLVQ(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000429 "VTESTPD(Y?)rr",
430 "VTESTPS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000431
432def BWWriteResGroup2 : SchedWriteRes<[BWPort1]> {
433 let Latency = 1;
434 let NumMicroOps = 1;
435 let ResourceCycles = [1];
436}
Craig Topper5a69a002018-03-21 06:28:42 +0000437def: InstRW<[BWWriteResGroup2], (instregex "COMP_FST0r",
438 "COM_FST0r",
439 "UCOM_FPr",
440 "UCOM_Fr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000441
442def BWWriteResGroup3 : SchedWriteRes<[BWPort5]> {
443 let Latency = 1;
444 let NumMicroOps = 1;
445 let ResourceCycles = [1];
446}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000447def: InstRW<[BWWriteResGroup3], (instregex "MMX_MOVD64rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000448 "MMX_MOVD64to64rr",
449 "MMX_MOVQ2DQrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000450 "(V?)MOV64toPQIrr",
Simon Pilgrimfc0c26f2018-05-01 11:05:42 +0000451 "(V?)MOVDI2PDIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000452
453def BWWriteResGroup4 : SchedWriteRes<[BWPort6]> {
454 let Latency = 1;
455 let NumMicroOps = 1;
456 let ResourceCycles = [1];
457}
458def: InstRW<[BWWriteResGroup4], (instregex "JMP(16|32|64)r")>;
459
460def BWWriteResGroup5 : SchedWriteRes<[BWPort01]> {
461 let Latency = 1;
462 let NumMicroOps = 1;
463 let ResourceCycles = [1];
464}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000465def: InstRW<[BWWriteResGroup5], (instrs FINCSTP, FNOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000466
467def BWWriteResGroup6 : SchedWriteRes<[BWPort06]> {
468 let Latency = 1;
469 let NumMicroOps = 1;
470 let ResourceCycles = [1];
471}
Craig Topperfbe31322018-04-05 21:56:19 +0000472def: InstRW<[BWWriteResGroup6], (instrs CDQ, CQO)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000473def: InstRW<[BWWriteResGroup6], (instregex "ADC(16|32|64)ri",
474 "ADC(16|32|64)i",
475 "ADC(8|16|32|64)rr",
476 "ADCX(32|64)rr",
477 "ADOX(32|64)rr",
478 "BT(16|32|64)ri8",
479 "BT(16|32|64)rr",
480 "BTC(16|32|64)ri8",
481 "BTC(16|32|64)rr",
482 "BTR(16|32|64)ri8",
483 "BTR(16|32|64)rr",
484 "BTS(16|32|64)ri8",
485 "BTS(16|32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000486 "SBB(16|32|64)ri",
487 "SBB(16|32|64)i",
Craig Topperdfccafe2018-04-18 06:41:25 +0000488 "SBB(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000489
490def BWWriteResGroup7 : SchedWriteRes<[BWPort15]> {
491 let Latency = 1;
492 let NumMicroOps = 1;
493 let ResourceCycles = [1];
494}
Craig Topper5a69a002018-03-21 06:28:42 +0000495def: InstRW<[BWWriteResGroup7], (instregex "ANDN(32|64)rr",
496 "BLSI(32|64)rr",
497 "BLSMSK(32|64)rr",
Simon Pilgrimed09ebb2018-04-23 21:04:23 +0000498 "BLSR(32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000499
500def BWWriteResGroup8 : SchedWriteRes<[BWPort015]> {
501 let Latency = 1;
502 let NumMicroOps = 1;
503 let ResourceCycles = [1];
504}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000505def: InstRW<[BWWriteResGroup8], (instregex "MMX_MOVQ64rr",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +0000506 "VPBLENDD(Y?)rri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000507
508def BWWriteResGroup9 : SchedWriteRes<[BWPort0156]> {
509 let Latency = 1;
510 let NumMicroOps = 1;
511 let ResourceCycles = [1];
512}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000513def: InstRW<[BWWriteResGroup9], (instrs LAHF, SAHF)>; // TODO: This doesnt match Agner's data
514def: InstRW<[BWWriteResGroup9], (instregex "NOOP",
Craig Topper5a69a002018-03-21 06:28:42 +0000515 "SGDT64m",
516 "SIDT64m",
Craig Topper5a69a002018-03-21 06:28:42 +0000517 "SMSW16m",
Craig Topper5a69a002018-03-21 06:28:42 +0000518 "STRm",
Craig Topperb5f26592018-04-19 18:00:17 +0000519 "SYSCALL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000520
521def BWWriteResGroup10 : SchedWriteRes<[BWPort4,BWPort237]> {
522 let Latency = 1;
523 let NumMicroOps = 2;
524 let ResourceCycles = [1,1];
525}
Craig Topper5a69a002018-03-21 06:28:42 +0000526def: InstRW<[BWWriteResGroup10], (instregex "FBSTPm",
527 "MMX_MOVD64from64rm",
528 "MMX_MOVD64mr",
529 "MMX_MOVNTQmr",
530 "MMX_MOVQ64mr",
Craig Topper5a69a002018-03-21 06:28:42 +0000531 "MOVNTI_64mr",
532 "MOVNTImr",
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000533 "ST_FP(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000534 "VEXTRACTF128mr",
535 "VEXTRACTI128mr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000536 "(V?)MOVAPD(Y?)mr",
537 "(V?)MOVAPS(Y?)mr",
538 "(V?)MOVDQA(Y?)mr",
539 "(V?)MOVDQU(Y?)mr",
540 "(V?)MOVHPDmr",
541 "(V?)MOVHPSmr",
542 "(V?)MOVLPDmr",
543 "(V?)MOVLPSmr",
544 "(V?)MOVNTDQ(V?)mr",
545 "(V?)MOVNTPD(V?)mr",
546 "(V?)MOVNTPS(V?)mr",
547 "(V?)MOVPDI2DImr",
548 "(V?)MOVPQI2QImr",
549 "(V?)MOVPQIto64mr",
550 "(V?)MOVSDmr",
551 "(V?)MOVSSmr",
552 "(V?)MOVUPD(Y?)mr",
553 "(V?)MOVUPS(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000554
Gadi Haber323f2e12017-10-24 20:19:47 +0000555def BWWriteResGroup12 : SchedWriteRes<[BWPort01]> {
556 let Latency = 2;
557 let NumMicroOps = 2;
558 let ResourceCycles = [2];
559}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000560def: InstRW<[BWWriteResGroup12], (instrs FDECSTP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000561
562def BWWriteResGroup13 : SchedWriteRes<[BWPort06]> {
563 let Latency = 2;
564 let NumMicroOps = 2;
565 let ResourceCycles = [2];
566}
Craig Topper5a69a002018-03-21 06:28:42 +0000567def: InstRW<[BWWriteResGroup13], (instregex "ROL(8|16|32|64)r1",
568 "ROL(8|16|32|64)ri",
569 "ROR(8|16|32|64)r1",
570 "ROR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000571
572def BWWriteResGroup14 : SchedWriteRes<[BWPort0156]> {
573 let Latency = 2;
574 let NumMicroOps = 2;
575 let ResourceCycles = [2];
576}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000577def: InstRW<[BWWriteResGroup14], (instrs LFENCE,
578 MFENCE,
579 WAIT,
580 XGETBV)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000581
582def BWWriteResGroup15 : SchedWriteRes<[BWPort0,BWPort5]> {
583 let Latency = 2;
584 let NumMicroOps = 2;
585 let ResourceCycles = [1,1];
586}
Simon Pilgrimf7d2a932018-04-24 13:21:41 +0000587def: InstRW<[BWWriteResGroup15], (instregex "VCVTPH2PS(Y?)rr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000588 "(V?)CVTPS2PDrr",
589 "(V?)CVTSS2SDrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000590 "(V?)PTESTrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000591
592def BWWriteResGroup16 : SchedWriteRes<[BWPort6,BWPort0156]> {
593 let Latency = 2;
594 let NumMicroOps = 2;
595 let ResourceCycles = [1,1];
596}
597def: InstRW<[BWWriteResGroup16], (instregex "CLFLUSH")>;
598
599def BWWriteResGroup17 : SchedWriteRes<[BWPort01,BWPort015]> {
600 let Latency = 2;
601 let NumMicroOps = 2;
602 let ResourceCycles = [1,1];
603}
604def: InstRW<[BWWriteResGroup17], (instregex "MMX_MOVDQ2Qrr")>;
605
606def BWWriteResGroup18 : SchedWriteRes<[BWPort237,BWPort0156]> {
607 let Latency = 2;
608 let NumMicroOps = 2;
609 let ResourceCycles = [1,1];
610}
611def: InstRW<[BWWriteResGroup18], (instregex "SFENCE")>;
612
613def BWWriteResGroup19 : SchedWriteRes<[BWPort06,BWPort15]> {
614 let Latency = 2;
615 let NumMicroOps = 2;
616 let ResourceCycles = [1,1];
617}
Craig Topper498875f2018-04-04 17:54:19 +0000618def: InstRW<[BWWriteResGroup19], (instrs BSWAP64r)>;
619
620def BWWriteResGroup19_1 : SchedWriteRes<[BWPort15]> {
621 let Latency = 1;
622 let NumMicroOps = 1;
623 let ResourceCycles = [1];
624}
625def: InstRW<[BWWriteResGroup19_1], (instrs BSWAP32r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000626
627def BWWriteResGroup20 : SchedWriteRes<[BWPort06,BWPort0156]> {
628 let Latency = 2;
629 let NumMicroOps = 2;
630 let ResourceCycles = [1,1];
631}
Craig Topper2d451e72018-03-18 08:38:06 +0000632def: InstRW<[BWWriteResGroup20], (instrs CWD)>;
Craig Topperb4c78732018-03-19 19:00:32 +0000633def: InstRW<[BWWriteResGroup20], (instrs JCXZ, JECXZ, JRCXZ)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000634def: InstRW<[BWWriteResGroup20], (instregex "ADC8i8",
635 "ADC8ri",
636 "CMOV(A|BE)(16|32|64)rr",
637 "SBB8i8",
638 "SBB8ri",
639 "SET(A|BE)r")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000640
Gadi Haber323f2e12017-10-24 20:19:47 +0000641def BWWriteResGroup22 : SchedWriteRes<[BWPort4,BWPort6,BWPort237]> {
642 let Latency = 2;
643 let NumMicroOps = 3;
644 let ResourceCycles = [1,1,1];
645}
646def: InstRW<[BWWriteResGroup22], (instregex "FNSTCW16m")>;
647
Gadi Haber323f2e12017-10-24 20:19:47 +0000648def BWWriteResGroup24 : SchedWriteRes<[BWPort4,BWPort237,BWPort15]> {
649 let Latency = 2;
650 let NumMicroOps = 3;
651 let ResourceCycles = [1,1,1];
652}
653def: InstRW<[BWWriteResGroup24], (instregex "MOVBE(16|32|64)mr")>;
654
655def BWWriteResGroup25 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
656 let Latency = 2;
657 let NumMicroOps = 3;
658 let ResourceCycles = [1,1,1];
659}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000660def: InstRW<[BWWriteResGroup25], (instrs PUSH16r, PUSH32r, PUSH64r,
661 STOSB, STOSL, STOSQ, STOSW)>;
Craig Topper5a69a002018-03-21 06:28:42 +0000662def: InstRW<[BWWriteResGroup25], (instregex "PUSH(16|32|64)rmr",
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000663 "PUSH64i8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000664
Gadi Haber323f2e12017-10-24 20:19:47 +0000665def BWWriteResGroup27 : SchedWriteRes<[BWPort1]> {
666 let Latency = 3;
667 let NumMicroOps = 1;
668 let ResourceCycles = [1];
669}
Simon Pilgrimc0f654f2018-04-21 11:25:02 +0000670def: InstRW<[BWWriteResGroup27], (instregex "MMX_CVTPI2PSirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000671 "PDEP(32|64)rr",
672 "PEXT(32|64)rr",
Craig Topper5a69a002018-03-21 06:28:42 +0000673 "SHLD(16|32|64)rri8",
674 "SHRD(16|32|64)rri8",
Simon Pilgrim920802c2018-04-21 21:16:44 +0000675 "(V?)CVTDQ2PS(Y?)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000676
677def BWWriteResGroup27_16 : SchedWriteRes<[BWPort1, BWPort0156]> {
Craig Topperf846e2d2018-04-19 05:34:05 +0000678 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000679 let NumMicroOps = 2;
680 let ResourceCycles = [1,1];
681}
Clement Courbet327fac42018-03-07 08:14:02 +0000682def: InstRW<[BWWriteResGroup27_16], (instrs IMUL16rri, IMUL16rri8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000683
684def BWWriteResGroup28 : SchedWriteRes<[BWPort5]> {
685 let Latency = 3;
686 let NumMicroOps = 1;
687 let ResourceCycles = [1];
688}
Simon Pilgrim825ead92018-04-21 20:45:12 +0000689def: InstRW<[BWWriteResGroup28], (instregex "VPBROADCASTBrr",
Simon Pilgrime480ed02018-05-07 18:25:19 +0000690 "VPBROADCASTWrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000691
Gadi Haber323f2e12017-10-24 20:19:47 +0000692def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000693 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000694 let NumMicroOps = 3;
695 let ResourceCycles = [3];
696}
Craig Topperb5f26592018-04-19 18:00:17 +0000697def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
698 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
699 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000700
Gadi Haber323f2e12017-10-24 20:19:47 +0000701def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
702 let Latency = 3;
703 let NumMicroOps = 3;
704 let ResourceCycles = [2,1];
705}
Craig Topper5a69a002018-03-21 06:28:42 +0000706def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
707 "MMX_PACKSSWBirr",
708 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000709
710def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
711 let Latency = 3;
712 let NumMicroOps = 3;
713 let ResourceCycles = [1,2];
714}
715def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
716
717def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
718 let Latency = 3;
719 let NumMicroOps = 3;
720 let ResourceCycles = [1,2];
721}
Craig Topper5a69a002018-03-21 06:28:42 +0000722def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
723 "RCL(8|16|32|64)ri",
724 "RCR(8|16|32|64)r1",
725 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000726
727def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
728 let Latency = 3;
729 let NumMicroOps = 3;
730 let ResourceCycles = [2,1];
731}
Craig Topper5a69a002018-03-21 06:28:42 +0000732def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
733 "ROR(8|16|32|64)rCL",
734 "SAR(8|16|32|64)rCL",
735 "SHL(8|16|32|64)rCL",
736 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000737
738def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
739 let Latency = 3;
740 let NumMicroOps = 4;
741 let ResourceCycles = [1,1,1,1];
742}
743def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
744
745def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
746 let Latency = 3;
747 let NumMicroOps = 4;
748 let ResourceCycles = [1,1,1,1];
749}
Craig Topper5a69a002018-03-21 06:28:42 +0000750def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
751 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000752
753def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
754 let Latency = 4;
755 let NumMicroOps = 2;
756 let ResourceCycles = [1,1];
757}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000758def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
759 "(V?)CVTSD2SIrr",
760 "(V?)CVTSS2SI64rr",
761 "(V?)CVTSS2SIrr",
762 "(V?)CVTTSD2SI64rr",
763 "(V?)CVTTSD2SIrr",
764 "(V?)CVTTSS2SI64rr",
765 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000766
767def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
768 let Latency = 4;
769 let NumMicroOps = 2;
770 let ResourceCycles = [1,1];
771}
Craig Topper5a69a002018-03-21 06:28:42 +0000772def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000773 "VPTESTYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000774
775def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
776 let Latency = 4;
777 let NumMicroOps = 2;
778 let ResourceCycles = [1,1];
779}
780def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
781
782def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
783 let Latency = 4;
784 let NumMicroOps = 2;
785 let ResourceCycles = [1,1];
786}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000787def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000788def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000789 "MMX_CVTPI2PDirr",
790 "MMX_CVTPS2PIirr",
791 "MMX_CVTTPD2PIirr",
792 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000793 "(V?)CVTDQ2PDrr",
794 "(V?)CVTPD2DQrr",
795 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000796 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000797 "(V?)CVTSD2SSrr",
798 "(V?)CVTSI642SDrr",
799 "(V?)CVTSI2SDrr",
800 "(V?)CVTSI2SSrr",
801 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000802
803def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
804 let Latency = 4;
805 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000806 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000807}
Craig Topper5a69a002018-03-21 06:28:42 +0000808def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000809
810def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
811 let Latency = 4;
812 let NumMicroOps = 3;
813 let ResourceCycles = [1,1,1];
814}
815def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
816
817def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
818 let Latency = 4;
819 let NumMicroOps = 3;
820 let ResourceCycles = [1,1,1];
821}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000822def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
823 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000824
825def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
826 let Latency = 4;
827 let NumMicroOps = 4;
828 let ResourceCycles = [4];
829}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000830def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000831
832def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
833 let Latency = 4;
834 let NumMicroOps = 4;
835 let ResourceCycles = [1,3];
836}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000837def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000838
839def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
840 let Latency = 5;
841 let NumMicroOps = 1;
842 let ResourceCycles = [1];
843}
Simon Pilgrima53d3302018-05-02 16:16:24 +0000844def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr",
845 "MUL_FPrST0",
846 "MUL_FST0r",
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000847 "MUL_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000848
Gadi Haber323f2e12017-10-24 20:19:47 +0000849def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
850 let Latency = 5;
851 let NumMicroOps = 1;
852 let ResourceCycles = [1];
853}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000854def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000855 "MOVSX(16|32|64)rm32",
856 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000857 "MOVZX(16|32|64)rm16",
858 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000859 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000860 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000861 "(V?)MOVSHDUPrm",
862 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000863 "VPBROADCASTDrm",
864 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000865
866def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
867 let Latency = 5;
868 let NumMicroOps = 3;
869 let ResourceCycles = [1,2];
870}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000871def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000872
873def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
874 let Latency = 5;
875 let NumMicroOps = 3;
876 let ResourceCycles = [1,1,1];
877}
878def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
879
880def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000881 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000882 let NumMicroOps = 3;
883 let ResourceCycles = [1,1,1];
884}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000885def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000886
887def BWWriteResGroup53 : SchedWriteRes<[BWPort0,BWPort4,BWPort237,BWPort15]> {
888 let Latency = 5;
889 let NumMicroOps = 4;
890 let ResourceCycles = [1,1,1,1];
891}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000892def: InstRW<[BWWriteResGroup53], (instregex "VMASKMOVPD(Y?)mr",
893 "VMASKMOVPS(Y?)mr",
894 "VPMASKMOVD(Y?)mr",
895 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000896
897def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
898 let Latency = 5;
899 let NumMicroOps = 5;
900 let ResourceCycles = [1,4];
901}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000902def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000903
904def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
905 let Latency = 5;
906 let NumMicroOps = 5;
907 let ResourceCycles = [1,4];
908}
909def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
910
911def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
912 let Latency = 5;
913 let NumMicroOps = 5;
914 let ResourceCycles = [2,3];
915}
Craig Topper5a69a002018-03-21 06:28:42 +0000916def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000917
918def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
919 let Latency = 5;
920 let NumMicroOps = 6;
921 let ResourceCycles = [1,1,4];
922}
Craig Topper5a69a002018-03-21 06:28:42 +0000923def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000924
925def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
926 let Latency = 6;
927 let NumMicroOps = 1;
928 let ResourceCycles = [1];
929}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000930def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000931 "VBROADCASTF128",
932 "VBROADCASTI128",
933 "VBROADCASTSDYrm",
934 "VBROADCASTSSYrm",
935 "VLDDQUYrm",
936 "VMOVAPDYrm",
937 "VMOVAPSYrm",
938 "VMOVDDUPYrm",
939 "VMOVDQAYrm",
940 "VMOVDQUYrm",
941 "VMOVNTDQAYrm",
942 "VMOVSHDUPYrm",
943 "VMOVSLDUPYrm",
944 "VMOVUPDYrm",
945 "VMOVUPSYrm",
946 "VPBROADCASTDYrm",
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000947 "VPBROADCASTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000948
949def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
950 let Latency = 6;
951 let NumMicroOps = 2;
952 let ResourceCycles = [1,1];
953}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000954def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000955 "(V?)CVTPS2PDrm",
956 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000957 "VPSLLVQrm",
958 "VPSRLVQrm",
959 "VTESTPDrm",
960 "VTESTPSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000961
962def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
963 let Latency = 6;
964 let NumMicroOps = 2;
965 let ResourceCycles = [1,1];
966}
Craig Topper5a69a002018-03-21 06:28:42 +0000967def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
968 "VCVTPD2DQYrr",
969 "VCVTPD2PSYrr",
970 "VCVTPS2PHYrr",
971 "VCVTTPD2DQYrr")>;
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}
1063def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1064
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",
Craig Topper5a69a002018-03-21 06:28:42 +00001071 "VPSRLVQYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001072 "VTESTPDYrm",
1073 "VTESTPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001074
1075def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1076 let Latency = 7;
1077 let NumMicroOps = 2;
1078 let ResourceCycles = [1,1];
1079}
Craig Topper5a69a002018-03-21 06:28:42 +00001080def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1081 "FCOM64m",
1082 "FCOMP32m",
1083 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001084
Gadi Haber323f2e12017-10-24 20:19:47 +00001085def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1086 let Latency = 7;
1087 let NumMicroOps = 2;
1088 let ResourceCycles = [1,1];
1089}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001090def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001091
Gadi Haber323f2e12017-10-24 20:19:47 +00001092def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1093 let Latency = 7;
1094 let NumMicroOps = 3;
1095 let ResourceCycles = [2,1];
1096}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001097def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001098 "MMX_PACKSSWBirm",
1099 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001100 "VMASKMOVPDrm",
1101 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001102 "VPMASKMOVDrm",
1103 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001104
1105def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1106 let Latency = 7;
1107 let NumMicroOps = 3;
1108 let ResourceCycles = [1,2];
1109}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001110def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1111 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001112
1113def BWWriteResGroup81 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1114 let Latency = 7;
1115 let NumMicroOps = 3;
1116 let ResourceCycles = [1,1,1];
1117}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001118def: InstRW<[BWWriteResGroup81], (instregex "(V?)PTESTrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001119
1120def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1121 let Latency = 7;
1122 let NumMicroOps = 3;
1123 let ResourceCycles = [1,1,1];
1124}
1125def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1126
Gadi Haber323f2e12017-10-24 20:19:47 +00001127def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1128 let Latency = 7;
1129 let NumMicroOps = 3;
1130 let ResourceCycles = [1,1,1];
1131}
Craig Topper5a69a002018-03-21 06:28:42 +00001132def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1133 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001134
Gadi Haber323f2e12017-10-24 20:19:47 +00001135def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1136 let Latency = 7;
1137 let NumMicroOps = 3;
1138 let ResourceCycles = [1,1,1];
1139}
Craig Topperf4cd9082018-01-19 05:47:32 +00001140def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001141
1142def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1143 let Latency = 7;
1144 let NumMicroOps = 5;
1145 let ResourceCycles = [1,1,1,2];
1146}
Craig Topper5a69a002018-03-21 06:28:42 +00001147def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1148 "ROL(8|16|32|64)mi",
1149 "ROR(8|16|32|64)m1",
1150 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001151
1152def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1153 let Latency = 7;
1154 let NumMicroOps = 5;
1155 let ResourceCycles = [1,1,1,2];
1156}
Craig Topper5a69a002018-03-21 06:28:42 +00001157def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001158
1159def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1160 let Latency = 7;
1161 let NumMicroOps = 5;
1162 let ResourceCycles = [1,1,1,1,1];
1163}
Craig Topper5a69a002018-03-21 06:28:42 +00001164def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1165 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001166
1167def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1168 let Latency = 7;
1169 let NumMicroOps = 7;
1170 let ResourceCycles = [2,2,1,2];
1171}
Craig Topper2d451e72018-03-18 08:38:06 +00001172def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001173
1174def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1175 let Latency = 8;
1176 let NumMicroOps = 2;
1177 let ResourceCycles = [1,1];
1178}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001179def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001180 "PDEP(32|64)rm",
1181 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001182 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001183
1184def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001185 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001186 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001187 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001188}
Craig Topperf846e2d2018-04-19 05:34:05 +00001189def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001190
Craig Topperf846e2d2018-04-19 05:34:05 +00001191def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1192 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001193 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001194 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001195}
Craig Topper5a69a002018-03-21 06:28:42 +00001196def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001197
Gadi Haber323f2e12017-10-24 20:19:47 +00001198def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1199 let Latency = 8;
1200 let NumMicroOps = 2;
1201 let ResourceCycles = [1,1];
1202}
Craig Topper5a69a002018-03-21 06:28:42 +00001203def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1204 "VPMOVSXBQYrm",
1205 "VPMOVSXBWYrm",
1206 "VPMOVSXDQYrm",
1207 "VPMOVSXWDYrm",
1208 "VPMOVSXWQYrm",
1209 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001210
Gadi Haber323f2e12017-10-24 20:19:47 +00001211def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1212 let Latency = 8;
1213 let NumMicroOps = 3;
1214 let ResourceCycles = [2,1];
1215}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001216def: InstRW<[BWWriteResGroup94], (instregex "VMASKMOVPDYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001217 "VMASKMOVPSYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001218 "VPMASKMOVDYrm",
1219 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001220
Gadi Haber323f2e12017-10-24 20:19:47 +00001221def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1222 let Latency = 8;
1223 let NumMicroOps = 5;
1224 let ResourceCycles = [1,1,1,2];
1225}
Craig Topper5a69a002018-03-21 06:28:42 +00001226def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1227 "RCL(8|16|32|64)mi",
1228 "RCR(8|16|32|64)m1",
1229 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001230
1231def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1232 let Latency = 8;
1233 let NumMicroOps = 5;
1234 let ResourceCycles = [1,1,2,1];
1235}
Craig Topper13a16502018-03-19 00:56:09 +00001236def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001237
1238def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1239 let Latency = 8;
1240 let NumMicroOps = 6;
1241 let ResourceCycles = [1,1,1,3];
1242}
Craig Topper9f834812018-04-01 21:54:24 +00001243def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001244
1245def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1246 let Latency = 8;
1247 let NumMicroOps = 6;
1248 let ResourceCycles = [1,1,1,2,1];
1249}
Craig Topper9f834812018-04-01 21:54:24 +00001250def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001251 "CMPXCHG(8|16|32|64)rm",
1252 "ROL(8|16|32|64)mCL",
1253 "SAR(8|16|32|64)mCL",
1254 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001255 "SHL(8|16|32|64)mCL",
1256 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001257def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1258 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001259
1260def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1261 let Latency = 9;
1262 let NumMicroOps = 2;
1263 let ResourceCycles = [1,1];
1264}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001265def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1266 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001267 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001268 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001269
1270def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1271 let Latency = 9;
1272 let NumMicroOps = 2;
1273 let ResourceCycles = [1,1];
1274}
Craig Topper5a69a002018-03-21 06:28:42 +00001275def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1276 "VPERM2I128rm",
1277 "VPERMDYrm",
1278 "VPERMPDYmi",
1279 "VPERMPSYrm",
1280 "VPERMQYmi",
1281 "VPMOVZXBDYrm",
1282 "VPMOVZXBQYrm",
1283 "VPMOVZXBWYrm",
1284 "VPMOVZXDQYrm",
1285 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001286
Gadi Haber323f2e12017-10-24 20:19:47 +00001287def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1288 let Latency = 9;
1289 let NumMicroOps = 3;
1290 let ResourceCycles = [1,1,1];
1291}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001292def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1293 "(V?)CVTSD2SIrm",
1294 "(V?)CVTSS2SI64rm",
1295 "(V?)CVTSS2SIrm",
1296 "(V?)CVTTSD2SI64rm",
1297 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001298 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001299 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001300
1301def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1302 let Latency = 9;
1303 let NumMicroOps = 3;
1304 let ResourceCycles = [1,1,1];
1305}
1306def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1307
1308def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1309 let Latency = 9;
1310 let NumMicroOps = 3;
1311 let ResourceCycles = [1,1,1];
1312}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001313def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001314def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001315 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001316 "CVTTPD2DQrm",
1317 "MMX_CVTPD2PIirm",
1318 "MMX_CVTPI2PDirm",
1319 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001320 "(V?)CVTDQ2PDrm",
1321 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001322
1323def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1324 let Latency = 9;
1325 let NumMicroOps = 3;
1326 let ResourceCycles = [1,1,1];
1327}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001328def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1329 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001330
Gadi Haber323f2e12017-10-24 20:19:47 +00001331def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1332 let Latency = 9;
1333 let NumMicroOps = 4;
1334 let ResourceCycles = [1,1,1,1];
1335}
Craig Topper5a69a002018-03-21 06:28:42 +00001336def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1337 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001338
1339def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1340 let Latency = 9;
1341 let NumMicroOps = 5;
1342 let ResourceCycles = [1,1,3];
1343}
1344def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1345
1346def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1347 let Latency = 9;
1348 let NumMicroOps = 5;
1349 let ResourceCycles = [1,2,1,1];
1350}
Craig Topper5a69a002018-03-21 06:28:42 +00001351def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1352 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001353
Gadi Haber323f2e12017-10-24 20:19:47 +00001354def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1355 let Latency = 10;
1356 let NumMicroOps = 2;
1357 let ResourceCycles = [1,1];
1358}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001359def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001360
Gadi Haber323f2e12017-10-24 20:19:47 +00001361def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1362 let Latency = 10;
1363 let NumMicroOps = 3;
1364 let ResourceCycles = [2,1];
1365}
Craig Topper5a69a002018-03-21 06:28:42 +00001366def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1367 "FICOM32m",
1368 "FICOMP16m",
1369 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001370
1371def BWWriteResGroup118 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1372 let Latency = 10;
1373 let NumMicroOps = 3;
1374 let ResourceCycles = [1,1,1];
1375}
1376def: InstRW<[BWWriteResGroup118], (instregex "VPTESTYrm")>;
1377
Gadi Haber323f2e12017-10-24 20:19:47 +00001378def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1379 let Latency = 10;
1380 let NumMicroOps = 4;
1381 let ResourceCycles = [1,1,1,1];
1382}
1383def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1384
1385def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001386 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001387 let NumMicroOps = 4;
1388 let ResourceCycles = [1,1,1,1];
1389}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001390def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001391
Craig Topper8104f262018-04-02 05:33:28 +00001392def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1393 let Latency = 11;
1394 let NumMicroOps = 1;
1395 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1396}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001397def : SchedAlias<WriteFDiv, BWWriteResGroup122_1>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001398
1399def BWWriteResGroup123 : SchedWriteRes<[BWPort0,BWPort23]> {
1400 let Latency = 11;
1401 let NumMicroOps = 2;
1402 let ResourceCycles = [1,1];
1403}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001404def: InstRW<[BWWriteResGroup123], (instregex "MUL_F(32|64)m",
Simon Pilgrim93c878c2018-05-03 10:31:20 +00001405 "VPCMPGTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001406
Gadi Haber323f2e12017-10-24 20:19:47 +00001407def BWWriteResGroup128 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1408 let Latency = 11;
1409 let NumMicroOps = 3;
1410 let ResourceCycles = [1,1,1];
1411}
1412def: InstRW<[BWWriteResGroup128], (instregex "VCVTDQ2PDYrm")>;
1413
Gadi Haber323f2e12017-10-24 20:19:47 +00001414def BWWriteResGroup130 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1415 let Latency = 11;
1416 let NumMicroOps = 6;
1417 let ResourceCycles = [1,1,1,1,2];
1418}
Craig Topper5a69a002018-03-21 06:28:42 +00001419def: InstRW<[BWWriteResGroup130], (instregex "SHLD(16|32|64)mrCL",
1420 "SHRD(16|32|64)mrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001421
1422def BWWriteResGroup131 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1423 let Latency = 11;
1424 let NumMicroOps = 7;
1425 let ResourceCycles = [2,2,3];
1426}
Craig Topper5a69a002018-03-21 06:28:42 +00001427def: InstRW<[BWWriteResGroup131], (instregex "RCL(16|32|64)rCL",
1428 "RCR(16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001429
1430def BWWriteResGroup132 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1431 let Latency = 11;
1432 let NumMicroOps = 9;
1433 let ResourceCycles = [1,4,1,3];
1434}
1435def: InstRW<[BWWriteResGroup132], (instregex "RCL8rCL")>;
1436
1437def BWWriteResGroup133 : SchedWriteRes<[BWPort06,BWPort0156]> {
1438 let Latency = 11;
1439 let NumMicroOps = 11;
1440 let ResourceCycles = [2,9];
1441}
Craig Topper2d451e72018-03-18 08:38:06 +00001442def: InstRW<[BWWriteResGroup133], (instrs LOOPE)>;
1443def: InstRW<[BWWriteResGroup133], (instrs LOOPNE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001444
Gadi Haber323f2e12017-10-24 20:19:47 +00001445def BWWriteResGroup135 : SchedWriteRes<[BWPort1,BWPort23]> {
1446 let Latency = 12;
1447 let NumMicroOps = 3;
1448 let ResourceCycles = [2,1];
1449}
Simon Pilgrimbe51b202018-05-04 12:59:24 +00001450def: InstRW<[BWWriteResGroup135], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001451
Craig Topper8104f262018-04-02 05:33:28 +00001452def BWWriteResGroup139_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1453 let Latency = 14;
1454 let NumMicroOps = 1;
1455 let ResourceCycles = [1,4];
1456}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001457def : SchedAlias<WriteFDiv64, BWWriteResGroup139_1>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001458
Gadi Haber323f2e12017-10-24 20:19:47 +00001459def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1460 let Latency = 14;
1461 let NumMicroOps = 3;
1462 let ResourceCycles = [1,1,1];
1463}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001464def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001465
Gadi Haber323f2e12017-10-24 20:19:47 +00001466def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1467 let Latency = 14;
1468 let NumMicroOps = 8;
1469 let ResourceCycles = [2,2,1,3];
1470}
1471def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1472
1473def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1474 let Latency = 14;
1475 let NumMicroOps = 10;
1476 let ResourceCycles = [2,3,1,4];
1477}
1478def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1479
1480def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1481 let Latency = 14;
1482 let NumMicroOps = 12;
1483 let ResourceCycles = [2,1,4,5];
1484}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001485def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001486
1487def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1488 let Latency = 15;
1489 let NumMicroOps = 1;
1490 let ResourceCycles = [1];
1491}
Craig Topper5a69a002018-03-21 06:28:42 +00001492def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1493 "DIVR_FST0r",
1494 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001495
Gadi Haber323f2e12017-10-24 20:19:47 +00001496def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1497 let Latency = 15;
1498 let NumMicroOps = 10;
1499 let ResourceCycles = [1,1,1,4,1,2];
1500}
Craig Topper13a16502018-03-19 00:56:09 +00001501def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001502
Craig Topper8104f262018-04-02 05:33:28 +00001503def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001504 let Latency = 16;
1505 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001506 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001507}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001508def : SchedAlias<WriteFDivLd, BWWriteResGroup150>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001509
Gadi Haber323f2e12017-10-24 20:19:47 +00001510def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1511 let Latency = 16;
1512 let NumMicroOps = 14;
1513 let ResourceCycles = [1,1,1,4,2,5];
1514}
1515def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1516
1517def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1518 let Latency = 16;
1519 let NumMicroOps = 16;
1520 let ResourceCycles = [16];
1521}
Craig Topper5a69a002018-03-21 06:28:42 +00001522def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001523
Gadi Haber323f2e12017-10-24 20:19:47 +00001524def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1525 let Latency = 18;
1526 let NumMicroOps = 8;
1527 let ResourceCycles = [1,1,1,5];
1528}
Craig Topper5a69a002018-03-21 06:28:42 +00001529def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001530def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001531
1532def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1533 let Latency = 18;
1534 let NumMicroOps = 11;
1535 let ResourceCycles = [2,1,1,3,1,3];
1536}
Craig Topper13a16502018-03-19 00:56:09 +00001537def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001538
Craig Topper8104f262018-04-02 05:33:28 +00001539def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001540 let Latency = 19;
1541 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001542 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001543}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001544def : SchedAlias<WriteFDiv64Ld, BWWriteResGroup161>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001545
Gadi Haber323f2e12017-10-24 20:19:47 +00001546def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1547 let Latency = 20;
1548 let NumMicroOps = 1;
1549 let ResourceCycles = [1];
1550}
Craig Topper5a69a002018-03-21 06:28:42 +00001551def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1552 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001553 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001554
Gadi Haber323f2e12017-10-24 20:19:47 +00001555def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1556 let Latency = 20;
1557 let NumMicroOps = 8;
1558 let ResourceCycles = [1,1,1,1,1,1,2];
1559}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001560def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001561
Gadi Haber323f2e12017-10-24 20:19:47 +00001562def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1563 let Latency = 21;
1564 let NumMicroOps = 2;
1565 let ResourceCycles = [1,1];
1566}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001567def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001568
Gadi Haber323f2e12017-10-24 20:19:47 +00001569def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1570 let Latency = 21;
1571 let NumMicroOps = 19;
1572 let ResourceCycles = [2,1,4,1,1,4,6];
1573}
1574def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1575
1576def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1577 let Latency = 22;
1578 let NumMicroOps = 18;
1579 let ResourceCycles = [1,1,16];
1580}
1581def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1582
Gadi Haber323f2e12017-10-24 20:19:47 +00001583def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1584 let Latency = 23;
1585 let NumMicroOps = 19;
1586 let ResourceCycles = [3,1,15];
1587}
Craig Topper391c6f92017-12-10 01:24:08 +00001588def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001589
1590def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1591 let Latency = 24;
1592 let NumMicroOps = 3;
1593 let ResourceCycles = [1,1,1];
1594}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001595def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001596
Gadi Haber323f2e12017-10-24 20:19:47 +00001597def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1598 let Latency = 26;
1599 let NumMicroOps = 2;
1600 let ResourceCycles = [1,1];
1601}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001602def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001603
Gadi Haber323f2e12017-10-24 20:19:47 +00001604def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1605 let Latency = 29;
1606 let NumMicroOps = 3;
1607 let ResourceCycles = [1,1,1];
1608}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001609def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001610
Gadi Haber323f2e12017-10-24 20:19:47 +00001611def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1612 let Latency = 22;
1613 let NumMicroOps = 7;
1614 let ResourceCycles = [1,3,2,1];
1615}
Craig Topper17a31182017-12-16 18:35:29 +00001616def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001617
1618def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1619 let Latency = 23;
1620 let NumMicroOps = 9;
1621 let ResourceCycles = [1,3,4,1];
1622}
Craig Topper17a31182017-12-16 18:35:29 +00001623def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001624
1625def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1626 let Latency = 24;
1627 let NumMicroOps = 9;
1628 let ResourceCycles = [1,5,2,1];
1629}
Craig Topper17a31182017-12-16 18:35:29 +00001630def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001631
1632def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1633 let Latency = 25;
1634 let NumMicroOps = 7;
1635 let ResourceCycles = [1,3,2,1];
1636}
Craig Topper17a31182017-12-16 18:35:29 +00001637def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1638 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001639
1640def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1641 let Latency = 26;
1642 let NumMicroOps = 9;
1643 let ResourceCycles = [1,5,2,1];
1644}
Craig Topper17a31182017-12-16 18:35:29 +00001645def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001646
1647def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1648 let Latency = 26;
1649 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001650 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001651}
Craig Topper17a31182017-12-16 18:35:29 +00001652def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001653
1654def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1655 let Latency = 27;
1656 let NumMicroOps = 9;
1657 let ResourceCycles = [1,5,2,1];
1658}
Craig Topper17a31182017-12-16 18:35:29 +00001659def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001660
Gadi Haber323f2e12017-10-24 20:19:47 +00001661def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1662 let Latency = 29;
1663 let NumMicroOps = 27;
1664 let ResourceCycles = [1,5,1,1,19];
1665}
1666def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1667
1668def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1669 let Latency = 30;
1670 let NumMicroOps = 28;
1671 let ResourceCycles = [1,6,1,1,19];
1672}
Craig Topper2d451e72018-03-18 08:38:06 +00001673def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001674
Gadi Haber323f2e12017-10-24 20:19:47 +00001675def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1676 let Latency = 34;
1677 let NumMicroOps = 8;
1678 let ResourceCycles = [2,2,2,1,1];
1679}
Craig Topper13a16502018-03-19 00:56:09 +00001680def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001681
1682def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
1683 let Latency = 34;
1684 let NumMicroOps = 23;
1685 let ResourceCycles = [1,5,3,4,10];
1686}
Craig Topper5a69a002018-03-21 06:28:42 +00001687def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
1688 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001689
1690def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1691 let Latency = 35;
1692 let NumMicroOps = 8;
1693 let ResourceCycles = [2,2,2,1,1];
1694}
Craig Topper13a16502018-03-19 00:56:09 +00001695def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001696
1697def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1698 let Latency = 35;
1699 let NumMicroOps = 23;
1700 let ResourceCycles = [1,5,2,1,4,10];
1701}
Craig Topper5a69a002018-03-21 06:28:42 +00001702def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
1703 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001704
Gadi Haber323f2e12017-10-24 20:19:47 +00001705def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
1706 let Latency = 42;
1707 let NumMicroOps = 22;
1708 let ResourceCycles = [2,20];
1709}
Craig Topper2d451e72018-03-18 08:38:06 +00001710def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001711
1712def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
1713 let Latency = 60;
1714 let NumMicroOps = 64;
1715 let ResourceCycles = [2,2,8,1,10,2,39];
1716}
1717def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001718
1719def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1720 let Latency = 63;
1721 let NumMicroOps = 88;
1722 let ResourceCycles = [4,4,31,1,2,1,45];
1723}
Craig Topper2d451e72018-03-18 08:38:06 +00001724def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001725
1726def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1727 let Latency = 63;
1728 let NumMicroOps = 90;
1729 let ResourceCycles = [4,2,33,1,2,1,47];
1730}
Craig Topper2d451e72018-03-18 08:38:06 +00001731def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001732
1733def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
1734 let Latency = 75;
1735 let NumMicroOps = 15;
1736 let ResourceCycles = [6,3,6];
1737}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00001738def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001739
1740def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
1741 let Latency = 80;
1742 let NumMicroOps = 32;
1743 let ResourceCycles = [7,7,3,3,1,11];
1744}
1745def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
1746
1747def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
1748 let Latency = 115;
1749 let NumMicroOps = 100;
1750 let ResourceCycles = [9,9,11,8,1,11,21,30];
1751}
1752def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001753
1754} // SchedModel
1755