xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/X86/X86SchedSandyBridge.td (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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