10b57cec5SDimitry Andric//=- X86SchedSandyBridge.td - X86 Sandy Bridge 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 Sandy Bridge to support instruction 100b57cec5SDimitry Andric// scheduling and other instruction cost heuristics. 110b57cec5SDimitry Andric// 120b57cec5SDimitry Andric// Note that we define some instructions here that are not supported by SNB, 130b57cec5SDimitry Andric// but we still have to define them because SNB is the default subtarget for 140b57cec5SDimitry Andric// X86. These instructions are tagged with a comment `Unsupported = 1`. 150b57cec5SDimitry Andric// 160b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 170b57cec5SDimitry Andric 180b57cec5SDimitry Andricdef SandyBridgeModel : SchedMachineModel { 190b57cec5SDimitry Andric // All x86 instructions are modeled as a single micro-op, and SB can decode 4 200b57cec5SDimitry Andric // instructions per cycle. 210b57cec5SDimitry Andric // FIXME: Identify instructions that aren't a single fused micro-op. 220b57cec5SDimitry Andric let IssueWidth = 4; 230b57cec5SDimitry Andric let MicroOpBufferSize = 168; // Based on the reorder buffer. 240b57cec5SDimitry Andric let LoadLatency = 5; 250b57cec5SDimitry Andric let MispredictPenalty = 16; 260b57cec5SDimitry Andric 270b57cec5SDimitry Andric // Based on the LSD (loop-stream detector) queue size. 280b57cec5SDimitry Andric let LoopMicroOpBufferSize = 28; 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric // This flag is set to allow the scheduler to assign 310b57cec5SDimitry Andric // a default model to unrecognized opcodes. 320b57cec5SDimitry Andric let CompleteModel = 0; 330b57cec5SDimitry Andric} 340b57cec5SDimitry Andric 350b57cec5SDimitry Andriclet SchedModel = SandyBridgeModel in { 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric// Sandy Bridge can issue micro-ops to 6 different ports in one cycle. 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric// Ports 0, 1, and 5 handle all computation. 400b57cec5SDimitry Andricdef SBPort0 : ProcResource<1>; 410b57cec5SDimitry Andricdef SBPort1 : ProcResource<1>; 420b57cec5SDimitry Andricdef SBPort5 : ProcResource<1>; 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric// Ports 2 and 3 are identical. They handle loads and the address half of 450b57cec5SDimitry Andric// stores. 460b57cec5SDimitry Andricdef SBPort23 : ProcResource<2>; 470b57cec5SDimitry Andric 480b57cec5SDimitry Andric// Port 4 gets the data half of stores. Store data can be available later than 490b57cec5SDimitry Andric// the store address, but since we don't model the latency of stores, we can 500b57cec5SDimitry Andric// ignore that. 510b57cec5SDimitry Andricdef SBPort4 : ProcResource<1>; 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric// Many micro-ops are capable of issuing on multiple ports. 540b57cec5SDimitry Andricdef SBPort01 : ProcResGroup<[SBPort0, SBPort1]>; 550b57cec5SDimitry Andricdef SBPort05 : ProcResGroup<[SBPort0, SBPort5]>; 560b57cec5SDimitry Andricdef SBPort15 : ProcResGroup<[SBPort1, SBPort5]>; 570b57cec5SDimitry Andricdef SBPort015 : ProcResGroup<[SBPort0, SBPort1, SBPort5]>; 580b57cec5SDimitry Andric 590b57cec5SDimitry Andric// 54 Entry Unified Scheduler 600b57cec5SDimitry Andricdef SBPortAny : ProcResGroup<[SBPort0, SBPort1, SBPort23, SBPort4, SBPort5]> { 610b57cec5SDimitry Andric let BufferSize=54; 620b57cec5SDimitry Andric} 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric// Integer division issued on port 0. 650b57cec5SDimitry Andricdef SBDivider : ProcResource<1>; 660b57cec5SDimitry Andric// FP division and sqrt on port 0. 670b57cec5SDimitry Andricdef SBFPDivider : ProcResource<1>; 680b57cec5SDimitry Andric 690b57cec5SDimitry Andric// Integer loads are 5 cycles, so ReadAfterLd registers needn't be available until 5 700b57cec5SDimitry Andric// cycles after the memory operand. 710b57cec5SDimitry Andricdef : ReadAdvance<ReadAfterLd, 5>; 720b57cec5SDimitry Andric 730b57cec5SDimitry Andric// Vector loads are 5/6/7 cycles, so ReadAfterVec*Ld registers needn't be available 740b57cec5SDimitry Andric// until 5/6/7 cycles after the memory operand. 750b57cec5SDimitry Andricdef : ReadAdvance<ReadAfterVecLd, 5>; 760b57cec5SDimitry Andricdef : ReadAdvance<ReadAfterVecXLd, 6>; 770b57cec5SDimitry Andricdef : ReadAdvance<ReadAfterVecYLd, 7>; 780b57cec5SDimitry Andric 790b57cec5SDimitry Andricdef : ReadAdvance<ReadInt2Fpu, 0>; 800b57cec5SDimitry Andric 810b57cec5SDimitry Andric// Many SchedWrites are defined in pairs with and without a folded load. 820b57cec5SDimitry Andric// Instructions with folded loads are usually micro-fused, so they only appear 830b57cec5SDimitry Andric// as two micro-ops when queued in the reservation station. 840b57cec5SDimitry Andric// This multiclass defines the resource usage for variants with and without 850b57cec5SDimitry Andric// folded loads. 860b57cec5SDimitry Andricmulticlass SBWriteResPair<X86FoldableSchedWrite SchedRW, 870b57cec5SDimitry Andric list<ProcResourceKind> ExePorts, 880b57cec5SDimitry Andric int Lat, list<int> Res = [1], int UOps = 1, 89bdd1243dSDimitry Andric int LoadLat = 5, int LoadUOps = 1> { 900b57cec5SDimitry Andric // Register variant is using a single cycle on ExePort. 910b57cec5SDimitry Andric def : WriteRes<SchedRW, ExePorts> { 920b57cec5SDimitry Andric let Latency = Lat; 93*5f757f3fSDimitry Andric let ReleaseAtCycles = Res; 940b57cec5SDimitry Andric let NumMicroOps = UOps; 950b57cec5SDimitry Andric } 960b57cec5SDimitry Andric 970b57cec5SDimitry Andric // Memory variant also uses a cycle on port 2/3 and adds LoadLat cycles to 980b57cec5SDimitry Andric // the latency (default = 5). 990b57cec5SDimitry Andric def : WriteRes<SchedRW.Folded, !listconcat([SBPort23], ExePorts)> { 1000b57cec5SDimitry Andric let Latency = !add(Lat, LoadLat); 101*5f757f3fSDimitry Andric let ReleaseAtCycles = !listconcat([1], Res); 102bdd1243dSDimitry Andric let NumMicroOps = !add(UOps, LoadUOps); 1030b57cec5SDimitry Andric } 1040b57cec5SDimitry Andric} 1050b57cec5SDimitry Andric 1060b57cec5SDimitry Andric// A folded store needs a cycle on port 4 for the store data, and an extra port 1070b57cec5SDimitry Andric// 2/3 cycle to recompute the address. 1080b57cec5SDimitry Andricdef : WriteRes<WriteRMW, [SBPort23,SBPort4]>; 1090b57cec5SDimitry Andric 1100b57cec5SDimitry Andricdef : WriteRes<WriteStore, [SBPort23, SBPort4]>; 1110b57cec5SDimitry Andricdef : WriteRes<WriteStoreNT, [SBPort23, SBPort4]>; 1120b57cec5SDimitry Andricdef : WriteRes<WriteLoad, [SBPort23]> { let Latency = 5; } 1130b57cec5SDimitry Andricdef : WriteRes<WriteMove, [SBPort015]>; 11481ad6265SDimitry Andric 11581ad6265SDimitry Andric// Treat misc copies as a move. 11681ad6265SDimitry Andricdef : InstRW<[WriteMove], (instrs COPY)>; 11781ad6265SDimitry Andric 11881ad6265SDimitry Andric// Idioms that clear a register, like xorps %xmm0, %xmm0. 11981ad6265SDimitry Andric// These can often bypass execution ports completely. 1200b57cec5SDimitry Andricdef : WriteRes<WriteZero, []>; 12181ad6265SDimitry Andric 12281ad6265SDimitry Andric// Model the effect of clobbering the read-write mask operand of the GATHER operation. 12381ad6265SDimitry Andric// Does not cost anything by itself, only has latency, matching that of the WriteLoad, 12481ad6265SDimitry Andricdefm : X86WriteRes<WriteVecMaskedGatherWriteback, [], 5, [], 0>; 1250b57cec5SDimitry Andric 1260b57cec5SDimitry Andric// Arithmetic. 1270b57cec5SDimitry Andricdefm : SBWriteResPair<WriteALU, [SBPort015], 1>; 1280b57cec5SDimitry Andricdefm : SBWriteResPair<WriteADC, [SBPort05,SBPort015], 2, [1,1], 2>; 1290b57cec5SDimitry Andric 1300b57cec5SDimitry Andricdefm : SBWriteResPair<WriteIMul8, [SBPort1], 3>; 1310b57cec5SDimitry Andricdefm : SBWriteResPair<WriteIMul16, [SBPort1,SBPort05,SBPort015], 4, [1,1,2], 4>; 1320b57cec5SDimitry Andricdefm : X86WriteRes<WriteIMul16Imm, [SBPort1,SBPort015], 4, [1,1], 2>; 1330b57cec5SDimitry Andricdefm : X86WriteRes<WriteIMul16ImmLd, [SBPort1,SBPort015,SBPort23], 8, [1,1,1], 3>; 1340b57cec5SDimitry Andricdefm : SBWriteResPair<WriteIMul16Reg, [SBPort1], 3>; 1350b57cec5SDimitry Andricdefm : SBWriteResPair<WriteIMul32, [SBPort1,SBPort05,SBPort015], 4, [1,1,1], 3>; 136349cc55cSDimitry Andricdefm : SBWriteResPair<WriteMULX32, [SBPort1,SBPort05,SBPort015], 3, [1,1,1], 3>; 1370b57cec5SDimitry Andricdefm : SBWriteResPair<WriteIMul32Imm, [SBPort1], 3>; 1380b57cec5SDimitry Andricdefm : SBWriteResPair<WriteIMul32Reg, [SBPort1], 3>; 1390b57cec5SDimitry Andricdefm : SBWriteResPair<WriteIMul64, [SBPort1,SBPort0], 4, [1,1], 2>; 140349cc55cSDimitry Andricdefm : SBWriteResPair<WriteMULX64, [SBPort1,SBPort0], 3, [1,1], 2>; 1410b57cec5SDimitry Andricdefm : SBWriteResPair<WriteIMul64Imm, [SBPort1], 3>; 1420b57cec5SDimitry Andricdefm : SBWriteResPair<WriteIMul64Reg, [SBPort1], 3>; 143349cc55cSDimitry Andricdef SBWriteIMulH : WriteRes<WriteIMulH, []> { let Latency = 4; } 144349cc55cSDimitry Andricdef : WriteRes<WriteIMulHLd, []> { 145349cc55cSDimitry Andric let Latency = !add(SBWriteIMulH.Latency, SandyBridgeModel.LoadLatency); 146349cc55cSDimitry Andric} 1470b57cec5SDimitry Andric 1480b57cec5SDimitry Andricdefm : X86WriteRes<WriteXCHG, [SBPort015], 2, [3], 3>; 1490b57cec5SDimitry Andricdefm : X86WriteRes<WriteBSWAP32, [SBPort1], 1, [1], 1>; 1500b57cec5SDimitry Andricdefm : X86WriteRes<WriteBSWAP64, [SBPort1, SBPort05], 2, [1,1], 2>; 1510b57cec5SDimitry Andricdefm : X86WriteRes<WriteCMPXCHG, [SBPort05, SBPort015], 5, [1,3], 4>; 1520b57cec5SDimitry Andricdefm : X86WriteRes<WriteCMPXCHGRMW,[SBPort015, SBPort5, SBPort23, SBPort4], 8, [1, 2, 2, 1], 6>; 1530b57cec5SDimitry Andric 1540b57cec5SDimitry Andricdefm : SBWriteResPair<WriteDiv8, [SBPort0, SBDivider], 25, [1, 10]>; 1550b57cec5SDimitry Andricdefm : SBWriteResPair<WriteDiv16, [SBPort0, SBDivider], 25, [1, 10]>; 1560b57cec5SDimitry Andricdefm : SBWriteResPair<WriteDiv32, [SBPort0, SBDivider], 25, [1, 10]>; 1570b57cec5SDimitry Andricdefm : SBWriteResPair<WriteDiv64, [SBPort0, SBDivider], 25, [1, 10]>; 1580b57cec5SDimitry Andricdefm : SBWriteResPair<WriteIDiv8, [SBPort0, SBDivider], 25, [1, 10]>; 1590b57cec5SDimitry Andricdefm : SBWriteResPair<WriteIDiv16, [SBPort0, SBDivider], 25, [1, 10]>; 1600b57cec5SDimitry Andricdefm : SBWriteResPair<WriteIDiv32, [SBPort0, SBDivider], 25, [1, 10]>; 1610b57cec5SDimitry Andricdefm : SBWriteResPair<WriteIDiv64, [SBPort0, SBDivider], 25, [1, 10]>; 1620b57cec5SDimitry Andric 1630b57cec5SDimitry Andric// SHLD/SHRD. 1640b57cec5SDimitry Andricdefm : X86WriteRes<WriteSHDrri, [SBPort05, SBPort015], 2, [1, 1], 2>; 1650b57cec5SDimitry Andricdefm : X86WriteRes<WriteSHDrrcl,[SBPort05, SBPort015], 4, [3, 1], 4>; 1660b57cec5SDimitry Andricdefm : X86WriteRes<WriteSHDmri, [SBPort4,SBPort23,SBPort05,SBPort015], 8, [1, 2, 1, 1], 5>; 1670b57cec5SDimitry Andricdefm : X86WriteRes<WriteSHDmrcl,[SBPort4,SBPort23,SBPort05,SBPort015], 10, [1, 2, 3, 1], 7>; 1680b57cec5SDimitry Andric 1690b57cec5SDimitry Andricdefm : SBWriteResPair<WriteShift, [SBPort05], 1>; 1700b57cec5SDimitry Andricdefm : SBWriteResPair<WriteShiftCL, [SBPort05], 3, [3], 3>; 1710b57cec5SDimitry Andricdefm : SBWriteResPair<WriteRotate, [SBPort05], 2, [2], 2>; 1720b57cec5SDimitry Andricdefm : SBWriteResPair<WriteRotateCL, [SBPort05], 3, [3], 3>; 1730b57cec5SDimitry Andric 1740b57cec5SDimitry Andricdefm : SBWriteResPair<WriteJump, [SBPort5], 1>; 1750b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCRC32, [SBPort1], 3, [1], 1, 5>; 1760b57cec5SDimitry Andric 1770b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCMOV, [SBPort05,SBPort015], 2, [1,1], 2>; // Conditional move. 1780b57cec5SDimitry Andricdefm : X86WriteRes<WriteFCMOV, [SBPort5,SBPort05], 3, [2,1], 3>; // x87 conditional move. 1790b57cec5SDimitry Andricdef : WriteRes<WriteSETCC, [SBPort05]>; // Setcc. 1800b57cec5SDimitry Andricdef : WriteRes<WriteSETCCStore, [SBPort05,SBPort4,SBPort23]> { 1810b57cec5SDimitry Andric let Latency = 2; 1820b57cec5SDimitry Andric let NumMicroOps = 3; 1830b57cec5SDimitry Andric} 1840b57cec5SDimitry Andric 1850b57cec5SDimitry Andricdefm : X86WriteRes<WriteLAHFSAHF, [SBPort05], 1, [1], 1>; 1860b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTest, [SBPort05], 1, [1], 1>; 1870b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTestImmLd, [SBPort05,SBPort23], 6, [1,1], 2>; 1880b57cec5SDimitry Andric//defm : X86WriteRes<WriteBitTestRegLd, [SBPort05,SBPort23], 6, [1,1], 2>; 1890b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTestSet, [SBPort05], 1, [1], 1>; 1900b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTestSetImmLd, [SBPort05,SBPort23], 6, [1,1], 3>; 1910b57cec5SDimitry Andricdefm : X86WriteRes<WriteBitTestSetRegLd, [SBPort05,SBPort23,SBPort5,SBPort015], 8, [1,1,1,1], 5>; 1920b57cec5SDimitry Andric 1930b57cec5SDimitry Andric// This is for simple LEAs with one or two input operands. 1940b57cec5SDimitry Andric// The complex ones can only execute on port 1, and they require two cycles on 1950b57cec5SDimitry Andric// the port to read all inputs. We don't model that. 1960b57cec5SDimitry Andricdef : WriteRes<WriteLEA, [SBPort01]>; 1970b57cec5SDimitry Andric 1980b57cec5SDimitry Andric// Bit counts. 1990b57cec5SDimitry Andricdefm : SBWriteResPair<WriteBSF, [SBPort1], 3, [1], 1, 5>; 2000b57cec5SDimitry Andricdefm : SBWriteResPair<WriteBSR, [SBPort1], 3, [1], 1, 5>; 2010b57cec5SDimitry Andricdefm : SBWriteResPair<WriteLZCNT, [SBPort1], 3, [1], 1, 5>; 2020b57cec5SDimitry Andricdefm : SBWriteResPair<WriteTZCNT, [SBPort1], 3, [1], 1, 5>; 2030b57cec5SDimitry Andricdefm : SBWriteResPair<WritePOPCNT, [SBPort1], 3, [1], 1, 6>; 2040b57cec5SDimitry Andric 2050b57cec5SDimitry Andric// BMI1 BEXTR/BLS, BMI2 BZHI 2060b57cec5SDimitry Andric// NOTE: These don't exist on Sandy Bridge. Ports are guesses. 2070b57cec5SDimitry Andricdefm : SBWriteResPair<WriteBEXTR, [SBPort05,SBPort1], 2, [1,1], 2>; 2080b57cec5SDimitry Andricdefm : SBWriteResPair<WriteBLS, [SBPort015], 1>; 2090b57cec5SDimitry Andricdefm : SBWriteResPair<WriteBZHI, [SBPort1], 1>; 2100b57cec5SDimitry Andric 2110b57cec5SDimitry Andric// Scalar and vector floating point. 2120b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLD0, [SBPort5], 1, [1], 1>; 2130b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLD1, [SBPort0,SBPort5], 1, [1,1], 2>; 2140b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLDC, [SBPort0,SBPort1], 1, [1,1], 2>; 2150b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLoad, [SBPort23], 5, [1], 1>; 2160b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLoadX, [SBPort23], 6, [1], 1>; 2170b57cec5SDimitry Andricdefm : X86WriteRes<WriteFLoadY, [SBPort23], 7, [1], 1>; 2180b57cec5SDimitry Andricdefm : X86WriteRes<WriteFMaskedLoad, [SBPort23,SBPort05], 8, [1,2], 3>; 2190b57cec5SDimitry Andricdefm : X86WriteRes<WriteFMaskedLoadY, [SBPort23,SBPort05], 9, [1,2], 3>; 2200b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStore, [SBPort23,SBPort4], 1, [1,1], 1>; 2210b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStoreX, [SBPort23,SBPort4], 1, [1,1], 1>; 2220b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStoreY, [SBPort23,SBPort4], 1, [1,1], 1>; 2230b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStoreNT, [SBPort23,SBPort4], 1, [1,1], 1>; 2240b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStoreNTX, [SBPort23,SBPort4], 1, [1,1], 1>; 2250b57cec5SDimitry Andricdefm : X86WriteRes<WriteFStoreNTY, [SBPort23,SBPort4], 1, [1,1], 1>; 2268bcb0991SDimitry Andric 227*5f757f3fSDimitry Andricdefm : X86WriteRes<WriteFMaskedStore32, [SBPort4,SBPort01,SBPort23], 5, [1,2,1], 4>; 228*5f757f3fSDimitry Andricdefm : X86WriteRes<WriteFMaskedStore32Y, [SBPort4,SBPort01,SBPort23], 5, [1,2,1], 4>; 229*5f757f3fSDimitry Andricdefm : X86WriteRes<WriteFMaskedStore64, [SBPort4,SBPort01,SBPort23], 5, [1,2,1], 4>; 230*5f757f3fSDimitry Andricdefm : X86WriteRes<WriteFMaskedStore64Y, [SBPort4,SBPort01,SBPort23], 5, [1,2,1], 4>; 2318bcb0991SDimitry Andric 2320b57cec5SDimitry Andricdefm : X86WriteRes<WriteFMove, [SBPort5], 1, [1], 1>; 2330b57cec5SDimitry Andricdefm : X86WriteRes<WriteFMoveX, [SBPort5], 1, [1], 1>; 2340b57cec5SDimitry Andricdefm : X86WriteRes<WriteFMoveY, [SBPort5], 1, [1], 1>; 23504eeddc0SDimitry Andricdefm : X86WriteRes<WriteFMoveZ, [SBPort5], 1, [1], 1>; 2360b57cec5SDimitry Andricdefm : X86WriteRes<WriteEMMS, [SBPort015], 31, [31], 31>; 2370b57cec5SDimitry Andric 2380b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFAdd, [SBPort1], 3, [1], 1, 6>; 2390b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFAddX, [SBPort1], 3, [1], 1, 6>; 2400b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFAddY, [SBPort1], 3, [1], 1, 7>; 2410b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFAddZ, [SBPort1], 3, [1], 1, 7>; // Unsupported = 1 2420b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFAdd64, [SBPort1], 3, [1], 1, 6>; 2430b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFAdd64X, [SBPort1], 3, [1], 1, 6>; 2440b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFAdd64Y, [SBPort1], 3, [1], 1, 7>; 2450b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFAdd64Z, [SBPort1], 3, [1], 1, 7>; // Unsupported = 1 2460b57cec5SDimitry Andric 2470b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFCmp, [SBPort1], 3, [1], 1, 6>; 2480b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFCmpX, [SBPort1], 3, [1], 1, 6>; 2490b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFCmpY, [SBPort1], 3, [1], 1, 7>; 2500b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFCmpZ, [SBPort1], 3, [1], 1, 7>; // Unsupported = 1 2510b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFCmp64, [SBPort1], 3, [1], 1, 6>; 2520b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFCmp64X, [SBPort1], 3, [1], 1, 6>; 2530b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFCmp64Y, [SBPort1], 3, [1], 1, 7>; 2540b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFCmp64Z, [SBPort1], 3, [1], 1, 7>; // Unsupported = 1 2550b57cec5SDimitry Andric 2560b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFCom, [SBPort1], 3>; 2575ffd83dbSDimitry Andricdefm : SBWriteResPair<WriteFComX, [SBPort1], 3>; 2580b57cec5SDimitry Andric 2590b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFMul, [SBPort0], 5, [1], 1, 6>; 2600b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFMulX, [SBPort0], 5, [1], 1, 6>; 2610b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFMulY, [SBPort0], 5, [1], 1, 7>; 2620b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFMulZ, [SBPort0], 5, [1], 1, 7>; // Unsupported = 1 2630b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFMul64, [SBPort0], 5, [1], 1, 6>; 2640b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFMul64X, [SBPort0], 5, [1], 1, 6>; 2650b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFMul64Y, [SBPort0], 5, [1], 1, 7>; 2660b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFMul64Z, [SBPort0], 5, [1], 1, 7>; // Unsupported = 1 2670b57cec5SDimitry Andric 2680b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFDiv, [SBPort0,SBFPDivider], 14, [1,14], 1, 6>; 2690b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFDivX, [SBPort0,SBFPDivider], 14, [1,14], 1, 6>; 2700b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFDivY, [SBPort0,SBPort05,SBFPDivider], 29, [2,1,28], 3, 7>; 2710b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFDivZ, [SBPort0,SBPort05,SBFPDivider], 29, [2,1,28], 3, 7>; // Unsupported = 1 2720b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFDiv64, [SBPort0,SBFPDivider], 22, [1,22], 1, 6>; 2730b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFDiv64X, [SBPort0,SBFPDivider], 22, [1,22], 1, 6>; 2740b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFDiv64Y, [SBPort0,SBPort05,SBFPDivider], 45, [2,1,44], 3, 7>; 2750b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFDiv64Z, [SBPort0,SBPort05,SBFPDivider], 45, [2,1,44], 3, 7>; // Unsupported = 1 2760b57cec5SDimitry Andric 2770b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFRcp, [SBPort0], 5, [1], 1, 6>; 2780b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFRcpX, [SBPort0], 5, [1], 1, 6>; 2790b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFRcpY, [SBPort0,SBPort05], 7, [2,1], 3, 7>; 2800b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFRcpZ, [SBPort0,SBPort05], 7, [2,1], 3, 7>; // Unsupported = 1 2810b57cec5SDimitry Andric 2820b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFRsqrt, [SBPort0], 5, [1], 1, 6>; 2830b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFRsqrtX,[SBPort0], 5, [1], 1, 6>; 2840b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFRsqrtY,[SBPort0,SBPort05], 7, [2,1], 3, 7>; 2850b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFRsqrtZ,[SBPort0,SBPort05], 7, [2,1], 3, 7>; // Unsupported = 1 2860b57cec5SDimitry Andric 2870b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFSqrt, [SBPort0,SBFPDivider], 14, [1,14], 1, 6>; 2880b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFSqrtX, [SBPort0,SBFPDivider], 14, [1,14], 1, 6>; 2890b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFSqrtY, [SBPort0,SBPort05,SBFPDivider], 29, [2,1,28], 3, 7>; 2900b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFSqrtZ, [SBPort0,SBPort05,SBFPDivider], 29, [2,1,28], 3, 7>; // Unsupported = 1 2910b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFSqrt64, [SBPort0,SBFPDivider], 21, [1,21], 1, 6>; 2920b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFSqrt64X, [SBPort0,SBFPDivider], 21, [1,21], 1, 6>; 2930b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFSqrt64Y, [SBPort0,SBPort05,SBFPDivider], 45, [2,1,44], 3, 7>; 2940b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFSqrt64Z, [SBPort0,SBPort05,SBFPDivider], 45, [2,1,44], 3, 7>; // Unsupported = 1 2950b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFSqrt80, [SBPort0,SBFPDivider], 24, [1,24], 1, 6>; 2960b57cec5SDimitry Andric 2970b57cec5SDimitry Andricdefm : SBWriteResPair<WriteDPPD, [SBPort0,SBPort1,SBPort5], 9, [1,1,1], 3, 6>; 298*5f757f3fSDimitry Andricdefm : X86WriteRes<WriteDPPS, [SBPort0,SBPort1,SBPort5], 12, [1,2,1], 4>; 299*5f757f3fSDimitry Andricdefm : X86WriteRes<WriteDPPSY, [SBPort0,SBPort1,SBPort5], 12, [1,2,1], 4>; 300*5f757f3fSDimitry Andricdefm : X86WriteRes<WriteDPPSLd, [SBPort0,SBPort1,SBPort5,SBPort23], 18, [1,2,2,1], 6>; 301*5f757f3fSDimitry Andricdefm : X86WriteRes<WriteDPPSYLd, [SBPort0,SBPort1,SBPort5,SBPort23], 19, [1,2,2,1], 6>; 3020b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFSign, [SBPort5], 1>; 3030b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFRnd, [SBPort1], 3, [1], 1, 6>; 3040b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFRndY, [SBPort1], 3, [1], 1, 7>; 3050b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFRndZ, [SBPort1], 3, [1], 1, 7>; // Unsupported = 1 3060b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFLogic, [SBPort5], 1, [1], 1, 6>; 3070b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFLogicY, [SBPort5], 1, [1], 1, 7>; 3080b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFLogicZ, [SBPort5], 1, [1], 1, 7>; // Unsupported = 1 3090b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFTest, [SBPort0], 1, [1], 1, 6>; 3100b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFTestY, [SBPort0], 1, [1], 1, 7>; 3110b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFTestZ, [SBPort0], 1, [1], 1, 7>; // Unsupported = 1 3120b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFShuffle, [SBPort5], 1, [1], 1, 6>; 3130b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFShuffleY,[SBPort5], 1, [1], 1, 7>; 3140b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFShuffleZ,[SBPort5], 1, [1], 1, 7>; // Unsupported = 1 3150b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFVarShuffle, [SBPort5], 1, [1], 1, 6>; 3160b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFVarShuffleY,[SBPort5], 1, [1], 1, 7>; 3170b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFVarShuffleZ,[SBPort5], 1, [1], 1, 7>; // Unsupported = 1 3180b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFBlend, [SBPort05], 1, [1], 1, 6>; 3190b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFBlendY, [SBPort05], 1, [1], 1, 7>; 3200b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFBlendZ, [SBPort05], 1, [1], 1, 7>; // Unsupported = 1 3210b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFVarBlend, [SBPort05], 2, [2], 2, 6>; 3220b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFVarBlendY,[SBPort05], 2, [2], 2, 7>; 3230b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFVarBlendZ,[SBPort05], 2, [2], 2, 7>; // Unsupported = 1 3240b57cec5SDimitry Andric 3250b57cec5SDimitry Andric// Conversion between integer and float. 3260b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtSS2I, [SBPort0,SBPort1], 5, [1,1], 2>; 3270b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtPS2I, [SBPort1], 3, [1], 1, 6>; 3280b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtPS2IY, [SBPort1], 3, [1], 1, 7>; 3290b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtPS2IZ, [SBPort1], 3, [1], 1, 7>; // Unsupported = 1 3300b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtSD2I, [SBPort0,SBPort1], 5, [1,1], 2>; 3310b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtPD2I, [SBPort1,SBPort5], 4, [1,1], 2, 6>; 3320b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPD2IY, [SBPort1,SBPort5], 4, [1,1], 2>; 3330b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPD2IZ, [SBPort1,SBPort5], 4, [1,1], 2>; // Unsupported = 1 3340b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPD2IYLd, [SBPort1,SBPort5,SBPort23], 11, [1,1,1], 3>; 3350b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPD2IZLd, [SBPort1,SBPort5,SBPort23], 11, [1,1,1], 3>; // Unsupported = 1 3360b57cec5SDimitry Andric 3370b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtI2SS, [SBPort1,SBPort5], 5, [1,2], 3>; 3380b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtI2SSLd, [SBPort1,SBPort5,SBPort23], 10, [1,1,1], 3>; 3390b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtI2PS, [SBPort1], 3, [1], 1, 6>; 3400b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtI2PSY, [SBPort1], 3, [1], 1, 7>; 3410b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtI2PSZ, [SBPort1], 3, [1], 1, 7>; // Unsupported = 1 3420b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtI2SD, [SBPort1,SBPort5], 4, [1,1], 2>; 3430b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtI2PD, [SBPort1,SBPort5], 4, [1,1], 2>; 3440b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtI2PDY, [SBPort1,SBPort5], 4, [1,1], 2>; 3450b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtI2PDZ, [SBPort1,SBPort5], 4, [1,1], 2>; // Unsupported = 1 3460b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtI2SDLd, [SBPort1,SBPort23], 9, [1,1], 2>; 3470b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtI2PDLd, [SBPort1,SBPort5,SBPort23], 10, [1,1,1], 3>; 3480b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtI2PDYLd, [SBPort1,SBPort5,SBPort23], 10, [1,1,1], 3>; 3490b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtI2PDZLd, [SBPort1,SBPort5,SBPort23], 10, [1,1,1], 3>; // Unsupported = 1 3500b57cec5SDimitry Andric 3510b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtSS2SD, [SBPort0], 1, [1], 1, 6>; 3520b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PD, [SBPort0,SBPort5], 2, [1,1], 2>; 3530b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PDY, [SBPort0,SBPort5], 2, [1,1], 2>; 3540b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PDZ, [SBPort0,SBPort5], 2, [1,1], 2>; // Unsupported = 1 3550b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PDLd, [SBPort0,SBPort23], 7, [1,1], 2>; 3560b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PDYLd, [SBPort0,SBPort23], 7, [1,1], 2>; 3570b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PDZLd, [SBPort0,SBPort23], 7, [1,1], 2>; // Unsupported = 1 3580b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtSD2SS, [SBPort1,SBPort5], 4, [1,1], 2, 6>; 3590b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtPD2PS, [SBPort1,SBPort5], 4, [1,1], 2, 6>; 3600b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtPD2PSY, [SBPort1,SBPort5], 4, [1,1], 2, 7>; 3610b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtPD2PSZ, [SBPort1,SBPort5], 4, [1,1], 2, 7>; // Unsupported = 1 3620b57cec5SDimitry Andric 3630b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtPH2PS, [SBPort1], 3>; 3640b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtPH2PSY, [SBPort1], 3>; 3650b57cec5SDimitry Andricdefm : SBWriteResPair<WriteCvtPH2PSZ, [SBPort1], 3>; // Unsupported = 1 3660b57cec5SDimitry Andric 3670b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PH, [SBPort1], 3, [1], 1>; 3680b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PHY, [SBPort1], 3, [1], 1>; 3690b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PHZ, [SBPort1], 3, [1], 1>; // Unsupported = 1 3700b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PHSt, [SBPort1, SBPort23, SBPort4], 4, [1,1,1], 1>; 3710b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PHYSt, [SBPort1, SBPort23, SBPort4], 4, [1,1,1], 1>; 3720b57cec5SDimitry Andricdefm : X86WriteRes<WriteCvtPS2PHZSt, [SBPort1, SBPort23, SBPort4], 4, [1,1,1], 1>; // Unsupported = 1 3730b57cec5SDimitry Andric 3740b57cec5SDimitry Andric// Vector integer operations. 3750b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecLoad, [SBPort23], 5, [1], 1>; 3760b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecLoadX, [SBPort23], 6, [1], 1>; 3770b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecLoadY, [SBPort23], 7, [1], 1>; 3780b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecLoadNT, [SBPort23], 6, [1], 1>; 3790b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecLoadNTY, [SBPort23], 7, [1], 1>; 3800b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMaskedLoad, [SBPort23,SBPort05], 8, [1,2], 3>; 3810b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMaskedLoadY, [SBPort23,SBPort05], 9, [1,2], 3>; 3820b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecStore, [SBPort23,SBPort4], 1, [1,1], 1>; 3830b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecStoreX, [SBPort23,SBPort4], 1, [1,1], 1>; 3840b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecStoreY, [SBPort23,SBPort4], 1, [1,1], 1>; 3850b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecStoreNT, [SBPort23,SBPort4], 1, [1,1], 1>; 3860b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecStoreNTY, [SBPort23,SBPort4], 1, [1,1], 1>; 387*5f757f3fSDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore32, [SBPort4,SBPort01,SBPort23], 5, [1,2,1], 4>; 388*5f757f3fSDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore32Y, [SBPort4,SBPort01,SBPort23], 5, [1,2,1], 4>; 389*5f757f3fSDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore64, [SBPort4,SBPort01,SBPort23], 5, [1,2,1], 4>; 390*5f757f3fSDimitry Andricdefm : X86WriteRes<WriteVecMaskedStore64Y, [SBPort4,SBPort01,SBPort23], 5, [1,2,1], 4>; 3910b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMove, [SBPort05], 1, [1], 1>; 3920b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMoveX, [SBPort015], 1, [1], 1>; 3930b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMoveY, [SBPort05], 1, [1], 1>; 39404eeddc0SDimitry Andricdefm : X86WriteRes<WriteVecMoveZ, [SBPort05], 1, [1], 1>; 3950b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMoveToGpr, [SBPort0], 2, [1], 1>; 3960b57cec5SDimitry Andricdefm : X86WriteRes<WriteVecMoveFromGpr, [SBPort5], 1, [1], 1>; 3970b57cec5SDimitry Andric 3980b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecLogic, [SBPort015], 1, [1], 1, 5>; 3990b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecLogicX,[SBPort015], 1, [1], 1, 6>; 4000b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecLogicY,[SBPort015], 1, [1], 1, 7>; 4010b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecLogicZ,[SBPort015], 1, [1], 1, 7>; // Unsupported = 1 4020b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecTest, [SBPort0,SBPort5], 2, [1,1], 2, 6>; 4030b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecTestY, [SBPort0,SBPort5], 2, [1,1], 2, 7>; 4040b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecTestZ, [SBPort0,SBPort5], 2, [1,1], 2, 7>; // Unsupported = 1 4050b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecALU, [SBPort1], 3, [1], 1, 5>; 4060b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecALUX, [SBPort15], 1, [1], 1, 6>; 4070b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecALUY, [SBPort15], 1, [1], 1, 7>; 4080b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecALUZ, [SBPort15], 1, [1], 1, 7>; // Unsupported = 1 4090b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecIMul, [SBPort0], 5, [1], 1, 5>; 4100b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecIMulX, [SBPort0], 5, [1], 1, 6>; 4110b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecIMulY, [SBPort0], 5, [1], 1, 7>; 4120b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecIMulZ, [SBPort0], 5, [1], 1, 7>; // Unsupported = 1 4130b57cec5SDimitry Andricdefm : SBWriteResPair<WritePMULLD, [SBPort0], 5, [1], 1, 6>; 4140b57cec5SDimitry Andricdefm : SBWriteResPair<WritePMULLDY, [SBPort0], 5, [1], 1, 7>; // TODO this is probably wrong for 256/512-bit for the "generic" model 4150b57cec5SDimitry Andricdefm : SBWriteResPair<WritePMULLDZ, [SBPort0], 5, [1], 1, 7>; // Unsupported = 1 4160b57cec5SDimitry Andricdefm : SBWriteResPair<WriteShuffle, [SBPort5], 1, [1], 1, 5>; 4170b57cec5SDimitry Andricdefm : SBWriteResPair<WriteShuffleX, [SBPort15], 1, [1], 1, 6>; 4180b57cec5SDimitry Andricdefm : SBWriteResPair<WriteShuffleY, [SBPort5], 1, [1], 1, 7>; 4190b57cec5SDimitry Andricdefm : SBWriteResPair<WriteShuffleZ, [SBPort5], 1, [1], 1, 7>; // Unsupported = 1 4200b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVarShuffle, [SBPort15], 1, [1], 1, 5>; 4210b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVarShuffleX, [SBPort15], 1, [1], 1, 6>; 4220b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVarShuffleY, [SBPort15], 1, [1], 1, 7>; 4230b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVarShuffleZ, [SBPort15], 1, [1], 1, 7>; // Unsupported = 1 4240b57cec5SDimitry Andricdefm : SBWriteResPair<WriteBlend, [SBPort15], 1, [1], 1, 6>; 4250b57cec5SDimitry Andricdefm : SBWriteResPair<WriteBlendY, [SBPort15], 1, [1], 1, 7>; 4260b57cec5SDimitry Andricdefm : SBWriteResPair<WriteBlendZ, [SBPort15], 1, [1], 1, 7>; // Unsupported = 1 4270b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVarBlend, [SBPort15], 2, [2], 2, 6>; 4280b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVarBlendY,[SBPort15], 2, [2], 2, 7>; 4290b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVarBlendZ,[SBPort15], 2, [2], 2, 7>; // Unsupported = 1 4300b57cec5SDimitry Andricdefm : SBWriteResPair<WriteMPSAD, [SBPort0, SBPort15], 7, [1,2], 3, 6>; 4310b57cec5SDimitry Andricdefm : SBWriteResPair<WriteMPSADY, [SBPort0, SBPort15], 7, [1,2], 3, 7>; 4320b57cec5SDimitry Andricdefm : SBWriteResPair<WriteMPSADZ, [SBPort0, SBPort15], 7, [1,2], 3, 7>; // Unsupported = 1 4330b57cec5SDimitry Andricdefm : SBWriteResPair<WritePSADBW, [SBPort0], 5, [1], 1, 5>; 4340b57cec5SDimitry Andricdefm : SBWriteResPair<WritePSADBWX, [SBPort0], 5, [1], 1, 6>; 4350b57cec5SDimitry Andricdefm : SBWriteResPair<WritePSADBWY, [SBPort0], 5, [1], 1, 7>; 4360b57cec5SDimitry Andricdefm : SBWriteResPair<WritePSADBWZ, [SBPort0], 5, [1], 1, 7>; // Unsupported = 1 4370b57cec5SDimitry Andricdefm : SBWriteResPair<WritePHMINPOS, [SBPort0], 5, [1], 1, 6>; 4380b57cec5SDimitry Andric 4390b57cec5SDimitry Andric// Vector integer shifts. 4400b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecShift, [SBPort5], 1, [1], 1, 5>; 4410b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecShiftX, [SBPort0,SBPort15], 2, [1,1], 2, 6>; 4420b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecShiftY, [SBPort0,SBPort15], 4, [1,1], 2, 7>; 4430b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecShiftZ, [SBPort0,SBPort15], 4, [1,1], 2, 7>; // Unsupported = 1 4440b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecShiftImm, [SBPort5], 1, [1], 1, 5>; 4450b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecShiftImmX, [SBPort0], 1, [1], 1, 6>; 4460b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecShiftImmY, [SBPort0], 1, [1], 1, 7>; 4470b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVecShiftImmZ, [SBPort0], 1, [1], 1, 7>; // Unsupported = 1 4480b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVarVecShift, [SBPort0], 1, [1], 1, 6>; 4490b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVarVecShiftY, [SBPort0], 1, [1], 1, 7>; 4500b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVarVecShiftZ, [SBPort0], 1, [1], 1, 7>; // Unsupported = 1 4510b57cec5SDimitry Andric 4520b57cec5SDimitry Andric// Vector insert/extract operations. 4530b57cec5SDimitry Andricdef : WriteRes<WriteVecInsert, [SBPort5,SBPort15]> { 4540b57cec5SDimitry Andric let Latency = 2; 4550b57cec5SDimitry Andric let NumMicroOps = 2; 4560b57cec5SDimitry Andric} 4570b57cec5SDimitry Andricdef : WriteRes<WriteVecInsertLd, [SBPort23,SBPort15]> { 4580b57cec5SDimitry Andric let Latency = 7; 4590b57cec5SDimitry Andric let NumMicroOps = 2; 4600b57cec5SDimitry Andric} 4610b57cec5SDimitry Andric 4620b57cec5SDimitry Andricdef : WriteRes<WriteVecExtract, [SBPort0,SBPort15]> { 4630b57cec5SDimitry Andric let Latency = 3; 4640b57cec5SDimitry Andric let NumMicroOps = 2; 4650b57cec5SDimitry Andric} 4660b57cec5SDimitry Andricdef : WriteRes<WriteVecExtractSt, [SBPort4,SBPort23,SBPort15]> { 4670b57cec5SDimitry Andric let Latency = 5; 4680b57cec5SDimitry Andric let NumMicroOps = 3; 4690b57cec5SDimitry Andric} 4700b57cec5SDimitry Andric 4710b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4720b57cec5SDimitry Andric// Horizontal add/sub instructions. 4730b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4740b57cec5SDimitry Andric 4750b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFHAdd, [SBPort1,SBPort5], 5, [1,2], 3, 6>; 4760b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFHAddY, [SBPort1,SBPort5], 5, [1,2], 3, 7>; 4770b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFHAddZ, [SBPort1,SBPort5], 5, [1,2], 3, 7>; // Unsupported = 1 4780b57cec5SDimitry Andricdefm : SBWriteResPair<WritePHAdd, [SBPort15], 3, [3], 3, 5>; 4790b57cec5SDimitry Andricdefm : SBWriteResPair<WritePHAddX, [SBPort15], 3, [3], 3, 6>; 4800b57cec5SDimitry Andricdefm : SBWriteResPair<WritePHAddY, [SBPort15], 3, [3], 3, 7>; 4810b57cec5SDimitry Andricdefm : SBWriteResPair<WritePHAddZ, [SBPort15], 3, [3], 3, 7>; // Unsupported = 1 4820b57cec5SDimitry Andric 4830b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4840b57cec5SDimitry Andric// String instructions. 4850b57cec5SDimitry Andric//////////////////////////////////////////////////////////////////////////////// 4860b57cec5SDimitry Andric 4870b57cec5SDimitry Andric// Packed Compare Implicit Length Strings, Return Mask 4880b57cec5SDimitry Andricdef : WriteRes<WritePCmpIStrM, [SBPort0]> { 4890b57cec5SDimitry Andric let Latency = 11; 4900b57cec5SDimitry Andric let NumMicroOps = 3; 491*5f757f3fSDimitry Andric let ReleaseAtCycles = [3]; 4920b57cec5SDimitry Andric} 4930b57cec5SDimitry Andricdef : WriteRes<WritePCmpIStrMLd, [SBPort0, SBPort23]> { 4940b57cec5SDimitry Andric let Latency = 17; 4950b57cec5SDimitry Andric let NumMicroOps = 4; 496*5f757f3fSDimitry Andric let ReleaseAtCycles = [3,1]; 4970b57cec5SDimitry Andric} 4980b57cec5SDimitry Andric 4990b57cec5SDimitry Andric// Packed Compare Explicit Length Strings, Return Mask 5000b57cec5SDimitry Andricdef : WriteRes<WritePCmpEStrM, [SBPort015]> { 5010b57cec5SDimitry Andric let Latency = 11; 502*5f757f3fSDimitry Andric let ReleaseAtCycles = [8]; 5030b57cec5SDimitry Andric} 5040b57cec5SDimitry Andricdef : WriteRes<WritePCmpEStrMLd, [SBPort015, SBPort23]> { 5055ffd83dbSDimitry Andric let Latency = 17; 506*5f757f3fSDimitry Andric let ReleaseAtCycles = [7, 1]; 5070b57cec5SDimitry Andric} 5080b57cec5SDimitry Andric 5090b57cec5SDimitry Andric// Packed Compare Implicit Length Strings, Return Index 5100b57cec5SDimitry Andricdef : WriteRes<WritePCmpIStrI, [SBPort0]> { 5110b57cec5SDimitry Andric let Latency = 11; 5120b57cec5SDimitry Andric let NumMicroOps = 3; 513*5f757f3fSDimitry Andric let ReleaseAtCycles = [3]; 5140b57cec5SDimitry Andric} 5150b57cec5SDimitry Andricdef : WriteRes<WritePCmpIStrILd, [SBPort0,SBPort23]> { 5160b57cec5SDimitry Andric let Latency = 17; 5170b57cec5SDimitry Andric let NumMicroOps = 4; 518*5f757f3fSDimitry Andric let ReleaseAtCycles = [3,1]; 5190b57cec5SDimitry Andric} 5200b57cec5SDimitry Andric 5210b57cec5SDimitry Andric// Packed Compare Explicit Length Strings, Return Index 5220b57cec5SDimitry Andricdef : WriteRes<WritePCmpEStrI, [SBPort015]> { 5230b57cec5SDimitry Andric let Latency = 4; 524*5f757f3fSDimitry Andric let ReleaseAtCycles = [8]; 5250b57cec5SDimitry Andric} 5260b57cec5SDimitry Andricdef : WriteRes<WritePCmpEStrILd, [SBPort015, SBPort23]> { 5275ffd83dbSDimitry Andric let Latency = 10; 528*5f757f3fSDimitry Andric let ReleaseAtCycles = [7, 1]; 5290b57cec5SDimitry Andric} 5300b57cec5SDimitry Andric 5310b57cec5SDimitry Andric// MOVMSK Instructions. 5320b57cec5SDimitry Andricdef : WriteRes<WriteFMOVMSK, [SBPort0]> { let Latency = 2; } 5330b57cec5SDimitry Andricdef : WriteRes<WriteVecMOVMSK, [SBPort0]> { let Latency = 2; } 5340b57cec5SDimitry Andricdef : WriteRes<WriteVecMOVMSKY, [SBPort0]> { let Latency = 2; } 5350b57cec5SDimitry Andricdef : WriteRes<WriteMMXMOVMSK, [SBPort0]> { let Latency = 1; } 5360b57cec5SDimitry Andric 5370b57cec5SDimitry Andric// AES Instructions. 5380b57cec5SDimitry Andricdef : WriteRes<WriteAESDecEnc, [SBPort5,SBPort015]> { 5390b57cec5SDimitry Andric let Latency = 7; 5400b57cec5SDimitry Andric let NumMicroOps = 2; 541*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 5420b57cec5SDimitry Andric} 5430b57cec5SDimitry Andricdef : WriteRes<WriteAESDecEncLd, [SBPort5,SBPort23,SBPort015]> { 5440b57cec5SDimitry Andric let Latency = 13; 5450b57cec5SDimitry Andric let NumMicroOps = 3; 546*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 5470b57cec5SDimitry Andric} 5480b57cec5SDimitry Andric 5490b57cec5SDimitry Andricdef : WriteRes<WriteAESIMC, [SBPort5]> { 5500b57cec5SDimitry Andric let Latency = 12; 5510b57cec5SDimitry Andric let NumMicroOps = 2; 552*5f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 5530b57cec5SDimitry Andric} 5540b57cec5SDimitry Andricdef : WriteRes<WriteAESIMCLd, [SBPort5,SBPort23]> { 5550b57cec5SDimitry Andric let Latency = 18; 5560b57cec5SDimitry Andric let NumMicroOps = 3; 557*5f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 5580b57cec5SDimitry Andric} 5590b57cec5SDimitry Andric 5600b57cec5SDimitry Andricdef : WriteRes<WriteAESKeyGen, [SBPort015]> { 5610b57cec5SDimitry Andric let Latency = 8; 562*5f757f3fSDimitry Andric let ReleaseAtCycles = [11]; 5630b57cec5SDimitry Andric} 5640b57cec5SDimitry Andricdef : WriteRes<WriteAESKeyGenLd, [SBPort015, SBPort23]> { 5655ffd83dbSDimitry Andric let Latency = 14; 566*5f757f3fSDimitry Andric let ReleaseAtCycles = [10, 1]; 5670b57cec5SDimitry Andric} 5680b57cec5SDimitry Andric 5690b57cec5SDimitry Andric// Carry-less multiplication instructions. 5700b57cec5SDimitry Andricdef : WriteRes<WriteCLMul, [SBPort015]> { 5710b57cec5SDimitry Andric let Latency = 14; 572*5f757f3fSDimitry Andric let ReleaseAtCycles = [18]; 5730b57cec5SDimitry Andric} 5740b57cec5SDimitry Andricdef : WriteRes<WriteCLMulLd, [SBPort015, SBPort23]> { 5755ffd83dbSDimitry Andric let Latency = 20; 576*5f757f3fSDimitry Andric let ReleaseAtCycles = [17, 1]; 5770b57cec5SDimitry Andric} 5780b57cec5SDimitry Andric 5790b57cec5SDimitry Andric// Load/store MXCSR. 5800b57cec5SDimitry Andric// FIXME: This is probably wrong. Only STMXCSR should require Port4. 581*5f757f3fSDimitry Andricdef : WriteRes<WriteLDMXCSR, [SBPort0,SBPort4,SBPort5,SBPort23]> { let Latency = 5; let NumMicroOps = 4; let ReleaseAtCycles = [1,1,1,1]; } 582*5f757f3fSDimitry Andricdef : WriteRes<WriteSTMXCSR, [SBPort0,SBPort4,SBPort5,SBPort23]> { let Latency = 5; let NumMicroOps = 4; let ReleaseAtCycles = [1,1,1,1]; } 5830b57cec5SDimitry Andric 5840b57cec5SDimitry Andricdef : WriteRes<WriteSystem, [SBPort015]> { let Latency = 100; } 5850b57cec5SDimitry Andricdef : WriteRes<WriteMicrocoded, [SBPort015]> { let Latency = 100; } 5860b57cec5SDimitry Andricdef : WriteRes<WriteFence, [SBPort23, SBPort4]>; 5870b57cec5SDimitry Andricdef : WriteRes<WriteNop, []>; 5880b57cec5SDimitry Andric 5890b57cec5SDimitry Andric// AVX2/FMA is not supported on that architecture, but we should define the basic 5900b57cec5SDimitry Andric// scheduling resources anyway. 5910b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFShuffle256, [SBPort5], 1, [1], 1, 7>; 5920b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFVarShuffle256, [SBPort5], 1, [1], 1, 7>; 5930b57cec5SDimitry Andricdefm : SBWriteResPair<WriteShuffle256, [SBPort5], 1, [1], 1, 7>; 594fe6060f1SDimitry Andricdefm : SBWriteResPair<WriteVPMOV256, [SBPort5], 1, [1], 1, 7>; 5950b57cec5SDimitry Andricdefm : SBWriteResPair<WriteVarShuffle256, [SBPort5], 1, [1], 1, 7>; 5960b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFMA, [SBPort01], 5>; 5970b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFMAX, [SBPort01], 5>; 5980b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFMAY, [SBPort01], 5>; 5990b57cec5SDimitry Andricdefm : SBWriteResPair<WriteFMAZ, [SBPort01], 5>; // Unsupported = 1 6000b57cec5SDimitry Andric 6010b57cec5SDimitry Andric// Remaining SNB instrs. 6020b57cec5SDimitry Andric 6030b57cec5SDimitry Andricdef SBWriteResGroup1 : SchedWriteRes<[SBPort1]> { 6040b57cec5SDimitry Andric let Latency = 1; 6050b57cec5SDimitry Andric let NumMicroOps = 1; 606*5f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 6070b57cec5SDimitry Andric} 6080b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup1], (instrs COMP_FST0r, 6090b57cec5SDimitry Andric COM_FST0r, 6100b57cec5SDimitry Andric UCOM_FPr, 6110b57cec5SDimitry Andric UCOM_Fr)>; 6120b57cec5SDimitry Andric 6130b57cec5SDimitry Andricdef SBWriteResGroup2 : SchedWriteRes<[SBPort5]> { 6140b57cec5SDimitry Andric let Latency = 1; 6150b57cec5SDimitry Andric let NumMicroOps = 1; 616*5f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 6170b57cec5SDimitry Andric} 6180b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup2], (instrs FDECSTP, FINCSTP, FFREE, FFREEP, FNOP, 6190b57cec5SDimitry Andric LD_Frr, ST_Frr, ST_FPrr)>; 620349cc55cSDimitry Andricdef: InstRW<[SBWriteResGroup2], (instrs RET64)>; 6210b57cec5SDimitry Andric 6220b57cec5SDimitry Andricdef SBWriteResGroup4 : SchedWriteRes<[SBPort05]> { 6230b57cec5SDimitry Andric let Latency = 1; 6240b57cec5SDimitry Andric let NumMicroOps = 1; 625*5f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 6260b57cec5SDimitry Andric} 6270b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup4], (instrs CDQ, CQO)>; 6280b57cec5SDimitry Andric 6290b57cec5SDimitry Andricdef SBWriteResGroup5 : SchedWriteRes<[SBPort15]> { 6300b57cec5SDimitry Andric let Latency = 1; 6310b57cec5SDimitry Andric let NumMicroOps = 1; 632*5f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 6330b57cec5SDimitry Andric} 6340b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup5], (instrs MMX_PABSBrr, 6350b57cec5SDimitry Andric MMX_PABSDrr, 6360b57cec5SDimitry Andric MMX_PABSWrr, 6370eae32dcSDimitry Andric MMX_PADDQrr, 6380b57cec5SDimitry Andric MMX_PALIGNRrri, 6390b57cec5SDimitry Andric MMX_PSIGNBrr, 6400b57cec5SDimitry Andric MMX_PSIGNDrr, 6410b57cec5SDimitry Andric MMX_PSIGNWrr)>; 6420b57cec5SDimitry Andric 6430b57cec5SDimitry Andricdef SBWriteResGroup11 : SchedWriteRes<[SBPort015]> { 6440b57cec5SDimitry Andric let Latency = 2; 6450b57cec5SDimitry Andric let NumMicroOps = 2; 646*5f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 6470b57cec5SDimitry Andric} 6480b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup11], (instrs SCASB, 6490b57cec5SDimitry Andric SCASL, 6500b57cec5SDimitry Andric SCASQ, 6510b57cec5SDimitry Andric SCASW)>; 6520b57cec5SDimitry Andric 6530b57cec5SDimitry Andricdef SBWriteResGroup12 : SchedWriteRes<[SBPort0,SBPort1]> { 6540b57cec5SDimitry Andric let Latency = 2; 6550b57cec5SDimitry Andric let NumMicroOps = 2; 656*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 6570b57cec5SDimitry Andric} 6580b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup12], (instregex "(V?)(U?)COMI(SD|SS)rr")>; 6590b57cec5SDimitry Andric 6600b57cec5SDimitry Andricdef SBWriteResGroup15 : SchedWriteRes<[SBPort0,SBPort015]> { 6610b57cec5SDimitry Andric let Latency = 2; 6620b57cec5SDimitry Andric let NumMicroOps = 2; 663*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 6640b57cec5SDimitry Andric} 6650b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup15], (instrs CWD, 6660b57cec5SDimitry Andric FNSTSW16r)>; 6670b57cec5SDimitry Andric 6680b57cec5SDimitry Andricdef SBWriteResGroup18 : SchedWriteRes<[SBPort5,SBPort015]> { 6690b57cec5SDimitry Andric let Latency = 2; 6700b57cec5SDimitry Andric let NumMicroOps = 2; 671*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 6720b57cec5SDimitry Andric} 6730b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup18], (instrs JCXZ, JECXZ, JRCXZ, 6740b57cec5SDimitry Andric MMX_MOVDQ2Qrr)>; 6750b57cec5SDimitry Andric 6760b57cec5SDimitry Andricdef SBWriteResGroup21 : SchedWriteRes<[SBPort1]> { 6770b57cec5SDimitry Andric let Latency = 3; 6780b57cec5SDimitry Andric let NumMicroOps = 1; 679*5f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 6800b57cec5SDimitry Andric} 6810b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup21], (instrs PUSHFS64)>; 6820b57cec5SDimitry Andric 6830b57cec5SDimitry Andricdef SBWriteResGroup22 : SchedWriteRes<[SBPort0,SBPort5]> { 6840b57cec5SDimitry Andric let Latency = 3; 6850b57cec5SDimitry Andric let NumMicroOps = 2; 686*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 6870b57cec5SDimitry Andric} 6880b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup22], (instregex "(V?)EXTRACTPSrr")>; 6890b57cec5SDimitry Andric 69081ad6265SDimitry Andricdef SBWriteResGroup23 : SchedWriteRes<[SBPort05,SBPort015]> { 6910b57cec5SDimitry Andric let Latency = 2; 6920b57cec5SDimitry Andric let NumMicroOps = 3; 693*5f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 6940b57cec5SDimitry Andric} 69581ad6265SDimitry Andricdef: InstRW<[SBWriteResGroup23], (instrs RCL8r1, RCL16r1, RCL32r1, RCL64r1, 69681ad6265SDimitry Andric RCR8r1, RCR16r1, RCR32r1, RCR64r1)>; 69781ad6265SDimitry Andric 69881ad6265SDimitry Andricdef SBWriteResGroup24 : SchedWriteRes<[SBPort1,SBPort5,SBPort05,SBPort015]> { 69981ad6265SDimitry Andric let Latency = 3; 70081ad6265SDimitry Andric let NumMicroOps = 8; 701*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,4,2]; 70281ad6265SDimitry Andric} 70381ad6265SDimitry Andricdef: InstRW<[SBWriteResGroup24], (instrs RCR8ri, RCR16ri, RCR32ri, RCR64ri)>; 70481ad6265SDimitry Andric 70581ad6265SDimitry Andricdef SBWriteResGroup24b : SchedWriteRes<[SBPort1,SBPort5,SBPort05,SBPort015]> { 70681ad6265SDimitry Andric let Latency = 4; 70781ad6265SDimitry Andric let NumMicroOps = 8; 708*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,4,2]; 70981ad6265SDimitry Andric} 71081ad6265SDimitry Andricdef: InstRW<[SBWriteResGroup24b], (instrs RCL8ri, RCL16ri, RCL32ri, RCL64ri)>; 7110b57cec5SDimitry Andric 7120b57cec5SDimitry Andricdef SBWriteResGroup25_1 : SchedWriteRes<[SBPort23,SBPort015]> { 7130b57cec5SDimitry Andric let Latency = 7; 7140b57cec5SDimitry Andric let NumMicroOps = 3; 715*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2]; 7160b57cec5SDimitry Andric} 7170b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup25_1], (instrs LEAVE, LEAVE64)>; 7180b57cec5SDimitry Andric 7190b57cec5SDimitry Andricdef SBWriteResGroup26_2 : SchedWriteRes<[SBPort0,SBPort1,SBPort5]> { 7200b57cec5SDimitry Andric let Latency = 3; 7210b57cec5SDimitry Andric let NumMicroOps = 3; 722*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 7230b57cec5SDimitry Andric} 7240b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup26_2], (instrs COM_FIPr, COM_FIr, UCOM_FIPr, UCOM_FIr)>; 7250b57cec5SDimitry Andric 7260b57cec5SDimitry Andricdef SBWriteResGroup29 : SchedWriteRes<[SBPort1,SBPort015]> { 7270b57cec5SDimitry Andric let Latency = 4; 7280b57cec5SDimitry Andric let NumMicroOps = 2; 729*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 7300b57cec5SDimitry Andric} 7310b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup29], (instrs MOV64sr)>; 7320b57cec5SDimitry Andric 7330b57cec5SDimitry Andricdef SBWriteResGroup29_2 : SchedWriteRes<[SBPort5,SBPort015]> { 7340b57cec5SDimitry Andric let Latency = 4; 7350b57cec5SDimitry Andric let NumMicroOps = 4; 736*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,3]; 7370b57cec5SDimitry Andric} 7380b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup29_2], (instrs PAUSE)>; 7390b57cec5SDimitry Andric 740bdd1243dSDimitry Andricdef SBWriteResGroup30 : SchedWriteRes<[SBPort1,SBPort5,SBPort015]> { 741bdd1243dSDimitry Andric let Latency = 3; 742bdd1243dSDimitry Andric let NumMicroOps = 8; 743*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,3,4]; 7440b57cec5SDimitry Andric} 745bdd1243dSDimitry Andricdef: InstRW<[SBWriteResGroup30], (instrs LOOP)>; 746bdd1243dSDimitry Andric 747bdd1243dSDimitry Andricdef SBWriteResGroup31 : SchedWriteRes<[SBPort1,SBPort5,SBPort015,SBPort05]> { 748bdd1243dSDimitry Andric let Latency = 4; 749bdd1243dSDimitry Andric let NumMicroOps = 12; 750*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,3,6,2]; 751bdd1243dSDimitry Andric} 752bdd1243dSDimitry Andricdef: InstRW<[SBWriteResGroup31], (instrs LOOPE, LOOPNE)>; 7530b57cec5SDimitry Andric 7540b57cec5SDimitry Andricdef SBWriteResGroup76 : SchedWriteRes<[SBPort05]> { 7550b57cec5SDimitry Andric let Latency = 5; 7560b57cec5SDimitry Andric let NumMicroOps = 8; 757*5f757f3fSDimitry Andric let ReleaseAtCycles = [8]; 7580b57cec5SDimitry Andric} 75981ad6265SDimitry Andricdef: InstRW<[SBWriteResGroup76], (instregex "RCL(8|16|32|64)rCL", 76081ad6265SDimitry Andric "RCR(8|16|32|64)rCL")>; 7610b57cec5SDimitry Andric 7620b57cec5SDimitry Andricdef SBWriteResGroup33 : SchedWriteRes<[SBPort4,SBPort23]> { 7630b57cec5SDimitry Andric let Latency = 5; 7640b57cec5SDimitry Andric let NumMicroOps = 2; 765*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 7660b57cec5SDimitry Andric} 7670b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup33], (instregex "PUSH(16r|32r|64r|64i8)")>; 7680b57cec5SDimitry Andric 7690b57cec5SDimitry Andricdef SBWriteResGroup35 : SchedWriteRes<[SBPort1,SBPort5]> { 7700b57cec5SDimitry Andric let Latency = 5; 7710b57cec5SDimitry Andric let NumMicroOps = 3; 772*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2]; 7730b57cec5SDimitry Andric} 7740b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup35], (instrs CLI)>; 7750b57cec5SDimitry Andric 7760b57cec5SDimitry Andricdef SBWriteResGroup35_2 : SchedWriteRes<[SBPort1,SBPort4,SBPort23]> { 7770b57cec5SDimitry Andric let Latency = 5; 7780b57cec5SDimitry Andric let NumMicroOps = 3; 779*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 7800b57cec5SDimitry Andric} 7810b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup35_2], (instrs PUSHGS64)>; 7820b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup35_2], (instregex "ISTT_FP(16|32|64)m")>; 7830b57cec5SDimitry Andric 7840b57cec5SDimitry Andricdef SBWriteResGroup36 : SchedWriteRes<[SBPort4,SBPort5,SBPort23]> { 7850b57cec5SDimitry Andric let Latency = 5; 7860b57cec5SDimitry Andric let NumMicroOps = 3; 787*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 7880b57cec5SDimitry Andric} 7890b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup36], (instrs CALL64pcrel32)>; 7900b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup36], (instregex "CALL(16|32|64)r", 7910b57cec5SDimitry Andric "(V?)EXTRACTPSmr")>; 7920b57cec5SDimitry Andric 7930b57cec5SDimitry Andricdef SBWriteResGroup40 : SchedWriteRes<[SBPort4,SBPort23,SBPort015]> { 7940b57cec5SDimitry Andric let Latency = 5; 7950b57cec5SDimitry Andric let NumMicroOps = 3; 796*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 7970b57cec5SDimitry Andric} 7980b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup40], (instrs STOSB, STOSL, STOSQ, STOSW)>; 7990b57cec5SDimitry Andric 8000b57cec5SDimitry Andricdef SBWriteResGroup41 : SchedWriteRes<[SBPort5,SBPort015]> { 8010b57cec5SDimitry Andric let Latency = 5; 8020b57cec5SDimitry Andric let NumMicroOps = 4; 803*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,3]; 8040b57cec5SDimitry Andric} 8050b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup41], (instrs FNINIT)>; 8060b57cec5SDimitry Andric 8070b57cec5SDimitry Andricdef SBWriteResGroup45 : SchedWriteRes<[SBPort0,SBPort4,SBPort23,SBPort15]> { 8080b57cec5SDimitry Andric let Latency = 5; 8090b57cec5SDimitry Andric let NumMicroOps = 4; 810*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,1]; 8110b57cec5SDimitry Andric} 8120b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup45], (instregex "(V?)PEXTR(D|Q)mr", 8130b57cec5SDimitry Andric "PUSHF(16|64)")>; 8140b57cec5SDimitry Andric 8150b57cec5SDimitry Andricdef SBWriteResGroup46 : SchedWriteRes<[SBPort4,SBPort5,SBPort01,SBPort23]> { 8160b57cec5SDimitry Andric let Latency = 5; 8170b57cec5SDimitry Andric let NumMicroOps = 4; 818*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,1]; 8190b57cec5SDimitry Andric} 8200b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup46], (instregex "CLFLUSH")>; 8210b57cec5SDimitry Andric 8220b57cec5SDimitry Andricdef SBWriteResGroup47 : SchedWriteRes<[SBPort4,SBPort5,SBPort01,SBPort23]> { 8230b57cec5SDimitry Andric let Latency = 5; 8240b57cec5SDimitry Andric let NumMicroOps = 5; 825*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,1,1]; 8260b57cec5SDimitry Andric} 8270b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup47], (instregex "FXRSTOR")>; 8280b57cec5SDimitry Andric 8290b57cec5SDimitry Andricdef SBWriteResGroup48 : SchedWriteRes<[SBPort23]> { 8300b57cec5SDimitry Andric let Latency = 6; 8310b57cec5SDimitry Andric let NumMicroOps = 1; 832*5f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 8330b57cec5SDimitry Andric} 83481ad6265SDimitry Andricdef: InstRW<[SBWriteResGroup48], (instrs VBROADCASTSSrm)>; 8350b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup48], (instregex "POP(16|32|64)r", 8360b57cec5SDimitry Andric "(V?)MOV64toPQIrm", 8370b57cec5SDimitry Andric "(V?)MOVDDUPrm", 8380b57cec5SDimitry Andric "(V?)MOVDI2PDIrm", 8390b57cec5SDimitry Andric "(V?)MOVQI2PQIrm", 8400b57cec5SDimitry Andric "(V?)MOVSDrm", 8410b57cec5SDimitry Andric "(V?)MOVSHDUPrm", 8420b57cec5SDimitry Andric "(V?)MOVSLDUPrm", 8430b57cec5SDimitry Andric "(V?)MOVSSrm")>; 8440b57cec5SDimitry Andric 8450b57cec5SDimitry Andricdef SBWriteResGroup49 : SchedWriteRes<[SBPort5,SBPort23]> { 8460b57cec5SDimitry Andric let Latency = 6; 8470b57cec5SDimitry Andric let NumMicroOps = 2; 848*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 8490b57cec5SDimitry Andric} 8500b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup49], (instrs MOV16sm)>; 8510b57cec5SDimitry Andric 8520b57cec5SDimitry Andricdef SBWriteResGroup51 : SchedWriteRes<[SBPort23,SBPort15]> { 8530b57cec5SDimitry Andric let Latency = 6; 8540b57cec5SDimitry Andric let NumMicroOps = 2; 855*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 8560b57cec5SDimitry Andric} 8570b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup51], (instrs MMX_PABSBrm, 8580b57cec5SDimitry Andric MMX_PABSDrm, 8590b57cec5SDimitry Andric MMX_PABSWrm, 8600b57cec5SDimitry Andric MMX_PALIGNRrmi, 8610b57cec5SDimitry Andric MMX_PSIGNBrm, 8620b57cec5SDimitry Andric MMX_PSIGNDrm, 8630b57cec5SDimitry Andric MMX_PSIGNWrm)>; 8640b57cec5SDimitry Andric 8650b57cec5SDimitry Andricdef SBWriteResGroup52 : SchedWriteRes<[SBPort23,SBPort015]> { 8660b57cec5SDimitry Andric let Latency = 6; 8670b57cec5SDimitry Andric let NumMicroOps = 2; 868*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 8690b57cec5SDimitry Andric} 8700b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup52], (instrs LODSL, LODSQ)>; 8710b57cec5SDimitry Andric 8720b57cec5SDimitry Andricdef SBWriteResGroup53 : SchedWriteRes<[SBPort4,SBPort23]> { 8730b57cec5SDimitry Andric let Latency = 6; 8740b57cec5SDimitry Andric let NumMicroOps = 3; 875*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2]; 8760b57cec5SDimitry Andric} 8770b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup53], (instregex "ST_F(32|64)m", 8780b57cec5SDimitry Andric "ST_FP(32|64|80)m")>; 8790b57cec5SDimitry Andric 8800b57cec5SDimitry Andricdef SBWriteResGroup54 : SchedWriteRes<[SBPort23]> { 8810b57cec5SDimitry Andric let Latency = 7; 8820b57cec5SDimitry Andric let NumMicroOps = 1; 883*5f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 8840b57cec5SDimitry Andric} 885*5f757f3fSDimitry Andricdef: InstRW<[SBWriteResGroup54], (instrs VMOVDDUPYrm, 8860b57cec5SDimitry Andric VMOVSHDUPYrm, 8870b57cec5SDimitry Andric VMOVSLDUPYrm)>; 8880b57cec5SDimitry Andric 8890b57cec5SDimitry Andricdef SBWriteResGroup58 : SchedWriteRes<[SBPort23,SBPort05]> { 8900b57cec5SDimitry Andric let Latency = 7; 8910b57cec5SDimitry Andric let NumMicroOps = 2; 892*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 8930b57cec5SDimitry Andric} 8940b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup58], (instrs VINSERTF128rm)>; 8950b57cec5SDimitry Andric 8960b57cec5SDimitry Andricdef SBWriteResGroup59 : SchedWriteRes<[SBPort23,SBPort15]> { 8970b57cec5SDimitry Andric let Latency = 7; 8980b57cec5SDimitry Andric let NumMicroOps = 2; 899*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 9000b57cec5SDimitry Andric} 9010eae32dcSDimitry Andricdef: InstRW<[SBWriteResGroup59], (instrs MMX_PADDQrm)>; 9020b57cec5SDimitry Andric 9030b57cec5SDimitry Andricdef SBWriteResGroup62 : SchedWriteRes<[SBPort5,SBPort23]> { 9040b57cec5SDimitry Andric let Latency = 7; 9050b57cec5SDimitry Andric let NumMicroOps = 3; 906*5f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 9070b57cec5SDimitry Andric} 9080b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup62], (instrs VERRm, VERWm)>; 9090b57cec5SDimitry Andric 9100b57cec5SDimitry Andricdef SBWriteResGroup63 : SchedWriteRes<[SBPort23,SBPort015]> { 9110b57cec5SDimitry Andric let Latency = 7; 9120b57cec5SDimitry Andric let NumMicroOps = 3; 913*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2]; 9140b57cec5SDimitry Andric} 9150b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup63], (instrs LODSB, LODSW)>; 9160b57cec5SDimitry Andric 9170b57cec5SDimitry Andricdef SBWriteResGroup64 : SchedWriteRes<[SBPort5,SBPort01,SBPort23]> { 9180b57cec5SDimitry Andric let Latency = 7; 9190b57cec5SDimitry Andric let NumMicroOps = 3; 920*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 9210b57cec5SDimitry Andric} 9225ffd83dbSDimitry Andricdef: InstRW<[SBWriteResGroup64], (instrs FARJMP64m)>; 9230b57cec5SDimitry Andric 9240b57cec5SDimitry Andricdef SBWriteResGroup66 : SchedWriteRes<[SBPort0,SBPort4,SBPort23]> { 9250b57cec5SDimitry Andric let Latency = 7; 9260b57cec5SDimitry Andric let NumMicroOps = 4; 927*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,2]; 9280b57cec5SDimitry Andric} 9290b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup66], (instrs FNSTSWm)>; 9300b57cec5SDimitry Andric 9310b57cec5SDimitry Andricdef SBWriteResGroup67 : SchedWriteRes<[SBPort1,SBPort5,SBPort015]> { 9320b57cec5SDimitry Andric let Latency = 7; 9330b57cec5SDimitry Andric let NumMicroOps = 4; 934*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,1]; 9350b57cec5SDimitry Andric} 9360b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup67], (instregex "SLDT(16|32|64)r", 9370b57cec5SDimitry Andric "STR(16|32|64)r")>; 9380b57cec5SDimitry Andric 9390b57cec5SDimitry Andricdef SBWriteResGroup68 : SchedWriteRes<[SBPort4,SBPort5,SBPort23]> { 9400b57cec5SDimitry Andric let Latency = 7; 9410b57cec5SDimitry Andric let NumMicroOps = 4; 942*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,2]; 9430b57cec5SDimitry Andric} 9440b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup68], (instrs FNSTCW16m)>; 9450b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup68], (instregex "CALL(16|32|64)m")>; 9460b57cec5SDimitry Andric 9470b57cec5SDimitry Andricdef SBWriteResGroup69 : SchedWriteRes<[SBPort4,SBPort23,SBPort05]> { 9480b57cec5SDimitry Andric let Latency = 7; 9490b57cec5SDimitry Andric let NumMicroOps = 4; 950*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,1]; 9510b57cec5SDimitry Andric} 9520b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup69], (instregex "SAR(8|16|32|64)m(1|i)", 9530b57cec5SDimitry Andric "SHL(8|16|32|64)m(1|i)", 9540b57cec5SDimitry Andric "SHR(8|16|32|64)m(1|i)")>; 9550b57cec5SDimitry Andric 9560b57cec5SDimitry Andricdef SBWriteResGroup77 : SchedWriteRes<[SBPort0,SBPort1,SBPort23]> { 9570b57cec5SDimitry Andric let Latency = 8; 9580b57cec5SDimitry Andric let NumMicroOps = 3; 959*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 9600b57cec5SDimitry Andric} 9610b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup77], (instregex "(V?)(U?)COMI(SD|SS)rm")>; 9620b57cec5SDimitry Andric 9630b57cec5SDimitry Andricdef SBWriteResGroup81 : SchedWriteRes<[SBPort4, SBPort23, SBPort015]> { 9640b57cec5SDimitry Andric let Latency = 6; 9650b57cec5SDimitry Andric let NumMicroOps = 3; 966*5f757f3fSDimitry Andric let ReleaseAtCycles = [1, 2, 1]; 9670b57cec5SDimitry Andric} 9680b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup81], (instregex "CMPXCHG(8|16)B")>; 9690b57cec5SDimitry Andric 9700b57cec5SDimitry Andricdef SBWriteResGroup83 : SchedWriteRes<[SBPort23,SBPort015]> { 9710b57cec5SDimitry Andric let Latency = 8; 9720b57cec5SDimitry Andric let NumMicroOps = 5; 973*5f757f3fSDimitry Andric let ReleaseAtCycles = [2,3]; 9740b57cec5SDimitry Andric} 9750b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup83], (instrs CMPSB, 9760b57cec5SDimitry Andric CMPSL, 9770b57cec5SDimitry Andric CMPSQ, 9780b57cec5SDimitry Andric CMPSW)>; 9790b57cec5SDimitry Andric 9800b57cec5SDimitry Andricdef SBWriteResGroup84 : SchedWriteRes<[SBPort4,SBPort5,SBPort23]> { 9810b57cec5SDimitry Andric let Latency = 8; 9820b57cec5SDimitry Andric let NumMicroOps = 5; 983*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,2]; 9840b57cec5SDimitry Andric} 9850b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup84], (instrs FLDCW16m)>; 9860b57cec5SDimitry Andric 9870b57cec5SDimitry Andricdef SBWriteResGroup85 : SchedWriteRes<[SBPort4,SBPort23,SBPort05]> { 9880b57cec5SDimitry Andric let Latency = 8; 9890b57cec5SDimitry Andric let NumMicroOps = 5; 990*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,2]; 9910b57cec5SDimitry Andric} 9920b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup85], (instregex "ROL(8|16|32|64)m(1|i)", 9930b57cec5SDimitry Andric "ROR(8|16|32|64)m(1|i)")>; 9940b57cec5SDimitry Andric 9950b57cec5SDimitry Andricdef SBWriteResGroup86 : SchedWriteRes<[SBPort4,SBPort23,SBPort015]> { 9960b57cec5SDimitry Andric let Latency = 8; 9970b57cec5SDimitry Andric let NumMicroOps = 5; 998*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,2]; 9990b57cec5SDimitry Andric} 10000b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup86], (instrs MOVSB, MOVSL, MOVSQ, MOVSW)>; 10010b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup86], (instregex "XADD(8|16|32|64)rm")>; 10020b57cec5SDimitry Andric 10030b57cec5SDimitry Andricdef SBWriteResGroup87 : SchedWriteRes<[SBPort4,SBPort5,SBPort01,SBPort23]> { 10040b57cec5SDimitry Andric let Latency = 8; 10050b57cec5SDimitry Andric let NumMicroOps = 5; 1006*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1,2]; 10070b57cec5SDimitry Andric} 10085ffd83dbSDimitry Andricdef: InstRW<[SBWriteResGroup87], (instrs FARCALL64m)>; 10090b57cec5SDimitry Andric 10100b57cec5SDimitry Andricdef SBWriteResGroup95 : SchedWriteRes<[SBPort5,SBPort01,SBPort23]> { 10110b57cec5SDimitry Andric let Latency = 9; 10120b57cec5SDimitry Andric let NumMicroOps = 3; 1013*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 10140b57cec5SDimitry Andric} 10150b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup95], (instregex "LD_F(32|64|80)m")>; 10160b57cec5SDimitry Andric 10170b57cec5SDimitry Andricdef SBWriteResGroup97 : SchedWriteRes<[SBPort1,SBPort4,SBPort23]> { 10180b57cec5SDimitry Andric let Latency = 9; 10190b57cec5SDimitry Andric let NumMicroOps = 4; 1020*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,2]; 10210b57cec5SDimitry Andric} 10220b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup97], (instregex "IST_F(16|32)m", 10230b57cec5SDimitry Andric "IST_FP(16|32|64)m")>; 10240b57cec5SDimitry Andric 10250b57cec5SDimitry Andricdef SBWriteResGroup97_2 : SchedWriteRes<[SBPort4,SBPort23,SBPort05]> { 10260b57cec5SDimitry Andric let Latency = 9; 10270b57cec5SDimitry Andric let NumMicroOps = 6; 1028*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,3]; 10290b57cec5SDimitry Andric} 10300b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup97_2], (instregex "ROL(8|16|32|64)mCL", 10310b57cec5SDimitry Andric "ROR(8|16|32|64)mCL", 10320b57cec5SDimitry Andric "SAR(8|16|32|64)mCL", 10330b57cec5SDimitry Andric "SHL(8|16|32|64)mCL", 10340b57cec5SDimitry Andric "SHR(8|16|32|64)mCL")>; 10350b57cec5SDimitry Andric 10360b57cec5SDimitry Andricdef SBWriteResGroup98 : SchedWriteRes<[SBPort4,SBPort23,SBPort015]> { 10370b57cec5SDimitry Andric let Latency = 9; 1038bdd1243dSDimitry Andric let NumMicroOps = 4; 1039*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,3]; 10400b57cec5SDimitry Andric} 10410b57cec5SDimitry Andricdef: SchedAlias<WriteADCRMW, SBWriteResGroup98>; 10420b57cec5SDimitry Andric 10430b57cec5SDimitry Andricdef SBWriteResGroup99 : SchedWriteRes<[SBPort4,SBPort23,SBPort05,SBPort015]> { 10440b57cec5SDimitry Andric let Latency = 9; 1045bdd1243dSDimitry Andric let NumMicroOps = 4; 1046*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,2,1]; 10470b57cec5SDimitry Andric} 10480b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup99, ReadAfterLd], (instrs ADC8mr, ADC16mr, ADC32mr, ADC64mr, 10490b57cec5SDimitry Andric SBB8mr, SBB16mr, SBB32mr, SBB64mr)>; 10500b57cec5SDimitry Andric 10510b57cec5SDimitry Andricdef SBWriteResGroup100 : SchedWriteRes<[SBPort4,SBPort5,SBPort23,SBPort05,SBPort015]> { 10520b57cec5SDimitry Andric let Latency = 9; 10530b57cec5SDimitry Andric let NumMicroOps = 6; 1054*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,2,1,1]; 10550b57cec5SDimitry Andric} 10560b57cec5SDimitry Andricdef : SchedAlias<WriteBitTestRegLd, SBWriteResGroup100>; // TODO - this is incorrect - no RMW 10570b57cec5SDimitry Andric 10580b57cec5SDimitry Andricdef SBWriteResGroup101 : SchedWriteRes<[SBPort1,SBPort23]> { 10590b57cec5SDimitry Andric let Latency = 10; 10600b57cec5SDimitry Andric let NumMicroOps = 2; 1061*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 10620b57cec5SDimitry Andric} 10630b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup101], (instregex "(ADD|SUB|SUBR)_F(32|64)m", 10640b57cec5SDimitry Andric "ILD_F(16|32|64)m")>; 10650b57cec5SDimitry Andric 10660b57cec5SDimitry Andricdef SBWriteResGroup104 : SchedWriteRes<[SBPort0,SBPort23]> { 10670b57cec5SDimitry Andric let Latency = 11; 10680b57cec5SDimitry Andric let NumMicroOps = 2; 1069*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 10700b57cec5SDimitry Andric} 10710b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup104], (instregex "(V?)PCMPGTQrm")>; 10720b57cec5SDimitry Andric 10730b57cec5SDimitry Andricdef SBWriteResGroup106 : SchedWriteRes<[SBPort1,SBPort23]> { 10740b57cec5SDimitry Andric let Latency = 11; 10750b57cec5SDimitry Andric let NumMicroOps = 3; 1076*5f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 10770b57cec5SDimitry Andric} 10780b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup106], (instregex "FICOM(P?)(16|32)m")>; 10790b57cec5SDimitry Andric 10800b57cec5SDimitry Andricdef SBWriteResGroup108 : SchedWriteRes<[SBPort05,SBPort23]> { 10810b57cec5SDimitry Andric let Latency = 11; 10820b57cec5SDimitry Andric let NumMicroOps = 11; 1083*5f757f3fSDimitry Andric let ReleaseAtCycles = [7,4]; 10840b57cec5SDimitry Andric} 10850b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup108], (instregex "RCL(8|16|32|64)m", 10860b57cec5SDimitry Andric "RCR(8|16|32|64)m")>; 10870b57cec5SDimitry Andric 10880b57cec5SDimitry Andricdef SBWriteResGroup111 : SchedWriteRes<[SBPort0,SBPort23]> { 10890b57cec5SDimitry Andric let Latency = 12; 10900b57cec5SDimitry Andric let NumMicroOps = 2; 1091*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 10920b57cec5SDimitry Andric} 10930b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup111], (instregex "MUL_F(32|64)m")>; 10940b57cec5SDimitry Andric 10950b57cec5SDimitry Andricdef SBWriteResGroup114 : SchedWriteRes<[SBPort1,SBPort23]> { 10960b57cec5SDimitry Andric let Latency = 13; 10970b57cec5SDimitry Andric let NumMicroOps = 3; 1098*5f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 10990b57cec5SDimitry Andric} 11000b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup114], (instregex "(ADD|SUB|SUBR)_FI(16|32)m")>; 11010b57cec5SDimitry Andric 11020b57cec5SDimitry Andricdef SBWriteResGroup119 : SchedWriteRes<[SBPort0,SBPort1,SBPort23]> { 11030b57cec5SDimitry Andric let Latency = 15; 11040b57cec5SDimitry Andric let NumMicroOps = 3; 1105*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 11060b57cec5SDimitry Andric} 11070b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup119], (instregex "MUL_FI(16|32)m")>; 11080b57cec5SDimitry Andric 11090b57cec5SDimitry Andricdef SBWriteResGroup130 : SchedWriteRes<[SBPort0,SBPort23]> { 11100b57cec5SDimitry Andric let Latency = 31; 11110b57cec5SDimitry Andric let NumMicroOps = 2; 1112*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1]; 11130b57cec5SDimitry Andric} 11140b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup130], (instregex "DIV(R?)_F(32|64)m")>; 11150b57cec5SDimitry Andric 11160b57cec5SDimitry Andricdef SBWriteResGroup131 : SchedWriteRes<[SBPort0,SBPort1,SBPort23]> { 11170b57cec5SDimitry Andric let Latency = 34; 11180b57cec5SDimitry Andric let NumMicroOps = 3; 1119*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,1]; 11200b57cec5SDimitry Andric} 11210b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroup131], (instregex "DIV(R?)_FI(16|32)m")>; 11220b57cec5SDimitry Andric 11230b57cec5SDimitry Andricdef SBWriteResGroupVzeroall : SchedWriteRes<[SBPort5]> { 11240b57cec5SDimitry Andric let Latency = 9; 11250b57cec5SDimitry Andric let NumMicroOps = 20; 1126*5f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 11270b57cec5SDimitry Andric} 11280b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroupVzeroall], (instrs VZEROALL)>; 11290b57cec5SDimitry Andric 11300b57cec5SDimitry Andricdef SBWriteResGroupVzeroupper : SchedWriteRes<[]> { 11310b57cec5SDimitry Andric let Latency = 1; 11320b57cec5SDimitry Andric let NumMicroOps = 4; 1133*5f757f3fSDimitry Andric let ReleaseAtCycles = []; 11340b57cec5SDimitry Andric} 11350b57cec5SDimitry Andricdef: InstRW<[SBWriteResGroupVzeroupper], (instrs VZEROUPPER)>; 11360b57cec5SDimitry Andric 11370b57cec5SDimitry Andricdef: InstRW<[WriteZero], (instrs CLC)>; 11380b57cec5SDimitry Andric 11395ffd83dbSDimitry Andric// Instruction variants handled by the renamer. These might not need execution 11400b57cec5SDimitry Andric// ports in certain conditions. 11410b57cec5SDimitry Andric// See Agner's Fog "The microarchitecture of Intel, AMD and VIA CPUs", 11420b57cec5SDimitry Andric// section "Sandy Bridge and Ivy Bridge Pipeline" > "Register allocation and 11430b57cec5SDimitry Andric// renaming". 11440b57cec5SDimitry Andric// These can be investigated with llvm-exegesis, e.g. 11450b57cec5SDimitry Andric// echo 'pxor %mm0, %mm0' | /tmp/llvm-exegesis -mode=uops -snippets-file=- 11460b57cec5SDimitry Andric// echo 'vxorpd %xmm0, %xmm0, %xmm1' | /tmp/llvm-exegesis -mode=uops -snippets-file=- 11470b57cec5SDimitry Andric 11480b57cec5SDimitry Andricdef SBWriteZeroLatency : SchedWriteRes<[]> { 11490b57cec5SDimitry Andric let Latency = 0; 11500b57cec5SDimitry Andric} 11510b57cec5SDimitry Andric 11520b57cec5SDimitry Andricdef SBWriteZeroIdiom : SchedWriteVariant<[ 11530b57cec5SDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SBWriteZeroLatency]>, 11540b57cec5SDimitry Andric SchedVar<NoSchedPred, [WriteALU]> 11550b57cec5SDimitry Andric]>; 11560b57cec5SDimitry Andricdef : InstRW<[SBWriteZeroIdiom], (instrs SUB32rr, SUB64rr, 11570b57cec5SDimitry Andric XOR32rr, XOR64rr)>; 11580b57cec5SDimitry Andric 11590b57cec5SDimitry Andricdef SBWriteFZeroIdiom : SchedWriteVariant<[ 11600b57cec5SDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SBWriteZeroLatency]>, 11610b57cec5SDimitry Andric SchedVar<NoSchedPred, [WriteFLogic]> 11620b57cec5SDimitry Andric]>; 11630b57cec5SDimitry Andricdef : InstRW<[SBWriteFZeroIdiom], (instrs XORPSrr, VXORPSrr, XORPDrr, 11640b57cec5SDimitry Andric VXORPDrr)>; 11650b57cec5SDimitry Andric 11660b57cec5SDimitry Andricdef SBWriteFZeroIdiomY : SchedWriteVariant<[ 11670b57cec5SDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SBWriteZeroLatency]>, 11680b57cec5SDimitry Andric SchedVar<NoSchedPred, [WriteFLogicY]> 11690b57cec5SDimitry Andric]>; 11700b57cec5SDimitry Andricdef : InstRW<[SBWriteFZeroIdiomY], (instrs VXORPSYrr, VXORPDYrr)>; 11710b57cec5SDimitry Andric 11720b57cec5SDimitry Andricdef SBWriteVZeroIdiomLogicX : SchedWriteVariant<[ 11730b57cec5SDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SBWriteZeroLatency]>, 11740b57cec5SDimitry Andric SchedVar<NoSchedPred, [WriteVecLogicX]> 11750b57cec5SDimitry Andric]>; 11760b57cec5SDimitry Andricdef : InstRW<[SBWriteVZeroIdiomLogicX], (instrs PXORrr, VPXORrr)>; 11770b57cec5SDimitry Andric 11780b57cec5SDimitry Andricdef SBWriteVZeroIdiomALUX : SchedWriteVariant<[ 11790b57cec5SDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SBWriteZeroLatency]>, 11800b57cec5SDimitry Andric SchedVar<NoSchedPred, [WriteVecALUX]> 11810b57cec5SDimitry Andric]>; 11820b57cec5SDimitry Andricdef : InstRW<[SBWriteVZeroIdiomALUX], (instrs PSUBBrr, VPSUBBrr, 11830b57cec5SDimitry Andric PSUBDrr, VPSUBDrr, 11840b57cec5SDimitry Andric PSUBQrr, VPSUBQrr, 11850b57cec5SDimitry Andric PSUBWrr, VPSUBWrr, 11860b57cec5SDimitry Andric PCMPGTBrr, VPCMPGTBrr, 11870b57cec5SDimitry Andric PCMPGTDrr, VPCMPGTDrr, 11880b57cec5SDimitry Andric PCMPGTWrr, VPCMPGTWrr)>; 11890b57cec5SDimitry Andric 11900b57cec5SDimitry Andricdef SBWritePCMPGTQ : SchedWriteRes<[SBPort0]> { 11910b57cec5SDimitry Andric let Latency = 5; 11920b57cec5SDimitry Andric let NumMicroOps = 1; 1193*5f757f3fSDimitry Andric let ReleaseAtCycles = [1]; 11940b57cec5SDimitry Andric} 11950b57cec5SDimitry Andric 11960b57cec5SDimitry Andricdef SBWriteVZeroIdiomPCMPGTQ : SchedWriteVariant<[ 11970b57cec5SDimitry Andric SchedVar<MCSchedPredicate<ZeroIdiomPredicate>, [SBWriteZeroLatency]>, 11980b57cec5SDimitry Andric SchedVar<NoSchedPred, [SBWritePCMPGTQ]> 11990b57cec5SDimitry Andric]>; 12000b57cec5SDimitry Andricdef : InstRW<[SBWriteVZeroIdiomPCMPGTQ], (instrs PCMPGTQrr, VPCMPGTQrr)>; 12010b57cec5SDimitry Andric 12020b57cec5SDimitry Andric// CMOVs that use both Z and C flag require an extra uop. 12030b57cec5SDimitry Andricdef SBWriteCMOVA_CMOVBErr : SchedWriteRes<[SBPort05,SBPort015]> { 12040b57cec5SDimitry Andric let Latency = 3; 1205*5f757f3fSDimitry Andric let ReleaseAtCycles = [2,1]; 12060b57cec5SDimitry Andric let NumMicroOps = 3; 12070b57cec5SDimitry Andric} 12080b57cec5SDimitry Andric 12090b57cec5SDimitry Andricdef SBWriteCMOVA_CMOVBErm : SchedWriteRes<[SBPort23,SBPort05,SBPort015]> { 12100b57cec5SDimitry Andric let Latency = 8; 1211*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,2,1]; 12120b57cec5SDimitry Andric let NumMicroOps = 4; 12130b57cec5SDimitry Andric} 12140b57cec5SDimitry Andric 12150b57cec5SDimitry Andricdef SBCMOVA_CMOVBErr : SchedWriteVariant<[ 12160b57cec5SDimitry Andric SchedVar<MCSchedPredicate<IsCMOVArr_Or_CMOVBErr>, [SBWriteCMOVA_CMOVBErr]>, 12170b57cec5SDimitry Andric SchedVar<NoSchedPred, [WriteCMOV]> 12180b57cec5SDimitry Andric]>; 12190b57cec5SDimitry Andric 12200b57cec5SDimitry Andricdef SBCMOVA_CMOVBErm : SchedWriteVariant<[ 12210b57cec5SDimitry Andric SchedVar<MCSchedPredicate<IsCMOVArm_Or_CMOVBErm>, [SBWriteCMOVA_CMOVBErm]>, 12220b57cec5SDimitry Andric SchedVar<NoSchedPred, [WriteCMOV.Folded]> 12230b57cec5SDimitry Andric]>; 12240b57cec5SDimitry Andric 12250b57cec5SDimitry Andricdef : InstRW<[SBCMOVA_CMOVBErr], (instrs CMOV16rr, CMOV32rr, CMOV64rr)>; 12260b57cec5SDimitry Andricdef : InstRW<[SBCMOVA_CMOVBErm], (instrs CMOV16rm, CMOV32rm, CMOV64rm)>; 12270b57cec5SDimitry Andric 12280b57cec5SDimitry Andric// SETCCs that use both Z and C flag require an extra uop. 12290b57cec5SDimitry Andricdef SBWriteSETA_SETBEr : SchedWriteRes<[SBPort05]> { 12300b57cec5SDimitry Andric let Latency = 2; 1231*5f757f3fSDimitry Andric let ReleaseAtCycles = [2]; 12320b57cec5SDimitry Andric let NumMicroOps = 2; 12330b57cec5SDimitry Andric} 12340b57cec5SDimitry Andric 12350b57cec5SDimitry Andricdef SBWriteSETA_SETBEm : SchedWriteRes<[SBPort4,SBPort23,SBPort05]> { 12360b57cec5SDimitry Andric let Latency = 3; 1237*5f757f3fSDimitry Andric let ReleaseAtCycles = [1,1,2]; 12380b57cec5SDimitry Andric let NumMicroOps = 4; 12390b57cec5SDimitry Andric} 12400b57cec5SDimitry Andric 12410b57cec5SDimitry Andricdef SBSETA_SETBErr : SchedWriteVariant<[ 12420b57cec5SDimitry Andric SchedVar<MCSchedPredicate<IsSETAr_Or_SETBEr>, [SBWriteSETA_SETBEr]>, 12430b57cec5SDimitry Andric SchedVar<NoSchedPred, [WriteSETCC]> 12440b57cec5SDimitry Andric]>; 12450b57cec5SDimitry Andric 12460b57cec5SDimitry Andricdef SBSETA_SETBErm : SchedWriteVariant<[ 12470b57cec5SDimitry Andric SchedVar<MCSchedPredicate<IsSETAm_Or_SETBEm>, [SBWriteSETA_SETBEm]>, 12480b57cec5SDimitry Andric SchedVar<NoSchedPred, [WriteSETCCStore]> 12490b57cec5SDimitry Andric]>; 12500b57cec5SDimitry Andric 12510b57cec5SDimitry Andricdef : InstRW<[SBSETA_SETBErr], (instrs SETCCr)>; 12520b57cec5SDimitry Andricdef : InstRW<[SBSETA_SETBErm], (instrs SETCCm)>; 12530b57cec5SDimitry Andric 125404eeddc0SDimitry Andric/////////////////////////////////////////////////////////////////////////////// 125504eeddc0SDimitry Andric// Dependency breaking instructions. 125604eeddc0SDimitry Andric/////////////////////////////////////////////////////////////////////////////// 125704eeddc0SDimitry Andric 125804eeddc0SDimitry Andricdef : IsZeroIdiomFunction<[ 125904eeddc0SDimitry Andric // GPR Zero-idioms. 126004eeddc0SDimitry Andric DepBreakingClass<[ SUB32rr, SUB64rr, XOR32rr, XOR64rr ], ZeroIdiomPredicate>, 126104eeddc0SDimitry Andric 126204eeddc0SDimitry Andric // SSE Zero-idioms. 126304eeddc0SDimitry Andric DepBreakingClass<[ 126404eeddc0SDimitry Andric // fp variants. 126504eeddc0SDimitry Andric XORPSrr, XORPDrr, 126604eeddc0SDimitry Andric 126704eeddc0SDimitry Andric // int variants. 126804eeddc0SDimitry Andric PXORrr, 126904eeddc0SDimitry Andric PSUBBrr, PSUBWrr, PSUBDrr, PSUBQrr, 127004eeddc0SDimitry Andric PCMPGTBrr, PCMPGTDrr, PCMPGTQrr, PCMPGTWrr 127104eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 127204eeddc0SDimitry Andric 127304eeddc0SDimitry Andric // AVX Zero-idioms. 127404eeddc0SDimitry Andric DepBreakingClass<[ 127504eeddc0SDimitry Andric // xmm fp variants. 127604eeddc0SDimitry Andric VXORPSrr, VXORPDrr, 127704eeddc0SDimitry Andric 127804eeddc0SDimitry Andric // xmm int variants. 127904eeddc0SDimitry Andric VPXORrr, 128004eeddc0SDimitry Andric VPSUBBrr, VPSUBWrr, VPSUBDrr, VPSUBQrr, 128104eeddc0SDimitry Andric VPCMPGTBrr, VPCMPGTWrr, VPCMPGTDrr, VPCMPGTQrr, 128204eeddc0SDimitry Andric ], ZeroIdiomPredicate>, 128304eeddc0SDimitry Andric]>; 128404eeddc0SDimitry Andric 12850b57cec5SDimitry Andric} // SchedModel 1286