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]>;
140 // Integer shifts and rotates.
141 defm : SKXWriteResPair<WriteShift, [SKXPort06], 1>;
144 defm : X86WriteRes<WriteSHDrri, [SKXPort1], 3, [1], 1>;
145 defm : X86WriteRes<WriteSHDrrcl,[SKXPort1,SKXPort06,SKXPort0156], 6, [1, 2, 1], 4>;
146 defm : X86WriteRes<WriteSHDmri, [SKXPort1,SKXPort23,SKXPort237,SKXPort0156], 9, [1, 1, 1, 1], 4>;
147 defm : X86WriteRes<WriteSHDmrcl,[SKXPort1,SKXPort23,SKXPort237,SKXPort06,SKXPort0156], 11, [1, 1, 1, 2, 1], 6>;
150 defm : SKXWriteResPair<WriteBSF, [SKXPort1], 3>;
151 defm : SKXWriteResPair<WriteBSR, [SKXPort1], 3>;
152 defm : SKXWriteResPair<WriteLZCNT, [SKXPort1], 3>;
153 defm : SKXWriteResPair<WriteTZCNT, [SKXPort1], 3>;
154 defm : SKXWriteResPair<WritePOPCNT, [SKXPort1], 3>;
156 // BMI1 BEXTR, BMI2 BZHI
157 defm : SKXWriteResPair<WriteBEXTR, [SKXPort06,SKXPort15], 2, [1,1], 2>;
158 defm : SKXWriteResPair<WriteBZHI, [SKXPort15], 1>;
160 // Loads, stores, and moves, not folded with other operations.
161 defm : X86WriteRes<WriteLoad, [SKXPort23], 5, [1], 1>;
162 defm : X86WriteRes<WriteStore, [SKXPort237, SKXPort4], 1, [1,1], 1>;
163 defm : X86WriteRes<WriteStoreNT, [SKXPort237, SKXPort4], 1, [1,1], 2>;
164 defm : X86WriteRes<WriteMove, [SKXPort0156], 1, [1], 1>;
166 // Idioms that clear a register, like xorps %xmm0, %xmm0.
167 // These can often bypass execution ports completely.
168 def : WriteRes<WriteZero, []>;
170 // Branches don't produce values, so they have no latency, but they still
171 // consume resources. Indirect branches can fold loads.
172 defm : SKXWriteResPair<WriteJump, [SKXPort06], 1>;
174 // Floating point. This covers both scalar and vector operations.
175 defm : X86WriteRes<WriteFLD0, [SKXPort05], 1, [1], 1>;
176 defm : X86WriteRes<WriteFLD1, [SKXPort05], 1, [2], 2>;
177 defm : X86WriteRes<WriteFLDC, [SKXPort05], 1, [2], 2>;
178 defm : X86WriteRes<WriteFLoad, [SKXPort23], 5, [1], 1>;
179 defm : X86WriteRes<WriteFLoadX, [SKXPort23], 6, [1], 1>;
180 defm : X86WriteRes<WriteFLoadY, [SKXPort23], 7, [1], 1>;
181 defm : X86WriteRes<WriteFMaskedLoad, [SKXPort23,SKXPort015], 7, [1,1], 2>;
182 defm : X86WriteRes<WriteFMaskedLoadY, [SKXPort23,SKXPort015], 8, [1,1], 2>;
183 defm : X86WriteRes<WriteFStore, [SKXPort237,SKXPort4], 1, [1,1], 2>;
184 defm : X86WriteRes<WriteFStoreX, [SKXPort237,SKXPort4], 1, [1,1], 2>;
185 defm : X86WriteRes<WriteFStoreY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
186 defm : X86WriteRes<WriteFStoreNT, [SKXPort237,SKXPort4], 1, [1,1], 2>;
187 defm : X86WriteRes<WriteFStoreNTX, [SKXPort237,SKXPort4], 1, [1,1], 2>;
188 defm : X86WriteRes<WriteFStoreNTY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
189 defm : X86WriteRes<WriteFMaskedStore, [SKXPort237,SKXPort0], 2, [1,1], 2>;
190 defm : X86WriteRes<WriteFMaskedStoreY, [SKXPort237,SKXPort0], 2, [1,1], 2>;
191 defm : X86WriteRes<WriteFMove, [SKXPort015], 1, [1], 1>;
192 defm : X86WriteRes<WriteFMoveX, [SKXPort015], 1, [1], 1>;
193 defm : X86WriteRes<WriteFMoveY, [SKXPort015], 1, [1], 1>;
194 defm : X86WriteRes<WriteEMMS, [SKXPort05,SKXPort0156], 10, [9,1], 10>;
196 defm : SKXWriteResPair<WriteFAdd, [SKXPort01], 4, [1], 1, 5>; // Floating point add/sub.
197 defm : SKXWriteResPair<WriteFAddX, [SKXPort01], 4, [1], 1, 6>;
198 defm : SKXWriteResPair<WriteFAddY, [SKXPort01], 4, [1], 1, 7>;
199 defm : SKXWriteResPair<WriteFAddZ, [SKXPort05], 4, [1], 1, 7>;
200 defm : SKXWriteResPair<WriteFAdd64, [SKXPort01], 4, [1], 1, 5>; // Floating point double add/sub.
201 defm : SKXWriteResPair<WriteFAdd64X, [SKXPort01], 4, [1], 1, 6>;
202 defm : SKXWriteResPair<WriteFAdd64Y, [SKXPort01], 4, [1], 1, 7>;
203 defm : SKXWriteResPair<WriteFAdd64Z, [SKXPort05], 4, [1], 1, 7>;
205 defm : SKXWriteResPair<WriteFCmp, [SKXPort01], 4, [1], 1, 5>; // Floating point compare.
206 defm : SKXWriteResPair<WriteFCmpX, [SKXPort01], 4, [1], 1, 6>;
207 defm : SKXWriteResPair<WriteFCmpY, [SKXPort01], 4, [1], 1, 7>;
208 defm : SKXWriteResPair<WriteFCmpZ, [SKXPort05], 4, [1], 1, 7>;
209 defm : SKXWriteResPair<WriteFCmp64, [SKXPort01], 4, [1], 1, 5>; // Floating point double compare.
210 defm : SKXWriteResPair<WriteFCmp64X, [SKXPort01], 4, [1], 1, 6>;
211 defm : SKXWriteResPair<WriteFCmp64Y, [SKXPort01], 4, [1], 1, 7>;
212 defm : SKXWriteResPair<WriteFCmp64Z, [SKXPort05], 4, [1], 1, 7>;
214 defm : SKXWriteResPair<WriteFCom, [SKXPort0], 2>; // Floating point compare to flags.
216 defm : SKXWriteResPair<WriteFMul, [SKXPort01], 4, [1], 1, 5>; // Floating point multiplication.
217 defm : SKXWriteResPair<WriteFMulX, [SKXPort01], 4, [1], 1, 6>;
218 defm : SKXWriteResPair<WriteFMulY, [SKXPort01], 4, [1], 1, 7>;
219 defm : SKXWriteResPair<WriteFMulZ, [SKXPort05], 4, [1], 1, 7>;
220 defm : SKXWriteResPair<WriteFMul64, [SKXPort01], 4, [1], 1, 5>; // Floating point double multiplication.
221 defm : SKXWriteResPair<WriteFMul64X, [SKXPort01], 4, [1], 1, 6>;
222 defm : SKXWriteResPair<WriteFMul64Y, [SKXPort01], 4, [1], 1, 7>;
223 defm : SKXWriteResPair<WriteFMul64Z, [SKXPort05], 4, [1], 1, 7>;
225 defm : SKXWriteResPair<WriteFDiv, [SKXPort0,SKXFPDivider], 11, [1,3], 1, 5>; // 10-14 cycles. // Floating point division.
226 //defm : SKXWriteResPair<WriteFDivX, [SKXPort0,SKXFPDivider], 11, [1,3], 1, 6>; // 10-14 cycles.
227 defm : SKXWriteResPair<WriteFDivY, [SKXPort0,SKXFPDivider], 11, [1,5], 1, 7>; // 10-14 cycles.
228 defm : SKXWriteResPair<WriteFDivZ, [SKXPort0,SKXPort5,SKXFPDivider], 18, [2,1,10], 3, 7>; // 10-14 cycles.
229 //defm : SKXWriteResPair<WriteFDiv64, [SKXPort0,SKXFPDivider], 14, [1,3], 1, 5>; // 10-14 cycles. // Floating point division.
230 //defm : SKXWriteResPair<WriteFDiv64X, [SKXPort0,SKXFPDivider], 14, [1,3], 1, 6>; // 10-14 cycles.
231 //defm : SKXWriteResPair<WriteFDiv64Y, [SKXPort0,SKXFPDivider], 14, [1,5], 1, 7>; // 10-14 cycles.
232 defm : SKXWriteResPair<WriteFDiv64Z, [SKXPort0,SKXPort5,SKXFPDivider], 23, [2,1,16], 3, 7>; // 10-14 cycles.
234 defm : SKXWriteResPair<WriteFSqrt, [SKXPort0,SKXFPDivider], 12, [1,3], 1, 5>; // Floating point square root.
235 defm : SKXWriteResPair<WriteFSqrtX, [SKXPort0,SKXFPDivider], 12, [1,3], 1, 6>;
236 defm : SKXWriteResPair<WriteFSqrtY, [SKXPort0,SKXFPDivider], 12, [1,6], 1, 7>;
237 defm : SKXWriteResPair<WriteFSqrtZ, [SKXPort0,SKXPort5,SKXFPDivider], 20, [2,1,12], 3, 7>;
238 defm : SKXWriteResPair<WriteFSqrt64, [SKXPort0,SKXFPDivider], 18, [1,6], 1, 5>; // Floating point double square root.
239 defm : SKXWriteResPair<WriteFSqrt64X, [SKXPort0,SKXFPDivider], 18, [1,6], 1, 6>;
240 defm : SKXWriteResPair<WriteFSqrt64Y, [SKXPort0,SKXFPDivider], 18, [1,12],1, 7>;
241 defm : SKXWriteResPair<WriteFSqrt64Z, [SKXPort0,SKXPort5,SKXFPDivider], 32, [2,1,24], 3, 7>;
242 defm : SKXWriteResPair<WriteFSqrt80, [SKXPort0,SKXFPDivider], 21, [1,7]>; // Floating point long double square root.
244 defm : SKXWriteResPair<WriteFRcp, [SKXPort0], 4, [1], 1, 5>; // Floating point reciprocal estimate.
245 defm : SKXWriteResPair<WriteFRcpX, [SKXPort0], 4, [1], 1, 6>;
246 defm : SKXWriteResPair<WriteFRcpY, [SKXPort0], 4, [1], 1, 7>;
247 defm : SKXWriteResPair<WriteFRcpZ, [SKXPort0,SKXPort5], 4, [2,1], 3, 7>;
249 defm : SKXWriteResPair<WriteFRsqrt, [SKXPort0], 4, [1], 1, 5>; // Floating point reciprocal square root estimate.
250 defm : SKXWriteResPair<WriteFRsqrtX,[SKXPort0], 4, [1], 1, 6>;
251 defm : SKXWriteResPair<WriteFRsqrtY,[SKXPort0], 4, [1], 1, 7>;
252 defm : SKXWriteResPair<WriteFRsqrtZ,[SKXPort0,SKXPort5], 9, [2,1], 3, 7>;
254 defm : SKXWriteResPair<WriteFMA, [SKXPort01], 4, [1], 1, 5>; // Fused Multiply Add.
255 defm : SKXWriteResPair<WriteFMAX, [SKXPort01], 4, [1], 1, 6>;
256 defm : SKXWriteResPair<WriteFMAY, [SKXPort01], 4, [1], 1, 7>;
257 defm : SKXWriteResPair<WriteFMAZ, [SKXPort05], 4, [1], 1, 7>;
258 defm : SKXWriteResPair<WriteDPPD, [SKXPort5,SKXPort015], 9, [1,2], 3, 6>; // Floating point double dot product.
259 defm : SKXWriteResPair<WriteDPPS, [SKXPort5,SKXPort015], 13, [1,3], 4, 6>;
260 defm : SKXWriteResPair<WriteDPPSY,[SKXPort5,SKXPort015], 13, [1,3], 4, 7>;
261 defm : SKXWriteResPair<WriteDPPSZ,[SKXPort5,SKXPort015], 13, [1,3], 4, 7>;
262 defm : SKXWriteResPair<WriteFSign, [SKXPort0], 1>; // Floating point fabs/fchs.
263 defm : SKXWriteResPair<WriteFRnd, [SKXPort01], 8, [2], 2, 6>; // Floating point rounding.
264 defm : SKXWriteResPair<WriteFRndY, [SKXPort01], 8, [2], 2, 7>;
265 defm : SKXWriteResPair<WriteFRndZ, [SKXPort05], 8, [2], 2, 7>;
266 defm : SKXWriteResPair<WriteFLogic, [SKXPort015], 1, [1], 1, 6>; // Floating point and/or/xor logicals.
267 defm : SKXWriteResPair<WriteFLogicY, [SKXPort015], 1, [1], 1, 7>;
268 defm : SKXWriteResPair<WriteFLogicZ, [SKXPort05], 1, [1], 1, 7>;
269 defm : SKXWriteResPair<WriteFTest, [SKXPort0], 2, [1], 1, 6>; // Floating point TEST instructions.
270 defm : SKXWriteResPair<WriteFTestY, [SKXPort0], 2, [1], 1, 7>;
271 defm : SKXWriteResPair<WriteFTestZ, [SKXPort0], 2, [1], 1, 7>;
272 defm : SKXWriteResPair<WriteFShuffle, [SKXPort5], 1, [1], 1, 6>; // Floating point vector shuffles.
273 defm : SKXWriteResPair<WriteFShuffleY, [SKXPort5], 1, [1], 1, 7>;
274 defm : SKXWriteResPair<WriteFShuffleZ, [SKXPort5], 1, [1], 1, 7>;
275 defm : SKXWriteResPair<WriteFVarShuffle, [SKXPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
276 defm : SKXWriteResPair<WriteFVarShuffleY, [SKXPort5], 1, [1], 1, 7>;
277 defm : SKXWriteResPair<WriteFVarShuffleZ, [SKXPort5], 1, [1], 1, 7>;
278 defm : SKXWriteResPair<WriteFBlend, [SKXPort015], 1, [1], 1, 6>; // Floating point vector blends.
279 defm : SKXWriteResPair<WriteFBlendY,[SKXPort015], 1, [1], 1, 7>;
280 defm : SKXWriteResPair<WriteFBlendZ,[SKXPort015], 1, [1], 1, 7>;
281 defm : SKXWriteResPair<WriteFVarBlend, [SKXPort015], 2, [2], 2, 6>; // Fp vector variable blends.
282 defm : SKXWriteResPair<WriteFVarBlendY,[SKXPort015], 2, [2], 2, 7>;
283 defm : SKXWriteResPair<WriteFVarBlendZ,[SKXPort015], 2, [2], 2, 7>;
285 // FMA Scheduling helper class.
286 // class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
288 // Vector integer operations.
289 defm : X86WriteRes<WriteVecLoad, [SKXPort23], 5, [1], 1>;
290 defm : X86WriteRes<WriteVecLoadX, [SKXPort23], 6, [1], 1>;
291 defm : X86WriteRes<WriteVecLoadY, [SKXPort23], 7, [1], 1>;
292 defm : X86WriteRes<WriteVecLoadNT, [SKXPort23], 6, [1], 1>;
293 defm : X86WriteRes<WriteVecLoadNTY, [SKXPort23], 7, [1], 1>;
294 defm : X86WriteRes<WriteVecMaskedLoad, [SKXPort23,SKXPort015], 7, [1,1], 2>;
295 defm : X86WriteRes<WriteVecMaskedLoadY, [SKXPort23,SKXPort015], 8, [1,1], 2>;
296 defm : X86WriteRes<WriteVecStore, [SKXPort237,SKXPort4], 1, [1,1], 2>;
297 defm : X86WriteRes<WriteVecStoreX, [SKXPort237,SKXPort4], 1, [1,1], 2>;
298 defm : X86WriteRes<WriteVecStoreY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
299 defm : X86WriteRes<WriteVecStoreNT, [SKXPort237,SKXPort4], 1, [1,1], 2>;
300 defm : X86WriteRes<WriteVecStoreNTY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
301 defm : X86WriteRes<WriteVecMaskedStore, [SKXPort237,SKXPort0], 2, [1,1], 2>;
302 defm : X86WriteRes<WriteVecMaskedStoreY, [SKXPort237,SKXPort0], 2, [1,1], 2>;
303 defm : X86WriteRes<WriteVecMove, [SKXPort05], 1, [1], 1>;
304 defm : X86WriteRes<WriteVecMoveX, [SKXPort015], 1, [1], 1>;
305 defm : X86WriteRes<WriteVecMoveY, [SKXPort015], 1, [1], 1>;
306 defm : X86WriteRes<WriteVecMoveToGpr, [SKXPort0], 2, [1], 1>;
307 defm : X86WriteRes<WriteVecMoveFromGpr, [SKXPort5], 1, [1], 1>;
309 defm : SKXWriteResPair<WriteVecALU, [SKXPort05], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
310 defm : SKXWriteResPair<WriteVecALUX, [SKXPort01], 1, [1], 1, 6>;
311 defm : SKXWriteResPair<WriteVecALUY, [SKXPort01], 1, [1], 1, 7>;
312 defm : SKXWriteResPair<WriteVecALUZ, [SKXPort0], 1, [1], 1, 7>;
313 defm : SKXWriteResPair<WriteVecLogic, [SKXPort05], 1, [1], 1, 5>; // Vector integer and/or/xor.
314 defm : SKXWriteResPair<WriteVecLogicX,[SKXPort015], 1, [1], 1, 6>;
315 defm : SKXWriteResPair<WriteVecLogicY,[SKXPort015], 1, [1], 1, 7>;
316 defm : SKXWriteResPair<WriteVecLogicZ,[SKXPort05], 1, [1], 1, 7>;
317 defm : SKXWriteResPair<WriteVecTest, [SKXPort0,SKXPort5], 3, [1,1], 2, 6>; // Vector integer TEST instructions.
318 defm : SKXWriteResPair<WriteVecTestY, [SKXPort0,SKXPort5], 3, [1,1], 2, 7>;
319 defm : SKXWriteResPair<WriteVecTestZ, [SKXPort0,SKXPort5], 3, [1,1], 2, 7>;
320 defm : SKXWriteResPair<WriteVecIMul, [SKXPort0], 4, [1], 1, 5>; // Vector integer multiply.
321 defm : SKXWriteResPair<WriteVecIMulX, [SKXPort01], 4, [1], 1, 6>;
322 defm : SKXWriteResPair<WriteVecIMulY, [SKXPort01], 4, [1], 1, 7>;
323 defm : SKXWriteResPair<WriteVecIMulZ, [SKXPort05], 4, [1], 1, 7>;
324 defm : SKXWriteResPair<WritePMULLD, [SKXPort01], 10, [2], 2, 6>; // Vector PMULLD.
325 defm : SKXWriteResPair<WritePMULLDY, [SKXPort01], 10, [2], 2, 7>;
326 defm : SKXWriteResPair<WritePMULLDZ, [SKXPort05], 10, [2], 2, 7>;
327 defm : SKXWriteResPair<WriteShuffle, [SKXPort5], 1, [1], 1, 5>; // Vector shuffles.
328 defm : SKXWriteResPair<WriteShuffleX, [SKXPort5], 1, [1], 1, 6>;
329 defm : SKXWriteResPair<WriteShuffleY, [SKXPort5], 1, [1], 1, 7>;
330 defm : SKXWriteResPair<WriteShuffleZ, [SKXPort5], 1, [1], 1, 7>;
331 defm : SKXWriteResPair<WriteVarShuffle, [SKXPort5], 1, [1], 1, 5>; // Vector variable shuffles.
332 defm : SKXWriteResPair<WriteVarShuffleX, [SKXPort5], 1, [1], 1, 6>;
333 defm : SKXWriteResPair<WriteVarShuffleY, [SKXPort5], 1, [1], 1, 7>;
334 defm : SKXWriteResPair<WriteVarShuffleZ, [SKXPort5], 1, [1], 1, 7>;
335 defm : SKXWriteResPair<WriteBlend, [SKXPort5], 1, [1], 1, 6>; // Vector blends.
336 defm : SKXWriteResPair<WriteBlendY,[SKXPort5], 1, [1], 1, 7>;
337 defm : SKXWriteResPair<WriteBlendZ,[SKXPort5], 1, [1], 1, 7>;
338 defm : SKXWriteResPair<WriteVarBlend, [SKXPort015], 2, [2], 2, 6>; // Vector variable blends.
339 defm : SKXWriteResPair<WriteVarBlendY,[SKXPort015], 2, [2], 2, 6>;
340 defm : SKXWriteResPair<WriteVarBlendZ,[SKXPort05], 2, [1], 1, 6>;
341 defm : SKXWriteResPair<WriteMPSAD, [SKXPort5], 4, [2], 2, 6>; // Vector MPSAD.
342 defm : SKXWriteResPair<WriteMPSADY, [SKXPort5], 4, [2], 2, 7>;
343 defm : SKXWriteResPair<WriteMPSADZ, [SKXPort5], 4, [2], 2, 7>;
344 defm : SKXWriteResPair<WritePSADBW, [SKXPort5], 3, [1], 1, 5>; // Vector PSADBW.
345 defm : SKXWriteResPair<WritePSADBWX, [SKXPort5], 3, [1], 1, 6>;
346 defm : SKXWriteResPair<WritePSADBWY, [SKXPort5], 3, [1], 1, 7>;
347 defm : SKXWriteResPair<WritePSADBWZ, [SKXPort5], 3, [1], 1, 7>;
348 defm : SKXWriteResPair<WritePHMINPOS, [SKXPort0], 4, [1], 1, 6>; // Vector PHMINPOS.
350 // Vector integer shifts.
351 defm : SKXWriteResPair<WriteVecShift, [SKXPort0], 1, [1], 1, 5>;
352 defm : X86WriteRes<WriteVecShiftX, [SKXPort5,SKXPort01], 2, [1,1], 2>;
353 defm : X86WriteRes<WriteVecShiftY, [SKXPort5,SKXPort01], 4, [1,1], 2>;
354 defm : X86WriteRes<WriteVecShiftZ, [SKXPort5,SKXPort0], 4, [1,1], 2>;
355 defm : X86WriteRes<WriteVecShiftXLd, [SKXPort01,SKXPort23], 7, [1,1], 2>;
356 defm : X86WriteRes<WriteVecShiftYLd, [SKXPort01,SKXPort23], 8, [1,1], 2>;
357 defm : X86WriteRes<WriteVecShiftZLd, [SKXPort0,SKXPort23], 8, [1,1], 2>;
359 defm : SKXWriteResPair<WriteVecShiftImm, [SKXPort0], 1, [1], 1, 5>;
360 defm : SKXWriteResPair<WriteVecShiftImmX, [SKXPort01], 1, [1], 1, 6>; // Vector integer immediate shifts.
361 defm : SKXWriteResPair<WriteVecShiftImmY, [SKXPort01], 1, [1], 1, 7>;
362 defm : SKXWriteResPair<WriteVecShiftImmZ, [SKXPort0], 1, [1], 1, 7>;
363 defm : SKXWriteResPair<WriteVarVecShift, [SKXPort01], 1, [1], 1, 6>; // Variable vector shifts.
364 defm : SKXWriteResPair<WriteVarVecShiftY, [SKXPort01], 1, [1], 1, 7>;
365 defm : SKXWriteResPair<WriteVarVecShiftZ, [SKXPort0], 1, [1], 1, 7>;
367 // Vector insert/extract operations.
368 def : WriteRes<WriteVecInsert, [SKXPort5]> {
371 let ResourceCycles = [2];
373 def : WriteRes<WriteVecInsertLd, [SKXPort5,SKXPort23]> {
377 def: InstRW<[WriteVecInsertLd], (instregex "(V?)MOV(H|L)(PD|PS)rm")>;
379 def : WriteRes<WriteVecExtract, [SKXPort0,SKXPort5]> {
383 def : WriteRes<WriteVecExtractSt, [SKXPort4,SKXPort5,SKXPort237]> {
388 // Conversion between integer and float.
389 defm : SKXWriteResPair<WriteCvtSS2I, [SKXPort01], 6, [2], 2>; // Needs more work: DD vs DQ.
390 defm : SKXWriteResPair<WriteCvtPS2I, [SKXPort01], 3>;
391 defm : SKXWriteResPair<WriteCvtPS2IY, [SKXPort01], 3>;
392 defm : SKXWriteResPair<WriteCvtPS2IZ, [SKXPort05], 3>;
393 defm : SKXWriteResPair<WriteCvtSD2I, [SKXPort01], 6, [2], 2>;
394 defm : SKXWriteResPair<WriteCvtPD2I, [SKXPort01], 3>;
395 defm : SKXWriteResPair<WriteCvtPD2IY, [SKXPort01], 3>;
396 defm : SKXWriteResPair<WriteCvtPD2IZ, [SKXPort05], 3>;
398 defm : SKXWriteResPair<WriteCvtI2SS, [SKXPort1], 4>;
399 defm : SKXWriteResPair<WriteCvtI2PS, [SKXPort01], 4>;
400 defm : SKXWriteResPair<WriteCvtI2PSY, [SKXPort01], 4>;
401 defm : SKXWriteResPair<WriteCvtI2PSZ, [SKXPort05], 4>; // Needs more work: DD vs DQ.
402 defm : SKXWriteResPair<WriteCvtI2SD, [SKXPort1], 4>;
403 defm : SKXWriteResPair<WriteCvtI2PD, [SKXPort01], 4>;
404 defm : SKXWriteResPair<WriteCvtI2PDY, [SKXPort01], 4>;
405 defm : SKXWriteResPair<WriteCvtI2PDZ, [SKXPort05], 4>;
407 defm : SKXWriteResPair<WriteCvtSS2SD, [SKXPort1], 3>;
408 defm : SKXWriteResPair<WriteCvtPS2PD, [SKXPort1], 3>;
409 defm : SKXWriteResPair<WriteCvtPS2PDY, [SKXPort5,SKXPort01], 3, [1,1], 2>;
410 defm : SKXWriteResPair<WriteCvtPS2PDZ, [SKXPort05], 3, [2], 2>;
411 defm : SKXWriteResPair<WriteCvtSD2SS, [SKXPort1], 3>;
412 defm : SKXWriteResPair<WriteCvtPD2PS, [SKXPort1], 3>;
413 defm : SKXWriteResPair<WriteCvtPD2PSY, [SKXPort5,SKXPort01], 3, [1,1], 2>;
414 defm : SKXWriteResPair<WriteCvtPD2PSZ, [SKXPort05], 3, [2], 2>;
416 defm : X86WriteRes<WriteCvtPH2PS, [SKXPort5,SKXPort01], 5, [1,1], 2>;
417 defm : X86WriteRes<WriteCvtPH2PSY, [SKXPort5,SKXPort01], 7, [1,1], 2>;
418 defm : X86WriteRes<WriteCvtPH2PSZ, [SKXPort5,SKXPort0], 7, [1,1], 2>;
419 defm : X86WriteRes<WriteCvtPH2PSLd, [SKXPort23,SKXPort01], 9, [1,1], 2>;
420 defm : X86WriteRes<WriteCvtPH2PSYLd, [SKXPort23,SKXPort01], 10, [1,1], 2>;
421 defm : X86WriteRes<WriteCvtPH2PSZLd, [SKXPort23,SKXPort05], 10, [1,1], 2>;
423 defm : X86WriteRes<WriteCvtPS2PH, [SKXPort5,SKXPort01], 5, [1,1], 2>;
424 defm : X86WriteRes<WriteCvtPS2PHY, [SKXPort5,SKXPort01], 7, [1,1], 2>;
425 defm : X86WriteRes<WriteCvtPS2PHZ, [SKXPort5,SKXPort05], 7, [1,1], 2>;
426 defm : X86WriteRes<WriteCvtPS2PHSt, [SKXPort4,SKXPort5,SKXPort237,SKXPort01], 6, [1,1,1,1], 4>;
427 defm : X86WriteRes<WriteCvtPS2PHYSt, [SKXPort4,SKXPort5,SKXPort237,SKXPort01], 8, [1,1,1,1], 4>;
428 defm : X86WriteRes<WriteCvtPS2PHZSt, [SKXPort4,SKXPort5,SKXPort237,SKXPort05], 8, [1,1,1,1], 4>;
430 // Strings instructions.
432 // Packed Compare Implicit Length Strings, Return Mask
433 def : WriteRes<WritePCmpIStrM, [SKXPort0]> {
436 let ResourceCycles = [3];
438 def : WriteRes<WritePCmpIStrMLd, [SKXPort0, SKXPort23]> {
441 let ResourceCycles = [3,1];
444 // Packed Compare Explicit Length Strings, Return Mask
445 def : WriteRes<WritePCmpEStrM, [SKXPort0, SKXPort5, SKXPort015, SKXPort0156]> {
448 let ResourceCycles = [4,3,1,1];
450 def : WriteRes<WritePCmpEStrMLd, [SKXPort0, SKXPort5, SKXPort23, SKXPort015, SKXPort0156]> {
452 let NumMicroOps = 10;
453 let ResourceCycles = [4,3,1,1,1];
456 // Packed Compare Implicit Length Strings, Return Index
457 def : WriteRes<WritePCmpIStrI, [SKXPort0]> {
460 let ResourceCycles = [3];
462 def : WriteRes<WritePCmpIStrILd, [SKXPort0, SKXPort23]> {
465 let ResourceCycles = [3,1];
468 // Packed Compare Explicit Length Strings, Return Index
469 def : WriteRes<WritePCmpEStrI, [SKXPort0,SKXPort5,SKXPort0156]> {
472 let ResourceCycles = [4,3,1];
474 def : WriteRes<WritePCmpEStrILd, [SKXPort0, SKXPort5, SKXPort23, SKXPort0156]> {
477 let ResourceCycles = [4,3,1,1];
480 // MOVMSK Instructions.
481 def : WriteRes<WriteFMOVMSK, [SKXPort0]> { let Latency = 2; }
482 def : WriteRes<WriteVecMOVMSK, [SKXPort0]> { let Latency = 2; }
483 def : WriteRes<WriteVecMOVMSKY, [SKXPort0]> { let Latency = 2; }
484 def : WriteRes<WriteMMXMOVMSK, [SKXPort0]> { let Latency = 2; }
487 def : WriteRes<WriteAESDecEnc, [SKXPort0]> { // Decryption, encryption.
490 let ResourceCycles = [1];
492 def : WriteRes<WriteAESDecEncLd, [SKXPort0, SKXPort23]> {
495 let ResourceCycles = [1,1];
498 def : WriteRes<WriteAESIMC, [SKXPort0]> { // InvMixColumn.
501 let ResourceCycles = [2];
503 def : WriteRes<WriteAESIMCLd, [SKXPort0, SKXPort23]> {
506 let ResourceCycles = [2,1];
509 def : WriteRes<WriteAESKeyGen, [SKXPort0,SKXPort5,SKXPort015]> { // Key Generation.
511 let NumMicroOps = 11;
512 let ResourceCycles = [3,6,2];
514 def : WriteRes<WriteAESKeyGenLd, [SKXPort0,SKXPort5,SKXPort23,SKXPort015]> {
516 let NumMicroOps = 11;
517 let ResourceCycles = [3,6,1,1];
520 // Carry-less multiplication instructions.
521 def : WriteRes<WriteCLMul, [SKXPort5]> {
524 let ResourceCycles = [1];
526 def : WriteRes<WriteCLMulLd, [SKXPort5, SKXPort23]> {
529 let ResourceCycles = [1,1];
532 // Catch-all for expensive system instructions.
533 def : WriteRes<WriteSystem, [SKXPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
536 defm : SKXWriteResPair<WriteFShuffle256, [SKXPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
537 defm : SKXWriteResPair<WriteFVarShuffle256, [SKXPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
538 defm : SKXWriteResPair<WriteShuffle256, [SKXPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
539 defm : SKXWriteResPair<WriteVarShuffle256, [SKXPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
541 // Old microcoded instructions that nobody use.
542 def : WriteRes<WriteMicrocoded, [SKXPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
544 // Fence instructions.
545 def : WriteRes<WriteFence, [SKXPort23, SKXPort4]>;
548 def : WriteRes<WriteLDMXCSR, [SKXPort0,SKXPort23,SKXPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
549 def : WriteRes<WriteSTMXCSR, [SKXPort4,SKXPort5,SKXPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
551 // Nop, not very useful expect it provides a model for nops!
552 def : WriteRes<WriteNop, []>;
554 ////////////////////////////////////////////////////////////////////////////////
555 // Horizontal add/sub instructions.
556 ////////////////////////////////////////////////////////////////////////////////
558 defm : SKXWriteResPair<WriteFHAdd, [SKXPort5,SKXPort015], 6, [2,1], 3, 6>;
559 defm : SKXWriteResPair<WriteFHAddY, [SKXPort5,SKXPort015], 6, [2,1], 3, 7>;
560 defm : SKXWriteResPair<WritePHAdd, [SKXPort5,SKXPort05], 3, [2,1], 3, 5>;
561 defm : SKXWriteResPair<WritePHAddX, [SKXPort5,SKXPort015], 3, [2,1], 3, 6>;
562 defm : SKXWriteResPair<WritePHAddY, [SKXPort5,SKXPort015], 3, [2,1], 3, 7>;
566 def SKXWriteResGroup1 : SchedWriteRes<[SKXPort0]> {
569 let ResourceCycles = [1];
571 def: InstRW<[SKXWriteResGroup1], (instregex "KAND(B|D|Q|W)rr",
579 "MMX_PADDUS(B|W)irr",
581 "MMX_PCMPEQ(B|D|W)irr",
582 "MMX_PCMPGT(B|D|W)irr",
583 "MMX_P(MAX|MIN)SWirr",
584 "MMX_P(MAX|MIN)UBirr",
586 "MMX_PSUBUS(B|W)irr",
587 "VPMOVB2M(Z|Z128|Z256)rr",
588 "VPMOVD2M(Z|Z128|Z256)rr",
589 "VPMOVQ2M(Z|Z128|Z256)rr",
590 "VPMOVW2M(Z|Z128|Z256)rr")>;
592 def SKXWriteResGroup3 : SchedWriteRes<[SKXPort5]> {
595 let ResourceCycles = [1];
597 def: InstRW<[SKXWriteResGroup3], (instregex "COM(P?)_FST0r",
601 def SKXWriteResGroup4 : SchedWriteRes<[SKXPort6]> {
604 let ResourceCycles = [1];
606 def: InstRW<[SKXWriteResGroup4], (instregex "JMP(16|32|64)r")>;
608 def SKXWriteResGroup6 : SchedWriteRes<[SKXPort05]> {
611 let ResourceCycles = [1];
613 def: InstRW<[SKXWriteResGroup6], (instrs FINCSTP, FNOP)>;
615 def SKXWriteResGroup7 : SchedWriteRes<[SKXPort06]> {
618 let ResourceCycles = [1];
620 def: InstRW<[SKXWriteResGroup7], (instrs CDQ, CQO, CLAC, STAC)>;
621 def: InstRW<[SKXWriteResGroup7], (instregex "BT(16|32|64)ri8",
630 def SKXWriteResGroup8 : SchedWriteRes<[SKXPort15]> {
633 let ResourceCycles = [1];
635 def: InstRW<[SKXWriteResGroup8], (instregex "ANDN(32|64)rr",
640 def SKXWriteResGroup9 : SchedWriteRes<[SKXPort015]> {
643 let ResourceCycles = [1];
645 def: InstRW<[SKXWriteResGroup9], (instregex "VBLENDMPD(Z128|Z256)rr",
646 "VBLENDMPS(Z128|Z256)rr",
647 "VPADD(B|D|Q|W)(Y|Z|Z128|Z256)rr",
648 "(V?)PADD(B|D|Q|W)rr",
650 "VPBLENDMB(Z128|Z256)rr",
651 "VPBLENDMD(Z128|Z256)rr",
652 "VPBLENDMQ(Z128|Z256)rr",
653 "VPBLENDMW(Z128|Z256)rr",
654 "VPSUB(B|D|Q|W)(Y|Z|Z128|Z256)rr",
655 "(V?)PSUB(B|D|Q|W)rr",
656 "VPTERNLOGD(Z|Z128|Z256)rri",
657 "VPTERNLOGQ(Z|Z128|Z256)rri")>;
659 def SKXWriteResGroup10 : SchedWriteRes<[SKXPort0156]> {
662 let ResourceCycles = [1];
664 def: InstRW<[SKXWriteResGroup10], (instrs CBW, CWDE, CDQE,
666 def: InstRW<[SKXWriteResGroup10], (instregex "SGDT64m",
672 def SKXWriteResGroup11 : SchedWriteRes<[SKXPort4,SKXPort237]> {
675 let ResourceCycles = [1,1];
677 def: InstRW<[SKXWriteResGroup11], (instregex "FBSTPm",
682 def SKXWriteResGroup13 : SchedWriteRes<[SKXPort5]> {
685 let ResourceCycles = [2];
687 def: InstRW<[SKXWriteResGroup13], (instregex "MMX_MOVQ2DQrr")>;
689 def SKXWriteResGroup14 : SchedWriteRes<[SKXPort05]> {
692 let ResourceCycles = [2];
694 def: InstRW<[SKXWriteResGroup14], (instrs FDECSTP)>;
695 def: InstRW<[SKXWriteResGroup14], (instregex "MMX_MOVDQ2Qrr")>;
697 def SKXWriteResGroup15 : SchedWriteRes<[SKXPort06]> {
700 let ResourceCycles = [2];
702 def: InstRW<[SKXWriteResGroup15], (instregex "ROL(8|16|32|64)r1",
708 def SKXWriteResGroup17 : SchedWriteRes<[SKXPort0156]> {
711 let ResourceCycles = [2];
713 def: InstRW<[SKXWriteResGroup17], (instrs LFENCE,
717 def SKXWriteResGroup20 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
720 let ResourceCycles = [1,1];
722 def: InstRW<[SKXWriteResGroup20], (instregex "CLFLUSH")>;
724 def SKXWriteResGroup21 : SchedWriteRes<[SKXPort237,SKXPort0156]> {
727 let ResourceCycles = [1,1];
729 def: InstRW<[SKXWriteResGroup21], (instrs SFENCE)>;
731 def SKXWriteResGroup23 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
734 let ResourceCycles = [1,1];
736 def: InstRW<[SKXWriteResGroup23], (instrs CWD)>;
737 def: InstRW<[SKXWriteResGroup23], (instrs JCXZ, JECXZ, JRCXZ)>;
738 def: InstRW<[SKXWriteResGroup23], (instregex "ADC8i8",
743 def SKXWriteResGroup25 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort237]> {
746 let ResourceCycles = [1,1,1];
748 def: InstRW<[SKXWriteResGroup25], (instrs FNSTCW16m)>;
750 def SKXWriteResGroup27 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort15]> {
753 let ResourceCycles = [1,1,1];
755 def: InstRW<[SKXWriteResGroup27], (instregex "MOVBE(16|32|64)mr")>;
757 def SKXWriteResGroup28 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort0156]> {
760 let ResourceCycles = [1,1,1];
762 def: InstRW<[SKXWriteResGroup28], (instrs PUSH16r, PUSH32r, PUSH64r,
763 STOSB, STOSL, STOSQ, STOSW)>;
764 def: InstRW<[SKXWriteResGroup28], (instregex "PUSH(16|32|64)rmr",
767 def SKXWriteResGroup29 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort15]> {
770 let ResourceCycles = [2,2,1];
772 def: InstRW<[SKXWriteResGroup29], (instregex "VMOVDQU8Zmr(b?)")>;
774 def SKXWriteResGroup30 : SchedWriteRes<[SKXPort0]> {
777 let ResourceCycles = [1];
779 def: InstRW<[SKXWriteResGroup30], (instregex "KMOV(B|D|Q|W)rk",
780 "KORTEST(B|D|Q|W)rr",
781 "KTEST(B|D|Q|W)rr")>;
783 def SKXWriteResGroup31 : SchedWriteRes<[SKXPort1]> {
786 let ResourceCycles = [1];
788 def: InstRW<[SKXWriteResGroup31], (instregex "PDEP(32|64)rr",
791 def SKXWriteResGroup31_16i : SchedWriteRes<[SKXPort1, SKXPort0156]> {
794 let ResourceCycles = [1,1];
796 def: InstRW<[SKXWriteResGroup31_16i], (instrs IMUL16rri, IMUL16rri8)>;
799 def SKXWriteResGroup32 : SchedWriteRes<[SKXPort5]> {
802 let ResourceCycles = [1];
804 def: InstRW<[SKXWriteResGroup32], (instregex "(ADD|SUB|SUBR)_(FPrST0|FST0r|FrST0)",
806 "KSHIFTL(B|D|Q|W)ri",
807 "KSHIFTR(B|D|Q|W)ri",
811 "VALIGND(Z|Z128|Z256)rri",
812 "VALIGNQ(Z|Z128|Z256)rri",
813 "VCMPPD(Z|Z128|Z256)rri",
814 "VCMPPS(Z|Z128|Z256)rri",
817 "VDBPSADBWZrri", // TODO: 512-bit ops require ports 0/1 to be joined.
818 "VFPCLASSPD(Z|Z128|Z256)rr",
819 "VFPCLASSPS(Z|Z128|Z256)rr",
824 "VPCMPB(Z|Z128|Z256)rri",
825 "VPCMPD(Z|Z128|Z256)rri",
826 "VPCMPEQ(B|D|Q|W)(Z|Z128|Z256)rr",
827 "VPCMPGT(B|D|Q|W)(Z|Z128|Z256)rr",
829 "VPCMPQ(Z|Z128|Z256)rri",
830 "VPCMPU(B|D|Q|W)(Z|Z128|Z256)rri",
831 "VPCMPW(Z|Z128|Z256)rri",
832 "VP(MAX|MIN)(S|U)Q(Z|Z128|Z256)rr",
833 "VPSADBWZrr", // TODO: 512-bit ops require ports 0/1 to be joined.
834 "VPTEST(N?)M(B|D|Q|W)(Z|Z128|Z256)rr")>;
836 def SKXWriteResGroup34 : SchedWriteRes<[SKXPort0,SKXPort0156]> {
839 let ResourceCycles = [1,1];
841 def: InstRW<[SKXWriteResGroup34], (instrs FNSTSW16r)>;
843 def SKXWriteResGroup35 : SchedWriteRes<[SKXPort06]> {
846 let ResourceCycles = [3];
848 def: InstRW<[SKXWriteResGroup35], (instregex "ROL(8|16|32|64)rCL",
849 "ROR(8|16|32|64)rCL",
850 "SAR(8|16|32|64)rCL",
851 "SHL(8|16|32|64)rCL",
852 "SHR(8|16|32|64)rCL")>;
854 def SKXWriteResGroup36 : SchedWriteRes<[SKXPort0156]> {
857 let ResourceCycles = [3];
859 def: InstRW<[SKXWriteResGroup36], (instrs XADD8rr, XADD16rr, XADD32rr, XADD64rr,
860 XCHG8rr, XCHG16rr, XCHG32rr, XCHG64rr,
861 XCHG16ar, XCHG32ar, XCHG64ar)>;
863 def SKXWriteResGroup37 : SchedWriteRes<[SKXPort0,SKXPort5]> {
866 let ResourceCycles = [1,2];
868 def: InstRW<[SKXWriteResGroup37], (instregex "MMX_PH(ADD|SUB)SWrr")>;
870 def SKXWriteResGroup38 : SchedWriteRes<[SKXPort5,SKXPort01]> {
873 let ResourceCycles = [2,1];
875 def: InstRW<[SKXWriteResGroup38], (instregex "(V?)PH(ADD|SUB)SW(Y?)rr")>;
877 def SKXWriteResGroup41 : SchedWriteRes<[SKXPort5,SKXPort0156]> {
880 let ResourceCycles = [2,1];
882 def: InstRW<[SKXWriteResGroup41], (instregex "MMX_PACKSSDWirr",
886 def SKXWriteResGroup42 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
889 let ResourceCycles = [1,2];
891 def: InstRW<[SKXWriteResGroup42], (instregex "CLD")>;
893 def SKXWriteResGroup43 : SchedWriteRes<[SKXPort237,SKXPort0156]> {
896 let ResourceCycles = [1,2];
898 def: InstRW<[SKXWriteResGroup43], (instrs MFENCE)>;
900 def SKXWriteResGroup44 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
903 let ResourceCycles = [1,2];
905 def: InstRW<[SKXWriteResGroup44], (instregex "RCL(8|16|32|64)r1",
908 "RCR(8|16|32|64)ri")>;
910 def SKXWriteResGroup45 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237]> {
913 let ResourceCycles = [1,1,1];
915 def: InstRW<[SKXWriteResGroup45], (instrs FNSTSWm)>;
917 def SKXWriteResGroup46 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort06]> {
920 let ResourceCycles = [1,1,2];
922 def: InstRW<[SKXWriteResGroup46], (instregex "SET(A|BE)m")>;
924 def SKXWriteResGroup47 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort237,SKXPort0156]> {
927 let ResourceCycles = [1,1,1,1];
929 def: InstRW<[SKXWriteResGroup47], (instregex "CALL(16|32|64)r")>;
931 def SKXWriteResGroup48 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort06,SKXPort0156]> {
934 let ResourceCycles = [1,1,1,1];
936 def: InstRW<[SKXWriteResGroup48], (instrs CALL64pcrel32)>;
938 def SKXWriteResGroup49 : SchedWriteRes<[SKXPort0]> {
941 let ResourceCycles = [1];
943 def: InstRW<[SKXWriteResGroup49], (instregex "MUL_(FPrST0|FST0r|FrST0)")>;
945 def SKXWriteResGroup50 : SchedWriteRes<[SKXPort01]> {
948 let ResourceCycles = [1];
950 def: InstRW<[SKXWriteResGroup50], (instregex "VCVTDQ2PS(Y|Z128|Z256)rr",
952 "VCVTPD2QQ(Z128|Z256)rr",
953 "VCVTPD2UQQ(Z128|Z256)rr",
954 "VCVTPS2DQ(Y|Z128|Z256)rr",
956 "VCVTPS2UDQ(Z128|Z256)rr",
957 "VCVTQQ2PD(Z128|Z256)rr",
958 "VCVTTPD2QQ(Z128|Z256)rr",
959 "VCVTTPD2UQQ(Z128|Z256)rr",
960 "VCVTTPS2DQ(Z128|Z256)rr",
962 "VCVTTPS2UDQ(Z128|Z256)rr",
963 "VCVTUDQ2PS(Z128|Z256)rr",
964 "VCVTUQQ2PD(Z128|Z256)rr")>;
966 def SKXWriteResGroup50z : SchedWriteRes<[SKXPort05]> {
969 let ResourceCycles = [1];
971 def: InstRW<[SKXWriteResGroup50z], (instrs VCVTDQ2PSZrr,
984 def SKXWriteResGroup51 : SchedWriteRes<[SKXPort5]> {
987 let ResourceCycles = [2];
989 def: InstRW<[SKXWriteResGroup51], (instregex "VEXPANDPD(Z|Z128|Z256)rr",
990 "VEXPANDPS(Z|Z128|Z256)rr",
991 "VPEXPANDD(Z|Z128|Z256)rr",
992 "VPEXPANDQ(Z|Z128|Z256)rr",
993 "VPMOVDB(Z|Z128|Z256)rr",
994 "VPMOVDW(Z|Z128|Z256)rr",
995 "VPMOVQB(Z|Z128|Z256)rr",
996 "VPMOVQW(Z|Z128|Z256)rr",
997 "VPMOVSDB(Z|Z128|Z256)rr",
998 "VPMOVSDW(Z|Z128|Z256)rr",
999 "VPMOVSQB(Z|Z128|Z256)rr",
1000 "VPMOVSQD(Z|Z128|Z256)rr",
1001 "VPMOVSQW(Z|Z128|Z256)rr",
1002 "VPMOVSWB(Z|Z128|Z256)rr",
1003 "VPMOVUSDB(Z|Z128|Z256)rr",
1004 "VPMOVUSDW(Z|Z128|Z256)rr",
1005 "VPMOVUSQB(Z|Z128|Z256)rr",
1006 "VPMOVUSQD(Z|Z128|Z256)rr",
1007 "VPMOVUSWB(Z|Z128|Z256)rr",
1008 "VPMOVWB(Z|Z128|Z256)rr")>;
1010 def SKXWriteResGroup52 : SchedWriteRes<[SKXPort1,SKXPort5]> {
1012 let NumMicroOps = 2;
1013 let ResourceCycles = [1,1];
1015 def: InstRW<[SKXWriteResGroup52], (instrs IMUL64r, MUL64r, MULX64rr)>;
1017 def SKXWriteResGroup52_16 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort0156]> {
1019 let NumMicroOps = 4;
1020 let ResourceCycles = [1,1,2];
1022 def: InstRW<[SKXWriteResGroup52_16], (instrs IMUL16r, MUL16r)>;
1024 def SKXWriteResGroup54 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort237]> {
1026 let NumMicroOps = 3;
1027 let ResourceCycles = [1,1,1];
1029 def: InstRW<[SKXWriteResGroup54], (instregex "IST(T?)_FP(16|32|64)m",
1031 "VPMOVQD(Z|Z128|Z256)mr(b?)")>;
1033 def SKXWriteResGroup55 : SchedWriteRes<[SKXPort0156]> {
1035 let NumMicroOps = 4;
1036 let ResourceCycles = [4];
1038 def: InstRW<[SKXWriteResGroup55], (instrs FNCLEX)>;
1040 def SKXWriteResGroup56 : SchedWriteRes<[SKXPort015,SKXPort0156]> {
1042 let NumMicroOps = 4;
1043 let ResourceCycles = [1,3];
1045 def: InstRW<[SKXWriteResGroup56], (instrs VZEROUPPER)>;
1047 def SKXWriteResGroup57 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort0156]> {
1049 let NumMicroOps = 4;
1050 let ResourceCycles = [1,1,2];
1052 def: InstRW<[SKXWriteResGroup57], (instregex "LAR(16|32|64)rr")>;
1054 def SKXWriteResGroup58 : SchedWriteRes<[SKXPort23]> {
1056 let NumMicroOps = 1;
1057 let ResourceCycles = [1];
1059 def: InstRW<[SKXWriteResGroup58], (instregex "MOVSX(16|32|64)rm16",
1060 "MOVSX(16|32|64)rm32",
1061 "MOVSX(16|32|64)rm8",
1062 "MOVZX(16|32|64)rm16",
1063 "MOVZX(16|32|64)rm8",
1064 "(V?)MOVDDUPrm")>; // TODO: Should this be SKXWriteResGroup71?
1066 def SKXWriteResGroup61 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1068 let NumMicroOps = 2;
1069 let ResourceCycles = [1,1];
1071 def: InstRW<[SKXWriteResGroup61], (instregex "MMX_CVT(T?)PD2PIirr",
1072 "MMX_CVT(T?)PS2PIirr",
1075 "(V?)CVT(T?)PD2DQrr",
1084 "(V?)CVTSD2SS(Z?)rr",
1085 "(V?)CVTSI(64)?2SDrr",
1088 "VCVTSI(64)?2SDZrr",
1092 "VCVTTPD2UDQZ128rr",
1094 "VCVTTPS2UQQZ128rr",
1098 "VCVTUSI(64)?2SDZrr")>;
1100 def SKXWriteResGroup62 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1102 let NumMicroOps = 3;
1103 let ResourceCycles = [2,1];
1105 def: InstRW<[SKXWriteResGroup62], (instregex "VPCONFLICTQZ128rr")>;
1107 def SKXWriteResGroup63 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort06]> {
1109 let NumMicroOps = 3;
1110 let ResourceCycles = [1,1,1];
1112 def: InstRW<[SKXWriteResGroup63], (instregex "STR(16|32|64)r")>;
1114 def SKXWriteResGroup64 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort0156]> {
1116 let NumMicroOps = 3;
1117 let ResourceCycles = [1,1,1];
1119 def: InstRW<[SKXWriteResGroup64], (instrs IMUL32r, MUL32r, MULX32rr)>;
1121 def SKXWriteResGroup65 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort015]> {
1123 let NumMicroOps = 3;
1124 let ResourceCycles = [1,1,1];
1126 def: InstRW<[SKXWriteResGroup65], (instregex "VCVTPS2PHZ128mr(b?)",
1127 "VCVTPS2PHZ256mr(b?)",
1128 "VCVTPS2PHZmr(b?)")>;
1130 def SKXWriteResGroup66 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort237]> {
1132 let NumMicroOps = 4;
1133 let ResourceCycles = [1,2,1];
1135 def: InstRW<[SKXWriteResGroup66], (instregex "VPMOVDB(Z|Z128|Z256)mr(b?)",
1136 "VPMOVDW(Z|Z128|Z256)mr(b?)",
1137 "VPMOVQB(Z|Z128|Z256)mr(b?)",
1138 "VPMOVQW(Z|Z128|Z256)mr(b?)",
1139 "VPMOVSDB(Z|Z128|Z256)mr(b?)",
1140 "VPMOVSDW(Z|Z128|Z256)mr(b?)",
1141 "VPMOVSQB(Z|Z128|Z256)mr(b?)",
1142 "VPMOVSQD(Z|Z128|Z256)mr(b?)",
1143 "VPMOVSQW(Z|Z128|Z256)mr(b?)",
1144 "VPMOVSWB(Z|Z128|Z256)mr(b?)",
1145 "VPMOVUSDB(Z|Z128|Z256)mr(b?)",
1146 "VPMOVUSDW(Z|Z128|Z256)mr(b?)",
1147 "VPMOVUSQB(Z|Z128|Z256)mr(b?)",
1148 "VPMOVUSQD(Z|Z128|Z256)mr(b?)",
1149 "VPMOVUSQW(Z|Z128|Z256)mr(b?)",
1150 "VPMOVUSWB(Z|Z128|Z256)mr(b?)",
1151 "VPMOVWB(Z|Z128|Z256)mr(b?)")>;
1153 def SKXWriteResGroup67 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
1155 let NumMicroOps = 5;
1156 let ResourceCycles = [1,4];
1158 def: InstRW<[SKXWriteResGroup67], (instrs XSETBV)>;
1160 def SKXWriteResGroup68 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
1162 let NumMicroOps = 5;
1163 let ResourceCycles = [2,3];
1165 def: InstRW<[SKXWriteResGroup68], (instregex "CMPXCHG(8|16|32|64)rr")>;
1167 def SKXWriteResGroup69 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort0156]> {
1169 let NumMicroOps = 6;
1170 let ResourceCycles = [1,1,4];
1172 def: InstRW<[SKXWriteResGroup69], (instregex "PUSHF(16|64)")>;
1174 def SKXWriteResGroup71 : SchedWriteRes<[SKXPort23]> {
1176 let NumMicroOps = 1;
1177 let ResourceCycles = [1];
1179 def: InstRW<[SKXWriteResGroup71], (instregex "VBROADCASTSSrm",
1185 def SKXWriteResGroup72 : SchedWriteRes<[SKXPort5]> {
1187 let NumMicroOps = 2;
1188 let ResourceCycles = [2];
1190 def: InstRW<[SKXWriteResGroup72], (instregex "MMX_CVTPI2PSirr",
1191 "VCOMPRESSPD(Z|Z128|Z256)rr",
1192 "VCOMPRESSPS(Z|Z128|Z256)rr",
1193 "VPCOMPRESSD(Z|Z128|Z256)rr",
1194 "VPCOMPRESSQ(Z|Z128|Z256)rr",
1195 "VPERMW(Z|Z128|Z256)rr")>;
1197 def SKXWriteResGroup73 : SchedWriteRes<[SKXPort0,SKXPort23]> {
1199 let NumMicroOps = 2;
1200 let ResourceCycles = [1,1];
1202 def: InstRW<[SKXWriteResGroup73], (instregex "MMX_PADDSBirm",
1223 def SKXWriteResGroup76 : SchedWriteRes<[SKXPort6,SKXPort23]> {
1225 let NumMicroOps = 2;
1226 let ResourceCycles = [1,1];
1228 def: InstRW<[SKXWriteResGroup76], (instregex "FARJMP64",
1231 def SKXWriteResGroup78 : SchedWriteRes<[SKXPort23,SKXPort06]> {
1233 let NumMicroOps = 2;
1234 let ResourceCycles = [1,1];
1236 def: InstRW<[SKXWriteResGroup78], (instregex "BT(16|32|64)mi8")>;
1238 def SKXWriteResGroup79 : SchedWriteRes<[SKXPort23,SKXPort15]> {
1240 let NumMicroOps = 2;
1241 let ResourceCycles = [1,1];
1243 def: InstRW<[SKXWriteResGroup79], (instregex "ANDN(32|64)rm",
1247 "MOVBE(16|32|64)rm")>;
1249 def SKXWriteResGroup80 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1251 let NumMicroOps = 2;
1252 let ResourceCycles = [1,1];
1254 def: InstRW<[SKXWriteResGroup80], (instregex "VMOV(64to|QI2)PQIZrm(b?)",
1255 "VMOVDI2PDIZrm(b?)")>;
1257 def SKXWriteResGroup81 : SchedWriteRes<[SKXPort23,SKXPort0156]> {
1259 let NumMicroOps = 2;
1260 let ResourceCycles = [1,1];
1262 def: InstRW<[SKXWriteResGroup81], (instrs POP16r, POP32r, POP64r)>;
1263 def: InstRW<[SKXWriteResGroup81], (instregex "POP(16|32|64)rmr")>;
1265 def SKXWriteResGroup82 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1267 let NumMicroOps = 3;
1268 let ResourceCycles = [2,1];
1270 def: InstRW<[SKXWriteResGroup82], (instregex "(V?)CVTSI642SSrr",
1272 "VCVTUSI642SSZrr")>;
1274 def SKXWriteResGroup84 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort06,SKXPort0156]> {
1276 let NumMicroOps = 4;
1277 let ResourceCycles = [1,1,1,1];
1279 def: InstRW<[SKXWriteResGroup84], (instregex "SLDT(16|32|64)r")>;
1281 def SKXWriteResGroup86 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06]> {
1283 let NumMicroOps = 4;
1284 let ResourceCycles = [1,1,1,1];
1286 def: InstRW<[SKXWriteResGroup86], (instregex "BTC(16|32|64)mi8",
1289 "SAR(8|16|32|64)m1",
1290 "SAR(8|16|32|64)mi",
1291 "SHL(8|16|32|64)m1",
1292 "SHL(8|16|32|64)mi",
1293 "SHR(8|16|32|64)m1",
1294 "SHR(8|16|32|64)mi")>;
1296 def SKXWriteResGroup87 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort0156]> {
1298 let NumMicroOps = 4;
1299 let ResourceCycles = [1,1,1,1];
1301 def: InstRW<[SKXWriteResGroup87], (instregex "POP(16|32|64)rmm",
1302 "PUSH(16|32|64)rmm")>;
1304 def SKXWriteResGroup88 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
1306 let NumMicroOps = 6;
1307 let ResourceCycles = [1,5];
1309 def: InstRW<[SKXWriteResGroup88], (instrs STD)>;
1311 def SKXWriteResGroup89 : SchedWriteRes<[SKXPort23]> {
1313 let NumMicroOps = 1;
1314 let ResourceCycles = [1];
1316 def: InstRW<[SKXWriteResGroup89], (instregex "LD_F(32|64|80)m",
1325 "VPBROADCASTQYrm")>;
1327 def SKXWriteResGroup90 : SchedWriteRes<[SKXPort01,SKXPort5]> {
1329 let NumMicroOps = 2;
1330 let ResourceCycles = [1,1];
1332 def: InstRW<[SKXWriteResGroup90], (instregex "VCVTDQ2PDYrr")>;
1334 def SKXWriteResGroup92 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1336 let NumMicroOps = 2;
1337 let ResourceCycles = [1,1];
1339 def: InstRW<[SKXWriteResGroup92], (instregex "VMOVSDZrm(b?)",
1342 def SKXWriteResGroup92a : SchedWriteRes<[SKXPort5,SKXPort23]> {
1344 let NumMicroOps = 2;
1345 let ResourceCycles = [1,1];
1347 def: InstRW<[SKXWriteResGroup92a], (instregex "(V?)PMOV(SX|ZX)BDrm",
1348 "(V?)PMOV(SX|ZX)BQrm",
1349 "(V?)PMOV(SX|ZX)BWrm",
1350 "(V?)PMOV(SX|ZX)DQrm",
1351 "(V?)PMOV(SX|ZX)WDrm",
1352 "(V?)PMOV(SX|ZX)WQrm")>;
1354 def SKXWriteResGroup93 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1356 let NumMicroOps = 2;
1357 let ResourceCycles = [1,1];
1359 def: InstRW<[SKXWriteResGroup93], (instregex "VCVTDQ2PDZ256rr",
1360 "VCVTPD2DQ(Y|Z256)rr",
1361 "VCVTPD2PS(Y|Z256)rr",
1363 "VCVTPS2PD(Y|Z256)rr",
1367 "VCVTTPD2DQ(Y|Z256)rr",
1368 "VCVTTPD2UDQZ256rr",
1370 "VCVTTPS2UQQZ256rr",
1372 "VCVTUQQ2PSZ256rr")>;
1374 def SKXWriteResGroup93z : SchedWriteRes<[SKXPort5,SKXPort05]> {
1376 let NumMicroOps = 2;
1377 let ResourceCycles = [1,1];
1379 def: InstRW<[SKXWriteResGroup93z], (instrs VCVTDQ2PDZrr,
1394 def SKXWriteResGroup95 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1396 let NumMicroOps = 2;
1397 let ResourceCycles = [1,1];
1399 def: InstRW<[SKXWriteResGroup95], (instregex "VBLENDMPDZ128rm(b?)",
1400 "VBLENDMPSZ128rm(b?)",
1401 "VBROADCASTI32X2Z128m(b?)",
1402 "VBROADCASTSSZ128m(b?)",
1405 "VMOVAPDZ128rm(b?)",
1406 "VMOVAPSZ128rm(b?)",
1407 "VMOVDDUPZ128rm(b?)",
1408 "VMOVDQA32Z128rm(b?)",
1409 "VMOVDQA64Z128rm(b?)",
1410 "VMOVDQU16Z128rm(b?)",
1411 "VMOVDQU32Z128rm(b?)",
1412 "VMOVDQU64Z128rm(b?)",
1413 "VMOVDQU8Z128rm(b?)",
1414 "VMOVNTDQAZ128rm(b?)",
1415 "VMOVSHDUPZ128rm(b?)",
1416 "VMOVSLDUPZ128rm(b?)",
1417 "VMOVUPDZ128rm(b?)",
1418 "VMOVUPSZ128rm(b?)",
1419 "VPADD(B|D|Q|W)Z128rm(b?)",
1420 "(V?)PADD(B|D|Q|W)rm",
1422 "VPBLENDM(B|D|Q|W)Z128rm(b?)",
1423 "VPBROADCASTDZ128m(b?)",
1424 "VPBROADCASTQZ128m(b?)",
1425 "VPSUB(B|D|Q|W)Z128rm(b?)",
1426 "(V?)PSUB(B|D|Q|W)rm",
1427 "VPTERNLOGDZ128rm(b?)i",
1428 "VPTERNLOGQZ128rm(b?)i")>;
1430 def SKXWriteResGroup96 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1432 let NumMicroOps = 3;
1433 let ResourceCycles = [2,1];
1435 def: InstRW<[SKXWriteResGroup96], (instregex "MMX_PACKSSDWirm",
1437 "MMX_PACKUSWBirm")>;
1439 def SKXWriteResGroup97 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1441 let NumMicroOps = 3;
1442 let ResourceCycles = [2,1];
1444 def: InstRW<[SKXWriteResGroup97], (instregex "VPERMI2W128rr",
1451 def SKXWriteResGroup99 : SchedWriteRes<[SKXPort23,SKXPort0156]> {
1453 let NumMicroOps = 3;
1454 let ResourceCycles = [1,2];
1456 def: InstRW<[SKXWriteResGroup99], (instrs LEAVE, LEAVE64,
1457 SCASB, SCASL, SCASQ, SCASW)>;
1459 def SKXWriteResGroup100 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort015]> {
1461 let NumMicroOps = 3;
1462 let ResourceCycles = [1,1,1];
1464 def: InstRW<[SKXWriteResGroup100], (instregex "VCVTSS2USI64Zrr",
1465 "(V?)CVTSS2SI64(Z?)rr",
1466 "(V?)CVTTSS2SI64(Z?)rr",
1467 "VCVTTSS2USI64Zrr")>;
1469 def SKXWriteResGroup101 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort05]> {
1471 let NumMicroOps = 3;
1472 let ResourceCycles = [1,1,1];
1474 def: InstRW<[SKXWriteResGroup101], (instrs FLDCW16m)>;
1476 def SKXWriteResGroup103 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort0156]> {
1478 let NumMicroOps = 3;
1479 let ResourceCycles = [1,1,1];
1481 def: InstRW<[SKXWriteResGroup103], (instregex "KMOV(B|D|Q|W)km")>;
1483 def SKXWriteResGroup104 : SchedWriteRes<[SKXPort6,SKXPort23,SKXPort0156]> {
1485 let NumMicroOps = 3;
1486 let ResourceCycles = [1,1,1];
1488 def: InstRW<[SKXWriteResGroup104], (instrs LRETQ, RETQ)>;
1490 def SKXWriteResGroup106 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort237]> {
1492 let NumMicroOps = 4;
1493 let ResourceCycles = [1,2,1];
1495 def: InstRW<[SKXWriteResGroup106], (instregex "VCOMPRESSPD(Z|Z128|Z256)mr(b?)",
1496 "VCOMPRESSPS(Z|Z128|Z256)mr(b?)",
1497 "VPCOMPRESSD(Z|Z128|Z256)mr(b?)",
1498 "VPCOMPRESSQ(Z|Z128|Z256)mr(b?)")>;
1500 def SKXWriteResGroup107 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06]> {
1502 let NumMicroOps = 5;
1503 let ResourceCycles = [1,1,1,2];
1505 def: InstRW<[SKXWriteResGroup107], (instregex "ROL(8|16|32|64)m1",
1506 "ROL(8|16|32|64)mi",
1507 "ROR(8|16|32|64)m1",
1508 "ROR(8|16|32|64)mi")>;
1510 def SKXWriteResGroup108 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort0156]> {
1512 let NumMicroOps = 5;
1513 let ResourceCycles = [1,1,1,2];
1515 def: InstRW<[SKXWriteResGroup108], (instregex "XADD(8|16|32|64)rm")>;
1517 def SKXWriteResGroup109 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort0156]> {
1519 let NumMicroOps = 5;
1520 let ResourceCycles = [1,1,1,1,1];
1522 def: InstRW<[SKXWriteResGroup109], (instregex "CALL(16|32|64)m",
1525 def SKXWriteResGroup110 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237,SKXPort0156]> {
1527 let NumMicroOps = 7;
1528 let ResourceCycles = [1,2,2,2];
1530 def: InstRW<[SKXWriteResGroup110], (instrs VPSCATTERDQZ128mr,
1533 VSCATTERQPDZ128mr)>;
1535 def SKXWriteResGroup111 : SchedWriteRes<[SKXPort6,SKXPort06,SKXPort15,SKXPort0156]> {
1537 let NumMicroOps = 7;
1538 let ResourceCycles = [1,3,1,2];
1540 def: InstRW<[SKXWriteResGroup111], (instrs LOOP)>;
1542 def SKXWriteResGroup112 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237,SKXPort0156]> {
1544 let NumMicroOps = 11;
1545 let ResourceCycles = [1,4,4,2];
1547 def: InstRW<[SKXWriteResGroup112], (instrs VPSCATTERDQZ256mr,
1550 VSCATTERQPDZ256mr)>;
1552 def SKXWriteResGroup113 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237,SKXPort0156]> {
1554 let NumMicroOps = 19;
1555 let ResourceCycles = [1,8,8,2];
1557 def: InstRW<[SKXWriteResGroup113], (instrs VPSCATTERDQZmr,
1562 def SKXWriteResGroup114 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1564 let NumMicroOps = 36;
1565 let ResourceCycles = [1,16,1,16,2];
1567 def: InstRW<[SKXWriteResGroup114], (instrs VSCATTERDPSZmr)>;
1569 def SKXWriteResGroup118 : SchedWriteRes<[SKXPort1,SKXPort23]> {
1571 let NumMicroOps = 2;
1572 let ResourceCycles = [1,1];
1574 def: InstRW<[SKXWriteResGroup118], (instregex "PDEP(32|64)rm",
1577 def SKXWriteResGroup118_16_1 : SchedWriteRes<[SKXPort1, SKXPort0156, SKXPort23]> {
1579 let NumMicroOps = 3;
1580 let ResourceCycles = [1,1,1];
1582 def: InstRW<[SKXWriteResGroup118_16_1], (instrs IMUL16rm, IMUL16rmi, IMUL16rmi8)>;
1584 def SKXWriteResGroup118_16_2 : SchedWriteRes<[SKXPort1, SKXPort06, SKXPort0156, SKXPort23]> {
1586 let NumMicroOps = 5;
1587 let ResourceCycles = [1,1,2,1];
1589 def: InstRW<[SKXWriteResGroup118_16_2], (instrs IMUL16m, MUL16m)>;
1591 def SKXWriteResGroup119 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1593 let NumMicroOps = 2;
1594 let ResourceCycles = [1,1];
1596 def: InstRW<[SKXWriteResGroup119], (instregex "FCOM(P?)(32|64)m",
1597 "VFPCLASSSDZrm(b?)",
1599 "VPBROADCASTB(Z|Z256)m(b?)",
1601 "VPBROADCASTW(Z|Z256)m(b?)",
1606 def SKXWriteResGroup121 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1608 let NumMicroOps = 2;
1609 let ResourceCycles = [1,1];
1611 def: InstRW<[SKXWriteResGroup121], (instregex "VBLENDMPD(Z|Z256)rm(b?)",
1612 "VBLENDMPS(Z|Z256)rm(b?)",
1613 "VBROADCASTF32X2Z256m(b?)",
1614 "VBROADCASTF32X2Zm(b?)",
1615 "VBROADCASTF32X4Z256rm(b?)",
1616 "VBROADCASTF32X4rm(b?)",
1617 "VBROADCASTF32X8rm(b?)",
1618 "VBROADCASTF64X2Z128rm(b?)",
1619 "VBROADCASTF64X2rm(b?)",
1620 "VBROADCASTF64X4rm(b?)",
1621 "VBROADCASTI32X2Z256m(b?)",
1622 "VBROADCASTI32X2Zm(b?)",
1623 "VBROADCASTI32X4Z256rm(b?)",
1624 "VBROADCASTI32X4rm(b?)",
1625 "VBROADCASTI32X8rm(b?)",
1626 "VBROADCASTI64X2Z128rm(b?)",
1627 "VBROADCASTI64X2rm(b?)",
1628 "VBROADCASTI64X4rm(b?)",
1629 "VBROADCASTSD(Z|Z256)m(b?)",
1630 "VBROADCASTSS(Z|Z256)m(b?)",
1631 "VINSERTF32x4(Z|Z256)rm(b?)",
1632 "VINSERTF32x8Zrm(b?)",
1633 "VINSERTF64x2(Z|Z256)rm(b?)",
1634 "VINSERTF64x4Zrm(b?)",
1635 "VINSERTI32x4(Z|Z256)rm(b?)",
1636 "VINSERTI32x8Zrm(b?)",
1637 "VINSERTI64x2(Z|Z256)rm(b?)",
1638 "VINSERTI64x4Zrm(b?)",
1639 "VMOVAPD(Z|Z256)rm(b?)",
1640 "VMOVAPS(Z|Z256)rm(b?)",
1641 "VMOVDDUP(Z|Z256)rm(b?)",
1642 "VMOVDQA32(Z|Z256)rm(b?)",
1643 "VMOVDQA64(Z|Z256)rm(b?)",
1644 "VMOVDQU16(Z|Z256)rm(b?)",
1645 "VMOVDQU32(Z|Z256)rm(b?)",
1646 "VMOVDQU64(Z|Z256)rm(b?)",
1647 "VMOVDQU8(Z|Z256)rm(b?)",
1648 "VMOVNTDQAZ256rm(b?)",
1649 "VMOVSHDUP(Z|Z256)rm(b?)",
1650 "VMOVSLDUP(Z|Z256)rm(b?)",
1651 "VMOVUPD(Z|Z256)rm(b?)",
1652 "VMOVUPS(Z|Z256)rm(b?)",
1653 "VPADD(B|D|Q|W)Yrm",
1654 "VPADD(B|D|Q|W)(Z|Z256)rm(b?)",
1656 "VPBLENDM(B|D|Q|W)(Z|Z256)rm(b?)",
1657 "VPBROADCASTD(Z|Z256)m(b?)",
1658 "VPBROADCASTQ(Z|Z256)m(b?)",
1659 "VPSUB(B|D|Q|W)Yrm",
1660 "VPSUB(B|D|Q|W)(Z|Z256)rm(b?)",
1661 "VPTERNLOGD(Z|Z256)rm(b?)i",
1662 "VPTERNLOGQ(Z|Z256)rm(b?)i")>;
1664 def SKXWriteResGroup123 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
1666 let NumMicroOps = 4;
1667 let ResourceCycles = [1,2,1];
1669 def: InstRW<[SKXWriteResGroup123], (instregex "MMX_PH(ADD|SUB)SWrm")>;
1671 def SKXWriteResGroup126 : SchedWriteRes<[SKXPort23,SKXPort237,SKXPort06]> {
1673 let NumMicroOps = 5;
1674 let ResourceCycles = [1,1,3];
1676 def: InstRW<[SKXWriteResGroup126], (instregex "ROR(8|16|32|64)mCL")>;
1678 def SKXWriteResGroup127 : SchedWriteRes<[SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
1680 let NumMicroOps = 5;
1681 let ResourceCycles = [1,1,1,2];
1683 def: InstRW<[SKXWriteResGroup127], (instregex "RCL(8|16|32|64)m1",
1684 "RCL(8|16|32|64)mi",
1685 "RCR(8|16|32|64)m1",
1686 "RCR(8|16|32|64)mi")>;
1688 def SKXWriteResGroup128 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06]> {
1690 let NumMicroOps = 6;
1691 let ResourceCycles = [1,1,1,3];
1693 def: InstRW<[SKXWriteResGroup128], (instregex "ROL(8|16|32|64)mCL",
1694 "SAR(8|16|32|64)mCL",
1695 "SHL(8|16|32|64)mCL",
1696 "SHR(8|16|32|64)mCL")>;
1698 def SKXWriteResGroup130 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
1700 let NumMicroOps = 6;
1701 let ResourceCycles = [1,1,1,2,1];
1703 def: SchedAlias<WriteADCRMW, SKXWriteResGroup130>;
1704 def: InstRW<[SKXWriteResGroup130], (instregex "CMPXCHG(8|16|32|64)rm")>;
1706 def SKXWriteResGroup131 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1708 let NumMicroOps = 8;
1709 let ResourceCycles = [1,2,1,2,2];
1711 def: InstRW<[SKXWriteResGroup131], (instrs VPSCATTERQDZ128mr,
1714 VSCATTERQPSZ256mr)>;
1716 def SKXWriteResGroup132 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1718 let NumMicroOps = 12;
1719 let ResourceCycles = [1,4,1,4,2];
1721 def: InstRW<[SKXWriteResGroup132], (instrs VPSCATTERDDZ128mr,
1722 VSCATTERDPSZ128mr)>;
1724 def SKXWriteResGroup133 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1726 let NumMicroOps = 20;
1727 let ResourceCycles = [1,8,1,8,2];
1729 def: InstRW<[SKXWriteResGroup133], (instrs VPSCATTERDDZ256mr,
1730 VSCATTERDPSZ256mr)>;
1732 def SKXWriteResGroup134 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1734 let NumMicroOps = 36;
1735 let ResourceCycles = [1,16,1,16,2];
1737 def: InstRW<[SKXWriteResGroup134], (instrs VPSCATTERDDZmr)>;
1739 def SKXWriteResGroup135 : SchedWriteRes<[SKXPort0,SKXPort23]> {
1741 let NumMicroOps = 2;
1742 let ResourceCycles = [1,1];
1744 def: InstRW<[SKXWriteResGroup135], (instregex "MMX_CVTPI2PSirm")>;
1746 def SKXWriteResGroup136 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1748 let NumMicroOps = 2;
1749 let ResourceCycles = [1,1];
1751 def: InstRW<[SKXWriteResGroup136], (instregex "VALIGNDZ128rm(b?)i",
1752 "VALIGNQZ128rm(b?)i",
1753 "VCMPPDZ128rm(b?)i",
1754 "VCMPPSZ128rm(b?)i",
1757 "VFPCLASSSSZrm(b?)",
1758 "VPCMPBZ128rmi(b?)",
1759 "VPCMPDZ128rmi(b?)",
1760 "VPCMPEQ(B|D|Q|W)Z128rm(b?)",
1761 "VPCMPGT(B|D|Q|W)Z128rm(b?)",
1763 "VPCMPQZ128rmi(b?)",
1764 "VPCMPU(B|D|Q|W)Z128rmi(b?)",
1765 "VPCMPWZ128rmi(b?)",
1766 "VPERMI2D128rm(b?)",
1767 "VPERMI2PD128rm(b?)",
1768 "VPERMI2PS128rm(b?)",
1769 "VPERMI2Q128rm(b?)",
1770 "VPERMT2D128rm(b?)",
1771 "VPERMT2PD128rm(b?)",
1772 "VPERMT2PS128rm(b?)",
1773 "VPERMT2Q128rm(b?)",
1774 "VPMAXSQZ128rm(b?)",
1775 "VPMAXUQZ128rm(b?)",
1776 "VPMINSQZ128rm(b?)",
1777 "VPMINUQZ128rm(b?)",
1778 "VPMOVSXBDZ128rm(b?)",
1779 "VPMOVSXBQZ128rm(b?)",
1781 "VPMOVSXBWZ128rm(b?)",
1783 "VPMOVSXDQZ128rm(b?)",
1785 "VPMOVSXWDZ128rm(b?)",
1786 "VPMOVSXWQZ128rm(b?)",
1787 "VPMOVZXBDZ128rm(b?)",
1788 "VPMOVZXBQZ128rm(b?)",
1789 "VPMOVZXBWZ128rm(b?)",
1790 "VPMOVZXDQZ128rm(b?)",
1792 "VPMOVZXWDZ128rm(b?)",
1793 "VPMOVZXWQZ128rm(b?)",
1794 "VPTESTMBZ128rm(b?)",
1795 "VPTESTMDZ128rm(b?)",
1796 "VPTESTMQZ128rm(b?)",
1797 "VPTESTMWZ128rm(b?)",
1798 "VPTESTNMBZ128rm(b?)",
1799 "VPTESTNMDZ128rm(b?)",
1800 "VPTESTNMQZ128rm(b?)",
1801 "VPTESTNMWZ128rm(b?)")>;
1803 def SKXWriteResGroup137 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1805 let NumMicroOps = 2;
1806 let ResourceCycles = [1,1];
1808 def: InstRW<[SKXWriteResGroup137], (instregex "MMX_CVT(T?)PS2PIirm",
1811 def SKXWriteResGroup142 : SchedWriteRes<[SKXPort1,SKXPort5,SKXPort23]> {
1813 let NumMicroOps = 3;
1814 let ResourceCycles = [1,1,1];
1816 def: InstRW<[SKXWriteResGroup142], (instrs IMUL64m, MUL64m, MULX64rm)>;
1818 def SKXWriteResGroup143 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23]> {
1820 let NumMicroOps = 4;
1821 let ResourceCycles = [2,1,1];
1823 def: InstRW<[SKXWriteResGroup143], (instregex "(V?)PHADDSWrm",
1826 def SKXWriteResGroup146 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort23,SKXPort0156]> {
1828 let NumMicroOps = 5;
1829 let ResourceCycles = [1,2,1,1];
1831 def: InstRW<[SKXWriteResGroup146], (instregex "LAR(16|32|64)rm",
1832 "LSL(16|32|64)rm")>;
1834 def SKXWriteResGroup148 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1836 let NumMicroOps = 2;
1837 let ResourceCycles = [1,1];
1839 def: InstRW<[SKXWriteResGroup148], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1841 "VALIGND(Z|Z256)rm(b?)i",
1842 "VALIGNQ(Z|Z256)rm(b?)i",
1843 "VCMPPD(Z|Z256)rm(b?)i",
1844 "VCMPPS(Z|Z256)rm(b?)i",
1845 "VPCMPB(Z|Z256)rmi(b?)",
1846 "VPCMPD(Z|Z256)rmi(b?)",
1847 "VPCMPEQB(Z|Z256)rm(b?)",
1848 "VPCMPEQD(Z|Z256)rm(b?)",
1849 "VPCMPEQQ(Z|Z256)rm(b?)",
1850 "VPCMPEQW(Z|Z256)rm(b?)",
1851 "VPCMPGTB(Z|Z256)rm(b?)",
1852 "VPCMPGTD(Z|Z256)rm(b?)",
1854 "VPCMPGTQ(Z|Z256)rm(b?)",
1855 "VPCMPGTW(Z|Z256)rm(b?)",
1856 "VPCMPQ(Z|Z256)rmi(b?)",
1857 "VPCMPU(B|D|Q|W)Z256rmi(b?)",
1858 "VPCMPU(B|D|Q|W)Zrmi(b?)",
1859 "VPCMPW(Z|Z256)rmi(b?)",
1860 "VPMAXSQ(Z|Z256)rm(b?)",
1861 "VPMAXUQ(Z|Z256)rm(b?)",
1862 "VPMINSQ(Z|Z256)rm(b?)",
1863 "VPMINUQ(Z|Z256)rm(b?)",
1864 "VPTESTM(B|D|Q|W)Z256rm(b?)",
1865 "VPTESTM(B|D|Q|W)Zrm(b?)",
1866 "VPTESTNM(B|D|Q|W)Z256rm(b?)",
1867 "VPTESTNM(B|D|Q|W)Zrm(b?)")>;
1869 def SKXWriteResGroup149 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1871 let NumMicroOps = 2;
1872 let ResourceCycles = [1,1];
1874 def: InstRW<[SKXWriteResGroup149], (instregex "VCVTDQ2PDZ128rm(b?)",
1875 "VCVTDQ2PSZ128rm(b?)",
1877 "VCVTPD2QQZ128rm(b?)",
1878 "VCVTPD2UQQZ128rm(b?)",
1879 "VCVTPH2PSZ128rm(b?)",
1880 "VCVTPS2DQZ128rm(b?)",
1882 "VCVTPS2PDZ128rm(b?)",
1883 "VCVTPS2QQZ128rm(b?)",
1884 "VCVTPS2UDQZ128rm(b?)",
1885 "VCVTPS2UQQZ128rm(b?)",
1886 "VCVTQQ2PDZ128rm(b?)",
1887 "VCVTQQ2PSZ128rm(b?)",
1890 "VCVTTPD2QQZ128rm(b?)",
1891 "VCVTTPD2UQQZ128rm(b?)",
1892 "VCVTTPS2DQZ128rm(b?)",
1894 "VCVTTPS2QQZ128rm(b?)",
1895 "VCVTTPS2UDQZ128rm(b?)",
1896 "VCVTTPS2UQQZ128rm(b?)",
1897 "VCVTUDQ2PDZ128rm(b?)",
1898 "VCVTUDQ2PSZ128rm(b?)",
1899 "VCVTUQQ2PDZ128rm(b?)",
1900 "VCVTUQQ2PSZ128rm(b?)")>;
1902 def SKXWriteResGroup151 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1904 let NumMicroOps = 3;
1905 let ResourceCycles = [2,1];
1907 def: InstRW<[SKXWriteResGroup151], (instregex "VEXPANDPDZ128rm(b?)",
1908 "VEXPANDPSZ128rm(b?)",
1909 "VPEXPANDDZ128rm(b?)",
1910 "VPEXPANDQZ128rm(b?)")>;
1912 def SKXWriteResGroup153 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
1914 let NumMicroOps = 3;
1915 let ResourceCycles = [1,1,1];
1917 def: InstRW<[SKXWriteResGroup153], (instregex "(V?)CVTSD2SSrm")>;
1919 def SKXWriteResGroup154 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23]> {
1921 let NumMicroOps = 4;
1922 let ResourceCycles = [2,1,1];
1924 def: InstRW<[SKXWriteResGroup154], (instregex "VPHADDSWYrm",
1927 def SKXWriteResGroup156 : SchedWriteRes<[SKXPort1,SKXPort23,SKXPort06,SKXPort0156]> {
1929 let NumMicroOps = 4;
1930 let ResourceCycles = [1,1,1,1];
1932 def: InstRW<[SKXWriteResGroup156], (instrs IMUL32m, MUL32m, MULX32rm)>;
1934 def SKXWriteResGroup157 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
1936 let NumMicroOps = 8;
1937 let ResourceCycles = [1,1,1,1,1,3];
1939 def: InstRW<[SKXWriteResGroup157], (instregex "XCHG(8|16|32|64)rm")>;
1941 def SKXWriteResGroup159 : SchedWriteRes<[SKXPort0,SKXFPDivider]> {
1943 let NumMicroOps = 1;
1944 let ResourceCycles = [1,3];
1946 def : SchedAlias<WriteFDivX, SKXWriteResGroup159>; // TODO - convert to ZnWriteResFpuPair
1948 def SKXWriteResGroup160 : SchedWriteRes<[SKXPort0,SKXPort23]> {
1950 let NumMicroOps = 2;
1951 let ResourceCycles = [1,1];
1953 def: InstRW<[SKXWriteResGroup160], (instregex "MUL_F(32|64)m")>;
1955 def SKXWriteResGroup161 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1957 let NumMicroOps = 2;
1958 let ResourceCycles = [1,1];
1960 def: InstRW<[SKXWriteResGroup161], (instregex "VCVTDQ2PD(Z|Z256)rm(b?)",
1962 "VCVTDQ2PS(Z|Z256)rm(b?)",
1963 "VCVTPH2PS(Z|Z256)rm(b?)",
1965 "VCVTPS2PD(Z|Z256)rm(b?)",
1966 "VCVTQQ2PD(Z|Z256)rm(b?)",
1967 "VCVTQQ2PSZ256rm(b?)",
1968 "VCVT(T?)PD2QQ(Z|Z256)rm(b?)",
1969 "VCVT(T?)PD2UQQ(Z|Z256)rm(b?)",
1971 "VCVT(T?)PS2DQ(Z|Z256)rm(b?)",
1972 "VCVT(T?)PS2QQZ256rm(b?)",
1973 "VCVT(T?)PS2UDQ(Z|Z256)rm(b?)",
1974 "VCVT(T?)PS2UQQZ256rm(b?)",
1975 "VCVTUDQ2PD(Z|Z256)rm(b?)",
1976 "VCVTUDQ2PS(Z|Z256)rm(b?)",
1977 "VCVTUQQ2PD(Z|Z256)rm(b?)",
1978 "VCVTUQQ2PSZ256rm(b?)")>;
1980 def SKXWriteResGroup162 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1982 let NumMicroOps = 3;
1983 let ResourceCycles = [2,1];
1985 def: InstRW<[SKXWriteResGroup162], (instregex "FICOM(P?)(16|32)m",
1986 "VEXPANDPD(Z|Z256)rm(b?)",
1987 "VEXPANDPS(Z|Z256)rm(b?)",
1988 "VPEXPANDD(Z|Z256)rm(b?)",
1989 "VPEXPANDQ(Z|Z256)rm(b?)")>;
1991 def SKXWriteResGroup163 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1993 let NumMicroOps = 3;
1994 let ResourceCycles = [1,2];
1996 def: InstRW<[SKXWriteResGroup163], (instregex "VCVTSD2SSZrm")>;
1998 def SKXWriteResGroup164 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2000 let NumMicroOps = 3;
2001 let ResourceCycles = [1,1,1];
2003 def: InstRW<[SKXWriteResGroup164], (instregex "(V?)CVTDQ2PDrm")>;
2005 def SKXWriteResGroup166 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2007 let NumMicroOps = 3;
2008 let ResourceCycles = [1,1,1];
2010 def: InstRW<[SKXWriteResGroup166], (instregex "CVTPD2PSrm",
2012 "MMX_CVT(T?)PD2PIirm")>;
2014 def SKXWriteResGroup167 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2016 let NumMicroOps = 4;
2017 let ResourceCycles = [2,1,1];
2019 def: InstRW<[SKXWriteResGroup167], (instregex "VPCONFLICTQZ128rm(b?)")>;
2021 def SKXWriteResGroup169 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort0156]> {
2023 let NumMicroOps = 7;
2024 let ResourceCycles = [2,3,2];
2026 def: InstRW<[SKXWriteResGroup169], (instregex "RCL(16|32|64)rCL",
2027 "RCR(16|32|64)rCL")>;
2029 def SKXWriteResGroup170 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort15,SKXPort0156]> {
2031 let NumMicroOps = 9;
2032 let ResourceCycles = [1,5,1,2];
2034 def: InstRW<[SKXWriteResGroup170], (instregex "RCL8rCL")>;
2036 def SKXWriteResGroup171 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
2038 let NumMicroOps = 11;
2039 let ResourceCycles = [2,9];
2041 def: InstRW<[SKXWriteResGroup171], (instrs LOOPE, LOOPNE)>;
2043 def SKXWriteResGroup174 : SchedWriteRes<[SKXPort01]> {
2045 let NumMicroOps = 3;
2046 let ResourceCycles = [3];
2048 def: InstRW<[SKXWriteResGroup174], (instregex "VPMULLQ(Z128|Z256)rr")>;
2050 def SKXWriteResGroup174z : SchedWriteRes<[SKXPort05]> {
2052 let NumMicroOps = 3;
2053 let ResourceCycles = [3];
2055 def: InstRW<[SKXWriteResGroup174z], (instregex "VPMULLQZrr")>;
2057 def SKXWriteResGroup175 : SchedWriteRes<[SKXPort5,SKXPort23]> {
2059 let NumMicroOps = 3;
2060 let ResourceCycles = [2,1];
2062 def: InstRW<[SKXWriteResGroup175], (instregex "VPERMWZ128rm(b?)")>;
2064 def SKXWriteResGroup176 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015]> {
2066 let NumMicroOps = 3;
2067 let ResourceCycles = [1,1,1];
2069 def: InstRW<[SKXWriteResGroup176], (instregex "VCVT(T?)SD2USIZrm(b?)",
2070 "VCVT(T?)SS2USI64Zrm(b?)")>;
2072 def SKXWriteResGroup177 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2074 let NumMicroOps = 3;
2075 let ResourceCycles = [1,1,1];
2077 def: InstRW<[SKXWriteResGroup177], (instregex "VCVT(T?)PS2QQZrm(b?)",
2078 "VCVT(T?)PS2UQQZrm(b?)")>;
2080 def SKXWriteResGroup179 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23,SKXPort015]> {
2082 let NumMicroOps = 4;
2083 let ResourceCycles = [1,1,1,1];
2085 def: InstRW<[SKXWriteResGroup179], (instregex "CVTTSS2SI64rm")>;
2087 def SKXWriteResGroup180 : SchedWriteRes<[SKXPort5,SKXPort23]> {
2089 let NumMicroOps = 3;
2090 let ResourceCycles = [2,1];
2092 def: InstRW<[SKXWriteResGroup180], (instregex "(ADD|SUB|SUBR)_FI(16|32)m",
2096 def SKXWriteResGroup181 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2098 let NumMicroOps = 3;
2099 let ResourceCycles = [1,1,1];
2101 def: InstRW<[SKXWriteResGroup181], (instregex "VCVTDQ2PDYrm")>;
2103 def SKXWriteResGroup183 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2105 let NumMicroOps = 4;
2106 let ResourceCycles = [2,1,1];
2108 def: InstRW<[SKXWriteResGroup183], (instregex "VPERMI2W128rm(b?)",
2109 "VPERMT2W128rm(b?)")>;
2111 def SKXWriteResGroup184 : SchedWriteRes<[SKXPort0,SKXFPDivider]> {
2113 let NumMicroOps = 1;
2114 let ResourceCycles = [1,3];
2116 def : SchedAlias<WriteFDiv64, SKXWriteResGroup184>; // TODO - convert to ZnWriteResFpuPair
2117 def : SchedAlias<WriteFDiv64X, SKXWriteResGroup184>; // TODO - convert to ZnWriteResFpuPair
2119 def SKXWriteResGroup184_1 : SchedWriteRes<[SKXPort0,SKXFPDivider]> {
2121 let NumMicroOps = 1;
2122 let ResourceCycles = [1,5];
2124 def : SchedAlias<WriteFDiv64Y, SKXWriteResGroup184_1>; // TODO - convert to ZnWriteResFpuPair
2126 def SKXWriteResGroup187 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2128 let NumMicroOps = 3;
2129 let ResourceCycles = [1,1,1];
2131 def: InstRW<[SKXWriteResGroup187], (instregex "MUL_FI(16|32)m")>;
2133 def SKXWriteResGroup188 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2135 let NumMicroOps = 3;
2136 let ResourceCycles = [1,1,1];
2138 def: InstRW<[SKXWriteResGroup188], (instregex "VCVTPD2DQZrm(b?)",
2140 "VCVTPD2UDQZrm(b?)",
2142 "VCVTTPD2DQZrm(b?)",
2143 "VCVTTPD2UDQZrm(b?)",
2144 "VCVTUQQ2PSZrm(b?)")>;
2146 def SKXWriteResGroup189 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2148 let NumMicroOps = 4;
2149 let ResourceCycles = [2,1,1];
2151 def: InstRW<[SKXWriteResGroup189], (instregex "VPERMI2W256rm(b?)",
2153 "VPERMT2W256rm(b?)",
2156 def SKXWriteResGroup190 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort15,SKXPort0156]> {
2158 let NumMicroOps = 10;
2159 let ResourceCycles = [2,4,1,3];
2161 def: InstRW<[SKXWriteResGroup190], (instregex "RCR8rCL")>;
2163 def SKXWriteResGroup191 : SchedWriteRes<[SKXPort0]> {
2165 let NumMicroOps = 1;
2166 let ResourceCycles = [1];
2168 def: InstRW<[SKXWriteResGroup191], (instregex "DIVR_(FPrST0|FST0r|FrST0)")>;
2170 def SKXWriteResGroup194 : SchedWriteRes<[SKXPort1,SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2172 let NumMicroOps = 8;
2173 let ResourceCycles = [1,2,2,1,2];
2175 def: InstRW<[SKXWriteResGroup194], (instregex "VPCONFLICTDZ128rm(b?)")>;
2177 def SKXWriteResGroup195 : SchedWriteRes<[SKXPort1,SKXPort23,SKXPort237,SKXPort06,SKXPort15,SKXPort0156]> {
2179 let NumMicroOps = 10;
2180 let ResourceCycles = [1,1,1,5,1,1];
2182 def: InstRW<[SKXWriteResGroup195], (instregex "RCL(8|16|32|64)mCL")>;
2184 def SKXWriteResGroup199 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06,SKXPort15,SKXPort0156]> {
2186 let NumMicroOps = 14;
2187 let ResourceCycles = [1,1,1,4,2,5];
2189 def: InstRW<[SKXWriteResGroup199], (instrs CMPXCHG8B)>;
2191 def SKXWriteResGroup200 : SchedWriteRes<[SKXPort0156]> {
2193 let NumMicroOps = 16;
2194 let ResourceCycles = [16];
2196 def: InstRW<[SKXWriteResGroup200], (instrs VZEROALL)>;
2198 def SKXWriteResGroup201 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2200 let NumMicroOps = 2;
2201 let ResourceCycles = [1,1,5];
2203 def : SchedAlias<WriteFDivXLd, SKXWriteResGroup201>; // TODO - convert to ZnWriteResFpuPair
2205 def SKXWriteResGroup202 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort05,SKXPort0156]> {
2207 let NumMicroOps = 15;
2208 let ResourceCycles = [2,1,2,4,2,4];
2210 def: InstRW<[SKXWriteResGroup202], (instrs XCH_F)>;
2212 def SKXWriteResGroup205 : SchedWriteRes<[SKXPort23,SKXPort015]> {
2214 let NumMicroOps = 4;
2215 let ResourceCycles = [1,3];
2217 def: InstRW<[SKXWriteResGroup205], (instregex "VPMULLQZ128rm(b?)")>;
2219 def SKXWriteResGroup207 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort06,SKXPort0156]> {
2221 let NumMicroOps = 8;
2222 let ResourceCycles = [1,1,1,5];
2224 def: InstRW<[SKXWriteResGroup207], (instrs CPUID, RDTSC)>;
2226 def SKXWriteResGroup208 : SchedWriteRes<[SKXPort1,SKXPort23,SKXPort237,SKXPort06,SKXPort15,SKXPort0156]> {
2228 let NumMicroOps = 11;
2229 let ResourceCycles = [2,1,1,4,1,2];
2231 def: InstRW<[SKXWriteResGroup208], (instregex "RCR(8|16|32|64)mCL")>;
2233 def SKXWriteResGroup209 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2235 let NumMicroOps = 2;
2236 let ResourceCycles = [1,1,4];
2238 def : SchedAlias<WriteFDiv64Ld, SKXWriteResGroup209>; // TODO - convert to ZnWriteResFpuPair
2240 def SKXWriteResGroup211 : SchedWriteRes<[SKXPort23,SKXPort015]> {
2242 let NumMicroOps = 4;
2243 let ResourceCycles = [1,3];
2245 def: InstRW<[SKXWriteResGroup211], (instregex "VPMULLQZ256rm(b?)",
2248 def SKXWriteResGroup214 : SchedWriteRes<[]> {
2250 let NumMicroOps = 0;
2252 def: InstRW<[SKXWriteResGroup214], (instrs VGATHERDPSZ128rm,
2256 def SKXWriteResGroup215 : SchedWriteRes<[SKXPort0]> {
2258 let NumMicroOps = 1;
2259 let ResourceCycles = [1];
2261 def: InstRW<[SKXWriteResGroup215], (instregex "DIV_(FPrST0|FST0r|FrST0)")>;
2263 def SKXWriteResGroup216 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2265 let NumMicroOps = 2;
2266 let ResourceCycles = [1,1,4];
2268 def : SchedAlias<WriteFDiv64XLd, SKXWriteResGroup216>; // TODO - convert to ZnWriteResFpuPair
2270 def SKXWriteResGroup218 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2272 let NumMicroOps = 5;
2273 let ResourceCycles = [1,2,1,1];
2275 def: InstRW<[SKXWriteResGroup218], (instrs VGATHERQPSZ128rm,
2280 def SKXWriteResGroup219 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort6,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
2282 let NumMicroOps = 8;
2283 let ResourceCycles = [1,1,1,1,1,1,2];
2285 def: InstRW<[SKXWriteResGroup219], (instrs INSB, INSL, INSW)>;
2287 def SKXWriteResGroup220 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort0156]> {
2289 let NumMicroOps = 10;
2290 let ResourceCycles = [1,2,7];
2292 def: InstRW<[SKXWriteResGroup220], (instrs MWAITrr)>;
2294 def SKXWriteResGroup222 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2296 let NumMicroOps = 2;
2297 let ResourceCycles = [1,1,8];
2299 def : SchedAlias<WriteFDiv64YLd, SKXWriteResGroup222>; // TODO - convert to ZnWriteResFpuPair
2301 def SKXWriteResGroup223 : SchedWriteRes<[SKXPort0,SKXPort23]> {
2303 let NumMicroOps = 2;
2304 let ResourceCycles = [1,1];
2306 def: InstRW<[SKXWriteResGroup223], (instregex "DIV_F(32|64)m")>;
2308 def SKXWriteResGroup224 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2310 let NumMicroOps = 5;
2311 let ResourceCycles = [1,2,1,1];
2313 def: InstRW<[SKXWriteResGroup224], (instrs VGATHERDPDZ128rm,
2318 def SKXWriteResGroup224_2 : SchedWriteRes<[SKXPort0, SKXPort23, SKXPort5, SKXPort015]> {
2320 let NumMicroOps = 5;
2321 let ResourceCycles = [1,2,1,1];
2323 def: InstRW<[SKXWriteResGroup224_2], (instrs VGATHERDPSrm,
2340 def SKXWriteResGroup224_3 : SchedWriteRes<[SKXPort0, SKXPort23, SKXPort5, SKXPort015]> {
2342 let NumMicroOps = 5;
2343 let ResourceCycles = [1,2,1,1];
2345 def: InstRW<[SKXWriteResGroup224_3], (instrs VGATHERDPSYrm,
2360 def SKXWriteResGroup225 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort015]> {
2362 let NumMicroOps = 14;
2363 let ResourceCycles = [5,5,4];
2365 def: InstRW<[SKXWriteResGroup225], (instregex "VPCONFLICTDZ128rr",
2366 "VPCONFLICTQZ256rr")>;
2368 def SKXWriteResGroup228 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
2370 let NumMicroOps = 19;
2371 let ResourceCycles = [2,1,4,1,1,4,6];
2373 def: InstRW<[SKXWriteResGroup228], (instrs CMPXCHG16B)>;
2375 def SKXWriteResGroup233 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2377 let NumMicroOps = 3;
2378 let ResourceCycles = [1,1,1];
2380 def: InstRW<[SKXWriteResGroup233], (instregex "DIV_FI(16|32)m")>;
2382 def SKXWriteResGroup234 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2384 let NumMicroOps = 5;
2385 let ResourceCycles = [1,2,1,1];
2387 def: InstRW<[SKXWriteResGroup234], (instrs VGATHERDPDZ256rm,
2393 def SKXWriteResGroup238 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2395 let NumMicroOps = 5;
2396 let ResourceCycles = [1,2,1,1];
2398 def: InstRW<[SKXWriteResGroup238], (instrs VGATHERDPDZrm,
2403 def SKXWriteResGroup239 : SchedWriteRes<[SKXPort0,SKXPort23]> {
2405 let NumMicroOps = 2;
2406 let ResourceCycles = [1,1];
2408 def: InstRW<[SKXWriteResGroup239], (instregex "DIVR_F(32|64)m")>;
2410 def SKXWriteResGroup240 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2412 let NumMicroOps = 5;
2413 let ResourceCycles = [1,2,1,1];
2415 def: InstRW<[SKXWriteResGroup240], (instrs VGATHERDPSZ256rm,
2418 def SKXWriteResGroup241 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23,SKXPort0156]> {
2420 let NumMicroOps = 8;
2421 let ResourceCycles = [2,4,1,1];
2423 def: InstRW<[SKXWriteResGroup241], (instregex "IDIV(8|16|32|64)m")>;
2425 def SKXWriteResGroup242 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2427 let NumMicroOps = 15;
2428 let ResourceCycles = [5,5,1,4];
2430 def: InstRW<[SKXWriteResGroup242], (instregex "VPCONFLICTQZ256rm(b?)")>;
2432 def SKXWriteResGroup243 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2434 let NumMicroOps = 3;
2435 let ResourceCycles = [1,1,1];
2437 def: InstRW<[SKXWriteResGroup243], (instregex "DIVR_FI(16|32)m")>;
2439 def SKXWriteResGroup245 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2441 let NumMicroOps = 5;
2442 let ResourceCycles = [1,2,1,1];
2444 def: InstRW<[SKXWriteResGroup245], (instrs VGATHERDPSZrm,
2447 def SKXWriteResGroup247 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort23,SKXPort06,SKXPort0156]> {
2449 let NumMicroOps = 23;
2450 let ResourceCycles = [1,5,3,4,10];
2452 def: InstRW<[SKXWriteResGroup247], (instregex "IN(8|16|32)ri",
2455 def SKXWriteResGroup248 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
2457 let NumMicroOps = 23;
2458 let ResourceCycles = [1,5,2,1,4,10];
2460 def: InstRW<[SKXWriteResGroup248], (instregex "OUT(8|16|32)ir",
2463 def SKXWriteResGroup249 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort015]> {
2465 let NumMicroOps = 21;
2466 let ResourceCycles = [9,7,5];
2468 def: InstRW<[SKXWriteResGroup249], (instregex "VPCONFLICTDZ256rr",
2471 def SKXWriteResGroup250 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort23,SKXPort0156]> {
2473 let NumMicroOps = 31;
2474 let ResourceCycles = [1,8,1,21];
2476 def: InstRW<[SKXWriteResGroup250], (instregex "XRSTOR(64)?")>;
2478 def SKXWriteResGroup252 : SchedWriteRes<[SKXPort1,SKXPort4,SKXPort5,SKXPort6,SKXPort23,SKXPort237,SKXPort15,SKXPort0156]> {
2480 let NumMicroOps = 18;
2481 let ResourceCycles = [1,1,2,3,1,1,1,8];
2483 def: InstRW<[SKXWriteResGroup252], (instrs VMCLEARm)>;
2485 def SKXWriteResGroup253 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort0156]> {
2487 let NumMicroOps = 39;
2488 let ResourceCycles = [1,10,1,1,26];
2490 def: InstRW<[SKXWriteResGroup253], (instrs XSAVE64)>;
2492 def SKXWriteResGroup254 : SchedWriteRes<[SKXPort5,SKXPort0156]> {
2494 let NumMicroOps = 22;
2495 let ResourceCycles = [2,20];
2497 def: InstRW<[SKXWriteResGroup254], (instrs RDTSCP)>;
2499 def SKXWriteResGroup255 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort0156]> {
2501 let NumMicroOps = 40;
2502 let ResourceCycles = [1,11,1,1,26];
2504 def: InstRW<[SKXWriteResGroup255], (instrs XSAVE)>;
2505 def: InstRW<[SKXWriteResGroup255], (instregex "XSAVEC", "XSAVES", "XSAVEOPT")>;
2507 def SKXWriteResGroup256 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2509 let NumMicroOps = 22;
2510 let ResourceCycles = [9,7,1,5];
2512 def: InstRW<[SKXWriteResGroup256], (instregex "VPCONFLICTDZ256rm(b?)",
2513 "VPCONFLICTQZrm(b?)")>;
2515 def SKXWriteResGroup258 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort05,SKXPort06,SKXPort0156]> {
2517 let NumMicroOps = 64;
2518 let ResourceCycles = [2,8,5,10,39];
2520 def: InstRW<[SKXWriteResGroup258], (instrs FLDENVm)>;
2522 def SKXWriteResGroup259 : SchedWriteRes<[SKXPort0,SKXPort6,SKXPort23,SKXPort05,SKXPort06,SKXPort15,SKXPort0156]> {
2524 let NumMicroOps = 88;
2525 let ResourceCycles = [4,4,31,1,2,1,45];
2527 def: InstRW<[SKXWriteResGroup259], (instrs FXRSTOR64)>;
2529 def SKXWriteResGroup260 : SchedWriteRes<[SKXPort0,SKXPort6,SKXPort23,SKXPort05,SKXPort06,SKXPort15,SKXPort0156]> {
2531 let NumMicroOps = 90;
2532 let ResourceCycles = [4,2,33,1,2,1,47];
2534 def: InstRW<[SKXWriteResGroup260], (instrs FXRSTOR)>;
2536 def SKXWriteResGroup261 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort015]> {
2538 let NumMicroOps = 35;
2539 let ResourceCycles = [17,11,7];
2541 def: InstRW<[SKXWriteResGroup261], (instregex "VPCONFLICTDZrr")>;
2543 def SKXWriteResGroup262 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2545 let NumMicroOps = 36;
2546 let ResourceCycles = [17,11,1,7];
2548 def: InstRW<[SKXWriteResGroup262], (instregex "VPCONFLICTDZrm(b?)")>;
2550 def SKXWriteResGroup263 : SchedWriteRes<[SKXPort5,SKXPort05,SKXPort0156]> {
2552 let NumMicroOps = 15;
2553 let ResourceCycles = [6,3,6];
2555 def: InstRW<[SKXWriteResGroup263], (instrs FNINIT)>;
2557 def SKXWriteResGroup264 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort05,SKXPort0156]> {
2559 let NumMicroOps = 32;
2560 let ResourceCycles = [7,2,8,3,1,11];
2562 def: InstRW<[SKXWriteResGroup264], (instregex "DIV(16|32|64)r")>;
2564 def SKXWriteResGroup265 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort06,SKXPort0156]> {
2566 let NumMicroOps = 66;
2567 let ResourceCycles = [4,2,4,8,14,34];
2569 def: InstRW<[SKXWriteResGroup265], (instregex "IDIV(16|32|64)r")>;
2571 def SKXWriteResGroup266 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort4,SKXPort5,SKXPort6,SKXPort237,SKXPort06,SKXPort0156]> {
2573 let NumMicroOps = 100;
2574 let ResourceCycles = [9,1,11,16,1,11,21,30];
2576 def: InstRW<[SKXWriteResGroup266], (instrs FSTENVm)>;
2578 def SKXWriteResGroup267 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
2580 let NumMicroOps = 4;
2581 let ResourceCycles = [1,3];
2583 def: InstRW<[SKXWriteResGroup267], (instrs PAUSE)>;
2585 def: InstRW<[WriteZero], (instrs CLC)>;