blob: 936dd6e81a623ccb7a7e9fe56dfa5c5ad8fbd414 [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",
690 "VPBROADCASTWrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000691 "VPMOVSXBDYrr",
692 "VPMOVSXBQYrr",
693 "VPMOVSXBWYrr",
694 "VPMOVSXDQYrr",
695 "VPMOVSXWDYrr",
696 "VPMOVSXWQYrr",
697 "VPMOVZXBDYrr",
698 "VPMOVZXBQYrr",
699 "VPMOVZXBWYrr",
700 "VPMOVZXDQYrr",
701 "VPMOVZXWDYrr",
702 "VPMOVZXWQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000703
Gadi Haber323f2e12017-10-24 20:19:47 +0000704def BWWriteResGroup30 : SchedWriteRes<[BWPort0156]> {
Craig Topperb5f26592018-04-19 18:00:17 +0000705 let Latency = 2;
Gadi Haber323f2e12017-10-24 20:19:47 +0000706 let NumMicroOps = 3;
707 let ResourceCycles = [3];
708}
Craig Topperb5f26592018-04-19 18:00:17 +0000709def: InstRW<[BWWriteResGroup30], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
710 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
711 XCHG16ar, XCHG32ar, XCHG64ar)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000712
Gadi Haber323f2e12017-10-24 20:19:47 +0000713def BWWriteResGroup33 : SchedWriteRes<[BWPort5,BWPort0156]> {
714 let Latency = 3;
715 let NumMicroOps = 3;
716 let ResourceCycles = [2,1];
717}
Craig Topper5a69a002018-03-21 06:28:42 +0000718def: InstRW<[BWWriteResGroup33], (instregex "MMX_PACKSSDWirr",
719 "MMX_PACKSSWBirr",
720 "MMX_PACKUSWBirr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000721
722def BWWriteResGroup34 : SchedWriteRes<[BWPort6,BWPort0156]> {
723 let Latency = 3;
724 let NumMicroOps = 3;
725 let ResourceCycles = [1,2];
726}
727def: InstRW<[BWWriteResGroup34], (instregex "CLD")>;
728
729def BWWriteResGroup35 : SchedWriteRes<[BWPort06,BWPort0156]> {
730 let Latency = 3;
731 let NumMicroOps = 3;
732 let ResourceCycles = [1,2];
733}
Craig Topper5a69a002018-03-21 06:28:42 +0000734def: InstRW<[BWWriteResGroup35], (instregex "RCL(8|16|32|64)r1",
735 "RCL(8|16|32|64)ri",
736 "RCR(8|16|32|64)r1",
737 "RCR(8|16|32|64)ri")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000738
739def BWWriteResGroup36 : SchedWriteRes<[BWPort06,BWPort0156]> {
740 let Latency = 3;
741 let NumMicroOps = 3;
742 let ResourceCycles = [2,1];
743}
Craig Topper5a69a002018-03-21 06:28:42 +0000744def: InstRW<[BWWriteResGroup36], (instregex "ROL(8|16|32|64)rCL",
745 "ROR(8|16|32|64)rCL",
746 "SAR(8|16|32|64)rCL",
747 "SHL(8|16|32|64)rCL",
748 "SHR(8|16|32|64)rCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000749
750def BWWriteResGroup37 : SchedWriteRes<[BWPort4,BWPort6,BWPort237,BWPort0156]> {
751 let Latency = 3;
752 let NumMicroOps = 4;
753 let ResourceCycles = [1,1,1,1];
754}
755def: InstRW<[BWWriteResGroup37], (instregex "CALL(16|32|64)r")>;
756
757def BWWriteResGroup38 : SchedWriteRes<[BWPort4,BWPort237,BWPort06,BWPort0156]> {
758 let Latency = 3;
759 let NumMicroOps = 4;
760 let ResourceCycles = [1,1,1,1];
761}
Craig Topper5a69a002018-03-21 06:28:42 +0000762def: InstRW<[BWWriteResGroup38], (instregex "CALL64pcrel32",
763 "SET(A|BE)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000764
765def BWWriteResGroup39 : SchedWriteRes<[BWPort0,BWPort1]> {
766 let Latency = 4;
767 let NumMicroOps = 2;
768 let ResourceCycles = [1,1];
769}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000770def: InstRW<[BWWriteResGroup39], (instregex "(V?)CVTSD2SI64rr",
771 "(V?)CVTSD2SIrr",
772 "(V?)CVTSS2SI64rr",
773 "(V?)CVTSS2SIrr",
774 "(V?)CVTTSD2SI64rr",
775 "(V?)CVTTSD2SIrr",
776 "(V?)CVTTSS2SI64rr",
777 "(V?)CVTTSS2SIrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000778
779def BWWriteResGroup40 : SchedWriteRes<[BWPort0,BWPort5]> {
780 let Latency = 4;
781 let NumMicroOps = 2;
782 let ResourceCycles = [1,1];
783}
Craig Topper5a69a002018-03-21 06:28:42 +0000784def: InstRW<[BWWriteResGroup40], (instregex "VCVTPS2PDYrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000785 "VPTESTYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000786
787def BWWriteResGroup41 : SchedWriteRes<[BWPort0,BWPort0156]> {
788 let Latency = 4;
789 let NumMicroOps = 2;
790 let ResourceCycles = [1,1];
791}
792def: InstRW<[BWWriteResGroup41], (instregex "FNSTSW16r")>;
793
794def BWWriteResGroup42 : SchedWriteRes<[BWPort1,BWPort5]> {
795 let Latency = 4;
796 let NumMicroOps = 2;
797 let ResourceCycles = [1,1];
798}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000799def: InstRW<[BWWriteResGroup42], (instrs IMUL64r, MUL64r, MULX64rr)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000800def: InstRW<[BWWriteResGroup42], (instregex "MMX_CVTPD2PIirr",
Craig Topper5a69a002018-03-21 06:28:42 +0000801 "MMX_CVTPI2PDirr",
802 "MMX_CVTPS2PIirr",
803 "MMX_CVTTPD2PIirr",
804 "MMX_CVTTPS2PIirr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000805 "(V?)CVTDQ2PDrr",
806 "(V?)CVTPD2DQrr",
807 "(V?)CVTPD2PSrr",
Craig Topper5a69a002018-03-21 06:28:42 +0000808 "VCVTPS2PHrr",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000809 "(V?)CVTSD2SSrr",
810 "(V?)CVTSI642SDrr",
811 "(V?)CVTSI2SDrr",
812 "(V?)CVTSI2SSrr",
813 "(V?)CVTTPD2DQrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000814
815def BWWriteResGroup42_16 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
816 let Latency = 4;
817 let NumMicroOps = 4;
Craig Topperf846e2d2018-04-19 05:34:05 +0000818 let ResourceCycles = [1,1,2];
Gadi Haber323f2e12017-10-24 20:19:47 +0000819}
Craig Topper5a69a002018-03-21 06:28:42 +0000820def: InstRW<[BWWriteResGroup42_16], (instrs IMUL16r, MUL16r)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000821
822def BWWriteResGroup43 : SchedWriteRes<[BWPort0,BWPort4,BWPort237]> {
823 let Latency = 4;
824 let NumMicroOps = 3;
825 let ResourceCycles = [1,1,1];
826}
827def: InstRW<[BWWriteResGroup43], (instregex "FNSTSWm")>;
828
829def BWWriteResGroup44 : SchedWriteRes<[BWPort1,BWPort4,BWPort237]> {
830 let Latency = 4;
831 let NumMicroOps = 3;
832 let ResourceCycles = [1,1,1];
833}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000834def: InstRW<[BWWriteResGroup44], (instregex "IST(T?)_FP(16|32|64)m",
835 "IST_F(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000836
837def BWWriteResGroup45 : SchedWriteRes<[BWPort0156]> {
838 let Latency = 4;
839 let NumMicroOps = 4;
840 let ResourceCycles = [4];
841}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +0000842def: InstRW<[BWWriteResGroup45], (instrs FNCLEX)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000843
844def BWWriteResGroup46 : SchedWriteRes<[BWPort015,BWPort0156]> {
845 let Latency = 4;
846 let NumMicroOps = 4;
847 let ResourceCycles = [1,3];
848}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +0000849def: InstRW<[BWWriteResGroup46], (instrs VZEROUPPER)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000850
851def BWWriteResGroup47 : SchedWriteRes<[BWPort0]> {
852 let Latency = 5;
853 let NumMicroOps = 1;
854 let ResourceCycles = [1];
855}
Simon Pilgrima53d3302018-05-02 16:16:24 +0000856def: InstRW<[BWWriteResGroup47], (instregex "(V?)PCMPGTQ(Y?)rr",
857 "MUL_FPrST0",
858 "MUL_FST0r",
Simon Pilgrim86d9f232018-05-02 14:25:32 +0000859 "MUL_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000860
Gadi Haber323f2e12017-10-24 20:19:47 +0000861def BWWriteResGroup49 : SchedWriteRes<[BWPort23]> {
862 let Latency = 5;
863 let NumMicroOps = 1;
864 let ResourceCycles = [1];
865}
Simon Pilgrim02fc3752018-04-21 12:15:42 +0000866def: InstRW<[BWWriteResGroup49], (instregex "MOVSX(16|32|64)rm16",
Craig Topper5a69a002018-03-21 06:28:42 +0000867 "MOVSX(16|32|64)rm32",
868 "MOVSX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000869 "MOVZX(16|32|64)rm16",
870 "MOVZX(16|32|64)rm8",
Craig Topper5a69a002018-03-21 06:28:42 +0000871 "VBROADCASTSSrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000872 "(V?)MOVDDUPrm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000873 "(V?)MOVSHDUPrm",
874 "(V?)MOVSLDUPrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000875 "VPBROADCASTDrm",
876 "VPBROADCASTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000877
878def BWWriteResGroup50 : SchedWriteRes<[BWPort1,BWPort5]> {
879 let Latency = 5;
880 let NumMicroOps = 3;
881 let ResourceCycles = [1,2];
882}
Simon Pilgrimef8d3ae2018-04-22 15:25:59 +0000883def: InstRW<[BWWriteResGroup50], (instregex "(V?)CVTSI642SSrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000884
885def BWWriteResGroup51 : SchedWriteRes<[BWPort1,BWPort6,BWPort06]> {
886 let Latency = 5;
887 let NumMicroOps = 3;
888 let ResourceCycles = [1,1,1];
889}
890def: InstRW<[BWWriteResGroup51], (instregex "STR(16|32|64)r")>;
891
892def BWWriteResGroup52 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +0000893 let Latency = 4;
Gadi Haber323f2e12017-10-24 20:19:47 +0000894 let NumMicroOps = 3;
895 let ResourceCycles = [1,1,1];
896}
Craig Topper4a3be6e2018-03-22 19:22:51 +0000897def: InstRW<[BWWriteResGroup52], (instrs IMUL32r, MUL32r, MULX32rr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000898
899def BWWriteResGroup53 : SchedWriteRes<[BWPort0,BWPort4,BWPort237,BWPort15]> {
900 let Latency = 5;
901 let NumMicroOps = 4;
902 let ResourceCycles = [1,1,1,1];
903}
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000904def: InstRW<[BWWriteResGroup53], (instregex "VMASKMOVPD(Y?)mr",
905 "VMASKMOVPS(Y?)mr",
906 "VPMASKMOVD(Y?)mr",
907 "VPMASKMOVQ(Y?)mr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000908
909def BWWriteResGroup54 : SchedWriteRes<[BWPort6,BWPort0156]> {
910 let Latency = 5;
911 let NumMicroOps = 5;
912 let ResourceCycles = [1,4];
913}
Simon Pilgrimd5ada492018-04-29 15:33:15 +0000914def: InstRW<[BWWriteResGroup54], (instrs PAUSE)>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000915
916def BWWriteResGroup55 : SchedWriteRes<[BWPort06,BWPort0156]> {
917 let Latency = 5;
918 let NumMicroOps = 5;
919 let ResourceCycles = [1,4];
920}
921def: InstRW<[BWWriteResGroup55], (instregex "XSETBV")>;
922
923def BWWriteResGroup56 : SchedWriteRes<[BWPort06,BWPort0156]> {
924 let Latency = 5;
925 let NumMicroOps = 5;
926 let ResourceCycles = [2,3];
927}
Craig Topper5a69a002018-03-21 06:28:42 +0000928def: InstRW<[BWWriteResGroup56], (instregex "CMPXCHG(8|16|32|64)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000929
930def BWWriteResGroup57 : SchedWriteRes<[BWPort4,BWPort237,BWPort0156]> {
931 let Latency = 5;
932 let NumMicroOps = 6;
933 let ResourceCycles = [1,1,4];
934}
Craig Topper5a69a002018-03-21 06:28:42 +0000935def: InstRW<[BWWriteResGroup57], (instregex "PUSHF16", "PUSHF64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000936
937def BWWriteResGroup58 : SchedWriteRes<[BWPort23]> {
938 let Latency = 6;
939 let NumMicroOps = 1;
940 let ResourceCycles = [1];
941}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +0000942def: InstRW<[BWWriteResGroup58], (instregex "LD_F(32|64|80)m",
Craig Topper5a69a002018-03-21 06:28:42 +0000943 "VBROADCASTF128",
944 "VBROADCASTI128",
945 "VBROADCASTSDYrm",
946 "VBROADCASTSSYrm",
947 "VLDDQUYrm",
948 "VMOVAPDYrm",
949 "VMOVAPSYrm",
950 "VMOVDDUPYrm",
951 "VMOVDQAYrm",
952 "VMOVDQUYrm",
953 "VMOVNTDQAYrm",
954 "VMOVSHDUPYrm",
955 "VMOVSLDUPYrm",
956 "VMOVUPDYrm",
957 "VMOVUPSYrm",
958 "VPBROADCASTDYrm",
Simon Pilgrimbe51b202018-05-04 12:59:24 +0000959 "VPBROADCASTQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000960
961def BWWriteResGroup59 : SchedWriteRes<[BWPort0,BWPort23]> {
962 let Latency = 6;
963 let NumMicroOps = 2;
964 let ResourceCycles = [1,1];
965}
Simon Pilgrim0a334a82018-04-23 11:57:15 +0000966def: InstRW<[BWWriteResGroup59], (instregex "VCVTPH2PS(Y?)rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +0000967 "(V?)CVTPS2PDrm",
968 "(V?)CVTSS2SDrm",
Craig Topper5a69a002018-03-21 06:28:42 +0000969 "VPSLLVQrm",
970 "VPSRLVQrm",
971 "VTESTPDrm",
972 "VTESTPSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000973
974def BWWriteResGroup60 : SchedWriteRes<[BWPort1,BWPort5]> {
975 let Latency = 6;
976 let NumMicroOps = 2;
977 let ResourceCycles = [1,1];
978}
Craig Topper5a69a002018-03-21 06:28:42 +0000979def: InstRW<[BWWriteResGroup60], (instregex "VCVTDQ2PDYrr",
980 "VCVTPD2DQYrr",
981 "VCVTPD2PSYrr",
982 "VCVTPS2PHYrr",
983 "VCVTTPD2DQYrr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000984
Gadi Haber323f2e12017-10-24 20:19:47 +0000985def BWWriteResGroup62 : SchedWriteRes<[BWPort6,BWPort23]> {
986 let Latency = 6;
987 let NumMicroOps = 2;
988 let ResourceCycles = [1,1];
989}
Craig Topper5a69a002018-03-21 06:28:42 +0000990def: InstRW<[BWWriteResGroup62], (instregex "FARJMP64",
991 "JMP(16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +0000992
993def BWWriteResGroup63 : SchedWriteRes<[BWPort23,BWPort06]> {
994 let Latency = 6;
995 let NumMicroOps = 2;
996 let ResourceCycles = [1,1];
997}
Craig Topperdfccafe2018-04-18 06:41:25 +0000998def: InstRW<[BWWriteResGroup63], (instregex "BT(16|32|64)mi8")>;
Craig Topperc50570f2018-04-06 17:12:18 +0000999def: InstRW<[BWWriteResGroup63, ReadAfterLd], (instrs ADC8rm, ADC16rm, ADC32rm, ADC64rm,
1000 ADCX32rm, ADCX64rm,
1001 ADOX32rm, ADOX64rm,
1002 SBB8rm, SBB16rm, SBB32rm, SBB64rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001003
1004def BWWriteResGroup64 : SchedWriteRes<[BWPort23,BWPort15]> {
1005 let Latency = 6;
1006 let NumMicroOps = 2;
1007 let ResourceCycles = [1,1];
1008}
Craig Topper5a69a002018-03-21 06:28:42 +00001009def: InstRW<[BWWriteResGroup64], (instregex "ANDN(32|64)rm",
1010 "BLSI(32|64)rm",
1011 "BLSMSK(32|64)rm",
1012 "BLSR(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001013 "MOVBE(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001014
1015def BWWriteResGroup65 : SchedWriteRes<[BWPort23,BWPort015]> {
1016 let Latency = 6;
1017 let NumMicroOps = 2;
1018 let ResourceCycles = [1,1];
1019}
Simon Pilgrim06e16542018-04-22 18:35:53 +00001020def: InstRW<[BWWriteResGroup65], (instregex "VINSERTF128rm",
Craig Topper5a69a002018-03-21 06:28:42 +00001021 "VINSERTI128rm",
Simon Pilgrimd14d2e72018-04-20 21:16:05 +00001022 "VPBLENDDrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001023
1024def BWWriteResGroup66 : SchedWriteRes<[BWPort23,BWPort0156]> {
1025 let Latency = 6;
1026 let NumMicroOps = 2;
1027 let ResourceCycles = [1,1];
1028}
Craig Topper2d451e72018-03-18 08:38:06 +00001029def: InstRW<[BWWriteResGroup66], (instrs POP16r, POP32r, POP64r)>;
Craig Topperf0d04262018-04-06 16:16:48 +00001030def: InstRW<[BWWriteResGroup66], (instregex "POP(16|32|64)rmr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001031
1032def BWWriteResGroup67 : SchedWriteRes<[BWPort1,BWPort06,BWPort0156]> {
1033 let Latency = 6;
1034 let NumMicroOps = 4;
1035 let ResourceCycles = [1,1,2];
1036}
Craig Topper5a69a002018-03-21 06:28:42 +00001037def: InstRW<[BWWriteResGroup67], (instregex "SHLD(16|32|64)rrCL",
1038 "SHRD(16|32|64)rrCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001039
1040def BWWriteResGroup68 : SchedWriteRes<[BWPort1,BWPort6,BWPort06,BWPort0156]> {
1041 let Latency = 6;
1042 let NumMicroOps = 4;
1043 let ResourceCycles = [1,1,1,1];
1044}
1045def: InstRW<[BWWriteResGroup68], (instregex "SLDT(16|32|64)r")>;
1046
1047def BWWriteResGroup69 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1048 let Latency = 6;
1049 let NumMicroOps = 4;
1050 let ResourceCycles = [1,1,1,1];
1051}
Craig Topper5a69a002018-03-21 06:28:42 +00001052def: InstRW<[BWWriteResGroup69], (instregex "BTC(16|32|64)mi8",
1053 "BTR(16|32|64)mi8",
1054 "BTS(16|32|64)mi8",
1055 "SAR(8|16|32|64)m1",
1056 "SAR(8|16|32|64)mi",
1057 "SHL(8|16|32|64)m1",
1058 "SHL(8|16|32|64)mi",
1059 "SHR(8|16|32|64)m1",
1060 "SHR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001061
1062def BWWriteResGroup70 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1063 let Latency = 6;
1064 let NumMicroOps = 4;
1065 let ResourceCycles = [1,1,1,1];
1066}
Craig Topperf0d04262018-04-06 16:16:48 +00001067def: InstRW<[BWWriteResGroup70], (instregex "POP(16|32|64)rmm",
1068 "PUSH(16|32|64)rmm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001069
1070def BWWriteResGroup71 : SchedWriteRes<[BWPort6,BWPort0156]> {
1071 let Latency = 6;
1072 let NumMicroOps = 6;
1073 let ResourceCycles = [1,5];
1074}
1075def: InstRW<[BWWriteResGroup71], (instregex "STD")>;
1076
Gadi Haber323f2e12017-10-24 20:19:47 +00001077def BWWriteResGroup73 : SchedWriteRes<[BWPort0,BWPort23]> {
1078 let Latency = 7;
1079 let NumMicroOps = 2;
1080 let ResourceCycles = [1,1];
1081}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001082def: InstRW<[BWWriteResGroup73], (instregex "VPSLLVQYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001083 "VPSRLVQYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001084 "VTESTPDYrm",
1085 "VTESTPSYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001086
1087def BWWriteResGroup74 : SchedWriteRes<[BWPort1,BWPort23]> {
1088 let Latency = 7;
1089 let NumMicroOps = 2;
1090 let ResourceCycles = [1,1];
1091}
Craig Topper5a69a002018-03-21 06:28:42 +00001092def: InstRW<[BWWriteResGroup74], (instregex "FCOM32m",
1093 "FCOM64m",
1094 "FCOMP32m",
1095 "FCOMP64m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001096
Gadi Haber323f2e12017-10-24 20:19:47 +00001097def BWWriteResGroup77 : SchedWriteRes<[BWPort23,BWPort015]> {
1098 let Latency = 7;
1099 let NumMicroOps = 2;
1100 let ResourceCycles = [1,1];
1101}
Simon Pilgrim57f2b182018-05-01 12:39:17 +00001102def: InstRW<[BWWriteResGroup77], (instregex "VPBLENDDYrmi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001103
Gadi Haber323f2e12017-10-24 20:19:47 +00001104def BWWriteResGroup79 : SchedWriteRes<[BWPort5,BWPort23]> {
1105 let Latency = 7;
1106 let NumMicroOps = 3;
1107 let ResourceCycles = [2,1];
1108}
Simon Pilgrim96855ec2018-04-22 14:43:12 +00001109def: InstRW<[BWWriteResGroup79], (instregex "MMX_PACKSSDWirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001110 "MMX_PACKSSWBirm",
1111 "MMX_PACKUSWBirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001112 "VMASKMOVPDrm",
1113 "VMASKMOVPSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001114 "VPMASKMOVDrm",
1115 "VPMASKMOVQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001116
1117def BWWriteResGroup80 : SchedWriteRes<[BWPort23,BWPort0156]> {
1118 let Latency = 7;
1119 let NumMicroOps = 3;
1120 let ResourceCycles = [1,2];
1121}
Craig Topper3b0b96c2018-04-05 21:16:26 +00001122def: InstRW<[BWWriteResGroup80], (instrs LEAVE, LEAVE64,
1123 SCASB, SCASL, SCASQ, SCASW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001124
1125def BWWriteResGroup81 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1126 let Latency = 7;
1127 let NumMicroOps = 3;
1128 let ResourceCycles = [1,1,1];
1129}
Simon Pilgrimf2d2ced2018-05-03 17:56:43 +00001130def: InstRW<[BWWriteResGroup81], (instregex "(V?)PTESTrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001131
1132def BWWriteResGroup82 : SchedWriteRes<[BWPort0,BWPort01,BWPort23]> {
1133 let Latency = 7;
1134 let NumMicroOps = 3;
1135 let ResourceCycles = [1,1,1];
1136}
1137def: InstRW<[BWWriteResGroup82], (instregex "FLDCW16m")>;
1138
Gadi Haber323f2e12017-10-24 20:19:47 +00001139def BWWriteResGroup84 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1140 let Latency = 7;
1141 let NumMicroOps = 3;
1142 let ResourceCycles = [1,1,1];
1143}
Craig Topper5a69a002018-03-21 06:28:42 +00001144def: InstRW<[BWWriteResGroup84], (instregex "LRETQ",
1145 "RETQ")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001146
Gadi Haber323f2e12017-10-24 20:19:47 +00001147def BWWriteResGroup86 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1148 let Latency = 7;
1149 let NumMicroOps = 3;
1150 let ResourceCycles = [1,1,1];
1151}
Craig Topperf4cd9082018-01-19 05:47:32 +00001152def: InstRW<[BWWriteResGroup86], (instregex "CMOV(A|BE)(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001153
1154def BWWriteResGroup87 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06]> {
1155 let Latency = 7;
1156 let NumMicroOps = 5;
1157 let ResourceCycles = [1,1,1,2];
1158}
Craig Topper5a69a002018-03-21 06:28:42 +00001159def: InstRW<[BWWriteResGroup87], (instregex "ROL(8|16|32|64)m1",
1160 "ROL(8|16|32|64)mi",
1161 "ROR(8|16|32|64)m1",
1162 "ROR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001163
1164def BWWriteResGroup88 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1165 let Latency = 7;
1166 let NumMicroOps = 5;
1167 let ResourceCycles = [1,1,1,2];
1168}
Craig Topper5a69a002018-03-21 06:28:42 +00001169def: InstRW<[BWWriteResGroup88], (instregex "XADD(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001170
1171def BWWriteResGroup89 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1172 let Latency = 7;
1173 let NumMicroOps = 5;
1174 let ResourceCycles = [1,1,1,1,1];
1175}
Craig Topper5a69a002018-03-21 06:28:42 +00001176def: InstRW<[BWWriteResGroup89], (instregex "CALL(16|32|64)m",
1177 "FARCALL64")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001178
1179def BWWriteResGroup90 : SchedWriteRes<[BWPort6,BWPort06,BWPort15,BWPort0156]> {
1180 let Latency = 7;
1181 let NumMicroOps = 7;
1182 let ResourceCycles = [2,2,1,2];
1183}
Craig Topper2d451e72018-03-18 08:38:06 +00001184def: InstRW<[BWWriteResGroup90], (instrs LOOP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001185
1186def BWWriteResGroup91 : SchedWriteRes<[BWPort1,BWPort23]> {
1187 let Latency = 8;
1188 let NumMicroOps = 2;
1189 let ResourceCycles = [1,1];
1190}
Simon Pilgrimf33d9052018-03-26 18:19:28 +00001191def: InstRW<[BWWriteResGroup91], (instregex "MMX_CVTPI2PSirm",
Craig Topper5a69a002018-03-21 06:28:42 +00001192 "PDEP(32|64)rm",
1193 "PEXT(32|64)rm",
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001194 "(V?)CVTDQ2PSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001195
1196def BWWriteResGroup91_16 : SchedWriteRes<[BWPort1, BWPort0156, BWPort23]> {
Craig Topperf846e2d2018-04-19 05:34:05 +00001197 let Latency = 8;
Gadi Haber323f2e12017-10-24 20:19:47 +00001198 let NumMicroOps = 3;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001199 let ResourceCycles = [1,1,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001200}
Craig Topperf846e2d2018-04-19 05:34:05 +00001201def: InstRW<[BWWriteResGroup91_16], (instrs IMUL16rmi, IMUL16rmi8)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001202
Craig Topperf846e2d2018-04-19 05:34:05 +00001203def BWWriteResGroup91_16_2 : SchedWriteRes<[BWPort1, BWPort06, BWPort0156, BWPort23]> {
1204 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001205 let NumMicroOps = 5;
Craig Topperf846e2d2018-04-19 05:34:05 +00001206 let ResourceCycles = [1,1,2,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001207}
Craig Topper5a69a002018-03-21 06:28:42 +00001208def: InstRW<[BWWriteResGroup91_16_2], (instrs IMUL16m, MUL16m)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001209
Gadi Haber323f2e12017-10-24 20:19:47 +00001210def BWWriteResGroup92 : SchedWriteRes<[BWPort5,BWPort23]> {
1211 let Latency = 8;
1212 let NumMicroOps = 2;
1213 let ResourceCycles = [1,1];
1214}
Craig Topper5a69a002018-03-21 06:28:42 +00001215def: InstRW<[BWWriteResGroup92], (instregex "VPMOVSXBDYrm",
1216 "VPMOVSXBQYrm",
1217 "VPMOVSXBWYrm",
1218 "VPMOVSXDQYrm",
1219 "VPMOVSXWDYrm",
1220 "VPMOVSXWQYrm",
1221 "VPMOVZXWDYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001222
Gadi Haber323f2e12017-10-24 20:19:47 +00001223def BWWriteResGroup94 : SchedWriteRes<[BWPort5,BWPort23]> {
1224 let Latency = 8;
1225 let NumMicroOps = 3;
1226 let ResourceCycles = [2,1];
1227}
Simon Pilgrim8a937e02018-04-27 18:19:48 +00001228def: InstRW<[BWWriteResGroup94], (instregex "VMASKMOVPDYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001229 "VMASKMOVPSYrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001230 "VPMASKMOVDYrm",
1231 "VPMASKMOVQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001232
Gadi Haber323f2e12017-10-24 20:19:47 +00001233def BWWriteResGroup97 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1234 let Latency = 8;
1235 let NumMicroOps = 5;
1236 let ResourceCycles = [1,1,1,2];
1237}
Craig Topper5a69a002018-03-21 06:28:42 +00001238def: InstRW<[BWWriteResGroup97], (instregex "RCL(8|16|32|64)m1",
1239 "RCL(8|16|32|64)mi",
1240 "RCR(8|16|32|64)m1",
1241 "RCR(8|16|32|64)mi")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001242
1243def BWWriteResGroup98 : SchedWriteRes<[BWPort23,BWPort237,BWPort06,BWPort0156]> {
1244 let Latency = 8;
1245 let NumMicroOps = 5;
1246 let ResourceCycles = [1,1,2,1];
1247}
Craig Topper13a16502018-03-19 00:56:09 +00001248def: InstRW<[BWWriteResGroup98], (instregex "ROR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001249
1250def BWWriteResGroup99 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort0156]> {
1251 let Latency = 8;
1252 let NumMicroOps = 6;
1253 let ResourceCycles = [1,1,1,3];
1254}
Craig Topper9f834812018-04-01 21:54:24 +00001255def: InstRW<[BWWriteResGroup99], (instregex "XCHG(8|16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001256
1257def BWWriteResGroup100 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1258 let Latency = 8;
1259 let NumMicroOps = 6;
1260 let ResourceCycles = [1,1,1,2,1];
1261}
Craig Topper9f834812018-04-01 21:54:24 +00001262def: InstRW<[BWWriteResGroup100], (instregex "ADC(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001263 "CMPXCHG(8|16|32|64)rm",
1264 "ROL(8|16|32|64)mCL",
1265 "SAR(8|16|32|64)mCL",
1266 "SBB(8|16|32|64)mi",
Craig Topper5a69a002018-03-21 06:28:42 +00001267 "SHL(8|16|32|64)mCL",
1268 "SHR(8|16|32|64)mCL")>;
Craig Topperc50570f2018-04-06 17:12:18 +00001269def: InstRW<[BWWriteResGroup100, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr,
1270 SBB8mr, SBB16mr, SBB32mr, SBB64mr)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001271
1272def BWWriteResGroup101 : SchedWriteRes<[BWPort1,BWPort23]> {
1273 let Latency = 9;
1274 let NumMicroOps = 2;
1275 let ResourceCycles = [1,1];
1276}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001277def: InstRW<[BWWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1278 "ILD_F(16|32|64)m",
Craig Topper5a69a002018-03-21 06:28:42 +00001279 "VCVTPS2DQYrm",
Clement Courbet0f1da8f2018-05-02 13:54:38 +00001280 "VCVTTPS2DQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001281
1282def BWWriteResGroup102 : SchedWriteRes<[BWPort5,BWPort23]> {
1283 let Latency = 9;
1284 let NumMicroOps = 2;
1285 let ResourceCycles = [1,1];
1286}
Craig Topper5a69a002018-03-21 06:28:42 +00001287def: InstRW<[BWWriteResGroup102], (instregex "VPERM2F128rm",
1288 "VPERM2I128rm",
1289 "VPERMDYrm",
1290 "VPERMPDYmi",
1291 "VPERMPSYrm",
1292 "VPERMQYmi",
1293 "VPMOVZXBDYrm",
1294 "VPMOVZXBQYrm",
1295 "VPMOVZXBWYrm",
1296 "VPMOVZXDQYrm",
1297 "VPMOVZXWQYrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001298
Gadi Haber323f2e12017-10-24 20:19:47 +00001299def BWWriteResGroup105 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1300 let Latency = 9;
1301 let NumMicroOps = 3;
1302 let ResourceCycles = [1,1,1];
1303}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001304def: InstRW<[BWWriteResGroup105], (instregex "(V?)CVTSD2SI64rm",
1305 "(V?)CVTSD2SIrm",
1306 "(V?)CVTSS2SI64rm",
1307 "(V?)CVTSS2SIrm",
1308 "(V?)CVTTSD2SI64rm",
1309 "(V?)CVTTSD2SIrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001310 "VCVTTSS2SI64rm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001311 "(V?)CVTTSS2SIrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001312
1313def BWWriteResGroup106 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1314 let Latency = 9;
1315 let NumMicroOps = 3;
1316 let ResourceCycles = [1,1,1];
1317}
1318def: InstRW<[BWWriteResGroup106], (instregex "VCVTPS2PDYrm")>;
1319
1320def BWWriteResGroup107 : SchedWriteRes<[BWPort1,BWPort5,BWPort23]> {
1321 let Latency = 9;
1322 let NumMicroOps = 3;
1323 let ResourceCycles = [1,1,1];
1324}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001325def: InstRW<[BWWriteResGroup107], (instrs IMUL64m, MUL64m, MULX64rm)>;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001326def: InstRW<[BWWriteResGroup107], (instregex "CVTPD2DQrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001327 "CVTPD2PSrm",
Craig Topper5a69a002018-03-21 06:28:42 +00001328 "CVTTPD2DQrm",
1329 "MMX_CVTPD2PIirm",
1330 "MMX_CVTPI2PDirm",
1331 "MMX_CVTTPD2PIirm",
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001332 "(V?)CVTDQ2PDrm",
1333 "(V?)CVTSD2SSrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001334
1335def BWWriteResGroup108 : SchedWriteRes<[BWPort5,BWPort23,BWPort015]> {
1336 let Latency = 9;
1337 let NumMicroOps = 3;
1338 let ResourceCycles = [1,1,1];
1339}
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001340def: InstRW<[BWWriteResGroup108], (instregex "VPBROADCASTB(Y?)rm",
1341 "VPBROADCASTW(Y?)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001342
Gadi Haber323f2e12017-10-24 20:19:47 +00001343def BWWriteResGroup111 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort0156]> {
1344 let Latency = 9;
1345 let NumMicroOps = 4;
1346 let ResourceCycles = [1,1,1,1];
1347}
Craig Topper5a69a002018-03-21 06:28:42 +00001348def: InstRW<[BWWriteResGroup111], (instregex "SHLD(16|32|64)mri8",
1349 "SHRD(16|32|64)mri8")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001350
1351def BWWriteResGroup112 : SchedWriteRes<[BWPort23,BWPort06,BWPort0156]> {
1352 let Latency = 9;
1353 let NumMicroOps = 5;
1354 let ResourceCycles = [1,1,3];
1355}
1356def: InstRW<[BWWriteResGroup112], (instregex "RDRAND(16|32|64)r")>;
1357
1358def BWWriteResGroup113 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1359 let Latency = 9;
1360 let NumMicroOps = 5;
1361 let ResourceCycles = [1,2,1,1];
1362}
Craig Topper5a69a002018-03-21 06:28:42 +00001363def: InstRW<[BWWriteResGroup113], (instregex "LAR(16|32|64)rm",
1364 "LSL(16|32|64)rm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001365
Gadi Haber323f2e12017-10-24 20:19:47 +00001366def BWWriteResGroup115 : SchedWriteRes<[BWPort0,BWPort23]> {
1367 let Latency = 10;
1368 let NumMicroOps = 2;
1369 let ResourceCycles = [1,1];
1370}
Simon Pilgrime5e4bf02018-04-23 22:45:04 +00001371def: InstRW<[BWWriteResGroup115], (instregex "(V?)PCMPGTQrm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001372
Gadi Haber323f2e12017-10-24 20:19:47 +00001373def BWWriteResGroup117 : SchedWriteRes<[BWPort1,BWPort23]> {
1374 let Latency = 10;
1375 let NumMicroOps = 3;
1376 let ResourceCycles = [2,1];
1377}
Craig Topper5a69a002018-03-21 06:28:42 +00001378def: InstRW<[BWWriteResGroup117], (instregex "FICOM16m",
1379 "FICOM32m",
1380 "FICOMP16m",
1381 "FICOMP32m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001382
1383def BWWriteResGroup118 : SchedWriteRes<[BWPort0,BWPort5,BWPort23]> {
1384 let Latency = 10;
1385 let NumMicroOps = 3;
1386 let ResourceCycles = [1,1,1];
1387}
1388def: InstRW<[BWWriteResGroup118], (instregex "VPTESTYrm")>;
1389
Gadi Haber323f2e12017-10-24 20:19:47 +00001390def BWWriteResGroup120 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23]> {
1391 let Latency = 10;
1392 let NumMicroOps = 4;
1393 let ResourceCycles = [1,1,1,1];
1394}
1395def: InstRW<[BWWriteResGroup120], (instregex "CVTTSS2SI64rm")>;
1396
1397def BWWriteResGroup121 : SchedWriteRes<[BWPort1,BWPort23,BWPort06,BWPort0156]> {
Craig Topper4a3be6e2018-03-22 19:22:51 +00001398 let Latency = 9;
Gadi Haber323f2e12017-10-24 20:19:47 +00001399 let NumMicroOps = 4;
1400 let ResourceCycles = [1,1,1,1];
1401}
Craig Topper4a3be6e2018-03-22 19:22:51 +00001402def: InstRW<[BWWriteResGroup121], (instrs IMUL32m, MUL32m, MULX32rm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001403
Craig Topper8104f262018-04-02 05:33:28 +00001404def BWWriteResGroup122_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1405 let Latency = 11;
1406 let NumMicroOps = 1;
1407 let ResourceCycles = [1,3]; // Really 2.5 cycle throughput
1408}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001409def : SchedAlias<WriteFDiv, BWWriteResGroup122_1>; // TODO - convert to ZnWriteResFpuPair
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_1 : SchedWriteRes<[BWPort0,BWFPDivider]> {
1465 let Latency = 14;
1466 let NumMicroOps = 1;
1467 let ResourceCycles = [1,4];
1468}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001469def : SchedAlias<WriteFDiv64, BWWriteResGroup139_1>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001470
Gadi Haber323f2e12017-10-24 20:19:47 +00001471def BWWriteResGroup141 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1472 let Latency = 14;
1473 let NumMicroOps = 3;
1474 let ResourceCycles = [1,1,1];
1475}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001476def: InstRW<[BWWriteResGroup141], (instregex "MUL_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001477
Gadi Haber323f2e12017-10-24 20:19:47 +00001478def BWWriteResGroup144 : SchedWriteRes<[BWPort1,BWPort6,BWPort23,BWPort0156]> {
1479 let Latency = 14;
1480 let NumMicroOps = 8;
1481 let ResourceCycles = [2,2,1,3];
1482}
1483def: InstRW<[BWWriteResGroup144], (instregex "LAR(16|32|64)rr")>;
1484
1485def BWWriteResGroup145 : SchedWriteRes<[BWPort1,BWPort06,BWPort15,BWPort0156]> {
1486 let Latency = 14;
1487 let NumMicroOps = 10;
1488 let ResourceCycles = [2,3,1,4];
1489}
1490def: InstRW<[BWWriteResGroup145], (instregex "RCR8rCL")>;
1491
1492def BWWriteResGroup146 : SchedWriteRes<[BWPort0,BWPort1,BWPort6,BWPort0156]> {
1493 let Latency = 14;
1494 let NumMicroOps = 12;
1495 let ResourceCycles = [2,1,4,5];
1496}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001497def: InstRW<[BWWriteResGroup146], (instrs XCH_F)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001498
1499def BWWriteResGroup147 : SchedWriteRes<[BWPort0]> {
1500 let Latency = 15;
1501 let NumMicroOps = 1;
1502 let ResourceCycles = [1];
1503}
Craig Topper5a69a002018-03-21 06:28:42 +00001504def: InstRW<[BWWriteResGroup147], (instregex "DIVR_FPrST0",
1505 "DIVR_FST0r",
1506 "DIVR_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001507
Gadi Haber323f2e12017-10-24 20:19:47 +00001508def BWWriteResGroup149 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1509 let Latency = 15;
1510 let NumMicroOps = 10;
1511 let ResourceCycles = [1,1,1,4,1,2];
1512}
Craig Topper13a16502018-03-19 00:56:09 +00001513def: InstRW<[BWWriteResGroup149], (instregex "RCL(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001514
Craig Topper8104f262018-04-02 05:33:28 +00001515def BWWriteResGroup150 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001516 let Latency = 16;
1517 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001518 let ResourceCycles = [1,1,5];
Gadi Haber323f2e12017-10-24 20:19:47 +00001519}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001520def : SchedAlias<WriteFDivLd, BWWriteResGroup150>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001521
Gadi Haber323f2e12017-10-24 20:19:47 +00001522def BWWriteResGroup153 : SchedWriteRes<[BWPort4,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1523 let Latency = 16;
1524 let NumMicroOps = 14;
1525 let ResourceCycles = [1,1,1,4,2,5];
1526}
1527def: InstRW<[BWWriteResGroup153], (instregex "CMPXCHG8B")>;
1528
1529def BWWriteResGroup154 : SchedWriteRes<[BWPort5]> {
1530 let Latency = 16;
1531 let NumMicroOps = 16;
1532 let ResourceCycles = [16];
1533}
Craig Topper5a69a002018-03-21 06:28:42 +00001534def: InstRW<[BWWriteResGroup154], (instrs VZEROALL)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001535
Gadi Haber323f2e12017-10-24 20:19:47 +00001536def BWWriteResGroup159 : SchedWriteRes<[BWPort5,BWPort6,BWPort06,BWPort0156]> {
1537 let Latency = 18;
1538 let NumMicroOps = 8;
1539 let ResourceCycles = [1,1,1,5];
1540}
Craig Topper5a69a002018-03-21 06:28:42 +00001541def: InstRW<[BWWriteResGroup159], (instrs CPUID)>;
Craig Topper2d451e72018-03-18 08:38:06 +00001542def: InstRW<[BWWriteResGroup159], (instrs RDTSC)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001543
1544def BWWriteResGroup160 : SchedWriteRes<[BWPort1,BWPort23,BWPort237,BWPort06,BWPort15,BWPort0156]> {
1545 let Latency = 18;
1546 let NumMicroOps = 11;
1547 let ResourceCycles = [2,1,1,3,1,3];
1548}
Craig Topper13a16502018-03-19 00:56:09 +00001549def: InstRW<[BWWriteResGroup160], (instregex "RCR(8|16|32|64)mCL")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001550
Craig Topper8104f262018-04-02 05:33:28 +00001551def BWWriteResGroup161 : SchedWriteRes<[BWPort0,BWPort23,BWFPDivider]> {
Gadi Haber323f2e12017-10-24 20:19:47 +00001552 let Latency = 19;
1553 let NumMicroOps = 2;
Craig Topper8104f262018-04-02 05:33:28 +00001554 let ResourceCycles = [1,1,8];
Gadi Haber323f2e12017-10-24 20:19:47 +00001555}
Simon Pilgrimac5d0a32018-05-07 16:15:46 +00001556def : SchedAlias<WriteFDiv64Ld, BWWriteResGroup161>; // TODO - convert to ZnWriteResFpuPair
Gadi Haber323f2e12017-10-24 20:19:47 +00001557
Gadi Haber323f2e12017-10-24 20:19:47 +00001558def BWWriteResGroup165 : SchedWriteRes<[BWPort0]> {
1559 let Latency = 20;
1560 let NumMicroOps = 1;
1561 let ResourceCycles = [1];
1562}
Craig Topper5a69a002018-03-21 06:28:42 +00001563def: InstRW<[BWWriteResGroup165], (instregex "DIV_FPrST0",
1564 "DIV_FST0r",
Craig Toppercdfcf8e2018-03-26 05:05:10 +00001565 "DIV_FrST0")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001566
Gadi Haber323f2e12017-10-24 20:19:47 +00001567def BWWriteResGroup167 : SchedWriteRes<[BWPort4,BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1568 let Latency = 20;
1569 let NumMicroOps = 8;
1570 let ResourceCycles = [1,1,1,1,1,1,2];
1571}
Simon Pilgrimaef5ca72018-04-27 13:32:42 +00001572def: InstRW<[BWWriteResGroup167], (instrs INSB, INSL, INSW)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001573
Gadi Haber323f2e12017-10-24 20:19:47 +00001574def BWWriteResGroup169 : SchedWriteRes<[BWPort0,BWPort23]> {
1575 let Latency = 21;
1576 let NumMicroOps = 2;
1577 let ResourceCycles = [1,1];
1578}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001579def: InstRW<[BWWriteResGroup169], (instregex "DIV_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001580
Gadi Haber323f2e12017-10-24 20:19:47 +00001581def BWWriteResGroup171 : SchedWriteRes<[BWPort0,BWPort4,BWPort5,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1582 let Latency = 21;
1583 let NumMicroOps = 19;
1584 let ResourceCycles = [2,1,4,1,1,4,6];
1585}
1586def: InstRW<[BWWriteResGroup171], (instregex "CMPXCHG16B")>;
1587
1588def BWWriteResGroup172 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1589 let Latency = 22;
1590 let NumMicroOps = 18;
1591 let ResourceCycles = [1,1,16];
1592}
1593def: InstRW<[BWWriteResGroup172], (instregex "POPF64")>;
1594
Gadi Haber323f2e12017-10-24 20:19:47 +00001595def BWWriteResGroup176 : SchedWriteRes<[BWPort6,BWPort23,BWPort0156]> {
1596 let Latency = 23;
1597 let NumMicroOps = 19;
1598 let ResourceCycles = [3,1,15];
1599}
Craig Topper391c6f92017-12-10 01:24:08 +00001600def: InstRW<[BWWriteResGroup176], (instregex "XRSTOR(64)?")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001601
1602def BWWriteResGroup177 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1603 let Latency = 24;
1604 let NumMicroOps = 3;
1605 let ResourceCycles = [1,1,1];
1606}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001607def: InstRW<[BWWriteResGroup177], (instregex "DIV_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001608
Gadi Haber323f2e12017-10-24 20:19:47 +00001609def BWWriteResGroup180 : SchedWriteRes<[BWPort0,BWPort23]> {
1610 let Latency = 26;
1611 let NumMicroOps = 2;
1612 let ResourceCycles = [1,1];
1613}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001614def: InstRW<[BWWriteResGroup180], (instregex "DIVR_F(32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001615
Gadi Haber323f2e12017-10-24 20:19:47 +00001616def BWWriteResGroup182 : SchedWriteRes<[BWPort0,BWPort1,BWPort23]> {
1617 let Latency = 29;
1618 let NumMicroOps = 3;
1619 let ResourceCycles = [1,1,1];
1620}
Simon Pilgrim8ee7d012018-04-27 21:14:19 +00001621def: InstRW<[BWWriteResGroup182], (instregex "DIVR_FI(16|32)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001622
Gadi Haber323f2e12017-10-24 20:19:47 +00001623def BWWriteResGroup183_1 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1624 let Latency = 22;
1625 let NumMicroOps = 7;
1626 let ResourceCycles = [1,3,2,1];
1627}
Craig Topper17a31182017-12-16 18:35:29 +00001628def: InstRW<[BWWriteResGroup183_1], (instrs VGATHERQPDrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001629
1630def BWWriteResGroup183_2 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1631 let Latency = 23;
1632 let NumMicroOps = 9;
1633 let ResourceCycles = [1,3,4,1];
1634}
Craig Topper17a31182017-12-16 18:35:29 +00001635def: InstRW<[BWWriteResGroup183_2], (instrs VGATHERQPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001636
1637def BWWriteResGroup183_3 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1638 let Latency = 24;
1639 let NumMicroOps = 9;
1640 let ResourceCycles = [1,5,2,1];
1641}
Craig Topper17a31182017-12-16 18:35:29 +00001642def: InstRW<[BWWriteResGroup183_3], (instrs VGATHERQPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001643
1644def BWWriteResGroup183_4 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1645 let Latency = 25;
1646 let NumMicroOps = 7;
1647 let ResourceCycles = [1,3,2,1];
1648}
Craig Topper17a31182017-12-16 18:35:29 +00001649def: InstRW<[BWWriteResGroup183_4], (instrs VGATHERDPDrm,
1650 VGATHERDPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001651
1652def BWWriteResGroup183_5 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1653 let Latency = 26;
1654 let NumMicroOps = 9;
1655 let ResourceCycles = [1,5,2,1];
1656}
Craig Topper17a31182017-12-16 18:35:29 +00001657def: InstRW<[BWWriteResGroup183_5], (instrs VGATHERDPDYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001658
1659def BWWriteResGroup183_6 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1660 let Latency = 26;
1661 let NumMicroOps = 14;
Simon Pilgrimc21deec2018-03-24 19:37:28 +00001662 let ResourceCycles = [1,4,8,1];
Gadi Haber323f2e12017-10-24 20:19:47 +00001663}
Craig Topper17a31182017-12-16 18:35:29 +00001664def: InstRW<[BWWriteResGroup183_6], (instrs VGATHERDPSYrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001665
1666def BWWriteResGroup183_7 : SchedWriteRes<[BWPort4, BWPort5, BWPort23, BWPort0156]> {
1667 let Latency = 27;
1668 let NumMicroOps = 9;
1669 let ResourceCycles = [1,5,2,1];
1670}
Craig Topper17a31182017-12-16 18:35:29 +00001671def: InstRW<[BWWriteResGroup183_7], (instrs VGATHERQPSrm)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001672
Gadi Haber323f2e12017-10-24 20:19:47 +00001673def BWWriteResGroup185 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1674 let Latency = 29;
1675 let NumMicroOps = 27;
1676 let ResourceCycles = [1,5,1,1,19];
1677}
1678def: InstRW<[BWWriteResGroup185], (instregex "XSAVE64")>;
1679
1680def BWWriteResGroup186 : SchedWriteRes<[BWPort4,BWPort6,BWPort23,BWPort237,BWPort0156]> {
1681 let Latency = 30;
1682 let NumMicroOps = 28;
1683 let ResourceCycles = [1,6,1,1,19];
1684}
Craig Topper2d451e72018-03-18 08:38:06 +00001685def: InstRW<[BWWriteResGroup186], (instregex "^XSAVE$", "XSAVEC", "XSAVES", "XSAVEOPT")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001686
Gadi Haber323f2e12017-10-24 20:19:47 +00001687def BWWriteResGroup190 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1688 let Latency = 34;
1689 let NumMicroOps = 8;
1690 let ResourceCycles = [2,2,2,1,1];
1691}
Craig Topper13a16502018-03-19 00:56:09 +00001692def: InstRW<[BWWriteResGroup190], (instregex "DIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001693
1694def BWWriteResGroup191 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort06,BWPort0156]> {
1695 let Latency = 34;
1696 let NumMicroOps = 23;
1697 let ResourceCycles = [1,5,3,4,10];
1698}
Craig Topper5a69a002018-03-21 06:28:42 +00001699def: InstRW<[BWWriteResGroup191], (instregex "IN(8|16|32)ri",
1700 "IN(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001701
1702def BWWriteResGroup193 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort23,BWPort0156]> {
1703 let Latency = 35;
1704 let NumMicroOps = 8;
1705 let ResourceCycles = [2,2,2,1,1];
1706}
Craig Topper13a16502018-03-19 00:56:09 +00001707def: InstRW<[BWWriteResGroup193], (instregex "IDIV(8|16|32|64)m")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001708
1709def BWWriteResGroup194 : SchedWriteRes<[BWPort5,BWPort6,BWPort23,BWPort237,BWPort06,BWPort0156]> {
1710 let Latency = 35;
1711 let NumMicroOps = 23;
1712 let ResourceCycles = [1,5,2,1,4,10];
1713}
Craig Topper5a69a002018-03-21 06:28:42 +00001714def: InstRW<[BWWriteResGroup194], (instregex "OUT(8|16|32)ir",
1715 "OUT(8|16|32)rr")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001716
Gadi Haber323f2e12017-10-24 20:19:47 +00001717def BWWriteResGroup196 : SchedWriteRes<[BWPort5,BWPort0156]> {
1718 let Latency = 42;
1719 let NumMicroOps = 22;
1720 let ResourceCycles = [2,20];
1721}
Craig Topper2d451e72018-03-18 08:38:06 +00001722def: InstRW<[BWWriteResGroup196], (instrs RDTSCP)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001723
1724def BWWriteResGroup197 : SchedWriteRes<[BWPort0,BWPort01,BWPort23,BWPort05,BWPort06,BWPort015,BWPort0156]> {
1725 let Latency = 60;
1726 let NumMicroOps = 64;
1727 let ResourceCycles = [2,2,8,1,10,2,39];
1728}
1729def: InstRW<[BWWriteResGroup197], (instregex "FLDENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001730
1731def BWWriteResGroup198 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1732 let Latency = 63;
1733 let NumMicroOps = 88;
1734 let ResourceCycles = [4,4,31,1,2,1,45];
1735}
Craig Topper2d451e72018-03-18 08:38:06 +00001736def: InstRW<[BWWriteResGroup198], (instrs FXRSTOR64)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001737
1738def BWWriteResGroup199 : SchedWriteRes<[BWPort0,BWPort6,BWPort23,BWPort05,BWPort06,BWPort15,BWPort0156]> {
1739 let Latency = 63;
1740 let NumMicroOps = 90;
1741 let ResourceCycles = [4,2,33,1,2,1,47];
1742}
Craig Topper2d451e72018-03-18 08:38:06 +00001743def: InstRW<[BWWriteResGroup199], (instrs FXRSTOR)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001744
1745def BWWriteResGroup200 : SchedWriteRes<[BWPort5,BWPort01,BWPort0156]> {
1746 let Latency = 75;
1747 let NumMicroOps = 15;
1748 let ResourceCycles = [6,3,6];
1749}
Simon Pilgrim8cd01aa2018-04-23 16:10:50 +00001750def: InstRW<[BWWriteResGroup200], (instrs FNINIT)>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001751
1752def BWWriteResGroup201 : SchedWriteRes<[BWPort0,BWPort1,BWPort5,BWPort6,BWPort01,BWPort0156]> {
1753 let Latency = 80;
1754 let NumMicroOps = 32;
1755 let ResourceCycles = [7,7,3,3,1,11];
1756}
1757def: InstRW<[BWWriteResGroup201], (instregex "DIV(16|32|64)r")>;
1758
1759def BWWriteResGroup202 : SchedWriteRes<[BWPort0,BWPort1,BWPort4,BWPort5,BWPort6,BWPort237,BWPort06,BWPort0156]> {
1760 let Latency = 115;
1761 let NumMicroOps = 100;
1762 let ResourceCycles = [9,9,11,8,1,11,21,30];
1763}
1764def: InstRW<[BWWriteResGroup202], (instregex "FSTENVm")>;
Gadi Haber323f2e12017-10-24 20:19:47 +00001765
1766} // SchedModel
1767