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>;
115 defm : X86WriteRes<WriteCMPXCHG,[SKXPort06, SKXPort0156], 5, [2,3], 5>;
116 defm : X86WriteRes<WriteCMPXCHGRMW,[SKXPort23,SKXPort06,SKXPort0156,SKXPort237,SKXPort4], 8, [1,2,1,1,1], 6>;
117 defm : X86WriteRes<WriteXCHG, [SKXPort0156], 2, [3], 3>;
119 defm : SKXWriteResPair<WriteDiv8, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
120 defm : SKXWriteResPair<WriteDiv16, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
121 defm : SKXWriteResPair<WriteDiv32, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
122 defm : SKXWriteResPair<WriteDiv64, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
123 defm : SKXWriteResPair<WriteIDiv8, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
124 defm : SKXWriteResPair<WriteIDiv16, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
125 defm : SKXWriteResPair<WriteIDiv32, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
126 defm : SKXWriteResPair<WriteIDiv64, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
128 defm : SKXWriteResPair<WriteCRC32, [SKXPort1], 3>;
130 def : WriteRes<WriteIMulH, []> { let Latency = 3; } // Integer multiplication, high part.
131 def : WriteRes<WriteLEA, [SKXPort15]>; // LEA instructions can't fold loads.
133 defm : SKXWriteResPair<WriteCMOV, [SKXPort06], 1, [1], 1>; // Conditional move.
134 defm : SKXWriteResPair<WriteCMOV2, [SKXPort06], 2, [2], 2>; // Conditional (CF + ZF flag) move.
135 defm : X86WriteRes<WriteFCMOV, [SKXPort1], 3, [1], 1>; // x87 conditional move.
136 def : WriteRes<WriteSETCC, [SKXPort06]>; // Setcc.
137 def : WriteRes<WriteSETCCStore, [SKXPort06,SKXPort4,SKXPort237]> {
141 def : WriteRes<WriteLAHFSAHF, [SKXPort06]>;
142 def : WriteRes<WriteBitTest,[SKXPort06]>; //
144 // Integer shifts and rotates.
145 defm : SKXWriteResPair<WriteShift, [SKXPort06], 1>;
148 defm : X86WriteRes<WriteSHDrri, [SKXPort1], 3, [1], 1>;
149 defm : X86WriteRes<WriteSHDrrcl,[SKXPort1,SKXPort06,SKXPort0156], 6, [1, 2, 1], 4>;
150 defm : X86WriteRes<WriteSHDmri, [SKXPort1,SKXPort23,SKXPort237,SKXPort0156], 9, [1, 1, 1, 1], 4>;
151 defm : X86WriteRes<WriteSHDmrcl,[SKXPort1,SKXPort23,SKXPort237,SKXPort06,SKXPort0156], 11, [1, 1, 1, 2, 1], 6>;
154 defm : SKXWriteResPair<WriteBSF, [SKXPort1], 3>;
155 defm : SKXWriteResPair<WriteBSR, [SKXPort1], 3>;
156 defm : SKXWriteResPair<WriteLZCNT, [SKXPort1], 3>;
157 defm : SKXWriteResPair<WriteTZCNT, [SKXPort1], 3>;
158 defm : SKXWriteResPair<WritePOPCNT, [SKXPort1], 3>;
160 // BMI1 BEXTR/BLS, BMI2 BZHI
161 defm : SKXWriteResPair<WriteBEXTR, [SKXPort06,SKXPort15], 2, [1,1], 2>;
162 defm : SKXWriteResPair<WriteBLS, [SKXPort15], 1>;
163 defm : SKXWriteResPair<WriteBZHI, [SKXPort15], 1>;
165 // Loads, stores, and moves, not folded with other operations.
166 defm : X86WriteRes<WriteLoad, [SKXPort23], 5, [1], 1>;
167 defm : X86WriteRes<WriteStore, [SKXPort237, SKXPort4], 1, [1,1], 1>;
168 defm : X86WriteRes<WriteStoreNT, [SKXPort237, SKXPort4], 1, [1,1], 2>;
169 defm : X86WriteRes<WriteMove, [SKXPort0156], 1, [1], 1>;
171 // Idioms that clear a register, like xorps %xmm0, %xmm0.
172 // These can often bypass execution ports completely.
173 def : WriteRes<WriteZero, []>;
175 // Branches don't produce values, so they have no latency, but they still
176 // consume resources. Indirect branches can fold loads.
177 defm : SKXWriteResPair<WriteJump, [SKXPort06], 1>;
179 // Floating point. This covers both scalar and vector operations.
180 defm : X86WriteRes<WriteFLD0, [SKXPort05], 1, [1], 1>;
181 defm : X86WriteRes<WriteFLD1, [SKXPort05], 1, [2], 2>;
182 defm : X86WriteRes<WriteFLDC, [SKXPort05], 1, [2], 2>;
183 defm : X86WriteRes<WriteFLoad, [SKXPort23], 5, [1], 1>;
184 defm : X86WriteRes<WriteFLoadX, [SKXPort23], 6, [1], 1>;
185 defm : X86WriteRes<WriteFLoadY, [SKXPort23], 7, [1], 1>;
186 defm : X86WriteRes<WriteFMaskedLoad, [SKXPort23,SKXPort015], 7, [1,1], 2>;
187 defm : X86WriteRes<WriteFMaskedLoadY, [SKXPort23,SKXPort015], 8, [1,1], 2>;
188 defm : X86WriteRes<WriteFStore, [SKXPort237,SKXPort4], 1, [1,1], 2>;
189 defm : X86WriteRes<WriteFStoreX, [SKXPort237,SKXPort4], 1, [1,1], 2>;
190 defm : X86WriteRes<WriteFStoreY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
191 defm : X86WriteRes<WriteFStoreNT, [SKXPort237,SKXPort4], 1, [1,1], 2>;
192 defm : X86WriteRes<WriteFStoreNTX, [SKXPort237,SKXPort4], 1, [1,1], 2>;
193 defm : X86WriteRes<WriteFStoreNTY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
194 defm : X86WriteRes<WriteFMaskedStore, [SKXPort237,SKXPort0], 2, [1,1], 2>;
195 defm : X86WriteRes<WriteFMaskedStoreY, [SKXPort237,SKXPort0], 2, [1,1], 2>;
196 defm : X86WriteRes<WriteFMove, [SKXPort015], 1, [1], 1>;
197 defm : X86WriteRes<WriteFMoveX, [SKXPort015], 1, [1], 1>;
198 defm : X86WriteRes<WriteFMoveY, [SKXPort015], 1, [1], 1>;
199 defm : X86WriteRes<WriteEMMS, [SKXPort05,SKXPort0156], 10, [9,1], 10>;
201 defm : SKXWriteResPair<WriteFAdd, [SKXPort01], 4, [1], 1, 5>; // Floating point add/sub.
202 defm : SKXWriteResPair<WriteFAddX, [SKXPort01], 4, [1], 1, 6>;
203 defm : SKXWriteResPair<WriteFAddY, [SKXPort01], 4, [1], 1, 7>;
204 defm : SKXWriteResPair<WriteFAddZ, [SKXPort05], 4, [1], 1, 7>;
205 defm : SKXWriteResPair<WriteFAdd64, [SKXPort01], 4, [1], 1, 5>; // Floating point double add/sub.
206 defm : SKXWriteResPair<WriteFAdd64X, [SKXPort01], 4, [1], 1, 6>;
207 defm : SKXWriteResPair<WriteFAdd64Y, [SKXPort01], 4, [1], 1, 7>;
208 defm : SKXWriteResPair<WriteFAdd64Z, [SKXPort05], 4, [1], 1, 7>;
210 defm : SKXWriteResPair<WriteFCmp, [SKXPort01], 4, [1], 1, 5>; // Floating point compare.
211 defm : SKXWriteResPair<WriteFCmpX, [SKXPort01], 4, [1], 1, 6>;
212 defm : SKXWriteResPair<WriteFCmpY, [SKXPort01], 4, [1], 1, 7>;
213 defm : SKXWriteResPair<WriteFCmpZ, [SKXPort05], 4, [1], 1, 7>;
214 defm : SKXWriteResPair<WriteFCmp64, [SKXPort01], 4, [1], 1, 5>; // Floating point double compare.
215 defm : SKXWriteResPair<WriteFCmp64X, [SKXPort01], 4, [1], 1, 6>;
216 defm : SKXWriteResPair<WriteFCmp64Y, [SKXPort01], 4, [1], 1, 7>;
217 defm : SKXWriteResPair<WriteFCmp64Z, [SKXPort05], 4, [1], 1, 7>;
219 defm : SKXWriteResPair<WriteFCom, [SKXPort0], 2>; // Floating point compare to flags.
221 defm : SKXWriteResPair<WriteFMul, [SKXPort01], 4, [1], 1, 5>; // Floating point multiplication.
222 defm : SKXWriteResPair<WriteFMulX, [SKXPort01], 4, [1], 1, 6>;
223 defm : SKXWriteResPair<WriteFMulY, [SKXPort01], 4, [1], 1, 7>;
224 defm : SKXWriteResPair<WriteFMulZ, [SKXPort05], 4, [1], 1, 7>;
225 defm : SKXWriteResPair<WriteFMul64, [SKXPort01], 4, [1], 1, 5>; // Floating point double multiplication.
226 defm : SKXWriteResPair<WriteFMul64X, [SKXPort01], 4, [1], 1, 6>;
227 defm : SKXWriteResPair<WriteFMul64Y, [SKXPort01], 4, [1], 1, 7>;
228 defm : SKXWriteResPair<WriteFMul64Z, [SKXPort05], 4, [1], 1, 7>;
230 defm : SKXWriteResPair<WriteFDiv, [SKXPort0,SKXFPDivider], 11, [1,3], 1, 5>; // 10-14 cycles. // Floating point division.
231 //defm : SKXWriteResPair<WriteFDivX, [SKXPort0,SKXFPDivider], 11, [1,3], 1, 6>; // 10-14 cycles.
232 defm : SKXWriteResPair<WriteFDivY, [SKXPort0,SKXFPDivider], 11, [1,5], 1, 7>; // 10-14 cycles.
233 defm : SKXWriteResPair<WriteFDivZ, [SKXPort0,SKXPort5,SKXFPDivider], 18, [2,1,10], 3, 7>; // 10-14 cycles.
234 //defm : SKXWriteResPair<WriteFDiv64, [SKXPort0,SKXFPDivider], 14, [1,3], 1, 5>; // 10-14 cycles. // Floating point division.
235 //defm : SKXWriteResPair<WriteFDiv64X, [SKXPort0,SKXFPDivider], 14, [1,3], 1, 6>; // 10-14 cycles.
236 //defm : SKXWriteResPair<WriteFDiv64Y, [SKXPort0,SKXFPDivider], 14, [1,5], 1, 7>; // 10-14 cycles.
237 defm : SKXWriteResPair<WriteFDiv64Z, [SKXPort0,SKXPort5,SKXFPDivider], 23, [2,1,16], 3, 7>; // 10-14 cycles.
239 defm : SKXWriteResPair<WriteFSqrt, [SKXPort0,SKXFPDivider], 12, [1,3], 1, 5>; // Floating point square root.
240 defm : SKXWriteResPair<WriteFSqrtX, [SKXPort0,SKXFPDivider], 12, [1,3], 1, 6>;
241 defm : SKXWriteResPair<WriteFSqrtY, [SKXPort0,SKXFPDivider], 12, [1,6], 1, 7>;
242 defm : SKXWriteResPair<WriteFSqrtZ, [SKXPort0,SKXPort5,SKXFPDivider], 20, [2,1,12], 3, 7>;
243 defm : SKXWriteResPair<WriteFSqrt64, [SKXPort0,SKXFPDivider], 18, [1,6], 1, 5>; // Floating point double square root.
244 defm : SKXWriteResPair<WriteFSqrt64X, [SKXPort0,SKXFPDivider], 18, [1,6], 1, 6>;
245 defm : SKXWriteResPair<WriteFSqrt64Y, [SKXPort0,SKXFPDivider], 18, [1,12],1, 7>;
246 defm : SKXWriteResPair<WriteFSqrt64Z, [SKXPort0,SKXPort5,SKXFPDivider], 32, [2,1,24], 3, 7>;
247 defm : SKXWriteResPair<WriteFSqrt80, [SKXPort0,SKXFPDivider], 21, [1,7]>; // Floating point long double square root.
249 defm : SKXWriteResPair<WriteFRcp, [SKXPort0], 4, [1], 1, 5>; // Floating point reciprocal estimate.
250 defm : SKXWriteResPair<WriteFRcpX, [SKXPort0], 4, [1], 1, 6>;
251 defm : SKXWriteResPair<WriteFRcpY, [SKXPort0], 4, [1], 1, 7>;
252 defm : SKXWriteResPair<WriteFRcpZ, [SKXPort0,SKXPort5], 4, [2,1], 3, 7>;
254 defm : SKXWriteResPair<WriteFRsqrt, [SKXPort0], 4, [1], 1, 5>; // Floating point reciprocal square root estimate.
255 defm : SKXWriteResPair<WriteFRsqrtX,[SKXPort0], 4, [1], 1, 6>;
256 defm : SKXWriteResPair<WriteFRsqrtY,[SKXPort0], 4, [1], 1, 7>;
257 defm : SKXWriteResPair<WriteFRsqrtZ,[SKXPort0,SKXPort5], 9, [2,1], 3, 7>;
259 defm : SKXWriteResPair<WriteFMA, [SKXPort01], 4, [1], 1, 5>; // Fused Multiply Add.
260 defm : SKXWriteResPair<WriteFMAX, [SKXPort01], 4, [1], 1, 6>;
261 defm : SKXWriteResPair<WriteFMAY, [SKXPort01], 4, [1], 1, 7>;
262 defm : SKXWriteResPair<WriteFMAZ, [SKXPort05], 4, [1], 1, 7>;
263 defm : SKXWriteResPair<WriteDPPD, [SKXPort5,SKXPort015], 9, [1,2], 3, 6>; // Floating point double dot product.
264 defm : SKXWriteResPair<WriteDPPS, [SKXPort5,SKXPort015], 13, [1,3], 4, 6>;
265 defm : SKXWriteResPair<WriteDPPSY,[SKXPort5,SKXPort015], 13, [1,3], 4, 7>;
266 defm : SKXWriteResPair<WriteDPPSZ,[SKXPort5,SKXPort015], 13, [1,3], 4, 7>;
267 defm : SKXWriteResPair<WriteFSign, [SKXPort0], 1>; // Floating point fabs/fchs.
268 defm : SKXWriteResPair<WriteFRnd, [SKXPort01], 8, [2], 2, 6>; // Floating point rounding.
269 defm : SKXWriteResPair<WriteFRndY, [SKXPort01], 8, [2], 2, 7>;
270 defm : SKXWriteResPair<WriteFRndZ, [SKXPort05], 8, [2], 2, 7>;
271 defm : SKXWriteResPair<WriteFLogic, [SKXPort015], 1, [1], 1, 6>; // Floating point and/or/xor logicals.
272 defm : SKXWriteResPair<WriteFLogicY, [SKXPort015], 1, [1], 1, 7>;
273 defm : SKXWriteResPair<WriteFLogicZ, [SKXPort05], 1, [1], 1, 7>;
274 defm : SKXWriteResPair<WriteFTest, [SKXPort0], 2, [1], 1, 6>; // Floating point TEST instructions.
275 defm : SKXWriteResPair<WriteFTestY, [SKXPort0], 2, [1], 1, 7>;
276 defm : SKXWriteResPair<WriteFTestZ, [SKXPort0], 2, [1], 1, 7>;
277 defm : SKXWriteResPair<WriteFShuffle, [SKXPort5], 1, [1], 1, 6>; // Floating point vector shuffles.
278 defm : SKXWriteResPair<WriteFShuffleY, [SKXPort5], 1, [1], 1, 7>;
279 defm : SKXWriteResPair<WriteFShuffleZ, [SKXPort5], 1, [1], 1, 7>;
280 defm : SKXWriteResPair<WriteFVarShuffle, [SKXPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
281 defm : SKXWriteResPair<WriteFVarShuffleY, [SKXPort5], 1, [1], 1, 7>;
282 defm : SKXWriteResPair<WriteFVarShuffleZ, [SKXPort5], 1, [1], 1, 7>;
283 defm : SKXWriteResPair<WriteFBlend, [SKXPort015], 1, [1], 1, 6>; // Floating point vector blends.
284 defm : SKXWriteResPair<WriteFBlendY,[SKXPort015], 1, [1], 1, 7>;
285 defm : SKXWriteResPair<WriteFBlendZ,[SKXPort015], 1, [1], 1, 7>;
286 defm : SKXWriteResPair<WriteFVarBlend, [SKXPort015], 2, [2], 2, 6>; // Fp vector variable blends.
287 defm : SKXWriteResPair<WriteFVarBlendY,[SKXPort015], 2, [2], 2, 7>;
288 defm : SKXWriteResPair<WriteFVarBlendZ,[SKXPort015], 2, [2], 2, 7>;
290 // FMA Scheduling helper class.
291 // class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
293 // Vector integer operations.
294 defm : X86WriteRes<WriteVecLoad, [SKXPort23], 5, [1], 1>;
295 defm : X86WriteRes<WriteVecLoadX, [SKXPort23], 6, [1], 1>;
296 defm : X86WriteRes<WriteVecLoadY, [SKXPort23], 7, [1], 1>;
297 defm : X86WriteRes<WriteVecLoadNT, [SKXPort23], 6, [1], 1>;
298 defm : X86WriteRes<WriteVecLoadNTY, [SKXPort23], 7, [1], 1>;
299 defm : X86WriteRes<WriteVecMaskedLoad, [SKXPort23,SKXPort015], 7, [1,1], 2>;
300 defm : X86WriteRes<WriteVecMaskedLoadY, [SKXPort23,SKXPort015], 8, [1,1], 2>;
301 defm : X86WriteRes<WriteVecStore, [SKXPort237,SKXPort4], 1, [1,1], 2>;
302 defm : X86WriteRes<WriteVecStoreX, [SKXPort237,SKXPort4], 1, [1,1], 2>;
303 defm : X86WriteRes<WriteVecStoreY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
304 defm : X86WriteRes<WriteVecStoreNT, [SKXPort237,SKXPort4], 1, [1,1], 2>;
305 defm : X86WriteRes<WriteVecStoreNTY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
306 defm : X86WriteRes<WriteVecMaskedStore, [SKXPort237,SKXPort0], 2, [1,1], 2>;
307 defm : X86WriteRes<WriteVecMaskedStoreY, [SKXPort237,SKXPort0], 2, [1,1], 2>;
308 defm : X86WriteRes<WriteVecMove, [SKXPort05], 1, [1], 1>;
309 defm : X86WriteRes<WriteVecMoveX, [SKXPort015], 1, [1], 1>;
310 defm : X86WriteRes<WriteVecMoveY, [SKXPort015], 1, [1], 1>;
311 defm : X86WriteRes<WriteVecMoveToGpr, [SKXPort0], 2, [1], 1>;
312 defm : X86WriteRes<WriteVecMoveFromGpr, [SKXPort5], 1, [1], 1>;
314 defm : SKXWriteResPair<WriteVecALU, [SKXPort05], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
315 defm : SKXWriteResPair<WriteVecALUX, [SKXPort01], 1, [1], 1, 6>;
316 defm : SKXWriteResPair<WriteVecALUY, [SKXPort01], 1, [1], 1, 7>;
317 defm : SKXWriteResPair<WriteVecALUZ, [SKXPort0], 1, [1], 1, 7>;
318 defm : SKXWriteResPair<WriteVecLogic, [SKXPort05], 1, [1], 1, 5>; // Vector integer and/or/xor.
319 defm : SKXWriteResPair<WriteVecLogicX,[SKXPort015], 1, [1], 1, 6>;
320 defm : SKXWriteResPair<WriteVecLogicY,[SKXPort015], 1, [1], 1, 7>;
321 defm : SKXWriteResPair<WriteVecLogicZ,[SKXPort05], 1, [1], 1, 7>;
322 defm : SKXWriteResPair<WriteVecTest, [SKXPort0,SKXPort5], 3, [1,1], 2, 6>; // Vector integer TEST instructions.
323 defm : SKXWriteResPair<WriteVecTestY, [SKXPort0,SKXPort5], 3, [1,1], 2, 7>;
324 defm : SKXWriteResPair<WriteVecTestZ, [SKXPort0,SKXPort5], 3, [1,1], 2, 7>;
325 defm : SKXWriteResPair<WriteVecIMul, [SKXPort0], 4, [1], 1, 5>; // Vector integer multiply.
326 defm : SKXWriteResPair<WriteVecIMulX, [SKXPort01], 4, [1], 1, 6>;
327 defm : SKXWriteResPair<WriteVecIMulY, [SKXPort01], 4, [1], 1, 7>;
328 defm : SKXWriteResPair<WriteVecIMulZ, [SKXPort05], 4, [1], 1, 7>;
329 defm : SKXWriteResPair<WritePMULLD, [SKXPort01], 10, [2], 2, 6>; // Vector PMULLD.
330 defm : SKXWriteResPair<WritePMULLDY, [SKXPort01], 10, [2], 2, 7>;
331 defm : SKXWriteResPair<WritePMULLDZ, [SKXPort05], 10, [2], 2, 7>;
332 defm : SKXWriteResPair<WriteShuffle, [SKXPort5], 1, [1], 1, 5>; // Vector shuffles.
333 defm : SKXWriteResPair<WriteShuffleX, [SKXPort5], 1, [1], 1, 6>;
334 defm : SKXWriteResPair<WriteShuffleY, [SKXPort5], 1, [1], 1, 7>;
335 defm : SKXWriteResPair<WriteShuffleZ, [SKXPort5], 1, [1], 1, 7>;
336 defm : SKXWriteResPair<WriteVarShuffle, [SKXPort5], 1, [1], 1, 5>; // Vector variable shuffles.
337 defm : SKXWriteResPair<WriteVarShuffleX, [SKXPort5], 1, [1], 1, 6>;
338 defm : SKXWriteResPair<WriteVarShuffleY, [SKXPort5], 1, [1], 1, 7>;
339 defm : SKXWriteResPair<WriteVarShuffleZ, [SKXPort5], 1, [1], 1, 7>;
340 defm : SKXWriteResPair<WriteBlend, [SKXPort5], 1, [1], 1, 6>; // Vector blends.
341 defm : SKXWriteResPair<WriteBlendY,[SKXPort5], 1, [1], 1, 7>;
342 defm : SKXWriteResPair<WriteBlendZ,[SKXPort5], 1, [1], 1, 7>;
343 defm : SKXWriteResPair<WriteVarBlend, [SKXPort015], 2, [2], 2, 6>; // Vector variable blends.
344 defm : SKXWriteResPair<WriteVarBlendY,[SKXPort015], 2, [2], 2, 6>;
345 defm : SKXWriteResPair<WriteVarBlendZ,[SKXPort05], 2, [1], 1, 6>;
346 defm : SKXWriteResPair<WriteMPSAD, [SKXPort5], 4, [2], 2, 6>; // Vector MPSAD.
347 defm : SKXWriteResPair<WriteMPSADY, [SKXPort5], 4, [2], 2, 7>;
348 defm : SKXWriteResPair<WriteMPSADZ, [SKXPort5], 4, [2], 2, 7>;
349 defm : SKXWriteResPair<WritePSADBW, [SKXPort5], 3, [1], 1, 5>; // Vector PSADBW.
350 defm : SKXWriteResPair<WritePSADBWX, [SKXPort5], 3, [1], 1, 6>;
351 defm : SKXWriteResPair<WritePSADBWY, [SKXPort5], 3, [1], 1, 7>;
352 defm : SKXWriteResPair<WritePSADBWZ, [SKXPort5], 3, [1], 1, 7>;
353 defm : SKXWriteResPair<WritePHMINPOS, [SKXPort0], 4, [1], 1, 6>; // Vector PHMINPOS.
355 // Vector integer shifts.
356 defm : SKXWriteResPair<WriteVecShift, [SKXPort0], 1, [1], 1, 5>;
357 defm : X86WriteRes<WriteVecShiftX, [SKXPort5,SKXPort01], 2, [1,1], 2>;
358 defm : X86WriteRes<WriteVecShiftY, [SKXPort5,SKXPort01], 4, [1,1], 2>;
359 defm : X86WriteRes<WriteVecShiftZ, [SKXPort5,SKXPort0], 4, [1,1], 2>;
360 defm : X86WriteRes<WriteVecShiftXLd, [SKXPort01,SKXPort23], 7, [1,1], 2>;
361 defm : X86WriteRes<WriteVecShiftYLd, [SKXPort01,SKXPort23], 8, [1,1], 2>;
362 defm : X86WriteRes<WriteVecShiftZLd, [SKXPort0,SKXPort23], 8, [1,1], 2>;
364 defm : SKXWriteResPair<WriteVecShiftImm, [SKXPort0], 1, [1], 1, 5>;
365 defm : SKXWriteResPair<WriteVecShiftImmX, [SKXPort01], 1, [1], 1, 6>; // Vector integer immediate shifts.
366 defm : SKXWriteResPair<WriteVecShiftImmY, [SKXPort01], 1, [1], 1, 7>;
367 defm : SKXWriteResPair<WriteVecShiftImmZ, [SKXPort0], 1, [1], 1, 7>;
368 defm : SKXWriteResPair<WriteVarVecShift, [SKXPort01], 1, [1], 1, 6>; // Variable vector shifts.
369 defm : SKXWriteResPair<WriteVarVecShiftY, [SKXPort01], 1, [1], 1, 7>;
370 defm : SKXWriteResPair<WriteVarVecShiftZ, [SKXPort0], 1, [1], 1, 7>;
372 // Vector insert/extract operations.
373 def : WriteRes<WriteVecInsert, [SKXPort5]> {
376 let ResourceCycles = [2];
378 def : WriteRes<WriteVecInsertLd, [SKXPort5,SKXPort23]> {
382 def: InstRW<[WriteVecInsertLd], (instregex "(V?)MOV(H|L)(PD|PS)rm")>;
384 def : WriteRes<WriteVecExtract, [SKXPort0,SKXPort5]> {
388 def : WriteRes<WriteVecExtractSt, [SKXPort4,SKXPort5,SKXPort237]> {
393 // Conversion between integer and float.
394 defm : SKXWriteResPair<WriteCvtSS2I, [SKXPort01], 6, [2], 2>; // Needs more work: DD vs DQ.
395 defm : SKXWriteResPair<WriteCvtPS2I, [SKXPort01], 3>;
396 defm : SKXWriteResPair<WriteCvtPS2IY, [SKXPort01], 3>;
397 defm : SKXWriteResPair<WriteCvtPS2IZ, [SKXPort05], 3>;
398 defm : SKXWriteResPair<WriteCvtSD2I, [SKXPort01], 6, [2], 2>;
399 defm : SKXWriteResPair<WriteCvtPD2I, [SKXPort01], 3>;
400 defm : SKXWriteResPair<WriteCvtPD2IY, [SKXPort01], 3>;
401 defm : SKXWriteResPair<WriteCvtPD2IZ, [SKXPort05], 3>;
403 defm : SKXWriteResPair<WriteCvtI2SS, [SKXPort1], 4>;
404 defm : SKXWriteResPair<WriteCvtI2PS, [SKXPort01], 4>;
405 defm : SKXWriteResPair<WriteCvtI2PSY, [SKXPort01], 4>;
406 defm : SKXWriteResPair<WriteCvtI2PSZ, [SKXPort05], 4>; // Needs more work: DD vs DQ.
407 defm : SKXWriteResPair<WriteCvtI2SD, [SKXPort1], 4>;
408 defm : SKXWriteResPair<WriteCvtI2PD, [SKXPort01], 4>;
409 defm : SKXWriteResPair<WriteCvtI2PDY, [SKXPort01], 4>;
410 defm : SKXWriteResPair<WriteCvtI2PDZ, [SKXPort05], 4>;
412 defm : SKXWriteResPair<WriteCvtSS2SD, [SKXPort1], 3>;
413 defm : SKXWriteResPair<WriteCvtPS2PD, [SKXPort1], 3>;
414 defm : SKXWriteResPair<WriteCvtPS2PDY, [SKXPort5,SKXPort01], 3, [1,1], 2>;
415 defm : SKXWriteResPair<WriteCvtPS2PDZ, [SKXPort05], 3, [2], 2>;
416 defm : SKXWriteResPair<WriteCvtSD2SS, [SKXPort1], 3>;
417 defm : SKXWriteResPair<WriteCvtPD2PS, [SKXPort1], 3>;
418 defm : SKXWriteResPair<WriteCvtPD2PSY, [SKXPort5,SKXPort01], 3, [1,1], 2>;
419 defm : SKXWriteResPair<WriteCvtPD2PSZ, [SKXPort05], 3, [2], 2>;
421 defm : X86WriteRes<WriteCvtPH2PS, [SKXPort5,SKXPort01], 5, [1,1], 2>;
422 defm : X86WriteRes<WriteCvtPH2PSY, [SKXPort5,SKXPort01], 7, [1,1], 2>;
423 defm : X86WriteRes<WriteCvtPH2PSZ, [SKXPort5,SKXPort0], 7, [1,1], 2>;
424 defm : X86WriteRes<WriteCvtPH2PSLd, [SKXPort23,SKXPort01], 9, [1,1], 2>;
425 defm : X86WriteRes<WriteCvtPH2PSYLd, [SKXPort23,SKXPort01], 10, [1,1], 2>;
426 defm : X86WriteRes<WriteCvtPH2PSZLd, [SKXPort23,SKXPort05], 10, [1,1], 2>;
428 defm : X86WriteRes<WriteCvtPS2PH, [SKXPort5,SKXPort01], 5, [1,1], 2>;
429 defm : X86WriteRes<WriteCvtPS2PHY, [SKXPort5,SKXPort01], 7, [1,1], 2>;
430 defm : X86WriteRes<WriteCvtPS2PHZ, [SKXPort5,SKXPort05], 7, [1,1], 2>;
431 defm : X86WriteRes<WriteCvtPS2PHSt, [SKXPort4,SKXPort5,SKXPort237,SKXPort01], 6, [1,1,1,1], 4>;
432 defm : X86WriteRes<WriteCvtPS2PHYSt, [SKXPort4,SKXPort5,SKXPort237,SKXPort01], 8, [1,1,1,1], 4>;
433 defm : X86WriteRes<WriteCvtPS2PHZSt, [SKXPort4,SKXPort5,SKXPort237,SKXPort05], 8, [1,1,1,1], 4>;
435 // Strings instructions.
437 // Packed Compare Implicit Length Strings, Return Mask
438 def : WriteRes<WritePCmpIStrM, [SKXPort0]> {
441 let ResourceCycles = [3];
443 def : WriteRes<WritePCmpIStrMLd, [SKXPort0, SKXPort23]> {
446 let ResourceCycles = [3,1];
449 // Packed Compare Explicit Length Strings, Return Mask
450 def : WriteRes<WritePCmpEStrM, [SKXPort0, SKXPort5, SKXPort015, SKXPort0156]> {
453 let ResourceCycles = [4,3,1,1];
455 def : WriteRes<WritePCmpEStrMLd, [SKXPort0, SKXPort5, SKXPort23, SKXPort015, SKXPort0156]> {
457 let NumMicroOps = 10;
458 let ResourceCycles = [4,3,1,1,1];
461 // Packed Compare Implicit Length Strings, Return Index
462 def : WriteRes<WritePCmpIStrI, [SKXPort0]> {
465 let ResourceCycles = [3];
467 def : WriteRes<WritePCmpIStrILd, [SKXPort0, SKXPort23]> {
470 let ResourceCycles = [3,1];
473 // Packed Compare Explicit Length Strings, Return Index
474 def : WriteRes<WritePCmpEStrI, [SKXPort0,SKXPort5,SKXPort0156]> {
477 let ResourceCycles = [4,3,1];
479 def : WriteRes<WritePCmpEStrILd, [SKXPort0, SKXPort5, SKXPort23, SKXPort0156]> {
482 let ResourceCycles = [4,3,1,1];
485 // MOVMSK Instructions.
486 def : WriteRes<WriteFMOVMSK, [SKXPort0]> { let Latency = 2; }
487 def : WriteRes<WriteVecMOVMSK, [SKXPort0]> { let Latency = 2; }
488 def : WriteRes<WriteVecMOVMSKY, [SKXPort0]> { let Latency = 2; }
489 def : WriteRes<WriteMMXMOVMSK, [SKXPort0]> { let Latency = 2; }
492 def : WriteRes<WriteAESDecEnc, [SKXPort0]> { // Decryption, encryption.
495 let ResourceCycles = [1];
497 def : WriteRes<WriteAESDecEncLd, [SKXPort0, SKXPort23]> {
500 let ResourceCycles = [1,1];
503 def : WriteRes<WriteAESIMC, [SKXPort0]> { // InvMixColumn.
506 let ResourceCycles = [2];
508 def : WriteRes<WriteAESIMCLd, [SKXPort0, SKXPort23]> {
511 let ResourceCycles = [2,1];
514 def : WriteRes<WriteAESKeyGen, [SKXPort0,SKXPort5,SKXPort015]> { // Key Generation.
516 let NumMicroOps = 11;
517 let ResourceCycles = [3,6,2];
519 def : WriteRes<WriteAESKeyGenLd, [SKXPort0,SKXPort5,SKXPort23,SKXPort015]> {
521 let NumMicroOps = 11;
522 let ResourceCycles = [3,6,1,1];
525 // Carry-less multiplication instructions.
526 def : WriteRes<WriteCLMul, [SKXPort5]> {
529 let ResourceCycles = [1];
531 def : WriteRes<WriteCLMulLd, [SKXPort5, SKXPort23]> {
534 let ResourceCycles = [1,1];
537 // Catch-all for expensive system instructions.
538 def : WriteRes<WriteSystem, [SKXPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
541 defm : SKXWriteResPair<WriteFShuffle256, [SKXPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
542 defm : SKXWriteResPair<WriteFVarShuffle256, [SKXPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
543 defm : SKXWriteResPair<WriteShuffle256, [SKXPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
544 defm : SKXWriteResPair<WriteVarShuffle256, [SKXPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
546 // Old microcoded instructions that nobody use.
547 def : WriteRes<WriteMicrocoded, [SKXPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
549 // Fence instructions.
550 def : WriteRes<WriteFence, [SKXPort23, SKXPort4]>;
553 def : WriteRes<WriteLDMXCSR, [SKXPort0,SKXPort23,SKXPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
554 def : WriteRes<WriteSTMXCSR, [SKXPort4,SKXPort5,SKXPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
556 // Nop, not very useful expect it provides a model for nops!
557 def : WriteRes<WriteNop, []>;
559 ////////////////////////////////////////////////////////////////////////////////
560 // Horizontal add/sub instructions.
561 ////////////////////////////////////////////////////////////////////////////////
563 defm : SKXWriteResPair<WriteFHAdd, [SKXPort5,SKXPort015], 6, [2,1], 3, 6>;
564 defm : SKXWriteResPair<WriteFHAddY, [SKXPort5,SKXPort015], 6, [2,1], 3, 7>;
565 defm : SKXWriteResPair<WritePHAdd, [SKXPort5,SKXPort05], 3, [2,1], 3, 5>;
566 defm : SKXWriteResPair<WritePHAddX, [SKXPort5,SKXPort015], 3, [2,1], 3, 6>;
567 defm : SKXWriteResPair<WritePHAddY, [SKXPort5,SKXPort015], 3, [2,1], 3, 7>;
571 def SKXWriteResGroup1 : SchedWriteRes<[SKXPort0]> {
574 let ResourceCycles = [1];
576 def: InstRW<[SKXWriteResGroup1], (instregex "KAND(B|D|Q|W)rr",
584 "MMX_PADDUS(B|W)irr",
586 "MMX_PCMPEQ(B|D|W)irr",
587 "MMX_PCMPGT(B|D|W)irr",
588 "MMX_P(MAX|MIN)SWirr",
589 "MMX_P(MAX|MIN)UBirr",
591 "MMX_PSUBUS(B|W)irr",
592 "VPMOVB2M(Z|Z128|Z256)rr",
593 "VPMOVD2M(Z|Z128|Z256)rr",
594 "VPMOVQ2M(Z|Z128|Z256)rr",
595 "VPMOVW2M(Z|Z128|Z256)rr")>;
597 def SKXWriteResGroup3 : SchedWriteRes<[SKXPort5]> {
600 let ResourceCycles = [1];
602 def: InstRW<[SKXWriteResGroup3], (instregex "COM(P?)_FST0r",
606 def SKXWriteResGroup4 : SchedWriteRes<[SKXPort6]> {
609 let ResourceCycles = [1];
611 def: InstRW<[SKXWriteResGroup4], (instregex "JMP(16|32|64)r")>;
613 def SKXWriteResGroup6 : SchedWriteRes<[SKXPort05]> {
616 let ResourceCycles = [1];
618 def: InstRW<[SKXWriteResGroup6], (instrs FINCSTP, FNOP)>;
620 def SKXWriteResGroup7 : SchedWriteRes<[SKXPort06]> {
623 let ResourceCycles = [1];
625 def: InstRW<[SKXWriteResGroup7], (instrs CDQ, CQO, CLAC, STAC)>;
627 def SKXWriteResGroup8 : SchedWriteRes<[SKXPort15]> {
630 let ResourceCycles = [1];
632 def: InstRW<[SKXWriteResGroup8], (instregex "ANDN(32|64)rr")>;
634 def SKXWriteResGroup9 : SchedWriteRes<[SKXPort015]> {
637 let ResourceCycles = [1];
639 def: InstRW<[SKXWriteResGroup9], (instregex "VBLENDMPD(Z128|Z256)rr",
640 "VBLENDMPS(Z128|Z256)rr",
641 "VPADD(B|D|Q|W)(Y|Z|Z128|Z256)rr",
642 "(V?)PADD(B|D|Q|W)rr",
644 "VPBLENDMB(Z128|Z256)rr",
645 "VPBLENDMD(Z128|Z256)rr",
646 "VPBLENDMQ(Z128|Z256)rr",
647 "VPBLENDMW(Z128|Z256)rr",
648 "VPSUB(B|D|Q|W)(Y|Z|Z128|Z256)rr",
649 "(V?)PSUB(B|D|Q|W)rr",
650 "VPTERNLOGD(Z|Z128|Z256)rri",
651 "VPTERNLOGQ(Z|Z128|Z256)rri")>;
653 def SKXWriteResGroup10 : SchedWriteRes<[SKXPort0156]> {
656 let ResourceCycles = [1];
658 def: InstRW<[SKXWriteResGroup10], (instrs CBW, CWDE, CDQE,
666 def SKXWriteResGroup11 : SchedWriteRes<[SKXPort4,SKXPort237]> {
669 let ResourceCycles = [1,1];
671 def: InstRW<[SKXWriteResGroup11], (instrs FBSTPm, VMPTRSTm)>;
672 def: InstRW<[SKXWriteResGroup11], (instregex "KMOV(B|D|Q|W)mk",
673 "ST_FP(32|64|80)m")>;
675 def SKXWriteResGroup13 : SchedWriteRes<[SKXPort5]> {
678 let ResourceCycles = [2];
680 def: InstRW<[SKXWriteResGroup13], (instrs MMX_MOVQ2DQrr)>;
682 def SKXWriteResGroup14 : SchedWriteRes<[SKXPort05]> {
685 let ResourceCycles = [2];
687 def: InstRW<[SKXWriteResGroup14], (instrs FDECSTP,
690 def SKXWriteResGroup15 : SchedWriteRes<[SKXPort06]> {
693 let ResourceCycles = [2];
695 def: InstRW<[SKXWriteResGroup15], (instregex "ROL(8|16|32|64)r(1|i)",
696 "ROR(8|16|32|64)r(1|i)",
699 def SKXWriteResGroup17 : SchedWriteRes<[SKXPort0156]> {
702 let ResourceCycles = [2];
704 def: InstRW<[SKXWriteResGroup17], (instrs LFENCE,
708 def SKXWriteResGroup20 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
711 let ResourceCycles = [1,1];
713 def: InstRW<[SKXWriteResGroup20], (instregex "CLFLUSH")>;
715 def SKXWriteResGroup21 : SchedWriteRes<[SKXPort237,SKXPort0156]> {
718 let ResourceCycles = [1,1];
720 def: InstRW<[SKXWriteResGroup21], (instrs SFENCE)>;
722 def SKXWriteResGroup23 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
725 let ResourceCycles = [1,1];
727 def: InstRW<[SKXWriteResGroup23], (instrs CWD,
730 def: InstRW<[SKXWriteResGroup23], (instregex "ADC8ri",
733 def SKXWriteResGroup25 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort237]> {
736 let ResourceCycles = [1,1,1];
738 def: InstRW<[SKXWriteResGroup25], (instrs FNSTCW16m)>;
740 def SKXWriteResGroup27 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort15]> {
743 let ResourceCycles = [1,1,1];
745 def: InstRW<[SKXWriteResGroup27], (instregex "MOVBE(16|32|64)mr")>;
747 def SKXWriteResGroup28 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort0156]> {
750 let ResourceCycles = [1,1,1];
752 def: InstRW<[SKXWriteResGroup28], (instrs PUSH16r, PUSH32r, PUSH64r, PUSH64i8,
753 STOSB, STOSL, STOSQ, STOSW)>;
754 def: InstRW<[SKXWriteResGroup28], (instregex "PUSH(16|32|64)rmr")>;
756 def SKXWriteResGroup29 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort15]> {
759 let ResourceCycles = [2,2,1];
761 def: InstRW<[SKXWriteResGroup29], (instregex "VMOVDQU8Zmr(b?)")>;
763 def SKXWriteResGroup30 : SchedWriteRes<[SKXPort0]> {
766 let ResourceCycles = [1];
768 def: InstRW<[SKXWriteResGroup30], (instregex "KMOV(B|D|Q|W)rk",
769 "KORTEST(B|D|Q|W)rr",
770 "KTEST(B|D|Q|W)rr")>;
772 def SKXWriteResGroup31 : SchedWriteRes<[SKXPort1]> {
775 let ResourceCycles = [1];
777 def: InstRW<[SKXWriteResGroup31], (instregex "PDEP(32|64)rr",
780 def SKXWriteResGroup31_16i : SchedWriteRes<[SKXPort1, SKXPort0156]> {
783 let ResourceCycles = [1,1];
785 def: InstRW<[SKXWriteResGroup31_16i], (instrs IMUL16rri, IMUL16rri8)>;
788 def SKXWriteResGroup32 : SchedWriteRes<[SKXPort5]> {
791 let ResourceCycles = [1];
793 def: InstRW<[SKXWriteResGroup32], (instrs VPSADBWZrr)>; // TODO: 512-bit ops require ports 0/1 to be joined.
794 def: InstRW<[SKXWriteResGroup32], (instregex "(ADD|SUB|SUBR)_(FPrST0|FST0r|FrST0)",
796 "KSHIFTL(B|D|Q|W)ri",
797 "KSHIFTR(B|D|Q|W)ri",
798 "KUNPCK(BW|DQ|WD)rr",
799 "VALIGND(Z|Z128|Z256)rri",
800 "VALIGNQ(Z|Z128|Z256)rri",
801 "VCMPPD(Z|Z128|Z256)rri",
802 "VCMPPS(Z|Z128|Z256)rri",
804 "VDBPSADBWZrri", // TODO: 512-bit ops require ports 0/1 to be joined.
805 "VFPCLASS(PD|PS)(Z|Z128|Z256)rr",
806 "VFPCLASS(SD|SS)Zrr",
807 "VPBROADCAST(B|W)rr",
808 "VPCMPB(Z|Z128|Z256)rri",
809 "VPCMPD(Z|Z128|Z256)rri",
810 "VPCMPEQ(B|D|Q|W)(Z|Z128|Z256)rr",
811 "VPCMPGT(B|D|Q|W)(Z|Z128|Z256)rr",
813 "VPCMPQ(Z|Z128|Z256)rri",
814 "VPCMPU(B|D|Q|W)(Z|Z128|Z256)rri",
815 "VPCMPW(Z|Z128|Z256)rri",
816 "VP(MAX|MIN)(S|U)Q(Z|Z128|Z256)rr",
817 "VPTEST(N?)M(B|D|Q|W)(Z|Z128|Z256)rr")>;
819 def SKXWriteResGroup34 : SchedWriteRes<[SKXPort0,SKXPort0156]> {
822 let ResourceCycles = [1,1];
824 def: InstRW<[SKXWriteResGroup34], (instrs FNSTSW16r)>;
826 def SKXWriteResGroup35 : SchedWriteRes<[SKXPort06]> {
829 let ResourceCycles = [3];
831 def: InstRW<[SKXWriteResGroup35], (instregex "ROL(8|16|32|64)rCL",
832 "ROR(8|16|32|64)rCL",
833 "SAR(8|16|32|64)rCL",
834 "SHL(8|16|32|64)rCL",
835 "SHR(8|16|32|64)rCL")>;
837 def SKXWriteResGroup37 : SchedWriteRes<[SKXPort0,SKXPort5]> {
840 let ResourceCycles = [1,2];
842 def: InstRW<[SKXWriteResGroup37], (instregex "MMX_PH(ADD|SUB)SWrr")>;
844 def SKXWriteResGroup38 : SchedWriteRes<[SKXPort5,SKXPort01]> {
847 let ResourceCycles = [2,1];
849 def: InstRW<[SKXWriteResGroup38], (instregex "(V?)PH(ADD|SUB)SW(Y?)rr")>;
851 def SKXWriteResGroup41 : SchedWriteRes<[SKXPort5,SKXPort0156]> {
854 let ResourceCycles = [2,1];
856 def: InstRW<[SKXWriteResGroup41], (instrs MMX_PACKSSDWirr,
860 def SKXWriteResGroup42 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
863 let ResourceCycles = [1,2];
865 def: InstRW<[SKXWriteResGroup42], (instregex "CLD")>;
867 def SKXWriteResGroup43 : SchedWriteRes<[SKXPort237,SKXPort0156]> {
870 let ResourceCycles = [1,2];
872 def: InstRW<[SKXWriteResGroup43], (instrs MFENCE)>;
874 def SKXWriteResGroup44 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
877 let ResourceCycles = [1,2];
879 def: InstRW<[SKXWriteResGroup44], (instregex "RCL(8|16|32|64)r(1|i)",
880 "RCR(8|16|32|64)r(1|i)")>;
882 def SKXWriteResGroup45 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237]> {
885 let ResourceCycles = [1,1,1];
887 def: InstRW<[SKXWriteResGroup45], (instrs FNSTSWm)>;
889 def SKXWriteResGroup46 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort06]> {
892 let ResourceCycles = [1,1,2];
894 def: InstRW<[SKXWriteResGroup46], (instregex "SET(A|BE)m")>;
896 def SKXWriteResGroup47 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort237,SKXPort0156]> {
899 let ResourceCycles = [1,1,1,1];
901 def: InstRW<[SKXWriteResGroup47], (instregex "CALL(16|32|64)r")>;
903 def SKXWriteResGroup48 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort06,SKXPort0156]> {
906 let ResourceCycles = [1,1,1,1];
908 def: InstRW<[SKXWriteResGroup48], (instrs CALL64pcrel32)>;
910 def SKXWriteResGroup49 : SchedWriteRes<[SKXPort0]> {
913 let ResourceCycles = [1];
915 def: InstRW<[SKXWriteResGroup49], (instregex "MUL_(FPrST0|FST0r|FrST0)")>;
917 def SKXWriteResGroup50 : SchedWriteRes<[SKXPort01]> {
920 let ResourceCycles = [1];
922 def: InstRW<[SKXWriteResGroup50], (instregex "VCVTDQ2PS(Y|Z128|Z256)rr",
924 "VCVTPD2QQ(Z128|Z256)rr",
925 "VCVTPD2UQQ(Z128|Z256)rr",
926 "VCVTPS2DQ(Y|Z128|Z256)rr",
928 "VCVTPS2UDQ(Z128|Z256)rr",
929 "VCVTQQ2PD(Z128|Z256)rr",
930 "VCVTTPD2QQ(Z128|Z256)rr",
931 "VCVTTPD2UQQ(Z128|Z256)rr",
932 "VCVTTPS2DQ(Z128|Z256)rr",
934 "VCVTTPS2UDQ(Z128|Z256)rr",
935 "VCVTUDQ2PS(Z128|Z256)rr",
936 "VCVTUQQ2PD(Z128|Z256)rr")>;
938 def SKXWriteResGroup50z : SchedWriteRes<[SKXPort05]> {
941 let ResourceCycles = [1];
943 def: InstRW<[SKXWriteResGroup50z], (instrs VCVTDQ2PSZrr,
956 def SKXWriteResGroup51 : SchedWriteRes<[SKXPort5]> {
959 let ResourceCycles = [2];
961 def: InstRW<[SKXWriteResGroup51], (instregex "VEXPANDPD(Z|Z128|Z256)rr",
962 "VEXPANDPS(Z|Z128|Z256)rr",
963 "VPEXPANDD(Z|Z128|Z256)rr",
964 "VPEXPANDQ(Z|Z128|Z256)rr",
965 "VPMOVDB(Z|Z128|Z256)rr",
966 "VPMOVDW(Z|Z128|Z256)rr",
967 "VPMOVQB(Z|Z128|Z256)rr",
968 "VPMOVQW(Z|Z128|Z256)rr",
969 "VPMOVSDB(Z|Z128|Z256)rr",
970 "VPMOVSDW(Z|Z128|Z256)rr",
971 "VPMOVSQB(Z|Z128|Z256)rr",
972 "VPMOVSQD(Z|Z128|Z256)rr",
973 "VPMOVSQW(Z|Z128|Z256)rr",
974 "VPMOVSWB(Z|Z128|Z256)rr",
975 "VPMOVUSDB(Z|Z128|Z256)rr",
976 "VPMOVUSDW(Z|Z128|Z256)rr",
977 "VPMOVUSQB(Z|Z128|Z256)rr",
978 "VPMOVUSQD(Z|Z128|Z256)rr",
979 "VPMOVUSWB(Z|Z128|Z256)rr",
980 "VPMOVWB(Z|Z128|Z256)rr")>;
982 def SKXWriteResGroup52 : SchedWriteRes<[SKXPort1,SKXPort5]> {
985 let ResourceCycles = [1,1];
987 def: InstRW<[SKXWriteResGroup52], (instrs IMUL64r, MUL64r, MULX64rr)>;
989 def SKXWriteResGroup52_16 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort0156]> {
992 let ResourceCycles = [1,1,2];
994 def: InstRW<[SKXWriteResGroup52_16], (instrs IMUL16r, MUL16r)>;
996 def SKXWriteResGroup54 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort237]> {
999 let ResourceCycles = [1,1,1];
1001 def: InstRW<[SKXWriteResGroup54], (instregex "IST(T?)_FP(16|32|64)m",
1003 "VPMOVQD(Z|Z128|Z256)mr(b?)")>;
1005 def SKXWriteResGroup55 : SchedWriteRes<[SKXPort0156]> {
1007 let NumMicroOps = 4;
1008 let ResourceCycles = [4];
1010 def: InstRW<[SKXWriteResGroup55], (instrs FNCLEX)>;
1012 def SKXWriteResGroup56 : SchedWriteRes<[SKXPort015,SKXPort0156]> {
1014 let NumMicroOps = 4;
1015 let ResourceCycles = [1,3];
1017 def: InstRW<[SKXWriteResGroup56], (instrs VZEROUPPER)>;
1019 def SKXWriteResGroup57 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort0156]> {
1021 let NumMicroOps = 4;
1022 let ResourceCycles = [1,1,2];
1024 def: InstRW<[SKXWriteResGroup57], (instregex "LAR(16|32|64)rr")>;
1026 def SKXWriteResGroup58 : SchedWriteRes<[SKXPort23]> {
1028 let NumMicroOps = 1;
1029 let ResourceCycles = [1];
1031 def: InstRW<[SKXWriteResGroup58], (instregex "MOVSX(16|32|64)rm(8|16|32)",
1032 "MOVZX(16|32|64)rm(8|16)",
1033 "(V?)MOVDDUPrm")>; // TODO: Should this be SKXWriteResGroup71?
1035 def SKXWriteResGroup61 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1037 let NumMicroOps = 2;
1038 let ResourceCycles = [1,1];
1040 def: InstRW<[SKXWriteResGroup61], (instregex "MMX_CVT(T?)PD2PIirr",
1041 "MMX_CVT(T?)PS2PIirr",
1044 "(V?)CVT(T?)PD2DQrr",
1053 "(V?)CVTSD2SS(Z?)rr",
1054 "(V?)CVTSI(64)?2SDrr",
1057 "VCVTSI(64)?2SDZrr",
1061 "VCVTTPD2UDQZ128rr",
1063 "VCVTTPS2UQQZ128rr",
1067 "VCVTUSI(64)?2SDZrr")>;
1069 def SKXWriteResGroup62 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1071 let NumMicroOps = 3;
1072 let ResourceCycles = [2,1];
1074 def: InstRW<[SKXWriteResGroup62], (instregex "VPCONFLICTQZ128rr")>;
1076 def SKXWriteResGroup63 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort06]> {
1078 let NumMicroOps = 3;
1079 let ResourceCycles = [1,1,1];
1081 def: InstRW<[SKXWriteResGroup63], (instregex "STR(16|32|64)r")>;
1083 def SKXWriteResGroup64 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort0156]> {
1085 let NumMicroOps = 3;
1086 let ResourceCycles = [1,1,1];
1088 def: InstRW<[SKXWriteResGroup64], (instrs IMUL32r, MUL32r, MULX32rr)>;
1090 def SKXWriteResGroup65 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort015]> {
1092 let NumMicroOps = 3;
1093 let ResourceCycles = [1,1,1];
1095 def: InstRW<[SKXWriteResGroup65], (instregex "VCVTPS2PHZ128mr(b?)",
1096 "VCVTPS2PHZ256mr(b?)",
1097 "VCVTPS2PHZmr(b?)")>;
1099 def SKXWriteResGroup66 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort237]> {
1101 let NumMicroOps = 4;
1102 let ResourceCycles = [1,2,1];
1104 def: InstRW<[SKXWriteResGroup66], (instregex "VPMOVDB(Z|Z128|Z256)mr(b?)",
1105 "VPMOVDW(Z|Z128|Z256)mr(b?)",
1106 "VPMOVQB(Z|Z128|Z256)mr(b?)",
1107 "VPMOVQW(Z|Z128|Z256)mr(b?)",
1108 "VPMOVSDB(Z|Z128|Z256)mr(b?)",
1109 "VPMOVSDW(Z|Z128|Z256)mr(b?)",
1110 "VPMOVSQB(Z|Z128|Z256)mr(b?)",
1111 "VPMOVSQD(Z|Z128|Z256)mr(b?)",
1112 "VPMOVSQW(Z|Z128|Z256)mr(b?)",
1113 "VPMOVSWB(Z|Z128|Z256)mr(b?)",
1114 "VPMOVUSDB(Z|Z128|Z256)mr(b?)",
1115 "VPMOVUSDW(Z|Z128|Z256)mr(b?)",
1116 "VPMOVUSQB(Z|Z128|Z256)mr(b?)",
1117 "VPMOVUSQD(Z|Z128|Z256)mr(b?)",
1118 "VPMOVUSQW(Z|Z128|Z256)mr(b?)",
1119 "VPMOVUSWB(Z|Z128|Z256)mr(b?)",
1120 "VPMOVWB(Z|Z128|Z256)mr(b?)")>;
1122 def SKXWriteResGroup67 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
1124 let NumMicroOps = 5;
1125 let ResourceCycles = [1,4];
1127 def: InstRW<[SKXWriteResGroup67], (instrs XSETBV)>;
1129 def SKXWriteResGroup69 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort0156]> {
1131 let NumMicroOps = 6;
1132 let ResourceCycles = [1,1,4];
1134 def: InstRW<[SKXWriteResGroup69], (instregex "PUSHF(16|64)")>;
1136 def SKXWriteResGroup71 : SchedWriteRes<[SKXPort23]> {
1138 let NumMicroOps = 1;
1139 let ResourceCycles = [1];
1141 def: InstRW<[SKXWriteResGroup71], (instrs VBROADCASTSSrm,
1149 def SKXWriteResGroup72 : SchedWriteRes<[SKXPort5]> {
1151 let NumMicroOps = 2;
1152 let ResourceCycles = [2];
1154 def: InstRW<[SKXWriteResGroup72], (instrs MMX_CVTPI2PSirr)>;
1155 def: InstRW<[SKXWriteResGroup72], (instregex "VCOMPRESSPD(Z|Z128|Z256)rr",
1156 "VCOMPRESSPS(Z|Z128|Z256)rr",
1157 "VPCOMPRESSD(Z|Z128|Z256)rr",
1158 "VPCOMPRESSQ(Z|Z128|Z256)rr",
1159 "VPERMW(Z|Z128|Z256)rr")>;
1161 def SKXWriteResGroup73 : SchedWriteRes<[SKXPort0,SKXPort23]> {
1163 let NumMicroOps = 2;
1164 let ResourceCycles = [1,1];
1166 def: InstRW<[SKXWriteResGroup73], (instrs MMX_PADDSBirm,
1187 def SKXWriteResGroup76 : SchedWriteRes<[SKXPort6,SKXPort23]> {
1189 let NumMicroOps = 2;
1190 let ResourceCycles = [1,1];
1192 def: InstRW<[SKXWriteResGroup76], (instrs FARJMP64)>;
1193 def: InstRW<[SKXWriteResGroup76], (instregex "JMP(16|32|64)m")>;
1195 def SKXWriteResGroup78 : SchedWriteRes<[SKXPort23,SKXPort06]> {
1197 let NumMicroOps = 2;
1198 let ResourceCycles = [1,1];
1200 def: InstRW<[SKXWriteResGroup78], (instregex "BT(16|32|64)mi8")>;
1202 def SKXWriteResGroup79 : SchedWriteRes<[SKXPort23,SKXPort15]> {
1204 let NumMicroOps = 2;
1205 let ResourceCycles = [1,1];
1207 def: InstRW<[SKXWriteResGroup79], (instregex "ANDN(32|64)rm",
1208 "MOVBE(16|32|64)rm")>;
1210 def SKXWriteResGroup80 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1212 let NumMicroOps = 2;
1213 let ResourceCycles = [1,1];
1215 def: InstRW<[SKXWriteResGroup80], (instregex "VMOV(64to|QI2)PQIZrm(b?)")>;
1216 def: InstRW<[SKXWriteResGroup80], (instrs VMOVDI2PDIZrm)>;
1218 def SKXWriteResGroup81 : SchedWriteRes<[SKXPort23,SKXPort0156]> {
1220 let NumMicroOps = 2;
1221 let ResourceCycles = [1,1];
1223 def: InstRW<[SKXWriteResGroup81], (instrs POP16r, POP32r, POP64r)>;
1224 def: InstRW<[SKXWriteResGroup81], (instregex "POP(16|32|64)rmr")>;
1226 def SKXWriteResGroup82 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1228 let NumMicroOps = 3;
1229 let ResourceCycles = [2,1];
1231 def: InstRW<[SKXWriteResGroup82], (instregex "(V?)CVTSI642SSrr",
1233 "VCVTUSI642SSZrr")>;
1235 def SKXWriteResGroup84 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort06,SKXPort0156]> {
1237 let NumMicroOps = 4;
1238 let ResourceCycles = [1,1,1,1];
1240 def: InstRW<[SKXWriteResGroup84], (instregex "SLDT(16|32|64)r")>;
1242 def SKXWriteResGroup86 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06]> {
1244 let NumMicroOps = 4;
1245 let ResourceCycles = [1,1,1,1];
1247 def: InstRW<[SKXWriteResGroup86], (instregex "BTC(16|32|64)mi8",
1250 "SAR(8|16|32|64)m(1|i)",
1251 "SHL(8|16|32|64)m(1|i)",
1252 "SHR(8|16|32|64)m(1|i)")>;
1254 def SKXWriteResGroup87 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort0156]> {
1256 let NumMicroOps = 4;
1257 let ResourceCycles = [1,1,1,1];
1259 def: InstRW<[SKXWriteResGroup87], (instregex "POP(16|32|64)rmm",
1260 "PUSH(16|32|64)rmm")>;
1262 def SKXWriteResGroup88 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
1264 let NumMicroOps = 6;
1265 let ResourceCycles = [1,5];
1267 def: InstRW<[SKXWriteResGroup88], (instrs STD)>;
1269 def SKXWriteResGroup89 : SchedWriteRes<[SKXPort23]> {
1271 let NumMicroOps = 1;
1272 let ResourceCycles = [1];
1274 def: InstRW<[SKXWriteResGroup89], (instregex "LD_F(32|64|80)m")>;
1275 def: InstRW<[SKXWriteResGroup89], (instrs VBROADCASTF128,
1285 def SKXWriteResGroup90 : SchedWriteRes<[SKXPort01,SKXPort5]> {
1287 let NumMicroOps = 2;
1288 let ResourceCycles = [1,1];
1290 def: InstRW<[SKXWriteResGroup90], (instrs VCVTDQ2PDYrr)>;
1292 def SKXWriteResGroup92 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1294 let NumMicroOps = 2;
1295 let ResourceCycles = [1,1];
1297 def: InstRW<[SKXWriteResGroup92], (instregex "VMOVSDZrm(b?)",
1300 def SKXWriteResGroup92a : SchedWriteRes<[SKXPort5,SKXPort23]> {
1302 let NumMicroOps = 2;
1303 let ResourceCycles = [1,1];
1305 def: InstRW<[SKXWriteResGroup92a], (instregex "(V?)PMOV(SX|ZX)BDrm",
1306 "(V?)PMOV(SX|ZX)BQrm",
1307 "(V?)PMOV(SX|ZX)BWrm",
1308 "(V?)PMOV(SX|ZX)DQrm",
1309 "(V?)PMOV(SX|ZX)WDrm",
1310 "(V?)PMOV(SX|ZX)WQrm")>;
1312 def SKXWriteResGroup93 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1314 let NumMicroOps = 2;
1315 let ResourceCycles = [1,1];
1317 def: InstRW<[SKXWriteResGroup93], (instregex "VCVTDQ2PDZ256rr",
1318 "VCVTPD2DQ(Y|Z256)rr",
1319 "VCVTPD2PS(Y|Z256)rr",
1321 "VCVTPS2PD(Y|Z256)rr",
1325 "VCVTTPD2DQ(Y|Z256)rr",
1326 "VCVTTPD2UDQZ256rr",
1328 "VCVTTPS2UQQZ256rr",
1330 "VCVTUQQ2PSZ256rr")>;
1332 def SKXWriteResGroup93z : SchedWriteRes<[SKXPort5,SKXPort05]> {
1334 let NumMicroOps = 2;
1335 let ResourceCycles = [1,1];
1337 def: InstRW<[SKXWriteResGroup93z], (instrs VCVTDQ2PDZrr,
1352 def SKXWriteResGroup95 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1354 let NumMicroOps = 2;
1355 let ResourceCycles = [1,1];
1357 def: InstRW<[SKXWriteResGroup95], (instrs VMOVNTDQAZ128rm,
1359 def: InstRW<[SKXWriteResGroup95], (instregex "VBLENDMPDZ128rm(b?)",
1360 "VBLENDMPSZ128rm(b?)",
1361 "VBROADCASTI32X2Z128m(b?)",
1362 "VBROADCASTSSZ128m(b?)",
1363 "VINSERT(F|I)128rm",
1364 "VMOVAPDZ128rm(b?)",
1365 "VMOVAPSZ128rm(b?)",
1366 "VMOVDDUPZ128rm(b?)",
1367 "VMOVDQA32Z128rm(b?)",
1368 "VMOVDQA64Z128rm(b?)",
1369 "VMOVDQU16Z128rm(b?)",
1370 "VMOVDQU32Z128rm(b?)",
1371 "VMOVDQU64Z128rm(b?)",
1372 "VMOVDQU8Z128rm(b?)",
1373 "VMOVSHDUPZ128rm(b?)",
1374 "VMOVSLDUPZ128rm(b?)",
1375 "VMOVUPDZ128rm(b?)",
1376 "VMOVUPSZ128rm(b?)",
1377 "VPADD(B|D|Q|W)Z128rm(b?)",
1378 "(V?)PADD(B|D|Q|W)rm",
1379 "VPBLENDM(B|D|Q|W)Z128rm(b?)",
1380 "VPBROADCASTDZ128m(b?)",
1381 "VPBROADCASTQZ128m(b?)",
1382 "VPSUB(B|D|Q|W)Z128rm(b?)",
1383 "(V?)PSUB(B|D|Q|W)rm",
1384 "VPTERNLOGDZ128rm(b?)i",
1385 "VPTERNLOGQZ128rm(b?)i")>;
1387 def SKXWriteResGroup96 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1389 let NumMicroOps = 3;
1390 let ResourceCycles = [2,1];
1392 def: InstRW<[SKXWriteResGroup96], (instrs MMX_PACKSSDWirm,
1396 def SKXWriteResGroup97 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1398 let NumMicroOps = 3;
1399 let ResourceCycles = [2,1];
1401 def: InstRW<[SKXWriteResGroup97], (instregex "VPERMI2W128rr",
1408 def SKXWriteResGroup99 : SchedWriteRes<[SKXPort23,SKXPort0156]> {
1410 let NumMicroOps = 3;
1411 let ResourceCycles = [1,2];
1413 def: InstRW<[SKXWriteResGroup99], (instrs LEAVE, LEAVE64,
1414 SCASB, SCASL, SCASQ, SCASW)>;
1416 def SKXWriteResGroup100 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort015]> {
1418 let NumMicroOps = 3;
1419 let ResourceCycles = [1,1,1];
1421 def: InstRW<[SKXWriteResGroup100], (instregex "VCVTSS2USI64Zrr",
1422 "(V?)CVTSS2SI64(Z?)rr",
1423 "(V?)CVTTSS2SI64(Z?)rr",
1424 "VCVTTSS2USI64Zrr")>;
1426 def SKXWriteResGroup101 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort05]> {
1428 let NumMicroOps = 3;
1429 let ResourceCycles = [1,1,1];
1431 def: InstRW<[SKXWriteResGroup101], (instrs FLDCW16m)>;
1433 def SKXWriteResGroup103 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort0156]> {
1435 let NumMicroOps = 3;
1436 let ResourceCycles = [1,1,1];
1438 def: InstRW<[SKXWriteResGroup103], (instregex "KMOV(B|D|Q|W)km")>;
1440 def SKXWriteResGroup104 : SchedWriteRes<[SKXPort6,SKXPort23,SKXPort0156]> {
1442 let NumMicroOps = 3;
1443 let ResourceCycles = [1,1,1];
1445 def: InstRW<[SKXWriteResGroup104], (instrs LRETQ, RETQ)>;
1447 def SKXWriteResGroup106 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort237]> {
1449 let NumMicroOps = 4;
1450 let ResourceCycles = [1,2,1];
1452 def: InstRW<[SKXWriteResGroup106], (instregex "VCOMPRESSPD(Z|Z128|Z256)mr(b?)",
1453 "VCOMPRESSPS(Z|Z128|Z256)mr(b?)",
1454 "VPCOMPRESSD(Z|Z128|Z256)mr(b?)",
1455 "VPCOMPRESSQ(Z|Z128|Z256)mr(b?)")>;
1457 def SKXWriteResGroup107 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06]> {
1459 let NumMicroOps = 5;
1460 let ResourceCycles = [1,1,1,2];
1462 def: InstRW<[SKXWriteResGroup107], (instregex "ROL(8|16|32|64)m(1|i)",
1463 "ROR(8|16|32|64)m(1|i)")>;
1465 def SKXWriteResGroup108 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort0156]> {
1467 let NumMicroOps = 5;
1468 let ResourceCycles = [1,1,1,2];
1470 def: InstRW<[SKXWriteResGroup108], (instregex "XADD(8|16|32|64)rm")>;
1472 def SKXWriteResGroup109 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort0156]> {
1474 let NumMicroOps = 5;
1475 let ResourceCycles = [1,1,1,1,1];
1477 def: InstRW<[SKXWriteResGroup109], (instregex "CALL(16|32|64)m")>;
1478 def: InstRW<[SKXWriteResGroup109], (instrs FARCALL64)>;
1480 def SKXWriteResGroup110 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237,SKXPort0156]> {
1482 let NumMicroOps = 7;
1483 let ResourceCycles = [1,2,2,2];
1485 def: InstRW<[SKXWriteResGroup110], (instrs VPSCATTERDQZ128mr,
1488 VSCATTERQPDZ128mr)>;
1490 def SKXWriteResGroup111 : SchedWriteRes<[SKXPort6,SKXPort06,SKXPort15,SKXPort0156]> {
1492 let NumMicroOps = 7;
1493 let ResourceCycles = [1,3,1,2];
1495 def: InstRW<[SKXWriteResGroup111], (instrs LOOP)>;
1497 def SKXWriteResGroup112 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237,SKXPort0156]> {
1499 let NumMicroOps = 11;
1500 let ResourceCycles = [1,4,4,2];
1502 def: InstRW<[SKXWriteResGroup112], (instrs VPSCATTERDQZ256mr,
1505 VSCATTERQPDZ256mr)>;
1507 def SKXWriteResGroup113 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237,SKXPort0156]> {
1509 let NumMicroOps = 19;
1510 let ResourceCycles = [1,8,8,2];
1512 def: InstRW<[SKXWriteResGroup113], (instrs VPSCATTERDQZmr,
1517 def SKXWriteResGroup114 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1519 let NumMicroOps = 36;
1520 let ResourceCycles = [1,16,1,16,2];
1522 def: InstRW<[SKXWriteResGroup114], (instrs VSCATTERDPSZmr)>;
1524 def SKXWriteResGroup118 : SchedWriteRes<[SKXPort1,SKXPort23]> {
1526 let NumMicroOps = 2;
1527 let ResourceCycles = [1,1];
1529 def: InstRW<[SKXWriteResGroup118], (instregex "PDEP(32|64)rm",
1532 def SKXWriteResGroup118_16_1 : SchedWriteRes<[SKXPort1, SKXPort0156, SKXPort23]> {
1534 let NumMicroOps = 3;
1535 let ResourceCycles = [1,1,1];
1537 def: InstRW<[SKXWriteResGroup118_16_1], (instrs IMUL16rm, IMUL16rmi, IMUL16rmi8)>;
1539 def SKXWriteResGroup118_16_2 : SchedWriteRes<[SKXPort1, SKXPort06, SKXPort0156, SKXPort23]> {
1541 let NumMicroOps = 5;
1542 let ResourceCycles = [1,1,2,1];
1544 def: InstRW<[SKXWriteResGroup118_16_2], (instrs IMUL16m, MUL16m)>;
1546 def SKXWriteResGroup119 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1548 let NumMicroOps = 2;
1549 let ResourceCycles = [1,1];
1551 def: InstRW<[SKXWriteResGroup119], (instregex "FCOM(P?)(32|64)m",
1552 "VFPCLASSSDZrm(b?)",
1553 "VPBROADCASTB(Z|Z256)m(b?)",
1554 "VPBROADCASTW(Z|Z256)m(b?)")>;
1555 def: InstRW<[SKXWriteResGroup119], (instrs VPBROADCASTBYrm,
1561 def SKXWriteResGroup121 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1563 let NumMicroOps = 2;
1564 let ResourceCycles = [1,1];
1566 def: InstRW<[SKXWriteResGroup121], (instrs VMOVNTDQAZ256rm,
1568 def: InstRW<[SKXWriteResGroup121], (instregex "VBLENDMPD(Z|Z256)rm(b?)",
1569 "VBLENDMPS(Z|Z256)rm(b?)",
1570 "VBROADCASTF32X2Z256m(b?)",
1571 "VBROADCASTF32X2Zm(b?)",
1572 "VBROADCASTF32X4Z256rm(b?)",
1573 "VBROADCASTF32X4rm(b?)",
1574 "VBROADCASTF32X8rm(b?)",
1575 "VBROADCASTF64X2Z128rm(b?)",
1576 "VBROADCASTF64X2rm(b?)",
1577 "VBROADCASTF64X4rm(b?)",
1578 "VBROADCASTI32X2Z256m(b?)",
1579 "VBROADCASTI32X2Zm(b?)",
1580 "VBROADCASTI32X4Z256rm(b?)",
1581 "VBROADCASTI32X4rm(b?)",
1582 "VBROADCASTI32X8rm(b?)",
1583 "VBROADCASTI64X2Z128rm(b?)",
1584 "VBROADCASTI64X2rm(b?)",
1585 "VBROADCASTI64X4rm(b?)",
1586 "VBROADCASTSD(Z|Z256)m(b?)",
1587 "VBROADCASTSS(Z|Z256)m(b?)",
1588 "VINSERTF32x4(Z|Z256)rm(b?)",
1589 "VINSERTF32x8Zrm(b?)",
1590 "VINSERTF64x2(Z|Z256)rm(b?)",
1591 "VINSERTF64x4Zrm(b?)",
1592 "VINSERTI32x4(Z|Z256)rm(b?)",
1593 "VINSERTI32x8Zrm(b?)",
1594 "VINSERTI64x2(Z|Z256)rm(b?)",
1595 "VINSERTI64x4Zrm(b?)",
1596 "VMOVAPD(Z|Z256)rm(b?)",
1597 "VMOVAPS(Z|Z256)rm(b?)",
1598 "VMOVDDUP(Z|Z256)rm(b?)",
1599 "VMOVDQA32(Z|Z256)rm(b?)",
1600 "VMOVDQA64(Z|Z256)rm(b?)",
1601 "VMOVDQU16(Z|Z256)rm(b?)",
1602 "VMOVDQU32(Z|Z256)rm(b?)",
1603 "VMOVDQU64(Z|Z256)rm(b?)",
1604 "VMOVDQU8(Z|Z256)rm(b?)",
1605 "VMOVSHDUP(Z|Z256)rm(b?)",
1606 "VMOVSLDUP(Z|Z256)rm(b?)",
1607 "VMOVUPD(Z|Z256)rm(b?)",
1608 "VMOVUPS(Z|Z256)rm(b?)",
1609 "VPADD(B|D|Q|W)Yrm",
1610 "VPADD(B|D|Q|W)(Z|Z256)rm(b?)",
1611 "VPBLENDM(B|D|Q|W)(Z|Z256)rm(b?)",
1612 "VPBROADCASTD(Z|Z256)m(b?)",
1613 "VPBROADCASTQ(Z|Z256)m(b?)",
1614 "VPSUB(B|D|Q|W)Yrm",
1615 "VPSUB(B|D|Q|W)(Z|Z256)rm(b?)",
1616 "VPTERNLOGD(Z|Z256)rm(b?)i",
1617 "VPTERNLOGQ(Z|Z256)rm(b?)i")>;
1619 def SKXWriteResGroup123 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
1621 let NumMicroOps = 4;
1622 let ResourceCycles = [1,2,1];
1624 def: InstRW<[SKXWriteResGroup123], (instregex "MMX_PH(ADD|SUB)SWrm")>;
1626 def SKXWriteResGroup126 : SchedWriteRes<[SKXPort23,SKXPort237,SKXPort06]> {
1628 let NumMicroOps = 5;
1629 let ResourceCycles = [1,1,3];
1631 def: InstRW<[SKXWriteResGroup126], (instregex "ROR(8|16|32|64)mCL")>;
1633 def SKXWriteResGroup127 : SchedWriteRes<[SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
1635 let NumMicroOps = 5;
1636 let ResourceCycles = [1,1,1,2];
1638 def: InstRW<[SKXWriteResGroup127], (instregex "RCL(8|16|32|64)m(1|i)",
1639 "RCR(8|16|32|64)m(1|i)")>;
1641 def SKXWriteResGroup128 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06]> {
1643 let NumMicroOps = 6;
1644 let ResourceCycles = [1,1,1,3];
1646 def: InstRW<[SKXWriteResGroup128], (instregex "ROL(8|16|32|64)mCL",
1647 "SAR(8|16|32|64)mCL",
1648 "SHL(8|16|32|64)mCL",
1649 "SHR(8|16|32|64)mCL")>;
1651 def SKXWriteResGroup130 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
1653 let NumMicroOps = 6;
1654 let ResourceCycles = [1,1,1,2,1];
1656 def: SchedAlias<WriteADCRMW, SKXWriteResGroup130>;
1658 def SKXWriteResGroup131 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1660 let NumMicroOps = 8;
1661 let ResourceCycles = [1,2,1,2,2];
1663 def: InstRW<[SKXWriteResGroup131], (instrs VPSCATTERQDZ128mr,
1666 VSCATTERQPSZ256mr)>;
1668 def SKXWriteResGroup132 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1670 let NumMicroOps = 12;
1671 let ResourceCycles = [1,4,1,4,2];
1673 def: InstRW<[SKXWriteResGroup132], (instrs VPSCATTERDDZ128mr,
1674 VSCATTERDPSZ128mr)>;
1676 def SKXWriteResGroup133 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1678 let NumMicroOps = 20;
1679 let ResourceCycles = [1,8,1,8,2];
1681 def: InstRW<[SKXWriteResGroup133], (instrs VPSCATTERDDZ256mr,
1682 VSCATTERDPSZ256mr)>;
1684 def SKXWriteResGroup134 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1686 let NumMicroOps = 36;
1687 let ResourceCycles = [1,16,1,16,2];
1689 def: InstRW<[SKXWriteResGroup134], (instrs VPSCATTERDDZmr)>;
1691 def SKXWriteResGroup135 : SchedWriteRes<[SKXPort0,SKXPort23]> {
1693 let NumMicroOps = 2;
1694 let ResourceCycles = [1,1];
1696 def: InstRW<[SKXWriteResGroup135], (instrs MMX_CVTPI2PSirm)>;
1698 def SKXWriteResGroup136 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1700 let NumMicroOps = 2;
1701 let ResourceCycles = [1,1];
1703 def: InstRW<[SKXWriteResGroup136], (instrs VPMOVSXBWYrm,
1707 def: InstRW<[SKXWriteResGroup136], (instregex "VALIGN(D|Q)Z128rm(b?)i",
1708 "VCMP(PD|PS)Z128rm(b?)i",
1710 "VFPCLASSSSZrm(b?)",
1711 "VPCMPBZ128rmi(b?)",
1712 "VPCMPDZ128rmi(b?)",
1713 "VPCMPEQ(B|D|Q|W)Z128rm(b?)",
1714 "VPCMPGT(B|D|Q|W)Z128rm(b?)",
1716 "VPCMPQZ128rmi(b?)",
1717 "VPCMPU(B|D|Q|W)Z128rmi(b?)",
1718 "VPCMPWZ128rmi(b?)",
1719 "VPERMI2D128rm(b?)",
1720 "VPERMI2PD128rm(b?)",
1721 "VPERMI2PS128rm(b?)",
1722 "VPERMI2Q128rm(b?)",
1723 "VPERMT2D128rm(b?)",
1724 "VPERMT2PD128rm(b?)",
1725 "VPERMT2PS128rm(b?)",
1726 "VPERMT2Q128rm(b?)",
1727 "VPMAXSQZ128rm(b?)",
1728 "VPMAXUQZ128rm(b?)",
1729 "VPMINSQZ128rm(b?)",
1730 "VPMINUQZ128rm(b?)",
1731 "VPMOVSXBDZ128rm(b?)",
1732 "VPMOVSXBQZ128rm(b?)",
1733 "VPMOVSXBWZ128rm(b?)",
1734 "VPMOVSXDQZ128rm(b?)",
1735 "VPMOVSXWDZ128rm(b?)",
1736 "VPMOVSXWQZ128rm(b?)",
1737 "VPMOVZXBDZ128rm(b?)",
1738 "VPMOVZXBQZ128rm(b?)",
1739 "VPMOVZXBWZ128rm(b?)",
1740 "VPMOVZXDQZ128rm(b?)",
1741 "VPMOVZXWDZ128rm(b?)",
1742 "VPMOVZXWQZ128rm(b?)",
1743 "VPTESTMBZ128rm(b?)",
1744 "VPTESTMDZ128rm(b?)",
1745 "VPTESTMQZ128rm(b?)",
1746 "VPTESTMWZ128rm(b?)",
1747 "VPTESTNMBZ128rm(b?)",
1748 "VPTESTNMDZ128rm(b?)",
1749 "VPTESTNMQZ128rm(b?)",
1750 "VPTESTNMWZ128rm(b?)")>;
1752 def SKXWriteResGroup137 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1754 let NumMicroOps = 2;
1755 let ResourceCycles = [1,1];
1757 def: InstRW<[SKXWriteResGroup137], (instregex "MMX_CVT(T?)PS2PIirm",
1760 def SKXWriteResGroup142 : SchedWriteRes<[SKXPort1,SKXPort5,SKXPort23]> {
1762 let NumMicroOps = 3;
1763 let ResourceCycles = [1,1,1];
1765 def: InstRW<[SKXWriteResGroup142], (instrs IMUL64m, MUL64m, MULX64rm)>;
1767 def SKXWriteResGroup143 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23]> {
1769 let NumMicroOps = 4;
1770 let ResourceCycles = [2,1,1];
1772 def: InstRW<[SKXWriteResGroup143], (instregex "(V?)PHADDSWrm",
1775 def SKXWriteResGroup146 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort23,SKXPort0156]> {
1777 let NumMicroOps = 5;
1778 let ResourceCycles = [1,2,1,1];
1780 def: InstRW<[SKXWriteResGroup146], (instregex "LAR(16|32|64)rm",
1781 "LSL(16|32|64)rm")>;
1783 def SKXWriteResGroup148 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1785 let NumMicroOps = 2;
1786 let ResourceCycles = [1,1];
1788 def: InstRW<[SKXWriteResGroup148], (instrs VPCMPGTQYrm)>;
1789 def: InstRW<[SKXWriteResGroup148], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1791 "VALIGND(Z|Z256)rm(b?)i",
1792 "VALIGNQ(Z|Z256)rm(b?)i",
1793 "VCMPPD(Z|Z256)rm(b?)i",
1794 "VCMPPS(Z|Z256)rm(b?)i",
1795 "VPCMPB(Z|Z256)rmi(b?)",
1796 "VPCMPD(Z|Z256)rmi(b?)",
1797 "VPCMPEQB(Z|Z256)rm(b?)",
1798 "VPCMPEQD(Z|Z256)rm(b?)",
1799 "VPCMPEQQ(Z|Z256)rm(b?)",
1800 "VPCMPEQW(Z|Z256)rm(b?)",
1801 "VPCMPGTB(Z|Z256)rm(b?)",
1802 "VPCMPGTD(Z|Z256)rm(b?)",
1803 "VPCMPGTQ(Z|Z256)rm(b?)",
1804 "VPCMPGTW(Z|Z256)rm(b?)",
1805 "VPCMPQ(Z|Z256)rmi(b?)",
1806 "VPCMPU(B|D|Q|W)Z256rmi(b?)",
1807 "VPCMPU(B|D|Q|W)Zrmi(b?)",
1808 "VPCMPW(Z|Z256)rmi(b?)",
1809 "VPMAXSQ(Z|Z256)rm(b?)",
1810 "VPMAXUQ(Z|Z256)rm(b?)",
1811 "VPMINSQ(Z|Z256)rm(b?)",
1812 "VPMINUQ(Z|Z256)rm(b?)",
1813 "VPTESTM(B|D|Q|W)Z256rm(b?)",
1814 "VPTESTM(B|D|Q|W)Zrm(b?)",
1815 "VPTESTNM(B|D|Q|W)Z256rm(b?)",
1816 "VPTESTNM(B|D|Q|W)Zrm(b?)")>;
1818 def SKXWriteResGroup149 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1820 let NumMicroOps = 2;
1821 let ResourceCycles = [1,1];
1823 def: InstRW<[SKXWriteResGroup149], (instregex "VCVTDQ2PDZ128rm(b?)",
1824 "VCVTDQ2PSZ128rm(b?)",
1826 "VCVTPD2QQZ128rm(b?)",
1827 "VCVTPD2UQQZ128rm(b?)",
1828 "VCVTPH2PSZ128rm(b?)",
1829 "VCVTPS2DQZ128rm(b?)",
1831 "VCVTPS2PDZ128rm(b?)",
1832 "VCVTPS2QQZ128rm(b?)",
1833 "VCVTPS2UDQZ128rm(b?)",
1834 "VCVTPS2UQQZ128rm(b?)",
1835 "VCVTQQ2PDZ128rm(b?)",
1836 "VCVTQQ2PSZ128rm(b?)",
1839 "VCVTTPD2QQZ128rm(b?)",
1840 "VCVTTPD2UQQZ128rm(b?)",
1841 "VCVTTPS2DQZ128rm(b?)",
1843 "VCVTTPS2QQZ128rm(b?)",
1844 "VCVTTPS2UDQZ128rm(b?)",
1845 "VCVTTPS2UQQZ128rm(b?)",
1846 "VCVTUDQ2PDZ128rm(b?)",
1847 "VCVTUDQ2PSZ128rm(b?)",
1848 "VCVTUQQ2PDZ128rm(b?)",
1849 "VCVTUQQ2PSZ128rm(b?)")>;
1851 def SKXWriteResGroup151 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1853 let NumMicroOps = 3;
1854 let ResourceCycles = [2,1];
1856 def: InstRW<[SKXWriteResGroup151], (instregex "VEXPANDPDZ128rm(b?)",
1857 "VEXPANDPSZ128rm(b?)",
1858 "VPEXPANDDZ128rm(b?)",
1859 "VPEXPANDQZ128rm(b?)")>;
1861 def SKXWriteResGroup153 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
1863 let NumMicroOps = 3;
1864 let ResourceCycles = [1,1,1];
1866 def: InstRW<[SKXWriteResGroup153], (instregex "(V?)CVTSD2SSrm")>;
1868 def SKXWriteResGroup154 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23]> {
1870 let NumMicroOps = 4;
1871 let ResourceCycles = [2,1,1];
1873 def: InstRW<[SKXWriteResGroup154], (instrs VPHADDSWYrm,
1876 def SKXWriteResGroup156 : SchedWriteRes<[SKXPort1,SKXPort23,SKXPort06,SKXPort0156]> {
1878 let NumMicroOps = 4;
1879 let ResourceCycles = [1,1,1,1];
1881 def: InstRW<[SKXWriteResGroup156], (instrs IMUL32m, MUL32m, MULX32rm)>;
1883 def SKXWriteResGroup157 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
1885 let NumMicroOps = 8;
1886 let ResourceCycles = [1,1,1,1,1,3];
1888 def: InstRW<[SKXWriteResGroup157], (instregex "XCHG(8|16|32|64)rm")>;
1890 def SKXWriteResGroup159 : SchedWriteRes<[SKXPort0,SKXFPDivider]> {
1892 let NumMicroOps = 1;
1893 let ResourceCycles = [1,3];
1895 def : SchedAlias<WriteFDivX, SKXWriteResGroup159>; // TODO - convert to ZnWriteResFpuPair
1897 def SKXWriteResGroup160 : SchedWriteRes<[SKXPort0,SKXPort23]> {
1899 let NumMicroOps = 2;
1900 let ResourceCycles = [1,1];
1902 def: InstRW<[SKXWriteResGroup160], (instregex "MUL_F(32|64)m")>;
1904 def SKXWriteResGroup161 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1906 let NumMicroOps = 2;
1907 let ResourceCycles = [1,1];
1909 def: InstRW<[SKXWriteResGroup161], (instrs VCVTDQ2PSYrm,
1911 def: InstRW<[SKXWriteResGroup161], (instregex "VCVTDQ2(PD|PS)(Z|Z256)rm(b?)",
1912 "VCVTPH2PS(Z|Z256)rm(b?)",
1913 "VCVTPS2PD(Z|Z256)rm(b?)",
1914 "VCVTQQ2PD(Z|Z256)rm(b?)",
1915 "VCVTQQ2PSZ256rm(b?)",
1916 "VCVT(T?)PD2QQ(Z|Z256)rm(b?)",
1917 "VCVT(T?)PD2UQQ(Z|Z256)rm(b?)",
1919 "VCVT(T?)PS2DQ(Z|Z256)rm(b?)",
1920 "VCVT(T?)PS2QQZ256rm(b?)",
1921 "VCVT(T?)PS2UDQ(Z|Z256)rm(b?)",
1922 "VCVT(T?)PS2UQQZ256rm(b?)",
1923 "VCVTUDQ2(PD|PS)(Z|Z256)rm(b?)",
1924 "VCVTUQQ2PD(Z|Z256)rm(b?)",
1925 "VCVTUQQ2PSZ256rm(b?)")>;
1927 def SKXWriteResGroup162 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1929 let NumMicroOps = 3;
1930 let ResourceCycles = [2,1];
1932 def: InstRW<[SKXWriteResGroup162], (instregex "FICOM(P?)(16|32)m",
1933 "VEXPANDPD(Z|Z256)rm(b?)",
1934 "VEXPANDPS(Z|Z256)rm(b?)",
1935 "VPEXPANDD(Z|Z256)rm(b?)",
1936 "VPEXPANDQ(Z|Z256)rm(b?)")>;
1938 def SKXWriteResGroup163 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1940 let NumMicroOps = 3;
1941 let ResourceCycles = [1,2];
1943 def: InstRW<[SKXWriteResGroup163], (instregex "VCVTSD2SSZrm")>;
1945 def SKXWriteResGroup164 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
1947 let NumMicroOps = 3;
1948 let ResourceCycles = [1,1,1];
1950 def: InstRW<[SKXWriteResGroup164], (instregex "(V?)CVTDQ2PDrm")>;
1952 def SKXWriteResGroup166 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
1954 let NumMicroOps = 3;
1955 let ResourceCycles = [1,1,1];
1957 def: InstRW<[SKXWriteResGroup166], (instrs CVTPD2PSrm,
1963 def SKXWriteResGroup167 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
1965 let NumMicroOps = 4;
1966 let ResourceCycles = [2,1,1];
1968 def: InstRW<[SKXWriteResGroup167], (instregex "VPCONFLICTQZ128rm(b?)")>;
1970 def SKXWriteResGroup169 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort0156]> {
1972 let NumMicroOps = 7;
1973 let ResourceCycles = [2,3,2];
1975 def: InstRW<[SKXWriteResGroup169], (instregex "RCL(16|32|64)rCL",
1976 "RCR(16|32|64)rCL")>;
1978 def SKXWriteResGroup170 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort15,SKXPort0156]> {
1980 let NumMicroOps = 9;
1981 let ResourceCycles = [1,5,1,2];
1983 def: InstRW<[SKXWriteResGroup170], (instrs RCL8rCL)>;
1985 def SKXWriteResGroup171 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
1987 let NumMicroOps = 11;
1988 let ResourceCycles = [2,9];
1990 def: InstRW<[SKXWriteResGroup171], (instrs LOOPE, LOOPNE)>;
1992 def SKXWriteResGroup174 : SchedWriteRes<[SKXPort01]> {
1994 let NumMicroOps = 3;
1995 let ResourceCycles = [3];
1997 def: InstRW<[SKXWriteResGroup174], (instregex "VPMULLQ(Z128|Z256)rr")>;
1999 def SKXWriteResGroup174z : SchedWriteRes<[SKXPort05]> {
2001 let NumMicroOps = 3;
2002 let ResourceCycles = [3];
2004 def: InstRW<[SKXWriteResGroup174z], (instregex "VPMULLQZrr")>;
2006 def SKXWriteResGroup175 : SchedWriteRes<[SKXPort5,SKXPort23]> {
2008 let NumMicroOps = 3;
2009 let ResourceCycles = [2,1];
2011 def: InstRW<[SKXWriteResGroup175], (instregex "VPERMWZ128rm(b?)")>;
2013 def SKXWriteResGroup176 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015]> {
2015 let NumMicroOps = 3;
2016 let ResourceCycles = [1,1,1];
2018 def: InstRW<[SKXWriteResGroup176], (instregex "VCVT(T?)SD2USIZrm(b?)",
2019 "VCVT(T?)SS2USI64Zrm(b?)")>;
2021 def SKXWriteResGroup177 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2023 let NumMicroOps = 3;
2024 let ResourceCycles = [1,1,1];
2026 def: InstRW<[SKXWriteResGroup177], (instregex "VCVT(T?)PS2QQZrm(b?)",
2027 "VCVT(T?)PS2UQQZrm(b?)")>;
2029 def SKXWriteResGroup179 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23,SKXPort015]> {
2031 let NumMicroOps = 4;
2032 let ResourceCycles = [1,1,1,1];
2034 def: InstRW<[SKXWriteResGroup179], (instregex "CVTTSS2SI64rm")>;
2036 def SKXWriteResGroup180 : SchedWriteRes<[SKXPort5,SKXPort23]> {
2038 let NumMicroOps = 3;
2039 let ResourceCycles = [2,1];
2041 def: InstRW<[SKXWriteResGroup180], (instregex "(ADD|SUB|SUBR)_FI(16|32)m",
2045 def SKXWriteResGroup181 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2047 let NumMicroOps = 3;
2048 let ResourceCycles = [1,1,1];
2050 def: InstRW<[SKXWriteResGroup181], (instrs VCVTDQ2PDYrm)>;
2052 def SKXWriteResGroup183 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2054 let NumMicroOps = 4;
2055 let ResourceCycles = [2,1,1];
2057 def: InstRW<[SKXWriteResGroup183], (instregex "VPERMI2W128rm(b?)",
2058 "VPERMT2W128rm(b?)")>;
2060 def SKXWriteResGroup184 : SchedWriteRes<[SKXPort0,SKXFPDivider]> {
2062 let NumMicroOps = 1;
2063 let ResourceCycles = [1,3];
2065 def : SchedAlias<WriteFDiv64, SKXWriteResGroup184>; // TODO - convert to ZnWriteResFpuPair
2066 def : SchedAlias<WriteFDiv64X, SKXWriteResGroup184>; // TODO - convert to ZnWriteResFpuPair
2068 def SKXWriteResGroup184_1 : SchedWriteRes<[SKXPort0,SKXFPDivider]> {
2070 let NumMicroOps = 1;
2071 let ResourceCycles = [1,5];
2073 def : SchedAlias<WriteFDiv64Y, SKXWriteResGroup184_1>; // TODO - convert to ZnWriteResFpuPair
2075 def SKXWriteResGroup187 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2077 let NumMicroOps = 3;
2078 let ResourceCycles = [1,1,1];
2080 def: InstRW<[SKXWriteResGroup187], (instregex "MUL_FI(16|32)m")>;
2082 def SKXWriteResGroup188 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2084 let NumMicroOps = 3;
2085 let ResourceCycles = [1,1,1];
2087 def: InstRW<[SKXWriteResGroup188], (instregex "VCVTPD2DQZrm(b?)",
2089 "VCVTPD2UDQZrm(b?)",
2091 "VCVTTPD2DQZrm(b?)",
2092 "VCVTTPD2UDQZrm(b?)",
2093 "VCVTUQQ2PSZrm(b?)")>;
2095 def SKXWriteResGroup189 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2097 let NumMicroOps = 4;
2098 let ResourceCycles = [2,1,1];
2100 def: InstRW<[SKXWriteResGroup189], (instregex "VPERMI2W256rm(b?)",
2102 "VPERMT2W256rm(b?)",
2105 def SKXWriteResGroup190 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort15,SKXPort0156]> {
2107 let NumMicroOps = 10;
2108 let ResourceCycles = [2,4,1,3];
2110 def: InstRW<[SKXWriteResGroup190], (instrs RCR8rCL)>;
2112 def SKXWriteResGroup191 : SchedWriteRes<[SKXPort0]> {
2114 let NumMicroOps = 1;
2115 let ResourceCycles = [1];
2117 def: InstRW<[SKXWriteResGroup191], (instregex "DIVR_(FPrST0|FST0r|FrST0)")>;
2119 def SKXWriteResGroup194 : SchedWriteRes<[SKXPort1,SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2121 let NumMicroOps = 8;
2122 let ResourceCycles = [1,2,2,1,2];
2124 def: InstRW<[SKXWriteResGroup194], (instregex "VPCONFLICTDZ128rm(b?)")>;
2126 def SKXWriteResGroup195 : SchedWriteRes<[SKXPort1,SKXPort23,SKXPort237,SKXPort06,SKXPort15,SKXPort0156]> {
2128 let NumMicroOps = 10;
2129 let ResourceCycles = [1,1,1,5,1,1];
2131 def: InstRW<[SKXWriteResGroup195], (instregex "RCL(8|16|32|64)mCL")>;
2133 def SKXWriteResGroup199 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06,SKXPort15,SKXPort0156]> {
2135 let NumMicroOps = 14;
2136 let ResourceCycles = [1,1,1,4,2,5];
2138 def: InstRW<[SKXWriteResGroup199], (instrs CMPXCHG8B)>;
2140 def SKXWriteResGroup200 : SchedWriteRes<[SKXPort0156]> {
2142 let NumMicroOps = 16;
2143 let ResourceCycles = [16];
2145 def: InstRW<[SKXWriteResGroup200], (instrs VZEROALL)>;
2147 def SKXWriteResGroup201 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2149 let NumMicroOps = 2;
2150 let ResourceCycles = [1,1,5];
2152 def : SchedAlias<WriteFDivXLd, SKXWriteResGroup201>; // TODO - convert to ZnWriteResFpuPair
2154 def SKXWriteResGroup202 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort05,SKXPort0156]> {
2156 let NumMicroOps = 15;
2157 let ResourceCycles = [2,1,2,4,2,4];
2159 def: InstRW<[SKXWriteResGroup202], (instrs XCH_F)>;
2161 def SKXWriteResGroup205 : SchedWriteRes<[SKXPort23,SKXPort015]> {
2163 let NumMicroOps = 4;
2164 let ResourceCycles = [1,3];
2166 def: InstRW<[SKXWriteResGroup205], (instregex "VPMULLQZ128rm(b?)")>;
2168 def SKXWriteResGroup207 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort06,SKXPort0156]> {
2170 let NumMicroOps = 8;
2171 let ResourceCycles = [1,1,1,5];
2173 def: InstRW<[SKXWriteResGroup207], (instrs CPUID, RDTSC)>;
2175 def SKXWriteResGroup208 : SchedWriteRes<[SKXPort1,SKXPort23,SKXPort237,SKXPort06,SKXPort15,SKXPort0156]> {
2177 let NumMicroOps = 11;
2178 let ResourceCycles = [2,1,1,4,1,2];
2180 def: InstRW<[SKXWriteResGroup208], (instregex "RCR(8|16|32|64)mCL")>;
2182 def SKXWriteResGroup209 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2184 let NumMicroOps = 2;
2185 let ResourceCycles = [1,1,4];
2187 def : SchedAlias<WriteFDiv64Ld, SKXWriteResGroup209>; // TODO - convert to ZnWriteResFpuPair
2189 def SKXWriteResGroup211 : SchedWriteRes<[SKXPort23,SKXPort015]> {
2191 let NumMicroOps = 4;
2192 let ResourceCycles = [1,3];
2194 def: InstRW<[SKXWriteResGroup211], (instregex "VPMULLQZ256rm(b?)",
2197 def SKXWriteResGroup214 : SchedWriteRes<[]> {
2199 let NumMicroOps = 0;
2201 def: InstRW<[SKXWriteResGroup214], (instrs VGATHERDPSZ128rm,
2205 def SKXWriteResGroup215 : SchedWriteRes<[SKXPort0]> {
2207 let NumMicroOps = 1;
2208 let ResourceCycles = [1];
2210 def: InstRW<[SKXWriteResGroup215], (instregex "DIV_(FPrST0|FST0r|FrST0)")>;
2212 def SKXWriteResGroup216 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2214 let NumMicroOps = 2;
2215 let ResourceCycles = [1,1,4];
2217 def : SchedAlias<WriteFDiv64XLd, SKXWriteResGroup216>; // TODO - convert to ZnWriteResFpuPair
2219 def SKXWriteResGroup218 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2221 let NumMicroOps = 5;
2222 let ResourceCycles = [1,2,1,1];
2224 def: InstRW<[SKXWriteResGroup218], (instrs VGATHERQPSZ128rm,
2229 def SKXWriteResGroup219 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort6,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
2231 let NumMicroOps = 8;
2232 let ResourceCycles = [1,1,1,1,1,1,2];
2234 def: InstRW<[SKXWriteResGroup219], (instrs INSB, INSL, INSW)>;
2236 def SKXWriteResGroup220 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort0156]> {
2238 let NumMicroOps = 10;
2239 let ResourceCycles = [1,2,7];
2241 def: InstRW<[SKXWriteResGroup220], (instrs MWAITrr)>;
2243 def SKXWriteResGroup222 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2245 let NumMicroOps = 2;
2246 let ResourceCycles = [1,1,8];
2248 def : SchedAlias<WriteFDiv64YLd, SKXWriteResGroup222>; // TODO - convert to ZnWriteResFpuPair
2250 def SKXWriteResGroup223 : SchedWriteRes<[SKXPort0,SKXPort23]> {
2252 let NumMicroOps = 2;
2253 let ResourceCycles = [1,1];
2255 def: InstRW<[SKXWriteResGroup223], (instregex "DIV_F(32|64)m")>;
2257 def SKXWriteResGroup224 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2259 let NumMicroOps = 5;
2260 let ResourceCycles = [1,2,1,1];
2262 def: InstRW<[SKXWriteResGroup224], (instrs VGATHERDPDZ128rm,
2267 def SKXWriteResGroup224_2 : SchedWriteRes<[SKXPort0, SKXPort23, SKXPort5, SKXPort015]> {
2269 let NumMicroOps = 5;
2270 let ResourceCycles = [1,2,1,1];
2272 def: InstRW<[SKXWriteResGroup224_2], (instrs VGATHERDPSrm,
2289 def SKXWriteResGroup224_3 : SchedWriteRes<[SKXPort0, SKXPort23, SKXPort5, SKXPort015]> {
2291 let NumMicroOps = 5;
2292 let ResourceCycles = [1,2,1,1];
2294 def: InstRW<[SKXWriteResGroup224_3], (instrs VGATHERDPSYrm,
2309 def SKXWriteResGroup225 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort015]> {
2311 let NumMicroOps = 14;
2312 let ResourceCycles = [5,5,4];
2314 def: InstRW<[SKXWriteResGroup225], (instregex "VPCONFLICTDZ128rr",
2315 "VPCONFLICTQZ256rr")>;
2317 def SKXWriteResGroup228 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
2319 let NumMicroOps = 19;
2320 let ResourceCycles = [2,1,4,1,1,4,6];
2322 def: InstRW<[SKXWriteResGroup228], (instrs CMPXCHG16B)>;
2324 def SKXWriteResGroup233 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2326 let NumMicroOps = 3;
2327 let ResourceCycles = [1,1,1];
2329 def: InstRW<[SKXWriteResGroup233], (instregex "DIV_FI(16|32)m")>;
2331 def SKXWriteResGroup234 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2333 let NumMicroOps = 5;
2334 let ResourceCycles = [1,2,1,1];
2336 def: InstRW<[SKXWriteResGroup234], (instrs VGATHERDPDZ256rm,
2342 def SKXWriteResGroup238 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2344 let NumMicroOps = 5;
2345 let ResourceCycles = [1,2,1,1];
2347 def: InstRW<[SKXWriteResGroup238], (instrs VGATHERDPDZrm,
2352 def SKXWriteResGroup239 : SchedWriteRes<[SKXPort0,SKXPort23]> {
2354 let NumMicroOps = 2;
2355 let ResourceCycles = [1,1];
2357 def: InstRW<[SKXWriteResGroup239], (instregex "DIVR_F(32|64)m")>;
2359 def SKXWriteResGroup240 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2361 let NumMicroOps = 5;
2362 let ResourceCycles = [1,2,1,1];
2364 def: InstRW<[SKXWriteResGroup240], (instrs VGATHERDPSZ256rm,
2367 def SKXWriteResGroup241 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23,SKXPort0156]> {
2369 let NumMicroOps = 8;
2370 let ResourceCycles = [2,4,1,1];
2372 def: InstRW<[SKXWriteResGroup241], (instregex "IDIV(8|16|32|64)m")>;
2374 def SKXWriteResGroup242 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2376 let NumMicroOps = 15;
2377 let ResourceCycles = [5,5,1,4];
2379 def: InstRW<[SKXWriteResGroup242], (instregex "VPCONFLICTQZ256rm(b?)")>;
2381 def SKXWriteResGroup243 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2383 let NumMicroOps = 3;
2384 let ResourceCycles = [1,1,1];
2386 def: InstRW<[SKXWriteResGroup243], (instregex "DIVR_FI(16|32)m")>;
2388 def SKXWriteResGroup245 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2390 let NumMicroOps = 5;
2391 let ResourceCycles = [1,2,1,1];
2393 def: InstRW<[SKXWriteResGroup245], (instrs VGATHERDPSZrm,
2396 def SKXWriteResGroup247 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort23,SKXPort06,SKXPort0156]> {
2398 let NumMicroOps = 23;
2399 let ResourceCycles = [1,5,3,4,10];
2401 def: InstRW<[SKXWriteResGroup247], (instregex "IN(8|16|32)ri",
2404 def SKXWriteResGroup248 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
2406 let NumMicroOps = 23;
2407 let ResourceCycles = [1,5,2,1,4,10];
2409 def: InstRW<[SKXWriteResGroup248], (instregex "OUT(8|16|32)ir",
2412 def SKXWriteResGroup249 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort015]> {
2414 let NumMicroOps = 21;
2415 let ResourceCycles = [9,7,5];
2417 def: InstRW<[SKXWriteResGroup249], (instregex "VPCONFLICTDZ256rr",
2420 def SKXWriteResGroup250 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort23,SKXPort0156]> {
2422 let NumMicroOps = 31;
2423 let ResourceCycles = [1,8,1,21];
2425 def: InstRW<[SKXWriteResGroup250], (instregex "XRSTOR(64)?")>;
2427 def SKXWriteResGroup252 : SchedWriteRes<[SKXPort1,SKXPort4,SKXPort5,SKXPort6,SKXPort23,SKXPort237,SKXPort15,SKXPort0156]> {
2429 let NumMicroOps = 18;
2430 let ResourceCycles = [1,1,2,3,1,1,1,8];
2432 def: InstRW<[SKXWriteResGroup252], (instrs VMCLEARm)>;
2434 def SKXWriteResGroup253 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort0156]> {
2436 let NumMicroOps = 39;
2437 let ResourceCycles = [1,10,1,1,26];
2439 def: InstRW<[SKXWriteResGroup253], (instrs XSAVE64)>;
2441 def SKXWriteResGroup254 : SchedWriteRes<[SKXPort5,SKXPort0156]> {
2443 let NumMicroOps = 22;
2444 let ResourceCycles = [2,20];
2446 def: InstRW<[SKXWriteResGroup254], (instrs RDTSCP)>;
2448 def SKXWriteResGroup255 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort0156]> {
2450 let NumMicroOps = 40;
2451 let ResourceCycles = [1,11,1,1,26];
2453 def: InstRW<[SKXWriteResGroup255], (instrs XSAVE)>;
2454 def: InstRW<[SKXWriteResGroup255], (instregex "XSAVEC", "XSAVES", "XSAVEOPT")>;
2456 def SKXWriteResGroup256 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2458 let NumMicroOps = 22;
2459 let ResourceCycles = [9,7,1,5];
2461 def: InstRW<[SKXWriteResGroup256], (instregex "VPCONFLICTDZ256rm(b?)",
2462 "VPCONFLICTQZrm(b?)")>;
2464 def SKXWriteResGroup258 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort05,SKXPort06,SKXPort0156]> {
2466 let NumMicroOps = 64;
2467 let ResourceCycles = [2,8,5,10,39];
2469 def: InstRW<[SKXWriteResGroup258], (instrs FLDENVm)>;
2471 def SKXWriteResGroup259 : SchedWriteRes<[SKXPort0,SKXPort6,SKXPort23,SKXPort05,SKXPort06,SKXPort15,SKXPort0156]> {
2473 let NumMicroOps = 88;
2474 let ResourceCycles = [4,4,31,1,2,1,45];
2476 def: InstRW<[SKXWriteResGroup259], (instrs FXRSTOR64)>;
2478 def SKXWriteResGroup260 : SchedWriteRes<[SKXPort0,SKXPort6,SKXPort23,SKXPort05,SKXPort06,SKXPort15,SKXPort0156]> {
2480 let NumMicroOps = 90;
2481 let ResourceCycles = [4,2,33,1,2,1,47];
2483 def: InstRW<[SKXWriteResGroup260], (instrs FXRSTOR)>;
2485 def SKXWriteResGroup261 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort015]> {
2487 let NumMicroOps = 35;
2488 let ResourceCycles = [17,11,7];
2490 def: InstRW<[SKXWriteResGroup261], (instregex "VPCONFLICTDZrr")>;
2492 def SKXWriteResGroup262 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2494 let NumMicroOps = 36;
2495 let ResourceCycles = [17,11,1,7];
2497 def: InstRW<[SKXWriteResGroup262], (instregex "VPCONFLICTDZrm(b?)")>;
2499 def SKXWriteResGroup263 : SchedWriteRes<[SKXPort5,SKXPort05,SKXPort0156]> {
2501 let NumMicroOps = 15;
2502 let ResourceCycles = [6,3,6];
2504 def: InstRW<[SKXWriteResGroup263], (instrs FNINIT)>;
2506 def SKXWriteResGroup264 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort05,SKXPort0156]> {
2508 let NumMicroOps = 32;
2509 let ResourceCycles = [7,2,8,3,1,11];
2511 def: InstRW<[SKXWriteResGroup264], (instregex "DIV(16|32|64)r")>;
2513 def SKXWriteResGroup265 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort06,SKXPort0156]> {
2515 let NumMicroOps = 66;
2516 let ResourceCycles = [4,2,4,8,14,34];
2518 def: InstRW<[SKXWriteResGroup265], (instregex "IDIV(16|32|64)r")>;
2520 def SKXWriteResGroup266 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort4,SKXPort5,SKXPort6,SKXPort237,SKXPort06,SKXPort0156]> {
2522 let NumMicroOps = 100;
2523 let ResourceCycles = [9,1,11,16,1,11,21,30];
2525 def: InstRW<[SKXWriteResGroup266], (instrs FSTENVm)>;
2527 def SKXWriteResGroup267 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
2529 let NumMicroOps = 4;
2530 let ResourceCycles = [1,3];
2532 def: InstRW<[SKXWriteResGroup267], (instrs PAUSE)>;
2534 def: InstRW<[WriteZero], (instrs CLC)>;