1 //=- X86SchedSkylake.td - X86 Skylake Server Scheduling ------*- tablegen -*-=//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file defines the machine model for Skylake Server to support
10 // instruction scheduling and other instruction cost heuristics.
12 //===----------------------------------------------------------------------===//
14 def SkylakeServerModel : SchedMachineModel {
15 // All x86 instructions are modeled as a single micro-op, and SKylake can
16 // decode 6 instructions per cycle.
18 let MicroOpBufferSize = 224; // Based on the reorder buffer.
20 let MispredictPenalty = 14;
22 // Based on the LSD (loop-stream detector) queue size and benchmarking data.
23 let LoopMicroOpBufferSize = 50;
25 // This flag is set to allow the scheduler to assign a default model to
26 // unrecognized opcodes.
27 let CompleteModel = 0;
30 let SchedModel = SkylakeServerModel in {
32 // Skylake Server can issue micro-ops to 8 different ports in one cycle.
34 // Ports 0, 1, 5, and 6 handle all computation.
35 // Port 4 gets the data half of stores. Store data can be available later than
36 // the store address, but since we don't model the latency of stores, we can
38 // Ports 2 and 3 are identical. They handle loads and the address half of
39 // stores. Port 7 can handle address calculations.
40 def SKXPort0 : ProcResource<1>;
41 def SKXPort1 : ProcResource<1>;
42 def SKXPort2 : ProcResource<1>;
43 def SKXPort3 : ProcResource<1>;
44 def SKXPort4 : ProcResource<1>;
45 def SKXPort5 : ProcResource<1>;
46 def SKXPort6 : ProcResource<1>;
47 def SKXPort7 : ProcResource<1>;
49 // Many micro-ops are capable of issuing on multiple ports.
50 def SKXPort01 : ProcResGroup<[SKXPort0, SKXPort1]>;
51 def SKXPort23 : ProcResGroup<[SKXPort2, SKXPort3]>;
52 def SKXPort237 : ProcResGroup<[SKXPort2, SKXPort3, SKXPort7]>;
53 def SKXPort04 : ProcResGroup<[SKXPort0, SKXPort4]>;
54 def SKXPort05 : ProcResGroup<[SKXPort0, SKXPort5]>;
55 def SKXPort06 : ProcResGroup<[SKXPort0, SKXPort6]>;
56 def SKXPort15 : ProcResGroup<[SKXPort1, SKXPort5]>;
57 def SKXPort16 : ProcResGroup<[SKXPort1, SKXPort6]>;
58 def SKXPort56 : ProcResGroup<[SKXPort5, SKXPort6]>;
59 def SKXPort015 : ProcResGroup<[SKXPort0, SKXPort1, SKXPort5]>;
60 def SKXPort056 : ProcResGroup<[SKXPort0, SKXPort5, SKXPort6]>;
61 def SKXPort0156: ProcResGroup<[SKXPort0, SKXPort1, SKXPort5, SKXPort6]>;
63 def SKXDivider : ProcResource<1>; // Integer division issued on port 0.
64 // FP division and sqrt on port 0.
65 def SKXFPDivider : ProcResource<1>;
67 // 60 Entry Unified Scheduler
68 def SKXPortAny : ProcResGroup<[SKXPort0, SKXPort1, SKXPort2, SKXPort3, SKXPort4,
69 SKXPort5, SKXPort6, SKXPort7]> {
73 // Integer loads are 5 cycles, so ReadAfterLd registers needn't be available until 5
74 // cycles after the memory operand.
75 def : ReadAdvance<ReadAfterLd, 5>;
77 // Vector loads are 5/6/7 cycles, so ReadAfterVec*Ld registers needn't be available
78 // until 5/6/7 cycles after the memory operand.
79 def : ReadAdvance<ReadAfterVecLd, 5>;
80 def : ReadAdvance<ReadAfterVecXLd, 6>;
81 def : ReadAdvance<ReadAfterVecYLd, 7>;
83 def : ReadAdvance<ReadInt2Fpu, 0>;
85 // Many SchedWrites are defined in pairs with and without a folded load.
86 // Instructions with folded loads are usually micro-fused, so they only appear
87 // as two micro-ops when queued in the reservation station.
88 // This multiclass defines the resource usage for variants with and without
90 multiclass SKXWriteResPair<X86FoldableSchedWrite SchedRW,
91 list<ProcResourceKind> ExePorts,
92 int Lat, list<int> Res = [1], int UOps = 1,
94 // Register variant is using a single cycle on ExePort.
95 def : WriteRes<SchedRW, ExePorts> {
97 let ResourceCycles = Res;
98 let NumMicroOps = UOps;
101 // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to
102 // the latency (default = 5).
103 def : WriteRes<SchedRW.Folded, !listconcat([SKXPort23], ExePorts)> {
104 let Latency = !add(Lat, LoadLat);
105 let ResourceCycles = !listconcat([1], Res);
106 let NumMicroOps = !add(UOps, 1);
110 // A folded store needs a cycle on port 4 for the store data, and an extra port
111 // 2/3/7 cycle to recompute the address.
112 def : WriteRes<WriteRMW, [SKXPort237,SKXPort4]>;
115 defm : SKXWriteResPair<WriteALU, [SKXPort0156], 1>; // Simple integer ALU op.
116 defm : SKXWriteResPair<WriteADC, [SKXPort06], 1>; // Integer ALU + flags op.
118 // Integer multiplication.
119 defm : SKXWriteResPair<WriteIMul8, [SKXPort1], 3>;
120 defm : SKXWriteResPair<WriteIMul16, [SKXPort1,SKXPort06,SKXPort0156], 4, [1,1,2], 4>;
121 defm : X86WriteRes<WriteIMul16Imm, [SKXPort1,SKXPort0156], 4, [1,1], 2>;
122 defm : X86WriteRes<WriteIMul16ImmLd, [SKXPort1,SKXPort0156,SKXPort23], 8, [1,1,1], 3>;
123 defm : X86WriteRes<WriteIMul16Reg, [SKXPort1], 3, [1], 1>;
124 defm : X86WriteRes<WriteIMul16RegLd, [SKXPort1,SKXPort0156,SKXPort23], 8, [1,1,1], 3>;
125 defm : SKXWriteResPair<WriteIMul32, [SKXPort1,SKXPort06,SKXPort0156], 4, [1,1,1], 3>;
126 defm : SKXWriteResPair<WriteIMul32Imm, [SKXPort1], 3>;
127 defm : SKXWriteResPair<WriteIMul32Reg, [SKXPort1], 3>;
128 defm : SKXWriteResPair<WriteIMul64, [SKXPort1,SKXPort5], 4, [1,1], 2>;
129 defm : SKXWriteResPair<WriteIMul64Imm, [SKXPort1], 3>;
130 defm : SKXWriteResPair<WriteIMul64Reg, [SKXPort1], 3>;
131 def : WriteRes<WriteIMulH, []> { let Latency = 3; }
133 defm : X86WriteRes<WriteBSWAP32, [SKXPort15], 1, [1], 1>;
134 defm : X86WriteRes<WriteBSWAP64, [SKXPort06, SKXPort15], 2, [1,1], 2>;
135 defm : X86WriteRes<WriteCMPXCHG,[SKXPort06, SKXPort0156], 5, [2,3], 5>;
136 defm : X86WriteRes<WriteCMPXCHGRMW,[SKXPort23,SKXPort06,SKXPort0156,SKXPort237,SKXPort4], 8, [1,2,1,1,1], 6>;
137 defm : X86WriteRes<WriteXCHG, [SKXPort0156], 2, [3], 3>;
139 // TODO: Why isn't the SKXDivider used?
140 defm : SKXWriteResPair<WriteDiv8, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
141 defm : X86WriteRes<WriteDiv16, [SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort05,SKXPort0156], 76, [7,2,8,3,1,11], 32>;
142 defm : X86WriteRes<WriteDiv32, [SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort05,SKXPort0156], 76, [7,2,8,3,1,11], 32>;
143 defm : X86WriteRes<WriteDiv64, [SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort05,SKXPort0156], 76, [7,2,8,3,1,11], 32>;
144 defm : X86WriteRes<WriteDiv16Ld, [SKXPort0,SKXPort23,SKXDivider], 29, [1,1,10], 2>;
145 defm : X86WriteRes<WriteDiv32Ld, [SKXPort0,SKXPort23,SKXDivider], 29, [1,1,10], 2>;
146 defm : X86WriteRes<WriteDiv64Ld, [SKXPort0,SKXPort23,SKXDivider], 29, [1,1,10], 2>;
148 defm : X86WriteRes<WriteIDiv8, [SKXPort0, SKXDivider], 25, [1,10], 1>;
149 defm : X86WriteRes<WriteIDiv16, [SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort06,SKXPort0156], 102, [4,2,4,8,14,34], 66>;
150 defm : X86WriteRes<WriteIDiv32, [SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort06,SKXPort0156], 102, [4,2,4,8,14,34], 66>;
151 defm : X86WriteRes<WriteIDiv64, [SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort06,SKXPort0156], 102, [4,2,4,8,14,34], 66>;
152 defm : X86WriteRes<WriteIDiv8Ld, [SKXPort0,SKXPort5,SKXPort23,SKXPort0156], 28, [2,4,1,1], 8>;
153 defm : X86WriteRes<WriteIDiv16Ld, [SKXPort0,SKXPort5,SKXPort23,SKXPort0156], 28, [2,4,1,1], 8>;
154 defm : X86WriteRes<WriteIDiv32Ld, [SKXPort0,SKXPort5,SKXPort23,SKXPort0156], 28, [2,4,1,1], 8>;
155 defm : X86WriteRes<WriteIDiv64Ld, [SKXPort0,SKXPort5,SKXPort23,SKXPort0156], 28, [2,4,1,1], 8>;
157 defm : SKXWriteResPair<WriteCRC32, [SKXPort1], 3>;
159 def : WriteRes<WriteLEA, [SKXPort15]>; // LEA instructions can't fold loads.
161 defm : SKXWriteResPair<WriteCMOV, [SKXPort06], 1, [1], 1>; // Conditional move.
162 defm : X86WriteRes<WriteFCMOV, [SKXPort1], 3, [1], 1>; // x87 conditional move.
163 def : WriteRes<WriteSETCC, [SKXPort06]>; // Setcc.
164 def : WriteRes<WriteSETCCStore, [SKXPort06,SKXPort4,SKXPort237]> {
168 defm : X86WriteRes<WriteLAHFSAHF, [SKXPort06], 1, [1], 1>;
169 defm : X86WriteRes<WriteBitTest, [SKXPort06], 1, [1], 1>;
170 defm : X86WriteRes<WriteBitTestImmLd, [SKXPort06,SKXPort23], 6, [1,1], 2>;
171 defm : X86WriteRes<WriteBitTestRegLd, [SKXPort0156,SKXPort23], 6, [1,1], 2>;
172 defm : X86WriteRes<WriteBitTestSet, [SKXPort06], 1, [1], 1>;
173 defm : X86WriteRes<WriteBitTestSetImmLd, [SKXPort06,SKXPort23], 5, [1,1], 3>;
174 defm : X86WriteRes<WriteBitTestSetRegLd, [SKXPort0156,SKXPort23], 5, [1,1], 2>;
176 // Integer shifts and rotates.
177 defm : SKXWriteResPair<WriteShift, [SKXPort06], 1>;
178 defm : SKXWriteResPair<WriteShiftCL, [SKXPort06], 3, [3], 3>;
179 defm : SKXWriteResPair<WriteRotate, [SKXPort06], 1, [1], 1>;
180 defm : SKXWriteResPair<WriteRotateCL, [SKXPort06], 3, [3], 3>;
183 defm : X86WriteRes<WriteSHDrri, [SKXPort1], 3, [1], 1>;
184 defm : X86WriteRes<WriteSHDrrcl,[SKXPort1,SKXPort06,SKXPort0156], 6, [1, 2, 1], 4>;
185 defm : X86WriteRes<WriteSHDmri, [SKXPort1,SKXPort23,SKXPort237,SKXPort0156], 9, [1, 1, 1, 1], 4>;
186 defm : X86WriteRes<WriteSHDmrcl,[SKXPort1,SKXPort23,SKXPort237,SKXPort06,SKXPort0156], 11, [1, 1, 1, 2, 1], 6>;
189 defm : SKXWriteResPair<WriteBSF, [SKXPort1], 3>;
190 defm : SKXWriteResPair<WriteBSR, [SKXPort1], 3>;
191 defm : SKXWriteResPair<WriteLZCNT, [SKXPort1], 3>;
192 defm : SKXWriteResPair<WriteTZCNT, [SKXPort1], 3>;
193 defm : SKXWriteResPair<WritePOPCNT, [SKXPort1], 3>;
195 // BMI1 BEXTR/BLS, BMI2 BZHI
196 defm : SKXWriteResPair<WriteBEXTR, [SKXPort06,SKXPort15], 2, [1,1], 2>;
197 defm : SKXWriteResPair<WriteBLS, [SKXPort15], 1>;
198 defm : SKXWriteResPair<WriteBZHI, [SKXPort15], 1>;
200 // Loads, stores, and moves, not folded with other operations.
201 defm : X86WriteRes<WriteLoad, [SKXPort23], 5, [1], 1>;
202 defm : X86WriteRes<WriteStore, [SKXPort237, SKXPort4], 1, [1,1], 1>;
203 defm : X86WriteRes<WriteStoreNT, [SKXPort237, SKXPort4], 1, [1,1], 2>;
204 defm : X86WriteRes<WriteMove, [SKXPort0156], 1, [1], 1>;
206 // Idioms that clear a register, like xorps %xmm0, %xmm0.
207 // These can often bypass execution ports completely.
208 def : WriteRes<WriteZero, []>;
210 // Branches don't produce values, so they have no latency, but they still
211 // consume resources. Indirect branches can fold loads.
212 defm : SKXWriteResPair<WriteJump, [SKXPort06], 1>;
214 // Floating point. This covers both scalar and vector operations.
215 defm : X86WriteRes<WriteFLD0, [SKXPort05], 1, [1], 1>;
216 defm : X86WriteRes<WriteFLD1, [SKXPort05], 1, [2], 2>;
217 defm : X86WriteRes<WriteFLDC, [SKXPort05], 1, [2], 2>;
218 defm : X86WriteRes<WriteFLoad, [SKXPort23], 5, [1], 1>;
219 defm : X86WriteRes<WriteFLoadX, [SKXPort23], 6, [1], 1>;
220 defm : X86WriteRes<WriteFLoadY, [SKXPort23], 7, [1], 1>;
221 defm : X86WriteRes<WriteFMaskedLoad, [SKXPort23,SKXPort015], 7, [1,1], 2>;
222 defm : X86WriteRes<WriteFMaskedLoadY, [SKXPort23,SKXPort015], 8, [1,1], 2>;
223 defm : X86WriteRes<WriteFStore, [SKXPort237,SKXPort4], 1, [1,1], 2>;
224 defm : X86WriteRes<WriteFStoreX, [SKXPort237,SKXPort4], 1, [1,1], 2>;
225 defm : X86WriteRes<WriteFStoreY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
226 defm : X86WriteRes<WriteFStoreNT, [SKXPort237,SKXPort4], 1, [1,1], 2>;
227 defm : X86WriteRes<WriteFStoreNTX, [SKXPort237,SKXPort4], 1, [1,1], 2>;
228 defm : X86WriteRes<WriteFStoreNTY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
230 defm : X86WriteRes<WriteFMaskedStore32, [SKXPort237,SKXPort0], 2, [1,1], 2>;
231 defm : X86WriteRes<WriteFMaskedStore32Y, [SKXPort237,SKXPort0], 2, [1,1], 2>;
232 defm : X86WriteRes<WriteFMaskedStore64, [SKXPort237,SKXPort0], 2, [1,1], 2>;
233 defm : X86WriteRes<WriteFMaskedStore64Y, [SKXPort237,SKXPort0], 2, [1,1], 2>;
235 defm : X86WriteRes<WriteFMove, [SKXPort015], 1, [1], 1>;
236 defm : X86WriteRes<WriteFMoveX, [SKXPort015], 1, [1], 1>;
237 defm : X86WriteRes<WriteFMoveY, [SKXPort015], 1, [1], 1>;
238 defm : X86WriteRes<WriteEMMS, [SKXPort05,SKXPort0156], 10, [9,1], 10>;
240 defm : SKXWriteResPair<WriteFAdd, [SKXPort01], 4, [1], 1, 5>; // Floating point add/sub.
241 defm : SKXWriteResPair<WriteFAddX, [SKXPort01], 4, [1], 1, 6>;
242 defm : SKXWriteResPair<WriteFAddY, [SKXPort01], 4, [1], 1, 7>;
243 defm : SKXWriteResPair<WriteFAddZ, [SKXPort05], 4, [1], 1, 7>;
244 defm : SKXWriteResPair<WriteFAdd64, [SKXPort01], 4, [1], 1, 5>; // Floating point double add/sub.
245 defm : SKXWriteResPair<WriteFAdd64X, [SKXPort01], 4, [1], 1, 6>;
246 defm : SKXWriteResPair<WriteFAdd64Y, [SKXPort01], 4, [1], 1, 7>;
247 defm : SKXWriteResPair<WriteFAdd64Z, [SKXPort05], 4, [1], 1, 7>;
249 defm : SKXWriteResPair<WriteFCmp, [SKXPort01], 4, [1], 1, 5>; // Floating point compare.
250 defm : SKXWriteResPair<WriteFCmpX, [SKXPort01], 4, [1], 1, 6>;
251 defm : SKXWriteResPair<WriteFCmpY, [SKXPort01], 4, [1], 1, 7>;
252 defm : SKXWriteResPair<WriteFCmpZ, [SKXPort05], 4, [1], 1, 7>;
253 defm : SKXWriteResPair<WriteFCmp64, [SKXPort01], 4, [1], 1, 5>; // Floating point double compare.
254 defm : SKXWriteResPair<WriteFCmp64X, [SKXPort01], 4, [1], 1, 6>;
255 defm : SKXWriteResPair<WriteFCmp64Y, [SKXPort01], 4, [1], 1, 7>;
256 defm : SKXWriteResPair<WriteFCmp64Z, [SKXPort05], 4, [1], 1, 7>;
258 defm : SKXWriteResPair<WriteFCom, [SKXPort0], 2>; // Floating point compare to flags (X87).
259 defm : SKXWriteResPair<WriteFComX, [SKXPort0], 2>; // Floating point compare to flags (SSE).
261 defm : SKXWriteResPair<WriteFMul, [SKXPort01], 4, [1], 1, 5>; // Floating point multiplication.
262 defm : SKXWriteResPair<WriteFMulX, [SKXPort01], 4, [1], 1, 6>;
263 defm : SKXWriteResPair<WriteFMulY, [SKXPort01], 4, [1], 1, 7>;
264 defm : SKXWriteResPair<WriteFMulZ, [SKXPort05], 4, [1], 1, 7>;
265 defm : SKXWriteResPair<WriteFMul64, [SKXPort01], 4, [1], 1, 5>; // Floating point double multiplication.
266 defm : SKXWriteResPair<WriteFMul64X, [SKXPort01], 4, [1], 1, 6>;
267 defm : SKXWriteResPair<WriteFMul64Y, [SKXPort01], 4, [1], 1, 7>;
268 defm : SKXWriteResPair<WriteFMul64Z, [SKXPort05], 4, [1], 1, 7>;
270 defm : SKXWriteResPair<WriteFDiv, [SKXPort0,SKXFPDivider], 11, [1,3], 1, 5>; // 10-14 cycles. // Floating point division.
271 //defm : SKXWriteResPair<WriteFDivX, [SKXPort0,SKXFPDivider], 11, [1,3], 1, 6>; // 10-14 cycles.
272 defm : SKXWriteResPair<WriteFDivY, [SKXPort0,SKXFPDivider], 11, [1,5], 1, 7>; // 10-14 cycles.
273 defm : SKXWriteResPair<WriteFDivZ, [SKXPort0,SKXPort5,SKXFPDivider], 18, [2,1,10], 3, 7>; // 10-14 cycles.
274 //defm : SKXWriteResPair<WriteFDiv64, [SKXPort0,SKXFPDivider], 14, [1,3], 1, 5>; // 10-14 cycles. // Floating point division.
275 //defm : SKXWriteResPair<WriteFDiv64X, [SKXPort0,SKXFPDivider], 14, [1,3], 1, 6>; // 10-14 cycles.
276 //defm : SKXWriteResPair<WriteFDiv64Y, [SKXPort0,SKXFPDivider], 14, [1,5], 1, 7>; // 10-14 cycles.
277 defm : SKXWriteResPair<WriteFDiv64Z, [SKXPort0,SKXPort5,SKXFPDivider], 23, [2,1,16], 3, 7>; // 10-14 cycles.
279 defm : SKXWriteResPair<WriteFSqrt, [SKXPort0,SKXFPDivider], 12, [1,3], 1, 5>; // Floating point square root.
280 defm : SKXWriteResPair<WriteFSqrtX, [SKXPort0,SKXFPDivider], 12, [1,3], 1, 6>;
281 defm : SKXWriteResPair<WriteFSqrtY, [SKXPort0,SKXFPDivider], 12, [1,6], 1, 7>;
282 defm : SKXWriteResPair<WriteFSqrtZ, [SKXPort0,SKXPort5,SKXFPDivider], 20, [2,1,12], 3, 7>;
283 defm : SKXWriteResPair<WriteFSqrt64, [SKXPort0,SKXFPDivider], 18, [1,6], 1, 5>; // Floating point double square root.
284 defm : SKXWriteResPair<WriteFSqrt64X, [SKXPort0,SKXFPDivider], 18, [1,6], 1, 6>;
285 defm : SKXWriteResPair<WriteFSqrt64Y, [SKXPort0,SKXFPDivider], 18, [1,12],1, 7>;
286 defm : SKXWriteResPair<WriteFSqrt64Z, [SKXPort0,SKXPort5,SKXFPDivider], 32, [2,1,24], 3, 7>;
287 defm : SKXWriteResPair<WriteFSqrt80, [SKXPort0,SKXFPDivider], 21, [1,7]>; // Floating point long double square root.
289 defm : SKXWriteResPair<WriteFRcp, [SKXPort0], 4, [1], 1, 5>; // Floating point reciprocal estimate.
290 defm : SKXWriteResPair<WriteFRcpX, [SKXPort0], 4, [1], 1, 6>;
291 defm : SKXWriteResPair<WriteFRcpY, [SKXPort0], 4, [1], 1, 7>;
292 defm : SKXWriteResPair<WriteFRcpZ, [SKXPort0,SKXPort5], 4, [2,1], 3, 7>;
294 defm : SKXWriteResPair<WriteFRsqrt, [SKXPort0], 4, [1], 1, 5>; // Floating point reciprocal square root estimate.
295 defm : SKXWriteResPair<WriteFRsqrtX,[SKXPort0], 4, [1], 1, 6>;
296 defm : SKXWriteResPair<WriteFRsqrtY,[SKXPort0], 4, [1], 1, 7>;
297 defm : SKXWriteResPair<WriteFRsqrtZ,[SKXPort0,SKXPort5], 9, [2,1], 3, 7>;
299 defm : SKXWriteResPair<WriteFMA, [SKXPort01], 4, [1], 1, 5>; // Fused Multiply Add.
300 defm : SKXWriteResPair<WriteFMAX, [SKXPort01], 4, [1], 1, 6>;
301 defm : SKXWriteResPair<WriteFMAY, [SKXPort01], 4, [1], 1, 7>;
302 defm : SKXWriteResPair<WriteFMAZ, [SKXPort05], 4, [1], 1, 7>;
303 defm : SKXWriteResPair<WriteDPPD, [SKXPort5,SKXPort015], 9, [1,2], 3, 6>; // Floating point double dot product.
304 defm : SKXWriteResPair<WriteDPPS, [SKXPort5,SKXPort015], 13, [1,3], 4, 6>;
305 defm : SKXWriteResPair<WriteDPPSY,[SKXPort5,SKXPort015], 13, [1,3], 4, 7>;
306 defm : SKXWriteResPair<WriteDPPSZ,[SKXPort5,SKXPort015], 13, [1,3], 4, 7>;
307 defm : SKXWriteResPair<WriteFSign, [SKXPort0], 1>; // Floating point fabs/fchs.
308 defm : SKXWriteResPair<WriteFRnd, [SKXPort01], 8, [2], 2, 6>; // Floating point rounding.
309 defm : SKXWriteResPair<WriteFRndY, [SKXPort01], 8, [2], 2, 7>;
310 defm : SKXWriteResPair<WriteFRndZ, [SKXPort05], 8, [2], 2, 7>;
311 defm : SKXWriteResPair<WriteFLogic, [SKXPort015], 1, [1], 1, 6>; // Floating point and/or/xor logicals.
312 defm : SKXWriteResPair<WriteFLogicY, [SKXPort015], 1, [1], 1, 7>;
313 defm : SKXWriteResPair<WriteFLogicZ, [SKXPort05], 1, [1], 1, 7>;
314 defm : SKXWriteResPair<WriteFTest, [SKXPort0], 2, [1], 1, 6>; // Floating point TEST instructions.
315 defm : SKXWriteResPair<WriteFTestY, [SKXPort0], 2, [1], 1, 7>;
316 defm : SKXWriteResPair<WriteFTestZ, [SKXPort0], 2, [1], 1, 7>;
317 defm : SKXWriteResPair<WriteFShuffle, [SKXPort5], 1, [1], 1, 6>; // Floating point vector shuffles.
318 defm : SKXWriteResPair<WriteFShuffleY, [SKXPort5], 1, [1], 1, 7>;
319 defm : SKXWriteResPair<WriteFShuffleZ, [SKXPort5], 1, [1], 1, 7>;
320 defm : SKXWriteResPair<WriteFVarShuffle, [SKXPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
321 defm : SKXWriteResPair<WriteFVarShuffleY, [SKXPort5], 1, [1], 1, 7>;
322 defm : SKXWriteResPair<WriteFVarShuffleZ, [SKXPort5], 1, [1], 1, 7>;
323 defm : SKXWriteResPair<WriteFBlend, [SKXPort015], 1, [1], 1, 6>; // Floating point vector blends.
324 defm : SKXWriteResPair<WriteFBlendY,[SKXPort015], 1, [1], 1, 7>;
325 defm : SKXWriteResPair<WriteFBlendZ,[SKXPort015], 1, [1], 1, 7>;
326 defm : SKXWriteResPair<WriteFVarBlend, [SKXPort015], 2, [2], 2, 6>; // Fp vector variable blends.
327 defm : SKXWriteResPair<WriteFVarBlendY,[SKXPort015], 2, [2], 2, 7>;
328 defm : SKXWriteResPair<WriteFVarBlendZ,[SKXPort015], 2, [2], 2, 7>;
330 // FMA Scheduling helper class.
331 // class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
333 // Vector integer operations.
334 defm : X86WriteRes<WriteVecLoad, [SKXPort23], 5, [1], 1>;
335 defm : X86WriteRes<WriteVecLoadX, [SKXPort23], 6, [1], 1>;
336 defm : X86WriteRes<WriteVecLoadY, [SKXPort23], 7, [1], 1>;
337 defm : X86WriteRes<WriteVecLoadNT, [SKXPort23], 6, [1], 1>;
338 defm : X86WriteRes<WriteVecLoadNTY, [SKXPort23], 7, [1], 1>;
339 defm : X86WriteRes<WriteVecMaskedLoad, [SKXPort23,SKXPort015], 7, [1,1], 2>;
340 defm : X86WriteRes<WriteVecMaskedLoadY, [SKXPort23,SKXPort015], 8, [1,1], 2>;
341 defm : X86WriteRes<WriteVecStore, [SKXPort237,SKXPort4], 1, [1,1], 2>;
342 defm : X86WriteRes<WriteVecStoreX, [SKXPort237,SKXPort4], 1, [1,1], 2>;
343 defm : X86WriteRes<WriteVecStoreY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
344 defm : X86WriteRes<WriteVecStoreNT, [SKXPort237,SKXPort4], 1, [1,1], 2>;
345 defm : X86WriteRes<WriteVecStoreNTY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
346 defm : X86WriteRes<WriteVecMaskedStore32, [SKXPort237,SKXPort0], 2, [1,1], 2>;
347 defm : X86WriteRes<WriteVecMaskedStore32Y, [SKXPort237,SKXPort0], 2, [1,1], 2>;
348 defm : X86WriteRes<WriteVecMaskedStore64, [SKXPort237,SKXPort0], 2, [1,1], 2>;
349 defm : X86WriteRes<WriteVecMaskedStore64Y, [SKXPort237,SKXPort0], 2, [1,1], 2>;
350 defm : X86WriteRes<WriteVecMove, [SKXPort05], 1, [1], 1>;
351 defm : X86WriteRes<WriteVecMoveX, [SKXPort015], 1, [1], 1>;
352 defm : X86WriteRes<WriteVecMoveY, [SKXPort015], 1, [1], 1>;
353 defm : X86WriteRes<WriteVecMoveToGpr, [SKXPort0], 2, [1], 1>;
354 defm : X86WriteRes<WriteVecMoveFromGpr, [SKXPort5], 1, [1], 1>;
356 defm : SKXWriteResPair<WriteVecALU, [SKXPort05], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
357 defm : SKXWriteResPair<WriteVecALUX, [SKXPort01], 1, [1], 1, 6>;
358 defm : SKXWriteResPair<WriteVecALUY, [SKXPort01], 1, [1], 1, 7>;
359 defm : SKXWriteResPair<WriteVecALUZ, [SKXPort0], 1, [1], 1, 7>;
360 defm : SKXWriteResPair<WriteVecLogic, [SKXPort05], 1, [1], 1, 5>; // Vector integer and/or/xor.
361 defm : SKXWriteResPair<WriteVecLogicX,[SKXPort015], 1, [1], 1, 6>;
362 defm : SKXWriteResPair<WriteVecLogicY,[SKXPort015], 1, [1], 1, 7>;
363 defm : SKXWriteResPair<WriteVecLogicZ,[SKXPort05], 1, [1], 1, 7>;
364 defm : SKXWriteResPair<WriteVecTest, [SKXPort0,SKXPort5], 3, [1,1], 2, 6>; // Vector integer TEST instructions.
365 defm : SKXWriteResPair<WriteVecTestY, [SKXPort0,SKXPort5], 3, [1,1], 2, 7>;
366 defm : SKXWriteResPair<WriteVecTestZ, [SKXPort0,SKXPort5], 3, [1,1], 2, 7>;
367 defm : SKXWriteResPair<WriteVecIMul, [SKXPort0], 5, [1], 1, 5>; // Vector integer multiply.
368 defm : SKXWriteResPair<WriteVecIMulX, [SKXPort01], 5, [1], 1, 6>;
369 defm : SKXWriteResPair<WriteVecIMulY, [SKXPort01], 5, [1], 1, 7>;
370 defm : SKXWriteResPair<WriteVecIMulZ, [SKXPort05], 5, [1], 1, 7>;
371 defm : SKXWriteResPair<WritePMULLD, [SKXPort01], 10, [2], 2, 6>; // Vector PMULLD.
372 defm : SKXWriteResPair<WritePMULLDY, [SKXPort01], 10, [2], 2, 7>;
373 defm : SKXWriteResPair<WritePMULLDZ, [SKXPort05], 10, [2], 2, 7>;
374 defm : SKXWriteResPair<WriteShuffle, [SKXPort5], 1, [1], 1, 5>; // Vector shuffles.
375 defm : SKXWriteResPair<WriteShuffleX, [SKXPort5], 1, [1], 1, 6>;
376 defm : SKXWriteResPair<WriteShuffleY, [SKXPort5], 1, [1], 1, 7>;
377 defm : SKXWriteResPair<WriteShuffleZ, [SKXPort5], 1, [1], 1, 7>;
378 defm : SKXWriteResPair<WriteVarShuffle, [SKXPort5], 1, [1], 1, 5>; // Vector variable shuffles.
379 defm : SKXWriteResPair<WriteVarShuffleX, [SKXPort5], 1, [1], 1, 6>;
380 defm : SKXWriteResPair<WriteVarShuffleY, [SKXPort5], 1, [1], 1, 7>;
381 defm : SKXWriteResPair<WriteVarShuffleZ, [SKXPort5], 1, [1], 1, 7>;
382 defm : SKXWriteResPair<WriteBlend, [SKXPort5], 1, [1], 1, 6>; // Vector blends.
383 defm : SKXWriteResPair<WriteBlendY,[SKXPort5], 1, [1], 1, 7>;
384 defm : SKXWriteResPair<WriteBlendZ,[SKXPort5], 1, [1], 1, 7>;
385 defm : SKXWriteResPair<WriteVarBlend, [SKXPort015], 2, [2], 2, 6>; // Vector variable blends.
386 defm : SKXWriteResPair<WriteVarBlendY,[SKXPort015], 2, [2], 2, 6>;
387 defm : SKXWriteResPair<WriteVarBlendZ,[SKXPort05], 2, [1], 1, 6>;
388 defm : SKXWriteResPair<WriteMPSAD, [SKXPort5], 4, [2], 2, 6>; // Vector MPSAD.
389 defm : SKXWriteResPair<WriteMPSADY, [SKXPort5], 4, [2], 2, 7>;
390 defm : SKXWriteResPair<WriteMPSADZ, [SKXPort5], 4, [2], 2, 7>;
391 defm : SKXWriteResPair<WritePSADBW, [SKXPort5], 3, [1], 1, 5>; // Vector PSADBW.
392 defm : SKXWriteResPair<WritePSADBWX, [SKXPort5], 3, [1], 1, 6>;
393 defm : SKXWriteResPair<WritePSADBWY, [SKXPort5], 3, [1], 1, 7>;
394 defm : SKXWriteResPair<WritePSADBWZ, [SKXPort5], 3, [1], 1, 7>;
395 defm : SKXWriteResPair<WritePHMINPOS, [SKXPort0], 4, [1], 1, 6>; // Vector PHMINPOS.
397 // Vector integer shifts.
398 defm : SKXWriteResPair<WriteVecShift, [SKXPort0], 1, [1], 1, 5>;
399 defm : X86WriteRes<WriteVecShiftX, [SKXPort5,SKXPort01], 2, [1,1], 2>;
400 defm : X86WriteRes<WriteVecShiftY, [SKXPort5,SKXPort01], 4, [1,1], 2>;
401 defm : X86WriteRes<WriteVecShiftZ, [SKXPort5,SKXPort0], 4, [1,1], 2>;
402 defm : X86WriteRes<WriteVecShiftXLd, [SKXPort01,SKXPort23], 7, [1,1], 2>;
403 defm : X86WriteRes<WriteVecShiftYLd, [SKXPort01,SKXPort23], 8, [1,1], 2>;
404 defm : X86WriteRes<WriteVecShiftZLd, [SKXPort0,SKXPort23], 8, [1,1], 2>;
406 defm : SKXWriteResPair<WriteVecShiftImm, [SKXPort0], 1, [1], 1, 5>;
407 defm : SKXWriteResPair<WriteVecShiftImmX, [SKXPort01], 1, [1], 1, 6>; // Vector integer immediate shifts.
408 defm : SKXWriteResPair<WriteVecShiftImmY, [SKXPort01], 1, [1], 1, 7>;
409 defm : SKXWriteResPair<WriteVecShiftImmZ, [SKXPort0], 1, [1], 1, 7>;
410 defm : SKXWriteResPair<WriteVarVecShift, [SKXPort01], 1, [1], 1, 6>; // Variable vector shifts.
411 defm : SKXWriteResPair<WriteVarVecShiftY, [SKXPort01], 1, [1], 1, 7>;
412 defm : SKXWriteResPair<WriteVarVecShiftZ, [SKXPort0], 1, [1], 1, 7>;
414 // Vector insert/extract operations.
415 def : WriteRes<WriteVecInsert, [SKXPort5]> {
418 let ResourceCycles = [2];
420 def : WriteRes<WriteVecInsertLd, [SKXPort5,SKXPort23]> {
424 def: InstRW<[WriteVecInsertLd], (instregex "(V?)MOV(H|L)(PD|PS)rm")>;
426 def : WriteRes<WriteVecExtract, [SKXPort0,SKXPort5]> {
430 def : WriteRes<WriteVecExtractSt, [SKXPort4,SKXPort5,SKXPort237]> {
435 // Conversion between integer and float.
436 defm : SKXWriteResPair<WriteCvtSS2I, [SKXPort01], 6, [2], 2>; // Needs more work: DD vs DQ.
437 defm : SKXWriteResPair<WriteCvtPS2I, [SKXPort01], 3>;
438 defm : SKXWriteResPair<WriteCvtPS2IY, [SKXPort01], 3>;
439 defm : SKXWriteResPair<WriteCvtPS2IZ, [SKXPort05], 3>;
440 defm : SKXWriteResPair<WriteCvtSD2I, [SKXPort01], 6, [2], 2>;
441 defm : SKXWriteResPair<WriteCvtPD2I, [SKXPort01], 3>;
442 defm : SKXWriteResPair<WriteCvtPD2IY, [SKXPort01], 3>;
443 defm : SKXWriteResPair<WriteCvtPD2IZ, [SKXPort05], 3>;
445 defm : SKXWriteResPair<WriteCvtI2SS, [SKXPort1], 4>;
446 defm : SKXWriteResPair<WriteCvtI2PS, [SKXPort01], 4>;
447 defm : SKXWriteResPair<WriteCvtI2PSY, [SKXPort01], 4>;
448 defm : SKXWriteResPair<WriteCvtI2PSZ, [SKXPort05], 4>; // Needs more work: DD vs DQ.
449 defm : SKXWriteResPair<WriteCvtI2SD, [SKXPort1], 4>;
450 defm : SKXWriteResPair<WriteCvtI2PD, [SKXPort01], 4>;
451 defm : SKXWriteResPair<WriteCvtI2PDY, [SKXPort01], 4>;
452 defm : SKXWriteResPair<WriteCvtI2PDZ, [SKXPort05], 4>;
454 defm : SKXWriteResPair<WriteCvtSS2SD, [SKXPort1], 3>;
455 defm : SKXWriteResPair<WriteCvtPS2PD, [SKXPort1], 3>;
456 defm : SKXWriteResPair<WriteCvtPS2PDY, [SKXPort5,SKXPort01], 3, [1,1], 2>;
457 defm : SKXWriteResPair<WriteCvtPS2PDZ, [SKXPort05], 3, [2], 2>;
458 defm : SKXWriteResPair<WriteCvtSD2SS, [SKXPort1], 3>;
459 defm : SKXWriteResPair<WriteCvtPD2PS, [SKXPort1], 3>;
460 defm : SKXWriteResPair<WriteCvtPD2PSY, [SKXPort5,SKXPort01], 3, [1,1], 2>;
461 defm : SKXWriteResPair<WriteCvtPD2PSZ, [SKXPort05], 3, [2], 2>;
463 defm : X86WriteRes<WriteCvtPH2PS, [SKXPort5,SKXPort01], 5, [1,1], 2>;
464 defm : X86WriteRes<WriteCvtPH2PSY, [SKXPort5,SKXPort01], 7, [1,1], 2>;
465 defm : X86WriteRes<WriteCvtPH2PSZ, [SKXPort5,SKXPort0], 7, [1,1], 2>;
466 defm : X86WriteRes<WriteCvtPH2PSLd, [SKXPort23,SKXPort01], 9, [1,1], 2>;
467 defm : X86WriteRes<WriteCvtPH2PSYLd, [SKXPort23,SKXPort01], 10, [1,1], 2>;
468 defm : X86WriteRes<WriteCvtPH2PSZLd, [SKXPort23,SKXPort05], 10, [1,1], 2>;
470 defm : X86WriteRes<WriteCvtPS2PH, [SKXPort5,SKXPort01], 5, [1,1], 2>;
471 defm : X86WriteRes<WriteCvtPS2PHY, [SKXPort5,SKXPort01], 7, [1,1], 2>;
472 defm : X86WriteRes<WriteCvtPS2PHZ, [SKXPort5,SKXPort05], 7, [1,1], 2>;
473 defm : X86WriteRes<WriteCvtPS2PHSt, [SKXPort4,SKXPort5,SKXPort237,SKXPort01], 6, [1,1,1,1], 4>;
474 defm : X86WriteRes<WriteCvtPS2PHYSt, [SKXPort4,SKXPort5,SKXPort237,SKXPort01], 8, [1,1,1,1], 4>;
475 defm : X86WriteRes<WriteCvtPS2PHZSt, [SKXPort4,SKXPort5,SKXPort237,SKXPort05], 8, [1,1,1,1], 4>;
477 // Strings instructions.
479 // Packed Compare Implicit Length Strings, Return Mask
480 def : WriteRes<WritePCmpIStrM, [SKXPort0]> {
483 let ResourceCycles = [3];
485 def : WriteRes<WritePCmpIStrMLd, [SKXPort0, SKXPort23]> {
488 let ResourceCycles = [3,1];
491 // Packed Compare Explicit Length Strings, Return Mask
492 def : WriteRes<WritePCmpEStrM, [SKXPort0, SKXPort5, SKXPort015, SKXPort0156]> {
495 let ResourceCycles = [4,3,1,1];
497 def : WriteRes<WritePCmpEStrMLd, [SKXPort0, SKXPort5, SKXPort23, SKXPort015, SKXPort0156]> {
499 let NumMicroOps = 10;
500 let ResourceCycles = [4,3,1,1,1];
503 // Packed Compare Implicit Length Strings, Return Index
504 def : WriteRes<WritePCmpIStrI, [SKXPort0]> {
507 let ResourceCycles = [3];
509 def : WriteRes<WritePCmpIStrILd, [SKXPort0, SKXPort23]> {
512 let ResourceCycles = [3,1];
515 // Packed Compare Explicit Length Strings, Return Index
516 def : WriteRes<WritePCmpEStrI, [SKXPort0,SKXPort5,SKXPort0156]> {
519 let ResourceCycles = [4,3,1];
521 def : WriteRes<WritePCmpEStrILd, [SKXPort0, SKXPort5, SKXPort23, SKXPort0156]> {
524 let ResourceCycles = [4,3,1,1];
527 // MOVMSK Instructions.
528 def : WriteRes<WriteFMOVMSK, [SKXPort0]> { let Latency = 2; }
529 def : WriteRes<WriteVecMOVMSK, [SKXPort0]> { let Latency = 2; }
530 def : WriteRes<WriteVecMOVMSKY, [SKXPort0]> { let Latency = 2; }
531 def : WriteRes<WriteMMXMOVMSK, [SKXPort0]> { let Latency = 2; }
534 def : WriteRes<WriteAESDecEnc, [SKXPort0]> { // Decryption, encryption.
537 let ResourceCycles = [1];
539 def : WriteRes<WriteAESDecEncLd, [SKXPort0, SKXPort23]> {
542 let ResourceCycles = [1,1];
545 def : WriteRes<WriteAESIMC, [SKXPort0]> { // InvMixColumn.
548 let ResourceCycles = [2];
550 def : WriteRes<WriteAESIMCLd, [SKXPort0, SKXPort23]> {
553 let ResourceCycles = [2,1];
556 def : WriteRes<WriteAESKeyGen, [SKXPort0,SKXPort5,SKXPort015]> { // Key Generation.
558 let NumMicroOps = 11;
559 let ResourceCycles = [3,6,2];
561 def : WriteRes<WriteAESKeyGenLd, [SKXPort0,SKXPort5,SKXPort23,SKXPort015]> {
563 let NumMicroOps = 11;
564 let ResourceCycles = [3,6,1,1];
567 // Carry-less multiplication instructions.
568 def : WriteRes<WriteCLMul, [SKXPort5]> {
571 let ResourceCycles = [1];
573 def : WriteRes<WriteCLMulLd, [SKXPort5, SKXPort23]> {
576 let ResourceCycles = [1,1];
579 // Catch-all for expensive system instructions.
580 def : WriteRes<WriteSystem, [SKXPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
583 defm : SKXWriteResPair<WriteFShuffle256, [SKXPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
584 defm : SKXWriteResPair<WriteFVarShuffle256, [SKXPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
585 defm : SKXWriteResPair<WriteShuffle256, [SKXPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
586 defm : SKXWriteResPair<WriteVarShuffle256, [SKXPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
588 // Old microcoded instructions that nobody use.
589 def : WriteRes<WriteMicrocoded, [SKXPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
591 // Fence instructions.
592 def : WriteRes<WriteFence, [SKXPort23, SKXPort4]>;
595 def : WriteRes<WriteLDMXCSR, [SKXPort0,SKXPort23,SKXPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
596 def : WriteRes<WriteSTMXCSR, [SKXPort4,SKXPort5,SKXPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
598 // Nop, not very useful expect it provides a model for nops!
599 def : WriteRes<WriteNop, []>;
601 ////////////////////////////////////////////////////////////////////////////////
602 // Horizontal add/sub instructions.
603 ////////////////////////////////////////////////////////////////////////////////
605 defm : SKXWriteResPair<WriteFHAdd, [SKXPort5,SKXPort015], 6, [2,1], 3, 6>;
606 defm : SKXWriteResPair<WriteFHAddY, [SKXPort5,SKXPort015], 6, [2,1], 3, 7>;
607 defm : SKXWriteResPair<WritePHAdd, [SKXPort5,SKXPort05], 3, [2,1], 3, 5>;
608 defm : SKXWriteResPair<WritePHAddX, [SKXPort5,SKXPort015], 3, [2,1], 3, 6>;
609 defm : SKXWriteResPair<WritePHAddY, [SKXPort5,SKXPort015], 3, [2,1], 3, 7>;
613 def SKXWriteResGroup1 : SchedWriteRes<[SKXPort0]> {
616 let ResourceCycles = [1];
618 def: InstRW<[SKXWriteResGroup1], (instregex "KAND(B|D|Q|W)rr",
625 "KSET0(B|D|Q|W)", // Same as KXOR
626 "KSET1(B|D|Q|W)", // Same as KXNOR
628 "MMX_PADDUS(B|W)irr",
630 "MMX_PCMPEQ(B|D|W)irr",
631 "MMX_PCMPGT(B|D|W)irr",
632 "MMX_P(MAX|MIN)SWirr",
633 "MMX_P(MAX|MIN)UBirr",
635 "MMX_PSUBUS(B|W)irr",
636 "VPMOVB2M(Z|Z128|Z256)rr",
637 "VPMOVD2M(Z|Z128|Z256)rr",
638 "VPMOVQ2M(Z|Z128|Z256)rr",
639 "VPMOVW2M(Z|Z128|Z256)rr")>;
641 def SKXWriteResGroup3 : SchedWriteRes<[SKXPort5]> {
644 let ResourceCycles = [1];
646 def: InstRW<[SKXWriteResGroup3], (instregex "COM(P?)_FST0r",
650 def SKXWriteResGroup4 : SchedWriteRes<[SKXPort6]> {
653 let ResourceCycles = [1];
655 def: InstRW<[SKXWriteResGroup4], (instregex "JMP(16|32|64)r")>;
657 def SKXWriteResGroup6 : SchedWriteRes<[SKXPort05]> {
660 let ResourceCycles = [1];
662 def: InstRW<[SKXWriteResGroup6], (instrs FINCSTP, FNOP)>;
664 def SKXWriteResGroup7 : SchedWriteRes<[SKXPort06]> {
667 let ResourceCycles = [1];
669 def: InstRW<[SKXWriteResGroup7], (instrs CDQ, CQO, CLAC, STAC)>;
671 def SKXWriteResGroup8 : SchedWriteRes<[SKXPort15]> {
674 let ResourceCycles = [1];
676 def: InstRW<[SKXWriteResGroup8], (instregex "ANDN(32|64)rr")>;
678 def SKXWriteResGroup9 : SchedWriteRes<[SKXPort015]> {
681 let ResourceCycles = [1];
683 def: InstRW<[SKXWriteResGroup9], (instregex "VBLENDMPD(Z128|Z256)rr",
684 "VBLENDMPS(Z128|Z256)rr",
685 "VPADD(B|D|Q|W)(Y|Z|Z128|Z256)rr",
686 "(V?)PADD(B|D|Q|W)rr",
688 "VPBLENDMB(Z128|Z256)rr",
689 "VPBLENDMD(Z128|Z256)rr",
690 "VPBLENDMQ(Z128|Z256)rr",
691 "VPBLENDMW(Z128|Z256)rr",
692 "VPSUB(B|D|Q|W)(Y|Z|Z128|Z256)rrk",
693 "VPTERNLOGD(Z|Z128|Z256)rri",
694 "VPTERNLOGQ(Z|Z128|Z256)rri")>;
696 def SKXWriteResGroup10 : SchedWriteRes<[SKXPort0156]> {
699 let ResourceCycles = [1];
701 def: InstRW<[SKXWriteResGroup10], (instrs CBW, CWDE, CDQE,
709 def SKXWriteResGroup11 : SchedWriteRes<[SKXPort4,SKXPort237]> {
712 let ResourceCycles = [1,1];
714 def: InstRW<[SKXWriteResGroup11], (instrs FBSTPm, VMPTRSTm)>;
715 def: InstRW<[SKXWriteResGroup11], (instregex "KMOV(B|D|Q|W)mk",
716 "ST_FP(32|64|80)m")>;
718 def SKXWriteResGroup13 : SchedWriteRes<[SKXPort5]> {
721 let ResourceCycles = [2];
723 def: InstRW<[SKXWriteResGroup13], (instrs MMX_MOVQ2DQrr)>;
725 def SKXWriteResGroup14 : SchedWriteRes<[SKXPort05]> {
728 let ResourceCycles = [2];
730 def: InstRW<[SKXWriteResGroup14], (instrs FDECSTP,
733 def SKXWriteResGroup17 : SchedWriteRes<[SKXPort0156]> {
736 let ResourceCycles = [2];
738 def: InstRW<[SKXWriteResGroup17], (instrs LFENCE,
742 def SKXWriteResGroup20 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
745 let ResourceCycles = [1,1];
747 def: InstRW<[SKXWriteResGroup20], (instregex "CLFLUSH")>;
749 def SKXWriteResGroup21 : SchedWriteRes<[SKXPort237,SKXPort0156]> {
752 let ResourceCycles = [1,1];
754 def: InstRW<[SKXWriteResGroup21], (instrs SFENCE)>;
756 def SKXWriteResGroup23 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
759 let ResourceCycles = [1,1];
761 def: InstRW<[SKXWriteResGroup23], (instrs CWD,
766 ADC64i32, SBB64i32)>;
768 def SKXWriteResGroup25 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort237]> {
771 let ResourceCycles = [1,1,1];
773 def: InstRW<[SKXWriteResGroup25], (instrs FNSTCW16m)>;
775 def SKXWriteResGroup27 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort15]> {
778 let ResourceCycles = [1,1,1];
780 def: InstRW<[SKXWriteResGroup27], (instregex "MOVBE(16|32|64)mr")>;
782 def SKXWriteResGroup28 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort0156]> {
785 let ResourceCycles = [1,1,1];
787 def: InstRW<[SKXWriteResGroup28], (instrs PUSH16r, PUSH32r, PUSH64r, PUSH64i8,
788 STOSB, STOSL, STOSQ, STOSW)>;
789 def: InstRW<[SKXWriteResGroup28], (instregex "PUSH(16|32|64)rmr")>;
791 def SKXWriteResGroup29 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort15]> {
794 let ResourceCycles = [2,2,1];
796 def: InstRW<[SKXWriteResGroup29], (instregex "VMOVDQU8Zmr(b?)")>;
798 def SKXWriteResGroup30 : SchedWriteRes<[SKXPort0]> {
801 let ResourceCycles = [1];
803 def: InstRW<[SKXWriteResGroup30], (instregex "KMOV(B|D|Q|W)rk",
804 "KORTEST(B|D|Q|W)rr",
805 "KTEST(B|D|Q|W)rr")>;
807 def SKXWriteResGroup31 : SchedWriteRes<[SKXPort1]> {
810 let ResourceCycles = [1];
812 def: InstRW<[SKXWriteResGroup31], (instregex "PDEP(32|64)rr",
815 def SKXWriteResGroup32 : SchedWriteRes<[SKXPort5]> {
818 let ResourceCycles = [1];
820 def: InstRW<[SKXWriteResGroup32], (instrs VPSADBWZrr)>; // TODO: 512-bit ops require ports 0/1 to be joined.
821 def: InstRW<[SKXWriteResGroup32], (instregex "(ADD|SUB|SUBR)_(FPrST0|FST0r|FrST0)",
822 "VALIGND(Z|Z128|Z256)rri",
823 "VALIGNQ(Z|Z128|Z256)rri",
824 "VDBPSADBWZrri", // TODO: 512-bit ops require ports 0/1 to be joined.
825 "VPBROADCAST(B|W)rr",
826 "VP(MAX|MIN)(S|U)Q(Z|Z128|Z256)rr")>;
828 def SKXWriteResGroup33 : SchedWriteRes<[SKXPort5]> {
831 let ResourceCycles = [1];
833 def: InstRW<[SKXWriteResGroup33], (instregex "KADD(B|D|Q|W)rr",
834 "KSHIFTL(B|D|Q|W)ri",
835 "KSHIFTR(B|D|Q|W)ri",
836 "KUNPCK(BW|DQ|WD)rr",
837 "VCMPPD(Z|Z128|Z256)rri",
838 "VCMPPS(Z|Z128|Z256)rri",
840 "VFPCLASS(PD|PS)(Z|Z128|Z256)rr",
841 "VFPCLASS(SD|SS)Zrr",
842 "VPCMPB(Z|Z128|Z256)rri",
843 "VPCMPD(Z|Z128|Z256)rri",
844 "VPCMPEQ(B|D|Q|W)(Z|Z128|Z256)rr",
845 "VPCMPGT(B|D|Q|W)(Z|Z128|Z256)rr",
846 "VPCMPQ(Z|Z128|Z256)rri",
847 "VPCMPU(B|D|Q|W)(Z|Z128|Z256)rri",
848 "VPCMPW(Z|Z128|Z256)rri",
849 "VPTEST(N?)M(B|D|Q|W)(Z|Z128|Z256)rr")>;
851 def SKXWriteResGroup34 : SchedWriteRes<[SKXPort0,SKXPort0156]> {
854 let ResourceCycles = [1,1];
856 def: InstRW<[SKXWriteResGroup34], (instrs FNSTSW16r)>;
858 def SKXWriteResGroup37 : SchedWriteRes<[SKXPort0,SKXPort5]> {
861 let ResourceCycles = [1,2];
863 def: InstRW<[SKXWriteResGroup37], (instregex "MMX_PH(ADD|SUB)SWrr")>;
865 def SKXWriteResGroup38 : SchedWriteRes<[SKXPort5,SKXPort01]> {
868 let ResourceCycles = [2,1];
870 def: InstRW<[SKXWriteResGroup38], (instregex "(V?)PH(ADD|SUB)SW(Y?)rr")>;
872 def SKXWriteResGroup41 : SchedWriteRes<[SKXPort5,SKXPort0156]> {
875 let ResourceCycles = [2,1];
877 def: InstRW<[SKXWriteResGroup41], (instrs MMX_PACKSSDWirr,
881 def SKXWriteResGroup42 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
884 let ResourceCycles = [1,2];
886 def: InstRW<[SKXWriteResGroup42], (instregex "CLD")>;
888 def SKXWriteResGroup43 : SchedWriteRes<[SKXPort237,SKXPort0156]> {
891 let ResourceCycles = [1,2];
893 def: InstRW<[SKXWriteResGroup43], (instrs MFENCE)>;
895 def SKXWriteResGroup44 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
898 let ResourceCycles = [1,2];
900 def: InstRW<[SKXWriteResGroup44], (instregex "RCL(8|16|32|64)r(1|i)",
901 "RCR(8|16|32|64)r(1|i)")>;
903 def SKXWriteResGroup45 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237]> {
906 let ResourceCycles = [1,1,1];
908 def: InstRW<[SKXWriteResGroup45], (instrs FNSTSWm)>;
910 def SKXWriteResGroup47 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort237,SKXPort0156]> {
913 let ResourceCycles = [1,1,1,1];
915 def: InstRW<[SKXWriteResGroup47], (instregex "CALL(16|32|64)r")>;
917 def SKXWriteResGroup48 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort06,SKXPort0156]> {
920 let ResourceCycles = [1,1,1,1];
922 def: InstRW<[SKXWriteResGroup48], (instrs CALL64pcrel32)>;
924 def SKXWriteResGroup49 : SchedWriteRes<[SKXPort0]> {
927 let ResourceCycles = [1];
929 def: InstRW<[SKXWriteResGroup49], (instregex "MUL_(FPrST0|FST0r|FrST0)")>;
931 def SKXWriteResGroup50 : SchedWriteRes<[SKXPort01]> {
934 let ResourceCycles = [1];
936 def: InstRW<[SKXWriteResGroup50], (instregex "VCVTDQ2PS(Y|Z128|Z256)rr",
938 "VCVTPD2QQ(Z128|Z256)rr",
939 "VCVTPD2UQQ(Z128|Z256)rr",
940 "VCVTPS2DQ(Y|Z128|Z256)rr",
942 "VCVTPS2UDQ(Z128|Z256)rr",
943 "VCVTQQ2PD(Z128|Z256)rr",
944 "VCVTTPD2QQ(Z128|Z256)rr",
945 "VCVTTPD2UQQ(Z128|Z256)rr",
946 "VCVTTPS2DQ(Z128|Z256)rr",
948 "VCVTTPS2UDQ(Z128|Z256)rr",
949 "VCVTUDQ2PS(Z128|Z256)rr",
950 "VCVTUQQ2PD(Z128|Z256)rr")>;
952 def SKXWriteResGroup50z : SchedWriteRes<[SKXPort05]> {
955 let ResourceCycles = [1];
957 def: InstRW<[SKXWriteResGroup50z], (instrs VCVTDQ2PSZrr,
970 def SKXWriteResGroup51 : SchedWriteRes<[SKXPort5]> {
973 let ResourceCycles = [2];
975 def: InstRW<[SKXWriteResGroup51], (instregex "VEXPANDPD(Z|Z128|Z256)rr",
976 "VEXPANDPS(Z|Z128|Z256)rr",
977 "VPEXPANDD(Z|Z128|Z256)rr",
978 "VPEXPANDQ(Z|Z128|Z256)rr",
979 "VPMOVDB(Z|Z128|Z256)rr",
980 "VPMOVDW(Z|Z128|Z256)rr",
981 "VPMOVQB(Z|Z128|Z256)rr",
982 "VPMOVQW(Z|Z128|Z256)rr",
983 "VPMOVSDB(Z|Z128|Z256)rr",
984 "VPMOVSDW(Z|Z128|Z256)rr",
985 "VPMOVSQB(Z|Z128|Z256)rr",
986 "VPMOVSQD(Z|Z128|Z256)rr",
987 "VPMOVSQW(Z|Z128|Z256)rr",
988 "VPMOVSWB(Z|Z128|Z256)rr",
989 "VPMOVUSDB(Z|Z128|Z256)rr",
990 "VPMOVUSDW(Z|Z128|Z256)rr",
991 "VPMOVUSQB(Z|Z128|Z256)rr",
992 "VPMOVUSQD(Z|Z128|Z256)rr",
993 "VPMOVUSWB(Z|Z128|Z256)rr",
994 "VPMOVWB(Z|Z128|Z256)rr")>;
996 def SKXWriteResGroup54 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort237]> {
999 let ResourceCycles = [1,1,1];
1001 def: InstRW<[SKXWriteResGroup54], (instregex "IST(T?)_FP(16|32|64)m",
1003 "VPMOVQD(Z|Z128|Z256)mr(b?)")>;
1005 def SKXWriteResGroup55 : SchedWriteRes<[SKXPort0156]> {
1007 let NumMicroOps = 4;
1008 let ResourceCycles = [4];
1010 def: InstRW<[SKXWriteResGroup55], (instrs FNCLEX)>;
1012 def SKXWriteResGroup56 : SchedWriteRes<[]> {
1014 let NumMicroOps = 4;
1015 let ResourceCycles = [];
1017 def: InstRW<[SKXWriteResGroup56], (instrs VZEROUPPER)>;
1019 def SKXWriteResGroup57 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort0156]> {
1021 let NumMicroOps = 4;
1022 let ResourceCycles = [1,1,2];
1024 def: InstRW<[SKXWriteResGroup57], (instregex "LAR(16|32|64)rr")>;
1026 def SKXWriteResGroup58 : SchedWriteRes<[SKXPort23]> {
1028 let NumMicroOps = 1;
1029 let ResourceCycles = [1];
1031 def: InstRW<[SKXWriteResGroup58], (instregex "MOVSX(16|32|64)rm(8|16|32)",
1032 "MOVZX(16|32|64)rm(8|16)",
1033 "(V?)MOVDDUPrm")>; // TODO: Should this be SKXWriteResGroup71?
1035 def SKXWriteResGroup61 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1037 let NumMicroOps = 2;
1038 let ResourceCycles = [1,1];
1040 def: InstRW<[SKXWriteResGroup61], (instregex "MMX_CVT(T?)PD2PIirr",
1041 "MMX_CVT(T?)PS2PIirr",
1044 "(V?)CVT(T?)PD2DQrr",
1053 "(V?)CVTSD2SS(Z?)rr",
1054 "(V?)CVTSI(64)?2SDrr",
1057 "VCVTSI(64)?2SDZrr",
1061 "VCVTTPD2UDQZ128rr",
1063 "VCVTTPS2UQQZ128rr",
1067 "VCVTUSI(64)?2SDZrr")>;
1069 def SKXWriteResGroup62 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1071 let NumMicroOps = 3;
1072 let ResourceCycles = [2,1];
1074 def: InstRW<[SKXWriteResGroup62], (instregex "VPCONFLICTQZ128rr")>;
1076 def SKXWriteResGroup63 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort06]> {
1078 let NumMicroOps = 3;
1079 let ResourceCycles = [1,1,1];
1081 def: InstRW<[SKXWriteResGroup63], (instregex "STR(16|32|64)r")>;
1083 def SKXWriteResGroup65 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort015]> {
1085 let NumMicroOps = 3;
1086 let ResourceCycles = [1,1,1];
1088 def: InstRW<[SKXWriteResGroup65], (instregex "VCVTPS2PHZ128mr(b?)",
1089 "VCVTPS2PHZ256mr(b?)",
1090 "VCVTPS2PHZmr(b?)")>;
1092 def SKXWriteResGroup66 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort237]> {
1094 let NumMicroOps = 4;
1095 let ResourceCycles = [1,2,1];
1097 def: InstRW<[SKXWriteResGroup66], (instregex "VPMOVDB(Z|Z128|Z256)mr(b?)",
1098 "VPMOVDW(Z|Z128|Z256)mr(b?)",
1099 "VPMOVQB(Z|Z128|Z256)mr(b?)",
1100 "VPMOVQW(Z|Z128|Z256)mr(b?)",
1101 "VPMOVSDB(Z|Z128|Z256)mr(b?)",
1102 "VPMOVSDW(Z|Z128|Z256)mr(b?)",
1103 "VPMOVSQB(Z|Z128|Z256)mr(b?)",
1104 "VPMOVSQD(Z|Z128|Z256)mr(b?)",
1105 "VPMOVSQW(Z|Z128|Z256)mr(b?)",
1106 "VPMOVSWB(Z|Z128|Z256)mr(b?)",
1107 "VPMOVUSDB(Z|Z128|Z256)mr(b?)",
1108 "VPMOVUSDW(Z|Z128|Z256)mr(b?)",
1109 "VPMOVUSQB(Z|Z128|Z256)mr(b?)",
1110 "VPMOVUSQD(Z|Z128|Z256)mr(b?)",
1111 "VPMOVUSQW(Z|Z128|Z256)mr(b?)",
1112 "VPMOVUSWB(Z|Z128|Z256)mr(b?)",
1113 "VPMOVWB(Z|Z128|Z256)mr(b?)")>;
1115 def SKXWriteResGroup67 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
1117 let NumMicroOps = 5;
1118 let ResourceCycles = [1,4];
1120 def: InstRW<[SKXWriteResGroup67], (instrs XSETBV)>;
1122 def SKXWriteResGroup69 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort0156]> {
1124 let NumMicroOps = 6;
1125 let ResourceCycles = [1,1,4];
1127 def: InstRW<[SKXWriteResGroup69], (instregex "PUSHF(16|64)")>;
1129 def SKXWriteResGroup71 : SchedWriteRes<[SKXPort23]> {
1131 let NumMicroOps = 1;
1132 let ResourceCycles = [1];
1134 def: InstRW<[SKXWriteResGroup71], (instrs VBROADCASTSSrm,
1142 def SKXWriteResGroup72 : SchedWriteRes<[SKXPort5]> {
1144 let NumMicroOps = 2;
1145 let ResourceCycles = [2];
1147 def: InstRW<[SKXWriteResGroup72], (instrs MMX_CVTPI2PSirr)>;
1148 def: InstRW<[SKXWriteResGroup72], (instregex "VCOMPRESSPD(Z|Z128|Z256)rr",
1149 "VCOMPRESSPS(Z|Z128|Z256)rr",
1150 "VPCOMPRESSD(Z|Z128|Z256)rr",
1151 "VPCOMPRESSQ(Z|Z128|Z256)rr",
1152 "VPERMW(Z|Z128|Z256)rr")>;
1154 def SKXWriteResGroup73 : SchedWriteRes<[SKXPort0,SKXPort23]> {
1156 let NumMicroOps = 2;
1157 let ResourceCycles = [1,1];
1159 def: InstRW<[SKXWriteResGroup73], (instrs MMX_PADDSBirm,
1180 def SKXWriteResGroup76 : SchedWriteRes<[SKXPort6,SKXPort23]> {
1182 let NumMicroOps = 2;
1183 let ResourceCycles = [1,1];
1185 def: InstRW<[SKXWriteResGroup76], (instrs FARJMP64m)>;
1186 def: InstRW<[SKXWriteResGroup76], (instregex "JMP(16|32|64)m")>;
1188 def SKXWriteResGroup79 : SchedWriteRes<[SKXPort23,SKXPort15]> {
1190 let NumMicroOps = 2;
1191 let ResourceCycles = [1,1];
1193 def: InstRW<[SKXWriteResGroup79], (instregex "ANDN(32|64)rm",
1194 "MOVBE(16|32|64)rm")>;
1196 def SKXWriteResGroup80 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1198 let NumMicroOps = 2;
1199 let ResourceCycles = [1,1];
1201 def: InstRW<[SKXWriteResGroup80], (instregex "VMOV(64to|QI2)PQIZrm(b?)")>;
1202 def: InstRW<[SKXWriteResGroup80], (instrs VMOVDI2PDIZrm)>;
1204 def SKXWriteResGroup81 : SchedWriteRes<[SKXPort23,SKXPort0156]> {
1206 let NumMicroOps = 2;
1207 let ResourceCycles = [1,1];
1209 def: InstRW<[SKXWriteResGroup81], (instrs POP16r, POP32r, POP64r)>;
1210 def: InstRW<[SKXWriteResGroup81], (instregex "POP(16|32|64)rmr")>;
1212 def SKXWriteResGroup82 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1214 let NumMicroOps = 3;
1215 let ResourceCycles = [2,1];
1217 def: InstRW<[SKXWriteResGroup82], (instregex "(V?)CVTSI642SSrr",
1219 "VCVTUSI642SSZrr")>;
1221 def SKXWriteResGroup84 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort06,SKXPort0156]> {
1223 let NumMicroOps = 4;
1224 let ResourceCycles = [1,1,1,1];
1226 def: InstRW<[SKXWriteResGroup84], (instregex "SLDT(16|32|64)r")>;
1228 def SKXWriteResGroup86 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06]> {
1230 let NumMicroOps = 4;
1231 let ResourceCycles = [1,1,1,1];
1233 def: InstRW<[SKXWriteResGroup86], (instregex "SAR(8|16|32|64)m(1|i)",
1234 "SHL(8|16|32|64)m(1|i)",
1235 "SHR(8|16|32|64)m(1|i)")>;
1237 def SKXWriteResGroup87 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort0156]> {
1239 let NumMicroOps = 4;
1240 let ResourceCycles = [1,1,1,1];
1242 def: InstRW<[SKXWriteResGroup87], (instregex "POP(16|32|64)rmm",
1243 "PUSH(16|32|64)rmm")>;
1245 def SKXWriteResGroup88 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
1247 let NumMicroOps = 6;
1248 let ResourceCycles = [1,5];
1250 def: InstRW<[SKXWriteResGroup88], (instrs STD)>;
1252 def SKXWriteResGroup89 : SchedWriteRes<[SKXPort23]> {
1254 let NumMicroOps = 1;
1255 let ResourceCycles = [1];
1257 def: InstRW<[SKXWriteResGroup89], (instregex "LD_F(32|64|80)m")>;
1258 def: InstRW<[SKXWriteResGroup89], (instrs VBROADCASTF128,
1268 def SKXWriteResGroup90 : SchedWriteRes<[SKXPort01,SKXPort5]> {
1270 let NumMicroOps = 2;
1271 let ResourceCycles = [1,1];
1273 def: InstRW<[SKXWriteResGroup90], (instrs VCVTDQ2PDYrr)>;
1275 def SKXWriteResGroup92 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1277 let NumMicroOps = 2;
1278 let ResourceCycles = [1,1];
1280 def: InstRW<[SKXWriteResGroup92], (instregex "VMOVSDZrm(b?)",
1283 def SKXWriteResGroup92a : SchedWriteRes<[SKXPort5,SKXPort23]> {
1285 let NumMicroOps = 2;
1286 let ResourceCycles = [1,1];
1288 def: InstRW<[SKXWriteResGroup92a], (instregex "(V?)PMOV(SX|ZX)BDrm",
1289 "(V?)PMOV(SX|ZX)BQrm",
1290 "(V?)PMOV(SX|ZX)BWrm",
1291 "(V?)PMOV(SX|ZX)DQrm",
1292 "(V?)PMOV(SX|ZX)WDrm",
1293 "(V?)PMOV(SX|ZX)WQrm")>;
1295 def SKXWriteResGroup93 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1297 let NumMicroOps = 2;
1298 let ResourceCycles = [1,1];
1300 def: InstRW<[SKXWriteResGroup93], (instregex "VCVTDQ2PDZ256rr",
1301 "VCVTPD2DQ(Y|Z256)rr",
1302 "VCVTPD2PS(Y|Z256)rr",
1304 "VCVTPS2PD(Y|Z256)rr",
1308 "VCVTTPD2DQ(Y|Z256)rr",
1309 "VCVTTPD2UDQZ256rr",
1311 "VCVTTPS2UQQZ256rr",
1313 "VCVTUQQ2PSZ256rr")>;
1315 def SKXWriteResGroup93z : SchedWriteRes<[SKXPort5,SKXPort05]> {
1317 let NumMicroOps = 2;
1318 let ResourceCycles = [1,1];
1320 def: InstRW<[SKXWriteResGroup93z], (instrs VCVTDQ2PDZrr,
1335 def SKXWriteResGroup95 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1337 let NumMicroOps = 2;
1338 let ResourceCycles = [1,1];
1340 def: InstRW<[SKXWriteResGroup95], (instrs VMOVNTDQAZ128rm,
1342 def: InstRW<[SKXWriteResGroup95, ReadAfterVecXLd],
1343 (instregex "VBLENDMPDZ128rm(b?)",
1344 "VBLENDMPSZ128rm(b?)",
1345 "VBROADCASTI32X2Z128rm(b?)",
1346 "VBROADCASTSSZ128rm(b?)",
1347 "VINSERT(F|I)128rm",
1348 "VMOVAPDZ128rm(b?)",
1349 "VMOVAPSZ128rm(b?)",
1350 "VMOVDDUPZ128rm(b?)",
1351 "VMOVDQA32Z128rm(b?)",
1352 "VMOVDQA64Z128rm(b?)",
1353 "VMOVDQU16Z128rm(b?)",
1354 "VMOVDQU32Z128rm(b?)",
1355 "VMOVDQU64Z128rm(b?)",
1356 "VMOVDQU8Z128rm(b?)",
1357 "VMOVSHDUPZ128rm(b?)",
1358 "VMOVSLDUPZ128rm(b?)",
1359 "VMOVUPDZ128rm(b?)",
1360 "VMOVUPSZ128rm(b?)",
1361 "VPADD(B|D|Q|W)Z128rm(b?)",
1362 "(V?)PADD(B|D|Q|W)rm",
1363 "VPBLENDM(B|D|Q|W)Z128rm(b?)",
1364 "VPBROADCASTDZ128rm(b?)",
1365 "VPBROADCASTQZ128rm(b?)",
1366 "VPSUB(B|D|Q|W)Z128rm(b?)",
1367 "(V?)PSUB(B|D|Q|W)rm",
1368 "VPTERNLOGDZ128rm(b?)i",
1369 "VPTERNLOGQZ128rm(b?)i")>;
1371 def SKXWriteResGroup96 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1373 let NumMicroOps = 3;
1374 let ResourceCycles = [2,1];
1376 def: InstRW<[SKXWriteResGroup96], (instrs MMX_PACKSSDWirm,
1380 def SKXWriteResGroup97 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1382 let NumMicroOps = 3;
1383 let ResourceCycles = [2,1];
1385 def: InstRW<[SKXWriteResGroup97], (instregex "VPERMI2W128rr",
1392 def SKXWriteResGroup99 : SchedWriteRes<[SKXPort23,SKXPort0156]> {
1394 let NumMicroOps = 3;
1395 let ResourceCycles = [1,2];
1397 def: InstRW<[SKXWriteResGroup99], (instrs LEAVE, LEAVE64,
1398 SCASB, SCASL, SCASQ, SCASW)>;
1400 def SKXWriteResGroup100 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort015]> {
1402 let NumMicroOps = 3;
1403 let ResourceCycles = [1,1,1];
1405 def: InstRW<[SKXWriteResGroup100], (instregex "VCVTSS2USI64Zrr",
1406 "(V?)CVTSS2SI64(Z?)rr",
1407 "(V?)CVTTSS2SI64(Z?)rr",
1408 "VCVTTSS2USI64Zrr")>;
1410 def SKXWriteResGroup101 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort05]> {
1412 let NumMicroOps = 3;
1413 let ResourceCycles = [1,1,1];
1415 def: InstRW<[SKXWriteResGroup101], (instrs FLDCW16m)>;
1417 def SKXWriteResGroup103 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort0156]> {
1419 let NumMicroOps = 3;
1420 let ResourceCycles = [1,1,1];
1422 def: InstRW<[SKXWriteResGroup103], (instregex "KMOV(B|D|Q|W)km")>;
1424 def SKXWriteResGroup104 : SchedWriteRes<[SKXPort6,SKXPort23,SKXPort0156]> {
1426 let NumMicroOps = 3;
1427 let ResourceCycles = [1,1,1];
1429 def: InstRW<[SKXWriteResGroup104], (instrs LRETQ, RETQ)>;
1431 def SKXWriteResGroup106 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort237]> {
1433 let NumMicroOps = 4;
1434 let ResourceCycles = [1,2,1];
1436 def: InstRW<[SKXWriteResGroup106], (instregex "VCOMPRESSPD(Z|Z128|Z256)mr(b?)",
1437 "VCOMPRESSPS(Z|Z128|Z256)mr(b?)",
1438 "VPCOMPRESSD(Z|Z128|Z256)mr(b?)",
1439 "VPCOMPRESSQ(Z|Z128|Z256)mr(b?)")>;
1441 def SKXWriteResGroup107 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06]> {
1443 let NumMicroOps = 5;
1444 let ResourceCycles = [1,1,1,2];
1446 def: InstRW<[SKXWriteResGroup107], (instregex "ROL(8|16|32|64)m(1|i)",
1447 "ROR(8|16|32|64)m(1|i)")>;
1449 def SKXWriteResGroup107_1 : SchedWriteRes<[SKXPort06]> {
1451 let NumMicroOps = 2;
1452 let ResourceCycles = [2];
1454 def: InstRW<[SKXWriteResGroup107_1], (instrs ROL8r1, ROL16r1, ROL32r1, ROL64r1,
1455 ROR8r1, ROR16r1, ROR32r1, ROR64r1)>;
1457 def SKXWriteResGroup108 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort0156]> {
1459 let NumMicroOps = 5;
1460 let ResourceCycles = [1,1,1,2];
1462 def: InstRW<[SKXWriteResGroup108], (instregex "XADD(8|16|32|64)rm")>;
1464 def SKXWriteResGroup109 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort0156]> {
1466 let NumMicroOps = 5;
1467 let ResourceCycles = [1,1,1,1,1];
1469 def: InstRW<[SKXWriteResGroup109], (instregex "CALL(16|32|64)m")>;
1470 def: InstRW<[SKXWriteResGroup109], (instrs FARCALL64m)>;
1472 def SKXWriteResGroup110 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237,SKXPort0156]> {
1474 let NumMicroOps = 7;
1475 let ResourceCycles = [1,2,2,2];
1477 def: InstRW<[SKXWriteResGroup110], (instrs VPSCATTERDQZ128mr,
1480 VSCATTERQPDZ128mr)>;
1482 def SKXWriteResGroup111 : SchedWriteRes<[SKXPort6,SKXPort06,SKXPort15,SKXPort0156]> {
1484 let NumMicroOps = 7;
1485 let ResourceCycles = [1,3,1,2];
1487 def: InstRW<[SKXWriteResGroup111], (instrs LOOP)>;
1489 def SKXWriteResGroup112 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237,SKXPort0156]> {
1491 let NumMicroOps = 11;
1492 let ResourceCycles = [1,4,4,2];
1494 def: InstRW<[SKXWriteResGroup112], (instrs VPSCATTERDQZ256mr,
1497 VSCATTERQPDZ256mr)>;
1499 def SKXWriteResGroup113 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237,SKXPort0156]> {
1501 let NumMicroOps = 19;
1502 let ResourceCycles = [1,8,8,2];
1504 def: InstRW<[SKXWriteResGroup113], (instrs VPSCATTERDQZmr,
1509 def SKXWriteResGroup114 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1511 let NumMicroOps = 36;
1512 let ResourceCycles = [1,16,1,16,2];
1514 def: InstRW<[SKXWriteResGroup114], (instrs VSCATTERDPSZmr)>;
1516 def SKXWriteResGroup118 : SchedWriteRes<[SKXPort1,SKXPort23]> {
1518 let NumMicroOps = 2;
1519 let ResourceCycles = [1,1];
1521 def: InstRW<[SKXWriteResGroup118], (instregex "PDEP(32|64)rm",
1524 def SKXWriteResGroup119 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1526 let NumMicroOps = 2;
1527 let ResourceCycles = [1,1];
1529 def: InstRW<[SKXWriteResGroup119], (instregex "FCOM(P?)(32|64)m",
1530 "VPBROADCASTB(Z|Z256)rm(b?)",
1531 "VPBROADCASTW(Z|Z256)rm(b?)")>;
1532 def: InstRW<[SKXWriteResGroup119], (instrs VPBROADCASTBYrm,
1538 def SKXWriteResGroup121 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1540 let NumMicroOps = 2;
1541 let ResourceCycles = [1,1];
1543 def: InstRW<[SKXWriteResGroup121], (instrs VMOVNTDQAZ256rm,
1545 def: InstRW<[SKXWriteResGroup121, ReadAfterVecYLd],
1546 (instregex "VBLENDMPD(Z|Z256)rm(b?)",
1547 "VBLENDMPS(Z|Z256)rm(b?)",
1548 "VBROADCASTF32X2Z256rm(b?)",
1549 "VBROADCASTF32X2Zrm(b?)",
1550 "VBROADCASTF32X4Z256rm(b?)",
1551 "VBROADCASTF32X4rm(b?)",
1552 "VBROADCASTF32X8rm(b?)",
1553 "VBROADCASTF64X2Z128rm(b?)",
1554 "VBROADCASTF64X2rm(b?)",
1555 "VBROADCASTF64X4rm(b?)",
1556 "VBROADCASTI32X2Z256rm(b?)",
1557 "VBROADCASTI32X2Zrm(b?)",
1558 "VBROADCASTI32X4Z256rm(b?)",
1559 "VBROADCASTI32X4rm(b?)",
1560 "VBROADCASTI32X8rm(b?)",
1561 "VBROADCASTI64X2Z128rm(b?)",
1562 "VBROADCASTI64X2rm(b?)",
1563 "VBROADCASTI64X4rm(b?)",
1564 "VBROADCASTSD(Z|Z256)rm(b?)",
1565 "VBROADCASTSS(Z|Z256)rm(b?)",
1566 "VINSERTF32x4(Z|Z256)rm(b?)",
1567 "VINSERTF32x8Zrm(b?)",
1568 "VINSERTF64x2(Z|Z256)rm(b?)",
1569 "VINSERTF64x4Zrm(b?)",
1570 "VINSERTI32x4(Z|Z256)rm(b?)",
1571 "VINSERTI32x8Zrm(b?)",
1572 "VINSERTI64x2(Z|Z256)rm(b?)",
1573 "VINSERTI64x4Zrm(b?)",
1574 "VMOVAPD(Z|Z256)rm(b?)",
1575 "VMOVAPS(Z|Z256)rm(b?)",
1576 "VMOVDDUP(Z|Z256)rm(b?)",
1577 "VMOVDQA32(Z|Z256)rm(b?)",
1578 "VMOVDQA64(Z|Z256)rm(b?)",
1579 "VMOVDQU16(Z|Z256)rm(b?)",
1580 "VMOVDQU32(Z|Z256)rm(b?)",
1581 "VMOVDQU64(Z|Z256)rm(b?)",
1582 "VMOVDQU8(Z|Z256)rm(b?)",
1583 "VMOVSHDUP(Z|Z256)rm(b?)",
1584 "VMOVSLDUP(Z|Z256)rm(b?)",
1585 "VMOVUPD(Z|Z256)rm(b?)",
1586 "VMOVUPS(Z|Z256)rm(b?)",
1587 "VPADD(B|D|Q|W)Yrm",
1588 "VPADD(B|D|Q|W)(Z|Z256)rm(b?)",
1589 "VPBLENDM(B|D|Q|W)(Z|Z256)rm(b?)",
1590 "VPBROADCASTD(Z|Z256)rm(b?)",
1591 "VPBROADCASTQ(Z|Z256)rm(b?)",
1592 "VPSUB(B|D|Q|W)Yrm",
1593 "VPSUB(B|D|Q|W)(Z|Z256)rm(b?)",
1594 "VPTERNLOGD(Z|Z256)rm(b?)i",
1595 "VPTERNLOGQ(Z|Z256)rm(b?)i")>;
1597 def SKXWriteResGroup123 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
1599 let NumMicroOps = 4;
1600 let ResourceCycles = [1,2,1];
1602 def: InstRW<[SKXWriteResGroup123], (instregex "MMX_PH(ADD|SUB)SWrm")>;
1604 def SKXWriteResGroup127 : SchedWriteRes<[SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
1606 let NumMicroOps = 5;
1607 let ResourceCycles = [1,1,1,2];
1609 def: InstRW<[SKXWriteResGroup127], (instregex "RCL(8|16|32|64)m(1|i)",
1610 "RCR(8|16|32|64)m(1|i)")>;
1612 def SKXWriteResGroup128 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06]> {
1614 let NumMicroOps = 6;
1615 let ResourceCycles = [1,1,1,3];
1617 def: InstRW<[SKXWriteResGroup128], (instregex "ROL(8|16|32|64)mCL",
1618 "ROR(8|16|32|64)mCL",
1619 "SAR(8|16|32|64)mCL",
1620 "SHL(8|16|32|64)mCL",
1621 "SHR(8|16|32|64)mCL")>;
1623 def SKXWriteResGroup130 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
1625 let NumMicroOps = 6;
1626 let ResourceCycles = [1,1,1,2,1];
1628 def: SchedAlias<WriteADCRMW, SKXWriteResGroup130>;
1630 def SKXWriteResGroup131 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1632 let NumMicroOps = 8;
1633 let ResourceCycles = [1,2,1,2,2];
1635 def: InstRW<[SKXWriteResGroup131], (instrs VPSCATTERQDZ128mr,
1638 VSCATTERQPSZ256mr)>;
1640 def SKXWriteResGroup132 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1642 let NumMicroOps = 12;
1643 let ResourceCycles = [1,4,1,4,2];
1645 def: InstRW<[SKXWriteResGroup132], (instrs VPSCATTERDDZ128mr,
1646 VSCATTERDPSZ128mr)>;
1648 def SKXWriteResGroup133 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1650 let NumMicroOps = 20;
1651 let ResourceCycles = [1,8,1,8,2];
1653 def: InstRW<[SKXWriteResGroup133], (instrs VPSCATTERDDZ256mr,
1654 VSCATTERDPSZ256mr)>;
1656 def SKXWriteResGroup134 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1658 let NumMicroOps = 36;
1659 let ResourceCycles = [1,16,1,16,2];
1661 def: InstRW<[SKXWriteResGroup134], (instrs VPSCATTERDDZmr)>;
1663 def SKXWriteResGroup135 : SchedWriteRes<[SKXPort0,SKXPort23]> {
1665 let NumMicroOps = 2;
1666 let ResourceCycles = [1,1];
1668 def: InstRW<[SKXWriteResGroup135], (instrs MMX_CVTPI2PSirm)>;
1670 def SKXWriteResGroup136 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1672 let NumMicroOps = 2;
1673 let ResourceCycles = [1,1];
1675 def: InstRW<[SKXWriteResGroup136], (instrs VPMOVSXBWYrm,
1679 def: InstRW<[SKXWriteResGroup136], (instregex "VALIGN(D|Q)Z128rm(b?)i",
1680 "VFPCLASSSDZrm(b?)",
1681 "VFPCLASSSSZrm(b?)",
1683 "VPERMI2D128rm(b?)",
1684 "VPERMI2PD128rm(b?)",
1685 "VPERMI2PS128rm(b?)",
1686 "VPERMI2Q128rm(b?)",
1687 "VPERMT2D128rm(b?)",
1688 "VPERMT2PD128rm(b?)",
1689 "VPERMT2PS128rm(b?)",
1690 "VPERMT2Q128rm(b?)",
1691 "VPMAXSQZ128rm(b?)",
1692 "VPMAXUQZ128rm(b?)",
1693 "VPMINSQZ128rm(b?)",
1694 "VPMINUQZ128rm(b?)",
1695 "VPMOVSXBDZ128rm(b?)",
1696 "VPMOVSXBQZ128rm(b?)",
1697 "VPMOVSXBWZ128rm(b?)",
1698 "VPMOVSXDQZ128rm(b?)",
1699 "VPMOVSXWDZ128rm(b?)",
1700 "VPMOVSXWQZ128rm(b?)",
1701 "VPMOVZXBDZ128rm(b?)",
1702 "VPMOVZXBQZ128rm(b?)",
1703 "VPMOVZXBWZ128rm(b?)",
1704 "VPMOVZXDQZ128rm(b?)",
1705 "VPMOVZXWDZ128rm(b?)",
1706 "VPMOVZXWQZ128rm(b?)")>;
1708 def SKXWriteResGroup136_2 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1710 let NumMicroOps = 2;
1711 let ResourceCycles = [1,1];
1713 def: InstRW<[SKXWriteResGroup136_2], (instregex "VCMP(PD|PS)Z128rm(b?)i",
1715 "VFPCLASSPDZ128rm(b?)",
1716 "VFPCLASSPSZ128rm(b?)",
1717 "VPCMPBZ128rmi(b?)",
1718 "VPCMPDZ128rmi(b?)",
1719 "VPCMPEQ(B|D|Q|W)Z128rm(b?)",
1720 "VPCMPGT(B|D|Q|W)Z128rm(b?)",
1721 "VPCMPQZ128rmi(b?)",
1722 "VPCMPU(B|D|Q|W)Z128rmi(b?)",
1723 "VPCMPWZ128rmi(b?)",
1724 "VPTESTMBZ128rm(b?)",
1725 "VPTESTMDZ128rm(b?)",
1726 "VPTESTMQZ128rm(b?)",
1727 "VPTESTMWZ128rm(b?)",
1728 "VPTESTNMBZ128rm(b?)",
1729 "VPTESTNMDZ128rm(b?)",
1730 "VPTESTNMQZ128rm(b?)",
1731 "VPTESTNMWZ128rm(b?)")>;
1733 def SKXWriteResGroup137 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1735 let NumMicroOps = 2;
1736 let ResourceCycles = [1,1];
1738 def: InstRW<[SKXWriteResGroup137], (instregex "MMX_CVT(T?)PS2PIirm",
1741 def SKXWriteResGroup143 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23]> {
1743 let NumMicroOps = 4;
1744 let ResourceCycles = [2,1,1];
1746 def: InstRW<[SKXWriteResGroup143], (instregex "(V?)PHADDSWrm",
1749 def SKXWriteResGroup146 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort23,SKXPort0156]> {
1751 let NumMicroOps = 5;
1752 let ResourceCycles = [1,2,1,1];
1754 def: InstRW<[SKXWriteResGroup146], (instregex "LAR(16|32|64)rm",
1755 "LSL(16|32|64)rm")>;
1757 def SKXWriteResGroup148 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1759 let NumMicroOps = 2;
1760 let ResourceCycles = [1,1];
1762 def: InstRW<[SKXWriteResGroup148], (instrs VPCMPGTQYrm)>;
1763 def: InstRW<[SKXWriteResGroup148], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1765 "VALIGND(Z|Z256)rm(b?)i",
1766 "VALIGNQ(Z|Z256)rm(b?)i",
1767 "VPMAXSQ(Z|Z256)rm(b?)",
1768 "VPMAXUQ(Z|Z256)rm(b?)",
1769 "VPMINSQ(Z|Z256)rm(b?)",
1770 "VPMINUQ(Z|Z256)rm(b?)")>;
1772 def SKXWriteResGroup148_2 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1774 let NumMicroOps = 2;
1775 let ResourceCycles = [1,1];
1777 def: InstRW<[SKXWriteResGroup148_2], (instregex "VCMPPD(Z|Z256)rm(b?)i",
1778 "VCMPPS(Z|Z256)rm(b?)i",
1779 "VFPCLASSPD(Z|Z256)rm(b?)",
1780 "VFPCLASSPS(Z|Z256)rm(b?)",
1781 "VPCMPB(Z|Z256)rmi(b?)",
1782 "VPCMPD(Z|Z256)rmi(b?)",
1783 "VPCMPEQB(Z|Z256)rm(b?)",
1784 "VPCMPEQD(Z|Z256)rm(b?)",
1785 "VPCMPEQQ(Z|Z256)rm(b?)",
1786 "VPCMPEQW(Z|Z256)rm(b?)",
1787 "VPCMPGTB(Z|Z256)rm(b?)",
1788 "VPCMPGTD(Z|Z256)rm(b?)",
1789 "VPCMPGTQ(Z|Z256)rm(b?)",
1790 "VPCMPGTW(Z|Z256)rm(b?)",
1791 "VPCMPQ(Z|Z256)rmi(b?)",
1792 "VPCMPU(B|D|Q|W)Z256rmi(b?)",
1793 "VPCMPU(B|D|Q|W)Zrmi(b?)",
1794 "VPCMPW(Z|Z256)rmi(b?)",
1795 "VPTESTM(B|D|Q|W)Z256rm(b?)",
1796 "VPTESTM(B|D|Q|W)Zrm(b?)",
1797 "VPTESTNM(B|D|Q|W)Z256rm(b?)",
1798 "VPTESTNM(B|D|Q|W)Zrm(b?)")>;
1800 def SKXWriteResGroup149 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1802 let NumMicroOps = 2;
1803 let ResourceCycles = [1,1];
1805 def: InstRW<[SKXWriteResGroup149], (instregex "VCVTDQ2PDZ128rm(b?)",
1806 "VCVTDQ2PSZ128rm(b?)",
1808 "VCVTPD2QQZ128rm(b?)",
1809 "VCVTPD2UQQZ128rm(b?)",
1810 "VCVTPH2PSZ128rm(b?)",
1811 "VCVTPS2DQZ128rm(b?)",
1813 "VCVTPS2PDZ128rm(b?)",
1814 "VCVTPS2QQZ128rm(b?)",
1815 "VCVTPS2UDQZ128rm(b?)",
1816 "VCVTPS2UQQZ128rm(b?)",
1817 "VCVTQQ2PDZ128rm(b?)",
1818 "VCVTQQ2PSZ128rm(b?)",
1821 "VCVTTPD2QQZ128rm(b?)",
1822 "VCVTTPD2UQQZ128rm(b?)",
1823 "VCVTTPS2DQZ128rm(b?)",
1825 "VCVTTPS2QQZ128rm(b?)",
1826 "VCVTTPS2UDQZ128rm(b?)",
1827 "VCVTTPS2UQQZ128rm(b?)",
1828 "VCVTUDQ2PDZ128rm(b?)",
1829 "VCVTUDQ2PSZ128rm(b?)",
1830 "VCVTUQQ2PDZ128rm(b?)",
1831 "VCVTUQQ2PSZ128rm(b?)")>;
1833 def SKXWriteResGroup151 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1835 let NumMicroOps = 3;
1836 let ResourceCycles = [2,1];
1838 def: InstRW<[SKXWriteResGroup151], (instregex "VEXPANDPDZ128rm(b?)",
1839 "VEXPANDPSZ128rm(b?)",
1840 "VPEXPANDDZ128rm(b?)",
1841 "VPEXPANDQZ128rm(b?)")>;
1843 def SKXWriteResGroup153 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
1845 let NumMicroOps = 3;
1846 let ResourceCycles = [1,1,1];
1848 def: InstRW<[SKXWriteResGroup153], (instregex "(V?)CVTSD2SSrm")>;
1850 def SKXWriteResGroup154 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23]> {
1852 let NumMicroOps = 4;
1853 let ResourceCycles = [2,1,1];
1855 def: InstRW<[SKXWriteResGroup154], (instrs VPHADDSWYrm,
1858 def SKXWriteResGroup157 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
1860 let NumMicroOps = 8;
1861 let ResourceCycles = [1,1,1,1,1,3];
1863 def: InstRW<[SKXWriteResGroup157], (instregex "XCHG(8|16|32|64)rm")>;
1865 def SKXWriteResGroup159 : SchedWriteRes<[SKXPort0,SKXFPDivider]> {
1867 let NumMicroOps = 1;
1868 let ResourceCycles = [1,3];
1870 def : SchedAlias<WriteFDivX, SKXWriteResGroup159>; // TODO - convert to ZnWriteResFpuPair
1872 def SKXWriteResGroup160 : SchedWriteRes<[SKXPort0,SKXPort23]> {
1874 let NumMicroOps = 2;
1875 let ResourceCycles = [1,1];
1877 def: InstRW<[SKXWriteResGroup160], (instregex "MUL_F(32|64)m")>;
1879 def SKXWriteResGroup161 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1881 let NumMicroOps = 2;
1882 let ResourceCycles = [1,1];
1884 def: InstRW<[SKXWriteResGroup161], (instrs VCVTDQ2PSYrm,
1886 def: InstRW<[SKXWriteResGroup161], (instregex "VCVTDQ2(PD|PS)(Z|Z256)rm(b?)",
1887 "VCVTPH2PS(Z|Z256)rm(b?)",
1888 "VCVTPS2PD(Z|Z256)rm(b?)",
1889 "VCVTQQ2PD(Z|Z256)rm(b?)",
1890 "VCVTQQ2PSZ256rm(b?)",
1891 "VCVT(T?)PD2QQ(Z|Z256)rm(b?)",
1892 "VCVT(T?)PD2UQQ(Z|Z256)rm(b?)",
1894 "VCVT(T?)PS2DQ(Z|Z256)rm(b?)",
1895 "VCVT(T?)PS2QQZ256rm(b?)",
1896 "VCVT(T?)PS2UDQ(Z|Z256)rm(b?)",
1897 "VCVT(T?)PS2UQQZ256rm(b?)",
1898 "VCVTUDQ2(PD|PS)(Z|Z256)rm(b?)",
1899 "VCVTUQQ2PD(Z|Z256)rm(b?)",
1900 "VCVTUQQ2PSZ256rm(b?)")>;
1902 def SKXWriteResGroup162 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1904 let NumMicroOps = 3;
1905 let ResourceCycles = [2,1];
1907 def: InstRW<[SKXWriteResGroup162], (instregex "FICOM(P?)(16|32)m",
1908 "VEXPANDPD(Z|Z256)rm(b?)",
1909 "VEXPANDPS(Z|Z256)rm(b?)",
1910 "VPEXPANDD(Z|Z256)rm(b?)",
1911 "VPEXPANDQ(Z|Z256)rm(b?)")>;
1913 def SKXWriteResGroup163 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1915 let NumMicroOps = 3;
1916 let ResourceCycles = [1,2];
1918 def: InstRW<[SKXWriteResGroup163], (instregex "VCVTSD2SSZrm")>;
1920 def SKXWriteResGroup164 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
1922 let NumMicroOps = 3;
1923 let ResourceCycles = [1,1,1];
1925 def: InstRW<[SKXWriteResGroup164], (instregex "(V?)CVTDQ2PDrm")>;
1927 def SKXWriteResGroup166 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
1929 let NumMicroOps = 3;
1930 let ResourceCycles = [1,1,1];
1932 def: InstRW<[SKXWriteResGroup166], (instrs CVTPD2PSrm,
1938 def SKXWriteResGroup167 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
1940 let NumMicroOps = 4;
1941 let ResourceCycles = [2,1,1];
1943 def: InstRW<[SKXWriteResGroup167], (instregex "VPCONFLICTQZ128rm(b?)")>;
1945 def SKXWriteResGroup169 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort0156]> {
1947 let NumMicroOps = 7;
1948 let ResourceCycles = [2,3,2];
1950 def: InstRW<[SKXWriteResGroup169], (instregex "RCL(16|32|64)rCL",
1951 "RCR(16|32|64)rCL")>;
1953 def SKXWriteResGroup170 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort15,SKXPort0156]> {
1955 let NumMicroOps = 9;
1956 let ResourceCycles = [1,5,1,2];
1958 def: InstRW<[SKXWriteResGroup170], (instrs RCL8rCL)>;
1960 def SKXWriteResGroup171 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
1962 let NumMicroOps = 11;
1963 let ResourceCycles = [2,9];
1965 def: InstRW<[SKXWriteResGroup171], (instrs LOOPE, LOOPNE)>;
1967 def SKXWriteResGroup174 : SchedWriteRes<[SKXPort01]> {
1969 let NumMicroOps = 3;
1970 let ResourceCycles = [3];
1972 def: InstRW<[SKXWriteResGroup174], (instregex "VPMULLQ(Z128|Z256)rr")>;
1974 def SKXWriteResGroup174z : SchedWriteRes<[SKXPort05]> {
1976 let NumMicroOps = 3;
1977 let ResourceCycles = [3];
1979 def: InstRW<[SKXWriteResGroup174z], (instregex "VPMULLQZrr")>;
1981 def SKXWriteResGroup175 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1983 let NumMicroOps = 3;
1984 let ResourceCycles = [2,1];
1986 def: InstRW<[SKXWriteResGroup175], (instregex "VPERMWZ128rm(b?)")>;
1988 def SKXWriteResGroup176 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015]> {
1990 let NumMicroOps = 3;
1991 let ResourceCycles = [1,1,1];
1993 def: InstRW<[SKXWriteResGroup176], (instregex "VCVT(T?)SD2USIZrm(b?)",
1994 "VCVT(T?)SS2USI64Zrm(b?)")>;
1996 def SKXWriteResGroup177 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
1998 let NumMicroOps = 3;
1999 let ResourceCycles = [1,1,1];
2001 def: InstRW<[SKXWriteResGroup177], (instregex "VCVT(T?)PS2QQZrm(b?)",
2002 "VCVT(T?)PS2UQQZrm(b?)")>;
2004 def SKXWriteResGroup179 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23,SKXPort015]> {
2006 let NumMicroOps = 4;
2007 let ResourceCycles = [1,1,1,1];
2009 def: InstRW<[SKXWriteResGroup179], (instregex "CVTTSS2SI64rm")>;
2011 def SKXWriteResGroup180 : SchedWriteRes<[SKXPort5,SKXPort23]> {
2013 let NumMicroOps = 3;
2014 let ResourceCycles = [2,1];
2016 def: InstRW<[SKXWriteResGroup180], (instregex "(ADD|SUB|SUBR)_FI(16|32)m",
2020 def SKXWriteResGroup181 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2022 let NumMicroOps = 3;
2023 let ResourceCycles = [1,1,1];
2025 def: InstRW<[SKXWriteResGroup181], (instrs VCVTDQ2PDYrm)>;
2027 def SKXWriteResGroup183 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2029 let NumMicroOps = 4;
2030 let ResourceCycles = [2,1,1];
2032 def: InstRW<[SKXWriteResGroup183], (instregex "VPERMI2W128rm(b?)",
2033 "VPERMT2W128rm(b?)")>;
2035 def SKXWriteResGroup184 : SchedWriteRes<[SKXPort0,SKXFPDivider]> {
2037 let NumMicroOps = 1;
2038 let ResourceCycles = [1,3];
2040 def : SchedAlias<WriteFDiv64, SKXWriteResGroup184>; // TODO - convert to ZnWriteResFpuPair
2041 def : SchedAlias<WriteFDiv64X, SKXWriteResGroup184>; // TODO - convert to ZnWriteResFpuPair
2043 def SKXWriteResGroup184_1 : SchedWriteRes<[SKXPort0,SKXFPDivider]> {
2045 let NumMicroOps = 1;
2046 let ResourceCycles = [1,5];
2048 def : SchedAlias<WriteFDiv64Y, SKXWriteResGroup184_1>; // TODO - convert to ZnWriteResFpuPair
2050 def SKXWriteResGroup187 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2052 let NumMicroOps = 3;
2053 let ResourceCycles = [1,1,1];
2055 def: InstRW<[SKXWriteResGroup187], (instregex "MUL_FI(16|32)m")>;
2057 def SKXWriteResGroup188 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2059 let NumMicroOps = 3;
2060 let ResourceCycles = [1,1,1];
2062 def: InstRW<[SKXWriteResGroup188], (instregex "VCVTPD2DQZrm(b?)",
2064 "VCVTPD2UDQZrm(b?)",
2066 "VCVTTPD2DQZrm(b?)",
2067 "VCVTTPD2UDQZrm(b?)",
2068 "VCVTUQQ2PSZrm(b?)")>;
2070 def SKXWriteResGroup189 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2072 let NumMicroOps = 4;
2073 let ResourceCycles = [2,1,1];
2075 def: InstRW<[SKXWriteResGroup189], (instregex "VPERMI2W256rm(b?)",
2077 "VPERMT2W256rm(b?)",
2080 def SKXWriteResGroup190 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort15,SKXPort0156]> {
2082 let NumMicroOps = 10;
2083 let ResourceCycles = [2,4,1,3];
2085 def: InstRW<[SKXWriteResGroup190], (instrs RCR8rCL)>;
2087 def SKXWriteResGroup191 : SchedWriteRes<[SKXPort0]> {
2089 let NumMicroOps = 1;
2090 let ResourceCycles = [1];
2092 def: InstRW<[SKXWriteResGroup191], (instregex "DIVR_(FPrST0|FST0r|FrST0)")>;
2094 def SKXWriteResGroup194 : SchedWriteRes<[SKXPort1,SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2096 let NumMicroOps = 8;
2097 let ResourceCycles = [1,2,2,1,2];
2099 def: InstRW<[SKXWriteResGroup194], (instregex "VPCONFLICTDZ128rm(b?)")>;
2101 def SKXWriteResGroup195 : SchedWriteRes<[SKXPort1,SKXPort23,SKXPort237,SKXPort06,SKXPort15,SKXPort0156]> {
2103 let NumMicroOps = 10;
2104 let ResourceCycles = [1,1,1,5,1,1];
2106 def: InstRW<[SKXWriteResGroup195], (instregex "RCL(8|16|32|64)mCL")>;
2108 def SKXWriteResGroup199 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06,SKXPort15,SKXPort0156]> {
2110 let NumMicroOps = 14;
2111 let ResourceCycles = [1,1,1,4,2,5];
2113 def: InstRW<[SKXWriteResGroup199], (instrs CMPXCHG8B)>;
2115 def SKXWriteResGroup200 : SchedWriteRes<[SKXPort1, SKXPort05, SKXPort6]> {
2117 let NumMicroOps = 34;
2118 let ResourceCycles = [1, 4, 5];
2120 def: InstRW<[SKXWriteResGroup200], (instrs VZEROALL)>;
2122 def SKXWriteResGroup201 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2124 let NumMicroOps = 2;
2125 let ResourceCycles = [1,1,5];
2127 def : SchedAlias<WriteFDivXLd, SKXWriteResGroup201>; // TODO - convert to ZnWriteResFpuPair
2129 def SKXWriteResGroup202 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort05,SKXPort0156]> {
2131 let NumMicroOps = 15;
2132 let ResourceCycles = [2,1,2,4,2,4];
2134 def: InstRW<[SKXWriteResGroup202], (instrs XCH_F)>;
2136 def SKXWriteResGroup205 : SchedWriteRes<[SKXPort23,SKXPort01]> {
2138 let NumMicroOps = 4;
2139 let ResourceCycles = [1,3];
2141 def: InstRW<[SKXWriteResGroup205], (instregex "VPMULLQZ128rm(b?)")>;
2143 def SKXWriteResGroup207 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort06,SKXPort0156]> {
2145 let NumMicroOps = 8;
2146 let ResourceCycles = [1,1,1,5];
2148 def: InstRW<[SKXWriteResGroup207], (instrs CPUID, RDTSC)>;
2150 def SKXWriteResGroup208 : SchedWriteRes<[SKXPort1,SKXPort23,SKXPort237,SKXPort06,SKXPort15,SKXPort0156]> {
2152 let NumMicroOps = 11;
2153 let ResourceCycles = [2,1,1,4,1,2];
2155 def: InstRW<[SKXWriteResGroup208], (instregex "RCR(8|16|32|64)mCL")>;
2157 def SKXWriteResGroup209 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2159 let NumMicroOps = 2;
2160 let ResourceCycles = [1,1,4];
2162 def : SchedAlias<WriteFDiv64Ld, SKXWriteResGroup209>; // TODO - convert to ZnWriteResFpuPair
2164 def SKXWriteResGroup211 : SchedWriteRes<[SKXPort23,SKXPort01]> {
2166 let NumMicroOps = 4;
2167 let ResourceCycles = [1,3];
2169 def: InstRW<[SKXWriteResGroup211], (instregex "VPMULLQZ256rm(b?)")>;
2171 def SKXWriteResGroup211_1 : SchedWriteRes<[SKXPort23,SKXPort05]> {
2173 let NumMicroOps = 4;
2174 let ResourceCycles = [1,3];
2176 def: InstRW<[SKXWriteResGroup211_1], (instregex "VPMULLQZrm(b?)")>;
2178 def SKXWriteResGroup215 : SchedWriteRes<[SKXPort0]> {
2180 let NumMicroOps = 1;
2181 let ResourceCycles = [1];
2183 def: InstRW<[SKXWriteResGroup215], (instregex "DIV_(FPrST0|FST0r|FrST0)")>;
2185 def SKXWriteResGroup216 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2187 let NumMicroOps = 2;
2188 let ResourceCycles = [1,1,4];
2190 def : SchedAlias<WriteFDiv64XLd, SKXWriteResGroup216>; // TODO - convert to ZnWriteResFpuPair
2192 def SKXWriteGatherEVEX2 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2194 let NumMicroOps = 5; // 2 uops perform multiple loads
2195 let ResourceCycles = [1,2,1,1];
2197 def: InstRW<[SKXWriteGatherEVEX2], (instrs VGATHERQPSZ128rm, VPGATHERQDZ128rm,
2198 VGATHERDPDZ128rm, VPGATHERDQZ128rm,
2199 VGATHERQPDZ128rm, VPGATHERQQZ128rm)>;
2201 def SKXWriteGatherEVEX4 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2203 let NumMicroOps = 5; // 2 uops perform multiple loads
2204 let ResourceCycles = [1,4,1,1];
2206 def: InstRW<[SKXWriteGatherEVEX4], (instrs VGATHERQPSZ256rm, VPGATHERQDZ256rm,
2207 VGATHERQPDZ256rm, VPGATHERQQZ256rm,
2208 VGATHERDPSZ128rm, VPGATHERDDZ128rm,
2209 VGATHERDPDZ256rm, VPGATHERDQZ256rm)>;
2211 def SKXWriteGatherEVEX8 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2213 let NumMicroOps = 5; // 2 uops perform multiple loads
2214 let ResourceCycles = [1,8,1,1];
2216 def: InstRW<[SKXWriteGatherEVEX8], (instrs VGATHERDPSZ256rm, VPGATHERDDZ256rm,
2217 VGATHERDPDZrm, VPGATHERDQZrm,
2218 VGATHERQPDZrm, VPGATHERQQZrm,
2219 VGATHERQPSZrm, VPGATHERQDZrm)>;
2221 def SKXWriteGatherEVEX16 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2223 let NumMicroOps = 5; // 2 uops perform multiple loads
2224 let ResourceCycles = [1,16,1,1];
2226 def: InstRW<[SKXWriteGatherEVEX16], (instrs VGATHERDPSZrm, VPGATHERDDZrm)>;
2228 def SKXWriteResGroup219 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort6,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
2230 let NumMicroOps = 8;
2231 let ResourceCycles = [1,1,1,1,1,1,2];
2233 def: InstRW<[SKXWriteResGroup219], (instrs INSB, INSL, INSW)>;
2235 def SKXWriteResGroup220 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort0156]> {
2237 let NumMicroOps = 10;
2238 let ResourceCycles = [1,2,7];
2240 def: InstRW<[SKXWriteResGroup220], (instrs MWAITrr)>;
2242 def SKXWriteResGroup222 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2244 let NumMicroOps = 2;
2245 let ResourceCycles = [1,1,8];
2247 def : SchedAlias<WriteFDiv64YLd, SKXWriteResGroup222>; // TODO - convert to ZnWriteResFpuPair
2249 def SKXWriteResGroup223 : SchedWriteRes<[SKXPort0,SKXPort23]> {
2251 let NumMicroOps = 2;
2252 let ResourceCycles = [1,1];
2254 def: InstRW<[SKXWriteResGroup223], (instregex "DIV_F(32|64)m")>;
2256 def SKXWriteResGroupVEX2 : SchedWriteRes<[SKXPort0, SKXPort23, SKXPort5, SKXPort015]> {
2258 let NumMicroOps = 5; // 2 uops perform multiple loads
2259 let ResourceCycles = [1,2,1,1];
2261 def: InstRW<[SKXWriteResGroupVEX2], (instrs VGATHERDPDrm, VPGATHERDQrm,
2262 VGATHERQPDrm, VPGATHERQQrm,
2263 VGATHERQPSrm, VPGATHERQDrm)>;
2265 def SKXWriteResGroupVEX4 : SchedWriteRes<[SKXPort0, SKXPort23, SKXPort5, SKXPort015]> {
2267 let NumMicroOps = 5; // 2 uops peform multiple loads
2268 let ResourceCycles = [1,4,1,1];
2270 def: InstRW<[SKXWriteResGroupVEX4], (instrs VGATHERDPDYrm, VPGATHERDQYrm,
2271 VGATHERDPSrm, VPGATHERDDrm,
2272 VGATHERQPDYrm, VPGATHERQQYrm,
2273 VGATHERQPSYrm, VPGATHERQDYrm)>;
2275 def SKXWriteResGroupVEX8 : SchedWriteRes<[SKXPort0, SKXPort23, SKXPort5, SKXPort015]> {
2277 let NumMicroOps = 5; // 2 uops perform multiple loads
2278 let ResourceCycles = [1,8,1,1];
2280 def: InstRW<[SKXWriteResGroupVEX8], (instrs VGATHERDPSYrm, VPGATHERDDYrm)>;
2282 def SKXWriteResGroup225 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort015]> {
2284 let NumMicroOps = 14;
2285 let ResourceCycles = [5,5,4];
2287 def: InstRW<[SKXWriteResGroup225], (instregex "VPCONFLICTDZ128rr",
2288 "VPCONFLICTQZ256rr")>;
2290 def SKXWriteResGroup228 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
2292 let NumMicroOps = 19;
2293 let ResourceCycles = [2,1,4,1,1,4,6];
2295 def: InstRW<[SKXWriteResGroup228], (instrs CMPXCHG16B)>;
2297 def SKXWriteResGroup233 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2299 let NumMicroOps = 3;
2300 let ResourceCycles = [1,1,1];
2302 def: InstRW<[SKXWriteResGroup233], (instregex "DIV_FI(16|32)m")>;
2304 def SKXWriteResGroup239 : SchedWriteRes<[SKXPort0,SKXPort23]> {
2306 let NumMicroOps = 2;
2307 let ResourceCycles = [1,1];
2309 def: InstRW<[SKXWriteResGroup239], (instregex "DIVR_F(32|64)m")>;
2311 def SKXWriteResGroup242 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2313 let NumMicroOps = 15;
2314 let ResourceCycles = [5,5,1,4];
2316 def: InstRW<[SKXWriteResGroup242], (instregex "VPCONFLICTQZ256rm(b?)")>;
2318 def SKXWriteResGroup243 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2320 let NumMicroOps = 3;
2321 let ResourceCycles = [1,1,1];
2323 def: InstRW<[SKXWriteResGroup243], (instregex "DIVR_FI(16|32)m")>;
2325 def SKXWriteResGroup247 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort23,SKXPort06,SKXPort0156]> {
2327 let NumMicroOps = 23;
2328 let ResourceCycles = [1,5,3,4,10];
2330 def: InstRW<[SKXWriteResGroup247], (instregex "IN(8|16|32)ri",
2333 def SKXWriteResGroup248 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
2335 let NumMicroOps = 23;
2336 let ResourceCycles = [1,5,2,1,4,10];
2338 def: InstRW<[SKXWriteResGroup248], (instregex "OUT(8|16|32)ir",
2341 def SKXWriteResGroup249 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort015]> {
2343 let NumMicroOps = 21;
2344 let ResourceCycles = [9,7,5];
2346 def: InstRW<[SKXWriteResGroup249], (instregex "VPCONFLICTDZ256rr",
2349 def SKXWriteResGroup250 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort23,SKXPort0156]> {
2351 let NumMicroOps = 31;
2352 let ResourceCycles = [1,8,1,21];
2354 def: InstRW<[SKXWriteResGroup250], (instregex "XRSTOR(64)?")>;
2356 def SKXWriteResGroup252 : SchedWriteRes<[SKXPort1,SKXPort4,SKXPort5,SKXPort6,SKXPort23,SKXPort237,SKXPort15,SKXPort0156]> {
2358 let NumMicroOps = 18;
2359 let ResourceCycles = [1,1,2,3,1,1,1,8];
2361 def: InstRW<[SKXWriteResGroup252], (instrs VMCLEARm)>;
2363 def SKXWriteResGroup253 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort0156]> {
2365 let NumMicroOps = 39;
2366 let ResourceCycles = [1,10,1,1,26];
2368 def: InstRW<[SKXWriteResGroup253], (instrs XSAVE64)>;
2370 def SKXWriteResGroup254 : SchedWriteRes<[SKXPort5,SKXPort0156]> {
2372 let NumMicroOps = 22;
2373 let ResourceCycles = [2,20];
2375 def: InstRW<[SKXWriteResGroup254], (instrs RDTSCP)>;
2377 def SKXWriteResGroup255 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort0156]> {
2379 let NumMicroOps = 40;
2380 let ResourceCycles = [1,11,1,1,26];
2382 def: InstRW<[SKXWriteResGroup255], (instrs XSAVE)>;
2383 def: InstRW<[SKXWriteResGroup255], (instregex "XSAVEC", "XSAVES", "XSAVEOPT")>;
2385 def SKXWriteResGroup256 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2387 let NumMicroOps = 22;
2388 let ResourceCycles = [9,7,1,5];
2390 def: InstRW<[SKXWriteResGroup256], (instregex "VPCONFLICTDZ256rm(b?)",
2391 "VPCONFLICTQZrm(b?)")>;
2393 def SKXWriteResGroup258 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort05,SKXPort06,SKXPort0156]> {
2395 let NumMicroOps = 64;
2396 let ResourceCycles = [2,8,5,10,39];
2398 def: InstRW<[SKXWriteResGroup258], (instrs FLDENVm)>;
2400 def SKXWriteResGroup259 : SchedWriteRes<[SKXPort0,SKXPort6,SKXPort23,SKXPort05,SKXPort06,SKXPort15,SKXPort0156]> {
2402 let NumMicroOps = 88;
2403 let ResourceCycles = [4,4,31,1,2,1,45];
2405 def: InstRW<[SKXWriteResGroup259], (instrs FXRSTOR64)>;
2407 def SKXWriteResGroup260 : SchedWriteRes<[SKXPort0,SKXPort6,SKXPort23,SKXPort05,SKXPort06,SKXPort15,SKXPort0156]> {
2409 let NumMicroOps = 90;
2410 let ResourceCycles = [4,2,33,1,2,1,47];
2412 def: InstRW<[SKXWriteResGroup260], (instrs FXRSTOR)>;
2414 def SKXWriteResGroup261 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort015]> {
2416 let NumMicroOps = 35;
2417 let ResourceCycles = [17,11,7];
2419 def: InstRW<[SKXWriteResGroup261], (instregex "VPCONFLICTDZrr")>;
2421 def SKXWriteResGroup262 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2423 let NumMicroOps = 36;
2424 let ResourceCycles = [17,11,1,7];
2426 def: InstRW<[SKXWriteResGroup262], (instregex "VPCONFLICTDZrm(b?)")>;
2428 def SKXWriteResGroup263 : SchedWriteRes<[SKXPort5,SKXPort05,SKXPort0156]> {
2430 let NumMicroOps = 15;
2431 let ResourceCycles = [6,3,6];
2433 def: InstRW<[SKXWriteResGroup263], (instrs FNINIT)>;
2435 def SKXWriteResGroup266 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort4,SKXPort5,SKXPort6,SKXPort237,SKXPort06,SKXPort0156]> {
2437 let NumMicroOps = 100;
2438 let ResourceCycles = [9,1,11,16,1,11,21,30];
2440 def: InstRW<[SKXWriteResGroup266], (instrs FSTENVm)>;
2442 def SKXWriteResGroup267 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
2444 let NumMicroOps = 4;
2445 let ResourceCycles = [1,3];
2447 def: InstRW<[SKXWriteResGroup267], (instrs PAUSE)>;
2449 def: InstRW<[WriteZero], (instrs CLC)>;
2452 // Instruction variants handled by the renamer. These might not need execution
2453 // ports in certain conditions.
2454 // See Agner's Fog "The microarchitecture of Intel, AMD and VIA CPUs",
2455 // section "Skylake Pipeline" > "Register allocation and renaming".
2456 // These can be investigated with llvm-exegesis, e.g.
2457 // echo 'pxor %mm0, %mm0' | /tmp/llvm-exegesis -mode=uops -snippets-file=-
2458 // echo 'vxorpd %xmm0, %xmm0, %xmm1' | /tmp/llvm-exegesis -mode=uops -snippets-file=-
2460 def SKXWriteZeroLatency : SchedWriteRes<[]> {
2464 def SKXWriteZeroIdiom : SchedWriteVariant<[
2465 SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKXWriteZeroLatency]>,
2466 SchedVar<NoSchedPred, [WriteALU]>
2468 def : InstRW<[SKXWriteZeroIdiom], (instrs SUB32rr, SUB64rr,
2471 def SKXWriteFZeroIdiom : SchedWriteVariant<[
2472 SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKXWriteZeroLatency]>,
2473 SchedVar<NoSchedPred, [WriteFLogic]>
2475 def : InstRW<[SKXWriteFZeroIdiom], (instrs XORPSrr, VXORPSrr,
2480 def SKXWriteFZeroIdiomY : SchedWriteVariant<[
2481 SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKXWriteZeroLatency]>,
2482 SchedVar<NoSchedPred, [WriteFLogicY]>
2484 def : InstRW<[SKXWriteFZeroIdiomY], (instrs VXORPSYrr, VXORPDYrr,
2485 VXORPSZ256rr, VXORPDZ256rr)>;
2487 def SKXWriteFZeroIdiomZ : SchedWriteVariant<[
2488 SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKXWriteZeroLatency]>,
2489 SchedVar<NoSchedPred, [WriteFLogicZ]>
2491 def : InstRW<[SKXWriteFZeroIdiomZ], (instrs VXORPSZrr, VXORPDZrr)>;
2493 def SKXWriteVZeroIdiomLogicX : SchedWriteVariant<[
2494 SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKXWriteZeroLatency]>,
2495 SchedVar<NoSchedPred, [WriteVecLogicX]>
2497 def : InstRW<[SKXWriteVZeroIdiomLogicX], (instrs PXORrr, VPXORrr,
2498 VPXORDZ128rr, VPXORQZ128rr)>;
2500 def SKXWriteVZeroIdiomLogicY : SchedWriteVariant<[
2501 SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKXWriteZeroLatency]>,
2502 SchedVar<NoSchedPred, [WriteVecLogicY]>
2504 def : InstRW<[SKXWriteVZeroIdiomLogicY], (instrs VPXORYrr,
2505 VPXORDZ256rr, VPXORQZ256rr)>;
2507 def SKXWriteVZeroIdiomLogicZ : SchedWriteVariant<[
2508 SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKXWriteZeroLatency]>,
2509 SchedVar<NoSchedPred, [WriteVecLogicZ]>
2511 def : InstRW<[SKXWriteVZeroIdiomLogicZ], (instrs VPXORDZrr, VPXORQZrr)>;
2513 def SKXWriteVZeroIdiomALUX : SchedWriteVariant<[
2514 SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKXWriteZeroLatency]>,
2515 SchedVar<NoSchedPred, [WriteVecALUX]>
2517 def : InstRW<[SKXWriteVZeroIdiomALUX], (instrs PCMPGTBrr, VPCMPGTBrr,
2518 PCMPGTDrr, VPCMPGTDrr,
2519 PCMPGTWrr, VPCMPGTWrr)>;
2521 def SKXWriteVZeroIdiomALUY : SchedWriteVariant<[
2522 SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKXWriteZeroLatency]>,
2523 SchedVar<NoSchedPred, [WriteVecALUY]>
2525 def : InstRW<[SKXWriteVZeroIdiomALUY], (instrs VPCMPGTBYrr,
2529 def SKXWritePSUB : SchedWriteRes<[SKXPort015]> {
2531 let NumMicroOps = 1;
2532 let ResourceCycles = [1];
2535 def SKXWriteVZeroIdiomPSUB : SchedWriteVariant<[
2536 SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKXWriteZeroLatency]>,
2537 SchedVar<NoSchedPred, [SKXWritePSUB]>
2540 def : InstRW<[SKXWriteVZeroIdiomPSUB], (instrs PSUBBrr, VPSUBBrr, VPSUBBZ128rr,
2541 PSUBDrr, VPSUBDrr, VPSUBDZ128rr,
2542 PSUBQrr, VPSUBQrr, VPSUBQZ128rr,
2543 PSUBWrr, VPSUBWrr, VPSUBWZ128rr,
2544 VPSUBBYrr, VPSUBBZ256rr,
2545 VPSUBDYrr, VPSUBDZ256rr,
2546 VPSUBQYrr, VPSUBQZ256rr,
2547 VPSUBWYrr, VPSUBWZ256rr,
2552 def SKXWritePCMPGTQ : SchedWriteRes<[SKXPort5]> {
2554 let NumMicroOps = 1;
2555 let ResourceCycles = [1];
2558 def SKXWriteVZeroIdiomPCMPGTQ : SchedWriteVariant<[
2559 SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKXWriteZeroLatency]>,
2560 SchedVar<NoSchedPred, [SKXWritePCMPGTQ]>
2562 def : InstRW<[SKXWriteVZeroIdiomPCMPGTQ], (instrs PCMPGTQrr, VPCMPGTQrr,
2566 // CMOVs that use both Z and C flag require an extra uop.
2567 def SKXWriteCMOVA_CMOVBErr : SchedWriteRes<[SKXPort06]> {
2569 let ResourceCycles = [2];
2570 let NumMicroOps = 2;
2573 def SKXWriteCMOVA_CMOVBErm : SchedWriteRes<[SKXPort23,SKXPort06]> {
2575 let ResourceCycles = [1,2];
2576 let NumMicroOps = 3;
2579 def SKXCMOVA_CMOVBErr : SchedWriteVariant<[
2580 SchedVar<MCSchedPredicate<IsCMOVArr_Or_CMOVBErr>, [SKXWriteCMOVA_CMOVBErr]>,
2581 SchedVar<NoSchedPred, [WriteCMOV]>
2584 def SKXCMOVA_CMOVBErm : SchedWriteVariant<[
2585 SchedVar<MCSchedPredicate<IsCMOVArm_Or_CMOVBErm>, [SKXWriteCMOVA_CMOVBErm]>,
2586 SchedVar<NoSchedPred, [WriteCMOV.Folded]>
2589 def : InstRW<[SKXCMOVA_CMOVBErr], (instrs CMOV16rr, CMOV32rr, CMOV64rr)>;
2590 def : InstRW<[SKXCMOVA_CMOVBErm], (instrs CMOV16rm, CMOV32rm, CMOV64rm)>;
2592 // SETCCs that use both Z and C flag require an extra uop.
2593 def SKXWriteSETA_SETBEr : SchedWriteRes<[SKXPort06]> {
2595 let ResourceCycles = [2];
2596 let NumMicroOps = 2;
2599 def SKXWriteSETA_SETBEm : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort06]> {
2601 let ResourceCycles = [1,1,2];
2602 let NumMicroOps = 4;
2605 def SKXSETA_SETBErr : SchedWriteVariant<[
2606 SchedVar<MCSchedPredicate<IsSETAr_Or_SETBEr>, [SKXWriteSETA_SETBEr]>,
2607 SchedVar<NoSchedPred, [WriteSETCC]>
2610 def SKXSETA_SETBErm : SchedWriteVariant<[
2611 SchedVar<MCSchedPredicate<IsSETAm_Or_SETBEm>, [SKXWriteSETA_SETBEm]>,
2612 SchedVar<NoSchedPred, [WriteSETCCStore]>
2615 def : InstRW<[SKXSETA_SETBErr], (instrs SETCCr)>;
2616 def : InstRW<[SKXSETA_SETBErm], (instrs SETCCm)>;