1 //=- X86SchedSkylake.td - X86 Skylake Server Scheduling ------*- tablegen -*-=//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the machine model for Skylake Server to support
11 // instruction scheduling and other instruction cost heuristics.
13 //===----------------------------------------------------------------------===//
15 def SkylakeServerModel : SchedMachineModel {
16 // All x86 instructions are modeled as a single micro-op, and SKylake can
17 // decode 6 instructions per cycle.
19 let MicroOpBufferSize = 224; // Based on the reorder buffer.
21 let MispredictPenalty = 14;
23 // Based on the LSD (loop-stream detector) queue size and benchmarking data.
24 let LoopMicroOpBufferSize = 50;
26 // This flag is set to allow the scheduler to assign a default model to
27 // unrecognized opcodes.
28 let CompleteModel = 0;
31 let SchedModel = SkylakeServerModel in {
33 // Skylake Server can issue micro-ops to 8 different ports in one cycle.
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
39 // Ports 2 and 3 are identical. They handle loads and the address half of
40 // stores. Port 7 can handle address calculations.
41 def SKXPort0 : ProcResource<1>;
42 def SKXPort1 : ProcResource<1>;
43 def SKXPort2 : ProcResource<1>;
44 def SKXPort3 : ProcResource<1>;
45 def SKXPort4 : ProcResource<1>;
46 def SKXPort5 : ProcResource<1>;
47 def SKXPort6 : ProcResource<1>;
48 def SKXPort7 : ProcResource<1>;
50 // Many micro-ops are capable of issuing on multiple ports.
51 def SKXPort01 : ProcResGroup<[SKXPort0, SKXPort1]>;
52 def SKXPort23 : ProcResGroup<[SKXPort2, SKXPort3]>;
53 def SKXPort237 : ProcResGroup<[SKXPort2, SKXPort3, SKXPort7]>;
54 def SKXPort04 : ProcResGroup<[SKXPort0, SKXPort4]>;
55 def SKXPort05 : ProcResGroup<[SKXPort0, SKXPort5]>;
56 def SKXPort06 : ProcResGroup<[SKXPort0, SKXPort6]>;
57 def SKXPort15 : ProcResGroup<[SKXPort1, SKXPort5]>;
58 def SKXPort16 : ProcResGroup<[SKXPort1, SKXPort6]>;
59 def SKXPort56 : ProcResGroup<[SKXPort5, SKXPort6]>;
60 def SKXPort015 : ProcResGroup<[SKXPort0, SKXPort1, SKXPort5]>;
61 def SKXPort056 : ProcResGroup<[SKXPort0, SKXPort5, SKXPort6]>;
62 def SKXPort0156: ProcResGroup<[SKXPort0, SKXPort1, SKXPort5, SKXPort6]>;
64 def SKXDivider : ProcResource<1>; // Integer division issued on port 0.
65 // FP division and sqrt on port 0.
66 def SKXFPDivider : ProcResource<1>;
68 // 60 Entry Unified Scheduler
69 def SKXPortAny : ProcResGroup<[SKXPort0, SKXPort1, SKXPort2, SKXPort3, SKXPort4,
70 SKXPort5, SKXPort6, SKXPort7]> {
74 // Loads are 5 cycles, so ReadAfterLd registers needn't be available until 5
75 // cycles after the memory operand.
76 def : ReadAdvance<ReadAfterLd, 5>;
78 // Many SchedWrites are defined in pairs with and without a folded load.
79 // Instructions with folded loads are usually micro-fused, so they only appear
80 // as two micro-ops when queued in the reservation station.
81 // This multiclass defines the resource usage for variants with and without
83 multiclass SKXWriteResPair<X86FoldableSchedWrite SchedRW,
84 list<ProcResourceKind> ExePorts,
85 int Lat, list<int> Res = [1], int UOps = 1,
87 // Register variant is using a single cycle on ExePort.
88 def : WriteRes<SchedRW, ExePorts> {
90 let ResourceCycles = Res;
91 let NumMicroOps = UOps;
94 // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to
95 // the latency (default = 5).
96 def : WriteRes<SchedRW.Folded, !listconcat([SKXPort23], ExePorts)> {
97 let Latency = !add(Lat, LoadLat);
98 let ResourceCycles = !listconcat([1], Res);
99 let NumMicroOps = !add(UOps, 1);
103 // A folded store needs a cycle on port 4 for the store data, and an extra port
104 // 2/3/7 cycle to recompute the address.
105 def : WriteRes<WriteRMW, [SKXPort237,SKXPort4]>;
108 defm : SKXWriteResPair<WriteALU, [SKXPort0156], 1>; // Simple integer ALU op.
109 defm : SKXWriteResPair<WriteADC, [SKXPort06], 1>; // Integer ALU + flags op.
110 defm : SKXWriteResPair<WriteIMul, [SKXPort1], 3>; // Integer multiplication.
111 defm : SKXWriteResPair<WriteIMul64, [SKXPort1], 3>; // Integer 64-bit multiplication.
113 defm : X86WriteRes<WriteBSWAP32, [SKXPort15], 1, [1], 1>;
114 defm : X86WriteRes<WriteBSWAP64, [SKXPort06, SKXPort15], 2, [1,1], 2>;
116 defm : SKXWriteResPair<WriteDiv8, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
117 defm : SKXWriteResPair<WriteDiv16, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
118 defm : SKXWriteResPair<WriteDiv32, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
119 defm : SKXWriteResPair<WriteDiv64, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
120 defm : SKXWriteResPair<WriteIDiv8, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
121 defm : SKXWriteResPair<WriteIDiv16, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
122 defm : SKXWriteResPair<WriteIDiv32, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
123 defm : SKXWriteResPair<WriteIDiv64, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
125 defm : SKXWriteResPair<WriteCRC32, [SKXPort1], 3>;
127 def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, high part.
128 def : WriteRes<WriteLEA, [SKXPort15]>; // LEA instructions can't fold loads.
130 defm : SKXWriteResPair<WriteCMOV, [SKXPort06], 1, [1], 1>; // Conditional move.
131 defm : SKXWriteResPair<WriteCMOV2, [SKXPort06], 2, [2], 2>; // Conditional (CF + ZF flag) move.
132 defm : X86WriteRes<WriteFCMOV, [SKXPort1], 3, [1], 1>; // x87 conditional move.
133 def : WriteRes<WriteSETCC, [SKXPort06]>; // Setcc.
134 def : WriteRes<WriteSETCCStore, [SKXPort06,SKXPort4,SKXPort237]> {
138 def : WriteRes<WriteLAHFSAHF, [SKXPort06]>;
139 def : WriteRes<WriteBitTest,[SKXPort06]>; //
141 // Integer shifts and rotates.
142 defm : SKXWriteResPair<WriteShift, [SKXPort06], 1>;
145 defm : X86WriteRes<WriteSHDrri, [SKXPort1], 3, [1], 1>;
146 defm : X86WriteRes<WriteSHDrrcl,[SKXPort1,SKXPort06,SKXPort0156], 6, [1, 2, 1], 4>;
147 defm : X86WriteRes<WriteSHDmri, [SKXPort1,SKXPort23,SKXPort237,SKXPort0156], 9, [1, 1, 1, 1], 4>;
148 defm : X86WriteRes<WriteSHDmrcl,[SKXPort1,SKXPort23,SKXPort237,SKXPort06,SKXPort0156], 11, [1, 1, 1, 2, 1], 6>;
151 defm : SKXWriteResPair<WriteBSF, [SKXPort1], 3>;
152 defm : SKXWriteResPair<WriteBSR, [SKXPort1], 3>;
153 defm : SKXWriteResPair<WriteLZCNT, [SKXPort1], 3>;
154 defm : SKXWriteResPair<WriteTZCNT, [SKXPort1], 3>;
155 defm : SKXWriteResPair<WritePOPCNT, [SKXPort1], 3>;
157 // BMI1 BEXTR, BMI2 BZHI
158 defm : SKXWriteResPair<WriteBEXTR, [SKXPort06,SKXPort15], 2, [1,1], 2>;
159 defm : SKXWriteResPair<WriteBZHI, [SKXPort15], 1>;
161 // Loads, stores, and moves, not folded with other operations.
162 defm : X86WriteRes<WriteLoad, [SKXPort23], 5, [1], 1>;
163 defm : X86WriteRes<WriteStore, [SKXPort237, SKXPort4], 1, [1,1], 1>;
164 defm : X86WriteRes<WriteStoreNT, [SKXPort237, SKXPort4], 1, [1,1], 2>;
165 defm : X86WriteRes<WriteMove, [SKXPort0156], 1, [1], 1>;
167 // Idioms that clear a register, like xorps %xmm0, %xmm0.
168 // These can often bypass execution ports completely.
169 def : WriteRes<WriteZero, []>;
171 // Branches don't produce values, so they have no latency, but they still
172 // consume resources. Indirect branches can fold loads.
173 defm : SKXWriteResPair<WriteJump, [SKXPort06], 1>;
175 // Floating point. This covers both scalar and vector operations.
176 defm : X86WriteRes<WriteFLD0, [SKXPort05], 1, [1], 1>;
177 defm : X86WriteRes<WriteFLD1, [SKXPort05], 1, [2], 2>;
178 defm : X86WriteRes<WriteFLDC, [SKXPort05], 1, [2], 2>;
179 defm : X86WriteRes<WriteFLoad, [SKXPort23], 5, [1], 1>;
180 defm : X86WriteRes<WriteFLoadX, [SKXPort23], 6, [1], 1>;
181 defm : X86WriteRes<WriteFLoadY, [SKXPort23], 7, [1], 1>;
182 defm : X86WriteRes<WriteFMaskedLoad, [SKXPort23,SKXPort015], 7, [1,1], 2>;
183 defm : X86WriteRes<WriteFMaskedLoadY, [SKXPort23,SKXPort015], 8, [1,1], 2>;
184 defm : X86WriteRes<WriteFStore, [SKXPort237,SKXPort4], 1, [1,1], 2>;
185 defm : X86WriteRes<WriteFStoreX, [SKXPort237,SKXPort4], 1, [1,1], 2>;
186 defm : X86WriteRes<WriteFStoreY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
187 defm : X86WriteRes<WriteFStoreNT, [SKXPort237,SKXPort4], 1, [1,1], 2>;
188 defm : X86WriteRes<WriteFStoreNTX, [SKXPort237,SKXPort4], 1, [1,1], 2>;
189 defm : X86WriteRes<WriteFStoreNTY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
190 defm : X86WriteRes<WriteFMaskedStore, [SKXPort237,SKXPort0], 2, [1,1], 2>;
191 defm : X86WriteRes<WriteFMaskedStoreY, [SKXPort237,SKXPort0], 2, [1,1], 2>;
192 defm : X86WriteRes<WriteFMove, [SKXPort015], 1, [1], 1>;
193 defm : X86WriteRes<WriteFMoveX, [SKXPort015], 1, [1], 1>;
194 defm : X86WriteRes<WriteFMoveY, [SKXPort015], 1, [1], 1>;
195 defm : X86WriteRes<WriteEMMS, [SKXPort05,SKXPort0156], 10, [9,1], 10>;
197 defm : SKXWriteResPair<WriteFAdd, [SKXPort01], 4, [1], 1, 5>; // Floating point add/sub.
198 defm : SKXWriteResPair<WriteFAddX, [SKXPort01], 4, [1], 1, 6>;
199 defm : SKXWriteResPair<WriteFAddY, [SKXPort01], 4, [1], 1, 7>;
200 defm : SKXWriteResPair<WriteFAddZ, [SKXPort05], 4, [1], 1, 7>;
201 defm : SKXWriteResPair<WriteFAdd64, [SKXPort01], 4, [1], 1, 5>; // Floating point double add/sub.
202 defm : SKXWriteResPair<WriteFAdd64X, [SKXPort01], 4, [1], 1, 6>;
203 defm : SKXWriteResPair<WriteFAdd64Y, [SKXPort01], 4, [1], 1, 7>;
204 defm : SKXWriteResPair<WriteFAdd64Z, [SKXPort05], 4, [1], 1, 7>;
206 defm : SKXWriteResPair<WriteFCmp, [SKXPort01], 4, [1], 1, 5>; // Floating point compare.
207 defm : SKXWriteResPair<WriteFCmpX, [SKXPort01], 4, [1], 1, 6>;
208 defm : SKXWriteResPair<WriteFCmpY, [SKXPort01], 4, [1], 1, 7>;
209 defm : SKXWriteResPair<WriteFCmpZ, [SKXPort05], 4, [1], 1, 7>;
210 defm : SKXWriteResPair<WriteFCmp64, [SKXPort01], 4, [1], 1, 5>; // Floating point double compare.
211 defm : SKXWriteResPair<WriteFCmp64X, [SKXPort01], 4, [1], 1, 6>;
212 defm : SKXWriteResPair<WriteFCmp64Y, [SKXPort01], 4, [1], 1, 7>;
213 defm : SKXWriteResPair<WriteFCmp64Z, [SKXPort05], 4, [1], 1, 7>;
215 defm : SKXWriteResPair<WriteFCom, [SKXPort0], 2>; // Floating point compare to flags.
217 defm : SKXWriteResPair<WriteFMul, [SKXPort01], 4, [1], 1, 5>; // Floating point multiplication.
218 defm : SKXWriteResPair<WriteFMulX, [SKXPort01], 4, [1], 1, 6>;
219 defm : SKXWriteResPair<WriteFMulY, [SKXPort01], 4, [1], 1, 7>;
220 defm : SKXWriteResPair<WriteFMulZ, [SKXPort05], 4, [1], 1, 7>;
221 defm : SKXWriteResPair<WriteFMul64, [SKXPort01], 4, [1], 1, 5>; // Floating point double multiplication.
222 defm : SKXWriteResPair<WriteFMul64X, [SKXPort01], 4, [1], 1, 6>;
223 defm : SKXWriteResPair<WriteFMul64Y, [SKXPort01], 4, [1], 1, 7>;
224 defm : SKXWriteResPair<WriteFMul64Z, [SKXPort05], 4, [1], 1, 7>;
226 defm : SKXWriteResPair<WriteFDiv, [SKXPort0,SKXFPDivider], 11, [1,3], 1, 5>; // 10-14 cycles. // Floating point division.
227 //defm : SKXWriteResPair<WriteFDivX, [SKXPort0,SKXFPDivider], 11, [1,3], 1, 6>; // 10-14 cycles.
228 defm : SKXWriteResPair<WriteFDivY, [SKXPort0,SKXFPDivider], 11, [1,5], 1, 7>; // 10-14 cycles.
229 defm : SKXWriteResPair<WriteFDivZ, [SKXPort0,SKXPort5,SKXFPDivider], 18, [2,1,10], 3, 7>; // 10-14 cycles.
230 //defm : SKXWriteResPair<WriteFDiv64, [SKXPort0,SKXFPDivider], 14, [1,3], 1, 5>; // 10-14 cycles. // Floating point division.
231 //defm : SKXWriteResPair<WriteFDiv64X, [SKXPort0,SKXFPDivider], 14, [1,3], 1, 6>; // 10-14 cycles.
232 //defm : SKXWriteResPair<WriteFDiv64Y, [SKXPort0,SKXFPDivider], 14, [1,5], 1, 7>; // 10-14 cycles.
233 defm : SKXWriteResPair<WriteFDiv64Z, [SKXPort0,SKXPort5,SKXFPDivider], 23, [2,1,16], 3, 7>; // 10-14 cycles.
235 defm : SKXWriteResPair<WriteFSqrt, [SKXPort0,SKXFPDivider], 12, [1,3], 1, 5>; // Floating point square root.
236 defm : SKXWriteResPair<WriteFSqrtX, [SKXPort0,SKXFPDivider], 12, [1,3], 1, 6>;
237 defm : SKXWriteResPair<WriteFSqrtY, [SKXPort0,SKXFPDivider], 12, [1,6], 1, 7>;
238 defm : SKXWriteResPair<WriteFSqrtZ, [SKXPort0,SKXPort5,SKXFPDivider], 20, [2,1,12], 3, 7>;
239 defm : SKXWriteResPair<WriteFSqrt64, [SKXPort0,SKXFPDivider], 18, [1,6], 1, 5>; // Floating point double square root.
240 defm : SKXWriteResPair<WriteFSqrt64X, [SKXPort0,SKXFPDivider], 18, [1,6], 1, 6>;
241 defm : SKXWriteResPair<WriteFSqrt64Y, [SKXPort0,SKXFPDivider], 18, [1,12],1, 7>;
242 defm : SKXWriteResPair<WriteFSqrt64Z, [SKXPort0,SKXPort5,SKXFPDivider], 32, [2,1,24], 3, 7>;
243 defm : SKXWriteResPair<WriteFSqrt80, [SKXPort0,SKXFPDivider], 21, [1,7]>; // Floating point long double square root.
245 defm : SKXWriteResPair<WriteFRcp, [SKXPort0], 4, [1], 1, 5>; // Floating point reciprocal estimate.
246 defm : SKXWriteResPair<WriteFRcpX, [SKXPort0], 4, [1], 1, 6>;
247 defm : SKXWriteResPair<WriteFRcpY, [SKXPort0], 4, [1], 1, 7>;
248 defm : SKXWriteResPair<WriteFRcpZ, [SKXPort0,SKXPort5], 4, [2,1], 3, 7>;
250 defm : SKXWriteResPair<WriteFRsqrt, [SKXPort0], 4, [1], 1, 5>; // Floating point reciprocal square root estimate.
251 defm : SKXWriteResPair<WriteFRsqrtX,[SKXPort0], 4, [1], 1, 6>;
252 defm : SKXWriteResPair<WriteFRsqrtY,[SKXPort0], 4, [1], 1, 7>;
253 defm : SKXWriteResPair<WriteFRsqrtZ,[SKXPort0,SKXPort5], 9, [2,1], 3, 7>;
255 defm : SKXWriteResPair<WriteFMA, [SKXPort01], 4, [1], 1, 5>; // Fused Multiply Add.
256 defm : SKXWriteResPair<WriteFMAX, [SKXPort01], 4, [1], 1, 6>;
257 defm : SKXWriteResPair<WriteFMAY, [SKXPort01], 4, [1], 1, 7>;
258 defm : SKXWriteResPair<WriteFMAZ, [SKXPort05], 4, [1], 1, 7>;
259 defm : SKXWriteResPair<WriteDPPD, [SKXPort5,SKXPort015], 9, [1,2], 3, 6>; // Floating point double dot product.
260 defm : SKXWriteResPair<WriteDPPS, [SKXPort5,SKXPort015], 13, [1,3], 4, 6>;
261 defm : SKXWriteResPair<WriteDPPSY,[SKXPort5,SKXPort015], 13, [1,3], 4, 7>;
262 defm : SKXWriteResPair<WriteDPPSZ,[SKXPort5,SKXPort015], 13, [1,3], 4, 7>;
263 defm : SKXWriteResPair<WriteFSign, [SKXPort0], 1>; // Floating point fabs/fchs.
264 defm : SKXWriteResPair<WriteFRnd, [SKXPort01], 8, [2], 2, 6>; // Floating point rounding.
265 defm : SKXWriteResPair<WriteFRndY, [SKXPort01], 8, [2], 2, 7>;
266 defm : SKXWriteResPair<WriteFRndZ, [SKXPort05], 8, [2], 2, 7>;
267 defm : SKXWriteResPair<WriteFLogic, [SKXPort015], 1, [1], 1, 6>; // Floating point and/or/xor logicals.
268 defm : SKXWriteResPair<WriteFLogicY, [SKXPort015], 1, [1], 1, 7>;
269 defm : SKXWriteResPair<WriteFLogicZ, [SKXPort05], 1, [1], 1, 7>;
270 defm : SKXWriteResPair<WriteFTest, [SKXPort0], 2, [1], 1, 6>; // Floating point TEST instructions.
271 defm : SKXWriteResPair<WriteFTestY, [SKXPort0], 2, [1], 1, 7>;
272 defm : SKXWriteResPair<WriteFTestZ, [SKXPort0], 2, [1], 1, 7>;
273 defm : SKXWriteResPair<WriteFShuffle, [SKXPort5], 1, [1], 1, 6>; // Floating point vector shuffles.
274 defm : SKXWriteResPair<WriteFShuffleY, [SKXPort5], 1, [1], 1, 7>;
275 defm : SKXWriteResPair<WriteFShuffleZ, [SKXPort5], 1, [1], 1, 7>;
276 defm : SKXWriteResPair<WriteFVarShuffle, [SKXPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
277 defm : SKXWriteResPair<WriteFVarShuffleY, [SKXPort5], 1, [1], 1, 7>;
278 defm : SKXWriteResPair<WriteFVarShuffleZ, [SKXPort5], 1, [1], 1, 7>;
279 defm : SKXWriteResPair<WriteFBlend, [SKXPort015], 1, [1], 1, 6>; // Floating point vector blends.
280 defm : SKXWriteResPair<WriteFBlendY,[SKXPort015], 1, [1], 1, 7>;
281 defm : SKXWriteResPair<WriteFBlendZ,[SKXPort015], 1, [1], 1, 7>;
282 defm : SKXWriteResPair<WriteFVarBlend, [SKXPort015], 2, [2], 2, 6>; // Fp vector variable blends.
283 defm : SKXWriteResPair<WriteFVarBlendY,[SKXPort015], 2, [2], 2, 7>;
284 defm : SKXWriteResPair<WriteFVarBlendZ,[SKXPort015], 2, [2], 2, 7>;
286 // FMA Scheduling helper class.
287 // class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
289 // Vector integer operations.
290 defm : X86WriteRes<WriteVecLoad, [SKXPort23], 5, [1], 1>;
291 defm : X86WriteRes<WriteVecLoadX, [SKXPort23], 6, [1], 1>;
292 defm : X86WriteRes<WriteVecLoadY, [SKXPort23], 7, [1], 1>;
293 defm : X86WriteRes<WriteVecLoadNT, [SKXPort23], 6, [1], 1>;
294 defm : X86WriteRes<WriteVecLoadNTY, [SKXPort23], 7, [1], 1>;
295 defm : X86WriteRes<WriteVecMaskedLoad, [SKXPort23,SKXPort015], 7, [1,1], 2>;
296 defm : X86WriteRes<WriteVecMaskedLoadY, [SKXPort23,SKXPort015], 8, [1,1], 2>;
297 defm : X86WriteRes<WriteVecStore, [SKXPort237,SKXPort4], 1, [1,1], 2>;
298 defm : X86WriteRes<WriteVecStoreX, [SKXPort237,SKXPort4], 1, [1,1], 2>;
299 defm : X86WriteRes<WriteVecStoreY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
300 defm : X86WriteRes<WriteVecStoreNT, [SKXPort237,SKXPort4], 1, [1,1], 2>;
301 defm : X86WriteRes<WriteVecStoreNTY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
302 defm : X86WriteRes<WriteVecMaskedStore, [SKXPort237,SKXPort0], 2, [1,1], 2>;
303 defm : X86WriteRes<WriteVecMaskedStoreY, [SKXPort237,SKXPort0], 2, [1,1], 2>;
304 defm : X86WriteRes<WriteVecMove, [SKXPort05], 1, [1], 1>;
305 defm : X86WriteRes<WriteVecMoveX, [SKXPort015], 1, [1], 1>;
306 defm : X86WriteRes<WriteVecMoveY, [SKXPort015], 1, [1], 1>;
307 defm : X86WriteRes<WriteVecMoveToGpr, [SKXPort0], 2, [1], 1>;
308 defm : X86WriteRes<WriteVecMoveFromGpr, [SKXPort5], 1, [1], 1>;
310 defm : SKXWriteResPair<WriteVecALU, [SKXPort05], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
311 defm : SKXWriteResPair<WriteVecALUX, [SKXPort01], 1, [1], 1, 6>;
312 defm : SKXWriteResPair<WriteVecALUY, [SKXPort01], 1, [1], 1, 7>;
313 defm : SKXWriteResPair<WriteVecALUZ, [SKXPort0], 1, [1], 1, 7>;
314 defm : SKXWriteResPair<WriteVecLogic, [SKXPort05], 1, [1], 1, 5>; // Vector integer and/or/xor.
315 defm : SKXWriteResPair<WriteVecLogicX,[SKXPort015], 1, [1], 1, 6>;
316 defm : SKXWriteResPair<WriteVecLogicY,[SKXPort015], 1, [1], 1, 7>;
317 defm : SKXWriteResPair<WriteVecLogicZ,[SKXPort05], 1, [1], 1, 7>;
318 defm : SKXWriteResPair<WriteVecTest, [SKXPort0,SKXPort5], 3, [1,1], 2, 6>; // Vector integer TEST instructions.
319 defm : SKXWriteResPair<WriteVecTestY, [SKXPort0,SKXPort5], 3, [1,1], 2, 7>;
320 defm : SKXWriteResPair<WriteVecTestZ, [SKXPort0,SKXPort5], 3, [1,1], 2, 7>;
321 defm : SKXWriteResPair<WriteVecIMul, [SKXPort0], 4, [1], 1, 5>; // Vector integer multiply.
322 defm : SKXWriteResPair<WriteVecIMulX, [SKXPort01], 4, [1], 1, 6>;
323 defm : SKXWriteResPair<WriteVecIMulY, [SKXPort01], 4, [1], 1, 7>;
324 defm : SKXWriteResPair<WriteVecIMulZ, [SKXPort05], 4, [1], 1, 7>;
325 defm : SKXWriteResPair<WritePMULLD, [SKXPort01], 10, [2], 2, 6>; // Vector PMULLD.
326 defm : SKXWriteResPair<WritePMULLDY, [SKXPort01], 10, [2], 2, 7>;
327 defm : SKXWriteResPair<WritePMULLDZ, [SKXPort05], 10, [2], 2, 7>;
328 defm : SKXWriteResPair<WriteShuffle, [SKXPort5], 1, [1], 1, 5>; // Vector shuffles.
329 defm : SKXWriteResPair<WriteShuffleX, [SKXPort5], 1, [1], 1, 6>;
330 defm : SKXWriteResPair<WriteShuffleY, [SKXPort5], 1, [1], 1, 7>;
331 defm : SKXWriteResPair<WriteShuffleZ, [SKXPort5], 1, [1], 1, 7>;
332 defm : SKXWriteResPair<WriteVarShuffle, [SKXPort5], 1, [1], 1, 5>; // Vector variable shuffles.
333 defm : SKXWriteResPair<WriteVarShuffleX, [SKXPort5], 1, [1], 1, 6>;
334 defm : SKXWriteResPair<WriteVarShuffleY, [SKXPort5], 1, [1], 1, 7>;
335 defm : SKXWriteResPair<WriteVarShuffleZ, [SKXPort5], 1, [1], 1, 7>;
336 defm : SKXWriteResPair<WriteBlend, [SKXPort5], 1, [1], 1, 6>; // Vector blends.
337 defm : SKXWriteResPair<WriteBlendY,[SKXPort5], 1, [1], 1, 7>;
338 defm : SKXWriteResPair<WriteBlendZ,[SKXPort5], 1, [1], 1, 7>;
339 defm : SKXWriteResPair<WriteVarBlend, [SKXPort015], 2, [2], 2, 6>; // Vector variable blends.
340 defm : SKXWriteResPair<WriteVarBlendY,[SKXPort015], 2, [2], 2, 6>;
341 defm : SKXWriteResPair<WriteVarBlendZ,[SKXPort05], 2, [1], 1, 6>;
342 defm : SKXWriteResPair<WriteMPSAD, [SKXPort5], 4, [2], 2, 6>; // Vector MPSAD.
343 defm : SKXWriteResPair<WriteMPSADY, [SKXPort5], 4, [2], 2, 7>;
344 defm : SKXWriteResPair<WriteMPSADZ, [SKXPort5], 4, [2], 2, 7>;
345 defm : SKXWriteResPair<WritePSADBW, [SKXPort5], 3, [1], 1, 5>; // Vector PSADBW.
346 defm : SKXWriteResPair<WritePSADBWX, [SKXPort5], 3, [1], 1, 6>;
347 defm : SKXWriteResPair<WritePSADBWY, [SKXPort5], 3, [1], 1, 7>;
348 defm : SKXWriteResPair<WritePSADBWZ, [SKXPort5], 3, [1], 1, 7>;
349 defm : SKXWriteResPair<WritePHMINPOS, [SKXPort0], 4, [1], 1, 6>; // Vector PHMINPOS.
351 // Vector integer shifts.
352 defm : SKXWriteResPair<WriteVecShift, [SKXPort0], 1, [1], 1, 5>;
353 defm : X86WriteRes<WriteVecShiftX, [SKXPort5,SKXPort01], 2, [1,1], 2>;
354 defm : X86WriteRes<WriteVecShiftY, [SKXPort5,SKXPort01], 4, [1,1], 2>;
355 defm : X86WriteRes<WriteVecShiftZ, [SKXPort5,SKXPort0], 4, [1,1], 2>;
356 defm : X86WriteRes<WriteVecShiftXLd, [SKXPort01,SKXPort23], 7, [1,1], 2>;
357 defm : X86WriteRes<WriteVecShiftYLd, [SKXPort01,SKXPort23], 8, [1,1], 2>;
358 defm : X86WriteRes<WriteVecShiftZLd, [SKXPort0,SKXPort23], 8, [1,1], 2>;
360 defm : SKXWriteResPair<WriteVecShiftImm, [SKXPort0], 1, [1], 1, 5>;
361 defm : SKXWriteResPair<WriteVecShiftImmX, [SKXPort01], 1, [1], 1, 6>; // Vector integer immediate shifts.
362 defm : SKXWriteResPair<WriteVecShiftImmY, [SKXPort01], 1, [1], 1, 7>;
363 defm : SKXWriteResPair<WriteVecShiftImmZ, [SKXPort0], 1, [1], 1, 7>;
364 defm : SKXWriteResPair<WriteVarVecShift, [SKXPort01], 1, [1], 1, 6>; // Variable vector shifts.
365 defm : SKXWriteResPair<WriteVarVecShiftY, [SKXPort01], 1, [1], 1, 7>;
366 defm : SKXWriteResPair<WriteVarVecShiftZ, [SKXPort0], 1, [1], 1, 7>;
368 // Vector insert/extract operations.
369 def : WriteRes<WriteVecInsert, [SKXPort5]> {
372 let ResourceCycles = [2];
374 def : WriteRes<WriteVecInsertLd, [SKXPort5,SKXPort23]> {
378 def: InstRW<[WriteVecInsertLd], (instregex "(V?)MOV(H|L)(PD|PS)rm")>;
380 def : WriteRes<WriteVecExtract, [SKXPort0,SKXPort5]> {
384 def : WriteRes<WriteVecExtractSt, [SKXPort4,SKXPort5,SKXPort237]> {
389 // Conversion between integer and float.
390 defm : SKXWriteResPair<WriteCvtSS2I, [SKXPort01], 6, [2], 2>; // Needs more work: DD vs DQ.
391 defm : SKXWriteResPair<WriteCvtPS2I, [SKXPort01], 3>;
392 defm : SKXWriteResPair<WriteCvtPS2IY, [SKXPort01], 3>;
393 defm : SKXWriteResPair<WriteCvtPS2IZ, [SKXPort05], 3>;
394 defm : SKXWriteResPair<WriteCvtSD2I, [SKXPort01], 6, [2], 2>;
395 defm : SKXWriteResPair<WriteCvtPD2I, [SKXPort01], 3>;
396 defm : SKXWriteResPair<WriteCvtPD2IY, [SKXPort01], 3>;
397 defm : SKXWriteResPair<WriteCvtPD2IZ, [SKXPort05], 3>;
399 defm : SKXWriteResPair<WriteCvtI2SS, [SKXPort1], 4>;
400 defm : SKXWriteResPair<WriteCvtI2PS, [SKXPort01], 4>;
401 defm : SKXWriteResPair<WriteCvtI2PSY, [SKXPort01], 4>;
402 defm : SKXWriteResPair<WriteCvtI2PSZ, [SKXPort05], 4>; // Needs more work: DD vs DQ.
403 defm : SKXWriteResPair<WriteCvtI2SD, [SKXPort1], 4>;
404 defm : SKXWriteResPair<WriteCvtI2PD, [SKXPort01], 4>;
405 defm : SKXWriteResPair<WriteCvtI2PDY, [SKXPort01], 4>;
406 defm : SKXWriteResPair<WriteCvtI2PDZ, [SKXPort05], 4>;
408 defm : SKXWriteResPair<WriteCvtSS2SD, [SKXPort1], 3>;
409 defm : SKXWriteResPair<WriteCvtPS2PD, [SKXPort1], 3>;
410 defm : SKXWriteResPair<WriteCvtPS2PDY, [SKXPort5,SKXPort01], 3, [1,1], 2>;
411 defm : SKXWriteResPair<WriteCvtPS2PDZ, [SKXPort05], 3, [2], 2>;
412 defm : SKXWriteResPair<WriteCvtSD2SS, [SKXPort1], 3>;
413 defm : SKXWriteResPair<WriteCvtPD2PS, [SKXPort1], 3>;
414 defm : SKXWriteResPair<WriteCvtPD2PSY, [SKXPort5,SKXPort01], 3, [1,1], 2>;
415 defm : SKXWriteResPair<WriteCvtPD2PSZ, [SKXPort05], 3, [2], 2>;
417 defm : X86WriteRes<WriteCvtPH2PS, [SKXPort5,SKXPort01], 5, [1,1], 2>;
418 defm : X86WriteRes<WriteCvtPH2PSY, [SKXPort5,SKXPort01], 7, [1,1], 2>;
419 defm : X86WriteRes<WriteCvtPH2PSZ, [SKXPort5,SKXPort0], 7, [1,1], 2>;
420 defm : X86WriteRes<WriteCvtPH2PSLd, [SKXPort23,SKXPort01], 9, [1,1], 2>;
421 defm : X86WriteRes<WriteCvtPH2PSYLd, [SKXPort23,SKXPort01], 10, [1,1], 2>;
422 defm : X86WriteRes<WriteCvtPH2PSZLd, [SKXPort23,SKXPort05], 10, [1,1], 2>;
424 defm : X86WriteRes<WriteCvtPS2PH, [SKXPort5,SKXPort01], 5, [1,1], 2>;
425 defm : X86WriteRes<WriteCvtPS2PHY, [SKXPort5,SKXPort01], 7, [1,1], 2>;
426 defm : X86WriteRes<WriteCvtPS2PHZ, [SKXPort5,SKXPort05], 7, [1,1], 2>;
427 defm : X86WriteRes<WriteCvtPS2PHSt, [SKXPort4,SKXPort5,SKXPort237,SKXPort01], 6, [1,1,1,1], 4>;
428 defm : X86WriteRes<WriteCvtPS2PHYSt, [SKXPort4,SKXPort5,SKXPort237,SKXPort01], 8, [1,1,1,1], 4>;
429 defm : X86WriteRes<WriteCvtPS2PHZSt, [SKXPort4,SKXPort5,SKXPort237,SKXPort05], 8, [1,1,1,1], 4>;
431 // Strings instructions.
433 // Packed Compare Implicit Length Strings, Return Mask
434 def : WriteRes<WritePCmpIStrM, [SKXPort0]> {
437 let ResourceCycles = [3];
439 def : WriteRes<WritePCmpIStrMLd, [SKXPort0, SKXPort23]> {
442 let ResourceCycles = [3,1];
445 // Packed Compare Explicit Length Strings, Return Mask
446 def : WriteRes<WritePCmpEStrM, [SKXPort0, SKXPort5, SKXPort015, SKXPort0156]> {
449 let ResourceCycles = [4,3,1,1];
451 def : WriteRes<WritePCmpEStrMLd, [SKXPort0, SKXPort5, SKXPort23, SKXPort015, SKXPort0156]> {
453 let NumMicroOps = 10;
454 let ResourceCycles = [4,3,1,1,1];
457 // Packed Compare Implicit Length Strings, Return Index
458 def : WriteRes<WritePCmpIStrI, [SKXPort0]> {
461 let ResourceCycles = [3];
463 def : WriteRes<WritePCmpIStrILd, [SKXPort0, SKXPort23]> {
466 let ResourceCycles = [3,1];
469 // Packed Compare Explicit Length Strings, Return Index
470 def : WriteRes<WritePCmpEStrI, [SKXPort0,SKXPort5,SKXPort0156]> {
473 let ResourceCycles = [4,3,1];
475 def : WriteRes<WritePCmpEStrILd, [SKXPort0, SKXPort5, SKXPort23, SKXPort0156]> {
478 let ResourceCycles = [4,3,1,1];
481 // MOVMSK Instructions.
482 def : WriteRes<WriteFMOVMSK, [SKXPort0]> { let Latency = 2; }
483 def : WriteRes<WriteVecMOVMSK, [SKXPort0]> { let Latency = 2; }
484 def : WriteRes<WriteVecMOVMSKY, [SKXPort0]> { let Latency = 2; }
485 def : WriteRes<WriteMMXMOVMSK, [SKXPort0]> { let Latency = 2; }
488 def : WriteRes<WriteAESDecEnc, [SKXPort0]> { // Decryption, encryption.
491 let ResourceCycles = [1];
493 def : WriteRes<WriteAESDecEncLd, [SKXPort0, SKXPort23]> {
496 let ResourceCycles = [1,1];
499 def : WriteRes<WriteAESIMC, [SKXPort0]> { // InvMixColumn.
502 let ResourceCycles = [2];
504 def : WriteRes<WriteAESIMCLd, [SKXPort0, SKXPort23]> {
507 let ResourceCycles = [2,1];
510 def : WriteRes<WriteAESKeyGen, [SKXPort0,SKXPort5,SKXPort015]> { // Key Generation.
512 let NumMicroOps = 11;
513 let ResourceCycles = [3,6,2];
515 def : WriteRes<WriteAESKeyGenLd, [SKXPort0,SKXPort5,SKXPort23,SKXPort015]> {
517 let NumMicroOps = 11;
518 let ResourceCycles = [3,6,1,1];
521 // Carry-less multiplication instructions.
522 def : WriteRes<WriteCLMul, [SKXPort5]> {
525 let ResourceCycles = [1];
527 def : WriteRes<WriteCLMulLd, [SKXPort5, SKXPort23]> {
530 let ResourceCycles = [1,1];
533 // Catch-all for expensive system instructions.
534 def : WriteRes<WriteSystem, [SKXPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
537 defm : SKXWriteResPair<WriteFShuffle256, [SKXPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
538 defm : SKXWriteResPair<WriteFVarShuffle256, [SKXPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
539 defm : SKXWriteResPair<WriteShuffle256, [SKXPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
540 defm : SKXWriteResPair<WriteVarShuffle256, [SKXPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
542 // Old microcoded instructions that nobody use.
543 def : WriteRes<WriteMicrocoded, [SKXPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
545 // Fence instructions.
546 def : WriteRes<WriteFence, [SKXPort23, SKXPort4]>;
549 def : WriteRes<WriteLDMXCSR, [SKXPort0,SKXPort23,SKXPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
550 def : WriteRes<WriteSTMXCSR, [SKXPort4,SKXPort5,SKXPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
552 // Nop, not very useful expect it provides a model for nops!
553 def : WriteRes<WriteNop, []>;
555 ////////////////////////////////////////////////////////////////////////////////
556 // Horizontal add/sub instructions.
557 ////////////////////////////////////////////////////////////////////////////////
559 defm : SKXWriteResPair<WriteFHAdd, [SKXPort5,SKXPort015], 6, [2,1], 3, 6>;
560 defm : SKXWriteResPair<WriteFHAddY, [SKXPort5,SKXPort015], 6, [2,1], 3, 7>;
561 defm : SKXWriteResPair<WritePHAdd, [SKXPort5,SKXPort05], 3, [2,1], 3, 5>;
562 defm : SKXWriteResPair<WritePHAddX, [SKXPort5,SKXPort015], 3, [2,1], 3, 6>;
563 defm : SKXWriteResPair<WritePHAddY, [SKXPort5,SKXPort015], 3, [2,1], 3, 7>;
567 def SKXWriteResGroup1 : SchedWriteRes<[SKXPort0]> {
570 let ResourceCycles = [1];
572 def: InstRW<[SKXWriteResGroup1], (instregex "KAND(B|D|Q|W)rr",
580 "MMX_PADDUS(B|W)irr",
582 "MMX_PCMPEQ(B|D|W)irr",
583 "MMX_PCMPGT(B|D|W)irr",
584 "MMX_P(MAX|MIN)SWirr",
585 "MMX_P(MAX|MIN)UBirr",
587 "MMX_PSUBUS(B|W)irr",
588 "VPMOVB2M(Z|Z128|Z256)rr",
589 "VPMOVD2M(Z|Z128|Z256)rr",
590 "VPMOVQ2M(Z|Z128|Z256)rr",
591 "VPMOVW2M(Z|Z128|Z256)rr")>;
593 def SKXWriteResGroup3 : SchedWriteRes<[SKXPort5]> {
596 let ResourceCycles = [1];
598 def: InstRW<[SKXWriteResGroup3], (instregex "COM(P?)_FST0r",
602 def SKXWriteResGroup4 : SchedWriteRes<[SKXPort6]> {
605 let ResourceCycles = [1];
607 def: InstRW<[SKXWriteResGroup4], (instregex "JMP(16|32|64)r")>;
609 def SKXWriteResGroup6 : SchedWriteRes<[SKXPort05]> {
612 let ResourceCycles = [1];
614 def: InstRW<[SKXWriteResGroup6], (instrs FINCSTP, FNOP)>;
616 def SKXWriteResGroup7 : SchedWriteRes<[SKXPort06]> {
619 let ResourceCycles = [1];
621 def: InstRW<[SKXWriteResGroup7], (instrs CDQ, CQO, CLAC, STAC)>;
623 def SKXWriteResGroup8 : SchedWriteRes<[SKXPort15]> {
626 let ResourceCycles = [1];
628 def: InstRW<[SKXWriteResGroup8], (instregex "ANDN(32|64)rr",
633 def SKXWriteResGroup9 : SchedWriteRes<[SKXPort015]> {
636 let ResourceCycles = [1];
638 def: InstRW<[SKXWriteResGroup9], (instregex "VBLENDMPD(Z128|Z256)rr",
639 "VBLENDMPS(Z128|Z256)rr",
640 "VPADD(B|D|Q|W)(Y|Z|Z128|Z256)rr",
641 "(V?)PADD(B|D|Q|W)rr",
643 "VPBLENDMB(Z128|Z256)rr",
644 "VPBLENDMD(Z128|Z256)rr",
645 "VPBLENDMQ(Z128|Z256)rr",
646 "VPBLENDMW(Z128|Z256)rr",
647 "VPSUB(B|D|Q|W)(Y|Z|Z128|Z256)rr",
648 "(V?)PSUB(B|D|Q|W)rr",
649 "VPTERNLOGD(Z|Z128|Z256)rri",
650 "VPTERNLOGQ(Z|Z128|Z256)rri")>;
652 def SKXWriteResGroup10 : SchedWriteRes<[SKXPort0156]> {
655 let ResourceCycles = [1];
657 def: InstRW<[SKXWriteResGroup10], (instrs CBW, CWDE, CDQE,
659 def: InstRW<[SKXWriteResGroup10], (instregex "SGDT64m",
665 def SKXWriteResGroup11 : SchedWriteRes<[SKXPort4,SKXPort237]> {
668 let ResourceCycles = [1,1];
670 def: InstRW<[SKXWriteResGroup11], (instregex "FBSTPm",
675 def SKXWriteResGroup13 : SchedWriteRes<[SKXPort5]> {
678 let ResourceCycles = [2];
680 def: InstRW<[SKXWriteResGroup13], (instregex "MMX_MOVQ2DQrr")>;
682 def SKXWriteResGroup14 : SchedWriteRes<[SKXPort05]> {
685 let ResourceCycles = [2];
687 def: InstRW<[SKXWriteResGroup14], (instrs FDECSTP)>;
688 def: InstRW<[SKXWriteResGroup14], (instregex "MMX_MOVDQ2Qrr")>;
690 def SKXWriteResGroup15 : SchedWriteRes<[SKXPort06]> {
693 let ResourceCycles = [2];
695 def: InstRW<[SKXWriteResGroup15], (instregex "ROL(8|16|32|64)r1",
701 def SKXWriteResGroup17 : SchedWriteRes<[SKXPort0156]> {
704 let ResourceCycles = [2];
706 def: InstRW<[SKXWriteResGroup17], (instrs LFENCE,
710 def SKXWriteResGroup20 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
713 let ResourceCycles = [1,1];
715 def: InstRW<[SKXWriteResGroup20], (instregex "CLFLUSH")>;
717 def SKXWriteResGroup21 : SchedWriteRes<[SKXPort237,SKXPort0156]> {
720 let ResourceCycles = [1,1];
722 def: InstRW<[SKXWriteResGroup21], (instrs SFENCE)>;
724 def SKXWriteResGroup23 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
727 let ResourceCycles = [1,1];
729 def: InstRW<[SKXWriteResGroup23], (instrs CWD)>;
730 def: InstRW<[SKXWriteResGroup23], (instrs JCXZ, JECXZ, JRCXZ)>;
731 def: InstRW<[SKXWriteResGroup23], (instregex "ADC8i8",
736 def SKXWriteResGroup25 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort237]> {
739 let ResourceCycles = [1,1,1];
741 def: InstRW<[SKXWriteResGroup25], (instrs FNSTCW16m)>;
743 def SKXWriteResGroup27 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort15]> {
746 let ResourceCycles = [1,1,1];
748 def: InstRW<[SKXWriteResGroup27], (instregex "MOVBE(16|32|64)mr")>;
750 def SKXWriteResGroup28 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort0156]> {
753 let ResourceCycles = [1,1,1];
755 def: InstRW<[SKXWriteResGroup28], (instrs PUSH16r, PUSH32r, PUSH64r,
756 STOSB, STOSL, STOSQ, STOSW)>;
757 def: InstRW<[SKXWriteResGroup28], (instregex "PUSH(16|32|64)rmr",
760 def SKXWriteResGroup29 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort15]> {
763 let ResourceCycles = [2,2,1];
765 def: InstRW<[SKXWriteResGroup29], (instregex "VMOVDQU8Zmr(b?)")>;
767 def SKXWriteResGroup30 : SchedWriteRes<[SKXPort0]> {
770 let ResourceCycles = [1];
772 def: InstRW<[SKXWriteResGroup30], (instregex "KMOV(B|D|Q|W)rk",
773 "KORTEST(B|D|Q|W)rr",
774 "KTEST(B|D|Q|W)rr")>;
776 def SKXWriteResGroup31 : SchedWriteRes<[SKXPort1]> {
779 let ResourceCycles = [1];
781 def: InstRW<[SKXWriteResGroup31], (instregex "PDEP(32|64)rr",
784 def SKXWriteResGroup31_16i : SchedWriteRes<[SKXPort1, SKXPort0156]> {
787 let ResourceCycles = [1,1];
789 def: InstRW<[SKXWriteResGroup31_16i], (instrs IMUL16rri, IMUL16rri8)>;
792 def SKXWriteResGroup32 : SchedWriteRes<[SKXPort5]> {
795 let ResourceCycles = [1];
797 def: InstRW<[SKXWriteResGroup32], (instregex "(ADD|SUB|SUBR)_(FPrST0|FST0r|FrST0)",
799 "KSHIFTL(B|D|Q|W)ri",
800 "KSHIFTR(B|D|Q|W)ri",
804 "VALIGND(Z|Z128|Z256)rri",
805 "VALIGNQ(Z|Z128|Z256)rri",
806 "VCMPPD(Z|Z128|Z256)rri",
807 "VCMPPS(Z|Z128|Z256)rri",
810 "VDBPSADBWZrri", // TODO: 512-bit ops require ports 0/1 to be joined.
811 "VFPCLASSPD(Z|Z128|Z256)rr",
812 "VFPCLASSPS(Z|Z128|Z256)rr",
817 "VPCMPB(Z|Z128|Z256)rri",
818 "VPCMPD(Z|Z128|Z256)rri",
819 "VPCMPEQ(B|D|Q|W)(Z|Z128|Z256)rr",
820 "VPCMPGT(B|D|Q|W)(Z|Z128|Z256)rr",
822 "VPCMPQ(Z|Z128|Z256)rri",
823 "VPCMPU(B|D|Q|W)(Z|Z128|Z256)rri",
824 "VPCMPW(Z|Z128|Z256)rri",
825 "VP(MAX|MIN)(S|U)Q(Z|Z128|Z256)rr",
826 "VPSADBWZrr", // TODO: 512-bit ops require ports 0/1 to be joined.
827 "VPTEST(N?)M(B|D|Q|W)(Z|Z128|Z256)rr")>;
829 def SKXWriteResGroup34 : SchedWriteRes<[SKXPort0,SKXPort0156]> {
832 let ResourceCycles = [1,1];
834 def: InstRW<[SKXWriteResGroup34], (instrs FNSTSW16r)>;
836 def SKXWriteResGroup35 : SchedWriteRes<[SKXPort06]> {
839 let ResourceCycles = [3];
841 def: InstRW<[SKXWriteResGroup35], (instregex "ROL(8|16|32|64)rCL",
842 "ROR(8|16|32|64)rCL",
843 "SAR(8|16|32|64)rCL",
844 "SHL(8|16|32|64)rCL",
845 "SHR(8|16|32|64)rCL")>;
847 def SKXWriteResGroup36 : SchedWriteRes<[SKXPort0156]> {
850 let ResourceCycles = [3];
852 def: InstRW<[SKXWriteResGroup36], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
853 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
854 XCHG16ar, XCHG32ar, XCHG64ar)>;
856 def SKXWriteResGroup37 : SchedWriteRes<[SKXPort0,SKXPort5]> {
859 let ResourceCycles = [1,2];
861 def: InstRW<[SKXWriteResGroup37], (instregex "MMX_PH(ADD|SUB)SWrr")>;
863 def SKXWriteResGroup38 : SchedWriteRes<[SKXPort5,SKXPort01]> {
866 let ResourceCycles = [2,1];
868 def: InstRW<[SKXWriteResGroup38], (instregex "(V?)PH(ADD|SUB)SW(Y?)rr")>;
870 def SKXWriteResGroup41 : SchedWriteRes<[SKXPort5,SKXPort0156]> {
873 let ResourceCycles = [2,1];
875 def: InstRW<[SKXWriteResGroup41], (instregex "MMX_PACKSSDWirr",
879 def SKXWriteResGroup42 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
882 let ResourceCycles = [1,2];
884 def: InstRW<[SKXWriteResGroup42], (instregex "CLD")>;
886 def SKXWriteResGroup43 : SchedWriteRes<[SKXPort237,SKXPort0156]> {
889 let ResourceCycles = [1,2];
891 def: InstRW<[SKXWriteResGroup43], (instrs MFENCE)>;
893 def SKXWriteResGroup44 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
896 let ResourceCycles = [1,2];
898 def: InstRW<[SKXWriteResGroup44], (instregex "RCL(8|16|32|64)r1",
901 "RCR(8|16|32|64)ri")>;
903 def SKXWriteResGroup45 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237]> {
906 let ResourceCycles = [1,1,1];
908 def: InstRW<[SKXWriteResGroup45], (instrs FNSTSWm)>;
910 def SKXWriteResGroup46 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort06]> {
913 let ResourceCycles = [1,1,2];
915 def: InstRW<[SKXWriteResGroup46], (instregex "SET(A|BE)m")>;
917 def SKXWriteResGroup47 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort237,SKXPort0156]> {
920 let ResourceCycles = [1,1,1,1];
922 def: InstRW<[SKXWriteResGroup47], (instregex "CALL(16|32|64)r")>;
924 def SKXWriteResGroup48 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort06,SKXPort0156]> {
927 let ResourceCycles = [1,1,1,1];
929 def: InstRW<[SKXWriteResGroup48], (instrs CALL64pcrel32)>;
931 def SKXWriteResGroup49 : SchedWriteRes<[SKXPort0]> {
934 let ResourceCycles = [1];
936 def: InstRW<[SKXWriteResGroup49], (instregex "MUL_(FPrST0|FST0r|FrST0)")>;
938 def SKXWriteResGroup50 : SchedWriteRes<[SKXPort01]> {
941 let ResourceCycles = [1];
943 def: InstRW<[SKXWriteResGroup50], (instregex "VCVTDQ2PS(Y|Z128|Z256)rr",
945 "VCVTPD2QQ(Z128|Z256)rr",
946 "VCVTPD2UQQ(Z128|Z256)rr",
947 "VCVTPS2DQ(Y|Z128|Z256)rr",
949 "VCVTPS2UDQ(Z128|Z256)rr",
950 "VCVTQQ2PD(Z128|Z256)rr",
951 "VCVTTPD2QQ(Z128|Z256)rr",
952 "VCVTTPD2UQQ(Z128|Z256)rr",
953 "VCVTTPS2DQ(Z128|Z256)rr",
955 "VCVTTPS2UDQ(Z128|Z256)rr",
956 "VCVTUDQ2PS(Z128|Z256)rr",
957 "VCVTUQQ2PD(Z128|Z256)rr")>;
959 def SKXWriteResGroup50z : SchedWriteRes<[SKXPort05]> {
962 let ResourceCycles = [1];
964 def: InstRW<[SKXWriteResGroup50z], (instrs VCVTDQ2PSZrr,
977 def SKXWriteResGroup51 : SchedWriteRes<[SKXPort5]> {
980 let ResourceCycles = [2];
982 def: InstRW<[SKXWriteResGroup51], (instregex "VEXPANDPD(Z|Z128|Z256)rr",
983 "VEXPANDPS(Z|Z128|Z256)rr",
984 "VPEXPANDD(Z|Z128|Z256)rr",
985 "VPEXPANDQ(Z|Z128|Z256)rr",
986 "VPMOVDB(Z|Z128|Z256)rr",
987 "VPMOVDW(Z|Z128|Z256)rr",
988 "VPMOVQB(Z|Z128|Z256)rr",
989 "VPMOVQW(Z|Z128|Z256)rr",
990 "VPMOVSDB(Z|Z128|Z256)rr",
991 "VPMOVSDW(Z|Z128|Z256)rr",
992 "VPMOVSQB(Z|Z128|Z256)rr",
993 "VPMOVSQD(Z|Z128|Z256)rr",
994 "VPMOVSQW(Z|Z128|Z256)rr",
995 "VPMOVSWB(Z|Z128|Z256)rr",
996 "VPMOVUSDB(Z|Z128|Z256)rr",
997 "VPMOVUSDW(Z|Z128|Z256)rr",
998 "VPMOVUSQB(Z|Z128|Z256)rr",
999 "VPMOVUSQD(Z|Z128|Z256)rr",
1000 "VPMOVUSWB(Z|Z128|Z256)rr",
1001 "VPMOVWB(Z|Z128|Z256)rr")>;
1003 def SKXWriteResGroup52 : SchedWriteRes<[SKXPort1,SKXPort5]> {
1005 let NumMicroOps = 2;
1006 let ResourceCycles = [1,1];
1008 def: InstRW<[SKXWriteResGroup52], (instrs IMUL64r, MUL64r, MULX64rr)>;
1010 def SKXWriteResGroup52_16 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort0156]> {
1012 let NumMicroOps = 4;
1013 let ResourceCycles = [1,1,2];
1015 def: InstRW<[SKXWriteResGroup52_16], (instrs IMUL16r, MUL16r)>;
1017 def SKXWriteResGroup54 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort237]> {
1019 let NumMicroOps = 3;
1020 let ResourceCycles = [1,1,1];
1022 def: InstRW<[SKXWriteResGroup54], (instregex "IST(T?)_FP(16|32|64)m",
1024 "VPMOVQD(Z|Z128|Z256)mr(b?)")>;
1026 def SKXWriteResGroup55 : SchedWriteRes<[SKXPort0156]> {
1028 let NumMicroOps = 4;
1029 let ResourceCycles = [4];
1031 def: InstRW<[SKXWriteResGroup55], (instrs FNCLEX)>;
1033 def SKXWriteResGroup56 : SchedWriteRes<[SKXPort015,SKXPort0156]> {
1035 let NumMicroOps = 4;
1036 let ResourceCycles = [1,3];
1038 def: InstRW<[SKXWriteResGroup56], (instrs VZEROUPPER)>;
1040 def SKXWriteResGroup57 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort0156]> {
1042 let NumMicroOps = 4;
1043 let ResourceCycles = [1,1,2];
1045 def: InstRW<[SKXWriteResGroup57], (instregex "LAR(16|32|64)rr")>;
1047 def SKXWriteResGroup58 : SchedWriteRes<[SKXPort23]> {
1049 let NumMicroOps = 1;
1050 let ResourceCycles = [1];
1052 def: InstRW<[SKXWriteResGroup58], (instregex "MOVSX(16|32|64)rm16",
1053 "MOVSX(16|32|64)rm32",
1054 "MOVSX(16|32|64)rm8",
1055 "MOVZX(16|32|64)rm16",
1056 "MOVZX(16|32|64)rm8",
1057 "(V?)MOVDDUPrm")>; // TODO: Should this be SKXWriteResGroup71?
1059 def SKXWriteResGroup61 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1061 let NumMicroOps = 2;
1062 let ResourceCycles = [1,1];
1064 def: InstRW<[SKXWriteResGroup61], (instregex "MMX_CVT(T?)PD2PIirr",
1065 "MMX_CVT(T?)PS2PIirr",
1068 "(V?)CVT(T?)PD2DQrr",
1077 "(V?)CVTSD2SS(Z?)rr",
1078 "(V?)CVTSI(64)?2SDrr",
1081 "VCVTSI(64)?2SDZrr",
1085 "VCVTTPD2UDQZ128rr",
1087 "VCVTTPS2UQQZ128rr",
1091 "VCVTUSI(64)?2SDZrr")>;
1093 def SKXWriteResGroup62 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1095 let NumMicroOps = 3;
1096 let ResourceCycles = [2,1];
1098 def: InstRW<[SKXWriteResGroup62], (instregex "VPCONFLICTQZ128rr")>;
1100 def SKXWriteResGroup63 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort06]> {
1102 let NumMicroOps = 3;
1103 let ResourceCycles = [1,1,1];
1105 def: InstRW<[SKXWriteResGroup63], (instregex "STR(16|32|64)r")>;
1107 def SKXWriteResGroup64 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort0156]> {
1109 let NumMicroOps = 3;
1110 let ResourceCycles = [1,1,1];
1112 def: InstRW<[SKXWriteResGroup64], (instrs IMUL32r, MUL32r, MULX32rr)>;
1114 def SKXWriteResGroup65 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort015]> {
1116 let NumMicroOps = 3;
1117 let ResourceCycles = [1,1,1];
1119 def: InstRW<[SKXWriteResGroup65], (instregex "VCVTPS2PHZ128mr(b?)",
1120 "VCVTPS2PHZ256mr(b?)",
1121 "VCVTPS2PHZmr(b?)")>;
1123 def SKXWriteResGroup66 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort237]> {
1125 let NumMicroOps = 4;
1126 let ResourceCycles = [1,2,1];
1128 def: InstRW<[SKXWriteResGroup66], (instregex "VPMOVDB(Z|Z128|Z256)mr(b?)",
1129 "VPMOVDW(Z|Z128|Z256)mr(b?)",
1130 "VPMOVQB(Z|Z128|Z256)mr(b?)",
1131 "VPMOVQW(Z|Z128|Z256)mr(b?)",
1132 "VPMOVSDB(Z|Z128|Z256)mr(b?)",
1133 "VPMOVSDW(Z|Z128|Z256)mr(b?)",
1134 "VPMOVSQB(Z|Z128|Z256)mr(b?)",
1135 "VPMOVSQD(Z|Z128|Z256)mr(b?)",
1136 "VPMOVSQW(Z|Z128|Z256)mr(b?)",
1137 "VPMOVSWB(Z|Z128|Z256)mr(b?)",
1138 "VPMOVUSDB(Z|Z128|Z256)mr(b?)",
1139 "VPMOVUSDW(Z|Z128|Z256)mr(b?)",
1140 "VPMOVUSQB(Z|Z128|Z256)mr(b?)",
1141 "VPMOVUSQD(Z|Z128|Z256)mr(b?)",
1142 "VPMOVUSQW(Z|Z128|Z256)mr(b?)",
1143 "VPMOVUSWB(Z|Z128|Z256)mr(b?)",
1144 "VPMOVWB(Z|Z128|Z256)mr(b?)")>;
1146 def SKXWriteResGroup67 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
1148 let NumMicroOps = 5;
1149 let ResourceCycles = [1,4];
1151 def: InstRW<[SKXWriteResGroup67], (instrs XSETBV)>;
1153 def SKXWriteResGroup68 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
1155 let NumMicroOps = 5;
1156 let ResourceCycles = [2,3];
1158 def: InstRW<[SKXWriteResGroup68], (instregex "CMPXCHG(8|16|32|64)rr")>;
1160 def SKXWriteResGroup69 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort0156]> {
1162 let NumMicroOps = 6;
1163 let ResourceCycles = [1,1,4];
1165 def: InstRW<[SKXWriteResGroup69], (instregex "PUSHF(16|64)")>;
1167 def SKXWriteResGroup71 : SchedWriteRes<[SKXPort23]> {
1169 let NumMicroOps = 1;
1170 let ResourceCycles = [1];
1172 def: InstRW<[SKXWriteResGroup71], (instregex "VBROADCASTSSrm",
1178 def SKXWriteResGroup72 : SchedWriteRes<[SKXPort5]> {
1180 let NumMicroOps = 2;
1181 let ResourceCycles = [2];
1183 def: InstRW<[SKXWriteResGroup72], (instregex "MMX_CVTPI2PSirr",
1184 "VCOMPRESSPD(Z|Z128|Z256)rr",
1185 "VCOMPRESSPS(Z|Z128|Z256)rr",
1186 "VPCOMPRESSD(Z|Z128|Z256)rr",
1187 "VPCOMPRESSQ(Z|Z128|Z256)rr",
1188 "VPERMW(Z|Z128|Z256)rr")>;
1190 def SKXWriteResGroup73 : SchedWriteRes<[SKXPort0,SKXPort23]> {
1192 let NumMicroOps = 2;
1193 let ResourceCycles = [1,1];
1195 def: InstRW<[SKXWriteResGroup73], (instregex "MMX_PADDSBirm",
1216 def SKXWriteResGroup76 : SchedWriteRes<[SKXPort6,SKXPort23]> {
1218 let NumMicroOps = 2;
1219 let ResourceCycles = [1,1];
1221 def: InstRW<[SKXWriteResGroup76], (instregex "FARJMP64",
1224 def SKXWriteResGroup78 : SchedWriteRes<[SKXPort23,SKXPort06]> {
1226 let NumMicroOps = 2;
1227 let ResourceCycles = [1,1];
1229 def: InstRW<[SKXWriteResGroup78], (instregex "BT(16|32|64)mi8")>;
1231 def SKXWriteResGroup79 : SchedWriteRes<[SKXPort23,SKXPort15]> {
1233 let NumMicroOps = 2;
1234 let ResourceCycles = [1,1];
1236 def: InstRW<[SKXWriteResGroup79], (instregex "ANDN(32|64)rm",
1240 "MOVBE(16|32|64)rm")>;
1242 def SKXWriteResGroup80 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1244 let NumMicroOps = 2;
1245 let ResourceCycles = [1,1];
1247 def: InstRW<[SKXWriteResGroup80], (instregex "VMOV(64to|QI2)PQIZrm(b?)",
1248 "VMOVDI2PDIZrm(b?)")>;
1250 def SKXWriteResGroup81 : SchedWriteRes<[SKXPort23,SKXPort0156]> {
1252 let NumMicroOps = 2;
1253 let ResourceCycles = [1,1];
1255 def: InstRW<[SKXWriteResGroup81], (instrs POP16r, POP32r, POP64r)>;
1256 def: InstRW<[SKXWriteResGroup81], (instregex "POP(16|32|64)rmr")>;
1258 def SKXWriteResGroup82 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1260 let NumMicroOps = 3;
1261 let ResourceCycles = [2,1];
1263 def: InstRW<[SKXWriteResGroup82], (instregex "(V?)CVTSI642SSrr",
1265 "VCVTUSI642SSZrr")>;
1267 def SKXWriteResGroup84 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort06,SKXPort0156]> {
1269 let NumMicroOps = 4;
1270 let ResourceCycles = [1,1,1,1];
1272 def: InstRW<[SKXWriteResGroup84], (instregex "SLDT(16|32|64)r")>;
1274 def SKXWriteResGroup86 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06]> {
1276 let NumMicroOps = 4;
1277 let ResourceCycles = [1,1,1,1];
1279 def: InstRW<[SKXWriteResGroup86], (instregex "BTC(16|32|64)mi8",
1282 "SAR(8|16|32|64)m1",
1283 "SAR(8|16|32|64)mi",
1284 "SHL(8|16|32|64)m1",
1285 "SHL(8|16|32|64)mi",
1286 "SHR(8|16|32|64)m1",
1287 "SHR(8|16|32|64)mi")>;
1289 def SKXWriteResGroup87 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort0156]> {
1291 let NumMicroOps = 4;
1292 let ResourceCycles = [1,1,1,1];
1294 def: InstRW<[SKXWriteResGroup87], (instregex "POP(16|32|64)rmm",
1295 "PUSH(16|32|64)rmm")>;
1297 def SKXWriteResGroup88 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
1299 let NumMicroOps = 6;
1300 let ResourceCycles = [1,5];
1302 def: InstRW<[SKXWriteResGroup88], (instrs STD)>;
1304 def SKXWriteResGroup89 : SchedWriteRes<[SKXPort23]> {
1306 let NumMicroOps = 1;
1307 let ResourceCycles = [1];
1309 def: InstRW<[SKXWriteResGroup89], (instregex "LD_F(32|64|80)m",
1318 "VPBROADCASTQYrm")>;
1320 def SKXWriteResGroup90 : SchedWriteRes<[SKXPort01,SKXPort5]> {
1322 let NumMicroOps = 2;
1323 let ResourceCycles = [1,1];
1325 def: InstRW<[SKXWriteResGroup90], (instregex "VCVTDQ2PDYrr")>;
1327 def SKXWriteResGroup92 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1329 let NumMicroOps = 2;
1330 let ResourceCycles = [1,1];
1332 def: InstRW<[SKXWriteResGroup92], (instregex "VMOVSDZrm(b?)",
1335 def SKXWriteResGroup92a : SchedWriteRes<[SKXPort5,SKXPort23]> {
1337 let NumMicroOps = 2;
1338 let ResourceCycles = [1,1];
1340 def: InstRW<[SKXWriteResGroup92a], (instregex "(V?)PMOV(SX|ZX)BDrm",
1341 "(V?)PMOV(SX|ZX)BQrm",
1342 "(V?)PMOV(SX|ZX)BWrm",
1343 "(V?)PMOV(SX|ZX)DQrm",
1344 "(V?)PMOV(SX|ZX)WDrm",
1345 "(V?)PMOV(SX|ZX)WQrm")>;
1347 def SKXWriteResGroup93 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1349 let NumMicroOps = 2;
1350 let ResourceCycles = [1,1];
1352 def: InstRW<[SKXWriteResGroup93], (instregex "VCVTDQ2PDZ256rr",
1353 "VCVTPD2DQ(Y|Z256)rr",
1354 "VCVTPD2PS(Y|Z256)rr",
1356 "VCVTPS2PD(Y|Z256)rr",
1360 "VCVTTPD2DQ(Y|Z256)rr",
1361 "VCVTTPD2UDQZ256rr",
1363 "VCVTTPS2UQQZ256rr",
1365 "VCVTUQQ2PSZ256rr")>;
1367 def SKXWriteResGroup93z : SchedWriteRes<[SKXPort5,SKXPort05]> {
1369 let NumMicroOps = 2;
1370 let ResourceCycles = [1,1];
1372 def: InstRW<[SKXWriteResGroup93z], (instrs VCVTDQ2PDZrr,
1387 def SKXWriteResGroup95 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1389 let NumMicroOps = 2;
1390 let ResourceCycles = [1,1];
1392 def: InstRW<[SKXWriteResGroup95], (instregex "VBLENDMPDZ128rm(b?)",
1393 "VBLENDMPSZ128rm(b?)",
1394 "VBROADCASTI32X2Z128m(b?)",
1395 "VBROADCASTSSZ128m(b?)",
1398 "VMOVAPDZ128rm(b?)",
1399 "VMOVAPSZ128rm(b?)",
1400 "VMOVDDUPZ128rm(b?)",
1401 "VMOVDQA32Z128rm(b?)",
1402 "VMOVDQA64Z128rm(b?)",
1403 "VMOVDQU16Z128rm(b?)",
1404 "VMOVDQU32Z128rm(b?)",
1405 "VMOVDQU64Z128rm(b?)",
1406 "VMOVDQU8Z128rm(b?)",
1407 "VMOVNTDQAZ128rm(b?)",
1408 "VMOVSHDUPZ128rm(b?)",
1409 "VMOVSLDUPZ128rm(b?)",
1410 "VMOVUPDZ128rm(b?)",
1411 "VMOVUPSZ128rm(b?)",
1412 "VPADD(B|D|Q|W)Z128rm(b?)",
1413 "(V?)PADD(B|D|Q|W)rm",
1415 "VPBLENDM(B|D|Q|W)Z128rm(b?)",
1416 "VPBROADCASTDZ128m(b?)",
1417 "VPBROADCASTQZ128m(b?)",
1418 "VPSUB(B|D|Q|W)Z128rm(b?)",
1419 "(V?)PSUB(B|D|Q|W)rm",
1420 "VPTERNLOGDZ128rm(b?)i",
1421 "VPTERNLOGQZ128rm(b?)i")>;
1423 def SKXWriteResGroup96 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1425 let NumMicroOps = 3;
1426 let ResourceCycles = [2,1];
1428 def: InstRW<[SKXWriteResGroup96], (instregex "MMX_PACKSSDWirm",
1430 "MMX_PACKUSWBirm")>;
1432 def SKXWriteResGroup97 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1434 let NumMicroOps = 3;
1435 let ResourceCycles = [2,1];
1437 def: InstRW<[SKXWriteResGroup97], (instregex "VPERMI2W128rr",
1444 def SKXWriteResGroup99 : SchedWriteRes<[SKXPort23,SKXPort0156]> {
1446 let NumMicroOps = 3;
1447 let ResourceCycles = [1,2];
1449 def: InstRW<[SKXWriteResGroup99], (instrs LEAVE, LEAVE64,
1450 SCASB, SCASL, SCASQ, SCASW)>;
1452 def SKXWriteResGroup100 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort015]> {
1454 let NumMicroOps = 3;
1455 let ResourceCycles = [1,1,1];
1457 def: InstRW<[SKXWriteResGroup100], (instregex "VCVTSS2USI64Zrr",
1458 "(V?)CVTSS2SI64(Z?)rr",
1459 "(V?)CVTTSS2SI64(Z?)rr",
1460 "VCVTTSS2USI64Zrr")>;
1462 def SKXWriteResGroup101 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort05]> {
1464 let NumMicroOps = 3;
1465 let ResourceCycles = [1,1,1];
1467 def: InstRW<[SKXWriteResGroup101], (instrs FLDCW16m)>;
1469 def SKXWriteResGroup103 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort0156]> {
1471 let NumMicroOps = 3;
1472 let ResourceCycles = [1,1,1];
1474 def: InstRW<[SKXWriteResGroup103], (instregex "KMOV(B|D|Q|W)km")>;
1476 def SKXWriteResGroup104 : SchedWriteRes<[SKXPort6,SKXPort23,SKXPort0156]> {
1478 let NumMicroOps = 3;
1479 let ResourceCycles = [1,1,1];
1481 def: InstRW<[SKXWriteResGroup104], (instrs LRETQ, RETQ)>;
1483 def SKXWriteResGroup106 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort237]> {
1485 let NumMicroOps = 4;
1486 let ResourceCycles = [1,2,1];
1488 def: InstRW<[SKXWriteResGroup106], (instregex "VCOMPRESSPD(Z|Z128|Z256)mr(b?)",
1489 "VCOMPRESSPS(Z|Z128|Z256)mr(b?)",
1490 "VPCOMPRESSD(Z|Z128|Z256)mr(b?)",
1491 "VPCOMPRESSQ(Z|Z128|Z256)mr(b?)")>;
1493 def SKXWriteResGroup107 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06]> {
1495 let NumMicroOps = 5;
1496 let ResourceCycles = [1,1,1,2];
1498 def: InstRW<[SKXWriteResGroup107], (instregex "ROL(8|16|32|64)m1",
1499 "ROL(8|16|32|64)mi",
1500 "ROR(8|16|32|64)m1",
1501 "ROR(8|16|32|64)mi")>;
1503 def SKXWriteResGroup108 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort0156]> {
1505 let NumMicroOps = 5;
1506 let ResourceCycles = [1,1,1,2];
1508 def: InstRW<[SKXWriteResGroup108], (instregex "XADD(8|16|32|64)rm")>;
1510 def SKXWriteResGroup109 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort0156]> {
1512 let NumMicroOps = 5;
1513 let ResourceCycles = [1,1,1,1,1];
1515 def: InstRW<[SKXWriteResGroup109], (instregex "CALL(16|32|64)m",
1518 def SKXWriteResGroup110 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237,SKXPort0156]> {
1520 let NumMicroOps = 7;
1521 let ResourceCycles = [1,2,2,2];
1523 def: InstRW<[SKXWriteResGroup110], (instrs VPSCATTERDQZ128mr,
1526 VSCATTERQPDZ128mr)>;
1528 def SKXWriteResGroup111 : SchedWriteRes<[SKXPort6,SKXPort06,SKXPort15,SKXPort0156]> {
1530 let NumMicroOps = 7;
1531 let ResourceCycles = [1,3,1,2];
1533 def: InstRW<[SKXWriteResGroup111], (instrs LOOP)>;
1535 def SKXWriteResGroup112 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237,SKXPort0156]> {
1537 let NumMicroOps = 11;
1538 let ResourceCycles = [1,4,4,2];
1540 def: InstRW<[SKXWriteResGroup112], (instrs VPSCATTERDQZ256mr,
1543 VSCATTERQPDZ256mr)>;
1545 def SKXWriteResGroup113 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237,SKXPort0156]> {
1547 let NumMicroOps = 19;
1548 let ResourceCycles = [1,8,8,2];
1550 def: InstRW<[SKXWriteResGroup113], (instrs VPSCATTERDQZmr,
1555 def SKXWriteResGroup114 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1557 let NumMicroOps = 36;
1558 let ResourceCycles = [1,16,1,16,2];
1560 def: InstRW<[SKXWriteResGroup114], (instrs VSCATTERDPSZmr)>;
1562 def SKXWriteResGroup118 : SchedWriteRes<[SKXPort1,SKXPort23]> {
1564 let NumMicroOps = 2;
1565 let ResourceCycles = [1,1];
1567 def: InstRW<[SKXWriteResGroup118], (instregex "PDEP(32|64)rm",
1570 def SKXWriteResGroup118_16_1 : SchedWriteRes<[SKXPort1, SKXPort0156, SKXPort23]> {
1572 let NumMicroOps = 3;
1573 let ResourceCycles = [1,1,1];
1575 def: InstRW<[SKXWriteResGroup118_16_1], (instrs IMUL16rm, IMUL16rmi, IMUL16rmi8)>;
1577 def SKXWriteResGroup118_16_2 : SchedWriteRes<[SKXPort1, SKXPort06, SKXPort0156, SKXPort23]> {
1579 let NumMicroOps = 5;
1580 let ResourceCycles = [1,1,2,1];
1582 def: InstRW<[SKXWriteResGroup118_16_2], (instrs IMUL16m, MUL16m)>;
1584 def SKXWriteResGroup119 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1586 let NumMicroOps = 2;
1587 let ResourceCycles = [1,1];
1589 def: InstRW<[SKXWriteResGroup119], (instregex "FCOM(P?)(32|64)m",
1590 "VFPCLASSSDZrm(b?)",
1592 "VPBROADCASTB(Z|Z256)m(b?)",
1594 "VPBROADCASTW(Z|Z256)m(b?)",
1599 def SKXWriteResGroup121 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1601 let NumMicroOps = 2;
1602 let ResourceCycles = [1,1];
1604 def: InstRW<[SKXWriteResGroup121], (instregex "VBLENDMPD(Z|Z256)rm(b?)",
1605 "VBLENDMPS(Z|Z256)rm(b?)",
1606 "VBROADCASTF32X2Z256m(b?)",
1607 "VBROADCASTF32X2Zm(b?)",
1608 "VBROADCASTF32X4Z256rm(b?)",
1609 "VBROADCASTF32X4rm(b?)",
1610 "VBROADCASTF32X8rm(b?)",
1611 "VBROADCASTF64X2Z128rm(b?)",
1612 "VBROADCASTF64X2rm(b?)",
1613 "VBROADCASTF64X4rm(b?)",
1614 "VBROADCASTI32X2Z256m(b?)",
1615 "VBROADCASTI32X2Zm(b?)",
1616 "VBROADCASTI32X4Z256rm(b?)",
1617 "VBROADCASTI32X4rm(b?)",
1618 "VBROADCASTI32X8rm(b?)",
1619 "VBROADCASTI64X2Z128rm(b?)",
1620 "VBROADCASTI64X2rm(b?)",
1621 "VBROADCASTI64X4rm(b?)",
1622 "VBROADCASTSD(Z|Z256)m(b?)",
1623 "VBROADCASTSS(Z|Z256)m(b?)",
1624 "VINSERTF32x4(Z|Z256)rm(b?)",
1625 "VINSERTF32x8Zrm(b?)",
1626 "VINSERTF64x2(Z|Z256)rm(b?)",
1627 "VINSERTF64x4Zrm(b?)",
1628 "VINSERTI32x4(Z|Z256)rm(b?)",
1629 "VINSERTI32x8Zrm(b?)",
1630 "VINSERTI64x2(Z|Z256)rm(b?)",
1631 "VINSERTI64x4Zrm(b?)",
1632 "VMOVAPD(Z|Z256)rm(b?)",
1633 "VMOVAPS(Z|Z256)rm(b?)",
1634 "VMOVDDUP(Z|Z256)rm(b?)",
1635 "VMOVDQA32(Z|Z256)rm(b?)",
1636 "VMOVDQA64(Z|Z256)rm(b?)",
1637 "VMOVDQU16(Z|Z256)rm(b?)",
1638 "VMOVDQU32(Z|Z256)rm(b?)",
1639 "VMOVDQU64(Z|Z256)rm(b?)",
1640 "VMOVDQU8(Z|Z256)rm(b?)",
1641 "VMOVNTDQAZ256rm(b?)",
1642 "VMOVSHDUP(Z|Z256)rm(b?)",
1643 "VMOVSLDUP(Z|Z256)rm(b?)",
1644 "VMOVUPD(Z|Z256)rm(b?)",
1645 "VMOVUPS(Z|Z256)rm(b?)",
1646 "VPADD(B|D|Q|W)Yrm",
1647 "VPADD(B|D|Q|W)(Z|Z256)rm(b?)",
1649 "VPBLENDM(B|D|Q|W)(Z|Z256)rm(b?)",
1650 "VPBROADCASTD(Z|Z256)m(b?)",
1651 "VPBROADCASTQ(Z|Z256)m(b?)",
1652 "VPSUB(B|D|Q|W)Yrm",
1653 "VPSUB(B|D|Q|W)(Z|Z256)rm(b?)",
1654 "VPTERNLOGD(Z|Z256)rm(b?)i",
1655 "VPTERNLOGQ(Z|Z256)rm(b?)i")>;
1657 def SKXWriteResGroup123 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
1659 let NumMicroOps = 4;
1660 let ResourceCycles = [1,2,1];
1662 def: InstRW<[SKXWriteResGroup123], (instregex "MMX_PH(ADD|SUB)SWrm")>;
1664 def SKXWriteResGroup126 : SchedWriteRes<[SKXPort23,SKXPort237,SKXPort06]> {
1666 let NumMicroOps = 5;
1667 let ResourceCycles = [1,1,3];
1669 def: InstRW<[SKXWriteResGroup126], (instregex "ROR(8|16|32|64)mCL")>;
1671 def SKXWriteResGroup127 : SchedWriteRes<[SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
1673 let NumMicroOps = 5;
1674 let ResourceCycles = [1,1,1,2];
1676 def: InstRW<[SKXWriteResGroup127], (instregex "RCL(8|16|32|64)m1",
1677 "RCL(8|16|32|64)mi",
1678 "RCR(8|16|32|64)m1",
1679 "RCR(8|16|32|64)mi")>;
1681 def SKXWriteResGroup128 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06]> {
1683 let NumMicroOps = 6;
1684 let ResourceCycles = [1,1,1,3];
1686 def: InstRW<[SKXWriteResGroup128], (instregex "ROL(8|16|32|64)mCL",
1687 "SAR(8|16|32|64)mCL",
1688 "SHL(8|16|32|64)mCL",
1689 "SHR(8|16|32|64)mCL")>;
1691 def SKXWriteResGroup130 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
1693 let NumMicroOps = 6;
1694 let ResourceCycles = [1,1,1,2,1];
1696 def: SchedAlias<WriteADCRMW, SKXWriteResGroup130>;
1697 def: InstRW<[SKXWriteResGroup130], (instregex "CMPXCHG(8|16|32|64)rm")>;
1699 def SKXWriteResGroup131 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1701 let NumMicroOps = 8;
1702 let ResourceCycles = [1,2,1,2,2];
1704 def: InstRW<[SKXWriteResGroup131], (instrs VPSCATTERQDZ128mr,
1707 VSCATTERQPSZ256mr)>;
1709 def SKXWriteResGroup132 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1711 let NumMicroOps = 12;
1712 let ResourceCycles = [1,4,1,4,2];
1714 def: InstRW<[SKXWriteResGroup132], (instrs VPSCATTERDDZ128mr,
1715 VSCATTERDPSZ128mr)>;
1717 def SKXWriteResGroup133 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1719 let NumMicroOps = 20;
1720 let ResourceCycles = [1,8,1,8,2];
1722 def: InstRW<[SKXWriteResGroup133], (instrs VPSCATTERDDZ256mr,
1723 VSCATTERDPSZ256mr)>;
1725 def SKXWriteResGroup134 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1727 let NumMicroOps = 36;
1728 let ResourceCycles = [1,16,1,16,2];
1730 def: InstRW<[SKXWriteResGroup134], (instrs VPSCATTERDDZmr)>;
1732 def SKXWriteResGroup135 : SchedWriteRes<[SKXPort0,SKXPort23]> {
1734 let NumMicroOps = 2;
1735 let ResourceCycles = [1,1];
1737 def: InstRW<[SKXWriteResGroup135], (instregex "MMX_CVTPI2PSirm")>;
1739 def SKXWriteResGroup136 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1741 let NumMicroOps = 2;
1742 let ResourceCycles = [1,1];
1744 def: InstRW<[SKXWriteResGroup136], (instregex "VALIGNDZ128rm(b?)i",
1745 "VALIGNQZ128rm(b?)i",
1746 "VCMPPDZ128rm(b?)i",
1747 "VCMPPSZ128rm(b?)i",
1750 "VFPCLASSSSZrm(b?)",
1751 "VPCMPBZ128rmi(b?)",
1752 "VPCMPDZ128rmi(b?)",
1753 "VPCMPEQ(B|D|Q|W)Z128rm(b?)",
1754 "VPCMPGT(B|D|Q|W)Z128rm(b?)",
1756 "VPCMPQZ128rmi(b?)",
1757 "VPCMPU(B|D|Q|W)Z128rmi(b?)",
1758 "VPCMPWZ128rmi(b?)",
1759 "VPERMI2D128rm(b?)",
1760 "VPERMI2PD128rm(b?)",
1761 "VPERMI2PS128rm(b?)",
1762 "VPERMI2Q128rm(b?)",
1763 "VPERMT2D128rm(b?)",
1764 "VPERMT2PD128rm(b?)",
1765 "VPERMT2PS128rm(b?)",
1766 "VPERMT2Q128rm(b?)",
1767 "VPMAXSQZ128rm(b?)",
1768 "VPMAXUQZ128rm(b?)",
1769 "VPMINSQZ128rm(b?)",
1770 "VPMINUQZ128rm(b?)",
1771 "VPMOVSXBDZ128rm(b?)",
1772 "VPMOVSXBQZ128rm(b?)",
1774 "VPMOVSXBWZ128rm(b?)",
1776 "VPMOVSXDQZ128rm(b?)",
1778 "VPMOVSXWDZ128rm(b?)",
1779 "VPMOVSXWQZ128rm(b?)",
1780 "VPMOVZXBDZ128rm(b?)",
1781 "VPMOVZXBQZ128rm(b?)",
1782 "VPMOVZXBWZ128rm(b?)",
1783 "VPMOVZXDQZ128rm(b?)",
1785 "VPMOVZXWDZ128rm(b?)",
1786 "VPMOVZXWQZ128rm(b?)",
1787 "VPTESTMBZ128rm(b?)",
1788 "VPTESTMDZ128rm(b?)",
1789 "VPTESTMQZ128rm(b?)",
1790 "VPTESTMWZ128rm(b?)",
1791 "VPTESTNMBZ128rm(b?)",
1792 "VPTESTNMDZ128rm(b?)",
1793 "VPTESTNMQZ128rm(b?)",
1794 "VPTESTNMWZ128rm(b?)")>;
1796 def SKXWriteResGroup137 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1798 let NumMicroOps = 2;
1799 let ResourceCycles = [1,1];
1801 def: InstRW<[SKXWriteResGroup137], (instregex "MMX_CVT(T?)PS2PIirm",
1804 def SKXWriteResGroup142 : SchedWriteRes<[SKXPort1,SKXPort5,SKXPort23]> {
1806 let NumMicroOps = 3;
1807 let ResourceCycles = [1,1,1];
1809 def: InstRW<[SKXWriteResGroup142], (instrs IMUL64m, MUL64m, MULX64rm)>;
1811 def SKXWriteResGroup143 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23]> {
1813 let NumMicroOps = 4;
1814 let ResourceCycles = [2,1,1];
1816 def: InstRW<[SKXWriteResGroup143], (instregex "(V?)PHADDSWrm",
1819 def SKXWriteResGroup146 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort23,SKXPort0156]> {
1821 let NumMicroOps = 5;
1822 let ResourceCycles = [1,2,1,1];
1824 def: InstRW<[SKXWriteResGroup146], (instregex "LAR(16|32|64)rm",
1825 "LSL(16|32|64)rm")>;
1827 def SKXWriteResGroup148 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1829 let NumMicroOps = 2;
1830 let ResourceCycles = [1,1];
1832 def: InstRW<[SKXWriteResGroup148], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1834 "VALIGND(Z|Z256)rm(b?)i",
1835 "VALIGNQ(Z|Z256)rm(b?)i",
1836 "VCMPPD(Z|Z256)rm(b?)i",
1837 "VCMPPS(Z|Z256)rm(b?)i",
1838 "VPCMPB(Z|Z256)rmi(b?)",
1839 "VPCMPD(Z|Z256)rmi(b?)",
1840 "VPCMPEQB(Z|Z256)rm(b?)",
1841 "VPCMPEQD(Z|Z256)rm(b?)",
1842 "VPCMPEQQ(Z|Z256)rm(b?)",
1843 "VPCMPEQW(Z|Z256)rm(b?)",
1844 "VPCMPGTB(Z|Z256)rm(b?)",
1845 "VPCMPGTD(Z|Z256)rm(b?)",
1847 "VPCMPGTQ(Z|Z256)rm(b?)",
1848 "VPCMPGTW(Z|Z256)rm(b?)",
1849 "VPCMPQ(Z|Z256)rmi(b?)",
1850 "VPCMPU(B|D|Q|W)Z256rmi(b?)",
1851 "VPCMPU(B|D|Q|W)Zrmi(b?)",
1852 "VPCMPW(Z|Z256)rmi(b?)",
1853 "VPMAXSQ(Z|Z256)rm(b?)",
1854 "VPMAXUQ(Z|Z256)rm(b?)",
1855 "VPMINSQ(Z|Z256)rm(b?)",
1856 "VPMINUQ(Z|Z256)rm(b?)",
1857 "VPTESTM(B|D|Q|W)Z256rm(b?)",
1858 "VPTESTM(B|D|Q|W)Zrm(b?)",
1859 "VPTESTNM(B|D|Q|W)Z256rm(b?)",
1860 "VPTESTNM(B|D|Q|W)Zrm(b?)")>;
1862 def SKXWriteResGroup149 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1864 let NumMicroOps = 2;
1865 let ResourceCycles = [1,1];
1867 def: InstRW<[SKXWriteResGroup149], (instregex "VCVTDQ2PDZ128rm(b?)",
1868 "VCVTDQ2PSZ128rm(b?)",
1870 "VCVTPD2QQZ128rm(b?)",
1871 "VCVTPD2UQQZ128rm(b?)",
1872 "VCVTPH2PSZ128rm(b?)",
1873 "VCVTPS2DQZ128rm(b?)",
1875 "VCVTPS2PDZ128rm(b?)",
1876 "VCVTPS2QQZ128rm(b?)",
1877 "VCVTPS2UDQZ128rm(b?)",
1878 "VCVTPS2UQQZ128rm(b?)",
1879 "VCVTQQ2PDZ128rm(b?)",
1880 "VCVTQQ2PSZ128rm(b?)",
1883 "VCVTTPD2QQZ128rm(b?)",
1884 "VCVTTPD2UQQZ128rm(b?)",
1885 "VCVTTPS2DQZ128rm(b?)",
1887 "VCVTTPS2QQZ128rm(b?)",
1888 "VCVTTPS2UDQZ128rm(b?)",
1889 "VCVTTPS2UQQZ128rm(b?)",
1890 "VCVTUDQ2PDZ128rm(b?)",
1891 "VCVTUDQ2PSZ128rm(b?)",
1892 "VCVTUQQ2PDZ128rm(b?)",
1893 "VCVTUQQ2PSZ128rm(b?)")>;
1895 def SKXWriteResGroup151 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1897 let NumMicroOps = 3;
1898 let ResourceCycles = [2,1];
1900 def: InstRW<[SKXWriteResGroup151], (instregex "VEXPANDPDZ128rm(b?)",
1901 "VEXPANDPSZ128rm(b?)",
1902 "VPEXPANDDZ128rm(b?)",
1903 "VPEXPANDQZ128rm(b?)")>;
1905 def SKXWriteResGroup153 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
1907 let NumMicroOps = 3;
1908 let ResourceCycles = [1,1,1];
1910 def: InstRW<[SKXWriteResGroup153], (instregex "(V?)CVTSD2SSrm")>;
1912 def SKXWriteResGroup154 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23]> {
1914 let NumMicroOps = 4;
1915 let ResourceCycles = [2,1,1];
1917 def: InstRW<[SKXWriteResGroup154], (instregex "VPHADDSWYrm",
1920 def SKXWriteResGroup156 : SchedWriteRes<[SKXPort1,SKXPort23,SKXPort06,SKXPort0156]> {
1922 let NumMicroOps = 4;
1923 let ResourceCycles = [1,1,1,1];
1925 def: InstRW<[SKXWriteResGroup156], (instrs IMUL32m, MUL32m, MULX32rm)>;
1927 def SKXWriteResGroup157 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
1929 let NumMicroOps = 8;
1930 let ResourceCycles = [1,1,1,1,1,3];
1932 def: InstRW<[SKXWriteResGroup157], (instregex "XCHG(8|16|32|64)rm")>;
1934 def SKXWriteResGroup159 : SchedWriteRes<[SKXPort0,SKXFPDivider]> {
1936 let NumMicroOps = 1;
1937 let ResourceCycles = [1,3];
1939 def : SchedAlias<WriteFDivX, SKXWriteResGroup159>; // TODO - convert to ZnWriteResFpuPair
1941 def SKXWriteResGroup160 : SchedWriteRes<[SKXPort0,SKXPort23]> {
1943 let NumMicroOps = 2;
1944 let ResourceCycles = [1,1];
1946 def: InstRW<[SKXWriteResGroup160], (instregex "MUL_F(32|64)m")>;
1948 def SKXWriteResGroup161 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1950 let NumMicroOps = 2;
1951 let ResourceCycles = [1,1];
1953 def: InstRW<[SKXWriteResGroup161], (instregex "VCVTDQ2PD(Z|Z256)rm(b?)",
1955 "VCVTDQ2PS(Z|Z256)rm(b?)",
1956 "VCVTPH2PS(Z|Z256)rm(b?)",
1958 "VCVTPS2PD(Z|Z256)rm(b?)",
1959 "VCVTQQ2PD(Z|Z256)rm(b?)",
1960 "VCVTQQ2PSZ256rm(b?)",
1961 "VCVT(T?)PD2QQ(Z|Z256)rm(b?)",
1962 "VCVT(T?)PD2UQQ(Z|Z256)rm(b?)",
1964 "VCVT(T?)PS2DQ(Z|Z256)rm(b?)",
1965 "VCVT(T?)PS2QQZ256rm(b?)",
1966 "VCVT(T?)PS2UDQ(Z|Z256)rm(b?)",
1967 "VCVT(T?)PS2UQQZ256rm(b?)",
1968 "VCVTUDQ2PD(Z|Z256)rm(b?)",
1969 "VCVTUDQ2PS(Z|Z256)rm(b?)",
1970 "VCVTUQQ2PD(Z|Z256)rm(b?)",
1971 "VCVTUQQ2PSZ256rm(b?)")>;
1973 def SKXWriteResGroup162 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1975 let NumMicroOps = 3;
1976 let ResourceCycles = [2,1];
1978 def: InstRW<[SKXWriteResGroup162], (instregex "FICOM(P?)(16|32)m",
1979 "VEXPANDPD(Z|Z256)rm(b?)",
1980 "VEXPANDPS(Z|Z256)rm(b?)",
1981 "VPEXPANDD(Z|Z256)rm(b?)",
1982 "VPEXPANDQ(Z|Z256)rm(b?)")>;
1984 def SKXWriteResGroup163 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1986 let NumMicroOps = 3;
1987 let ResourceCycles = [1,2];
1989 def: InstRW<[SKXWriteResGroup163], (instregex "VCVTSD2SSZrm")>;
1991 def SKXWriteResGroup164 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
1993 let NumMicroOps = 3;
1994 let ResourceCycles = [1,1,1];
1996 def: InstRW<[SKXWriteResGroup164], (instregex "(V?)CVTDQ2PDrm")>;
1998 def SKXWriteResGroup166 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2000 let NumMicroOps = 3;
2001 let ResourceCycles = [1,1,1];
2003 def: InstRW<[SKXWriteResGroup166], (instregex "CVTPD2PSrm",
2005 "MMX_CVT(T?)PD2PIirm")>;
2007 def SKXWriteResGroup167 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2009 let NumMicroOps = 4;
2010 let ResourceCycles = [2,1,1];
2012 def: InstRW<[SKXWriteResGroup167], (instregex "VPCONFLICTQZ128rm(b?)")>;
2014 def SKXWriteResGroup169 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort0156]> {
2016 let NumMicroOps = 7;
2017 let ResourceCycles = [2,3,2];
2019 def: InstRW<[SKXWriteResGroup169], (instregex "RCL(16|32|64)rCL",
2020 "RCR(16|32|64)rCL")>;
2022 def SKXWriteResGroup170 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort15,SKXPort0156]> {
2024 let NumMicroOps = 9;
2025 let ResourceCycles = [1,5,1,2];
2027 def: InstRW<[SKXWriteResGroup170], (instregex "RCL8rCL")>;
2029 def SKXWriteResGroup171 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
2031 let NumMicroOps = 11;
2032 let ResourceCycles = [2,9];
2034 def: InstRW<[SKXWriteResGroup171], (instrs LOOPE, LOOPNE)>;
2036 def SKXWriteResGroup174 : SchedWriteRes<[SKXPort01]> {
2038 let NumMicroOps = 3;
2039 let ResourceCycles = [3];
2041 def: InstRW<[SKXWriteResGroup174], (instregex "VPMULLQ(Z128|Z256)rr")>;
2043 def SKXWriteResGroup174z : SchedWriteRes<[SKXPort05]> {
2045 let NumMicroOps = 3;
2046 let ResourceCycles = [3];
2048 def: InstRW<[SKXWriteResGroup174z], (instregex "VPMULLQZrr")>;
2050 def SKXWriteResGroup175 : SchedWriteRes<[SKXPort5,SKXPort23]> {
2052 let NumMicroOps = 3;
2053 let ResourceCycles = [2,1];
2055 def: InstRW<[SKXWriteResGroup175], (instregex "VPERMWZ128rm(b?)")>;
2057 def SKXWriteResGroup176 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015]> {
2059 let NumMicroOps = 3;
2060 let ResourceCycles = [1,1,1];
2062 def: InstRW<[SKXWriteResGroup176], (instregex "VCVT(T?)SD2USIZrm(b?)",
2063 "VCVT(T?)SS2USI64Zrm(b?)")>;
2065 def SKXWriteResGroup177 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2067 let NumMicroOps = 3;
2068 let ResourceCycles = [1,1,1];
2070 def: InstRW<[SKXWriteResGroup177], (instregex "VCVT(T?)PS2QQZrm(b?)",
2071 "VCVT(T?)PS2UQQZrm(b?)")>;
2073 def SKXWriteResGroup179 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23,SKXPort015]> {
2075 let NumMicroOps = 4;
2076 let ResourceCycles = [1,1,1,1];
2078 def: InstRW<[SKXWriteResGroup179], (instregex "CVTTSS2SI64rm")>;
2080 def SKXWriteResGroup180 : SchedWriteRes<[SKXPort5,SKXPort23]> {
2082 let NumMicroOps = 3;
2083 let ResourceCycles = [2,1];
2085 def: InstRW<[SKXWriteResGroup180], (instregex "(ADD|SUB|SUBR)_FI(16|32)m",
2089 def SKXWriteResGroup181 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2091 let NumMicroOps = 3;
2092 let ResourceCycles = [1,1,1];
2094 def: InstRW<[SKXWriteResGroup181], (instregex "VCVTDQ2PDYrm")>;
2096 def SKXWriteResGroup183 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2098 let NumMicroOps = 4;
2099 let ResourceCycles = [2,1,1];
2101 def: InstRW<[SKXWriteResGroup183], (instregex "VPERMI2W128rm(b?)",
2102 "VPERMT2W128rm(b?)")>;
2104 def SKXWriteResGroup184 : SchedWriteRes<[SKXPort0,SKXFPDivider]> {
2106 let NumMicroOps = 1;
2107 let ResourceCycles = [1,3];
2109 def : SchedAlias<WriteFDiv64, SKXWriteResGroup184>; // TODO - convert to ZnWriteResFpuPair
2110 def : SchedAlias<WriteFDiv64X, SKXWriteResGroup184>; // TODO - convert to ZnWriteResFpuPair
2112 def SKXWriteResGroup184_1 : SchedWriteRes<[SKXPort0,SKXFPDivider]> {
2114 let NumMicroOps = 1;
2115 let ResourceCycles = [1,5];
2117 def : SchedAlias<WriteFDiv64Y, SKXWriteResGroup184_1>; // TODO - convert to ZnWriteResFpuPair
2119 def SKXWriteResGroup187 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2121 let NumMicroOps = 3;
2122 let ResourceCycles = [1,1,1];
2124 def: InstRW<[SKXWriteResGroup187], (instregex "MUL_FI(16|32)m")>;
2126 def SKXWriteResGroup188 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2128 let NumMicroOps = 3;
2129 let ResourceCycles = [1,1,1];
2131 def: InstRW<[SKXWriteResGroup188], (instregex "VCVTPD2DQZrm(b?)",
2133 "VCVTPD2UDQZrm(b?)",
2135 "VCVTTPD2DQZrm(b?)",
2136 "VCVTTPD2UDQZrm(b?)",
2137 "VCVTUQQ2PSZrm(b?)")>;
2139 def SKXWriteResGroup189 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2141 let NumMicroOps = 4;
2142 let ResourceCycles = [2,1,1];
2144 def: InstRW<[SKXWriteResGroup189], (instregex "VPERMI2W256rm(b?)",
2146 "VPERMT2W256rm(b?)",
2149 def SKXWriteResGroup190 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort15,SKXPort0156]> {
2151 let NumMicroOps = 10;
2152 let ResourceCycles = [2,4,1,3];
2154 def: InstRW<[SKXWriteResGroup190], (instregex "RCR8rCL")>;
2156 def SKXWriteResGroup191 : SchedWriteRes<[SKXPort0]> {
2158 let NumMicroOps = 1;
2159 let ResourceCycles = [1];
2161 def: InstRW<[SKXWriteResGroup191], (instregex "DIVR_(FPrST0|FST0r|FrST0)")>;
2163 def SKXWriteResGroup194 : SchedWriteRes<[SKXPort1,SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2165 let NumMicroOps = 8;
2166 let ResourceCycles = [1,2,2,1,2];
2168 def: InstRW<[SKXWriteResGroup194], (instregex "VPCONFLICTDZ128rm(b?)")>;
2170 def SKXWriteResGroup195 : SchedWriteRes<[SKXPort1,SKXPort23,SKXPort237,SKXPort06,SKXPort15,SKXPort0156]> {
2172 let NumMicroOps = 10;
2173 let ResourceCycles = [1,1,1,5,1,1];
2175 def: InstRW<[SKXWriteResGroup195], (instregex "RCL(8|16|32|64)mCL")>;
2177 def SKXWriteResGroup199 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06,SKXPort15,SKXPort0156]> {
2179 let NumMicroOps = 14;
2180 let ResourceCycles = [1,1,1,4,2,5];
2182 def: InstRW<[SKXWriteResGroup199], (instrs CMPXCHG8B)>;
2184 def SKXWriteResGroup200 : SchedWriteRes<[SKXPort0156]> {
2186 let NumMicroOps = 16;
2187 let ResourceCycles = [16];
2189 def: InstRW<[SKXWriteResGroup200], (instrs VZEROALL)>;
2191 def SKXWriteResGroup201 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2193 let NumMicroOps = 2;
2194 let ResourceCycles = [1,1,5];
2196 def : SchedAlias<WriteFDivXLd, SKXWriteResGroup201>; // TODO - convert to ZnWriteResFpuPair
2198 def SKXWriteResGroup202 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort05,SKXPort0156]> {
2200 let NumMicroOps = 15;
2201 let ResourceCycles = [2,1,2,4,2,4];
2203 def: InstRW<[SKXWriteResGroup202], (instrs XCH_F)>;
2205 def SKXWriteResGroup205 : SchedWriteRes<[SKXPort23,SKXPort015]> {
2207 let NumMicroOps = 4;
2208 let ResourceCycles = [1,3];
2210 def: InstRW<[SKXWriteResGroup205], (instregex "VPMULLQZ128rm(b?)")>;
2212 def SKXWriteResGroup207 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort06,SKXPort0156]> {
2214 let NumMicroOps = 8;
2215 let ResourceCycles = [1,1,1,5];
2217 def: InstRW<[SKXWriteResGroup207], (instrs CPUID, RDTSC)>;
2219 def SKXWriteResGroup208 : SchedWriteRes<[SKXPort1,SKXPort23,SKXPort237,SKXPort06,SKXPort15,SKXPort0156]> {
2221 let NumMicroOps = 11;
2222 let ResourceCycles = [2,1,1,4,1,2];
2224 def: InstRW<[SKXWriteResGroup208], (instregex "RCR(8|16|32|64)mCL")>;
2226 def SKXWriteResGroup209 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2228 let NumMicroOps = 2;
2229 let ResourceCycles = [1,1,4];
2231 def : SchedAlias<WriteFDiv64Ld, SKXWriteResGroup209>; // TODO - convert to ZnWriteResFpuPair
2233 def SKXWriteResGroup211 : SchedWriteRes<[SKXPort23,SKXPort015]> {
2235 let NumMicroOps = 4;
2236 let ResourceCycles = [1,3];
2238 def: InstRW<[SKXWriteResGroup211], (instregex "VPMULLQZ256rm(b?)",
2241 def SKXWriteResGroup214 : SchedWriteRes<[]> {
2243 let NumMicroOps = 0;
2245 def: InstRW<[SKXWriteResGroup214], (instrs VGATHERDPSZ128rm,
2249 def SKXWriteResGroup215 : SchedWriteRes<[SKXPort0]> {
2251 let NumMicroOps = 1;
2252 let ResourceCycles = [1];
2254 def: InstRW<[SKXWriteResGroup215], (instregex "DIV_(FPrST0|FST0r|FrST0)")>;
2256 def SKXWriteResGroup216 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2258 let NumMicroOps = 2;
2259 let ResourceCycles = [1,1,4];
2261 def : SchedAlias<WriteFDiv64XLd, SKXWriteResGroup216>; // TODO - convert to ZnWriteResFpuPair
2263 def SKXWriteResGroup218 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2265 let NumMicroOps = 5;
2266 let ResourceCycles = [1,2,1,1];
2268 def: InstRW<[SKXWriteResGroup218], (instrs VGATHERQPSZ128rm,
2273 def SKXWriteResGroup219 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort6,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
2275 let NumMicroOps = 8;
2276 let ResourceCycles = [1,1,1,1,1,1,2];
2278 def: InstRW<[SKXWriteResGroup219], (instrs INSB, INSL, INSW)>;
2280 def SKXWriteResGroup220 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort0156]> {
2282 let NumMicroOps = 10;
2283 let ResourceCycles = [1,2,7];
2285 def: InstRW<[SKXWriteResGroup220], (instrs MWAITrr)>;
2287 def SKXWriteResGroup222 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2289 let NumMicroOps = 2;
2290 let ResourceCycles = [1,1,8];
2292 def : SchedAlias<WriteFDiv64YLd, SKXWriteResGroup222>; // TODO - convert to ZnWriteResFpuPair
2294 def SKXWriteResGroup223 : SchedWriteRes<[SKXPort0,SKXPort23]> {
2296 let NumMicroOps = 2;
2297 let ResourceCycles = [1,1];
2299 def: InstRW<[SKXWriteResGroup223], (instregex "DIV_F(32|64)m")>;
2301 def SKXWriteResGroup224 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2303 let NumMicroOps = 5;
2304 let ResourceCycles = [1,2,1,1];
2306 def: InstRW<[SKXWriteResGroup224], (instrs VGATHERDPDZ128rm,
2311 def SKXWriteResGroup224_2 : SchedWriteRes<[SKXPort0, SKXPort23, SKXPort5, SKXPort015]> {
2313 let NumMicroOps = 5;
2314 let ResourceCycles = [1,2,1,1];
2316 def: InstRW<[SKXWriteResGroup224_2], (instrs VGATHERDPSrm,
2333 def SKXWriteResGroup224_3 : SchedWriteRes<[SKXPort0, SKXPort23, SKXPort5, SKXPort015]> {
2335 let NumMicroOps = 5;
2336 let ResourceCycles = [1,2,1,1];
2338 def: InstRW<[SKXWriteResGroup224_3], (instrs VGATHERDPSYrm,
2353 def SKXWriteResGroup225 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort015]> {
2355 let NumMicroOps = 14;
2356 let ResourceCycles = [5,5,4];
2358 def: InstRW<[SKXWriteResGroup225], (instregex "VPCONFLICTDZ128rr",
2359 "VPCONFLICTQZ256rr")>;
2361 def SKXWriteResGroup228 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
2363 let NumMicroOps = 19;
2364 let ResourceCycles = [2,1,4,1,1,4,6];
2366 def: InstRW<[SKXWriteResGroup228], (instrs CMPXCHG16B)>;
2368 def SKXWriteResGroup233 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2370 let NumMicroOps = 3;
2371 let ResourceCycles = [1,1,1];
2373 def: InstRW<[SKXWriteResGroup233], (instregex "DIV_FI(16|32)m")>;
2375 def SKXWriteResGroup234 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2377 let NumMicroOps = 5;
2378 let ResourceCycles = [1,2,1,1];
2380 def: InstRW<[SKXWriteResGroup234], (instrs VGATHERDPDZ256rm,
2386 def SKXWriteResGroup238 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2388 let NumMicroOps = 5;
2389 let ResourceCycles = [1,2,1,1];
2391 def: InstRW<[SKXWriteResGroup238], (instrs VGATHERDPDZrm,
2396 def SKXWriteResGroup239 : SchedWriteRes<[SKXPort0,SKXPort23]> {
2398 let NumMicroOps = 2;
2399 let ResourceCycles = [1,1];
2401 def: InstRW<[SKXWriteResGroup239], (instregex "DIVR_F(32|64)m")>;
2403 def SKXWriteResGroup240 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2405 let NumMicroOps = 5;
2406 let ResourceCycles = [1,2,1,1];
2408 def: InstRW<[SKXWriteResGroup240], (instrs VGATHERDPSZ256rm,
2411 def SKXWriteResGroup241 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23,SKXPort0156]> {
2413 let NumMicroOps = 8;
2414 let ResourceCycles = [2,4,1,1];
2416 def: InstRW<[SKXWriteResGroup241], (instregex "IDIV(8|16|32|64)m")>;
2418 def SKXWriteResGroup242 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2420 let NumMicroOps = 15;
2421 let ResourceCycles = [5,5,1,4];
2423 def: InstRW<[SKXWriteResGroup242], (instregex "VPCONFLICTQZ256rm(b?)")>;
2425 def SKXWriteResGroup243 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2427 let NumMicroOps = 3;
2428 let ResourceCycles = [1,1,1];
2430 def: InstRW<[SKXWriteResGroup243], (instregex "DIVR_FI(16|32)m")>;
2432 def SKXWriteResGroup245 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2434 let NumMicroOps = 5;
2435 let ResourceCycles = [1,2,1,1];
2437 def: InstRW<[SKXWriteResGroup245], (instrs VGATHERDPSZrm,
2440 def SKXWriteResGroup247 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort23,SKXPort06,SKXPort0156]> {
2442 let NumMicroOps = 23;
2443 let ResourceCycles = [1,5,3,4,10];
2445 def: InstRW<[SKXWriteResGroup247], (instregex "IN(8|16|32)ri",
2448 def SKXWriteResGroup248 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
2450 let NumMicroOps = 23;
2451 let ResourceCycles = [1,5,2,1,4,10];
2453 def: InstRW<[SKXWriteResGroup248], (instregex "OUT(8|16|32)ir",
2456 def SKXWriteResGroup249 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort015]> {
2458 let NumMicroOps = 21;
2459 let ResourceCycles = [9,7,5];
2461 def: InstRW<[SKXWriteResGroup249], (instregex "VPCONFLICTDZ256rr",
2464 def SKXWriteResGroup250 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort23,SKXPort0156]> {
2466 let NumMicroOps = 31;
2467 let ResourceCycles = [1,8,1,21];
2469 def: InstRW<[SKXWriteResGroup250], (instregex "XRSTOR(64)?")>;
2471 def SKXWriteResGroup252 : SchedWriteRes<[SKXPort1,SKXPort4,SKXPort5,SKXPort6,SKXPort23,SKXPort237,SKXPort15,SKXPort0156]> {
2473 let NumMicroOps = 18;
2474 let ResourceCycles = [1,1,2,3,1,1,1,8];
2476 def: InstRW<[SKXWriteResGroup252], (instrs VMCLEARm)>;
2478 def SKXWriteResGroup253 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort0156]> {
2480 let NumMicroOps = 39;
2481 let ResourceCycles = [1,10,1,1,26];
2483 def: InstRW<[SKXWriteResGroup253], (instrs XSAVE64)>;
2485 def SKXWriteResGroup254 : SchedWriteRes<[SKXPort5,SKXPort0156]> {
2487 let NumMicroOps = 22;
2488 let ResourceCycles = [2,20];
2490 def: InstRW<[SKXWriteResGroup254], (instrs RDTSCP)>;
2492 def SKXWriteResGroup255 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort0156]> {
2494 let NumMicroOps = 40;
2495 let ResourceCycles = [1,11,1,1,26];
2497 def: InstRW<[SKXWriteResGroup255], (instrs XSAVE)>;
2498 def: InstRW<[SKXWriteResGroup255], (instregex "XSAVEC", "XSAVES", "XSAVEOPT")>;
2500 def SKXWriteResGroup256 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2502 let NumMicroOps = 22;
2503 let ResourceCycles = [9,7,1,5];
2505 def: InstRW<[SKXWriteResGroup256], (instregex "VPCONFLICTDZ256rm(b?)",
2506 "VPCONFLICTQZrm(b?)")>;
2508 def SKXWriteResGroup258 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort05,SKXPort06,SKXPort0156]> {
2510 let NumMicroOps = 64;
2511 let ResourceCycles = [2,8,5,10,39];
2513 def: InstRW<[SKXWriteResGroup258], (instrs FLDENVm)>;
2515 def SKXWriteResGroup259 : SchedWriteRes<[SKXPort0,SKXPort6,SKXPort23,SKXPort05,SKXPort06,SKXPort15,SKXPort0156]> {
2517 let NumMicroOps = 88;
2518 let ResourceCycles = [4,4,31,1,2,1,45];
2520 def: InstRW<[SKXWriteResGroup259], (instrs FXRSTOR64)>;
2522 def SKXWriteResGroup260 : SchedWriteRes<[SKXPort0,SKXPort6,SKXPort23,SKXPort05,SKXPort06,SKXPort15,SKXPort0156]> {
2524 let NumMicroOps = 90;
2525 let ResourceCycles = [4,2,33,1,2,1,47];
2527 def: InstRW<[SKXWriteResGroup260], (instrs FXRSTOR)>;
2529 def SKXWriteResGroup261 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort015]> {
2531 let NumMicroOps = 35;
2532 let ResourceCycles = [17,11,7];
2534 def: InstRW<[SKXWriteResGroup261], (instregex "VPCONFLICTDZrr")>;
2536 def SKXWriteResGroup262 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2538 let NumMicroOps = 36;
2539 let ResourceCycles = [17,11,1,7];
2541 def: InstRW<[SKXWriteResGroup262], (instregex "VPCONFLICTDZrm(b?)")>;
2543 def SKXWriteResGroup263 : SchedWriteRes<[SKXPort5,SKXPort05,SKXPort0156]> {
2545 let NumMicroOps = 15;
2546 let ResourceCycles = [6,3,6];
2548 def: InstRW<[SKXWriteResGroup263], (instrs FNINIT)>;
2550 def SKXWriteResGroup264 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort05,SKXPort0156]> {
2552 let NumMicroOps = 32;
2553 let ResourceCycles = [7,2,8,3,1,11];
2555 def: InstRW<[SKXWriteResGroup264], (instregex "DIV(16|32|64)r")>;
2557 def SKXWriteResGroup265 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort06,SKXPort0156]> {
2559 let NumMicroOps = 66;
2560 let ResourceCycles = [4,2,4,8,14,34];
2562 def: InstRW<[SKXWriteResGroup265], (instregex "IDIV(16|32|64)r")>;
2564 def SKXWriteResGroup266 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort4,SKXPort5,SKXPort6,SKXPort237,SKXPort06,SKXPort0156]> {
2566 let NumMicroOps = 100;
2567 let ResourceCycles = [9,1,11,16,1,11,21,30];
2569 def: InstRW<[SKXWriteResGroup266], (instrs FSTENVm)>;
2571 def SKXWriteResGroup267 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
2573 let NumMicroOps = 4;
2574 let ResourceCycles = [1,3];
2576 def: InstRW<[SKXWriteResGroup267], (instrs PAUSE)>;
2578 def: InstRW<[WriteZero], (instrs CLC)>;