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 // Integer 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 // Vector loads are 5/6/7 cycles, so ReadAfterVec*Ld registers needn't be available
79 // until 5/6/7 cycles after the memory operand.
80 def : ReadAdvance<ReadAfterVecLd, 5>;
81 def : ReadAdvance<ReadAfterVecXLd, 6>;
82 def : ReadAdvance<ReadAfterVecYLd, 7>;
84 // Many SchedWrites are defined in pairs with and without a folded load.
85 // Instructions with folded loads are usually micro-fused, so they only appear
86 // as two micro-ops when queued in the reservation station.
87 // This multiclass defines the resource usage for variants with and without
89 multiclass SKXWriteResPair<X86FoldableSchedWrite SchedRW,
90 list<ProcResourceKind> ExePorts,
91 int Lat, list<int> Res = [1], int UOps = 1,
93 // Register variant is using a single cycle on ExePort.
94 def : WriteRes<SchedRW, ExePorts> {
96 let ResourceCycles = Res;
97 let NumMicroOps = UOps;
100 // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to
101 // the latency (default = 5).
102 def : WriteRes<SchedRW.Folded, !listconcat([SKXPort23], ExePorts)> {
103 let Latency = !add(Lat, LoadLat);
104 let ResourceCycles = !listconcat([1], Res);
105 let NumMicroOps = !add(UOps, 1);
109 // A folded store needs a cycle on port 4 for the store data, and an extra port
110 // 2/3/7 cycle to recompute the address.
111 def : WriteRes<WriteRMW, [SKXPort237,SKXPort4]>;
114 defm : SKXWriteResPair<WriteALU, [SKXPort0156], 1>; // Simple integer ALU op.
115 defm : SKXWriteResPair<WriteADC, [SKXPort06], 1>; // Integer ALU + flags op.
117 // Integer multiplication.
118 defm : SKXWriteResPair<WriteIMul8, [SKXPort1], 3>;
119 defm : SKXWriteResPair<WriteIMul16, [SKXPort1,SKXPort06,SKXPort0156], 4, [1,1,2], 4>;
120 defm : X86WriteRes<WriteIMul16Imm, [SKXPort1,SKXPort0156], 4, [1,1], 2>;
121 defm : X86WriteRes<WriteIMul16ImmLd, [SKXPort1,SKXPort0156,SKXPort23], 8, [1,1,1], 3>;
122 defm : X86WriteRes<WriteIMul16Reg, [SKXPort1], 3, [1], 1>;
123 defm : X86WriteRes<WriteIMul16RegLd, [SKXPort1,SKXPort0156,SKXPort23], 8, [1,1,1], 3>;
124 defm : SKXWriteResPair<WriteIMul32, [SKXPort1,SKXPort06,SKXPort0156], 4, [1,1,1], 3>;
125 defm : SKXWriteResPair<WriteIMul32Imm, [SKXPort1], 3>;
126 defm : SKXWriteResPair<WriteIMul32Reg, [SKXPort1], 3>;
127 defm : SKXWriteResPair<WriteIMul64, [SKXPort1,SKXPort5], 4, [1,1], 2>;
128 defm : SKXWriteResPair<WriteIMul64Imm, [SKXPort1], 3>;
129 defm : SKXWriteResPair<WriteIMul64Reg, [SKXPort1], 3>;
130 def : WriteRes<WriteIMulH, []> { let Latency = 3; }
132 defm : X86WriteRes<WriteBSWAP32, [SKXPort15], 1, [1], 1>;
133 defm : X86WriteRes<WriteBSWAP64, [SKXPort06, SKXPort15], 2, [1,1], 2>;
134 defm : X86WriteRes<WriteCMPXCHG,[SKXPort06, SKXPort0156], 5, [2,3], 5>;
135 defm : X86WriteRes<WriteCMPXCHGRMW,[SKXPort23,SKXPort06,SKXPort0156,SKXPort237,SKXPort4], 8, [1,2,1,1,1], 6>;
136 defm : X86WriteRes<WriteXCHG, [SKXPort0156], 2, [3], 3>;
138 // TODO: Why isn't the SKXDivider used?
139 defm : SKXWriteResPair<WriteDiv8, [SKXPort0, SKXDivider], 25, [1,10], 1, 4>;
140 defm : X86WriteRes<WriteDiv16, [SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort05,SKXPort0156], 76, [7,2,8,3,1,11], 32>;
141 defm : X86WriteRes<WriteDiv32, [SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort05,SKXPort0156], 76, [7,2,8,3,1,11], 32>;
142 defm : X86WriteRes<WriteDiv64, [SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort05,SKXPort0156], 76, [7,2,8,3,1,11], 32>;
143 defm : X86WriteRes<WriteDiv16Ld, [SKXPort0,SKXPort23,SKXDivider], 29, [1,1,10], 2>;
144 defm : X86WriteRes<WriteDiv32Ld, [SKXPort0,SKXPort23,SKXDivider], 29, [1,1,10], 2>;
145 defm : X86WriteRes<WriteDiv64Ld, [SKXPort0,SKXPort23,SKXDivider], 29, [1,1,10], 2>;
147 defm : X86WriteRes<WriteIDiv8, [SKXPort0, SKXDivider], 25, [1,10], 1>;
148 defm : X86WriteRes<WriteIDiv16, [SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort06,SKXPort0156], 102, [4,2,4,8,14,34], 66>;
149 defm : X86WriteRes<WriteIDiv32, [SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort06,SKXPort0156], 102, [4,2,4,8,14,34], 66>;
150 defm : X86WriteRes<WriteIDiv64, [SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort06,SKXPort0156], 102, [4,2,4,8,14,34], 66>;
151 defm : X86WriteRes<WriteIDiv8Ld, [SKXPort0,SKXPort5,SKXPort23,SKXPort0156], 28, [2,4,1,1], 8>;
152 defm : X86WriteRes<WriteIDiv16Ld, [SKXPort0,SKXPort5,SKXPort23,SKXPort0156], 28, [2,4,1,1], 8>;
153 defm : X86WriteRes<WriteIDiv32Ld, [SKXPort0,SKXPort5,SKXPort23,SKXPort0156], 28, [2,4,1,1], 8>;
154 defm : X86WriteRes<WriteIDiv64Ld, [SKXPort0,SKXPort5,SKXPort23,SKXPort0156], 28, [2,4,1,1], 8>;
156 defm : SKXWriteResPair<WriteCRC32, [SKXPort1], 3>;
158 def : WriteRes<WriteLEA, [SKXPort15]>; // LEA instructions can't fold loads.
160 defm : SKXWriteResPair<WriteCMOV, [SKXPort06], 1, [1], 1>; // Conditional move.
161 defm : SKXWriteResPair<WriteCMOV2, [SKXPort06], 2, [2], 2>; // Conditional (CF + ZF flag) move.
162 defm : X86WriteRes<WriteFCMOV, [SKXPort1], 3, [1], 1>; // x87 conditional move.
163 def : WriteRes<WriteSETCC, [SKXPort06]>; // Setcc.
164 def : WriteRes<WriteSETCCStore, [SKXPort06,SKXPort4,SKXPort237]> {
168 defm : X86WriteRes<WriteLAHFSAHF, [SKXPort06], 1, [1], 1>;
169 defm : X86WriteRes<WriteBitTest, [SKXPort06], 1, [1], 1>;
170 defm : X86WriteRes<WriteBitTestImmLd, [SKXPort06,SKXPort23], 6, [1,1], 2>;
171 defm : X86WriteRes<WriteBitTestRegLd, [SKXPort0156,SKXPort23], 6, [1,1], 2>;
172 defm : X86WriteRes<WriteBitTestSet, [SKXPort06], 1, [1], 1>;
173 defm : X86WriteRes<WriteBitTestSetImmLd, [SKXPort06,SKXPort23], 5, [1,1], 3>;
174 defm : X86WriteRes<WriteBitTestSetRegLd, [SKXPort0156,SKXPort23], 5, [1,1], 2>;
176 // Integer shifts and rotates.
177 defm : SKXWriteResPair<WriteShift, [SKXPort06], 1>;
178 defm : SKXWriteResPair<WriteShiftCL, [SKXPort06], 3, [3], 3>;
179 defm : SKXWriteResPair<WriteRotate, [SKXPort06], 2, [2], 2>;
180 defm : SKXWriteResPair<WriteRotateCL, [SKXPort06], 3, [3], 3>;
183 defm : X86WriteRes<WriteSHDrri, [SKXPort1], 3, [1], 1>;
184 defm : X86WriteRes<WriteSHDrrcl,[SKXPort1,SKXPort06,SKXPort0156], 6, [1, 2, 1], 4>;
185 defm : X86WriteRes<WriteSHDmri, [SKXPort1,SKXPort23,SKXPort237,SKXPort0156], 9, [1, 1, 1, 1], 4>;
186 defm : X86WriteRes<WriteSHDmrcl,[SKXPort1,SKXPort23,SKXPort237,SKXPort06,SKXPort0156], 11, [1, 1, 1, 2, 1], 6>;
189 defm : SKXWriteResPair<WriteBSF, [SKXPort1], 3>;
190 defm : SKXWriteResPair<WriteBSR, [SKXPort1], 3>;
191 defm : SKXWriteResPair<WriteLZCNT, [SKXPort1], 3>;
192 defm : SKXWriteResPair<WriteTZCNT, [SKXPort1], 3>;
193 defm : SKXWriteResPair<WritePOPCNT, [SKXPort1], 3>;
195 // BMI1 BEXTR/BLS, BMI2 BZHI
196 defm : SKXWriteResPair<WriteBEXTR, [SKXPort06,SKXPort15], 2, [1,1], 2>;
197 defm : SKXWriteResPair<WriteBLS, [SKXPort15], 1>;
198 defm : SKXWriteResPair<WriteBZHI, [SKXPort15], 1>;
200 // Loads, stores, and moves, not folded with other operations.
201 defm : X86WriteRes<WriteLoad, [SKXPort23], 5, [1], 1>;
202 defm : X86WriteRes<WriteStore, [SKXPort237, SKXPort4], 1, [1,1], 1>;
203 defm : X86WriteRes<WriteStoreNT, [SKXPort237, SKXPort4], 1, [1,1], 2>;
204 defm : X86WriteRes<WriteMove, [SKXPort0156], 1, [1], 1>;
206 // Idioms that clear a register, like xorps %xmm0, %xmm0.
207 // These can often bypass execution ports completely.
208 def : WriteRes<WriteZero, []>;
210 // Branches don't produce values, so they have no latency, but they still
211 // consume resources. Indirect branches can fold loads.
212 defm : SKXWriteResPair<WriteJump, [SKXPort06], 1>;
214 // Floating point. This covers both scalar and vector operations.
215 defm : X86WriteRes<WriteFLD0, [SKXPort05], 1, [1], 1>;
216 defm : X86WriteRes<WriteFLD1, [SKXPort05], 1, [2], 2>;
217 defm : X86WriteRes<WriteFLDC, [SKXPort05], 1, [2], 2>;
218 defm : X86WriteRes<WriteFLoad, [SKXPort23], 5, [1], 1>;
219 defm : X86WriteRes<WriteFLoadX, [SKXPort23], 6, [1], 1>;
220 defm : X86WriteRes<WriteFLoadY, [SKXPort23], 7, [1], 1>;
221 defm : X86WriteRes<WriteFMaskedLoad, [SKXPort23,SKXPort015], 7, [1,1], 2>;
222 defm : X86WriteRes<WriteFMaskedLoadY, [SKXPort23,SKXPort015], 8, [1,1], 2>;
223 defm : X86WriteRes<WriteFStore, [SKXPort237,SKXPort4], 1, [1,1], 2>;
224 defm : X86WriteRes<WriteFStoreX, [SKXPort237,SKXPort4], 1, [1,1], 2>;
225 defm : X86WriteRes<WriteFStoreY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
226 defm : X86WriteRes<WriteFStoreNT, [SKXPort237,SKXPort4], 1, [1,1], 2>;
227 defm : X86WriteRes<WriteFStoreNTX, [SKXPort237,SKXPort4], 1, [1,1], 2>;
228 defm : X86WriteRes<WriteFStoreNTY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
229 defm : X86WriteRes<WriteFMaskedStore, [SKXPort237,SKXPort0], 2, [1,1], 2>;
230 defm : X86WriteRes<WriteFMaskedStoreY, [SKXPort237,SKXPort0], 2, [1,1], 2>;
231 defm : X86WriteRes<WriteFMove, [SKXPort015], 1, [1], 1>;
232 defm : X86WriteRes<WriteFMoveX, [SKXPort015], 1, [1], 1>;
233 defm : X86WriteRes<WriteFMoveY, [SKXPort015], 1, [1], 1>;
234 defm : X86WriteRes<WriteEMMS, [SKXPort05,SKXPort0156], 10, [9,1], 10>;
236 defm : SKXWriteResPair<WriteFAdd, [SKXPort01], 4, [1], 1, 5>; // Floating point add/sub.
237 defm : SKXWriteResPair<WriteFAddX, [SKXPort01], 4, [1], 1, 6>;
238 defm : SKXWriteResPair<WriteFAddY, [SKXPort01], 4, [1], 1, 7>;
239 defm : SKXWriteResPair<WriteFAddZ, [SKXPort05], 4, [1], 1, 7>;
240 defm : SKXWriteResPair<WriteFAdd64, [SKXPort01], 4, [1], 1, 5>; // Floating point double add/sub.
241 defm : SKXWriteResPair<WriteFAdd64X, [SKXPort01], 4, [1], 1, 6>;
242 defm : SKXWriteResPair<WriteFAdd64Y, [SKXPort01], 4, [1], 1, 7>;
243 defm : SKXWriteResPair<WriteFAdd64Z, [SKXPort05], 4, [1], 1, 7>;
245 defm : SKXWriteResPair<WriteFCmp, [SKXPort01], 4, [1], 1, 5>; // Floating point compare.
246 defm : SKXWriteResPair<WriteFCmpX, [SKXPort01], 4, [1], 1, 6>;
247 defm : SKXWriteResPair<WriteFCmpY, [SKXPort01], 4, [1], 1, 7>;
248 defm : SKXWriteResPair<WriteFCmpZ, [SKXPort05], 4, [1], 1, 7>;
249 defm : SKXWriteResPair<WriteFCmp64, [SKXPort01], 4, [1], 1, 5>; // Floating point double compare.
250 defm : SKXWriteResPair<WriteFCmp64X, [SKXPort01], 4, [1], 1, 6>;
251 defm : SKXWriteResPair<WriteFCmp64Y, [SKXPort01], 4, [1], 1, 7>;
252 defm : SKXWriteResPair<WriteFCmp64Z, [SKXPort05], 4, [1], 1, 7>;
254 defm : SKXWriteResPair<WriteFCom, [SKXPort0], 2>; // Floating point compare to flags.
256 defm : SKXWriteResPair<WriteFMul, [SKXPort01], 4, [1], 1, 5>; // Floating point multiplication.
257 defm : SKXWriteResPair<WriteFMulX, [SKXPort01], 4, [1], 1, 6>;
258 defm : SKXWriteResPair<WriteFMulY, [SKXPort01], 4, [1], 1, 7>;
259 defm : SKXWriteResPair<WriteFMulZ, [SKXPort05], 4, [1], 1, 7>;
260 defm : SKXWriteResPair<WriteFMul64, [SKXPort01], 4, [1], 1, 5>; // Floating point double multiplication.
261 defm : SKXWriteResPair<WriteFMul64X, [SKXPort01], 4, [1], 1, 6>;
262 defm : SKXWriteResPair<WriteFMul64Y, [SKXPort01], 4, [1], 1, 7>;
263 defm : SKXWriteResPair<WriteFMul64Z, [SKXPort05], 4, [1], 1, 7>;
265 defm : SKXWriteResPair<WriteFDiv, [SKXPort0,SKXFPDivider], 11, [1,3], 1, 5>; // 10-14 cycles. // Floating point division.
266 //defm : SKXWriteResPair<WriteFDivX, [SKXPort0,SKXFPDivider], 11, [1,3], 1, 6>; // 10-14 cycles.
267 defm : SKXWriteResPair<WriteFDivY, [SKXPort0,SKXFPDivider], 11, [1,5], 1, 7>; // 10-14 cycles.
268 defm : SKXWriteResPair<WriteFDivZ, [SKXPort0,SKXPort5,SKXFPDivider], 18, [2,1,10], 3, 7>; // 10-14 cycles.
269 //defm : SKXWriteResPair<WriteFDiv64, [SKXPort0,SKXFPDivider], 14, [1,3], 1, 5>; // 10-14 cycles. // Floating point division.
270 //defm : SKXWriteResPair<WriteFDiv64X, [SKXPort0,SKXFPDivider], 14, [1,3], 1, 6>; // 10-14 cycles.
271 //defm : SKXWriteResPair<WriteFDiv64Y, [SKXPort0,SKXFPDivider], 14, [1,5], 1, 7>; // 10-14 cycles.
272 defm : SKXWriteResPair<WriteFDiv64Z, [SKXPort0,SKXPort5,SKXFPDivider], 23, [2,1,16], 3, 7>; // 10-14 cycles.
274 defm : SKXWriteResPair<WriteFSqrt, [SKXPort0,SKXFPDivider], 12, [1,3], 1, 5>; // Floating point square root.
275 defm : SKXWriteResPair<WriteFSqrtX, [SKXPort0,SKXFPDivider], 12, [1,3], 1, 6>;
276 defm : SKXWriteResPair<WriteFSqrtY, [SKXPort0,SKXFPDivider], 12, [1,6], 1, 7>;
277 defm : SKXWriteResPair<WriteFSqrtZ, [SKXPort0,SKXPort5,SKXFPDivider], 20, [2,1,12], 3, 7>;
278 defm : SKXWriteResPair<WriteFSqrt64, [SKXPort0,SKXFPDivider], 18, [1,6], 1, 5>; // Floating point double square root.
279 defm : SKXWriteResPair<WriteFSqrt64X, [SKXPort0,SKXFPDivider], 18, [1,6], 1, 6>;
280 defm : SKXWriteResPair<WriteFSqrt64Y, [SKXPort0,SKXFPDivider], 18, [1,12],1, 7>;
281 defm : SKXWriteResPair<WriteFSqrt64Z, [SKXPort0,SKXPort5,SKXFPDivider], 32, [2,1,24], 3, 7>;
282 defm : SKXWriteResPair<WriteFSqrt80, [SKXPort0,SKXFPDivider], 21, [1,7]>; // Floating point long double square root.
284 defm : SKXWriteResPair<WriteFRcp, [SKXPort0], 4, [1], 1, 5>; // Floating point reciprocal estimate.
285 defm : SKXWriteResPair<WriteFRcpX, [SKXPort0], 4, [1], 1, 6>;
286 defm : SKXWriteResPair<WriteFRcpY, [SKXPort0], 4, [1], 1, 7>;
287 defm : SKXWriteResPair<WriteFRcpZ, [SKXPort0,SKXPort5], 4, [2,1], 3, 7>;
289 defm : SKXWriteResPair<WriteFRsqrt, [SKXPort0], 4, [1], 1, 5>; // Floating point reciprocal square root estimate.
290 defm : SKXWriteResPair<WriteFRsqrtX,[SKXPort0], 4, [1], 1, 6>;
291 defm : SKXWriteResPair<WriteFRsqrtY,[SKXPort0], 4, [1], 1, 7>;
292 defm : SKXWriteResPair<WriteFRsqrtZ,[SKXPort0,SKXPort5], 9, [2,1], 3, 7>;
294 defm : SKXWriteResPair<WriteFMA, [SKXPort01], 4, [1], 1, 5>; // Fused Multiply Add.
295 defm : SKXWriteResPair<WriteFMAX, [SKXPort01], 4, [1], 1, 6>;
296 defm : SKXWriteResPair<WriteFMAY, [SKXPort01], 4, [1], 1, 7>;
297 defm : SKXWriteResPair<WriteFMAZ, [SKXPort05], 4, [1], 1, 7>;
298 defm : SKXWriteResPair<WriteDPPD, [SKXPort5,SKXPort015], 9, [1,2], 3, 6>; // Floating point double dot product.
299 defm : SKXWriteResPair<WriteDPPS, [SKXPort5,SKXPort015], 13, [1,3], 4, 6>;
300 defm : SKXWriteResPair<WriteDPPSY,[SKXPort5,SKXPort015], 13, [1,3], 4, 7>;
301 defm : SKXWriteResPair<WriteDPPSZ,[SKXPort5,SKXPort015], 13, [1,3], 4, 7>;
302 defm : SKXWriteResPair<WriteFSign, [SKXPort0], 1>; // Floating point fabs/fchs.
303 defm : SKXWriteResPair<WriteFRnd, [SKXPort01], 8, [2], 2, 6>; // Floating point rounding.
304 defm : SKXWriteResPair<WriteFRndY, [SKXPort01], 8, [2], 2, 7>;
305 defm : SKXWriteResPair<WriteFRndZ, [SKXPort05], 8, [2], 2, 7>;
306 defm : SKXWriteResPair<WriteFLogic, [SKXPort015], 1, [1], 1, 6>; // Floating point and/or/xor logicals.
307 defm : SKXWriteResPair<WriteFLogicY, [SKXPort015], 1, [1], 1, 7>;
308 defm : SKXWriteResPair<WriteFLogicZ, [SKXPort05], 1, [1], 1, 7>;
309 defm : SKXWriteResPair<WriteFTest, [SKXPort0], 2, [1], 1, 6>; // Floating point TEST instructions.
310 defm : SKXWriteResPair<WriteFTestY, [SKXPort0], 2, [1], 1, 7>;
311 defm : SKXWriteResPair<WriteFTestZ, [SKXPort0], 2, [1], 1, 7>;
312 defm : SKXWriteResPair<WriteFShuffle, [SKXPort5], 1, [1], 1, 6>; // Floating point vector shuffles.
313 defm : SKXWriteResPair<WriteFShuffleY, [SKXPort5], 1, [1], 1, 7>;
314 defm : SKXWriteResPair<WriteFShuffleZ, [SKXPort5], 1, [1], 1, 7>;
315 defm : SKXWriteResPair<WriteFVarShuffle, [SKXPort5], 1, [1], 1, 6>; // Floating point vector variable shuffles.
316 defm : SKXWriteResPair<WriteFVarShuffleY, [SKXPort5], 1, [1], 1, 7>;
317 defm : SKXWriteResPair<WriteFVarShuffleZ, [SKXPort5], 1, [1], 1, 7>;
318 defm : SKXWriteResPair<WriteFBlend, [SKXPort015], 1, [1], 1, 6>; // Floating point vector blends.
319 defm : SKXWriteResPair<WriteFBlendY,[SKXPort015], 1, [1], 1, 7>;
320 defm : SKXWriteResPair<WriteFBlendZ,[SKXPort015], 1, [1], 1, 7>;
321 defm : SKXWriteResPair<WriteFVarBlend, [SKXPort015], 2, [2], 2, 6>; // Fp vector variable blends.
322 defm : SKXWriteResPair<WriteFVarBlendY,[SKXPort015], 2, [2], 2, 7>;
323 defm : SKXWriteResPair<WriteFVarBlendZ,[SKXPort015], 2, [2], 2, 7>;
325 // FMA Scheduling helper class.
326 // class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
328 // Vector integer operations.
329 defm : X86WriteRes<WriteVecLoad, [SKXPort23], 5, [1], 1>;
330 defm : X86WriteRes<WriteVecLoadX, [SKXPort23], 6, [1], 1>;
331 defm : X86WriteRes<WriteVecLoadY, [SKXPort23], 7, [1], 1>;
332 defm : X86WriteRes<WriteVecLoadNT, [SKXPort23], 6, [1], 1>;
333 defm : X86WriteRes<WriteVecLoadNTY, [SKXPort23], 7, [1], 1>;
334 defm : X86WriteRes<WriteVecMaskedLoad, [SKXPort23,SKXPort015], 7, [1,1], 2>;
335 defm : X86WriteRes<WriteVecMaskedLoadY, [SKXPort23,SKXPort015], 8, [1,1], 2>;
336 defm : X86WriteRes<WriteVecStore, [SKXPort237,SKXPort4], 1, [1,1], 2>;
337 defm : X86WriteRes<WriteVecStoreX, [SKXPort237,SKXPort4], 1, [1,1], 2>;
338 defm : X86WriteRes<WriteVecStoreY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
339 defm : X86WriteRes<WriteVecStoreNT, [SKXPort237,SKXPort4], 1, [1,1], 2>;
340 defm : X86WriteRes<WriteVecStoreNTY, [SKXPort237,SKXPort4], 1, [1,1], 2>;
341 defm : X86WriteRes<WriteVecMaskedStore, [SKXPort237,SKXPort0], 2, [1,1], 2>;
342 defm : X86WriteRes<WriteVecMaskedStoreY, [SKXPort237,SKXPort0], 2, [1,1], 2>;
343 defm : X86WriteRes<WriteVecMove, [SKXPort05], 1, [1], 1>;
344 defm : X86WriteRes<WriteVecMoveX, [SKXPort015], 1, [1], 1>;
345 defm : X86WriteRes<WriteVecMoveY, [SKXPort015], 1, [1], 1>;
346 defm : X86WriteRes<WriteVecMoveToGpr, [SKXPort0], 2, [1], 1>;
347 defm : X86WriteRes<WriteVecMoveFromGpr, [SKXPort5], 1, [1], 1>;
349 defm : SKXWriteResPair<WriteVecALU, [SKXPort05], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
350 defm : SKXWriteResPair<WriteVecALUX, [SKXPort01], 1, [1], 1, 6>;
351 defm : SKXWriteResPair<WriteVecALUY, [SKXPort01], 1, [1], 1, 7>;
352 defm : SKXWriteResPair<WriteVecALUZ, [SKXPort0], 1, [1], 1, 7>;
353 defm : SKXWriteResPair<WriteVecLogic, [SKXPort05], 1, [1], 1, 5>; // Vector integer and/or/xor.
354 defm : SKXWriteResPair<WriteVecLogicX,[SKXPort015], 1, [1], 1, 6>;
355 defm : SKXWriteResPair<WriteVecLogicY,[SKXPort015], 1, [1], 1, 7>;
356 defm : SKXWriteResPair<WriteVecLogicZ,[SKXPort05], 1, [1], 1, 7>;
357 defm : SKXWriteResPair<WriteVecTest, [SKXPort0,SKXPort5], 3, [1,1], 2, 6>; // Vector integer TEST instructions.
358 defm : SKXWriteResPair<WriteVecTestY, [SKXPort0,SKXPort5], 3, [1,1], 2, 7>;
359 defm : SKXWriteResPair<WriteVecTestZ, [SKXPort0,SKXPort5], 3, [1,1], 2, 7>;
360 defm : SKXWriteResPair<WriteVecIMul, [SKXPort0], 4, [1], 1, 5>; // Vector integer multiply.
361 defm : SKXWriteResPair<WriteVecIMulX, [SKXPort01], 4, [1], 1, 6>;
362 defm : SKXWriteResPair<WriteVecIMulY, [SKXPort01], 4, [1], 1, 7>;
363 defm : SKXWriteResPair<WriteVecIMulZ, [SKXPort05], 4, [1], 1, 7>;
364 defm : SKXWriteResPair<WritePMULLD, [SKXPort01], 10, [2], 2, 6>; // Vector PMULLD.
365 defm : SKXWriteResPair<WritePMULLDY, [SKXPort01], 10, [2], 2, 7>;
366 defm : SKXWriteResPair<WritePMULLDZ, [SKXPort05], 10, [2], 2, 7>;
367 defm : SKXWriteResPair<WriteShuffle, [SKXPort5], 1, [1], 1, 5>; // Vector shuffles.
368 defm : SKXWriteResPair<WriteShuffleX, [SKXPort5], 1, [1], 1, 6>;
369 defm : SKXWriteResPair<WriteShuffleY, [SKXPort5], 1, [1], 1, 7>;
370 defm : SKXWriteResPair<WriteShuffleZ, [SKXPort5], 1, [1], 1, 7>;
371 defm : SKXWriteResPair<WriteVarShuffle, [SKXPort5], 1, [1], 1, 5>; // Vector variable shuffles.
372 defm : SKXWriteResPair<WriteVarShuffleX, [SKXPort5], 1, [1], 1, 6>;
373 defm : SKXWriteResPair<WriteVarShuffleY, [SKXPort5], 1, [1], 1, 7>;
374 defm : SKXWriteResPair<WriteVarShuffleZ, [SKXPort5], 1, [1], 1, 7>;
375 defm : SKXWriteResPair<WriteBlend, [SKXPort5], 1, [1], 1, 6>; // Vector blends.
376 defm : SKXWriteResPair<WriteBlendY,[SKXPort5], 1, [1], 1, 7>;
377 defm : SKXWriteResPair<WriteBlendZ,[SKXPort5], 1, [1], 1, 7>;
378 defm : SKXWriteResPair<WriteVarBlend, [SKXPort015], 2, [2], 2, 6>; // Vector variable blends.
379 defm : SKXWriteResPair<WriteVarBlendY,[SKXPort015], 2, [2], 2, 6>;
380 defm : SKXWriteResPair<WriteVarBlendZ,[SKXPort05], 2, [1], 1, 6>;
381 defm : SKXWriteResPair<WriteMPSAD, [SKXPort5], 4, [2], 2, 6>; // Vector MPSAD.
382 defm : SKXWriteResPair<WriteMPSADY, [SKXPort5], 4, [2], 2, 7>;
383 defm : SKXWriteResPair<WriteMPSADZ, [SKXPort5], 4, [2], 2, 7>;
384 defm : SKXWriteResPair<WritePSADBW, [SKXPort5], 3, [1], 1, 5>; // Vector PSADBW.
385 defm : SKXWriteResPair<WritePSADBWX, [SKXPort5], 3, [1], 1, 6>;
386 defm : SKXWriteResPair<WritePSADBWY, [SKXPort5], 3, [1], 1, 7>;
387 defm : SKXWriteResPair<WritePSADBWZ, [SKXPort5], 3, [1], 1, 7>;
388 defm : SKXWriteResPair<WritePHMINPOS, [SKXPort0], 4, [1], 1, 6>; // Vector PHMINPOS.
390 // Vector integer shifts.
391 defm : SKXWriteResPair<WriteVecShift, [SKXPort0], 1, [1], 1, 5>;
392 defm : X86WriteRes<WriteVecShiftX, [SKXPort5,SKXPort01], 2, [1,1], 2>;
393 defm : X86WriteRes<WriteVecShiftY, [SKXPort5,SKXPort01], 4, [1,1], 2>;
394 defm : X86WriteRes<WriteVecShiftZ, [SKXPort5,SKXPort0], 4, [1,1], 2>;
395 defm : X86WriteRes<WriteVecShiftXLd, [SKXPort01,SKXPort23], 7, [1,1], 2>;
396 defm : X86WriteRes<WriteVecShiftYLd, [SKXPort01,SKXPort23], 8, [1,1], 2>;
397 defm : X86WriteRes<WriteVecShiftZLd, [SKXPort0,SKXPort23], 8, [1,1], 2>;
399 defm : SKXWriteResPair<WriteVecShiftImm, [SKXPort0], 1, [1], 1, 5>;
400 defm : SKXWriteResPair<WriteVecShiftImmX, [SKXPort01], 1, [1], 1, 6>; // Vector integer immediate shifts.
401 defm : SKXWriteResPair<WriteVecShiftImmY, [SKXPort01], 1, [1], 1, 7>;
402 defm : SKXWriteResPair<WriteVecShiftImmZ, [SKXPort0], 1, [1], 1, 7>;
403 defm : SKXWriteResPair<WriteVarVecShift, [SKXPort01], 1, [1], 1, 6>; // Variable vector shifts.
404 defm : SKXWriteResPair<WriteVarVecShiftY, [SKXPort01], 1, [1], 1, 7>;
405 defm : SKXWriteResPair<WriteVarVecShiftZ, [SKXPort0], 1, [1], 1, 7>;
407 // Vector insert/extract operations.
408 def : WriteRes<WriteVecInsert, [SKXPort5]> {
411 let ResourceCycles = [2];
413 def : WriteRes<WriteVecInsertLd, [SKXPort5,SKXPort23]> {
417 def: InstRW<[WriteVecInsertLd], (instregex "(V?)MOV(H|L)(PD|PS)rm")>;
419 def : WriteRes<WriteVecExtract, [SKXPort0,SKXPort5]> {
423 def : WriteRes<WriteVecExtractSt, [SKXPort4,SKXPort5,SKXPort237]> {
428 // Conversion between integer and float.
429 defm : SKXWriteResPair<WriteCvtSS2I, [SKXPort01], 6, [2], 2>; // Needs more work: DD vs DQ.
430 defm : SKXWriteResPair<WriteCvtPS2I, [SKXPort01], 3>;
431 defm : SKXWriteResPair<WriteCvtPS2IY, [SKXPort01], 3>;
432 defm : SKXWriteResPair<WriteCvtPS2IZ, [SKXPort05], 3>;
433 defm : SKXWriteResPair<WriteCvtSD2I, [SKXPort01], 6, [2], 2>;
434 defm : SKXWriteResPair<WriteCvtPD2I, [SKXPort01], 3>;
435 defm : SKXWriteResPair<WriteCvtPD2IY, [SKXPort01], 3>;
436 defm : SKXWriteResPair<WriteCvtPD2IZ, [SKXPort05], 3>;
438 defm : SKXWriteResPair<WriteCvtI2SS, [SKXPort1], 4>;
439 defm : SKXWriteResPair<WriteCvtI2PS, [SKXPort01], 4>;
440 defm : SKXWriteResPair<WriteCvtI2PSY, [SKXPort01], 4>;
441 defm : SKXWriteResPair<WriteCvtI2PSZ, [SKXPort05], 4>; // Needs more work: DD vs DQ.
442 defm : SKXWriteResPair<WriteCvtI2SD, [SKXPort1], 4>;
443 defm : SKXWriteResPair<WriteCvtI2PD, [SKXPort01], 4>;
444 defm : SKXWriteResPair<WriteCvtI2PDY, [SKXPort01], 4>;
445 defm : SKXWriteResPair<WriteCvtI2PDZ, [SKXPort05], 4>;
447 defm : SKXWriteResPair<WriteCvtSS2SD, [SKXPort1], 3>;
448 defm : SKXWriteResPair<WriteCvtPS2PD, [SKXPort1], 3>;
449 defm : SKXWriteResPair<WriteCvtPS2PDY, [SKXPort5,SKXPort01], 3, [1,1], 2>;
450 defm : SKXWriteResPair<WriteCvtPS2PDZ, [SKXPort05], 3, [2], 2>;
451 defm : SKXWriteResPair<WriteCvtSD2SS, [SKXPort1], 3>;
452 defm : SKXWriteResPair<WriteCvtPD2PS, [SKXPort1], 3>;
453 defm : SKXWriteResPair<WriteCvtPD2PSY, [SKXPort5,SKXPort01], 3, [1,1], 2>;
454 defm : SKXWriteResPair<WriteCvtPD2PSZ, [SKXPort05], 3, [2], 2>;
456 defm : X86WriteRes<WriteCvtPH2PS, [SKXPort5,SKXPort01], 5, [1,1], 2>;
457 defm : X86WriteRes<WriteCvtPH2PSY, [SKXPort5,SKXPort01], 7, [1,1], 2>;
458 defm : X86WriteRes<WriteCvtPH2PSZ, [SKXPort5,SKXPort0], 7, [1,1], 2>;
459 defm : X86WriteRes<WriteCvtPH2PSLd, [SKXPort23,SKXPort01], 9, [1,1], 2>;
460 defm : X86WriteRes<WriteCvtPH2PSYLd, [SKXPort23,SKXPort01], 10, [1,1], 2>;
461 defm : X86WriteRes<WriteCvtPH2PSZLd, [SKXPort23,SKXPort05], 10, [1,1], 2>;
463 defm : X86WriteRes<WriteCvtPS2PH, [SKXPort5,SKXPort01], 5, [1,1], 2>;
464 defm : X86WriteRes<WriteCvtPS2PHY, [SKXPort5,SKXPort01], 7, [1,1], 2>;
465 defm : X86WriteRes<WriteCvtPS2PHZ, [SKXPort5,SKXPort05], 7, [1,1], 2>;
466 defm : X86WriteRes<WriteCvtPS2PHSt, [SKXPort4,SKXPort5,SKXPort237,SKXPort01], 6, [1,1,1,1], 4>;
467 defm : X86WriteRes<WriteCvtPS2PHYSt, [SKXPort4,SKXPort5,SKXPort237,SKXPort01], 8, [1,1,1,1], 4>;
468 defm : X86WriteRes<WriteCvtPS2PHZSt, [SKXPort4,SKXPort5,SKXPort237,SKXPort05], 8, [1,1,1,1], 4>;
470 // Strings instructions.
472 // Packed Compare Implicit Length Strings, Return Mask
473 def : WriteRes<WritePCmpIStrM, [SKXPort0]> {
476 let ResourceCycles = [3];
478 def : WriteRes<WritePCmpIStrMLd, [SKXPort0, SKXPort23]> {
481 let ResourceCycles = [3,1];
484 // Packed Compare Explicit Length Strings, Return Mask
485 def : WriteRes<WritePCmpEStrM, [SKXPort0, SKXPort5, SKXPort015, SKXPort0156]> {
488 let ResourceCycles = [4,3,1,1];
490 def : WriteRes<WritePCmpEStrMLd, [SKXPort0, SKXPort5, SKXPort23, SKXPort015, SKXPort0156]> {
492 let NumMicroOps = 10;
493 let ResourceCycles = [4,3,1,1,1];
496 // Packed Compare Implicit Length Strings, Return Index
497 def : WriteRes<WritePCmpIStrI, [SKXPort0]> {
500 let ResourceCycles = [3];
502 def : WriteRes<WritePCmpIStrILd, [SKXPort0, SKXPort23]> {
505 let ResourceCycles = [3,1];
508 // Packed Compare Explicit Length Strings, Return Index
509 def : WriteRes<WritePCmpEStrI, [SKXPort0,SKXPort5,SKXPort0156]> {
512 let ResourceCycles = [4,3,1];
514 def : WriteRes<WritePCmpEStrILd, [SKXPort0, SKXPort5, SKXPort23, SKXPort0156]> {
517 let ResourceCycles = [4,3,1,1];
520 // MOVMSK Instructions.
521 def : WriteRes<WriteFMOVMSK, [SKXPort0]> { let Latency = 2; }
522 def : WriteRes<WriteVecMOVMSK, [SKXPort0]> { let Latency = 2; }
523 def : WriteRes<WriteVecMOVMSKY, [SKXPort0]> { let Latency = 2; }
524 def : WriteRes<WriteMMXMOVMSK, [SKXPort0]> { let Latency = 2; }
527 def : WriteRes<WriteAESDecEnc, [SKXPort0]> { // Decryption, encryption.
530 let ResourceCycles = [1];
532 def : WriteRes<WriteAESDecEncLd, [SKXPort0, SKXPort23]> {
535 let ResourceCycles = [1,1];
538 def : WriteRes<WriteAESIMC, [SKXPort0]> { // InvMixColumn.
541 let ResourceCycles = [2];
543 def : WriteRes<WriteAESIMCLd, [SKXPort0, SKXPort23]> {
546 let ResourceCycles = [2,1];
549 def : WriteRes<WriteAESKeyGen, [SKXPort0,SKXPort5,SKXPort015]> { // Key Generation.
551 let NumMicroOps = 11;
552 let ResourceCycles = [3,6,2];
554 def : WriteRes<WriteAESKeyGenLd, [SKXPort0,SKXPort5,SKXPort23,SKXPort015]> {
556 let NumMicroOps = 11;
557 let ResourceCycles = [3,6,1,1];
560 // Carry-less multiplication instructions.
561 def : WriteRes<WriteCLMul, [SKXPort5]> {
564 let ResourceCycles = [1];
566 def : WriteRes<WriteCLMulLd, [SKXPort5, SKXPort23]> {
569 let ResourceCycles = [1,1];
572 // Catch-all for expensive system instructions.
573 def : WriteRes<WriteSystem, [SKXPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
576 defm : SKXWriteResPair<WriteFShuffle256, [SKXPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
577 defm : SKXWriteResPair<WriteFVarShuffle256, [SKXPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
578 defm : SKXWriteResPair<WriteShuffle256, [SKXPort5], 3, [1], 1, 7>; // 256-bit width vector shuffles.
579 defm : SKXWriteResPair<WriteVarShuffle256, [SKXPort5], 3, [1], 1, 7>; // 256-bit width vector variable shuffles.
581 // Old microcoded instructions that nobody use.
582 def : WriteRes<WriteMicrocoded, [SKXPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
584 // Fence instructions.
585 def : WriteRes<WriteFence, [SKXPort23, SKXPort4]>;
588 def : WriteRes<WriteLDMXCSR, [SKXPort0,SKXPort23,SKXPort0156]> { let Latency = 7; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
589 def : WriteRes<WriteSTMXCSR, [SKXPort4,SKXPort5,SKXPort237]> { let Latency = 2; let NumMicroOps = 3; let ResourceCycles = [1,1,1]; }
591 // Nop, not very useful expect it provides a model for nops!
592 def : WriteRes<WriteNop, []>;
594 ////////////////////////////////////////////////////////////////////////////////
595 // Horizontal add/sub instructions.
596 ////////////////////////////////////////////////////////////////////////////////
598 defm : SKXWriteResPair<WriteFHAdd, [SKXPort5,SKXPort015], 6, [2,1], 3, 6>;
599 defm : SKXWriteResPair<WriteFHAddY, [SKXPort5,SKXPort015], 6, [2,1], 3, 7>;
600 defm : SKXWriteResPair<WritePHAdd, [SKXPort5,SKXPort05], 3, [2,1], 3, 5>;
601 defm : SKXWriteResPair<WritePHAddX, [SKXPort5,SKXPort015], 3, [2,1], 3, 6>;
602 defm : SKXWriteResPair<WritePHAddY, [SKXPort5,SKXPort015], 3, [2,1], 3, 7>;
606 def SKXWriteResGroup1 : SchedWriteRes<[SKXPort0]> {
609 let ResourceCycles = [1];
611 def: InstRW<[SKXWriteResGroup1], (instregex "KAND(B|D|Q|W)rr",
619 "MMX_PADDUS(B|W)irr",
621 "MMX_PCMPEQ(B|D|W)irr",
622 "MMX_PCMPGT(B|D|W)irr",
623 "MMX_P(MAX|MIN)SWirr",
624 "MMX_P(MAX|MIN)UBirr",
626 "MMX_PSUBUS(B|W)irr",
627 "VPMOVB2M(Z|Z128|Z256)rr",
628 "VPMOVD2M(Z|Z128|Z256)rr",
629 "VPMOVQ2M(Z|Z128|Z256)rr",
630 "VPMOVW2M(Z|Z128|Z256)rr")>;
632 def SKXWriteResGroup3 : SchedWriteRes<[SKXPort5]> {
635 let ResourceCycles = [1];
637 def: InstRW<[SKXWriteResGroup3], (instregex "COM(P?)_FST0r",
641 def SKXWriteResGroup4 : SchedWriteRes<[SKXPort6]> {
644 let ResourceCycles = [1];
646 def: InstRW<[SKXWriteResGroup4], (instregex "JMP(16|32|64)r")>;
648 def SKXWriteResGroup6 : SchedWriteRes<[SKXPort05]> {
651 let ResourceCycles = [1];
653 def: InstRW<[SKXWriteResGroup6], (instrs FINCSTP, FNOP)>;
655 def SKXWriteResGroup7 : SchedWriteRes<[SKXPort06]> {
658 let ResourceCycles = [1];
660 def: InstRW<[SKXWriteResGroup7], (instrs CDQ, CQO, CLAC, STAC)>;
662 def SKXWriteResGroup8 : SchedWriteRes<[SKXPort15]> {
665 let ResourceCycles = [1];
667 def: InstRW<[SKXWriteResGroup8], (instregex "ANDN(32|64)rr")>;
669 def SKXWriteResGroup9 : SchedWriteRes<[SKXPort015]> {
672 let ResourceCycles = [1];
674 def: InstRW<[SKXWriteResGroup9], (instregex "VBLENDMPD(Z128|Z256)rr",
675 "VBLENDMPS(Z128|Z256)rr",
676 "VPADD(B|D|Q|W)(Y|Z|Z128|Z256)rr",
677 "(V?)PADD(B|D|Q|W)rr",
679 "VPBLENDMB(Z128|Z256)rr",
680 "VPBLENDMD(Z128|Z256)rr",
681 "VPBLENDMQ(Z128|Z256)rr",
682 "VPBLENDMW(Z128|Z256)rr",
683 "VPSUB(B|D|Q|W)(Y|Z|Z128|Z256)rr",
684 "(V?)PSUB(B|D|Q|W)rr",
685 "VPTERNLOGD(Z|Z128|Z256)rri",
686 "VPTERNLOGQ(Z|Z128|Z256)rri")>;
688 def SKXWriteResGroup10 : SchedWriteRes<[SKXPort0156]> {
691 let ResourceCycles = [1];
693 def: InstRW<[SKXWriteResGroup10], (instrs CBW, CWDE, CDQE,
701 def SKXWriteResGroup11 : SchedWriteRes<[SKXPort4,SKXPort237]> {
704 let ResourceCycles = [1,1];
706 def: InstRW<[SKXWriteResGroup11], (instrs FBSTPm, VMPTRSTm)>;
707 def: InstRW<[SKXWriteResGroup11], (instregex "KMOV(B|D|Q|W)mk",
708 "ST_FP(32|64|80)m")>;
710 def SKXWriteResGroup13 : SchedWriteRes<[SKXPort5]> {
713 let ResourceCycles = [2];
715 def: InstRW<[SKXWriteResGroup13], (instrs MMX_MOVQ2DQrr)>;
717 def SKXWriteResGroup14 : SchedWriteRes<[SKXPort05]> {
720 let ResourceCycles = [2];
722 def: InstRW<[SKXWriteResGroup14], (instrs FDECSTP,
725 def SKXWriteResGroup15 : SchedWriteRes<[SKXPort06]> {
728 let ResourceCycles = [2];
730 def: InstRW<[SKXWriteResGroup15], (instregex "SET(A|BE)r")>;
732 def SKXWriteResGroup17 : SchedWriteRes<[SKXPort0156]> {
735 let ResourceCycles = [2];
737 def: InstRW<[SKXWriteResGroup17], (instrs LFENCE,
741 def SKXWriteResGroup20 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
744 let ResourceCycles = [1,1];
746 def: InstRW<[SKXWriteResGroup20], (instregex "CLFLUSH")>;
748 def SKXWriteResGroup21 : SchedWriteRes<[SKXPort237,SKXPort0156]> {
751 let ResourceCycles = [1,1];
753 def: InstRW<[SKXWriteResGroup21], (instrs SFENCE)>;
755 def SKXWriteResGroup23 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
758 let ResourceCycles = [1,1];
760 def: InstRW<[SKXWriteResGroup23], (instrs CWD,
763 def: InstRW<[SKXWriteResGroup23], (instregex "ADC8ri",
766 def SKXWriteResGroup25 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort237]> {
769 let ResourceCycles = [1,1,1];
771 def: InstRW<[SKXWriteResGroup25], (instrs FNSTCW16m)>;
773 def SKXWriteResGroup27 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort15]> {
776 let ResourceCycles = [1,1,1];
778 def: InstRW<[SKXWriteResGroup27], (instregex "MOVBE(16|32|64)mr")>;
780 def SKXWriteResGroup28 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort0156]> {
783 let ResourceCycles = [1,1,1];
785 def: InstRW<[SKXWriteResGroup28], (instrs PUSH16r, PUSH32r, PUSH64r, PUSH64i8,
786 STOSB, STOSL, STOSQ, STOSW)>;
787 def: InstRW<[SKXWriteResGroup28], (instregex "PUSH(16|32|64)rmr")>;
789 def SKXWriteResGroup29 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort15]> {
792 let ResourceCycles = [2,2,1];
794 def: InstRW<[SKXWriteResGroup29], (instregex "VMOVDQU8Zmr(b?)")>;
796 def SKXWriteResGroup30 : SchedWriteRes<[SKXPort0]> {
799 let ResourceCycles = [1];
801 def: InstRW<[SKXWriteResGroup30], (instregex "KMOV(B|D|Q|W)rk",
802 "KORTEST(B|D|Q|W)rr",
803 "KTEST(B|D|Q|W)rr")>;
805 def SKXWriteResGroup31 : SchedWriteRes<[SKXPort1]> {
808 let ResourceCycles = [1];
810 def: InstRW<[SKXWriteResGroup31], (instregex "PDEP(32|64)rr",
813 def SKXWriteResGroup32 : SchedWriteRes<[SKXPort5]> {
816 let ResourceCycles = [1];
818 def: InstRW<[SKXWriteResGroup32], (instrs VPSADBWZrr)>; // TODO: 512-bit ops require ports 0/1 to be joined.
819 def: InstRW<[SKXWriteResGroup32], (instregex "(ADD|SUB|SUBR)_(FPrST0|FST0r|FrST0)",
821 "KSHIFTL(B|D|Q|W)ri",
822 "KSHIFTR(B|D|Q|W)ri",
823 "KUNPCK(BW|DQ|WD)rr",
824 "VALIGND(Z|Z128|Z256)rri",
825 "VALIGNQ(Z|Z128|Z256)rri",
826 "VCMPPD(Z|Z128|Z256)rri",
827 "VCMPPS(Z|Z128|Z256)rri",
829 "VDBPSADBWZrri", // TODO: 512-bit ops require ports 0/1 to be joined.
830 "VFPCLASS(PD|PS)(Z|Z128|Z256)rr",
831 "VFPCLASS(SD|SS)Zrr",
832 "VPBROADCAST(B|W)rr",
833 "VPCMPB(Z|Z128|Z256)rri",
834 "VPCMPD(Z|Z128|Z256)rri",
835 "VPCMPEQ(B|D|Q|W)(Z|Z128|Z256)rr",
836 "VPCMPGT(B|D|Q|W)(Z|Z128|Z256)rr",
838 "VPCMPQ(Z|Z128|Z256)rri",
839 "VPCMPU(B|D|Q|W)(Z|Z128|Z256)rri",
840 "VPCMPW(Z|Z128|Z256)rri",
841 "VP(MAX|MIN)(S|U)Q(Z|Z128|Z256)rr",
842 "VPTEST(N?)M(B|D|Q|W)(Z|Z128|Z256)rr")>;
844 def SKXWriteResGroup34 : SchedWriteRes<[SKXPort0,SKXPort0156]> {
847 let ResourceCycles = [1,1];
849 def: InstRW<[SKXWriteResGroup34], (instrs FNSTSW16r)>;
851 def SKXWriteResGroup37 : SchedWriteRes<[SKXPort0,SKXPort5]> {
854 let ResourceCycles = [1,2];
856 def: InstRW<[SKXWriteResGroup37], (instregex "MMX_PH(ADD|SUB)SWrr")>;
858 def SKXWriteResGroup38 : SchedWriteRes<[SKXPort5,SKXPort01]> {
861 let ResourceCycles = [2,1];
863 def: InstRW<[SKXWriteResGroup38], (instregex "(V?)PH(ADD|SUB)SW(Y?)rr")>;
865 def SKXWriteResGroup41 : SchedWriteRes<[SKXPort5,SKXPort0156]> {
868 let ResourceCycles = [2,1];
870 def: InstRW<[SKXWriteResGroup41], (instrs MMX_PACKSSDWirr,
874 def SKXWriteResGroup42 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
877 let ResourceCycles = [1,2];
879 def: InstRW<[SKXWriteResGroup42], (instregex "CLD")>;
881 def SKXWriteResGroup43 : SchedWriteRes<[SKXPort237,SKXPort0156]> {
884 let ResourceCycles = [1,2];
886 def: InstRW<[SKXWriteResGroup43], (instrs MFENCE)>;
888 def SKXWriteResGroup44 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
891 let ResourceCycles = [1,2];
893 def: InstRW<[SKXWriteResGroup44], (instregex "RCL(8|16|32|64)r(1|i)",
894 "RCR(8|16|32|64)r(1|i)")>;
896 def SKXWriteResGroup45 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237]> {
899 let ResourceCycles = [1,1,1];
901 def: InstRW<[SKXWriteResGroup45], (instrs FNSTSWm)>;
903 def SKXWriteResGroup46 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort06]> {
906 let ResourceCycles = [1,1,2];
908 def: InstRW<[SKXWriteResGroup46], (instregex "SET(A|BE)m")>;
910 def SKXWriteResGroup47 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort237,SKXPort0156]> {
913 let ResourceCycles = [1,1,1,1];
915 def: InstRW<[SKXWriteResGroup47], (instregex "CALL(16|32|64)r")>;
917 def SKXWriteResGroup48 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort06,SKXPort0156]> {
920 let ResourceCycles = [1,1,1,1];
922 def: InstRW<[SKXWriteResGroup48], (instrs CALL64pcrel32)>;
924 def SKXWriteResGroup49 : SchedWriteRes<[SKXPort0]> {
927 let ResourceCycles = [1];
929 def: InstRW<[SKXWriteResGroup49], (instregex "MUL_(FPrST0|FST0r|FrST0)")>;
931 def SKXWriteResGroup50 : SchedWriteRes<[SKXPort01]> {
934 let ResourceCycles = [1];
936 def: InstRW<[SKXWriteResGroup50], (instregex "VCVTDQ2PS(Y|Z128|Z256)rr",
938 "VCVTPD2QQ(Z128|Z256)rr",
939 "VCVTPD2UQQ(Z128|Z256)rr",
940 "VCVTPS2DQ(Y|Z128|Z256)rr",
942 "VCVTPS2UDQ(Z128|Z256)rr",
943 "VCVTQQ2PD(Z128|Z256)rr",
944 "VCVTTPD2QQ(Z128|Z256)rr",
945 "VCVTTPD2UQQ(Z128|Z256)rr",
946 "VCVTTPS2DQ(Z128|Z256)rr",
948 "VCVTTPS2UDQ(Z128|Z256)rr",
949 "VCVTUDQ2PS(Z128|Z256)rr",
950 "VCVTUQQ2PD(Z128|Z256)rr")>;
952 def SKXWriteResGroup50z : SchedWriteRes<[SKXPort05]> {
955 let ResourceCycles = [1];
957 def: InstRW<[SKXWriteResGroup50z], (instrs VCVTDQ2PSZrr,
970 def SKXWriteResGroup51 : SchedWriteRes<[SKXPort5]> {
973 let ResourceCycles = [2];
975 def: InstRW<[SKXWriteResGroup51], (instregex "VEXPANDPD(Z|Z128|Z256)rr",
976 "VEXPANDPS(Z|Z128|Z256)rr",
977 "VPEXPANDD(Z|Z128|Z256)rr",
978 "VPEXPANDQ(Z|Z128|Z256)rr",
979 "VPMOVDB(Z|Z128|Z256)rr",
980 "VPMOVDW(Z|Z128|Z256)rr",
981 "VPMOVQB(Z|Z128|Z256)rr",
982 "VPMOVQW(Z|Z128|Z256)rr",
983 "VPMOVSDB(Z|Z128|Z256)rr",
984 "VPMOVSDW(Z|Z128|Z256)rr",
985 "VPMOVSQB(Z|Z128|Z256)rr",
986 "VPMOVSQD(Z|Z128|Z256)rr",
987 "VPMOVSQW(Z|Z128|Z256)rr",
988 "VPMOVSWB(Z|Z128|Z256)rr",
989 "VPMOVUSDB(Z|Z128|Z256)rr",
990 "VPMOVUSDW(Z|Z128|Z256)rr",
991 "VPMOVUSQB(Z|Z128|Z256)rr",
992 "VPMOVUSQD(Z|Z128|Z256)rr",
993 "VPMOVUSWB(Z|Z128|Z256)rr",
994 "VPMOVWB(Z|Z128|Z256)rr")>;
996 def SKXWriteResGroup54 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort237]> {
999 let ResourceCycles = [1,1,1];
1001 def: InstRW<[SKXWriteResGroup54], (instregex "IST(T?)_FP(16|32|64)m",
1003 "VPMOVQD(Z|Z128|Z256)mr(b?)")>;
1005 def SKXWriteResGroup55 : SchedWriteRes<[SKXPort0156]> {
1007 let NumMicroOps = 4;
1008 let ResourceCycles = [4];
1010 def: InstRW<[SKXWriteResGroup55], (instrs FNCLEX)>;
1012 def SKXWriteResGroup56 : SchedWriteRes<[]> {
1014 let NumMicroOps = 4;
1015 let ResourceCycles = [];
1017 def: InstRW<[SKXWriteResGroup56], (instrs VZEROUPPER)>;
1019 def SKXWriteResGroup57 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort0156]> {
1021 let NumMicroOps = 4;
1022 let ResourceCycles = [1,1,2];
1024 def: InstRW<[SKXWriteResGroup57], (instregex "LAR(16|32|64)rr")>;
1026 def SKXWriteResGroup58 : SchedWriteRes<[SKXPort23]> {
1028 let NumMicroOps = 1;
1029 let ResourceCycles = [1];
1031 def: InstRW<[SKXWriteResGroup58], (instregex "MOVSX(16|32|64)rm(8|16|32)",
1032 "MOVZX(16|32|64)rm(8|16)",
1033 "(V?)MOVDDUPrm")>; // TODO: Should this be SKXWriteResGroup71?
1035 def SKXWriteResGroup61 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1037 let NumMicroOps = 2;
1038 let ResourceCycles = [1,1];
1040 def: InstRW<[SKXWriteResGroup61], (instregex "MMX_CVT(T?)PD2PIirr",
1041 "MMX_CVT(T?)PS2PIirr",
1044 "(V?)CVT(T?)PD2DQrr",
1053 "(V?)CVTSD2SS(Z?)rr",
1054 "(V?)CVTSI(64)?2SDrr",
1057 "VCVTSI(64)?2SDZrr",
1061 "VCVTTPD2UDQZ128rr",
1063 "VCVTTPS2UQQZ128rr",
1067 "VCVTUSI(64)?2SDZrr")>;
1069 def SKXWriteResGroup62 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1071 let NumMicroOps = 3;
1072 let ResourceCycles = [2,1];
1074 def: InstRW<[SKXWriteResGroup62], (instregex "VPCONFLICTQZ128rr")>;
1076 def SKXWriteResGroup63 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort06]> {
1078 let NumMicroOps = 3;
1079 let ResourceCycles = [1,1,1];
1081 def: InstRW<[SKXWriteResGroup63], (instregex "STR(16|32|64)r")>;
1083 def SKXWriteResGroup65 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort015]> {
1085 let NumMicroOps = 3;
1086 let ResourceCycles = [1,1,1];
1088 def: InstRW<[SKXWriteResGroup65], (instregex "VCVTPS2PHZ128mr(b?)",
1089 "VCVTPS2PHZ256mr(b?)",
1090 "VCVTPS2PHZmr(b?)")>;
1092 def SKXWriteResGroup66 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort237]> {
1094 let NumMicroOps = 4;
1095 let ResourceCycles = [1,2,1];
1097 def: InstRW<[SKXWriteResGroup66], (instregex "VPMOVDB(Z|Z128|Z256)mr(b?)",
1098 "VPMOVDW(Z|Z128|Z256)mr(b?)",
1099 "VPMOVQB(Z|Z128|Z256)mr(b?)",
1100 "VPMOVQW(Z|Z128|Z256)mr(b?)",
1101 "VPMOVSDB(Z|Z128|Z256)mr(b?)",
1102 "VPMOVSDW(Z|Z128|Z256)mr(b?)",
1103 "VPMOVSQB(Z|Z128|Z256)mr(b?)",
1104 "VPMOVSQD(Z|Z128|Z256)mr(b?)",
1105 "VPMOVSQW(Z|Z128|Z256)mr(b?)",
1106 "VPMOVSWB(Z|Z128|Z256)mr(b?)",
1107 "VPMOVUSDB(Z|Z128|Z256)mr(b?)",
1108 "VPMOVUSDW(Z|Z128|Z256)mr(b?)",
1109 "VPMOVUSQB(Z|Z128|Z256)mr(b?)",
1110 "VPMOVUSQD(Z|Z128|Z256)mr(b?)",
1111 "VPMOVUSQW(Z|Z128|Z256)mr(b?)",
1112 "VPMOVUSWB(Z|Z128|Z256)mr(b?)",
1113 "VPMOVWB(Z|Z128|Z256)mr(b?)")>;
1115 def SKXWriteResGroup67 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
1117 let NumMicroOps = 5;
1118 let ResourceCycles = [1,4];
1120 def: InstRW<[SKXWriteResGroup67], (instrs XSETBV)>;
1122 def SKXWriteResGroup69 : SchedWriteRes<[SKXPort4,SKXPort237,SKXPort0156]> {
1124 let NumMicroOps = 6;
1125 let ResourceCycles = [1,1,4];
1127 def: InstRW<[SKXWriteResGroup69], (instregex "PUSHF(16|64)")>;
1129 def SKXWriteResGroup71 : SchedWriteRes<[SKXPort23]> {
1131 let NumMicroOps = 1;
1132 let ResourceCycles = [1];
1134 def: InstRW<[SKXWriteResGroup71], (instrs VBROADCASTSSrm,
1142 def SKXWriteResGroup72 : SchedWriteRes<[SKXPort5]> {
1144 let NumMicroOps = 2;
1145 let ResourceCycles = [2];
1147 def: InstRW<[SKXWriteResGroup72], (instrs MMX_CVTPI2PSirr)>;
1148 def: InstRW<[SKXWriteResGroup72], (instregex "VCOMPRESSPD(Z|Z128|Z256)rr",
1149 "VCOMPRESSPS(Z|Z128|Z256)rr",
1150 "VPCOMPRESSD(Z|Z128|Z256)rr",
1151 "VPCOMPRESSQ(Z|Z128|Z256)rr",
1152 "VPERMW(Z|Z128|Z256)rr")>;
1154 def SKXWriteResGroup73 : SchedWriteRes<[SKXPort0,SKXPort23]> {
1156 let NumMicroOps = 2;
1157 let ResourceCycles = [1,1];
1159 def: InstRW<[SKXWriteResGroup73], (instrs MMX_PADDSBirm,
1180 def SKXWriteResGroup76 : SchedWriteRes<[SKXPort6,SKXPort23]> {
1182 let NumMicroOps = 2;
1183 let ResourceCycles = [1,1];
1185 def: InstRW<[SKXWriteResGroup76], (instrs FARJMP64)>;
1186 def: InstRW<[SKXWriteResGroup76], (instregex "JMP(16|32|64)m")>;
1188 def SKXWriteResGroup79 : SchedWriteRes<[SKXPort23,SKXPort15]> {
1190 let NumMicroOps = 2;
1191 let ResourceCycles = [1,1];
1193 def: InstRW<[SKXWriteResGroup79], (instregex "ANDN(32|64)rm",
1194 "MOVBE(16|32|64)rm")>;
1196 def SKXWriteResGroup80 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1198 let NumMicroOps = 2;
1199 let ResourceCycles = [1,1];
1201 def: InstRW<[SKXWriteResGroup80], (instregex "VMOV(64to|QI2)PQIZrm(b?)")>;
1202 def: InstRW<[SKXWriteResGroup80], (instrs VMOVDI2PDIZrm)>;
1204 def SKXWriteResGroup81 : SchedWriteRes<[SKXPort23,SKXPort0156]> {
1206 let NumMicroOps = 2;
1207 let ResourceCycles = [1,1];
1209 def: InstRW<[SKXWriteResGroup81], (instrs POP16r, POP32r, POP64r)>;
1210 def: InstRW<[SKXWriteResGroup81], (instregex "POP(16|32|64)rmr")>;
1212 def SKXWriteResGroup82 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1214 let NumMicroOps = 3;
1215 let ResourceCycles = [2,1];
1217 def: InstRW<[SKXWriteResGroup82], (instregex "(V?)CVTSI642SSrr",
1219 "VCVTUSI642SSZrr")>;
1221 def SKXWriteResGroup84 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort06,SKXPort0156]> {
1223 let NumMicroOps = 4;
1224 let ResourceCycles = [1,1,1,1];
1226 def: InstRW<[SKXWriteResGroup84], (instregex "SLDT(16|32|64)r")>;
1228 def SKXWriteResGroup86 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06]> {
1230 let NumMicroOps = 4;
1231 let ResourceCycles = [1,1,1,1];
1233 def: InstRW<[SKXWriteResGroup86], (instregex "SAR(8|16|32|64)m(1|i)",
1234 "SHL(8|16|32|64)m(1|i)",
1235 "SHR(8|16|32|64)m(1|i)")>;
1237 def SKXWriteResGroup87 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort0156]> {
1239 let NumMicroOps = 4;
1240 let ResourceCycles = [1,1,1,1];
1242 def: InstRW<[SKXWriteResGroup87], (instregex "POP(16|32|64)rmm",
1243 "PUSH(16|32|64)rmm")>;
1245 def SKXWriteResGroup88 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
1247 let NumMicroOps = 6;
1248 let ResourceCycles = [1,5];
1250 def: InstRW<[SKXWriteResGroup88], (instrs STD)>;
1252 def SKXWriteResGroup89 : SchedWriteRes<[SKXPort23]> {
1254 let NumMicroOps = 1;
1255 let ResourceCycles = [1];
1257 def: InstRW<[SKXWriteResGroup89], (instregex "LD_F(32|64|80)m")>;
1258 def: InstRW<[SKXWriteResGroup89], (instrs VBROADCASTF128,
1268 def SKXWriteResGroup90 : SchedWriteRes<[SKXPort01,SKXPort5]> {
1270 let NumMicroOps = 2;
1271 let ResourceCycles = [1,1];
1273 def: InstRW<[SKXWriteResGroup90], (instrs VCVTDQ2PDYrr)>;
1275 def SKXWriteResGroup92 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1277 let NumMicroOps = 2;
1278 let ResourceCycles = [1,1];
1280 def: InstRW<[SKXWriteResGroup92], (instregex "VMOVSDZrm(b?)",
1283 def SKXWriteResGroup92a : SchedWriteRes<[SKXPort5,SKXPort23]> {
1285 let NumMicroOps = 2;
1286 let ResourceCycles = [1,1];
1288 def: InstRW<[SKXWriteResGroup92a], (instregex "(V?)PMOV(SX|ZX)BDrm",
1289 "(V?)PMOV(SX|ZX)BQrm",
1290 "(V?)PMOV(SX|ZX)BWrm",
1291 "(V?)PMOV(SX|ZX)DQrm",
1292 "(V?)PMOV(SX|ZX)WDrm",
1293 "(V?)PMOV(SX|ZX)WQrm")>;
1295 def SKXWriteResGroup93 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1297 let NumMicroOps = 2;
1298 let ResourceCycles = [1,1];
1300 def: InstRW<[SKXWriteResGroup93], (instregex "VCVTDQ2PDZ256rr",
1301 "VCVTPD2DQ(Y|Z256)rr",
1302 "VCVTPD2PS(Y|Z256)rr",
1304 "VCVTPS2PD(Y|Z256)rr",
1308 "VCVTTPD2DQ(Y|Z256)rr",
1309 "VCVTTPD2UDQZ256rr",
1311 "VCVTTPS2UQQZ256rr",
1313 "VCVTUQQ2PSZ256rr")>;
1315 def SKXWriteResGroup93z : SchedWriteRes<[SKXPort5,SKXPort05]> {
1317 let NumMicroOps = 2;
1318 let ResourceCycles = [1,1];
1320 def: InstRW<[SKXWriteResGroup93z], (instrs VCVTDQ2PDZrr,
1335 def SKXWriteResGroup95 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1337 let NumMicroOps = 2;
1338 let ResourceCycles = [1,1];
1340 def: InstRW<[SKXWriteResGroup95], (instrs VMOVNTDQAZ128rm,
1342 def: InstRW<[SKXWriteResGroup95, ReadAfterVecXLd],
1343 (instregex "VBLENDMPDZ128rm(b?)",
1344 "VBLENDMPSZ128rm(b?)",
1345 "VBROADCASTI32X2Z128m(b?)",
1346 "VBROADCASTSSZ128m(b?)",
1347 "VINSERT(F|I)128rm",
1348 "VMOVAPDZ128rm(b?)",
1349 "VMOVAPSZ128rm(b?)",
1350 "VMOVDDUPZ128rm(b?)",
1351 "VMOVDQA32Z128rm(b?)",
1352 "VMOVDQA64Z128rm(b?)",
1353 "VMOVDQU16Z128rm(b?)",
1354 "VMOVDQU32Z128rm(b?)",
1355 "VMOVDQU64Z128rm(b?)",
1356 "VMOVDQU8Z128rm(b?)",
1357 "VMOVSHDUPZ128rm(b?)",
1358 "VMOVSLDUPZ128rm(b?)",
1359 "VMOVUPDZ128rm(b?)",
1360 "VMOVUPSZ128rm(b?)",
1361 "VPADD(B|D|Q|W)Z128rm(b?)",
1362 "(V?)PADD(B|D|Q|W)rm",
1363 "VPBLENDM(B|D|Q|W)Z128rm(b?)",
1364 "VPBROADCASTDZ128m(b?)",
1365 "VPBROADCASTQZ128m(b?)",
1366 "VPSUB(B|D|Q|W)Z128rm(b?)",
1367 "(V?)PSUB(B|D|Q|W)rm",
1368 "VPTERNLOGDZ128rm(b?)i",
1369 "VPTERNLOGQZ128rm(b?)i")>;
1371 def SKXWriteResGroup96 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1373 let NumMicroOps = 3;
1374 let ResourceCycles = [2,1];
1376 def: InstRW<[SKXWriteResGroup96], (instrs MMX_PACKSSDWirm,
1380 def SKXWriteResGroup97 : SchedWriteRes<[SKXPort5,SKXPort015]> {
1382 let NumMicroOps = 3;
1383 let ResourceCycles = [2,1];
1385 def: InstRW<[SKXWriteResGroup97], (instregex "VPERMI2W128rr",
1392 def SKXWriteResGroup99 : SchedWriteRes<[SKXPort23,SKXPort0156]> {
1394 let NumMicroOps = 3;
1395 let ResourceCycles = [1,2];
1397 def: InstRW<[SKXWriteResGroup99], (instrs LEAVE, LEAVE64,
1398 SCASB, SCASL, SCASQ, SCASW)>;
1400 def SKXWriteResGroup100 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort015]> {
1402 let NumMicroOps = 3;
1403 let ResourceCycles = [1,1,1];
1405 def: InstRW<[SKXWriteResGroup100], (instregex "VCVTSS2USI64Zrr",
1406 "(V?)CVTSS2SI64(Z?)rr",
1407 "(V?)CVTTSS2SI64(Z?)rr",
1408 "VCVTTSS2USI64Zrr")>;
1410 def SKXWriteResGroup101 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort05]> {
1412 let NumMicroOps = 3;
1413 let ResourceCycles = [1,1,1];
1415 def: InstRW<[SKXWriteResGroup101], (instrs FLDCW16m)>;
1417 def SKXWriteResGroup103 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort0156]> {
1419 let NumMicroOps = 3;
1420 let ResourceCycles = [1,1,1];
1422 def: InstRW<[SKXWriteResGroup103], (instregex "KMOV(B|D|Q|W)km")>;
1424 def SKXWriteResGroup104 : SchedWriteRes<[SKXPort6,SKXPort23,SKXPort0156]> {
1426 let NumMicroOps = 3;
1427 let ResourceCycles = [1,1,1];
1429 def: InstRW<[SKXWriteResGroup104], (instrs LRETQ, RETQ)>;
1431 def SKXWriteResGroup106 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort237]> {
1433 let NumMicroOps = 4;
1434 let ResourceCycles = [1,2,1];
1436 def: InstRW<[SKXWriteResGroup106], (instregex "VCOMPRESSPD(Z|Z128|Z256)mr(b?)",
1437 "VCOMPRESSPS(Z|Z128|Z256)mr(b?)",
1438 "VPCOMPRESSD(Z|Z128|Z256)mr(b?)",
1439 "VPCOMPRESSQ(Z|Z128|Z256)mr(b?)")>;
1441 def SKXWriteResGroup107 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06]> {
1443 let NumMicroOps = 5;
1444 let ResourceCycles = [1,1,1,2];
1446 def: InstRW<[SKXWriteResGroup107], (instregex "ROL(8|16|32|64)m(1|i)",
1447 "ROR(8|16|32|64)m(1|i)")>;
1449 def SKXWriteResGroup108 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort0156]> {
1451 let NumMicroOps = 5;
1452 let ResourceCycles = [1,1,1,2];
1454 def: InstRW<[SKXWriteResGroup108], (instregex "XADD(8|16|32|64)rm")>;
1456 def SKXWriteResGroup109 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort0156]> {
1458 let NumMicroOps = 5;
1459 let ResourceCycles = [1,1,1,1,1];
1461 def: InstRW<[SKXWriteResGroup109], (instregex "CALL(16|32|64)m")>;
1462 def: InstRW<[SKXWriteResGroup109], (instrs FARCALL64)>;
1464 def SKXWriteResGroup110 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237,SKXPort0156]> {
1466 let NumMicroOps = 7;
1467 let ResourceCycles = [1,2,2,2];
1469 def: InstRW<[SKXWriteResGroup110], (instrs VPSCATTERDQZ128mr,
1472 VSCATTERQPDZ128mr)>;
1474 def SKXWriteResGroup111 : SchedWriteRes<[SKXPort6,SKXPort06,SKXPort15,SKXPort0156]> {
1476 let NumMicroOps = 7;
1477 let ResourceCycles = [1,3,1,2];
1479 def: InstRW<[SKXWriteResGroup111], (instrs LOOP)>;
1481 def SKXWriteResGroup112 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237,SKXPort0156]> {
1483 let NumMicroOps = 11;
1484 let ResourceCycles = [1,4,4,2];
1486 def: InstRW<[SKXWriteResGroup112], (instrs VPSCATTERDQZ256mr,
1489 VSCATTERQPDZ256mr)>;
1491 def SKXWriteResGroup113 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort237,SKXPort0156]> {
1493 let NumMicroOps = 19;
1494 let ResourceCycles = [1,8,8,2];
1496 def: InstRW<[SKXWriteResGroup113], (instrs VPSCATTERDQZmr,
1501 def SKXWriteResGroup114 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1503 let NumMicroOps = 36;
1504 let ResourceCycles = [1,16,1,16,2];
1506 def: InstRW<[SKXWriteResGroup114], (instrs VSCATTERDPSZmr)>;
1508 def SKXWriteResGroup118 : SchedWriteRes<[SKXPort1,SKXPort23]> {
1510 let NumMicroOps = 2;
1511 let ResourceCycles = [1,1];
1513 def: InstRW<[SKXWriteResGroup118], (instregex "PDEP(32|64)rm",
1516 def SKXWriteResGroup119 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1518 let NumMicroOps = 2;
1519 let ResourceCycles = [1,1];
1521 def: InstRW<[SKXWriteResGroup119], (instregex "FCOM(P?)(32|64)m",
1522 "VFPCLASSSDZrm(b?)",
1523 "VPBROADCASTB(Z|Z256)m(b?)",
1524 "VPBROADCASTW(Z|Z256)m(b?)")>;
1525 def: InstRW<[SKXWriteResGroup119], (instrs VPBROADCASTBYrm,
1531 def SKXWriteResGroup121 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1533 let NumMicroOps = 2;
1534 let ResourceCycles = [1,1];
1536 def: InstRW<[SKXWriteResGroup121], (instrs VMOVNTDQAZ256rm,
1538 def: InstRW<[SKXWriteResGroup121, ReadAfterVecYLd],
1539 (instregex "VBLENDMPD(Z|Z256)rm(b?)",
1540 "VBLENDMPS(Z|Z256)rm(b?)",
1541 "VBROADCASTF32X2Z256m(b?)",
1542 "VBROADCASTF32X2Zm(b?)",
1543 "VBROADCASTF32X4Z256rm(b?)",
1544 "VBROADCASTF32X4rm(b?)",
1545 "VBROADCASTF32X8rm(b?)",
1546 "VBROADCASTF64X2Z128rm(b?)",
1547 "VBROADCASTF64X2rm(b?)",
1548 "VBROADCASTF64X4rm(b?)",
1549 "VBROADCASTI32X2Z256m(b?)",
1550 "VBROADCASTI32X2Zm(b?)",
1551 "VBROADCASTI32X4Z256rm(b?)",
1552 "VBROADCASTI32X4rm(b?)",
1553 "VBROADCASTI32X8rm(b?)",
1554 "VBROADCASTI64X2Z128rm(b?)",
1555 "VBROADCASTI64X2rm(b?)",
1556 "VBROADCASTI64X4rm(b?)",
1557 "VBROADCASTSD(Z|Z256)m(b?)",
1558 "VBROADCASTSS(Z|Z256)m(b?)",
1559 "VINSERTF32x4(Z|Z256)rm(b?)",
1560 "VINSERTF32x8Zrm(b?)",
1561 "VINSERTF64x2(Z|Z256)rm(b?)",
1562 "VINSERTF64x4Zrm(b?)",
1563 "VINSERTI32x4(Z|Z256)rm(b?)",
1564 "VINSERTI32x8Zrm(b?)",
1565 "VINSERTI64x2(Z|Z256)rm(b?)",
1566 "VINSERTI64x4Zrm(b?)",
1567 "VMOVAPD(Z|Z256)rm(b?)",
1568 "VMOVAPS(Z|Z256)rm(b?)",
1569 "VMOVDDUP(Z|Z256)rm(b?)",
1570 "VMOVDQA32(Z|Z256)rm(b?)",
1571 "VMOVDQA64(Z|Z256)rm(b?)",
1572 "VMOVDQU16(Z|Z256)rm(b?)",
1573 "VMOVDQU32(Z|Z256)rm(b?)",
1574 "VMOVDQU64(Z|Z256)rm(b?)",
1575 "VMOVDQU8(Z|Z256)rm(b?)",
1576 "VMOVSHDUP(Z|Z256)rm(b?)",
1577 "VMOVSLDUP(Z|Z256)rm(b?)",
1578 "VMOVUPD(Z|Z256)rm(b?)",
1579 "VMOVUPS(Z|Z256)rm(b?)",
1580 "VPADD(B|D|Q|W)Yrm",
1581 "VPADD(B|D|Q|W)(Z|Z256)rm(b?)",
1582 "VPBLENDM(B|D|Q|W)(Z|Z256)rm(b?)",
1583 "VPBROADCASTD(Z|Z256)m(b?)",
1584 "VPBROADCASTQ(Z|Z256)m(b?)",
1585 "VPSUB(B|D|Q|W)Yrm",
1586 "VPSUB(B|D|Q|W)(Z|Z256)rm(b?)",
1587 "VPTERNLOGD(Z|Z256)rm(b?)i",
1588 "VPTERNLOGQ(Z|Z256)rm(b?)i")>;
1590 def SKXWriteResGroup123 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
1592 let NumMicroOps = 4;
1593 let ResourceCycles = [1,2,1];
1595 def: InstRW<[SKXWriteResGroup123], (instregex "MMX_PH(ADD|SUB)SWrm")>;
1597 def SKXWriteResGroup127 : SchedWriteRes<[SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
1599 let NumMicroOps = 5;
1600 let ResourceCycles = [1,1,1,2];
1602 def: InstRW<[SKXWriteResGroup127], (instregex "RCL(8|16|32|64)m(1|i)",
1603 "RCR(8|16|32|64)m(1|i)")>;
1605 def SKXWriteResGroup128 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06]> {
1607 let NumMicroOps = 6;
1608 let ResourceCycles = [1,1,1,3];
1610 def: InstRW<[SKXWriteResGroup128], (instregex "ROL(8|16|32|64)mCL",
1611 "ROR(8|16|32|64)mCL",
1612 "SAR(8|16|32|64)mCL",
1613 "SHL(8|16|32|64)mCL",
1614 "SHR(8|16|32|64)mCL")>;
1616 def SKXWriteResGroup130 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
1618 let NumMicroOps = 6;
1619 let ResourceCycles = [1,1,1,2,1];
1621 def: SchedAlias<WriteADCRMW, SKXWriteResGroup130>;
1623 def SKXWriteResGroup131 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1625 let NumMicroOps = 8;
1626 let ResourceCycles = [1,2,1,2,2];
1628 def: InstRW<[SKXWriteResGroup131], (instrs VPSCATTERQDZ128mr,
1631 VSCATTERQPSZ256mr)>;
1633 def SKXWriteResGroup132 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1635 let NumMicroOps = 12;
1636 let ResourceCycles = [1,4,1,4,2];
1638 def: InstRW<[SKXWriteResGroup132], (instrs VPSCATTERDDZ128mr,
1639 VSCATTERDPSZ128mr)>;
1641 def SKXWriteResGroup133 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1643 let NumMicroOps = 20;
1644 let ResourceCycles = [1,8,1,8,2];
1646 def: InstRW<[SKXWriteResGroup133], (instrs VPSCATTERDDZ256mr,
1647 VSCATTERDPSZ256mr)>;
1649 def SKXWriteResGroup134 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort237,SKXPort0156]> {
1651 let NumMicroOps = 36;
1652 let ResourceCycles = [1,16,1,16,2];
1654 def: InstRW<[SKXWriteResGroup134], (instrs VPSCATTERDDZmr)>;
1656 def SKXWriteResGroup135 : SchedWriteRes<[SKXPort0,SKXPort23]> {
1658 let NumMicroOps = 2;
1659 let ResourceCycles = [1,1];
1661 def: InstRW<[SKXWriteResGroup135], (instrs MMX_CVTPI2PSirm)>;
1663 def SKXWriteResGroup136 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1665 let NumMicroOps = 2;
1666 let ResourceCycles = [1,1];
1668 def: InstRW<[SKXWriteResGroup136], (instrs VPMOVSXBWYrm,
1672 def: InstRW<[SKXWriteResGroup136], (instregex "VALIGN(D|Q)Z128rm(b?)i",
1673 "VCMP(PD|PS)Z128rm(b?)i",
1675 "VFPCLASSSSZrm(b?)",
1676 "VPCMPBZ128rmi(b?)",
1677 "VPCMPDZ128rmi(b?)",
1678 "VPCMPEQ(B|D|Q|W)Z128rm(b?)",
1679 "VPCMPGT(B|D|Q|W)Z128rm(b?)",
1681 "VPCMPQZ128rmi(b?)",
1682 "VPCMPU(B|D|Q|W)Z128rmi(b?)",
1683 "VPCMPWZ128rmi(b?)",
1684 "VPERMI2D128rm(b?)",
1685 "VPERMI2PD128rm(b?)",
1686 "VPERMI2PS128rm(b?)",
1687 "VPERMI2Q128rm(b?)",
1688 "VPERMT2D128rm(b?)",
1689 "VPERMT2PD128rm(b?)",
1690 "VPERMT2PS128rm(b?)",
1691 "VPERMT2Q128rm(b?)",
1692 "VPMAXSQZ128rm(b?)",
1693 "VPMAXUQZ128rm(b?)",
1694 "VPMINSQZ128rm(b?)",
1695 "VPMINUQZ128rm(b?)",
1696 "VPMOVSXBDZ128rm(b?)",
1697 "VPMOVSXBQZ128rm(b?)",
1698 "VPMOVSXBWZ128rm(b?)",
1699 "VPMOVSXDQZ128rm(b?)",
1700 "VPMOVSXWDZ128rm(b?)",
1701 "VPMOVSXWQZ128rm(b?)",
1702 "VPMOVZXBDZ128rm(b?)",
1703 "VPMOVZXBQZ128rm(b?)",
1704 "VPMOVZXBWZ128rm(b?)",
1705 "VPMOVZXDQZ128rm(b?)",
1706 "VPMOVZXWDZ128rm(b?)",
1707 "VPMOVZXWQZ128rm(b?)",
1708 "VPTESTMBZ128rm(b?)",
1709 "VPTESTMDZ128rm(b?)",
1710 "VPTESTMQZ128rm(b?)",
1711 "VPTESTMWZ128rm(b?)",
1712 "VPTESTNMBZ128rm(b?)",
1713 "VPTESTNMDZ128rm(b?)",
1714 "VPTESTNMQZ128rm(b?)",
1715 "VPTESTNMWZ128rm(b?)")>;
1717 def SKXWriteResGroup137 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1719 let NumMicroOps = 2;
1720 let ResourceCycles = [1,1];
1722 def: InstRW<[SKXWriteResGroup137], (instregex "MMX_CVT(T?)PS2PIirm",
1725 def SKXWriteResGroup143 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23]> {
1727 let NumMicroOps = 4;
1728 let ResourceCycles = [2,1,1];
1730 def: InstRW<[SKXWriteResGroup143], (instregex "(V?)PHADDSWrm",
1733 def SKXWriteResGroup146 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort23,SKXPort0156]> {
1735 let NumMicroOps = 5;
1736 let ResourceCycles = [1,2,1,1];
1738 def: InstRW<[SKXWriteResGroup146], (instregex "LAR(16|32|64)rm",
1739 "LSL(16|32|64)rm")>;
1741 def SKXWriteResGroup148 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1743 let NumMicroOps = 2;
1744 let ResourceCycles = [1,1];
1746 def: InstRW<[SKXWriteResGroup148], (instrs VPCMPGTQYrm)>;
1747 def: InstRW<[SKXWriteResGroup148], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
1749 "VALIGND(Z|Z256)rm(b?)i",
1750 "VALIGNQ(Z|Z256)rm(b?)i",
1751 "VCMPPD(Z|Z256)rm(b?)i",
1752 "VCMPPS(Z|Z256)rm(b?)i",
1753 "VPCMPB(Z|Z256)rmi(b?)",
1754 "VPCMPD(Z|Z256)rmi(b?)",
1755 "VPCMPEQB(Z|Z256)rm(b?)",
1756 "VPCMPEQD(Z|Z256)rm(b?)",
1757 "VPCMPEQQ(Z|Z256)rm(b?)",
1758 "VPCMPEQW(Z|Z256)rm(b?)",
1759 "VPCMPGTB(Z|Z256)rm(b?)",
1760 "VPCMPGTD(Z|Z256)rm(b?)",
1761 "VPCMPGTQ(Z|Z256)rm(b?)",
1762 "VPCMPGTW(Z|Z256)rm(b?)",
1763 "VPCMPQ(Z|Z256)rmi(b?)",
1764 "VPCMPU(B|D|Q|W)Z256rmi(b?)",
1765 "VPCMPU(B|D|Q|W)Zrmi(b?)",
1766 "VPCMPW(Z|Z256)rmi(b?)",
1767 "VPMAXSQ(Z|Z256)rm(b?)",
1768 "VPMAXUQ(Z|Z256)rm(b?)",
1769 "VPMINSQ(Z|Z256)rm(b?)",
1770 "VPMINUQ(Z|Z256)rm(b?)",
1771 "VPTESTM(B|D|Q|W)Z256rm(b?)",
1772 "VPTESTM(B|D|Q|W)Zrm(b?)",
1773 "VPTESTNM(B|D|Q|W)Z256rm(b?)",
1774 "VPTESTNM(B|D|Q|W)Zrm(b?)")>;
1776 def SKXWriteResGroup149 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1778 let NumMicroOps = 2;
1779 let ResourceCycles = [1,1];
1781 def: InstRW<[SKXWriteResGroup149], (instregex "VCVTDQ2PDZ128rm(b?)",
1782 "VCVTDQ2PSZ128rm(b?)",
1784 "VCVTPD2QQZ128rm(b?)",
1785 "VCVTPD2UQQZ128rm(b?)",
1786 "VCVTPH2PSZ128rm(b?)",
1787 "VCVTPS2DQZ128rm(b?)",
1789 "VCVTPS2PDZ128rm(b?)",
1790 "VCVTPS2QQZ128rm(b?)",
1791 "VCVTPS2UDQZ128rm(b?)",
1792 "VCVTPS2UQQZ128rm(b?)",
1793 "VCVTQQ2PDZ128rm(b?)",
1794 "VCVTQQ2PSZ128rm(b?)",
1797 "VCVTTPD2QQZ128rm(b?)",
1798 "VCVTTPD2UQQZ128rm(b?)",
1799 "VCVTTPS2DQZ128rm(b?)",
1801 "VCVTTPS2QQZ128rm(b?)",
1802 "VCVTTPS2UDQZ128rm(b?)",
1803 "VCVTTPS2UQQZ128rm(b?)",
1804 "VCVTUDQ2PDZ128rm(b?)",
1805 "VCVTUDQ2PSZ128rm(b?)",
1806 "VCVTUQQ2PDZ128rm(b?)",
1807 "VCVTUQQ2PSZ128rm(b?)")>;
1809 def SKXWriteResGroup151 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1811 let NumMicroOps = 3;
1812 let ResourceCycles = [2,1];
1814 def: InstRW<[SKXWriteResGroup151], (instregex "VEXPANDPDZ128rm(b?)",
1815 "VEXPANDPSZ128rm(b?)",
1816 "VPEXPANDDZ128rm(b?)",
1817 "VPEXPANDQZ128rm(b?)")>;
1819 def SKXWriteResGroup153 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
1821 let NumMicroOps = 3;
1822 let ResourceCycles = [1,1,1];
1824 def: InstRW<[SKXWriteResGroup153], (instregex "(V?)CVTSD2SSrm")>;
1826 def SKXWriteResGroup154 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23]> {
1828 let NumMicroOps = 4;
1829 let ResourceCycles = [2,1,1];
1831 def: InstRW<[SKXWriteResGroup154], (instrs VPHADDSWYrm,
1834 def SKXWriteResGroup157 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
1836 let NumMicroOps = 8;
1837 let ResourceCycles = [1,1,1,1,1,3];
1839 def: InstRW<[SKXWriteResGroup157], (instregex "XCHG(8|16|32|64)rm")>;
1841 def SKXWriteResGroup159 : SchedWriteRes<[SKXPort0,SKXFPDivider]> {
1843 let NumMicroOps = 1;
1844 let ResourceCycles = [1,3];
1846 def : SchedAlias<WriteFDivX, SKXWriteResGroup159>; // TODO - convert to ZnWriteResFpuPair
1848 def SKXWriteResGroup160 : SchedWriteRes<[SKXPort0,SKXPort23]> {
1850 let NumMicroOps = 2;
1851 let ResourceCycles = [1,1];
1853 def: InstRW<[SKXWriteResGroup160], (instregex "MUL_F(32|64)m")>;
1855 def SKXWriteResGroup161 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1857 let NumMicroOps = 2;
1858 let ResourceCycles = [1,1];
1860 def: InstRW<[SKXWriteResGroup161], (instrs VCVTDQ2PSYrm,
1862 def: InstRW<[SKXWriteResGroup161], (instregex "VCVTDQ2(PD|PS)(Z|Z256)rm(b?)",
1863 "VCVTPH2PS(Z|Z256)rm(b?)",
1864 "VCVTPS2PD(Z|Z256)rm(b?)",
1865 "VCVTQQ2PD(Z|Z256)rm(b?)",
1866 "VCVTQQ2PSZ256rm(b?)",
1867 "VCVT(T?)PD2QQ(Z|Z256)rm(b?)",
1868 "VCVT(T?)PD2UQQ(Z|Z256)rm(b?)",
1870 "VCVT(T?)PS2DQ(Z|Z256)rm(b?)",
1871 "VCVT(T?)PS2QQZ256rm(b?)",
1872 "VCVT(T?)PS2UDQ(Z|Z256)rm(b?)",
1873 "VCVT(T?)PS2UQQZ256rm(b?)",
1874 "VCVTUDQ2(PD|PS)(Z|Z256)rm(b?)",
1875 "VCVTUQQ2PD(Z|Z256)rm(b?)",
1876 "VCVTUQQ2PSZ256rm(b?)")>;
1878 def SKXWriteResGroup162 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1880 let NumMicroOps = 3;
1881 let ResourceCycles = [2,1];
1883 def: InstRW<[SKXWriteResGroup162], (instregex "FICOM(P?)(16|32)m",
1884 "VEXPANDPD(Z|Z256)rm(b?)",
1885 "VEXPANDPS(Z|Z256)rm(b?)",
1886 "VPEXPANDD(Z|Z256)rm(b?)",
1887 "VPEXPANDQ(Z|Z256)rm(b?)")>;
1889 def SKXWriteResGroup163 : SchedWriteRes<[SKXPort23,SKXPort015]> {
1891 let NumMicroOps = 3;
1892 let ResourceCycles = [1,2];
1894 def: InstRW<[SKXWriteResGroup163], (instregex "VCVTSD2SSZrm")>;
1896 def SKXWriteResGroup164 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
1898 let NumMicroOps = 3;
1899 let ResourceCycles = [1,1,1];
1901 def: InstRW<[SKXWriteResGroup164], (instregex "(V?)CVTDQ2PDrm")>;
1903 def SKXWriteResGroup166 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
1905 let NumMicroOps = 3;
1906 let ResourceCycles = [1,1,1];
1908 def: InstRW<[SKXWriteResGroup166], (instrs CVTPD2PSrm,
1914 def SKXWriteResGroup167 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
1916 let NumMicroOps = 4;
1917 let ResourceCycles = [2,1,1];
1919 def: InstRW<[SKXWriteResGroup167], (instregex "VPCONFLICTQZ128rm(b?)")>;
1921 def SKXWriteResGroup169 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort0156]> {
1923 let NumMicroOps = 7;
1924 let ResourceCycles = [2,3,2];
1926 def: InstRW<[SKXWriteResGroup169], (instregex "RCL(16|32|64)rCL",
1927 "RCR(16|32|64)rCL")>;
1929 def SKXWriteResGroup170 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort15,SKXPort0156]> {
1931 let NumMicroOps = 9;
1932 let ResourceCycles = [1,5,1,2];
1934 def: InstRW<[SKXWriteResGroup170], (instrs RCL8rCL)>;
1936 def SKXWriteResGroup171 : SchedWriteRes<[SKXPort06,SKXPort0156]> {
1938 let NumMicroOps = 11;
1939 let ResourceCycles = [2,9];
1941 def: InstRW<[SKXWriteResGroup171], (instrs LOOPE, LOOPNE)>;
1943 def SKXWriteResGroup174 : SchedWriteRes<[SKXPort01]> {
1945 let NumMicroOps = 3;
1946 let ResourceCycles = [3];
1948 def: InstRW<[SKXWriteResGroup174], (instregex "VPMULLQ(Z128|Z256)rr")>;
1950 def SKXWriteResGroup174z : SchedWriteRes<[SKXPort05]> {
1952 let NumMicroOps = 3;
1953 let ResourceCycles = [3];
1955 def: InstRW<[SKXWriteResGroup174z], (instregex "VPMULLQZrr")>;
1957 def SKXWriteResGroup175 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1959 let NumMicroOps = 3;
1960 let ResourceCycles = [2,1];
1962 def: InstRW<[SKXWriteResGroup175], (instregex "VPERMWZ128rm(b?)")>;
1964 def SKXWriteResGroup176 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015]> {
1966 let NumMicroOps = 3;
1967 let ResourceCycles = [1,1,1];
1969 def: InstRW<[SKXWriteResGroup176], (instregex "VCVT(T?)SD2USIZrm(b?)",
1970 "VCVT(T?)SS2USI64Zrm(b?)")>;
1972 def SKXWriteResGroup177 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
1974 let NumMicroOps = 3;
1975 let ResourceCycles = [1,1,1];
1977 def: InstRW<[SKXWriteResGroup177], (instregex "VCVT(T?)PS2QQZrm(b?)",
1978 "VCVT(T?)PS2UQQZrm(b?)")>;
1980 def SKXWriteResGroup179 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23,SKXPort015]> {
1982 let NumMicroOps = 4;
1983 let ResourceCycles = [1,1,1,1];
1985 def: InstRW<[SKXWriteResGroup179], (instregex "CVTTSS2SI64rm")>;
1987 def SKXWriteResGroup180 : SchedWriteRes<[SKXPort5,SKXPort23]> {
1989 let NumMicroOps = 3;
1990 let ResourceCycles = [2,1];
1992 def: InstRW<[SKXWriteResGroup180], (instregex "(ADD|SUB|SUBR)_FI(16|32)m",
1996 def SKXWriteResGroup181 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
1998 let NumMicroOps = 3;
1999 let ResourceCycles = [1,1,1];
2001 def: InstRW<[SKXWriteResGroup181], (instrs VCVTDQ2PDYrm)>;
2003 def SKXWriteResGroup183 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2005 let NumMicroOps = 4;
2006 let ResourceCycles = [2,1,1];
2008 def: InstRW<[SKXWriteResGroup183], (instregex "VPERMI2W128rm(b?)",
2009 "VPERMT2W128rm(b?)")>;
2011 def SKXWriteResGroup184 : SchedWriteRes<[SKXPort0,SKXFPDivider]> {
2013 let NumMicroOps = 1;
2014 let ResourceCycles = [1,3];
2016 def : SchedAlias<WriteFDiv64, SKXWriteResGroup184>; // TODO - convert to ZnWriteResFpuPair
2017 def : SchedAlias<WriteFDiv64X, SKXWriteResGroup184>; // TODO - convert to ZnWriteResFpuPair
2019 def SKXWriteResGroup184_1 : SchedWriteRes<[SKXPort0,SKXFPDivider]> {
2021 let NumMicroOps = 1;
2022 let ResourceCycles = [1,5];
2024 def : SchedAlias<WriteFDiv64Y, SKXWriteResGroup184_1>; // TODO - convert to ZnWriteResFpuPair
2026 def SKXWriteResGroup187 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2028 let NumMicroOps = 3;
2029 let ResourceCycles = [1,1,1];
2031 def: InstRW<[SKXWriteResGroup187], (instregex "MUL_FI(16|32)m")>;
2033 def SKXWriteResGroup188 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2035 let NumMicroOps = 3;
2036 let ResourceCycles = [1,1,1];
2038 def: InstRW<[SKXWriteResGroup188], (instregex "VCVTPD2DQZrm(b?)",
2040 "VCVTPD2UDQZrm(b?)",
2042 "VCVTTPD2DQZrm(b?)",
2043 "VCVTTPD2UDQZrm(b?)",
2044 "VCVTUQQ2PSZrm(b?)")>;
2046 def SKXWriteResGroup189 : SchedWriteRes<[SKXPort5,SKXPort23,SKXPort015]> {
2048 let NumMicroOps = 4;
2049 let ResourceCycles = [2,1,1];
2051 def: InstRW<[SKXWriteResGroup189], (instregex "VPERMI2W256rm(b?)",
2053 "VPERMT2W256rm(b?)",
2056 def SKXWriteResGroup190 : SchedWriteRes<[SKXPort1,SKXPort06,SKXPort15,SKXPort0156]> {
2058 let NumMicroOps = 10;
2059 let ResourceCycles = [2,4,1,3];
2061 def: InstRW<[SKXWriteResGroup190], (instrs RCR8rCL)>;
2063 def SKXWriteResGroup191 : SchedWriteRes<[SKXPort0]> {
2065 let NumMicroOps = 1;
2066 let ResourceCycles = [1];
2068 def: InstRW<[SKXWriteResGroup191], (instregex "DIVR_(FPrST0|FST0r|FrST0)")>;
2070 def SKXWriteResGroup194 : SchedWriteRes<[SKXPort1,SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2072 let NumMicroOps = 8;
2073 let ResourceCycles = [1,2,2,1,2];
2075 def: InstRW<[SKXWriteResGroup194], (instregex "VPCONFLICTDZ128rm(b?)")>;
2077 def SKXWriteResGroup195 : SchedWriteRes<[SKXPort1,SKXPort23,SKXPort237,SKXPort06,SKXPort15,SKXPort0156]> {
2079 let NumMicroOps = 10;
2080 let ResourceCycles = [1,1,1,5,1,1];
2082 def: InstRW<[SKXWriteResGroup195], (instregex "RCL(8|16|32|64)mCL")>;
2084 def SKXWriteResGroup199 : SchedWriteRes<[SKXPort4,SKXPort23,SKXPort237,SKXPort06,SKXPort15,SKXPort0156]> {
2086 let NumMicroOps = 14;
2087 let ResourceCycles = [1,1,1,4,2,5];
2089 def: InstRW<[SKXWriteResGroup199], (instrs CMPXCHG8B)>;
2091 def SKXWriteResGroup200 : SchedWriteRes<[SKXPort1, SKXPort05, SKXPort6]> {
2093 let NumMicroOps = 34;
2094 let ResourceCycles = [1, 4, 5];
2096 def: InstRW<[SKXWriteResGroup200], (instrs VZEROALL)>;
2098 def SKXWriteResGroup201 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2100 let NumMicroOps = 2;
2101 let ResourceCycles = [1,1,5];
2103 def : SchedAlias<WriteFDivXLd, SKXWriteResGroup201>; // TODO - convert to ZnWriteResFpuPair
2105 def SKXWriteResGroup202 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort5,SKXPort6,SKXPort05,SKXPort0156]> {
2107 let NumMicroOps = 15;
2108 let ResourceCycles = [2,1,2,4,2,4];
2110 def: InstRW<[SKXWriteResGroup202], (instrs XCH_F)>;
2112 def SKXWriteResGroup205 : SchedWriteRes<[SKXPort23,SKXPort015]> {
2114 let NumMicroOps = 4;
2115 let ResourceCycles = [1,3];
2117 def: InstRW<[SKXWriteResGroup205], (instregex "VPMULLQZ128rm(b?)")>;
2119 def SKXWriteResGroup207 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort06,SKXPort0156]> {
2121 let NumMicroOps = 8;
2122 let ResourceCycles = [1,1,1,5];
2124 def: InstRW<[SKXWriteResGroup207], (instrs CPUID, RDTSC)>;
2126 def SKXWriteResGroup208 : SchedWriteRes<[SKXPort1,SKXPort23,SKXPort237,SKXPort06,SKXPort15,SKXPort0156]> {
2128 let NumMicroOps = 11;
2129 let ResourceCycles = [2,1,1,4,1,2];
2131 def: InstRW<[SKXWriteResGroup208], (instregex "RCR(8|16|32|64)mCL")>;
2133 def SKXWriteResGroup209 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2135 let NumMicroOps = 2;
2136 let ResourceCycles = [1,1,4];
2138 def : SchedAlias<WriteFDiv64Ld, SKXWriteResGroup209>; // TODO - convert to ZnWriteResFpuPair
2140 def SKXWriteResGroup211 : SchedWriteRes<[SKXPort23,SKXPort015]> {
2142 let NumMicroOps = 4;
2143 let ResourceCycles = [1,3];
2145 def: InstRW<[SKXWriteResGroup211], (instregex "VPMULLQZ256rm(b?)",
2148 def SKXWriteResGroup214 : SchedWriteRes<[]> {
2150 let NumMicroOps = 0;
2152 def: InstRW<[SKXWriteResGroup214], (instrs VGATHERDPSZ128rm,
2156 def SKXWriteResGroup215 : SchedWriteRes<[SKXPort0]> {
2158 let NumMicroOps = 1;
2159 let ResourceCycles = [1];
2161 def: InstRW<[SKXWriteResGroup215], (instregex "DIV_(FPrST0|FST0r|FrST0)")>;
2163 def SKXWriteResGroup216 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2165 let NumMicroOps = 2;
2166 let ResourceCycles = [1,1,4];
2168 def : SchedAlias<WriteFDiv64XLd, SKXWriteResGroup216>; // TODO - convert to ZnWriteResFpuPair
2170 def SKXWriteResGroup218 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2172 let NumMicroOps = 5;
2173 let ResourceCycles = [1,2,1,1];
2175 def: InstRW<[SKXWriteResGroup218], (instrs VGATHERQPSZ128rm,
2180 def SKXWriteResGroup219 : SchedWriteRes<[SKXPort4,SKXPort5,SKXPort6,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
2182 let NumMicroOps = 8;
2183 let ResourceCycles = [1,1,1,1,1,1,2];
2185 def: InstRW<[SKXWriteResGroup219], (instrs INSB, INSL, INSW)>;
2187 def SKXWriteResGroup220 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort0156]> {
2189 let NumMicroOps = 10;
2190 let ResourceCycles = [1,2,7];
2192 def: InstRW<[SKXWriteResGroup220], (instrs MWAITrr)>;
2194 def SKXWriteResGroup222 : SchedWriteRes<[SKXPort0,SKXPort23,SKXFPDivider]> {
2196 let NumMicroOps = 2;
2197 let ResourceCycles = [1,1,8];
2199 def : SchedAlias<WriteFDiv64YLd, SKXWriteResGroup222>; // TODO - convert to ZnWriteResFpuPair
2201 def SKXWriteResGroup223 : SchedWriteRes<[SKXPort0,SKXPort23]> {
2203 let NumMicroOps = 2;
2204 let ResourceCycles = [1,1];
2206 def: InstRW<[SKXWriteResGroup223], (instregex "DIV_F(32|64)m")>;
2208 def SKXWriteResGroup224 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2210 let NumMicroOps = 5;
2211 let ResourceCycles = [1,2,1,1];
2213 def: InstRW<[SKXWriteResGroup224], (instrs VGATHERDPDZ128rm,
2218 def SKXWriteResGroup224_2 : SchedWriteRes<[SKXPort0, SKXPort23, SKXPort5, SKXPort015]> {
2220 let NumMicroOps = 5;
2221 let ResourceCycles = [1,2,1,1];
2223 def: InstRW<[SKXWriteResGroup224_2], (instrs VGATHERDPSrm,
2240 def SKXWriteResGroup224_3 : SchedWriteRes<[SKXPort0, SKXPort23, SKXPort5, SKXPort015]> {
2242 let NumMicroOps = 5;
2243 let ResourceCycles = [1,2,1,1];
2245 def: InstRW<[SKXWriteResGroup224_3], (instrs VGATHERDPSYrm,
2260 def SKXWriteResGroup225 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort015]> {
2262 let NumMicroOps = 14;
2263 let ResourceCycles = [5,5,4];
2265 def: InstRW<[SKXWriteResGroup225], (instregex "VPCONFLICTDZ128rr",
2266 "VPCONFLICTQZ256rr")>;
2268 def SKXWriteResGroup228 : SchedWriteRes<[SKXPort0,SKXPort4,SKXPort5,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
2270 let NumMicroOps = 19;
2271 let ResourceCycles = [2,1,4,1,1,4,6];
2273 def: InstRW<[SKXWriteResGroup228], (instrs CMPXCHG16B)>;
2275 def SKXWriteResGroup233 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2277 let NumMicroOps = 3;
2278 let ResourceCycles = [1,1,1];
2280 def: InstRW<[SKXWriteResGroup233], (instregex "DIV_FI(16|32)m")>;
2282 def SKXWriteResGroup234 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2284 let NumMicroOps = 5;
2285 let ResourceCycles = [1,2,1,1];
2287 def: InstRW<[SKXWriteResGroup234], (instrs VGATHERDPDZ256rm,
2293 def SKXWriteResGroup238 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2295 let NumMicroOps = 5;
2296 let ResourceCycles = [1,2,1,1];
2298 def: InstRW<[SKXWriteResGroup238], (instrs VGATHERDPDZrm,
2303 def SKXWriteResGroup239 : SchedWriteRes<[SKXPort0,SKXPort23]> {
2305 let NumMicroOps = 2;
2306 let ResourceCycles = [1,1];
2308 def: InstRW<[SKXWriteResGroup239], (instregex "DIVR_F(32|64)m")>;
2310 def SKXWriteResGroup240 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2312 let NumMicroOps = 5;
2313 let ResourceCycles = [1,2,1,1];
2315 def: InstRW<[SKXWriteResGroup240], (instrs VGATHERDPSZ256rm,
2318 def SKXWriteResGroup242 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2320 let NumMicroOps = 15;
2321 let ResourceCycles = [5,5,1,4];
2323 def: InstRW<[SKXWriteResGroup242], (instregex "VPCONFLICTQZ256rm(b?)")>;
2325 def SKXWriteResGroup243 : SchedWriteRes<[SKXPort0,SKXPort5,SKXPort23]> {
2327 let NumMicroOps = 3;
2328 let ResourceCycles = [1,1,1];
2330 def: InstRW<[SKXWriteResGroup243], (instregex "DIVR_FI(16|32)m")>;
2332 def SKXWriteResGroup245 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort015,SKXPort0156]> {
2334 let NumMicroOps = 5;
2335 let ResourceCycles = [1,2,1,1];
2337 def: InstRW<[SKXWriteResGroup245], (instrs VGATHERDPSZrm,
2340 def SKXWriteResGroup247 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort23,SKXPort06,SKXPort0156]> {
2342 let NumMicroOps = 23;
2343 let ResourceCycles = [1,5,3,4,10];
2345 def: InstRW<[SKXWriteResGroup247], (instregex "IN(8|16|32)ri",
2348 def SKXWriteResGroup248 : SchedWriteRes<[SKXPort5,SKXPort6,SKXPort23,SKXPort237,SKXPort06,SKXPort0156]> {
2350 let NumMicroOps = 23;
2351 let ResourceCycles = [1,5,2,1,4,10];
2353 def: InstRW<[SKXWriteResGroup248], (instregex "OUT(8|16|32)ir",
2356 def SKXWriteResGroup249 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort015]> {
2358 let NumMicroOps = 21;
2359 let ResourceCycles = [9,7,5];
2361 def: InstRW<[SKXWriteResGroup249], (instregex "VPCONFLICTDZ256rr",
2364 def SKXWriteResGroup250 : SchedWriteRes<[SKXPort1,SKXPort6,SKXPort23,SKXPort0156]> {
2366 let NumMicroOps = 31;
2367 let ResourceCycles = [1,8,1,21];
2369 def: InstRW<[SKXWriteResGroup250], (instregex "XRSTOR(64)?")>;
2371 def SKXWriteResGroup252 : SchedWriteRes<[SKXPort1,SKXPort4,SKXPort5,SKXPort6,SKXPort23,SKXPort237,SKXPort15,SKXPort0156]> {
2373 let NumMicroOps = 18;
2374 let ResourceCycles = [1,1,2,3,1,1,1,8];
2376 def: InstRW<[SKXWriteResGroup252], (instrs VMCLEARm)>;
2378 def SKXWriteResGroup253 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort0156]> {
2380 let NumMicroOps = 39;
2381 let ResourceCycles = [1,10,1,1,26];
2383 def: InstRW<[SKXWriteResGroup253], (instrs XSAVE64)>;
2385 def SKXWriteResGroup254 : SchedWriteRes<[SKXPort5,SKXPort0156]> {
2387 let NumMicroOps = 22;
2388 let ResourceCycles = [2,20];
2390 def: InstRW<[SKXWriteResGroup254], (instrs RDTSCP)>;
2392 def SKXWriteResGroup255 : SchedWriteRes<[SKXPort4,SKXPort6,SKXPort23,SKXPort237,SKXPort0156]> {
2394 let NumMicroOps = 40;
2395 let ResourceCycles = [1,11,1,1,26];
2397 def: InstRW<[SKXWriteResGroup255], (instrs XSAVE)>;
2398 def: InstRW<[SKXWriteResGroup255], (instregex "XSAVEC", "XSAVES", "XSAVEOPT")>;
2400 def SKXWriteResGroup256 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2402 let NumMicroOps = 22;
2403 let ResourceCycles = [9,7,1,5];
2405 def: InstRW<[SKXWriteResGroup256], (instregex "VPCONFLICTDZ256rm(b?)",
2406 "VPCONFLICTQZrm(b?)")>;
2408 def SKXWriteResGroup258 : SchedWriteRes<[SKXPort0,SKXPort23,SKXPort05,SKXPort06,SKXPort0156]> {
2410 let NumMicroOps = 64;
2411 let ResourceCycles = [2,8,5,10,39];
2413 def: InstRW<[SKXWriteResGroup258], (instrs FLDENVm)>;
2415 def SKXWriteResGroup259 : SchedWriteRes<[SKXPort0,SKXPort6,SKXPort23,SKXPort05,SKXPort06,SKXPort15,SKXPort0156]> {
2417 let NumMicroOps = 88;
2418 let ResourceCycles = [4,4,31,1,2,1,45];
2420 def: InstRW<[SKXWriteResGroup259], (instrs FXRSTOR64)>;
2422 def SKXWriteResGroup260 : SchedWriteRes<[SKXPort0,SKXPort6,SKXPort23,SKXPort05,SKXPort06,SKXPort15,SKXPort0156]> {
2424 let NumMicroOps = 90;
2425 let ResourceCycles = [4,2,33,1,2,1,47];
2427 def: InstRW<[SKXWriteResGroup260], (instrs FXRSTOR)>;
2429 def SKXWriteResGroup261 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort015]> {
2431 let NumMicroOps = 35;
2432 let ResourceCycles = [17,11,7];
2434 def: InstRW<[SKXWriteResGroup261], (instregex "VPCONFLICTDZrr")>;
2436 def SKXWriteResGroup262 : SchedWriteRes<[SKXPort5,SKXPort01,SKXPort23,SKXPort015]> {
2438 let NumMicroOps = 36;
2439 let ResourceCycles = [17,11,1,7];
2441 def: InstRW<[SKXWriteResGroup262], (instregex "VPCONFLICTDZrm(b?)")>;
2443 def SKXWriteResGroup263 : SchedWriteRes<[SKXPort5,SKXPort05,SKXPort0156]> {
2445 let NumMicroOps = 15;
2446 let ResourceCycles = [6,3,6];
2448 def: InstRW<[SKXWriteResGroup263], (instrs FNINIT)>;
2450 def SKXWriteResGroup266 : SchedWriteRes<[SKXPort0,SKXPort1,SKXPort4,SKXPort5,SKXPort6,SKXPort237,SKXPort06,SKXPort0156]> {
2452 let NumMicroOps = 100;
2453 let ResourceCycles = [9,1,11,16,1,11,21,30];
2455 def: InstRW<[SKXWriteResGroup266], (instrs FSTENVm)>;
2457 def SKXWriteResGroup267 : SchedWriteRes<[SKXPort6,SKXPort0156]> {
2459 let NumMicroOps = 4;
2460 let ResourceCycles = [1,3];
2462 def: InstRW<[SKXWriteResGroup267], (instrs PAUSE)>;
2464 def: InstRW<[WriteZero], (instrs CLC)>;