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