xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/X86/X86SchedSkylakeClient.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric//=- X86SchedSkylake.td - X86 Skylake Client Scheduling ------*- tablegen -*-=//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric//
90b57cec5SDimitry Andric// This file defines the machine model for Skylake Client to support
100b57cec5SDimitry Andric// instruction scheduling and other instruction cost heuristics.
110b57cec5SDimitry Andric//
120b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric
140b57cec5SDimitry Andricdef SkylakeClientModel : SchedMachineModel {
150b57cec5SDimitry Andric  // All x86 instructions are modeled as a single micro-op, and SKylake can
160b57cec5SDimitry Andric  // decode 6 instructions per cycle.
170b57cec5SDimitry Andric  let IssueWidth = 6;
180b57cec5SDimitry Andric  let MicroOpBufferSize = 224; // Based on the reorder buffer.
190b57cec5SDimitry Andric  let LoadLatency = 5;
200b57cec5SDimitry Andric  let MispredictPenalty = 14;
210b57cec5SDimitry Andric
220b57cec5SDimitry Andric  // Based on the LSD (loop-stream detector) queue size and benchmarking data.
230b57cec5SDimitry Andric  let LoopMicroOpBufferSize = 50;
240b57cec5SDimitry Andric
250b57cec5SDimitry Andric  // This flag is set to allow the scheduler to assign a default model to
260b57cec5SDimitry Andric  // unrecognized opcodes.
270b57cec5SDimitry Andric  let CompleteModel = 0;
280b57cec5SDimitry Andric}
290b57cec5SDimitry Andric
300b57cec5SDimitry Andriclet SchedModel = SkylakeClientModel in {
310b57cec5SDimitry Andric
320b57cec5SDimitry Andric// Skylake Client can issue micro-ops to 8 different ports in one cycle.
330b57cec5SDimitry Andric
340b57cec5SDimitry Andric// Ports 0, 1, 5, and 6 handle all computation.
350b57cec5SDimitry Andric// Port 4 gets the data half of stores. Store data can be available later than
360b57cec5SDimitry Andric// the store address, but since we don't model the latency of stores, we can
370b57cec5SDimitry Andric// ignore that.
380b57cec5SDimitry Andric// Ports 2 and 3 are identical. They handle loads and the address half of
390b57cec5SDimitry Andric// stores. Port 7 can handle address calculations.
400b57cec5SDimitry Andricdef SKLPort0 : ProcResource<1>;
410b57cec5SDimitry Andricdef SKLPort1 : ProcResource<1>;
420b57cec5SDimitry Andricdef SKLPort2 : ProcResource<1>;
430b57cec5SDimitry Andricdef SKLPort3 : ProcResource<1>;
440b57cec5SDimitry Andricdef SKLPort4 : ProcResource<1>;
450b57cec5SDimitry Andricdef SKLPort5 : ProcResource<1>;
460b57cec5SDimitry Andricdef SKLPort6 : ProcResource<1>;
470b57cec5SDimitry Andricdef SKLPort7 : ProcResource<1>;
480b57cec5SDimitry Andric
490b57cec5SDimitry Andric// Many micro-ops are capable of issuing on multiple ports.
500b57cec5SDimitry Andricdef SKLPort01  : ProcResGroup<[SKLPort0, SKLPort1]>;
510b57cec5SDimitry Andricdef SKLPort23  : ProcResGroup<[SKLPort2, SKLPort3]>;
520b57cec5SDimitry Andricdef SKLPort237 : ProcResGroup<[SKLPort2, SKLPort3, SKLPort7]>;
530b57cec5SDimitry Andricdef SKLPort04  : ProcResGroup<[SKLPort0, SKLPort4]>;
540b57cec5SDimitry Andricdef SKLPort05  : ProcResGroup<[SKLPort0, SKLPort5]>;
550b57cec5SDimitry Andricdef SKLPort06  : ProcResGroup<[SKLPort0, SKLPort6]>;
560b57cec5SDimitry Andricdef SKLPort15  : ProcResGroup<[SKLPort1, SKLPort5]>;
570b57cec5SDimitry Andricdef SKLPort16  : ProcResGroup<[SKLPort1, SKLPort6]>;
580b57cec5SDimitry Andricdef SKLPort56  : ProcResGroup<[SKLPort5, SKLPort6]>;
590b57cec5SDimitry Andricdef SKLPort015 : ProcResGroup<[SKLPort0, SKLPort1, SKLPort5]>;
600b57cec5SDimitry Andricdef SKLPort056 : ProcResGroup<[SKLPort0, SKLPort5, SKLPort6]>;
610b57cec5SDimitry Andricdef SKLPort0156: ProcResGroup<[SKLPort0, SKLPort1, SKLPort5, SKLPort6]>;
620b57cec5SDimitry Andric
630b57cec5SDimitry Andricdef SKLDivider : ProcResource<1>; // Integer division issued on port 0.
640b57cec5SDimitry Andric// FP division and sqrt on port 0.
650b57cec5SDimitry Andricdef SKLFPDivider : ProcResource<1>;
660b57cec5SDimitry Andric
670b57cec5SDimitry Andric// 60 Entry Unified Scheduler
680b57cec5SDimitry Andricdef SKLPortAny : ProcResGroup<[SKLPort0, SKLPort1, SKLPort2, SKLPort3, SKLPort4,
690b57cec5SDimitry Andric                              SKLPort5, SKLPort6, SKLPort7]> {
700b57cec5SDimitry Andric  let BufferSize=60;
710b57cec5SDimitry Andric}
720b57cec5SDimitry Andric
730b57cec5SDimitry Andric// Integer loads are 5 cycles, so ReadAfterLd registers needn't be available until 5
740b57cec5SDimitry Andric// cycles after the memory operand.
750b57cec5SDimitry Andricdef : ReadAdvance<ReadAfterLd, 5>;
760b57cec5SDimitry Andric
770b57cec5SDimitry Andric// Vector loads are 5/6/7 cycles, so ReadAfterVec*Ld registers needn't be available
780b57cec5SDimitry Andric// until 5/6/7 cycles after the memory operand.
790b57cec5SDimitry Andricdef : ReadAdvance<ReadAfterVecLd, 5>;
800b57cec5SDimitry Andricdef : ReadAdvance<ReadAfterVecXLd, 6>;
810b57cec5SDimitry Andricdef : ReadAdvance<ReadAfterVecYLd, 7>;
820b57cec5SDimitry Andric
830b57cec5SDimitry Andricdef : ReadAdvance<ReadInt2Fpu, 0>;
840b57cec5SDimitry Andric
850b57cec5SDimitry Andric// Many SchedWrites are defined in pairs with and without a folded load.
860b57cec5SDimitry Andric// Instructions with folded loads are usually micro-fused, so they only appear
870b57cec5SDimitry Andric// as two micro-ops when queued in the reservation station.
880b57cec5SDimitry Andric// This multiclass defines the resource usage for variants with and without
890b57cec5SDimitry Andric// folded loads.
900b57cec5SDimitry Andricmulticlass SKLWriteResPair<X86FoldableSchedWrite SchedRW,
910b57cec5SDimitry Andric                          list<ProcResourceKind> ExePorts,
920b57cec5SDimitry Andric                          int Lat, list<int> Res = [1], int UOps = 1,
93bdd1243dSDimitry Andric                          int LoadLat = 5, int LoadUOps = 1> {
940b57cec5SDimitry Andric  // Register variant is using a single cycle on ExePort.
950b57cec5SDimitry Andric  def : WriteRes<SchedRW, ExePorts> {
960b57cec5SDimitry Andric    let Latency = Lat;
975f757f3fSDimitry Andric    let ReleaseAtCycles = Res;
980b57cec5SDimitry Andric    let NumMicroOps = UOps;
990b57cec5SDimitry Andric  }
1000b57cec5SDimitry Andric
1010b57cec5SDimitry Andric  // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to
1020b57cec5SDimitry Andric  // the latency (default = 5).
1030b57cec5SDimitry Andric  def : WriteRes<SchedRW.Folded, !listconcat([SKLPort23], ExePorts)> {
1040b57cec5SDimitry Andric    let Latency = !add(Lat, LoadLat);
1055f757f3fSDimitry Andric    let ReleaseAtCycles = !listconcat([1], Res);
106bdd1243dSDimitry Andric    let NumMicroOps = !add(UOps, LoadUOps);
1070b57cec5SDimitry Andric  }
1080b57cec5SDimitry Andric}
1090b57cec5SDimitry Andric
1100b57cec5SDimitry Andric// A folded store needs a cycle on port 4 for the store data, and an extra port
1110b57cec5SDimitry Andric// 2/3/7 cycle to recompute the address.
1120b57cec5SDimitry Andricdef : WriteRes<WriteRMW, [SKLPort237,SKLPort4]>;
1130b57cec5SDimitry Andric
1140b57cec5SDimitry Andric// Arithmetic.
1150b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteALU,    [SKLPort0156], 1>; // Simple integer ALU op.
1160b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteADC,    [SKLPort06],   1>; // Integer ALU + flags op.
1170b57cec5SDimitry Andric
1180b57cec5SDimitry Andric// Integer multiplication.
1190b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteIMul8,     [SKLPort1],   3>;
1200b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteIMul16,    [SKLPort1,SKLPort06,SKLPort0156], 4, [1,1,2], 4>;
1210b57cec5SDimitry Andricdefm : X86WriteRes<WriteIMul16Imm,     [SKLPort1,SKLPort0156], 4, [1,1], 2>;
1220b57cec5SDimitry Andricdefm : X86WriteRes<WriteIMul16ImmLd,   [SKLPort1,SKLPort0156,SKLPort23], 8, [1,1,1], 3>;
1230b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteIMul16Reg, [SKLPort1],   3>;
1240b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteIMul32,    [SKLPort1,SKLPort06,SKLPort0156], 4, [1,1,1], 3>;
125349cc55cSDimitry Andricdefm : SKLWriteResPair<WriteMULX32,    [SKLPort1,SKLPort06,SKLPort0156], 3, [1,1,1], 3>;
1260b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteIMul32Imm, [SKLPort1],   3>;
1270b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteIMul32Reg, [SKLPort1],   3>;
1280b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteIMul64,    [SKLPort1,SKLPort5], 4, [1,1], 2>;
129349cc55cSDimitry Andricdefm : SKLWriteResPair<WriteMULX64,    [SKLPort1,SKLPort5], 3, [1,1], 2>;
1300b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteIMul64Imm, [SKLPort1],   3>;
1310b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteIMul64Reg, [SKLPort1],   3>;
132349cc55cSDimitry Andricdef SKLWriteIMulH : WriteRes<WriteIMulH, []> { let Latency = 4; }
133349cc55cSDimitry Andricdef  : WriteRes<WriteIMulHLd, []> {
134349cc55cSDimitry Andric  let Latency = !add(SKLWriteIMulH.Latency, SkylakeClientModel.LoadLatency);
135349cc55cSDimitry Andric}
1360b57cec5SDimitry Andric
1370b57cec5SDimitry Andricdefm : X86WriteRes<WriteBSWAP32,    [SKLPort15], 1, [1], 1>;
1380b57cec5SDimitry Andricdefm : X86WriteRes<WriteBSWAP64,    [SKLPort06, SKLPort15], 2, [1,1], 2>;
1390b57cec5SDimitry Andricdefm : X86WriteRes<WriteCMPXCHG,[SKLPort06, SKLPort0156], 5, [2,3], 5>;
1400b57cec5SDimitry Andricdefm : X86WriteRes<WriteCMPXCHGRMW,[SKLPort23,SKLPort06,SKLPort0156,SKLPort237,SKLPort4], 8, [1,2,1,1,1], 6>;
1410b57cec5SDimitry Andricdefm : X86WriteRes<WriteXCHG, [SKLPort0156], 2, [3], 3>;
1420b57cec5SDimitry Andric
1430b57cec5SDimitry Andric// TODO: Why isn't the SKLDivider used?
1440b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteDiv8,   [SKLPort0,SKLDivider], 25, [1,10], 1, 4>;
1450b57cec5SDimitry Andricdefm : X86WriteRes<WriteDiv16,      [SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort05,SKLPort0156], 76, [7,2,8,3,1,11], 32>;
1460b57cec5SDimitry Andricdefm : X86WriteRes<WriteDiv32,      [SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort05,SKLPort0156], 76, [7,2,8,3,1,11], 32>;
1470b57cec5SDimitry Andricdefm : X86WriteRes<WriteDiv64,      [SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort05,SKLPort0156], 76, [7,2,8,3,1,11], 32>;
1480b57cec5SDimitry Andricdefm : X86WriteRes<WriteDiv16Ld,    [SKLPort0,SKLPort23,SKLDivider], 29, [1,1,10], 2>;
1490b57cec5SDimitry Andricdefm : X86WriteRes<WriteDiv32Ld,    [SKLPort0,SKLPort23,SKLDivider], 29, [1,1,10], 2>;
1500b57cec5SDimitry Andricdefm : X86WriteRes<WriteDiv64Ld,    [SKLPort0,SKLPort23,SKLDivider], 29, [1,1,10], 2>;
1510b57cec5SDimitry Andric
1520b57cec5SDimitry Andricdefm : X86WriteRes<WriteIDiv8,    [SKLPort0,SKLDivider], 25, [1,10], 1>;
1530b57cec5SDimitry Andricdefm : X86WriteRes<WriteIDiv16,   [SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort06,SKLPort0156], 102, [4,2,4,8,14,34], 66>;
1540b57cec5SDimitry Andricdefm : X86WriteRes<WriteIDiv32,   [SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort06,SKLPort0156], 102, [4,2,4,8,14,34], 66>;
1550b57cec5SDimitry Andricdefm : X86WriteRes<WriteIDiv64,   [SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort06,SKLPort0156], 102, [4,2,4,8,14,34], 66>;
1560b57cec5SDimitry Andricdefm : X86WriteRes<WriteIDiv8Ld,  [SKLPort0,SKLPort5,SKLPort23,SKLPort0156], 28, [2,4,1,1], 8>;
1570b57cec5SDimitry Andricdefm : X86WriteRes<WriteIDiv16Ld, [SKLPort0,SKLPort5,SKLPort23,SKLPort0156], 28, [2,4,1,1], 8>;
1580b57cec5SDimitry Andricdefm : X86WriteRes<WriteIDiv32Ld, [SKLPort0,SKLPort5,SKLPort23,SKLPort0156], 28, [2,4,1,1], 8>;
1590b57cec5SDimitry Andricdefm : X86WriteRes<WriteIDiv64Ld, [SKLPort0,SKLPort5,SKLPort23,SKLPort0156], 28, [2,4,1,1], 8>;
1600b57cec5SDimitry Andric
1610b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteCRC32, [SKLPort1], 3>;
1620b57cec5SDimitry Andric
1630b57cec5SDimitry Andricdef : WriteRes<WriteLEA, [SKLPort15]>; // LEA instructions can't fold loads.
1640b57cec5SDimitry Andric
1650b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteCMOV,  [SKLPort06], 1, [1], 1>; // Conditional move.
1660b57cec5SDimitry Andricdefm : X86WriteRes<WriteFCMOV, [SKLPort1], 3, [1], 1>; // x87 conditional move.
1670b57cec5SDimitry Andricdef  : WriteRes<WriteSETCC, [SKLPort06]>; // Setcc.
1680b57cec5SDimitry Andricdef  : WriteRes<WriteSETCCStore, [SKLPort06,SKLPort4,SKLPort237]> {
1690b57cec5SDimitry Andric  let Latency = 2;
1700b57cec5SDimitry Andric  let NumMicroOps = 3;
1710b57cec5SDimitry Andric}
1720b57cec5SDimitry Andric
1730b57cec5SDimitry Andricdefm : X86WriteRes<WriteLAHFSAHF,        [SKLPort06], 1, [1], 1>;
1740b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTest,         [SKLPort06], 1, [1], 1>;
1750b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTestImmLd,    [SKLPort06,SKLPort23], 6, [1,1], 2>;
1760b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTestRegLd,    [SKLPort0156,SKLPort23], 6, [1,1], 2>;
1770b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTestSet,      [SKLPort06], 1, [1], 1>;
1780b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTestSetImmLd, [SKLPort06,SKLPort23], 5, [1,1], 3>;
1790b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTestSetRegLd, [SKLPort0156,SKLPort23], 5, [1,1], 2>;
1800b57cec5SDimitry Andric
1810b57cec5SDimitry Andric// Bit counts.
1820b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteBSF, [SKLPort1], 3>;
1830b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteBSR, [SKLPort1], 3>;
1840b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteLZCNT,          [SKLPort1], 3>;
1850b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteTZCNT,          [SKLPort1], 3>;
1860b57cec5SDimitry Andricdefm : SKLWriteResPair<WritePOPCNT,         [SKLPort1], 3>;
1870b57cec5SDimitry Andric
1880b57cec5SDimitry Andric// Integer shifts and rotates.
1890b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteShift,    [SKLPort06],  1>;
1900b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteShiftCL,  [SKLPort06],  3, [3], 3>;
1910b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteRotate,   [SKLPort06],  1, [1], 1>;
1920b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteRotateCL, [SKLPort06],  3, [3], 3>;
1930b57cec5SDimitry Andric
1940b57cec5SDimitry Andric// SHLD/SHRD.
1950b57cec5SDimitry Andricdefm : X86WriteRes<WriteSHDrri, [SKLPort1], 3, [1], 1>;
1960b57cec5SDimitry Andricdefm : X86WriteRes<WriteSHDrrcl,[SKLPort1,SKLPort06,SKLPort0156], 6, [1, 2, 1], 4>;
1970b57cec5SDimitry Andricdefm : X86WriteRes<WriteSHDmri, [SKLPort1,SKLPort23,SKLPort237,SKLPort0156], 9, [1, 1, 1, 1], 4>;
1980b57cec5SDimitry Andricdefm : X86WriteRes<WriteSHDmrcl,[SKLPort1,SKLPort23,SKLPort237,SKLPort06,SKLPort0156], 11, [1, 1, 1, 2, 1], 6>;
1990b57cec5SDimitry Andric
2000b57cec5SDimitry Andric// BMI1 BEXTR/BLS, BMI2 BZHI
2010b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteBEXTR, [SKLPort06,SKLPort15], 2, [1,1], 2>;
2020b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteBLS,   [SKLPort15], 1>;
2030b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteBZHI,  [SKLPort15], 1>;
2040b57cec5SDimitry Andric
2050b57cec5SDimitry Andric// Loads, stores, and moves, not folded with other operations.
2060b57cec5SDimitry Andricdefm : X86WriteRes<WriteLoad,    [SKLPort23], 5, [1], 1>;
2070b57cec5SDimitry Andricdefm : X86WriteRes<WriteStore,   [SKLPort237, SKLPort4], 1, [1,1], 1>;
2080b57cec5SDimitry Andricdefm : X86WriteRes<WriteStoreNT, [SKLPort237, SKLPort4], 1, [1,1], 2>;
2090b57cec5SDimitry Andricdefm : X86WriteRes<WriteMove,    [SKLPort0156], 1, [1], 1>;
2100b57cec5SDimitry Andric
211fe6060f1SDimitry Andric// Model the effect of clobbering the read-write mask operand of the GATHER operation.
212fe6060f1SDimitry Andric// Does not cost anything by itself, only has latency, matching that of the WriteLoad,
213fe6060f1SDimitry Andricdefm : X86WriteRes<WriteVecMaskedGatherWriteback, [], 5, [], 0>;
214fe6060f1SDimitry Andric
2150b57cec5SDimitry Andric// Idioms that clear a register, like xorps %xmm0, %xmm0.
2160b57cec5SDimitry Andric// These can often bypass execution ports completely.
2170b57cec5SDimitry Andricdef : WriteRes<WriteZero,  []>;
2180b57cec5SDimitry Andric
2190b57cec5SDimitry Andric// Branches don't produce values, so they have no latency, but they still
2200b57cec5SDimitry Andric// consume resources. Indirect branches can fold loads.
2210b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteJump,  [SKLPort06],   1>;
2220b57cec5SDimitry Andric
2230b57cec5SDimitry Andric// Floating point. This covers both scalar and vector operations.
2240b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLD0,          [SKLPort05], 1, [1], 1>;
2250b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLD1,          [SKLPort05], 1, [2], 2>;
2260b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLDC,          [SKLPort05], 1, [2], 2>;
2270b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLoad,         [SKLPort23], 5, [1], 1>;
2280b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLoadX,        [SKLPort23], 6, [1], 1>;
2290b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLoadY,        [SKLPort23], 7, [1], 1>;
2300b57cec5SDimitry Andricdefm : X86WriteRes<WriteFMaskedLoad,   [SKLPort23,SKLPort015], 7, [1,1], 2>;
2310b57cec5SDimitry Andricdefm : X86WriteRes<WriteFMaskedLoadY,  [SKLPort23,SKLPort015], 8, [1,1], 2>;
2320b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStore,        [SKLPort237,SKLPort4], 1, [1,1], 2>;
2330b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStoreX,       [SKLPort237,SKLPort4], 1, [1,1], 2>;
2340b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStoreY,       [SKLPort237,SKLPort4], 1, [1,1], 2>;
2350b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStoreNT,      [SKLPort237,SKLPort4], 1, [1,1], 2>;
2360b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStoreNTX,     [SKLPort237,SKLPort4], 1, [1,1], 2>;
2370b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStoreNTY,     [SKLPort237,SKLPort4], 1, [1,1], 2>;
2388bcb0991SDimitry Andric
23906c3fb27SDimitry Andricdefm : X86WriteRes<WriteFMaskedStore32,  [SKLPort23,SKLPort0,SKLPort4], 2, [1,1,1], 2>;
24006c3fb27SDimitry Andricdefm : X86WriteRes<WriteFMaskedStore32Y, [SKLPort23,SKLPort0,SKLPort4], 2, [1,1,1], 2>;
24106c3fb27SDimitry Andricdefm : X86WriteRes<WriteFMaskedStore64,  [SKLPort23,SKLPort0,SKLPort4], 2, [1,1,1], 2>;
24206c3fb27SDimitry Andricdefm : X86WriteRes<WriteFMaskedStore64Y, [SKLPort23,SKLPort0,SKLPort4], 2, [1,1,1], 2>;
2438bcb0991SDimitry Andric
2440b57cec5SDimitry Andricdefm : X86WriteRes<WriteFMove,         [SKLPort015], 1, [1], 1>;
2450b57cec5SDimitry Andricdefm : X86WriteRes<WriteFMoveX,        [SKLPort015], 1, [1], 1>;
2460b57cec5SDimitry Andricdefm : X86WriteRes<WriteFMoveY,        [SKLPort015], 1, [1], 1>;
24704eeddc0SDimitry Andricdefm : X86WriteResUnsupported<WriteFMoveZ>;
2480b57cec5SDimitry Andricdefm : X86WriteRes<WriteEMMS,          [SKLPort05,SKLPort0156], 10, [9,1], 10>;
2490b57cec5SDimitry Andric
2500b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFAdd,     [SKLPort01],  4, [1], 1, 5>; // Floating point add/sub.
2510b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFAddX,    [SKLPort01],  4, [1], 1, 6>;
2520b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFAddY,    [SKLPort01],  4, [1], 1, 7>;
2530b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFAddZ>;
2540b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFAdd64,   [SKLPort01],  4, [1], 1, 5>; // Floating point double add/sub.
2550b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFAdd64X,  [SKLPort01],  4, [1], 1, 6>;
2560b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFAdd64Y,  [SKLPort01],  4, [1], 1, 7>;
2570b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFAdd64Z>;
2580b57cec5SDimitry Andric
2590b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFCmp,     [SKLPort01],  4, [1], 1, 5>; // Floating point compare.
2600b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFCmpX,    [SKLPort01],  4, [1], 1, 6>;
2610b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFCmpY,    [SKLPort01],  4, [1], 1, 7>;
2620b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFCmpZ>;
2630b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFCmp64,   [SKLPort01],  4, [1], 1, 5>; // Floating point double compare.
2640b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFCmp64X,  [SKLPort01],  4, [1], 1, 6>;
2650b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFCmp64Y,  [SKLPort01],  4, [1], 1, 7>;
2660b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFCmp64Z>;
2670b57cec5SDimitry Andric
2685ffd83dbSDimitry Andricdefm : SKLWriteResPair<WriteFCom,      [SKLPort0],  2>; // Floating point compare to flags (X87).
2695ffd83dbSDimitry Andricdefm : SKLWriteResPair<WriteFComX,     [SKLPort0],  2>; // Floating point compare to flags (SSE).
2700b57cec5SDimitry Andric
2710b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFMul,     [SKLPort01],  4, [1], 1, 5>; // Floating point multiplication.
2720b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFMulX,    [SKLPort01],  4, [1], 1, 6>;
2730b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFMulY,    [SKLPort01],  4, [1], 1, 7>;
2740b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMulZ>;
2750b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFMul64,   [SKLPort01],  4, [1], 1, 5>; // Floating point double multiplication.
2760b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFMul64X,  [SKLPort01],  4, [1], 1, 6>;
2770b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFMul64Y,  [SKLPort01],  4, [1], 1, 7>;
2780b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMul64Z>;
2790b57cec5SDimitry Andric
2800b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFDiv,     [SKLPort0,SKLFPDivider], 11, [1,3], 1, 5>; // Floating point division.
281bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteFDivX,    [SKLPort0,SKLFPDivider], 11, [1,3], 1, 6>;
2820b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFDivY,    [SKLPort0,SKLFPDivider], 11, [1,5], 1, 7>;
2830b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFDivZ>;
284bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteFDiv64,   [SKLPort0,SKLFPDivider], 14, [1,4], 1, 5>; // Floating point double division.
285bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteFDiv64X,  [SKLPort0,SKLFPDivider], 14, [1,4], 1, 6>;
286bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteFDiv64Y,  [SKLPort0,SKLFPDivider], 14, [1,8], 1, 7>;
2870b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFDiv64Z>;
2880b57cec5SDimitry Andric
2890b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFSqrt,    [SKLPort0,SKLFPDivider], 12, [1,3], 1, 5>; // Floating point square root.
2900b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFSqrtX,   [SKLPort0,SKLFPDivider], 12, [1,3], 1, 6>;
2910b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFSqrtY,   [SKLPort0,SKLFPDivider], 12, [1,6], 1, 7>;
2920b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFSqrtZ>;
2930b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFSqrt64,  [SKLPort0,SKLFPDivider], 18, [1,6], 1, 5>; // Floating point double square root.
2940b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFSqrt64X, [SKLPort0,SKLFPDivider], 18, [1,6], 1, 6>;
2950b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFSqrt64Y, [SKLPort0,SKLFPDivider], 18, [1,12],1, 7>;
2960b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFSqrt64Z>;
2970b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFSqrt80,  [SKLPort0,SKLFPDivider], 21, [1,7]>; // Floating point long double square root.
2980b57cec5SDimitry Andric
2990b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFRcp,   [SKLPort0], 4, [1], 1, 5>; // Floating point reciprocal estimate.
3000b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFRcpX,  [SKLPort0], 4, [1], 1, 6>;
3010b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFRcpY,  [SKLPort0], 4, [1], 1, 7>;
3020b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFRcpZ>;
3030b57cec5SDimitry Andric
3040b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFRsqrt, [SKLPort0], 4, [1], 1, 5>; // Floating point reciprocal square root estimate.
3050b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFRsqrtX,[SKLPort0], 4, [1], 1, 6>;
3060b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFRsqrtY,[SKLPort0], 4, [1], 1, 7>;
3070b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFRsqrtZ>;
3080b57cec5SDimitry Andric
3090b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFMA,    [SKLPort01], 4, [1], 1, 5>; // Fused Multiply Add.
3100b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFMAX,   [SKLPort01], 4, [1], 1, 6>;
3110b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFMAY,   [SKLPort01], 4, [1], 1, 7>;
3120b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFMAZ>;
3130b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteDPPD,   [SKLPort5,SKLPort01],  9, [1,2], 3, 6>; // Floating point double dot product.
314*0fca6ea1SDimitry Andricdefm : X86WriteRes<WriteDPPS,       [SKLPort5,SKLPort01], 13, [1,3], 4>;
315*0fca6ea1SDimitry Andricdefm : X86WriteRes<WriteDPPSY,      [SKLPort5,SKLPort01], 13, [1,3], 4>;
316*0fca6ea1SDimitry Andricdefm : X86WriteRes<WriteDPPSLd,     [SKLPort5,SKLPort01,SKLPort06,SKLPort23], 19, [1,3,1,1], 6>;
317*0fca6ea1SDimitry Andricdefm : X86WriteRes<WriteDPPSYLd,    [SKLPort5,SKLPort01,SKLPort06,SKLPort23], 20, [1,3,1,1], 6>;
3180b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFSign,   [SKLPort0], 1>; // Floating point fabs/fchs.
3190b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFRnd,     [SKLPort01], 8, [2], 2, 6>; // Floating point rounding.
3200b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFRndY,    [SKLPort01], 8, [2], 2, 7>;
3210b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFRndZ>;
3220b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFLogic,  [SKLPort015], 1, [1], 1, 6>; // Floating point and/or/xor logicals.
3230b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFLogicY, [SKLPort015], 1, [1], 1, 7>;
3240b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFLogicZ>;
3250b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFTest,   [SKLPort0], 2, [1], 1, 6>; // Floating point TEST instructions.
3260b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFTestY,  [SKLPort0], 2, [1], 1, 7>;
3270b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFTestZ>;
3280b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFShuffle,  [SKLPort5], 1, [1], 1, 6>; // Floating point vector shuffles.
3290b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFShuffleY, [SKLPort5], 1, [1], 1, 7>;
3300b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFShuffleZ>;
3310b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFVarShuffle,  [SKLPort5], 1, [1], 1, 6>; // Floating point vector shuffles.
3320b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFVarShuffleY, [SKLPort5], 1, [1], 1, 7>;
3330b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFVarShuffleZ>;
3340b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFBlend,  [SKLPort015], 1, [1], 1, 6>; // Floating point vector blends.
3350b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFBlendY, [SKLPort015], 1, [1], 1, 7>;
3360b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFBlendZ>;
3370b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFVarBlend, [SKLPort015], 2, [2], 2, 6>; // Fp vector variable blends.
3380b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFVarBlendY,[SKLPort015], 2, [2], 2, 7>;
3390b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteFVarBlendZ>;
3400b57cec5SDimitry Andric
3410b57cec5SDimitry Andric// FMA Scheduling helper class.
3420b57cec5SDimitry Andric// class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
3430b57cec5SDimitry Andric
3440b57cec5SDimitry Andric// Vector integer operations.
3450b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecLoad,         [SKLPort23], 5, [1], 1>;
3460b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecLoadX,        [SKLPort23], 6, [1], 1>;
3470b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecLoadY,        [SKLPort23], 7, [1], 1>;
3480b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecLoadNT,       [SKLPort23], 6, [1], 1>;
3490b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecLoadNTY,      [SKLPort23], 7, [1], 1>;
3500b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMaskedLoad,   [SKLPort23,SKLPort015], 7, [1,1], 2>;
3510b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMaskedLoadY,  [SKLPort23,SKLPort015], 8, [1,1], 2>;
3520b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecStore,        [SKLPort237,SKLPort4], 1, [1,1], 2>;
3530b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecStoreX,       [SKLPort237,SKLPort4], 1, [1,1], 2>;
3540b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecStoreY,       [SKLPort237,SKLPort4], 1, [1,1], 2>;
3550b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecStoreNT,      [SKLPort237,SKLPort4], 1, [1,1], 2>;
3560b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecStoreNTY,     [SKLPort237,SKLPort4], 1, [1,1], 2>;
35706c3fb27SDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore32,  [SKLPort23,SKLPort0,SKLPort4], 2, [1,1,1], 2>;
35806c3fb27SDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore32Y, [SKLPort23,SKLPort0,SKLPort4], 2, [1,1,1], 2>;
35906c3fb27SDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore64,  [SKLPort23,SKLPort0,SKLPort4], 2, [1,1,1], 2>;
36006c3fb27SDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore64Y, [SKLPort23,SKLPort0,SKLPort4], 2, [1,1,1], 2>;
3610b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMove,         [SKLPort05],  1, [1], 1>;
3620b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMoveX,        [SKLPort015], 1, [1], 1>;
3630b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMoveY,        [SKLPort015], 1, [1], 1>;
36404eeddc0SDimitry Andricdefm : X86WriteResUnsupported<WriteVecMoveZ>;
3650b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMoveToGpr,    [SKLPort0], 2, [1], 1>;
3660b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMoveFromGpr,  [SKLPort5], 1, [1], 1>;
3670b57cec5SDimitry Andric
3680b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVecALU,   [SKLPort05], 1, [1], 1, 5>; // Vector integer ALU op, no logicals.
3690b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVecALUX,  [SKLPort01], 1, [1], 1, 6>;
3700b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVecALUY,  [SKLPort01], 1, [1], 1, 7>;
3710b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecALUZ>;
3720b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVecLogic, [SKLPort05],  1, [1], 1, 5>; // Vector integer and/or/xor.
3730b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVecLogicX,[SKLPort015], 1, [1], 1, 6>;
3740b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVecLogicY,[SKLPort015], 1, [1], 1, 7>;
3750b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecLogicZ>;
3760b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVecTest,  [SKLPort0,SKLPort5], 3, [1,1], 2, 6>; // Vector integer TEST instructions.
3770b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVecTestY, [SKLPort0,SKLPort5], 3, [1,1], 2, 7>;
3780b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecTestZ>;
3795ffd83dbSDimitry Andricdefm : SKLWriteResPair<WriteVecIMul,  [SKLPort0] ,  5, [1], 1, 5>; // Vector integer multiply.
3805ffd83dbSDimitry Andricdefm : SKLWriteResPair<WriteVecIMulX, [SKLPort01],  5, [1], 1, 6>;
3815ffd83dbSDimitry Andricdefm : SKLWriteResPair<WriteVecIMulY, [SKLPort01],  5, [1], 1, 7>;
3820b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecIMulZ>;
3830b57cec5SDimitry Andricdefm : SKLWriteResPair<WritePMULLD,   [SKLPort01], 10, [2], 2, 6>; // Vector PMULLD.
3840b57cec5SDimitry Andricdefm : SKLWriteResPair<WritePMULLDY,  [SKLPort01], 10, [2], 2, 7>;
3850b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WritePMULLDZ>;
3860b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteShuffle,  [SKLPort5], 1, [1], 1, 5>; // Vector shuffles.
3870b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteShuffleX, [SKLPort5], 1, [1], 1, 6>;
3880b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteShuffleY, [SKLPort5], 1, [1], 1, 7>;
3890b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteShuffleZ>;
3900b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVarShuffle,  [SKLPort5], 1, [1], 1, 5>; // Vector shuffles.
3910b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVarShuffleX, [SKLPort5], 1, [1], 1, 6>;
3920b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVarShuffleY, [SKLPort5], 1, [1], 1, 7>;
3930b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarShuffleZ>;
3940b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteBlend,  [SKLPort5], 1, [1], 1, 6>; // Vector blends.
3950b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteBlendY, [SKLPort5], 1, [1], 1, 7>;
3960b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteBlendZ>;
3970b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVarBlend,  [SKLPort015], 2, [2], 2, 6>; // Vector variable blends.
3980b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVarBlendY, [SKLPort015], 2, [2], 2, 6>;
3990b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarBlendZ>;
4000b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteMPSAD,  [SKLPort5], 4, [2], 2, 6>; // Vector MPSAD.
4010b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteMPSADY, [SKLPort5], 4, [2], 2, 7>;
4020b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteMPSADZ>;
4030b57cec5SDimitry Andricdefm : SKLWriteResPair<WritePSADBW,  [SKLPort5], 3, [1], 1, 5>; // Vector PSADBW.
4040b57cec5SDimitry Andricdefm : SKLWriteResPair<WritePSADBWX, [SKLPort5], 3, [1], 1, 6>;
4050b57cec5SDimitry Andricdefm : SKLWriteResPair<WritePSADBWY, [SKLPort5], 3, [1], 1, 7>;
4060b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WritePSADBWZ>;
4070b57cec5SDimitry Andricdefm : SKLWriteResPair<WritePHMINPOS, [SKLPort01], 4, [1], 1, 6>; // Vector PHMINPOS.
4080b57cec5SDimitry Andric
4090b57cec5SDimitry Andric// Vector integer shifts.
4100b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVecShift,     [SKLPort0], 1, [1], 1, 5>;
4110b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecShiftX,        [SKLPort5,SKLPort01],  2, [1,1], 2>;
4120b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecShiftY,        [SKLPort5,SKLPort01],  4, [1,1], 2>;
4130b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecShiftXLd,      [SKLPort01,SKLPort23], 7, [1,1], 2>;
4140b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecShiftYLd,      [SKLPort01,SKLPort23], 8, [1,1], 2>;
4150b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecShiftZ>;
4160b57cec5SDimitry Andric
4170b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVecShiftImm,  [SKLPort0],  1, [1], 1, 5>; // Vector integer immediate shifts.
4180b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVecShiftImmX, [SKLPort01], 1, [1], 1, 6>;
4190b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVecShiftImmY, [SKLPort01], 1, [1], 1, 7>;
4200b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVecShiftImmZ>;
4210b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVarVecShift,  [SKLPort01], 1, [1], 1, 6>; // Variable vector shifts.
4220b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVarVecShiftY, [SKLPort01], 1, [1], 1, 7>;
4230b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteVarVecShiftZ>;
4240b57cec5SDimitry Andric
4250b57cec5SDimitry Andric// Vector insert/extract operations.
4260b57cec5SDimitry Andricdef : WriteRes<WriteVecInsert, [SKLPort5]> {
4270b57cec5SDimitry Andric  let Latency = 2;
4280b57cec5SDimitry Andric  let NumMicroOps = 2;
4295f757f3fSDimitry Andric  let ReleaseAtCycles = [2];
4300b57cec5SDimitry Andric}
4310b57cec5SDimitry Andricdef : WriteRes<WriteVecInsertLd, [SKLPort5,SKLPort23]> {
4320b57cec5SDimitry Andric  let Latency = 6;
4330b57cec5SDimitry Andric  let NumMicroOps = 2;
4340b57cec5SDimitry Andric}
4350b57cec5SDimitry Andricdef: InstRW<[WriteVecInsertLd], (instregex "(V?)MOV(H|L)(PD|PS)rm")>;
4360b57cec5SDimitry Andric
4370b57cec5SDimitry Andricdef : WriteRes<WriteVecExtract, [SKLPort0,SKLPort5]> {
4380b57cec5SDimitry Andric  let Latency = 3;
4390b57cec5SDimitry Andric  let NumMicroOps = 2;
4400b57cec5SDimitry Andric}
4410b57cec5SDimitry Andricdef : WriteRes<WriteVecExtractSt, [SKLPort4,SKLPort5,SKLPort237]> {
4420b57cec5SDimitry Andric  let Latency = 2;
4430b57cec5SDimitry Andric  let NumMicroOps = 3;
4440b57cec5SDimitry Andric}
4450b57cec5SDimitry Andric
4460b57cec5SDimitry Andric// Conversion between integer and float.
447bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteCvtSS2I,   [SKLPort0,SKLPort01], 6, [1,1], 2, 5>;
448bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteCvtPS2I,   [SKLPort01], 4, [1], 1, 6>;
449bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteCvtPS2IY,  [SKLPort01], 4, [1], 1, 7>;
4500b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPS2IZ>;
451bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteCvtSD2I,   [SKLPort0,SKLPort01], 6, [1,1], 2, 5>;
452bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteCvtPD2I,   [SKLPort5,SKLPort01], 5, [1,1], 2, 6>;
453bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteCvtPD2IY,  [SKLPort5,SKLPort01], 7, [1,1], 2, 6>;
4540b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPD2IZ>;
4550b57cec5SDimitry Andric
456bdd1243dSDimitry Andricdefm : X86WriteRes<WriteCvtI2SS,      [SKLPort5,SKLPort01],  5, [1,1], 2>;
457bdd1243dSDimitry Andricdefm : X86WriteRes<WriteCvtI2SSLd,   [SKLPort23,SKLPort01], 10, [1,1], 2>;
458bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteCvtI2PS,   [SKLPort01], 4, [1], 1, 6>;
459bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteCvtI2PSY,  [SKLPort01], 4, [1], 1, 7>;
4600b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtI2PSZ>;
461bdd1243dSDimitry Andricdefm : X86WriteRes<WriteCvtI2SD,      [SKLPort5,SKLPort01],  5, [1,1], 2>;
462bdd1243dSDimitry Andricdefm : X86WriteRes<WriteCvtI2SDLd,   [SKLPort23,SKLPort01], 10, [1,1], 2>;
463bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteCvtI2PD,   [SKLPort0,SKLPort5],  5, [1,1], 2, 6>;
464bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteCvtI2PDY,  [SKLPort0,SKLPort5],  7, [1,1], 2, 6>;
4650b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtI2PDZ>;
4660b57cec5SDimitry Andric
467bdd1243dSDimitry Andricdefm : X86WriteRes<WriteCvtSS2SD,     [SKLPort5,SKLPort01],  5, [1,1], 2>;
468bdd1243dSDimitry Andricdefm : X86WriteRes<WriteCvtSS2SDLd,  [SKLPort23,SKLPort01], 10, [1,1], 2>;
469bdd1243dSDimitry Andricdefm : X86WriteRes<WriteCvtPS2PD,     [SKLPort5,SKLPort01],  5, [1,1], 2>;
470bdd1243dSDimitry Andricdefm : X86WriteRes<WriteCvtPS2PDLd,  [SKLPort23,SKLPort01],  9, [1,1], 2>;
471bdd1243dSDimitry Andricdefm : X86WriteRes<WriteCvtPS2PDY,    [SKLPort5,SKLPort01],  7, [1,1], 2>;
472bdd1243dSDimitry Andricdefm : X86WriteRes<WriteCvtPS2PDYLd, [SKLPort23,SKLPort01], 11, [1,1], 2>;
4730b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPS2PDZ>;
474bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteCvtSD2SS,  [SKLPort5,SKLPort01], 5, [1,1], 2, 5>;
475bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteCvtPD2PS,  [SKLPort5,SKLPort01], 5, [1,1], 2, 6>;
476bdd1243dSDimitry Andricdefm : SKLWriteResPair<WriteCvtPD2PSY, [SKLPort5,SKLPort01], 7, [1,1], 2, 6>;
4770b57cec5SDimitry Andricdefm : X86WriteResPairUnsupported<WriteCvtPD2PSZ>;
4780b57cec5SDimitry Andric
479bdd1243dSDimitry Andricdefm : X86WriteRes<WriteCvtPH2PS,     [SKLPort5,SKLPort01],  5, [1,1], 2>;
4800b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPH2PSY,    [SKLPort5,SKLPort01],  7, [1,1], 2>;
4810b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPH2PSZ>;
4820b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPH2PSLd,  [SKLPort23,SKLPort01],  9, [1,1], 2>;
4830b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPH2PSYLd, [SKLPort23,SKLPort01], 10, [1,1], 2>;
4840b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPH2PSZLd>;
4850b57cec5SDimitry Andric
486bdd1243dSDimitry Andricdefm : X86WriteRes<WriteCvtPS2PH,                        [SKLPort5,SKLPort01], 5, [1,1], 2>;
4870b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PHY,                       [SKLPort5,SKLPort01], 7, [1,1], 2>;
4880b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPS2PHZ>;
4890b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PHSt,  [SKLPort4,SKLPort5,SKLPort237,SKLPort01], 6, [1,1,1,1], 4>;
4900b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PHYSt, [SKLPort4,SKLPort5,SKLPort237,SKLPort01], 8, [1,1,1,1], 4>;
4910b57cec5SDimitry Andricdefm : X86WriteResUnsupported<WriteCvtPS2PHZSt>;
4920b57cec5SDimitry Andric
4930b57cec5SDimitry Andric// Strings instructions.
4940b57cec5SDimitry Andric
4950b57cec5SDimitry Andric// Packed Compare Implicit Length Strings, Return Mask
4960b57cec5SDimitry Andricdef : WriteRes<WritePCmpIStrM, [SKLPort0]> {
4970b57cec5SDimitry Andric  let Latency = 10;
4980b57cec5SDimitry Andric  let NumMicroOps = 3;
4995f757f3fSDimitry Andric  let ReleaseAtCycles = [3];
5000b57cec5SDimitry Andric}
5010b57cec5SDimitry Andricdef : WriteRes<WritePCmpIStrMLd, [SKLPort0, SKLPort23]> {
5020b57cec5SDimitry Andric  let Latency = 16;
5030b57cec5SDimitry Andric  let NumMicroOps = 4;
5045f757f3fSDimitry Andric  let ReleaseAtCycles = [3,1];
5050b57cec5SDimitry Andric}
5060b57cec5SDimitry Andric
5070b57cec5SDimitry Andric// Packed Compare Explicit Length Strings, Return Mask
5080b57cec5SDimitry Andricdef : WriteRes<WritePCmpEStrM, [SKLPort0, SKLPort5, SKLPort015, SKLPort0156]> {
5090b57cec5SDimitry Andric  let Latency = 19;
5100b57cec5SDimitry Andric  let NumMicroOps = 9;
5115f757f3fSDimitry Andric  let ReleaseAtCycles = [4,3,1,1];
5120b57cec5SDimitry Andric}
5130b57cec5SDimitry Andricdef : WriteRes<WritePCmpEStrMLd, [SKLPort0, SKLPort5,SKLPort23, SKLPort015, SKLPort0156]> {
5140b57cec5SDimitry Andric  let Latency = 25;
5150b57cec5SDimitry Andric  let NumMicroOps = 10;
5165f757f3fSDimitry Andric  let ReleaseAtCycles = [4,3,1,1,1];
5170b57cec5SDimitry Andric}
5180b57cec5SDimitry Andric
5190b57cec5SDimitry Andric// Packed Compare Implicit Length Strings, Return Index
5200b57cec5SDimitry Andricdef : WriteRes<WritePCmpIStrI, [SKLPort0]> {
5210b57cec5SDimitry Andric  let Latency = 10;
5220b57cec5SDimitry Andric  let NumMicroOps = 3;
5235f757f3fSDimitry Andric  let ReleaseAtCycles = [3];
5240b57cec5SDimitry Andric}
5250b57cec5SDimitry Andricdef : WriteRes<WritePCmpIStrILd, [SKLPort0, SKLPort23]> {
5260b57cec5SDimitry Andric  let Latency = 16;
5270b57cec5SDimitry Andric  let NumMicroOps = 4;
5285f757f3fSDimitry Andric  let ReleaseAtCycles = [3,1];
5290b57cec5SDimitry Andric}
5300b57cec5SDimitry Andric
5310b57cec5SDimitry Andric// Packed Compare Explicit Length Strings, Return Index
5320b57cec5SDimitry Andricdef : WriteRes<WritePCmpEStrI, [SKLPort0, SKLPort5, SKLPort0156]> {
5330b57cec5SDimitry Andric  let Latency = 18;
5340b57cec5SDimitry Andric  let NumMicroOps = 8;
5355f757f3fSDimitry Andric  let ReleaseAtCycles = [4,3,1];
5360b57cec5SDimitry Andric}
5370b57cec5SDimitry Andricdef : WriteRes<WritePCmpEStrILd, [SKLPort0, SKLPort5, SKLPort23, SKLPort0156]> {
5380b57cec5SDimitry Andric  let Latency = 24;
5390b57cec5SDimitry Andric  let NumMicroOps = 9;
5405f757f3fSDimitry Andric  let ReleaseAtCycles = [4,3,1,1];
5410b57cec5SDimitry Andric}
5420b57cec5SDimitry Andric
5430b57cec5SDimitry Andric// MOVMSK Instructions.
5440b57cec5SDimitry Andricdef : WriteRes<WriteFMOVMSK,    [SKLPort0]> { let Latency = 2; }
5450b57cec5SDimitry Andricdef : WriteRes<WriteVecMOVMSK,  [SKLPort0]> { let Latency = 2; }
5460b57cec5SDimitry Andricdef : WriteRes<WriteVecMOVMSKY, [SKLPort0]> { let Latency = 2; }
5470b57cec5SDimitry Andricdef : WriteRes<WriteMMXMOVMSK,  [SKLPort0]> { let Latency = 2; }
5480b57cec5SDimitry Andric
5490b57cec5SDimitry Andric// AES instructions.
5500b57cec5SDimitry Andricdef : WriteRes<WriteAESDecEnc, [SKLPort0]> { // Decryption, encryption.
5510b57cec5SDimitry Andric  let Latency = 4;
5520b57cec5SDimitry Andric  let NumMicroOps = 1;
5535f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
5540b57cec5SDimitry Andric}
5550b57cec5SDimitry Andricdef : WriteRes<WriteAESDecEncLd, [SKLPort0, SKLPort23]> {
5560b57cec5SDimitry Andric  let Latency = 10;
5570b57cec5SDimitry Andric  let NumMicroOps = 2;
5585f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
5590b57cec5SDimitry Andric}
5600b57cec5SDimitry Andric
5610b57cec5SDimitry Andricdef : WriteRes<WriteAESIMC, [SKLPort0]> { // InvMixColumn.
5620b57cec5SDimitry Andric  let Latency = 8;
5630b57cec5SDimitry Andric  let NumMicroOps = 2;
5645f757f3fSDimitry Andric  let ReleaseAtCycles = [2];
5650b57cec5SDimitry Andric}
5660b57cec5SDimitry Andricdef : WriteRes<WriteAESIMCLd, [SKLPort0, SKLPort23]> {
5670b57cec5SDimitry Andric  let Latency = 14;
5680b57cec5SDimitry Andric  let NumMicroOps = 3;
5695f757f3fSDimitry Andric  let ReleaseAtCycles = [2,1];
5700b57cec5SDimitry Andric}
5710b57cec5SDimitry Andric
5720b57cec5SDimitry Andricdef : WriteRes<WriteAESKeyGen, [SKLPort0, SKLPort5, SKLPort015]> { // Key Generation.
5730b57cec5SDimitry Andric  let Latency = 20;
5740b57cec5SDimitry Andric  let NumMicroOps = 11;
5755f757f3fSDimitry Andric  let ReleaseAtCycles = [3,6,2];
5760b57cec5SDimitry Andric}
5770b57cec5SDimitry Andricdef : WriteRes<WriteAESKeyGenLd, [SKLPort0, SKLPort5, SKLPort23, SKLPort015]> {
5780b57cec5SDimitry Andric  let Latency = 25;
5790b57cec5SDimitry Andric  let NumMicroOps = 11;
5805f757f3fSDimitry Andric  let ReleaseAtCycles = [3,6,1,1];
5810b57cec5SDimitry Andric}
5820b57cec5SDimitry Andric
5830b57cec5SDimitry Andric// Carry-less multiplication instructions.
5840b57cec5SDimitry Andricdef : WriteRes<WriteCLMul, [SKLPort5]> {
5850b57cec5SDimitry Andric  let Latency = 6;
5860b57cec5SDimitry Andric  let NumMicroOps = 1;
5875f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
5880b57cec5SDimitry Andric}
5890b57cec5SDimitry Andricdef : WriteRes<WriteCLMulLd, [SKLPort5, SKLPort23]> {
5900b57cec5SDimitry Andric  let Latency = 12;
5910b57cec5SDimitry Andric  let NumMicroOps = 2;
5925f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
5930b57cec5SDimitry Andric}
5940b57cec5SDimitry Andric
5950b57cec5SDimitry Andric// Catch-all for expensive system instructions.
5960b57cec5SDimitry Andricdef : WriteRes<WriteSystem,     [SKLPort0156]> { let Latency = 100; } // def WriteSystem : SchedWrite;
5970b57cec5SDimitry Andric
5980b57cec5SDimitry Andric// AVX2.
5990b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFShuffle256, [SKLPort5], 3, [1], 1, 7>; // Fp 256-bit width vector shuffles.
6000b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFVarShuffle256, [SKLPort5], 3, [1], 1, 7>; // Fp 256-bit width vector variable shuffles.
6010b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteShuffle256, [SKLPort5], 3, [1], 1, 7>;  // 256-bit width vector shuffles.
602fe6060f1SDimitry Andricdefm : SKLWriteResPair<WriteVPMOV256, [SKLPort5], 3, [1], 1, 7>;  // 256-bit width packed vector width-changing move.
6030b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteVarShuffle256, [SKLPort5], 3, [1], 1, 7>;  // 256-bit width vector variable shuffles.
6040b57cec5SDimitry Andric
6050b57cec5SDimitry Andric// Old microcoded instructions that nobody use.
6060b57cec5SDimitry Andricdef : WriteRes<WriteMicrocoded, [SKLPort0156]> { let Latency = 100; } // def WriteMicrocoded : SchedWrite;
6070b57cec5SDimitry Andric
6080b57cec5SDimitry Andric// Fence instructions.
6090b57cec5SDimitry Andricdef : WriteRes<WriteFence,  [SKLPort23, SKLPort4]>;
6100b57cec5SDimitry Andric
6110b57cec5SDimitry Andric// Load/store MXCSR.
6125f757f3fSDimitry Andricdef : WriteRes<WriteLDMXCSR, [SKLPort0,SKLPort23,SKLPort0156]> { let Latency = 7; let NumMicroOps = 3; let ReleaseAtCycles = [1,1,1]; }
6135f757f3fSDimitry Andricdef : WriteRes<WriteSTMXCSR, [SKLPort4,SKLPort5,SKLPort237]> { let Latency = 2; let NumMicroOps = 3; let ReleaseAtCycles = [1,1,1]; }
6140b57cec5SDimitry Andric
6150b57cec5SDimitry Andric// Nop, not very useful expect it provides a model for nops!
6160b57cec5SDimitry Andricdef : WriteRes<WriteNop, []>;
6170b57cec5SDimitry Andric
6180b57cec5SDimitry Andric////////////////////////////////////////////////////////////////////////////////
6190b57cec5SDimitry Andric// Horizontal add/sub  instructions.
6200b57cec5SDimitry Andric////////////////////////////////////////////////////////////////////////////////
6210b57cec5SDimitry Andric
6220b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFHAdd,  [SKLPort5,SKLPort01], 6, [2,1], 3, 6>;
6230b57cec5SDimitry Andricdefm : SKLWriteResPair<WriteFHAddY, [SKLPort5,SKLPort01], 6, [2,1], 3, 7>;
6240b57cec5SDimitry Andricdefm : SKLWriteResPair<WritePHAdd,  [SKLPort5,SKLPort05],  3, [2,1], 3, 5>;
6250b57cec5SDimitry Andricdefm : SKLWriteResPair<WritePHAddX, [SKLPort5,SKLPort015], 3, [2,1], 3, 6>;
6260b57cec5SDimitry Andricdefm : SKLWriteResPair<WritePHAddY, [SKLPort5,SKLPort015], 3, [2,1], 3, 7>;
6270b57cec5SDimitry Andric
6280b57cec5SDimitry Andric// Remaining instrs.
6290b57cec5SDimitry Andric
6300b57cec5SDimitry Andricdef SKLWriteResGroup1 : SchedWriteRes<[SKLPort0]> {
6310b57cec5SDimitry Andric  let Latency = 1;
6320b57cec5SDimitry Andric  let NumMicroOps = 1;
6335f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
6340b57cec5SDimitry Andric}
6350eae32dcSDimitry Andricdef: InstRW<[SKLWriteResGroup1], (instregex "MMX_PADDS(B|W)rr",
6360eae32dcSDimitry Andric                                            "MMX_PADDUS(B|W)rr",
6370eae32dcSDimitry Andric                                            "MMX_PAVG(B|W)rr",
6380eae32dcSDimitry Andric                                            "MMX_PCMPEQ(B|D|W)rr",
6390eae32dcSDimitry Andric                                            "MMX_PCMPGT(B|D|W)rr",
6400eae32dcSDimitry Andric                                            "MMX_P(MAX|MIN)SWrr",
6410eae32dcSDimitry Andric                                            "MMX_P(MAX|MIN)UBrr",
6420eae32dcSDimitry Andric                                            "MMX_PSUBS(B|W)rr",
6430eae32dcSDimitry Andric                                            "MMX_PSUBUS(B|W)rr")>;
6440b57cec5SDimitry Andric
6450b57cec5SDimitry Andricdef SKLWriteResGroup3 : SchedWriteRes<[SKLPort5]> {
6460b57cec5SDimitry Andric  let Latency = 1;
6470b57cec5SDimitry Andric  let NumMicroOps = 1;
6485f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
6490b57cec5SDimitry Andric}
6500b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup3], (instregex "COM(P?)_FST0r",
6510b57cec5SDimitry Andric                                            "UCOM_F(P?)r")>;
6520b57cec5SDimitry Andric
6530b57cec5SDimitry Andricdef SKLWriteResGroup4 : SchedWriteRes<[SKLPort6]> {
6540b57cec5SDimitry Andric  let Latency = 1;
6550b57cec5SDimitry Andric  let NumMicroOps = 1;
6565f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
6570b57cec5SDimitry Andric}
6580b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup4], (instregex "JMP(16|32|64)r")>;
6590b57cec5SDimitry Andric
6600b57cec5SDimitry Andricdef SKLWriteResGroup6 : SchedWriteRes<[SKLPort05]> {
6610b57cec5SDimitry Andric  let Latency = 1;
6620b57cec5SDimitry Andric  let NumMicroOps = 1;
6635f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
6640b57cec5SDimitry Andric}
6650b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup6], (instrs FINCSTP, FNOP)>;
6660b57cec5SDimitry Andric
6670b57cec5SDimitry Andricdef SKLWriteResGroup7 : SchedWriteRes<[SKLPort06]> {
6680b57cec5SDimitry Andric  let Latency = 1;
6690b57cec5SDimitry Andric  let NumMicroOps = 1;
6705f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
6710b57cec5SDimitry Andric}
6720b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup7], (instrs CDQ, CQO, CLAC, STAC)>;
6730b57cec5SDimitry Andric
6740b57cec5SDimitry Andricdef SKLWriteResGroup8 : SchedWriteRes<[SKLPort15]> {
6750b57cec5SDimitry Andric  let Latency = 1;
6760b57cec5SDimitry Andric  let NumMicroOps = 1;
6775f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
6780b57cec5SDimitry Andric}
6790b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup8], (instregex "ANDN(32|64)rr")>;
6800b57cec5SDimitry Andric
6810b57cec5SDimitry Andricdef SKLWriteResGroup9 : SchedWriteRes<[SKLPort015]> {
6820b57cec5SDimitry Andric  let Latency = 1;
6830b57cec5SDimitry Andric  let NumMicroOps = 1;
6845f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
6850b57cec5SDimitry Andric}
6860b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup9], (instregex "(V?)PADD(B|D|Q|W)(Y?)rr",
6870b57cec5SDimitry Andric                                            "VPBLENDD(Y?)rri")>;
6880b57cec5SDimitry Andric
6890b57cec5SDimitry Andricdef SKLWriteResGroup10 : SchedWriteRes<[SKLPort0156]> {
6900b57cec5SDimitry Andric  let Latency = 1;
6910b57cec5SDimitry Andric  let NumMicroOps = 1;
6925f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
6930b57cec5SDimitry Andric}
694bdd1243dSDimitry Andricdef: InstRW<[SKLWriteResGroup10], (instrs SGDT64m,
6950b57cec5SDimitry Andric                                          SIDT64m,
6960b57cec5SDimitry Andric                                          SMSW16m,
6970b57cec5SDimitry Andric                                          STRm,
6980b57cec5SDimitry Andric                                          SYSCALL)>;
6990b57cec5SDimitry Andric
7000b57cec5SDimitry Andricdef SKLWriteResGroup11 : SchedWriteRes<[SKLPort4,SKLPort237]> {
7010b57cec5SDimitry Andric  let Latency = 1;
7020b57cec5SDimitry Andric  let NumMicroOps = 2;
7035f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
7040b57cec5SDimitry Andric}
7050b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup11], (instrs FBSTPm, VMPTRSTm)>;
7060b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup11], (instregex "ST_FP(32|64|80)m")>;
7070b57cec5SDimitry Andric
7080b57cec5SDimitry Andricdef SKLWriteResGroup13 : SchedWriteRes<[SKLPort5]> {
7090b57cec5SDimitry Andric  let Latency = 2;
7100b57cec5SDimitry Andric  let NumMicroOps = 2;
7115f757f3fSDimitry Andric  let ReleaseAtCycles = [2];
7120b57cec5SDimitry Andric}
7130b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup13], (instrs MMX_MOVQ2DQrr)>;
7140b57cec5SDimitry Andric
7150b57cec5SDimitry Andricdef SKLWriteResGroup14 : SchedWriteRes<[SKLPort05]> {
7160b57cec5SDimitry Andric  let Latency = 2;
7170b57cec5SDimitry Andric  let NumMicroOps = 2;
7185f757f3fSDimitry Andric  let ReleaseAtCycles = [2];
7190b57cec5SDimitry Andric}
7200b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup14], (instrs FDECSTP,
7210b57cec5SDimitry Andric                                          MMX_MOVDQ2Qrr)>;
7220b57cec5SDimitry Andric
7230b57cec5SDimitry Andricdef SKLWriteResGroup17 : SchedWriteRes<[SKLPort0156]> {
7240b57cec5SDimitry Andric  let Latency = 2;
7250b57cec5SDimitry Andric  let NumMicroOps = 2;
7265f757f3fSDimitry Andric  let ReleaseAtCycles = [2];
7270b57cec5SDimitry Andric}
7280b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup17], (instrs LFENCE,
7290b57cec5SDimitry Andric                                          WAIT,
7300b57cec5SDimitry Andric                                          XGETBV)>;
7310b57cec5SDimitry Andric
7320b57cec5SDimitry Andricdef SKLWriteResGroup20 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
7330b57cec5SDimitry Andric  let Latency = 2;
7340b57cec5SDimitry Andric  let NumMicroOps = 2;
7355f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
7360b57cec5SDimitry Andric}
7370b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup20], (instregex "CLFLUSH")>;
7380b57cec5SDimitry Andric
7390b57cec5SDimitry Andricdef SKLWriteResGroup21 : SchedWriteRes<[SKLPort237,SKLPort0156]> {
7400b57cec5SDimitry Andric  let Latency = 2;
7410b57cec5SDimitry Andric  let NumMicroOps = 2;
7425f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
7430b57cec5SDimitry Andric}
7440b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup21], (instrs SFENCE)>;
7450b57cec5SDimitry Andric
7460b57cec5SDimitry Andricdef SKLWriteResGroup23 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
7470b57cec5SDimitry Andric  let Latency = 2;
7480b57cec5SDimitry Andric  let NumMicroOps = 2;
7495f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
7500b57cec5SDimitry Andric}
7510b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup23], (instrs CWD,
7520b57cec5SDimitry Andric                                          JCXZ, JECXZ, JRCXZ,
7530b57cec5SDimitry Andric                                          ADC8i8, SBB8i8,
7540b57cec5SDimitry Andric                                          ADC16i16, SBB16i16,
7550b57cec5SDimitry Andric                                          ADC32i32, SBB32i32,
7560b57cec5SDimitry Andric                                          ADC64i32, SBB64i32)>;
7570b57cec5SDimitry Andric
7580b57cec5SDimitry Andricdef SKLWriteResGroup25 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort237]> {
7590b57cec5SDimitry Andric  let Latency = 2;
7600b57cec5SDimitry Andric  let NumMicroOps = 3;
7615f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1];
7620b57cec5SDimitry Andric}
7630b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup25], (instrs FNSTCW16m)>;
7640b57cec5SDimitry Andric
7650b57cec5SDimitry Andricdef SKLWriteResGroup27 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort15]> {
7660b57cec5SDimitry Andric  let Latency = 2;
7670b57cec5SDimitry Andric  let NumMicroOps = 3;
7685f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1];
7690b57cec5SDimitry Andric}
7700b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup27], (instregex "MOVBE(16|32|64)mr")>;
7710b57cec5SDimitry Andric
7720b57cec5SDimitry Andricdef SKLWriteResGroup28 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort0156]> {
7730b57cec5SDimitry Andric  let Latency = 2;
7740b57cec5SDimitry Andric  let NumMicroOps = 3;
7755f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1];
7760b57cec5SDimitry Andric}
7770b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup28], (instrs PUSH16r, PUSH32r, PUSH64r, PUSH64i8,
7780b57cec5SDimitry Andric                                          STOSB, STOSL, STOSQ, STOSW)>;
7790b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup28], (instregex "PUSH(16|32|64)rmr")>;
7800b57cec5SDimitry Andric
7810b57cec5SDimitry Andricdef SKLWriteResGroup29 : SchedWriteRes<[SKLPort1]> {
7820b57cec5SDimitry Andric  let Latency = 3;
7830b57cec5SDimitry Andric  let NumMicroOps = 1;
7845f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
7850b57cec5SDimitry Andric}
7860b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup29], (instregex "PDEP(32|64)rr",
7870b57cec5SDimitry Andric                                             "PEXT(32|64)rr")>;
7880b57cec5SDimitry Andric
7890b57cec5SDimitry Andricdef SKLWriteResGroup30 : SchedWriteRes<[SKLPort5]> {
7900b57cec5SDimitry Andric  let Latency = 3;
7910b57cec5SDimitry Andric  let NumMicroOps = 1;
7925f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
7930b57cec5SDimitry Andric}
7940b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup30], (instregex "(ADD|SUB|SUBR)_(FPrST0|FST0r|FrST0)",
7950b57cec5SDimitry Andric                                             "VPBROADCAST(B|W)rr")>;
7960b57cec5SDimitry Andric
7970b57cec5SDimitry Andricdef SKLWriteResGroup32 : SchedWriteRes<[SKLPort0,SKLPort0156]> {
7980b57cec5SDimitry Andric  let Latency = 3;
7990b57cec5SDimitry Andric  let NumMicroOps = 2;
8005f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
8010b57cec5SDimitry Andric}
8020b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup32], (instrs FNSTSW16r)>;
8030b57cec5SDimitry Andric
8040b57cec5SDimitry Andricdef SKLWriteResGroup35 : SchedWriteRes<[SKLPort0,SKLPort5]> {
8050b57cec5SDimitry Andric  let Latency = 3;
8060b57cec5SDimitry Andric  let NumMicroOps = 3;
8075f757f3fSDimitry Andric  let ReleaseAtCycles = [1,2];
8080b57cec5SDimitry Andric}
8090b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup35], (instregex "MMX_PH(ADD|SUB)SWrr")>;
8100b57cec5SDimitry Andric
8110b57cec5SDimitry Andricdef SKLWriteResGroup36 : SchedWriteRes<[SKLPort5,SKLPort01]> {
8120b57cec5SDimitry Andric  let Latency = 3;
8130b57cec5SDimitry Andric  let NumMicroOps = 3;
8145f757f3fSDimitry Andric  let ReleaseAtCycles = [2,1];
8150b57cec5SDimitry Andric}
8160b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup36], (instregex "(V?)PHADDSW(Y?)rr",
8170b57cec5SDimitry Andric                                             "(V?)PHSUBSW(Y?)rr")>;
8180b57cec5SDimitry Andric
8190b57cec5SDimitry Andricdef SKLWriteResGroup39 : SchedWriteRes<[SKLPort5,SKLPort0156]> {
8200b57cec5SDimitry Andric  let Latency = 3;
8210b57cec5SDimitry Andric  let NumMicroOps = 3;
8225f757f3fSDimitry Andric  let ReleaseAtCycles = [2,1];
8230b57cec5SDimitry Andric}
8240eae32dcSDimitry Andricdef: InstRW<[SKLWriteResGroup39], (instrs MMX_PACKSSDWrr,
8250eae32dcSDimitry Andric                                          MMX_PACKSSWBrr,
8260eae32dcSDimitry Andric                                          MMX_PACKUSWBrr)>;
8270b57cec5SDimitry Andric
8280b57cec5SDimitry Andricdef SKLWriteResGroup40 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
8290b57cec5SDimitry Andric  let Latency = 3;
8300b57cec5SDimitry Andric  let NumMicroOps = 3;
8315f757f3fSDimitry Andric  let ReleaseAtCycles = [1,2];
8320b57cec5SDimitry Andric}
8330b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup40], (instregex "CLD")>;
8340b57cec5SDimitry Andric
8350b57cec5SDimitry Andricdef SKLWriteResGroup41 : SchedWriteRes<[SKLPort237,SKLPort0156]> {
8360b57cec5SDimitry Andric  let Latency = 3;
8370b57cec5SDimitry Andric  let NumMicroOps = 3;
8385f757f3fSDimitry Andric  let ReleaseAtCycles = [1,2];
8390b57cec5SDimitry Andric}
8400b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup41], (instrs MFENCE)>;
8410b57cec5SDimitry Andric
8420b57cec5SDimitry Andricdef SKLWriteResGroup42 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
84381ad6265SDimitry Andric  let Latency = 2;
8440b57cec5SDimitry Andric  let NumMicroOps = 3;
8455f757f3fSDimitry Andric  let ReleaseAtCycles = [1,2];
8460b57cec5SDimitry Andric}
84781ad6265SDimitry Andricdef: InstRW<[SKLWriteResGroup42], (instrs RCL8r1, RCL16r1, RCL32r1, RCL64r1,
84881ad6265SDimitry Andric                                          RCR8r1, RCR16r1, RCR32r1, RCR64r1)>;
84981ad6265SDimitry Andric
85081ad6265SDimitry Andricdef SKLWriteResGroup42b : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
85181ad6265SDimitry Andric  let Latency = 5;
85281ad6265SDimitry Andric  let NumMicroOps = 8;
8535f757f3fSDimitry Andric  let ReleaseAtCycles = [2,4,2];
85481ad6265SDimitry Andric}
85581ad6265SDimitry Andricdef: InstRW<[SKLWriteResGroup42b], (instrs RCR8ri, RCR16ri, RCR32ri, RCR64ri)>;
85681ad6265SDimitry Andric
85781ad6265SDimitry Andricdef SKLWriteResGroup42c : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
85881ad6265SDimitry Andric  let Latency = 6;
85981ad6265SDimitry Andric  let NumMicroOps = 8;
8605f757f3fSDimitry Andric  let ReleaseAtCycles = [2,4,2];
86181ad6265SDimitry Andric}
86281ad6265SDimitry Andricdef: InstRW<[SKLWriteResGroup42c], (instrs RCL8ri, RCL16ri, RCL32ri, RCL64ri)>;
8630b57cec5SDimitry Andric
8640b57cec5SDimitry Andricdef SKLWriteResGroup43 : SchedWriteRes<[SKLPort0,SKLPort4,SKLPort237]> {
8650b57cec5SDimitry Andric  let Latency = 3;
8660b57cec5SDimitry Andric  let NumMicroOps = 3;
8675f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1];
8680b57cec5SDimitry Andric}
8690b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup43], (instrs FNSTSWm)>;
8700b57cec5SDimitry Andric
8710b57cec5SDimitry Andricdef SKLWriteResGroup45 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort237,SKLPort0156]> {
8720b57cec5SDimitry Andric  let Latency = 3;
8730b57cec5SDimitry Andric  let NumMicroOps = 4;
8745f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1,1];
8750b57cec5SDimitry Andric}
8760b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup45], (instregex "CALL(16|32|64)r")>;
8770b57cec5SDimitry Andric
8780b57cec5SDimitry Andricdef SKLWriteResGroup46 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort06,SKLPort0156]> {
8790b57cec5SDimitry Andric  let Latency = 3;
8800b57cec5SDimitry Andric  let NumMicroOps = 4;
8815f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1,1];
8820b57cec5SDimitry Andric}
8830b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup46], (instrs CALL64pcrel32)>;
8840b57cec5SDimitry Andric
8850b57cec5SDimitry Andricdef SKLWriteResGroup47 : SchedWriteRes<[SKLPort0]> {
8860b57cec5SDimitry Andric  let Latency = 4;
8870b57cec5SDimitry Andric  let NumMicroOps = 1;
8885f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
8890b57cec5SDimitry Andric}
8900b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup47], (instregex "MUL_(FPrST0|FST0r|FrST0)")>;
8910b57cec5SDimitry Andric
8920b57cec5SDimitry Andricdef SKLWriteResGroup53 : SchedWriteRes<[SKLPort4,SKLPort5,SKLPort237]> {
8930b57cec5SDimitry Andric  let Latency = 4;
8940b57cec5SDimitry Andric  let NumMicroOps = 3;
8955f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1];
8960b57cec5SDimitry Andric}
8970b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup53], (instregex "IST(T?)_FP(16|32|64)m",
8980b57cec5SDimitry Andric                                             "IST_F(16|32)m")>;
8990b57cec5SDimitry Andric
9000b57cec5SDimitry Andricdef SKLWriteResGroup54 : SchedWriteRes<[SKLPort0156]> {
9010b57cec5SDimitry Andric  let Latency = 4;
9020b57cec5SDimitry Andric  let NumMicroOps = 4;
9035f757f3fSDimitry Andric  let ReleaseAtCycles = [4];
9040b57cec5SDimitry Andric}
9050b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup54], (instrs FNCLEX)>;
9060b57cec5SDimitry Andric
9070b57cec5SDimitry Andricdef SKLWriteResGroup55 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
9080b57cec5SDimitry Andric  let Latency = 4;
9090b57cec5SDimitry Andric  let NumMicroOps = 4;
9105f757f3fSDimitry Andric  let ReleaseAtCycles = [1,3];
9110b57cec5SDimitry Andric}
9120b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup55], (instrs PAUSE)>;
9130b57cec5SDimitry Andric
9140b57cec5SDimitry Andricdef SKLWriteResGroup56 : SchedWriteRes<[]> {
9150b57cec5SDimitry Andric  let Latency = 0;
9160b57cec5SDimitry Andric  let NumMicroOps = 4;
9175f757f3fSDimitry Andric  let ReleaseAtCycles = [];
9180b57cec5SDimitry Andric}
9190b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup56], (instrs VZEROUPPER)>;
9200b57cec5SDimitry Andric
9210b57cec5SDimitry Andricdef SKLWriteResGroup57 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort0156]> {
9220b57cec5SDimitry Andric  let Latency = 4;
9230b57cec5SDimitry Andric  let NumMicroOps = 4;
9245f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,2];
9250b57cec5SDimitry Andric}
9260b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup57], (instregex "LAR(16|32|64)rr")>;
9270b57cec5SDimitry Andric
928bdd1243dSDimitry Andricdef SKLWriteResGroup60 : SchedWriteRes<[SKLPort5,SKLPort01]> {
9290b57cec5SDimitry Andric  let Latency = 5;
9300b57cec5SDimitry Andric  let NumMicroOps = 2;
9315f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
9320b57cec5SDimitry Andric}
933bdd1243dSDimitry Andricdef: InstRW<[SKLWriteResGroup60], (instregex "MMX_CVT(T?)PS2PIrr")>;
9340b57cec5SDimitry Andric
9350b57cec5SDimitry Andricdef SKLWriteResGroup61 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort06]> {
9360b57cec5SDimitry Andric  let Latency = 5;
9370b57cec5SDimitry Andric  let NumMicroOps = 3;
9385f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1];
9390b57cec5SDimitry Andric}
9400b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup61], (instregex "STR(16|32|64)r")>;
9410b57cec5SDimitry Andric
9420b57cec5SDimitry Andricdef SKLWriteResGroup63 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
9430b57cec5SDimitry Andric  let Latency = 5;
9440b57cec5SDimitry Andric  let NumMicroOps = 5;
9455f757f3fSDimitry Andric  let ReleaseAtCycles = [1,4];
9460b57cec5SDimitry Andric}
9470b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup63], (instrs XSETBV)>;
9480b57cec5SDimitry Andric
9490b57cec5SDimitry Andricdef SKLWriteResGroup65 : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort0156]> {
9500b57cec5SDimitry Andric  let Latency = 5;
9510b57cec5SDimitry Andric  let NumMicroOps = 6;
9525f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,4];
9530b57cec5SDimitry Andric}
9540b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup65], (instregex "PUSHF(16|64)")>;
9550b57cec5SDimitry Andric
9560b57cec5SDimitry Andricdef SKLWriteResGroup67 : SchedWriteRes<[SKLPort23]> {
9570b57cec5SDimitry Andric  let Latency = 6;
9580b57cec5SDimitry Andric  let NumMicroOps = 1;
9595f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
9600b57cec5SDimitry Andric}
9610b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup67], (instrs VBROADCASTSSrm,
9620b57cec5SDimitry Andric                                          VPBROADCASTDrm,
9630b57cec5SDimitry Andric                                          VPBROADCASTQrm)>;
9640b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup67], (instregex "(V?)MOVSHDUPrm",
96581ad6265SDimitry Andric                                             "(V?)MOVSLDUPrm",
96681ad6265SDimitry Andric                                             "(V?)MOVDDUPrm")>;
9670b57cec5SDimitry Andric
9680b57cec5SDimitry Andricdef SKLWriteResGroup68 : SchedWriteRes<[SKLPort0]> {
9690b57cec5SDimitry Andric  let Latency = 6;
9700b57cec5SDimitry Andric  let NumMicroOps = 2;
9715f757f3fSDimitry Andric  let ReleaseAtCycles = [2];
9720b57cec5SDimitry Andric}
9730eae32dcSDimitry Andricdef: InstRW<[SKLWriteResGroup68], (instrs MMX_CVTPI2PSrr)>;
9740b57cec5SDimitry Andric
9750b57cec5SDimitry Andricdef SKLWriteResGroup69 : SchedWriteRes<[SKLPort0,SKLPort23]> {
9760b57cec5SDimitry Andric  let Latency = 6;
9770b57cec5SDimitry Andric  let NumMicroOps = 2;
9785f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
9790b57cec5SDimitry Andric}
9800eae32dcSDimitry Andricdef: InstRW<[SKLWriteResGroup69], (instrs MMX_PADDSBrm,
9810eae32dcSDimitry Andric                                          MMX_PADDSWrm,
9820eae32dcSDimitry Andric                                          MMX_PADDUSBrm,
9830eae32dcSDimitry Andric                                          MMX_PADDUSWrm,
9840eae32dcSDimitry Andric                                          MMX_PAVGBrm,
9850eae32dcSDimitry Andric                                          MMX_PAVGWrm,
9860eae32dcSDimitry Andric                                          MMX_PCMPEQBrm,
9870eae32dcSDimitry Andric                                          MMX_PCMPEQDrm,
9880eae32dcSDimitry Andric                                          MMX_PCMPEQWrm,
9890eae32dcSDimitry Andric                                          MMX_PCMPGTBrm,
9900eae32dcSDimitry Andric                                          MMX_PCMPGTDrm,
9910eae32dcSDimitry Andric                                          MMX_PCMPGTWrm,
9920eae32dcSDimitry Andric                                          MMX_PMAXSWrm,
9930eae32dcSDimitry Andric                                          MMX_PMAXUBrm,
9940eae32dcSDimitry Andric                                          MMX_PMINSWrm,
9950eae32dcSDimitry Andric                                          MMX_PMINUBrm,
9960eae32dcSDimitry Andric                                          MMX_PSUBSBrm,
9970eae32dcSDimitry Andric                                          MMX_PSUBSWrm,
9980eae32dcSDimitry Andric                                          MMX_PSUBUSBrm,
9990eae32dcSDimitry Andric                                          MMX_PSUBUSWrm)>;
10000b57cec5SDimitry Andric
10010b57cec5SDimitry Andricdef SKLWriteResGroup72 : SchedWriteRes<[SKLPort6,SKLPort23]> {
10020b57cec5SDimitry Andric  let Latency = 6;
10030b57cec5SDimitry Andric  let NumMicroOps = 2;
10045f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
10050b57cec5SDimitry Andric}
10065ffd83dbSDimitry Andricdef: InstRW<[SKLWriteResGroup72], (instrs FARJMP64m)>;
10070b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup72], (instregex "JMP(16|32|64)m")>;
10080b57cec5SDimitry Andric
10090b57cec5SDimitry Andricdef SKLWriteResGroup75 : SchedWriteRes<[SKLPort23,SKLPort15]> {
10100b57cec5SDimitry Andric  let Latency = 6;
10110b57cec5SDimitry Andric  let NumMicroOps = 2;
10125f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
10130b57cec5SDimitry Andric}
10140b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup75], (instregex "ANDN(32|64)rm",
10150b57cec5SDimitry Andric                                             "MOVBE(16|32|64)rm")>;
10160b57cec5SDimitry Andric
10170b57cec5SDimitry Andricdef SKLWriteResGroup76 : SchedWriteRes<[SKLPort23,SKLPort0156]> {
10180b57cec5SDimitry Andric  let Latency = 6;
10190b57cec5SDimitry Andric  let NumMicroOps = 2;
10205f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
10210b57cec5SDimitry Andric}
10220b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup76], (instrs POP16r, POP32r, POP64r)>;
10230b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup76], (instregex "POP(16|32|64)rmr")>;
10240b57cec5SDimitry Andric
10250b57cec5SDimitry Andricdef SKLWriteResGroup78 : SchedWriteRes<[SKLPort5,SKLPort01]> {
10260b57cec5SDimitry Andric  let Latency = 6;
10270b57cec5SDimitry Andric  let NumMicroOps = 3;
10285f757f3fSDimitry Andric  let ReleaseAtCycles = [2,1];
10290b57cec5SDimitry Andric}
10300b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup78], (instregex "(V?)CVTSI642SSrr")>;
10310b57cec5SDimitry Andric
10320b57cec5SDimitry Andricdef SKLWriteResGroup80 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort06,SKLPort0156]> {
10330b57cec5SDimitry Andric  let Latency = 6;
10340b57cec5SDimitry Andric  let NumMicroOps = 4;
10355f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1,1];
10360b57cec5SDimitry Andric}
10370b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup80], (instregex "SLDT(16|32|64)r")>;
10380b57cec5SDimitry Andric
10390b57cec5SDimitry Andricdef SKLWriteResGroup82 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06]> {
10400b57cec5SDimitry Andric  let Latency = 6;
10410b57cec5SDimitry Andric  let NumMicroOps = 4;
10425f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1,1];
10430b57cec5SDimitry Andric}
10440b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup82], (instregex "SAR(8|16|32|64)m(1|i)",
10450b57cec5SDimitry Andric                                             "SHL(8|16|32|64)m(1|i)",
10460b57cec5SDimitry Andric                                             "SHR(8|16|32|64)m(1|i)")>;
10470b57cec5SDimitry Andric
10480b57cec5SDimitry Andricdef SKLWriteResGroup83 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort0156]> {
10490b57cec5SDimitry Andric  let Latency = 6;
10500b57cec5SDimitry Andric  let NumMicroOps = 4;
10515f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1,1];
10520b57cec5SDimitry Andric}
10530b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup83], (instregex "POP(16|32|64)rmm",
10540b57cec5SDimitry Andric                                             "PUSH(16|32|64)rmm")>;
10550b57cec5SDimitry Andric
10560b57cec5SDimitry Andricdef SKLWriteResGroup84 : SchedWriteRes<[SKLPort6,SKLPort0156]> {
10570b57cec5SDimitry Andric  let Latency = 6;
10580b57cec5SDimitry Andric  let NumMicroOps = 6;
10595f757f3fSDimitry Andric  let ReleaseAtCycles = [1,5];
10600b57cec5SDimitry Andric}
10610b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup84], (instrs STD)>;
10620b57cec5SDimitry Andric
10630b57cec5SDimitry Andricdef SKLWriteResGroup85 : SchedWriteRes<[SKLPort23]> {
10640b57cec5SDimitry Andric  let Latency = 7;
10650b57cec5SDimitry Andric  let NumMicroOps = 1;
10665f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
10670b57cec5SDimitry Andric}
10680b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup85], (instregex "LD_F(32|64|80)m")>;
10695f757f3fSDimitry Andricdef: InstRW<[SKLWriteResGroup85], (instrs VBROADCASTF128rm,
10705f757f3fSDimitry Andric                                          VBROADCASTI128rm,
10710b57cec5SDimitry Andric                                          VBROADCASTSDYrm,
10720b57cec5SDimitry Andric                                          VBROADCASTSSYrm,
10730b57cec5SDimitry Andric                                          VMOVDDUPYrm,
10740b57cec5SDimitry Andric                                          VMOVSHDUPYrm,
10750b57cec5SDimitry Andric                                          VMOVSLDUPYrm,
10760b57cec5SDimitry Andric                                          VPBROADCASTDYrm,
10770b57cec5SDimitry Andric                                          VPBROADCASTQYrm)>;
10780b57cec5SDimitry Andric
10790b57cec5SDimitry Andricdef SKLWriteResGroup88 : SchedWriteRes<[SKLPort5,SKLPort23]> {
10800b57cec5SDimitry Andric  let Latency = 6;
10810b57cec5SDimitry Andric  let NumMicroOps = 2;
10825f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
10830b57cec5SDimitry Andric}
10840b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup88], (instregex "(V?)PMOV(SX|ZX)BDrm",
10850b57cec5SDimitry Andric                                             "(V?)PMOV(SX|ZX)BQrm",
10860b57cec5SDimitry Andric                                             "(V?)PMOV(SX|ZX)BWrm",
10870b57cec5SDimitry Andric                                             "(V?)PMOV(SX|ZX)DQrm",
10880b57cec5SDimitry Andric                                             "(V?)PMOV(SX|ZX)WDrm",
10890b57cec5SDimitry Andric                                             "(V?)PMOV(SX|ZX)WQrm")>;
10900b57cec5SDimitry Andric
10910b57cec5SDimitry Andricdef SKLWriteResGroup91 : SchedWriteRes<[SKLPort23,SKLPort015]> {
10920b57cec5SDimitry Andric  let Latency = 7;
10930b57cec5SDimitry Andric  let NumMicroOps = 2;
10945f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
10950b57cec5SDimitry Andric}
10960b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup91], (instrs VINSERTF128rm,
10970b57cec5SDimitry Andric                                          VINSERTI128rm,
10980b57cec5SDimitry Andric                                          VPBLENDDrmi)>;
10990b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup91, ReadAfterVecXLd],
11000b57cec5SDimitry Andric                                  (instregex "(V?)PADD(B|D|Q|W)rm",
11010b57cec5SDimitry Andric                                             "(V?)PSUB(B|D|Q|W)rm")>;
11020b57cec5SDimitry Andric
11030b57cec5SDimitry Andricdef SKLWriteResGroup92 : SchedWriteRes<[SKLPort5,SKLPort23]> {
11040b57cec5SDimitry Andric  let Latency = 7;
11050b57cec5SDimitry Andric  let NumMicroOps = 3;
11065f757f3fSDimitry Andric  let ReleaseAtCycles = [2,1];
11070b57cec5SDimitry Andric}
11080eae32dcSDimitry Andricdef: InstRW<[SKLWriteResGroup92], (instrs MMX_PACKSSDWrm,
11090eae32dcSDimitry Andric                                          MMX_PACKSSWBrm,
11100eae32dcSDimitry Andric                                          MMX_PACKUSWBrm)>;
11110b57cec5SDimitry Andric
11120b57cec5SDimitry Andricdef SKLWriteResGroup94 : SchedWriteRes<[SKLPort23,SKLPort0156]> {
11130b57cec5SDimitry Andric  let Latency = 7;
11140b57cec5SDimitry Andric  let NumMicroOps = 3;
11155f757f3fSDimitry Andric  let ReleaseAtCycles = [1,2];
11160b57cec5SDimitry Andric}
11170b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup94], (instrs LEAVE, LEAVE64,
11180b57cec5SDimitry Andric                                          SCASB, SCASL, SCASQ, SCASW)>;
11190b57cec5SDimitry Andric
11200b57cec5SDimitry Andricdef SKLWriteResGroup95 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort01]> {
11210b57cec5SDimitry Andric  let Latency = 7;
11220b57cec5SDimitry Andric  let NumMicroOps = 3;
11235f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1];
11240b57cec5SDimitry Andric}
1125bdd1243dSDimitry Andricdef: InstRW<[SKLWriteResGroup95], (instregex "(V?)CVT(T?)SS2SI64rr")>;
11260b57cec5SDimitry Andric
11270b57cec5SDimitry Andricdef SKLWriteResGroup96 : SchedWriteRes<[SKLPort0,SKLPort23,SKLPort05]> {
11280b57cec5SDimitry Andric  let Latency = 7;
11290b57cec5SDimitry Andric  let NumMicroOps = 3;
11305f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1];
11310b57cec5SDimitry Andric}
11320b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup96], (instrs FLDCW16m)>;
11330b57cec5SDimitry Andric
11340b57cec5SDimitry Andricdef SKLWriteResGroup98 : SchedWriteRes<[SKLPort6,SKLPort23,SKLPort0156]> {
11350b57cec5SDimitry Andric  let Latency = 7;
11360b57cec5SDimitry Andric  let NumMicroOps = 3;
11375f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1];
11380b57cec5SDimitry Andric}
1139349cc55cSDimitry Andricdef: InstRW<[SKLWriteResGroup98], (instrs LRET64, RET64)>;
11400b57cec5SDimitry Andric
11410b57cec5SDimitry Andricdef SKLWriteResGroup100 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06]> {
11420b57cec5SDimitry Andric  let Latency = 7;
11430b57cec5SDimitry Andric  let NumMicroOps = 5;
11445f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1,2];
11450b57cec5SDimitry Andric}
11460b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup100], (instregex "ROL(8|16|32|64)m(1|i)",
11470b57cec5SDimitry Andric                                              "ROR(8|16|32|64)m(1|i)")>;
11480b57cec5SDimitry Andric
11490b57cec5SDimitry Andricdef SKLWriteResGroup100_1 : SchedWriteRes<[SKLPort06]> {
11500b57cec5SDimitry Andric  let Latency = 2;
11510b57cec5SDimitry Andric  let NumMicroOps = 2;
11525f757f3fSDimitry Andric  let ReleaseAtCycles = [2];
11530b57cec5SDimitry Andric}
11540b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup100_1], (instrs ROL8r1, ROL16r1, ROL32r1, ROL64r1,
11550b57cec5SDimitry Andric                                             ROR8r1, ROR16r1, ROR32r1, ROR64r1)>;
11560b57cec5SDimitry Andric
11570b57cec5SDimitry Andricdef SKLWriteResGroup101 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort0156]> {
11580b57cec5SDimitry Andric  let Latency = 7;
11590b57cec5SDimitry Andric  let NumMicroOps = 5;
11605f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1,2];
11610b57cec5SDimitry Andric}
11620b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup101], (instregex "XADD(8|16|32|64)rm")>;
11630b57cec5SDimitry Andric
11640b57cec5SDimitry Andricdef SKLWriteResGroup102 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
11650b57cec5SDimitry Andric  let Latency = 7;
11660b57cec5SDimitry Andric  let NumMicroOps = 5;
11675f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1,1,1];
11680b57cec5SDimitry Andric}
11690b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup102], (instregex "CALL(16|32|64)m")>;
11705ffd83dbSDimitry Andricdef: InstRW<[SKLWriteResGroup102], (instrs FARCALL64m)>;
11710b57cec5SDimitry Andric
11720b57cec5SDimitry Andricdef SKLWriteResGroup103 : SchedWriteRes<[SKLPort6,SKLPort06,SKLPort15,SKLPort0156]> {
11730b57cec5SDimitry Andric  let Latency = 7;
11740b57cec5SDimitry Andric  let NumMicroOps = 7;
11755f757f3fSDimitry Andric  let ReleaseAtCycles = [1,3,1,2];
11760b57cec5SDimitry Andric}
11770b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup103], (instrs LOOP)>;
11780b57cec5SDimitry Andric
11790b57cec5SDimitry Andricdef SKLWriteResGroup107 : SchedWriteRes<[SKLPort1,SKLPort23]> {
11800b57cec5SDimitry Andric  let Latency = 8;
11810b57cec5SDimitry Andric  let NumMicroOps = 2;
11825f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
11830b57cec5SDimitry Andric}
11840b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup107], (instregex "PDEP(32|64)rm",
11850b57cec5SDimitry Andric                                              "PEXT(32|64)rm")>;
11860b57cec5SDimitry Andric
11870b57cec5SDimitry Andricdef SKLWriteResGroup108 : SchedWriteRes<[SKLPort5,SKLPort23]> {
11880b57cec5SDimitry Andric  let Latency = 8;
11890b57cec5SDimitry Andric  let NumMicroOps = 2;
11905f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
11910b57cec5SDimitry Andric}
11920b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup108], (instregex "FCOM(P?)(32|64)m")>;
11930b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup108], (instrs VPBROADCASTBYrm,
11940b57cec5SDimitry Andric                                           VPBROADCASTWYrm,
11950b57cec5SDimitry Andric                                           VPMOVSXBDYrm,
11960b57cec5SDimitry Andric                                           VPMOVSXBQYrm,
11970b57cec5SDimitry Andric                                           VPMOVSXWQYrm)>;
11980b57cec5SDimitry Andric
11990b57cec5SDimitry Andricdef SKLWriteResGroup110 : SchedWriteRes<[SKLPort23,SKLPort015]> {
12000b57cec5SDimitry Andric  let Latency = 8;
12010b57cec5SDimitry Andric  let NumMicroOps = 2;
12025f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
12030b57cec5SDimitry Andric}
12040b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup110], (instrs VPBLENDDYrmi)>;
12050b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup110, ReadAfterVecYLd],
12060b57cec5SDimitry Andric                                   (instregex "VPADD(B|D|Q|W)Yrm",
12070b57cec5SDimitry Andric                                              "VPSUB(B|D|Q|W)Yrm")>;
12080b57cec5SDimitry Andric
12090b57cec5SDimitry Andricdef SKLWriteResGroup112 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
12100b57cec5SDimitry Andric  let Latency = 8;
12110b57cec5SDimitry Andric  let NumMicroOps = 4;
12125f757f3fSDimitry Andric  let ReleaseAtCycles = [1,2,1];
12130b57cec5SDimitry Andric}
12140b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup112], (instregex "MMX_PH(ADD|SUB)SWrm")>;
12150b57cec5SDimitry Andric
12160b57cec5SDimitry Andricdef SKLWriteResGroup116 : SchedWriteRes<[SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
12170b57cec5SDimitry Andric  let Latency = 8;
12180b57cec5SDimitry Andric  let NumMicroOps = 5;
12195f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1,2];
12200b57cec5SDimitry Andric}
12210b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup116], (instregex "RCL(8|16|32|64)m(1|i)",
12220b57cec5SDimitry Andric                                              "RCR(8|16|32|64)m(1|i)")>;
12230b57cec5SDimitry Andric
12240b57cec5SDimitry Andricdef SKLWriteResGroup117 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06]> {
12250b57cec5SDimitry Andric  let Latency = 8;
12260b57cec5SDimitry Andric  let NumMicroOps = 6;
12275f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1,3];
12280b57cec5SDimitry Andric}
12290b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup117], (instregex "ROL(8|16|32|64)mCL",
12300b57cec5SDimitry Andric                                              "ROR(8|16|32|64)mCL",
12310b57cec5SDimitry Andric                                              "SAR(8|16|32|64)mCL",
12320b57cec5SDimitry Andric                                              "SHL(8|16|32|64)mCL",
12330b57cec5SDimitry Andric                                              "SHR(8|16|32|64)mCL")>;
12340b57cec5SDimitry Andric
12350b57cec5SDimitry Andricdef SKLWriteResGroup119 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
12360b57cec5SDimitry Andric  let Latency = 8;
12370b57cec5SDimitry Andric  let NumMicroOps = 6;
12385f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1,2,1];
12390b57cec5SDimitry Andric}
12400b57cec5SDimitry Andricdef: SchedAlias<WriteADCRMW, SKLWriteResGroup119>;
12410b57cec5SDimitry Andric
12420b57cec5SDimitry Andricdef SKLWriteResGroup120 : SchedWriteRes<[SKLPort0,SKLPort23]> {
12430b57cec5SDimitry Andric  let Latency = 9;
12440b57cec5SDimitry Andric  let NumMicroOps = 2;
12455f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
12460b57cec5SDimitry Andric}
12470eae32dcSDimitry Andricdef: InstRW<[SKLWriteResGroup120], (instrs MMX_CVTPI2PSrm)>;
12480b57cec5SDimitry Andric
12490b57cec5SDimitry Andricdef SKLWriteResGroup121 : SchedWriteRes<[SKLPort5,SKLPort23]> {
12500b57cec5SDimitry Andric  let Latency = 9;
12510b57cec5SDimitry Andric  let NumMicroOps = 2;
12525f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
12530b57cec5SDimitry Andric}
12540b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup121], (instrs PCMPGTQrm,
12550b57cec5SDimitry Andric                                           VPCMPGTQrm,
12560b57cec5SDimitry Andric                                           VPMOVSXBWYrm,
12570b57cec5SDimitry Andric                                           VPMOVSXDQYrm,
12580b57cec5SDimitry Andric                                           VPMOVSXWDYrm,
12590b57cec5SDimitry Andric                                           VPMOVZXWDYrm)>;
12600b57cec5SDimitry Andric
12610b57cec5SDimitry Andricdef SKLWriteResGroup123 : SchedWriteRes<[SKLPort23,SKLPort01]> {
12620b57cec5SDimitry Andric  let Latency = 9;
12630b57cec5SDimitry Andric  let NumMicroOps = 2;
12645f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
12650b57cec5SDimitry Andric}
1266bdd1243dSDimitry Andricdef: InstRW<[SKLWriteResGroup123], (instregex "MMX_CVT(T?)PS2PIrm")>;
12670b57cec5SDimitry Andric
12680b57cec5SDimitry Andricdef SKLWriteResGroup128 : SchedWriteRes<[SKLPort5,SKLPort01,SKLPort23]> {
12690b57cec5SDimitry Andric  let Latency = 9;
12700b57cec5SDimitry Andric  let NumMicroOps = 4;
12715f757f3fSDimitry Andric  let ReleaseAtCycles = [2,1,1];
12720b57cec5SDimitry Andric}
12730b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup128], (instregex "(V?)PHADDSWrm",
12740b57cec5SDimitry Andric                                              "(V?)PHSUBSWrm")>;
12750b57cec5SDimitry Andric
12760b57cec5SDimitry Andricdef SKLWriteResGroup131 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort23,SKLPort0156]> {
12770b57cec5SDimitry Andric  let Latency = 9;
12780b57cec5SDimitry Andric  let NumMicroOps = 5;
12795f757f3fSDimitry Andric  let ReleaseAtCycles = [1,2,1,1];
12800b57cec5SDimitry Andric}
12810b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup131], (instregex "LAR(16|32|64)rm",
12820b57cec5SDimitry Andric                                              "LSL(16|32|64)rm")>;
12830b57cec5SDimitry Andric
12840b57cec5SDimitry Andricdef SKLWriteResGroup133 : SchedWriteRes<[SKLPort5,SKLPort23]> {
12850b57cec5SDimitry Andric  let Latency = 10;
12860b57cec5SDimitry Andric  let NumMicroOps = 2;
12875f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
12880b57cec5SDimitry Andric}
12890b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup133], (instregex "(ADD|SUB|SUBR)_F(32|64)m",
12900b57cec5SDimitry Andric                                              "ILD_F(16|32|64)m")>;
12910b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup133], (instrs VPCMPGTQYrm)>;
12920b57cec5SDimitry Andric
12930b57cec5SDimitry Andricdef SKLWriteResGroup138 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
12940b57cec5SDimitry Andric  let Latency = 10;
12950b57cec5SDimitry Andric  let NumMicroOps = 3;
12965f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1];
12970b57cec5SDimitry Andric}
12980eae32dcSDimitry Andricdef: InstRW<[SKLWriteResGroup138], (instrs MMX_CVTPI2PDrm)>;
12990b57cec5SDimitry Andric
13000b57cec5SDimitry Andricdef SKLWriteResGroup140 : SchedWriteRes<[SKLPort5,SKLPort01,SKLPort23]> {
13010b57cec5SDimitry Andric  let Latency = 10;
13020b57cec5SDimitry Andric  let NumMicroOps = 4;
13035f757f3fSDimitry Andric  let ReleaseAtCycles = [2,1,1];
13040b57cec5SDimitry Andric}
13050b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup140], (instrs VPHADDSWYrm,
13060b57cec5SDimitry Andric                                           VPHSUBSWYrm)>;
13070b57cec5SDimitry Andric
13080b57cec5SDimitry Andricdef SKLWriteResGroup143 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
13090b57cec5SDimitry Andric  let Latency = 10;
13100b57cec5SDimitry Andric  let NumMicroOps = 8;
13115f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1,1,1,3];
13120b57cec5SDimitry Andric}
13130b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup143], (instregex "XCHG(8|16|32|64)rm")>;
13140b57cec5SDimitry Andric
13150b57cec5SDimitry Andricdef SKLWriteResGroup146 : SchedWriteRes<[SKLPort0,SKLPort23]> {
13160b57cec5SDimitry Andric  let Latency = 11;
13170b57cec5SDimitry Andric  let NumMicroOps = 2;
13185f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
13190b57cec5SDimitry Andric}
13200b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup146], (instregex "MUL_F(32|64)m")>;
13210b57cec5SDimitry Andric
13220b57cec5SDimitry Andricdef SKLWriteResGroup149 : SchedWriteRes<[SKLPort5,SKLPort23]> {
13230b57cec5SDimitry Andric  let Latency = 11;
13240b57cec5SDimitry Andric  let NumMicroOps = 3;
13255f757f3fSDimitry Andric  let ReleaseAtCycles = [2,1];
13260b57cec5SDimitry Andric}
13270b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup149], (instregex "FICOM(P?)(16|32)m")>;
13280b57cec5SDimitry Andric
13290b57cec5SDimitry Andricdef SKLWriteResGroup154 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort0156]> {
13300b57cec5SDimitry Andric  let Latency = 11;
13310b57cec5SDimitry Andric  let NumMicroOps = 7;
13325f757f3fSDimitry Andric  let ReleaseAtCycles = [2,3,2];
13330b57cec5SDimitry Andric}
13340b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup154], (instregex "RCL(16|32|64)rCL",
13350b57cec5SDimitry Andric                                              "RCR(16|32|64)rCL")>;
13360b57cec5SDimitry Andric
13370b57cec5SDimitry Andricdef SKLWriteResGroup155 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort15,SKLPort0156]> {
13380b57cec5SDimitry Andric  let Latency = 11;
13390b57cec5SDimitry Andric  let NumMicroOps = 9;
13405f757f3fSDimitry Andric  let ReleaseAtCycles = [1,5,1,2];
13410b57cec5SDimitry Andric}
13420b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup155], (instrs RCL8rCL)>;
13430b57cec5SDimitry Andric
13440b57cec5SDimitry Andricdef SKLWriteResGroup156 : SchedWriteRes<[SKLPort06,SKLPort0156]> {
13450b57cec5SDimitry Andric  let Latency = 11;
13460b57cec5SDimitry Andric  let NumMicroOps = 11;
13475f757f3fSDimitry Andric  let ReleaseAtCycles = [2,9];
13480b57cec5SDimitry Andric}
13490b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup156], (instrs LOOPE, LOOPNE)>;
13500b57cec5SDimitry Andric
13510b57cec5SDimitry Andricdef SKLWriteResGroup162 : SchedWriteRes<[SKLPort5,SKLPort23]> {
13520b57cec5SDimitry Andric  let Latency = 13;
13530b57cec5SDimitry Andric  let NumMicroOps = 3;
13545f757f3fSDimitry Andric  let ReleaseAtCycles = [2,1];
13550b57cec5SDimitry Andric}
13560b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup162], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>;
13570b57cec5SDimitry Andric
13580b57cec5SDimitry Andricdef SKLWriteResGroup169 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
13590b57cec5SDimitry Andric  let Latency = 14;
13600b57cec5SDimitry Andric  let NumMicroOps = 3;
13615f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1];
13620b57cec5SDimitry Andric}
13630b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup169], (instregex "MUL_FI(16|32)m")>;
13640b57cec5SDimitry Andric
13650b57cec5SDimitry Andricdef SKLWriteResGroup170 : SchedWriteRes<[SKLPort1,SKLPort06,SKLPort15,SKLPort0156]> {
13660b57cec5SDimitry Andric  let Latency = 14;
13670b57cec5SDimitry Andric  let NumMicroOps = 10;
13685f757f3fSDimitry Andric  let ReleaseAtCycles = [2,4,1,3];
13690b57cec5SDimitry Andric}
13700b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup170], (instrs RCR8rCL)>;
13710b57cec5SDimitry Andric
13720b57cec5SDimitry Andricdef SKLWriteResGroup171 : SchedWriteRes<[SKLPort0]> {
13730b57cec5SDimitry Andric  let Latency = 15;
13740b57cec5SDimitry Andric  let NumMicroOps = 1;
13755f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
13760b57cec5SDimitry Andric}
13770b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup171], (instregex "DIVR_(FPrST0|FST0r|FrST0)")>;
13780b57cec5SDimitry Andric
13790b57cec5SDimitry Andricdef SKLWriteResGroup174 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort06,SKLPort15,SKLPort0156]> {
13800b57cec5SDimitry Andric  let Latency = 15;
13810b57cec5SDimitry Andric  let NumMicroOps = 10;
13825f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1,5,1,1];
13830b57cec5SDimitry Andric}
13840b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup174], (instregex "RCL(8|16|32|64)mCL")>;
13850b57cec5SDimitry Andric
13860b57cec5SDimitry Andricdef SKLWriteResGroup177 : SchedWriteRes<[SKLPort4,SKLPort23,SKLPort237,SKLPort06,SKLPort15,SKLPort0156]> {
13870b57cec5SDimitry Andric  let Latency = 16;
13880b57cec5SDimitry Andric  let NumMicroOps = 14;
13895f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1,4,2,5];
13900b57cec5SDimitry Andric}
13910b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup177], (instrs CMPXCHG8B)>;
13920b57cec5SDimitry Andric
13930b57cec5SDimitry Andricdef SKLWriteResGroup178 : SchedWriteRes<[SKLPort0156]> {
13940b57cec5SDimitry Andric  let Latency = 16;
13950b57cec5SDimitry Andric  let NumMicroOps = 16;
13965f757f3fSDimitry Andric  let ReleaseAtCycles = [16];
13970b57cec5SDimitry Andric}
13980b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup178], (instrs VZEROALL)>;
13990b57cec5SDimitry Andric
14000b57cec5SDimitry Andricdef SKLWriteResGroup180 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort5,SKLPort6,SKLPort05,SKLPort0156]> {
14010b57cec5SDimitry Andric  let Latency = 17;
14020b57cec5SDimitry Andric  let NumMicroOps = 15;
14035f757f3fSDimitry Andric  let ReleaseAtCycles = [2,1,2,4,2,4];
14040b57cec5SDimitry Andric}
14050b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup180], (instrs XCH_F)>;
14060b57cec5SDimitry Andric
14070b57cec5SDimitry Andricdef SKLWriteResGroup184 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort06,SKLPort0156]> {
14080b57cec5SDimitry Andric  let Latency = 18;
14090b57cec5SDimitry Andric  let NumMicroOps = 8;
14105f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1,5];
14110b57cec5SDimitry Andric}
14120b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup184], (instrs CPUID, RDTSC)>;
14130b57cec5SDimitry Andric
14140b57cec5SDimitry Andricdef SKLWriteResGroup185 : SchedWriteRes<[SKLPort1,SKLPort23,SKLPort237,SKLPort06,SKLPort15,SKLPort0156]> {
14150b57cec5SDimitry Andric  let Latency = 18;
14160b57cec5SDimitry Andric  let NumMicroOps = 11;
14175f757f3fSDimitry Andric  let ReleaseAtCycles = [2,1,1,4,1,2];
14180b57cec5SDimitry Andric}
14190b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup185], (instregex "RCR(8|16|32|64)mCL")>;
14200b57cec5SDimitry Andric
14210b57cec5SDimitry Andricdef SKLWriteResGroup189 : SchedWriteRes<[SKLPort0]> {
14220b57cec5SDimitry Andric  let Latency = 20;
14230b57cec5SDimitry Andric  let NumMicroOps = 1;
14245f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
14250b57cec5SDimitry Andric}
14260b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup189], (instregex "DIV_(FPrST0|FST0r|FrST0)")>;
14270b57cec5SDimitry Andric
14280b57cec5SDimitry Andricdef SKLWriteResGroup192 : SchedWriteRes<[SKLPort4,SKLPort5,SKLPort6,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
14290b57cec5SDimitry Andric  let Latency = 20;
14300b57cec5SDimitry Andric  let NumMicroOps = 8;
14315f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1,1,1,1,2];
14320b57cec5SDimitry Andric}
14330b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup192], (instrs INSB, INSL, INSW)>;
14340b57cec5SDimitry Andric
14350b57cec5SDimitry Andricdef SKLWriteResGroup193 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort0156]> {
14360b57cec5SDimitry Andric  let Latency = 20;
14370b57cec5SDimitry Andric  let NumMicroOps = 10;
14385f757f3fSDimitry Andric  let ReleaseAtCycles = [1,2,7];
14390b57cec5SDimitry Andric}
14400b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup193], (instrs MWAITrr)>;
14410b57cec5SDimitry Andric
14420b57cec5SDimitry Andricdef SKLWriteResGroup196 : SchedWriteRes<[SKLPort0,SKLPort23]> {
14430b57cec5SDimitry Andric  let Latency = 22;
14440b57cec5SDimitry Andric  let NumMicroOps = 2;
14455f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
14460b57cec5SDimitry Andric}
14470b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup196], (instregex "DIV_F(32|64)m")>;
14480b57cec5SDimitry Andric
14495ffd83dbSDimitry Andricdef SKLWriteResGroupVEX2 : SchedWriteRes<[SKLPort0, SKLPort23, SKLPort5, SKLPort015]> {
14505ffd83dbSDimitry Andric  let Latency = 18;
14515ffd83dbSDimitry Andric  let NumMicroOps = 5; // 2 uops perform multiple loads
14525f757f3fSDimitry Andric  let ReleaseAtCycles = [1,2,1,1];
14530b57cec5SDimitry Andric}
14545ffd83dbSDimitry Andricdef: InstRW<[SKLWriteResGroupVEX2], (instrs VGATHERDPDrm, VPGATHERDQrm,
14555ffd83dbSDimitry Andric                                            VGATHERQPDrm, VPGATHERQQrm,
14565ffd83dbSDimitry Andric                                            VGATHERQPSrm, VPGATHERQDrm)>;
14570b57cec5SDimitry Andric
14585ffd83dbSDimitry Andricdef SKLWriteResGroupVEX4 : SchedWriteRes<[SKLPort0, SKLPort23, SKLPort5, SKLPort015]> {
14595ffd83dbSDimitry Andric  let Latency = 20;
14605ffd83dbSDimitry Andric  let NumMicroOps = 5; // 2 uops peform multiple loads
14615f757f3fSDimitry Andric  let ReleaseAtCycles = [1,4,1,1];
14620b57cec5SDimitry Andric}
14635ffd83dbSDimitry Andricdef: InstRW<[SKLWriteResGroupVEX4], (instrs VGATHERDPDYrm, VPGATHERDQYrm,
14645ffd83dbSDimitry Andric                                            VGATHERDPSrm,  VPGATHERDDrm,
14655ffd83dbSDimitry Andric                                            VGATHERQPDYrm, VPGATHERQQYrm,
14665ffd83dbSDimitry Andric                                            VGATHERQPSYrm,  VPGATHERQDYrm)>;
14675ffd83dbSDimitry Andric
14685ffd83dbSDimitry Andricdef SKLWriteResGroupVEX8 : SchedWriteRes<[SKLPort0, SKLPort23, SKLPort5, SKLPort015]> {
14695ffd83dbSDimitry Andric  let Latency = 22;
14705ffd83dbSDimitry Andric  let NumMicroOps = 5; // 2 uops perform multiple loads
14715f757f3fSDimitry Andric  let ReleaseAtCycles = [1,8,1,1];
14725ffd83dbSDimitry Andric}
14735ffd83dbSDimitry Andricdef: InstRW<[SKLWriteResGroupVEX8], (instrs VGATHERDPSYrm,  VPGATHERDDYrm)>;
14740b57cec5SDimitry Andric
14750b57cec5SDimitry Andricdef SKLWriteResGroup198 : SchedWriteRes<[SKLPort0,SKLPort4,SKLPort5,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
14760b57cec5SDimitry Andric  let Latency = 23;
14770b57cec5SDimitry Andric  let NumMicroOps = 19;
14785f757f3fSDimitry Andric  let ReleaseAtCycles = [2,1,4,1,1,4,6];
14790b57cec5SDimitry Andric}
14800b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup198], (instrs CMPXCHG16B)>;
14810b57cec5SDimitry Andric
14820b57cec5SDimitry Andricdef SKLWriteResGroup202 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
14830b57cec5SDimitry Andric  let Latency = 25;
14840b57cec5SDimitry Andric  let NumMicroOps = 3;
14855f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1];
14860b57cec5SDimitry Andric}
14870b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup202], (instregex "DIV_FI(16|32)m")>;
14880b57cec5SDimitry Andric
14890b57cec5SDimitry Andricdef SKLWriteResGroup206 : SchedWriteRes<[SKLPort0,SKLPort23]> {
14900b57cec5SDimitry Andric  let Latency = 27;
14910b57cec5SDimitry Andric  let NumMicroOps = 2;
14925f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1];
14930b57cec5SDimitry Andric}
14940b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup206], (instregex "DIVR_F(32|64)m")>;
14950b57cec5SDimitry Andric
14960b57cec5SDimitry Andricdef SKLWriteResGroup208 : SchedWriteRes<[SKLPort0,SKLPort5,SKLPort23]> {
14970b57cec5SDimitry Andric  let Latency = 30;
14980b57cec5SDimitry Andric  let NumMicroOps = 3;
14995f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,1];
15000b57cec5SDimitry Andric}
15010b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup208], (instregex "DIVR_FI(16|32)m")>;
15020b57cec5SDimitry Andric
15030b57cec5SDimitry Andricdef SKLWriteResGroup209 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort23,SKLPort06,SKLPort0156]> {
15040b57cec5SDimitry Andric  let Latency = 35;
15050b57cec5SDimitry Andric  let NumMicroOps = 23;
15065f757f3fSDimitry Andric  let ReleaseAtCycles = [1,5,3,4,10];
15070b57cec5SDimitry Andric}
15080b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup209], (instregex "IN(8|16|32)ri",
15090b57cec5SDimitry Andric                                              "IN(8|16|32)rr")>;
15100b57cec5SDimitry Andric
15110b57cec5SDimitry Andricdef SKLWriteResGroup210 : SchedWriteRes<[SKLPort5,SKLPort6,SKLPort23,SKLPort237,SKLPort06,SKLPort0156]> {
15120b57cec5SDimitry Andric  let Latency = 35;
15130b57cec5SDimitry Andric  let NumMicroOps = 23;
15145f757f3fSDimitry Andric  let ReleaseAtCycles = [1,5,2,1,4,10];
15150b57cec5SDimitry Andric}
15160b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup210], (instregex "OUT(8|16|32)ir",
15170b57cec5SDimitry Andric                                              "OUT(8|16|32)rr")>;
15180b57cec5SDimitry Andric
15190b57cec5SDimitry Andricdef SKLWriteResGroup211 : SchedWriteRes<[SKLPort1,SKLPort6,SKLPort23,SKLPort0156]> {
15200b57cec5SDimitry Andric  let Latency = 37;
15210b57cec5SDimitry Andric  let NumMicroOps = 31;
15225f757f3fSDimitry Andric  let ReleaseAtCycles = [1,8,1,21];
15230b57cec5SDimitry Andric}
15240b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup211], (instregex "XRSTOR(64)?")>;
15250b57cec5SDimitry Andric
15260b57cec5SDimitry Andricdef SKLWriteResGroup212 : SchedWriteRes<[SKLPort1,SKLPort4,SKLPort5,SKLPort6,SKLPort23,SKLPort237,SKLPort15,SKLPort0156]> {
15270b57cec5SDimitry Andric  let Latency = 40;
15280b57cec5SDimitry Andric  let NumMicroOps = 18;
15295f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,2,3,1,1,1,8];
15300b57cec5SDimitry Andric}
15310b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup212], (instrs VMCLEARm)>;
15320b57cec5SDimitry Andric
15330b57cec5SDimitry Andricdef SKLWriteResGroup213 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
15340b57cec5SDimitry Andric  let Latency = 41;
15350b57cec5SDimitry Andric  let NumMicroOps = 39;
15365f757f3fSDimitry Andric  let ReleaseAtCycles = [1,10,1,1,26];
15370b57cec5SDimitry Andric}
15380b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup213], (instrs XSAVE64)>;
15390b57cec5SDimitry Andric
15400b57cec5SDimitry Andricdef SKLWriteResGroup214 : SchedWriteRes<[SKLPort5,SKLPort0156]> {
15410b57cec5SDimitry Andric  let Latency = 42;
15420b57cec5SDimitry Andric  let NumMicroOps = 22;
15435f757f3fSDimitry Andric  let ReleaseAtCycles = [2,20];
15440b57cec5SDimitry Andric}
15450b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup214], (instrs RDTSCP)>;
15460b57cec5SDimitry Andric
15470b57cec5SDimitry Andricdef SKLWriteResGroup215 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
15480b57cec5SDimitry Andric  let Latency = 42;
15490b57cec5SDimitry Andric  let NumMicroOps = 40;
15505f757f3fSDimitry Andric  let ReleaseAtCycles = [1,11,1,1,26];
15510b57cec5SDimitry Andric}
15520b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup215], (instrs XSAVE)>;
15530b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup215], (instregex "XSAVEC", "XSAVES")>;
15540b57cec5SDimitry Andric
15550b57cec5SDimitry Andricdef SKLWriteResGroup216 : SchedWriteRes<[SKLPort4,SKLPort6,SKLPort23,SKLPort237,SKLPort0156]> {
15560b57cec5SDimitry Andric  let Latency = 46;
15570b57cec5SDimitry Andric  let NumMicroOps = 44;
15585f757f3fSDimitry Andric  let ReleaseAtCycles = [1,11,1,1,30];
15590b57cec5SDimitry Andric}
15600b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup216], (instregex "XSAVEOPT")>;
15610b57cec5SDimitry Andric
15620b57cec5SDimitry Andricdef SKLWriteResGroup217 : SchedWriteRes<[SKLPort0,SKLPort23,SKLPort05,SKLPort06,SKLPort0156]> {
15630b57cec5SDimitry Andric  let Latency = 62;
15640b57cec5SDimitry Andric  let NumMicroOps = 64;
15655f757f3fSDimitry Andric  let ReleaseAtCycles = [2,8,5,10,39];
15660b57cec5SDimitry Andric}
15670b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup217], (instrs FLDENVm)>;
15680b57cec5SDimitry Andric
15690b57cec5SDimitry Andricdef SKLWriteResGroup218 : SchedWriteRes<[SKLPort0,SKLPort6,SKLPort23,SKLPort05,SKLPort06,SKLPort15,SKLPort0156]> {
15700b57cec5SDimitry Andric  let Latency = 63;
15710b57cec5SDimitry Andric  let NumMicroOps = 88;
15725f757f3fSDimitry Andric  let ReleaseAtCycles = [4,4,31,1,2,1,45];
15730b57cec5SDimitry Andric}
15740b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup218], (instrs FXRSTOR64)>;
15750b57cec5SDimitry Andric
15760b57cec5SDimitry Andricdef SKLWriteResGroup219 : SchedWriteRes<[SKLPort0,SKLPort6,SKLPort23,SKLPort05,SKLPort06,SKLPort15,SKLPort0156]> {
15770b57cec5SDimitry Andric  let Latency = 63;
15780b57cec5SDimitry Andric  let NumMicroOps = 90;
15795f757f3fSDimitry Andric  let ReleaseAtCycles = [4,2,33,1,2,1,47];
15800b57cec5SDimitry Andric}
15810b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup219], (instrs FXRSTOR)>;
15820b57cec5SDimitry Andric
15830b57cec5SDimitry Andricdef SKLWriteResGroup220 : SchedWriteRes<[SKLPort5,SKLPort05,SKLPort0156]> {
15840b57cec5SDimitry Andric  let Latency = 75;
15850b57cec5SDimitry Andric  let NumMicroOps = 15;
15865f757f3fSDimitry Andric  let ReleaseAtCycles = [6,3,6];
15870b57cec5SDimitry Andric}
15880b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup220], (instrs FNINIT)>;
15890b57cec5SDimitry Andric
15900b57cec5SDimitry Andricdef SKLWriteResGroup223 : SchedWriteRes<[SKLPort0,SKLPort1,SKLPort4,SKLPort5,SKLPort6,SKLPort237,SKLPort06,SKLPort0156]> {
15910b57cec5SDimitry Andric  let Latency = 106;
15920b57cec5SDimitry Andric  let NumMicroOps = 100;
15935f757f3fSDimitry Andric  let ReleaseAtCycles = [9,1,11,16,1,11,21,30];
15940b57cec5SDimitry Andric}
15950b57cec5SDimitry Andricdef: InstRW<[SKLWriteResGroup223], (instrs FSTENVm)>;
15960b57cec5SDimitry Andric
15970b57cec5SDimitry Andricdef: InstRW<[WriteZero], (instrs CLC)>;
15980b57cec5SDimitry Andric
15990b57cec5SDimitry Andric
16005ffd83dbSDimitry Andric// Instruction variants handled by the renamer. These might not need execution
16010b57cec5SDimitry Andric// ports in certain conditions.
16020b57cec5SDimitry Andric// See Agner's Fog "The microarchitecture of Intel, AMD and VIA CPUs",
16030b57cec5SDimitry Andric// section "Skylake Pipeline" > "Register allocation and renaming".
16040b57cec5SDimitry Andric// These can be investigated with llvm-exegesis, e.g.
16050b57cec5SDimitry Andric// echo 'pxor %mm0, %mm0' | /tmp/llvm-exegesis -mode=uops -snippets-file=-
16060b57cec5SDimitry Andric// echo 'vxorpd %xmm0, %xmm0, %xmm1' | /tmp/llvm-exegesis -mode=uops -snippets-file=-
16070b57cec5SDimitry Andric
16080b57cec5SDimitry Andricdef SKLWriteZeroLatency : SchedWriteRes<[]> {
16090b57cec5SDimitry Andric  let Latency = 0;
16100b57cec5SDimitry Andric}
16110b57cec5SDimitry Andric
16120b57cec5SDimitry Andricdef SKLWriteZeroIdiom : SchedWriteVariant<[
16130b57cec5SDimitry Andric    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKLWriteZeroLatency]>,
16140b57cec5SDimitry Andric    SchedVar<NoSchedPred,                          [WriteALU]>
16150b57cec5SDimitry Andric]>;
16160b57cec5SDimitry Andricdef : InstRW<[SKLWriteZeroIdiom], (instrs SUB32rr, SUB64rr,
16170b57cec5SDimitry Andric                                          XOR32rr, XOR64rr)>;
16180b57cec5SDimitry Andric
16190b57cec5SDimitry Andricdef SKLWriteFZeroIdiom : SchedWriteVariant<[
16200b57cec5SDimitry Andric    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKLWriteZeroLatency]>,
16210b57cec5SDimitry Andric    SchedVar<NoSchedPred,                          [WriteFLogic]>
16220b57cec5SDimitry Andric]>;
16230b57cec5SDimitry Andricdef : InstRW<[SKLWriteFZeroIdiom], (instrs XORPSrr, VXORPSrr, XORPDrr,
16240b57cec5SDimitry Andric                                           VXORPDrr)>;
16250b57cec5SDimitry Andric
16260b57cec5SDimitry Andricdef SKLWriteFZeroIdiomY : SchedWriteVariant<[
16270b57cec5SDimitry Andric    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKLWriteZeroLatency]>,
16280b57cec5SDimitry Andric    SchedVar<NoSchedPred,                          [WriteFLogicY]>
16290b57cec5SDimitry Andric]>;
16300b57cec5SDimitry Andricdef : InstRW<[SKLWriteFZeroIdiomY], (instrs VXORPSYrr, VXORPDYrr)>;
16310b57cec5SDimitry Andric
16320b57cec5SDimitry Andricdef SKLWriteVZeroIdiomLogicX : SchedWriteVariant<[
16330b57cec5SDimitry Andric    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKLWriteZeroLatency]>,
16340b57cec5SDimitry Andric    SchedVar<NoSchedPred,                          [WriteVecLogicX]>
16350b57cec5SDimitry Andric]>;
16360b57cec5SDimitry Andricdef : InstRW<[SKLWriteVZeroIdiomLogicX], (instrs PXORrr, VPXORrr)>;
16370b57cec5SDimitry Andric
16380b57cec5SDimitry Andricdef SKLWriteVZeroIdiomLogicY : SchedWriteVariant<[
16390b57cec5SDimitry Andric    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKLWriteZeroLatency]>,
16400b57cec5SDimitry Andric    SchedVar<NoSchedPred,                          [WriteVecLogicY]>
16410b57cec5SDimitry Andric]>;
16420b57cec5SDimitry Andricdef : InstRW<[SKLWriteVZeroIdiomLogicY], (instrs VPXORYrr)>;
16430b57cec5SDimitry Andric
16440b57cec5SDimitry Andricdef SKLWriteVZeroIdiomALUX : SchedWriteVariant<[
16450b57cec5SDimitry Andric    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKLWriteZeroLatency]>,
16460b57cec5SDimitry Andric    SchedVar<NoSchedPred,                          [WriteVecALUX]>
16470b57cec5SDimitry Andric]>;
16480b57cec5SDimitry Andricdef : InstRW<[SKLWriteVZeroIdiomALUX], (instrs PCMPGTBrr, VPCMPGTBrr,
16490b57cec5SDimitry Andric                                               PCMPGTDrr, VPCMPGTDrr,
16500b57cec5SDimitry Andric                                               PCMPGTWrr, VPCMPGTWrr)>;
16510b57cec5SDimitry Andric
16520b57cec5SDimitry Andricdef SKLWriteVZeroIdiomALUY : SchedWriteVariant<[
16530b57cec5SDimitry Andric    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKLWriteZeroLatency]>,
16540b57cec5SDimitry Andric    SchedVar<NoSchedPred,                          [WriteVecALUY]>
16550b57cec5SDimitry Andric]>;
16560b57cec5SDimitry Andricdef : InstRW<[SKLWriteVZeroIdiomALUY], (instrs VPCMPGTBYrr,
16570b57cec5SDimitry Andric                                               VPCMPGTDYrr,
16580b57cec5SDimitry Andric                                               VPCMPGTWYrr)>;
16590b57cec5SDimitry Andric
16600b57cec5SDimitry Andricdef SKLWritePSUB : SchedWriteRes<[SKLPort015]> {
16610b57cec5SDimitry Andric  let Latency = 1;
16620b57cec5SDimitry Andric  let NumMicroOps = 1;
16635f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
16640b57cec5SDimitry Andric}
16650b57cec5SDimitry Andric
16660b57cec5SDimitry Andricdef SKLWriteVZeroIdiomPSUB : SchedWriteVariant<[
16670b57cec5SDimitry Andric    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKLWriteZeroLatency]>,
16680b57cec5SDimitry Andric    SchedVar<NoSchedPred,                          [SKLWritePSUB]>
16690b57cec5SDimitry Andric]>;
16700b57cec5SDimitry Andricdef : InstRW<[SKLWriteVZeroIdiomPSUB], (instrs PSUBBrr, VPSUBBrr,
16710b57cec5SDimitry Andric                                               PSUBDrr, VPSUBDrr,
16720b57cec5SDimitry Andric                                               PSUBQrr, VPSUBQrr,
16730b57cec5SDimitry Andric                                               PSUBWrr, VPSUBWrr,
16740b57cec5SDimitry Andric                                               VPSUBBYrr,
16750b57cec5SDimitry Andric                                               VPSUBDYrr,
16760b57cec5SDimitry Andric                                               VPSUBQYrr,
16770b57cec5SDimitry Andric                                               VPSUBWYrr)>;
16780b57cec5SDimitry Andric
16790b57cec5SDimitry Andricdef SKLWritePCMPGTQ : SchedWriteRes<[SKLPort5]> {
16800b57cec5SDimitry Andric  let Latency = 3;
16810b57cec5SDimitry Andric  let NumMicroOps = 1;
16825f757f3fSDimitry Andric  let ReleaseAtCycles = [1];
16830b57cec5SDimitry Andric}
16840b57cec5SDimitry Andric
16850b57cec5SDimitry Andricdef SKLWriteVZeroIdiomPCMPGTQ : SchedWriteVariant<[
16860b57cec5SDimitry Andric    SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SKLWriteZeroLatency]>,
16870b57cec5SDimitry Andric    SchedVar<NoSchedPred,                          [SKLWritePCMPGTQ]>
16880b57cec5SDimitry Andric]>;
16890b57cec5SDimitry Andricdef : InstRW<[SKLWriteVZeroIdiomPCMPGTQ], (instrs PCMPGTQrr, VPCMPGTQrr,
16900b57cec5SDimitry Andric                                                  VPCMPGTQYrr)>;
16910b57cec5SDimitry Andric
16920b57cec5SDimitry Andric
16930b57cec5SDimitry Andric// CMOVs that use both Z and C flag require an extra uop.
16940b57cec5SDimitry Andricdef SKLWriteCMOVA_CMOVBErr : SchedWriteRes<[SKLPort06]> {
16950b57cec5SDimitry Andric  let Latency = 2;
16965f757f3fSDimitry Andric  let ReleaseAtCycles = [2];
16970b57cec5SDimitry Andric  let NumMicroOps = 2;
16980b57cec5SDimitry Andric}
16990b57cec5SDimitry Andric
17000b57cec5SDimitry Andricdef SKLWriteCMOVA_CMOVBErm : SchedWriteRes<[SKLPort23,SKLPort06]> {
17010b57cec5SDimitry Andric  let Latency = 7;
17025f757f3fSDimitry Andric  let ReleaseAtCycles = [1,2];
17030b57cec5SDimitry Andric  let NumMicroOps = 3;
17040b57cec5SDimitry Andric}
17050b57cec5SDimitry Andric
17060b57cec5SDimitry Andricdef SKLCMOVA_CMOVBErr :  SchedWriteVariant<[
17070b57cec5SDimitry Andric  SchedVar<MCSchedPredicate<IsCMOVArr_Or_CMOVBErr>, [SKLWriteCMOVA_CMOVBErr]>,
17080b57cec5SDimitry Andric  SchedVar<NoSchedPred,                             [WriteCMOV]>
17090b57cec5SDimitry Andric]>;
17100b57cec5SDimitry Andric
17110b57cec5SDimitry Andricdef SKLCMOVA_CMOVBErm :  SchedWriteVariant<[
17120b57cec5SDimitry Andric  SchedVar<MCSchedPredicate<IsCMOVArm_Or_CMOVBErm>, [SKLWriteCMOVA_CMOVBErm]>,
17130b57cec5SDimitry Andric  SchedVar<NoSchedPred,                             [WriteCMOV.Folded]>
17140b57cec5SDimitry Andric]>;
17150b57cec5SDimitry Andric
17160b57cec5SDimitry Andricdef : InstRW<[SKLCMOVA_CMOVBErr], (instrs CMOV16rr, CMOV32rr, CMOV64rr)>;
17170b57cec5SDimitry Andricdef : InstRW<[SKLCMOVA_CMOVBErm], (instrs CMOV16rm, CMOV32rm, CMOV64rm)>;
17180b57cec5SDimitry Andric
17190b57cec5SDimitry Andric// SETCCs that use both Z and C flag require an extra uop.
17200b57cec5SDimitry Andricdef SKLWriteSETA_SETBEr : SchedWriteRes<[SKLPort06]> {
17210b57cec5SDimitry Andric  let Latency = 2;
17225f757f3fSDimitry Andric  let ReleaseAtCycles = [2];
17230b57cec5SDimitry Andric  let NumMicroOps = 2;
17240b57cec5SDimitry Andric}
17250b57cec5SDimitry Andric
17260b57cec5SDimitry Andricdef SKLWriteSETA_SETBEm : SchedWriteRes<[SKLPort4,SKLPort237,SKLPort06]> {
17270b57cec5SDimitry Andric  let Latency = 3;
17285f757f3fSDimitry Andric  let ReleaseAtCycles = [1,1,2];
17290b57cec5SDimitry Andric  let NumMicroOps = 4;
17300b57cec5SDimitry Andric}
17310b57cec5SDimitry Andric
17320b57cec5SDimitry Andricdef SKLSETA_SETBErr :  SchedWriteVariant<[
17330b57cec5SDimitry Andric  SchedVar<MCSchedPredicate<IsSETAr_Or_SETBEr>, [SKLWriteSETA_SETBEr]>,
17340b57cec5SDimitry Andric  SchedVar<NoSchedPred,                         [WriteSETCC]>
17350b57cec5SDimitry Andric]>;
17360b57cec5SDimitry Andric
17370b57cec5SDimitry Andricdef SKLSETA_SETBErm :  SchedWriteVariant<[
17380b57cec5SDimitry Andric  SchedVar<MCSchedPredicate<IsSETAm_Or_SETBEm>, [SKLWriteSETA_SETBEm]>,
17390b57cec5SDimitry Andric  SchedVar<NoSchedPred,                         [WriteSETCCStore]>
17400b57cec5SDimitry Andric]>;
17410b57cec5SDimitry Andric
17420b57cec5SDimitry Andricdef : InstRW<[SKLSETA_SETBErr], (instrs SETCCr)>;
17430b57cec5SDimitry Andricdef : InstRW<[SKLSETA_SETBErm], (instrs SETCCm)>;
17440b57cec5SDimitry Andric
174504eeddc0SDimitry Andric///////////////////////////////////////////////////////////////////////////////
174604eeddc0SDimitry Andric// Dependency breaking instructions.
174704eeddc0SDimitry Andric///////////////////////////////////////////////////////////////////////////////
174804eeddc0SDimitry Andric
174904eeddc0SDimitry Andricdef : IsZeroIdiomFunction<[
175004eeddc0SDimitry Andric  // GPR Zero-idioms.
175104eeddc0SDimitry Andric  DepBreakingClass<[ SUB32rr, SUB64rr, XOR32rr, XOR64rr ], ZeroIdiomPredicate>,
175204eeddc0SDimitry Andric
175304eeddc0SDimitry Andric  // SSE Zero-idioms.
175404eeddc0SDimitry Andric  DepBreakingClass<[
175504eeddc0SDimitry Andric    // fp variants.
175604eeddc0SDimitry Andric    XORPSrr, XORPDrr,
175704eeddc0SDimitry Andric
175804eeddc0SDimitry Andric    // int variants.
175904eeddc0SDimitry Andric    PXORrr,
176004eeddc0SDimitry Andric    PSUBBrr, PSUBWrr, PSUBDrr, PSUBQrr,
176104eeddc0SDimitry Andric    PCMPGTBrr, PCMPGTDrr, PCMPGTQrr, PCMPGTWrr
176204eeddc0SDimitry Andric  ], ZeroIdiomPredicate>,
176304eeddc0SDimitry Andric
176404eeddc0SDimitry Andric  // AVX Zero-idioms.
176504eeddc0SDimitry Andric  DepBreakingClass<[
176604eeddc0SDimitry Andric    // xmm fp variants.
176704eeddc0SDimitry Andric    VXORPSrr, VXORPDrr,
176804eeddc0SDimitry Andric
176904eeddc0SDimitry Andric    // xmm int variants.
177004eeddc0SDimitry Andric    VPXORrr,
177104eeddc0SDimitry Andric    VPSUBBrr, VPSUBWrr, VPSUBDrr, VPSUBQrr,
177204eeddc0SDimitry Andric    VPCMPGTBrr, VPCMPGTWrr, VPCMPGTDrr, VPCMPGTQrr,
177304eeddc0SDimitry Andric
177404eeddc0SDimitry Andric    // ymm variants.
177504eeddc0SDimitry Andric    VXORPSYrr, VXORPDYrr, VPXORYrr,
177604eeddc0SDimitry Andric    VPSUBBYrr, VPSUBWYrr, VPSUBDYrr, VPSUBQYrr,
177704eeddc0SDimitry Andric    VPCMPGTBYrr, VPCMPGTWYrr, VPCMPGTDYrr, VPCMPGTQYrr
177804eeddc0SDimitry Andric  ], ZeroIdiomPredicate>,
177904eeddc0SDimitry Andric]>;
178004eeddc0SDimitry Andric
17810b57cec5SDimitry Andric} // SchedModel
1782