xref: /netbsd-src/external/apache2/llvm/dist/llvm/lib/Target/X86/X86Schedule.td (revision 82d56013d7b633d116a93943de88e08335357a7c)
17330f729Sjoerg//===-- X86Schedule.td - X86 Scheduling Definitions --------*- tablegen -*-===//
27330f729Sjoerg//
37330f729Sjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47330f729Sjoerg// See https://llvm.org/LICENSE.txt for license information.
57330f729Sjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67330f729Sjoerg//
77330f729Sjoerg//===----------------------------------------------------------------------===//
87330f729Sjoerg
97330f729Sjoerg//===----------------------------------------------------------------------===//
107330f729Sjoerg// InstrSchedModel annotations for out-of-order CPUs.
117330f729Sjoerg
127330f729Sjoerg// Instructions with folded loads need to read the memory operand immediately,
137330f729Sjoerg// but other register operands don't have to be read until the load is ready.
147330f729Sjoerg// These operands are marked with ReadAfterLd.
157330f729Sjoergdef ReadAfterLd : SchedRead;
167330f729Sjoergdef ReadAfterVecLd : SchedRead;
177330f729Sjoergdef ReadAfterVecXLd : SchedRead;
187330f729Sjoergdef ReadAfterVecYLd : SchedRead;
197330f729Sjoerg
207330f729Sjoerg// Instructions that move data between general purpose registers and vector
217330f729Sjoerg// registers may be subject to extra latency due to data bypass delays.
227330f729Sjoerg// This SchedRead describes a bypass delay caused by data being moved from the
237330f729Sjoerg// integer unit to the floating point unit.
247330f729Sjoergdef ReadInt2Fpu : SchedRead;
257330f729Sjoerg
267330f729Sjoerg// Instructions with both a load and a store folded are modeled as a folded
277330f729Sjoerg// load + WriteRMW.
287330f729Sjoergdef WriteRMW : SchedWrite;
297330f729Sjoerg
307330f729Sjoerg// Helper to set SchedWrite ExePorts/Latency/ResourceCycles/NumMicroOps.
317330f729Sjoergmulticlass X86WriteRes<SchedWrite SchedRW,
327330f729Sjoerg                       list<ProcResourceKind> ExePorts,
337330f729Sjoerg                       int Lat, list<int> Res, int UOps> {
347330f729Sjoerg  def : WriteRes<SchedRW, ExePorts> {
357330f729Sjoerg    let Latency = Lat;
367330f729Sjoerg    let ResourceCycles = Res;
377330f729Sjoerg    let NumMicroOps = UOps;
387330f729Sjoerg  }
397330f729Sjoerg}
407330f729Sjoerg
417330f729Sjoerg// Most instructions can fold loads, so almost every SchedWrite comes in two
427330f729Sjoerg// variants: With and without a folded load.
437330f729Sjoerg// An X86FoldableSchedWrite holds a reference to the corresponding SchedWrite
447330f729Sjoerg// with a folded load.
457330f729Sjoergclass X86FoldableSchedWrite : SchedWrite {
467330f729Sjoerg  // The SchedWrite to use when a load is folded into the instruction.
477330f729Sjoerg  SchedWrite Folded;
487330f729Sjoerg  // The SchedRead to tag register operands than don't need to be ready
497330f729Sjoerg  // until the folded load has completed.
507330f729Sjoerg  SchedRead ReadAfterFold;
517330f729Sjoerg}
527330f729Sjoerg
537330f729Sjoerg// Multiclass that produces a linked pair of SchedWrites.
547330f729Sjoergmulticlass X86SchedWritePair<SchedRead ReadAfter = ReadAfterLd> {
557330f729Sjoerg  // Register-Memory operation.
567330f729Sjoerg  def Ld : SchedWrite;
577330f729Sjoerg  // Register-Register operation.
587330f729Sjoerg  def NAME : X86FoldableSchedWrite {
597330f729Sjoerg    let Folded = !cast<SchedWrite>(NAME#"Ld");
607330f729Sjoerg    let ReadAfterFold = ReadAfter;
617330f729Sjoerg  }
627330f729Sjoerg}
637330f729Sjoerg
647330f729Sjoerg// Helpers to mark SchedWrites as unsupported.
657330f729Sjoergmulticlass X86WriteResUnsupported<SchedWrite SchedRW> {
667330f729Sjoerg  let Unsupported = 1 in {
677330f729Sjoerg    def : WriteRes<SchedRW, []>;
687330f729Sjoerg  }
697330f729Sjoerg}
707330f729Sjoergmulticlass X86WriteResPairUnsupported<X86FoldableSchedWrite SchedRW> {
717330f729Sjoerg  let Unsupported = 1 in {
727330f729Sjoerg    def : WriteRes<SchedRW, []>;
737330f729Sjoerg    def : WriteRes<SchedRW.Folded, []>;
747330f729Sjoerg  }
757330f729Sjoerg}
767330f729Sjoerg
777330f729Sjoerg// Multiclass that wraps X86FoldableSchedWrite for each vector width.
787330f729Sjoergclass X86SchedWriteWidths<X86FoldableSchedWrite sScl,
797330f729Sjoerg                          X86FoldableSchedWrite s128,
807330f729Sjoerg                          X86FoldableSchedWrite s256,
817330f729Sjoerg                          X86FoldableSchedWrite s512> {
827330f729Sjoerg  X86FoldableSchedWrite Scl = sScl; // Scalar float/double operations.
837330f729Sjoerg  X86FoldableSchedWrite MMX = sScl; // MMX operations.
847330f729Sjoerg  X86FoldableSchedWrite XMM = s128; // XMM operations.
857330f729Sjoerg  X86FoldableSchedWrite YMM = s256; // YMM operations.
867330f729Sjoerg  X86FoldableSchedWrite ZMM = s512; // ZMM operations.
877330f729Sjoerg}
887330f729Sjoerg
897330f729Sjoerg// Multiclass that wraps X86SchedWriteWidths for each fp vector type.
907330f729Sjoergclass X86SchedWriteSizes<X86SchedWriteWidths sPS,
917330f729Sjoerg                         X86SchedWriteWidths sPD> {
927330f729Sjoerg  X86SchedWriteWidths PS = sPS;
937330f729Sjoerg  X86SchedWriteWidths PD = sPD;
947330f729Sjoerg}
957330f729Sjoerg
967330f729Sjoerg// Multiclass that wraps move/load/store triple for a vector width.
977330f729Sjoergclass X86SchedWriteMoveLS<SchedWrite MoveRR,
987330f729Sjoerg                          SchedWrite LoadRM,
997330f729Sjoerg                          SchedWrite StoreMR> {
1007330f729Sjoerg  SchedWrite RR = MoveRR;
1017330f729Sjoerg  SchedWrite RM = LoadRM;
1027330f729Sjoerg  SchedWrite MR = StoreMR;
1037330f729Sjoerg}
1047330f729Sjoerg
1057330f729Sjoerg// Multiclass that wraps masked load/store writes for a vector width.
1067330f729Sjoergclass X86SchedWriteMaskMove<SchedWrite LoadRM, SchedWrite StoreMR> {
1077330f729Sjoerg  SchedWrite RM = LoadRM;
1087330f729Sjoerg  SchedWrite MR = StoreMR;
1097330f729Sjoerg}
1107330f729Sjoerg
1117330f729Sjoerg// Multiclass that wraps X86SchedWriteMoveLS for each vector width.
1127330f729Sjoergclass X86SchedWriteMoveLSWidths<X86SchedWriteMoveLS sScl,
1137330f729Sjoerg                                X86SchedWriteMoveLS s128,
1147330f729Sjoerg                                X86SchedWriteMoveLS s256,
1157330f729Sjoerg                                X86SchedWriteMoveLS s512> {
1167330f729Sjoerg  X86SchedWriteMoveLS Scl = sScl; // Scalar float/double operations.
1177330f729Sjoerg  X86SchedWriteMoveLS MMX = sScl; // MMX operations.
1187330f729Sjoerg  X86SchedWriteMoveLS XMM = s128; // XMM operations.
1197330f729Sjoerg  X86SchedWriteMoveLS YMM = s256; // YMM operations.
1207330f729Sjoerg  X86SchedWriteMoveLS ZMM = s512; // ZMM operations.
1217330f729Sjoerg}
1227330f729Sjoerg
1237330f729Sjoerg// Loads, stores, and moves, not folded with other operations.
1247330f729Sjoergdef WriteLoad    : SchedWrite;
1257330f729Sjoergdef WriteStore   : SchedWrite;
1267330f729Sjoergdef WriteStoreNT : SchedWrite;
1277330f729Sjoergdef WriteMove    : SchedWrite;
1287330f729Sjoergdef WriteCopy    : WriteSequence<[WriteLoad, WriteStore]>; // mem->mem copy
1297330f729Sjoerg
1307330f729Sjoerg// Arithmetic.
1317330f729Sjoergdefm WriteALU    : X86SchedWritePair; // Simple integer ALU op.
1327330f729Sjoergdefm WriteADC    : X86SchedWritePair; // Integer ALU + flags op.
1337330f729Sjoergdef  WriteALURMW : WriteSequence<[WriteALULd, WriteRMW]>;
1347330f729Sjoergdef  WriteADCRMW : WriteSequence<[WriteADCLd, WriteRMW]>;
1357330f729Sjoergdef  WriteLEA    : SchedWrite;        // LEA instructions can't fold loads.
1367330f729Sjoerg
1377330f729Sjoerg// Integer multiplication
1387330f729Sjoergdefm WriteIMul8     : X86SchedWritePair; // Integer 8-bit multiplication.
1397330f729Sjoergdefm WriteIMul16    : X86SchedWritePair; // Integer 16-bit multiplication.
1407330f729Sjoergdefm WriteIMul16Imm : X86SchedWritePair; // Integer 16-bit multiplication by immediate.
1417330f729Sjoergdefm WriteIMul16Reg : X86SchedWritePair; // Integer 16-bit multiplication by register.
1427330f729Sjoergdefm WriteIMul32    : X86SchedWritePair; // Integer 32-bit multiplication.
1437330f729Sjoergdefm WriteIMul32Imm : X86SchedWritePair; // Integer 32-bit multiplication by immediate.
1447330f729Sjoergdefm WriteIMul32Reg : X86SchedWritePair; // Integer 32-bit multiplication by register.
1457330f729Sjoergdefm WriteIMul64    : X86SchedWritePair; // Integer 64-bit multiplication.
1467330f729Sjoergdefm WriteIMul64Imm : X86SchedWritePair; // Integer 64-bit multiplication by immediate.
1477330f729Sjoergdefm WriteIMul64Reg : X86SchedWritePair; // Integer 64-bit multiplication by register.
1487330f729Sjoergdef  WriteIMulH     : SchedWrite;        // Integer multiplication, high part.
1497330f729Sjoerg
1507330f729Sjoergdef  WriteBSWAP32 : SchedWrite; // Byte Order (Endianness) 32-bit Swap.
1517330f729Sjoergdef  WriteBSWAP64 : SchedWrite; // Byte Order (Endianness) 64-bit Swap.
1527330f729Sjoergdefm WriteCMPXCHG : X86SchedWritePair; // Compare and set, compare and swap.
1537330f729Sjoergdef  WriteCMPXCHGRMW : SchedWrite;     // Compare and set, compare and swap.
1547330f729Sjoergdef  WriteXCHG    : SchedWrite;        // Compare+Exchange - TODO RMW support.
1557330f729Sjoerg
1567330f729Sjoerg// Integer division.
1577330f729Sjoergdefm WriteDiv8   : X86SchedWritePair;
1587330f729Sjoergdefm WriteDiv16  : X86SchedWritePair;
1597330f729Sjoergdefm WriteDiv32  : X86SchedWritePair;
1607330f729Sjoergdefm WriteDiv64  : X86SchedWritePair;
1617330f729Sjoergdefm WriteIDiv8  : X86SchedWritePair;
1627330f729Sjoergdefm WriteIDiv16 : X86SchedWritePair;
1637330f729Sjoergdefm WriteIDiv32 : X86SchedWritePair;
1647330f729Sjoergdefm WriteIDiv64 : X86SchedWritePair;
1657330f729Sjoerg
1667330f729Sjoergdefm WriteBSF : X86SchedWritePair; // Bit scan forward.
1677330f729Sjoergdefm WriteBSR : X86SchedWritePair; // Bit scan reverse.
1687330f729Sjoergdefm WritePOPCNT : X86SchedWritePair; // Bit population count.
1697330f729Sjoergdefm WriteLZCNT : X86SchedWritePair; // Leading zero count.
1707330f729Sjoergdefm WriteTZCNT : X86SchedWritePair; // Trailing zero count.
1717330f729Sjoergdefm WriteCMOV  : X86SchedWritePair; // Conditional move.
1727330f729Sjoergdef  WriteFCMOV : SchedWrite; // X87 conditional move.
1737330f729Sjoergdef  WriteSETCC : SchedWrite; // Set register based on condition code.
1747330f729Sjoergdef  WriteSETCCStore : SchedWrite;
1757330f729Sjoergdef  WriteLAHFSAHF : SchedWrite; // Load/Store flags in AH.
1767330f729Sjoerg
1777330f729Sjoergdef  WriteBitTest      : SchedWrite; // Bit Test
1787330f729Sjoergdef  WriteBitTestImmLd : SchedWrite;
1797330f729Sjoergdef  WriteBitTestRegLd : SchedWrite;
1807330f729Sjoerg
1817330f729Sjoergdef  WriteBitTestSet       : SchedWrite; // Bit Test + Set
1827330f729Sjoergdef  WriteBitTestSetImmLd  : SchedWrite;
1837330f729Sjoergdef  WriteBitTestSetRegLd  : SchedWrite;
1847330f729Sjoergdef  WriteBitTestSetImmRMW : WriteSequence<[WriteBitTestSetImmLd, WriteRMW]>;
1857330f729Sjoergdef  WriteBitTestSetRegRMW : WriteSequence<[WriteBitTestSetRegLd, WriteRMW]>;
1867330f729Sjoerg
1877330f729Sjoerg// Integer shifts and rotates.
1887330f729Sjoergdefm WriteShift    : X86SchedWritePair;
1897330f729Sjoergdefm WriteShiftCL  : X86SchedWritePair;
1907330f729Sjoergdefm WriteRotate   : X86SchedWritePair;
1917330f729Sjoergdefm WriteRotateCL : X86SchedWritePair;
1927330f729Sjoerg
1937330f729Sjoerg// Double shift instructions.
1947330f729Sjoergdef  WriteSHDrri  : SchedWrite;
1957330f729Sjoergdef  WriteSHDrrcl : SchedWrite;
1967330f729Sjoergdef  WriteSHDmri  : SchedWrite;
1977330f729Sjoergdef  WriteSHDmrcl : SchedWrite;
1987330f729Sjoerg
1997330f729Sjoerg// BMI1 BEXTR/BLS, BMI2 BZHI
2007330f729Sjoergdefm WriteBEXTR : X86SchedWritePair;
2017330f729Sjoergdefm WriteBLS   : X86SchedWritePair;
2027330f729Sjoergdefm WriteBZHI  : X86SchedWritePair;
2037330f729Sjoerg
2047330f729Sjoerg// Idioms that clear a register, like xorps %xmm0, %xmm0.
2057330f729Sjoerg// These can often bypass execution ports completely.
2067330f729Sjoergdef WriteZero : SchedWrite;
2077330f729Sjoerg
2087330f729Sjoerg// Branches don't produce values, so they have no latency, but they still
2097330f729Sjoerg// consume resources. Indirect branches can fold loads.
2107330f729Sjoergdefm WriteJump : X86SchedWritePair;
2117330f729Sjoerg
2127330f729Sjoerg// Floating point. This covers both scalar and vector operations.
2137330f729Sjoergdef  WriteFLD0          : SchedWrite;
2147330f729Sjoergdef  WriteFLD1          : SchedWrite;
2157330f729Sjoergdef  WriteFLDC          : SchedWrite;
2167330f729Sjoergdef  WriteFLoad         : SchedWrite;
2177330f729Sjoergdef  WriteFLoadX        : SchedWrite;
2187330f729Sjoergdef  WriteFLoadY        : SchedWrite;
2197330f729Sjoergdef  WriteFMaskedLoad   : SchedWrite;
2207330f729Sjoergdef  WriteFMaskedLoadY  : SchedWrite;
2217330f729Sjoergdef  WriteFStore        : SchedWrite;
2227330f729Sjoergdef  WriteFStoreX       : SchedWrite;
2237330f729Sjoergdef  WriteFStoreY       : SchedWrite;
2247330f729Sjoergdef  WriteFStoreNT      : SchedWrite;
2257330f729Sjoergdef  WriteFStoreNTX     : SchedWrite;
2267330f729Sjoergdef  WriteFStoreNTY     : SchedWrite;
2277330f729Sjoerg
2287330f729Sjoergdef  WriteFMaskedStore32  : SchedWrite;
2297330f729Sjoergdef  WriteFMaskedStore64  : SchedWrite;
2307330f729Sjoergdef  WriteFMaskedStore32Y : SchedWrite;
2317330f729Sjoergdef  WriteFMaskedStore64Y : SchedWrite;
2327330f729Sjoerg
2337330f729Sjoergdef  WriteFMove         : SchedWrite;
2347330f729Sjoergdef  WriteFMoveX        : SchedWrite;
2357330f729Sjoergdef  WriteFMoveY        : SchedWrite;
2367330f729Sjoerg
2377330f729Sjoergdefm WriteFAdd    : X86SchedWritePair<ReadAfterVecLd>;  // Floating point add/sub.
2387330f729Sjoergdefm WriteFAddX   : X86SchedWritePair<ReadAfterVecXLd>; // Floating point add/sub (XMM).
2397330f729Sjoergdefm WriteFAddY   : X86SchedWritePair<ReadAfterVecYLd>; // Floating point add/sub (YMM).
2407330f729Sjoergdefm WriteFAddZ   : X86SchedWritePair<ReadAfterVecYLd>; // Floating point add/sub (ZMM).
2417330f729Sjoergdefm WriteFAdd64  : X86SchedWritePair<ReadAfterVecLd>;  // Floating point double add/sub.
2427330f729Sjoergdefm WriteFAdd64X : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double add/sub (XMM).
2437330f729Sjoergdefm WriteFAdd64Y : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double add/sub (YMM).
2447330f729Sjoergdefm WriteFAdd64Z : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double add/sub (ZMM).
2457330f729Sjoergdefm WriteFCmp    : X86SchedWritePair<ReadAfterVecLd>;  // Floating point compare.
2467330f729Sjoergdefm WriteFCmpX   : X86SchedWritePair<ReadAfterVecXLd>; // Floating point compare (XMM).
2477330f729Sjoergdefm WriteFCmpY   : X86SchedWritePair<ReadAfterVecYLd>; // Floating point compare (YMM).
2487330f729Sjoergdefm WriteFCmpZ   : X86SchedWritePair<ReadAfterVecYLd>; // Floating point compare (ZMM).
2497330f729Sjoergdefm WriteFCmp64  : X86SchedWritePair<ReadAfterVecLd>;  // Floating point double compare.
2507330f729Sjoergdefm WriteFCmp64X : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double compare (XMM).
2517330f729Sjoergdefm WriteFCmp64Y : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double compare (YMM).
2527330f729Sjoergdefm WriteFCmp64Z : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double compare (ZMM).
253*82d56013Sjoergdefm WriteFCom    : X86SchedWritePair<ReadAfterVecLd>;  // Floating point compare to flags (X87).
254*82d56013Sjoergdefm WriteFComX   : X86SchedWritePair<ReadAfterVecLd>;  // Floating point compare to flags (SSE).
2557330f729Sjoergdefm WriteFMul    : X86SchedWritePair<ReadAfterVecLd>;  // Floating point multiplication.
2567330f729Sjoergdefm WriteFMulX   : X86SchedWritePair<ReadAfterVecXLd>; // Floating point multiplication (XMM).
2577330f729Sjoergdefm WriteFMulY   : X86SchedWritePair<ReadAfterVecYLd>; // Floating point multiplication (YMM).
2587330f729Sjoergdefm WriteFMulZ   : X86SchedWritePair<ReadAfterVecYLd>; // Floating point multiplication (YMM).
2597330f729Sjoergdefm WriteFMul64  : X86SchedWritePair<ReadAfterVecLd>;  // Floating point double multiplication.
2607330f729Sjoergdefm WriteFMul64X : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double multiplication (XMM).
2617330f729Sjoergdefm WriteFMul64Y : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double multiplication (YMM).
2627330f729Sjoergdefm WriteFMul64Z : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double multiplication (ZMM).
2637330f729Sjoergdefm WriteFDiv    : X86SchedWritePair<ReadAfterVecLd>;  // Floating point division.
2647330f729Sjoergdefm WriteFDivX   : X86SchedWritePair<ReadAfterVecXLd>; // Floating point division (XMM).
2657330f729Sjoergdefm WriteFDivY   : X86SchedWritePair<ReadAfterVecYLd>; // Floating point division (YMM).
2667330f729Sjoergdefm WriteFDivZ   : X86SchedWritePair<ReadAfterVecYLd>; // Floating point division (ZMM).
2677330f729Sjoergdefm WriteFDiv64  : X86SchedWritePair<ReadAfterVecLd>;  // Floating point double division.
2687330f729Sjoergdefm WriteFDiv64X : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double division (XMM).
2697330f729Sjoergdefm WriteFDiv64Y : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double division (YMM).
2707330f729Sjoergdefm WriteFDiv64Z : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double division (ZMM).
2717330f729Sjoergdefm WriteFSqrt  : X86SchedWritePair<ReadAfterVecLd>;   // Floating point square root.
2727330f729Sjoergdefm WriteFSqrtX : X86SchedWritePair<ReadAfterVecXLd>;  // Floating point square root (XMM).
2737330f729Sjoergdefm WriteFSqrtY : X86SchedWritePair<ReadAfterVecYLd>;  // Floating point square root (YMM).
2747330f729Sjoergdefm WriteFSqrtZ : X86SchedWritePair<ReadAfterVecYLd>;  // Floating point square root (ZMM).
2757330f729Sjoergdefm WriteFSqrt64  : X86SchedWritePair<ReadAfterVecLd>;  // Floating point double square root.
2767330f729Sjoergdefm WriteFSqrt64X : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double square root (XMM).
2777330f729Sjoergdefm WriteFSqrt64Y : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double square root (YMM).
2787330f729Sjoergdefm WriteFSqrt64Z : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double square root (ZMM).
2797330f729Sjoergdefm WriteFSqrt80  : X86SchedWritePair<ReadAfterVecLd>;  // Floating point long double square root.
2807330f729Sjoergdefm WriteFRcp   : X86SchedWritePair<ReadAfterVecLd>;  // Floating point reciprocal estimate.
2817330f729Sjoergdefm WriteFRcpX  : X86SchedWritePair<ReadAfterVecXLd>; // Floating point reciprocal estimate (XMM).
2827330f729Sjoergdefm WriteFRcpY  : X86SchedWritePair<ReadAfterVecYLd>; // Floating point reciprocal estimate (YMM).
2837330f729Sjoergdefm WriteFRcpZ  : X86SchedWritePair<ReadAfterVecYLd>; // Floating point reciprocal estimate (ZMM).
2847330f729Sjoergdefm WriteFRsqrt : X86SchedWritePair<ReadAfterVecLd>;  // Floating point reciprocal square root estimate.
2857330f729Sjoergdefm WriteFRsqrtX: X86SchedWritePair<ReadAfterVecXLd>; // Floating point reciprocal square root estimate (XMM).
2867330f729Sjoergdefm WriteFRsqrtY: X86SchedWritePair<ReadAfterVecYLd>; // Floating point reciprocal square root estimate (YMM).
2877330f729Sjoergdefm WriteFRsqrtZ: X86SchedWritePair<ReadAfterVecYLd>; // Floating point reciprocal square root estimate (ZMM).
2887330f729Sjoergdefm WriteFMA    : X86SchedWritePair<ReadAfterVecLd>;  // Fused Multiply Add.
2897330f729Sjoergdefm WriteFMAX   : X86SchedWritePair<ReadAfterVecXLd>; // Fused Multiply Add (XMM).
2907330f729Sjoergdefm WriteFMAY   : X86SchedWritePair<ReadAfterVecYLd>; // Fused Multiply Add (YMM).
2917330f729Sjoergdefm WriteFMAZ   : X86SchedWritePair<ReadAfterVecYLd>; // Fused Multiply Add (ZMM).
2927330f729Sjoergdefm WriteDPPD   : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double dot product.
2937330f729Sjoergdefm WriteDPPS   : X86SchedWritePair<ReadAfterVecXLd>; // Floating point single dot product.
2947330f729Sjoergdefm WriteDPPSY  : X86SchedWritePair<ReadAfterVecYLd>; // Floating point single dot product (YMM).
2957330f729Sjoergdefm WriteDPPSZ  : X86SchedWritePair<ReadAfterVecYLd>; // Floating point single dot product (ZMM).
2967330f729Sjoergdefm WriteFSign  : X86SchedWritePair<ReadAfterVecLd>;  // Floating point fabs/fchs.
2977330f729Sjoergdefm WriteFRnd   : X86SchedWritePair<ReadAfterVecXLd>; // Floating point rounding.
2987330f729Sjoergdefm WriteFRndY  : X86SchedWritePair<ReadAfterVecYLd>; // Floating point rounding (YMM).
2997330f729Sjoergdefm WriteFRndZ  : X86SchedWritePair<ReadAfterVecYLd>; // Floating point rounding (ZMM).
3007330f729Sjoergdefm WriteFLogic  : X86SchedWritePair<ReadAfterVecXLd>; // Floating point and/or/xor logicals.
3017330f729Sjoergdefm WriteFLogicY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point and/or/xor logicals (YMM).
3027330f729Sjoergdefm WriteFLogicZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point and/or/xor logicals (ZMM).
3037330f729Sjoergdefm WriteFTest   : X86SchedWritePair<ReadAfterVecXLd>; // Floating point TEST instructions.
3047330f729Sjoergdefm WriteFTestY  : X86SchedWritePair<ReadAfterVecYLd>; // Floating point TEST instructions (YMM).
3057330f729Sjoergdefm WriteFTestZ  : X86SchedWritePair<ReadAfterVecYLd>; // Floating point TEST instructions (ZMM).
3067330f729Sjoergdefm WriteFShuffle  : X86SchedWritePair<ReadAfterVecXLd>; // Floating point vector shuffles.
3077330f729Sjoergdefm WriteFShuffleY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector shuffles (YMM).
3087330f729Sjoergdefm WriteFShuffleZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector shuffles (ZMM).
3097330f729Sjoergdefm WriteFVarShuffle  : X86SchedWritePair<ReadAfterVecXLd>; // Floating point vector variable shuffles.
3107330f729Sjoergdefm WriteFVarShuffleY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector variable shuffles (YMM).
3117330f729Sjoergdefm WriteFVarShuffleZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector variable shuffles (ZMM).
3127330f729Sjoergdefm WriteFBlend  : X86SchedWritePair<ReadAfterVecXLd>; // Floating point vector blends.
3137330f729Sjoergdefm WriteFBlendY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector blends (YMM).
3147330f729Sjoergdefm WriteFBlendZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector blends (ZMM).
3157330f729Sjoergdefm WriteFVarBlend  : X86SchedWritePair<ReadAfterVecXLd>; // Fp vector variable blends.
3167330f729Sjoergdefm WriteFVarBlendY : X86SchedWritePair<ReadAfterVecYLd>; // Fp vector variable blends (YMM).
3177330f729Sjoergdefm WriteFVarBlendZ : X86SchedWritePair<ReadAfterVecYLd>; // Fp vector variable blends (YMZMM).
3187330f729Sjoerg
3197330f729Sjoerg// FMA Scheduling helper class.
3207330f729Sjoergclass FMASC { X86FoldableSchedWrite Sched = WriteFAdd; }
3217330f729Sjoerg
3227330f729Sjoerg// Horizontal Add/Sub (float and integer)
3237330f729Sjoergdefm WriteFHAdd  : X86SchedWritePair<ReadAfterVecXLd>;
3247330f729Sjoergdefm WriteFHAddY : X86SchedWritePair<ReadAfterVecYLd>;
3257330f729Sjoergdefm WriteFHAddZ : X86SchedWritePair<ReadAfterVecYLd>;
3267330f729Sjoergdefm WritePHAdd  : X86SchedWritePair<ReadAfterVecLd>;
3277330f729Sjoergdefm WritePHAddX : X86SchedWritePair<ReadAfterVecXLd>;
3287330f729Sjoergdefm WritePHAddY : X86SchedWritePair<ReadAfterVecYLd>;
3297330f729Sjoergdefm WritePHAddZ : X86SchedWritePair<ReadAfterVecYLd>;
3307330f729Sjoerg
3317330f729Sjoerg// Vector integer operations.
3327330f729Sjoergdef  WriteVecLoad         : SchedWrite;
3337330f729Sjoergdef  WriteVecLoadX        : SchedWrite;
3347330f729Sjoergdef  WriteVecLoadY        : SchedWrite;
3357330f729Sjoergdef  WriteVecLoadNT       : SchedWrite;
3367330f729Sjoergdef  WriteVecLoadNTY      : SchedWrite;
3377330f729Sjoergdef  WriteVecMaskedLoad   : SchedWrite;
3387330f729Sjoergdef  WriteVecMaskedLoadY  : SchedWrite;
3397330f729Sjoergdef  WriteVecStore        : SchedWrite;
3407330f729Sjoergdef  WriteVecStoreX       : SchedWrite;
3417330f729Sjoergdef  WriteVecStoreY       : SchedWrite;
3427330f729Sjoergdef  WriteVecStoreNT      : SchedWrite;
3437330f729Sjoergdef  WriteVecStoreNTY     : SchedWrite;
344*82d56013Sjoergdef  WriteVecMaskedStore32  : SchedWrite;
345*82d56013Sjoergdef  WriteVecMaskedStore64  : SchedWrite;
346*82d56013Sjoergdef  WriteVecMaskedStore32Y : SchedWrite;
347*82d56013Sjoergdef  WriteVecMaskedStore64Y : SchedWrite;
3487330f729Sjoergdef  WriteVecMove         : SchedWrite;
3497330f729Sjoergdef  WriteVecMoveX        : SchedWrite;
3507330f729Sjoergdef  WriteVecMoveY        : SchedWrite;
3517330f729Sjoergdef  WriteVecMoveToGpr    : SchedWrite;
3527330f729Sjoergdef  WriteVecMoveFromGpr  : SchedWrite;
3537330f729Sjoerg
3547330f729Sjoergdefm WriteVecALU    : X86SchedWritePair<ReadAfterVecLd>;  // Vector integer ALU op, no logicals.
3557330f729Sjoergdefm WriteVecALUX   : X86SchedWritePair<ReadAfterVecXLd>; // Vector integer ALU op, no logicals (XMM).
3567330f729Sjoergdefm WriteVecALUY   : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer ALU op, no logicals (YMM).
3577330f729Sjoergdefm WriteVecALUZ   : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer ALU op, no logicals (ZMM).
3587330f729Sjoergdefm WriteVecLogic  : X86SchedWritePair<ReadAfterVecLd>;  // Vector integer and/or/xor logicals.
3597330f729Sjoergdefm WriteVecLogicX : X86SchedWritePair<ReadAfterVecXLd>; // Vector integer and/or/xor logicals (XMM).
3607330f729Sjoergdefm WriteVecLogicY : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer and/or/xor logicals (YMM).
3617330f729Sjoergdefm WriteVecLogicZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer and/or/xor logicals (ZMM).
3627330f729Sjoergdefm WriteVecTest  : X86SchedWritePair<ReadAfterVecXLd>;  // Vector integer TEST instructions.
3637330f729Sjoergdefm WriteVecTestY : X86SchedWritePair<ReadAfterVecYLd>;  // Vector integer TEST instructions (YMM).
3647330f729Sjoergdefm WriteVecTestZ : X86SchedWritePair<ReadAfterVecYLd>;  // Vector integer TEST instructions (ZMM).
3657330f729Sjoergdefm WriteVecShift  : X86SchedWritePair<ReadAfterVecLd>;  // Vector integer shifts (default).
3667330f729Sjoergdefm WriteVecShiftX : X86SchedWritePair<ReadAfterVecXLd>; // Vector integer shifts (XMM).
3677330f729Sjoergdefm WriteVecShiftY : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer shifts (YMM).
3687330f729Sjoergdefm WriteVecShiftZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer shifts (ZMM).
3697330f729Sjoergdefm WriteVecShiftImm : X86SchedWritePair<ReadAfterVecLd>;  // Vector integer immediate shifts (default).
3707330f729Sjoergdefm WriteVecShiftImmX: X86SchedWritePair<ReadAfterVecXLd>; // Vector integer immediate shifts (XMM).
3717330f729Sjoergdefm WriteVecShiftImmY: X86SchedWritePair<ReadAfterVecYLd>; // Vector integer immediate shifts (YMM).
3727330f729Sjoergdefm WriteVecShiftImmZ: X86SchedWritePair<ReadAfterVecYLd>; // Vector integer immediate shifts (ZMM).
3737330f729Sjoergdefm WriteVecIMul  : X86SchedWritePair<ReadAfterVecLd>;  // Vector integer multiply (default).
3747330f729Sjoergdefm WriteVecIMulX : X86SchedWritePair<ReadAfterVecXLd>; // Vector integer multiply (XMM).
3757330f729Sjoergdefm WriteVecIMulY : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer multiply (YMM).
3767330f729Sjoergdefm WriteVecIMulZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer multiply (ZMM).
3777330f729Sjoergdefm WritePMULLD   : X86SchedWritePair<ReadAfterVecXLd>; // Vector PMULLD.
3787330f729Sjoergdefm WritePMULLDY  : X86SchedWritePair<ReadAfterVecYLd>; // Vector PMULLD (YMM).
3797330f729Sjoergdefm WritePMULLDZ  : X86SchedWritePair<ReadAfterVecYLd>; // Vector PMULLD (ZMM).
3807330f729Sjoergdefm WriteShuffle  : X86SchedWritePair<ReadAfterVecLd>;  // Vector shuffles.
3817330f729Sjoergdefm WriteShuffleX : X86SchedWritePair<ReadAfterVecXLd>; // Vector shuffles (XMM).
3827330f729Sjoergdefm WriteShuffleY : X86SchedWritePair<ReadAfterVecYLd>; // Vector shuffles (YMM).
3837330f729Sjoergdefm WriteShuffleZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector shuffles (ZMM).
3847330f729Sjoergdefm WriteVarShuffle  : X86SchedWritePair<ReadAfterVecLd>;  // Vector variable shuffles.
3857330f729Sjoergdefm WriteVarShuffleX : X86SchedWritePair<ReadAfterVecXLd>; // Vector variable shuffles (XMM).
3867330f729Sjoergdefm WriteVarShuffleY : X86SchedWritePair<ReadAfterVecYLd>; // Vector variable shuffles (YMM).
3877330f729Sjoergdefm WriteVarShuffleZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector variable shuffles (ZMM).
3887330f729Sjoergdefm WriteBlend  : X86SchedWritePair<ReadAfterVecXLd>; // Vector blends.
3897330f729Sjoergdefm WriteBlendY : X86SchedWritePair<ReadAfterVecYLd>; // Vector blends (YMM).
3907330f729Sjoergdefm WriteBlendZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector blends (ZMM).
3917330f729Sjoergdefm WriteVarBlend  : X86SchedWritePair<ReadAfterVecXLd>; // Vector variable blends.
3927330f729Sjoergdefm WriteVarBlendY : X86SchedWritePair<ReadAfterVecYLd>; // Vector variable blends (YMM).
3937330f729Sjoergdefm WriteVarBlendZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector variable blends (ZMM).
3947330f729Sjoergdefm WritePSADBW  : X86SchedWritePair<ReadAfterVecLd>;  // Vector PSADBW.
3957330f729Sjoergdefm WritePSADBWX : X86SchedWritePair<ReadAfterVecXLd>; // Vector PSADBW (XMM).
3967330f729Sjoergdefm WritePSADBWY : X86SchedWritePair<ReadAfterVecYLd>; // Vector PSADBW (YMM).
3977330f729Sjoergdefm WritePSADBWZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector PSADBW (ZMM).
3987330f729Sjoergdefm WriteMPSAD  : X86SchedWritePair<ReadAfterVecXLd>; // Vector MPSAD.
3997330f729Sjoergdefm WriteMPSADY : X86SchedWritePair<ReadAfterVecYLd>; // Vector MPSAD (YMM).
4007330f729Sjoergdefm WriteMPSADZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector MPSAD (ZMM).
4017330f729Sjoergdefm WritePHMINPOS : X86SchedWritePair<ReadAfterVecXLd>;  // Vector PHMINPOS.
4027330f729Sjoerg
4037330f729Sjoerg// Vector insert/extract operations.
4047330f729Sjoergdefm WriteVecInsert : X86SchedWritePair; // Insert gpr to vector element.
4057330f729Sjoergdef  WriteVecExtract : SchedWrite; // Extract vector element to gpr.
4067330f729Sjoergdef  WriteVecExtractSt : SchedWrite; // Extract vector element and store.
4077330f729Sjoerg
4087330f729Sjoerg// MOVMSK operations.
4097330f729Sjoergdef WriteFMOVMSK    : SchedWrite;
4107330f729Sjoergdef WriteVecMOVMSK  : SchedWrite;
4117330f729Sjoergdef WriteVecMOVMSKY : SchedWrite;
4127330f729Sjoergdef WriteMMXMOVMSK  : SchedWrite;
4137330f729Sjoerg
4147330f729Sjoerg// Conversion between integer and float.
4157330f729Sjoergdefm WriteCvtSD2I  : X86SchedWritePair<ReadAfterVecLd>;  // Double -> Integer.
4167330f729Sjoergdefm WriteCvtPD2I  : X86SchedWritePair<ReadAfterVecXLd>; // Double -> Integer (XMM).
4177330f729Sjoergdefm WriteCvtPD2IY : X86SchedWritePair<ReadAfterVecYLd>; // Double -> Integer (YMM).
4187330f729Sjoergdefm WriteCvtPD2IZ : X86SchedWritePair<ReadAfterVecYLd>; // Double -> Integer (ZMM).
4197330f729Sjoerg
4207330f729Sjoergdefm WriteCvtSS2I  : X86SchedWritePair<ReadAfterVecLd>;  // Float -> Integer.
4217330f729Sjoergdefm WriteCvtPS2I  : X86SchedWritePair<ReadAfterVecXLd>; // Float -> Integer (XMM).
4227330f729Sjoergdefm WriteCvtPS2IY : X86SchedWritePair<ReadAfterVecYLd>; // Float -> Integer (YMM).
4237330f729Sjoergdefm WriteCvtPS2IZ : X86SchedWritePair<ReadAfterVecYLd>; // Float -> Integer (ZMM).
4247330f729Sjoerg
4257330f729Sjoergdefm WriteCvtI2SD  : X86SchedWritePair<ReadAfterVecLd>;  // Integer -> Double.
4267330f729Sjoergdefm WriteCvtI2PD  : X86SchedWritePair<ReadAfterVecXLd>; // Integer -> Double (XMM).
4277330f729Sjoergdefm WriteCvtI2PDY : X86SchedWritePair<ReadAfterVecYLd>; // Integer -> Double (YMM).
4287330f729Sjoergdefm WriteCvtI2PDZ : X86SchedWritePair<ReadAfterVecYLd>; // Integer -> Double (ZMM).
4297330f729Sjoerg
4307330f729Sjoergdefm WriteCvtI2SS  : X86SchedWritePair<ReadAfterVecLd>;  // Integer -> Float.
4317330f729Sjoergdefm WriteCvtI2PS  : X86SchedWritePair<ReadAfterVecXLd>; // Integer -> Float (XMM).
4327330f729Sjoergdefm WriteCvtI2PSY : X86SchedWritePair<ReadAfterVecYLd>; // Integer -> Float (YMM).
4337330f729Sjoergdefm WriteCvtI2PSZ : X86SchedWritePair<ReadAfterVecYLd>; // Integer -> Float (ZMM).
4347330f729Sjoerg
4357330f729Sjoergdefm WriteCvtSS2SD  : X86SchedWritePair<ReadAfterVecLd>;  // Float -> Double size conversion.
4367330f729Sjoergdefm WriteCvtPS2PD  : X86SchedWritePair<ReadAfterVecXLd>; // Float -> Double size conversion (XMM).
4377330f729Sjoergdefm WriteCvtPS2PDY : X86SchedWritePair<ReadAfterVecYLd>; // Float -> Double size conversion (YMM).
4387330f729Sjoergdefm WriteCvtPS2PDZ : X86SchedWritePair<ReadAfterVecYLd>; // Float -> Double size conversion (ZMM).
4397330f729Sjoerg
4407330f729Sjoergdefm WriteCvtSD2SS  : X86SchedWritePair<ReadAfterVecLd>;  // Double -> Float size conversion.
4417330f729Sjoergdefm WriteCvtPD2PS  : X86SchedWritePair<ReadAfterVecXLd>; // Double -> Float size conversion (XMM).
4427330f729Sjoergdefm WriteCvtPD2PSY : X86SchedWritePair<ReadAfterVecYLd>; // Double -> Float size conversion (YMM).
4437330f729Sjoergdefm WriteCvtPD2PSZ : X86SchedWritePair<ReadAfterVecYLd>; // Double -> Float size conversion (ZMM).
4447330f729Sjoerg
4457330f729Sjoergdefm WriteCvtPH2PS  : X86SchedWritePair<ReadAfterVecXLd>; // Half -> Float size conversion.
4467330f729Sjoergdefm WriteCvtPH2PSY : X86SchedWritePair<ReadAfterVecYLd>; // Half -> Float size conversion (YMM).
4477330f729Sjoergdefm WriteCvtPH2PSZ : X86SchedWritePair<ReadAfterVecYLd>; // Half -> Float size conversion (ZMM).
4487330f729Sjoerg
4497330f729Sjoergdef  WriteCvtPS2PH    : SchedWrite; // // Float -> Half size conversion.
4507330f729Sjoergdef  WriteCvtPS2PHY   : SchedWrite; // // Float -> Half size conversion (YMM).
4517330f729Sjoergdef  WriteCvtPS2PHZ   : SchedWrite; // // Float -> Half size conversion (ZMM).
4527330f729Sjoergdef  WriteCvtPS2PHSt  : SchedWrite; // // Float -> Half + store size conversion.
4537330f729Sjoergdef  WriteCvtPS2PHYSt : SchedWrite; // // Float -> Half + store size conversion (YMM).
4547330f729Sjoergdef  WriteCvtPS2PHZSt : SchedWrite; // // Float -> Half + store size conversion (ZMM).
4557330f729Sjoerg
4567330f729Sjoerg// CRC32 instruction.
4577330f729Sjoergdefm WriteCRC32 : X86SchedWritePair<ReadAfterLd>;
4587330f729Sjoerg
4597330f729Sjoerg// Strings instructions.
4607330f729Sjoerg// Packed Compare Implicit Length Strings, Return Mask
4617330f729Sjoergdefm WritePCmpIStrM : X86SchedWritePair<ReadAfterVecXLd>;
4627330f729Sjoerg// Packed Compare Explicit Length Strings, Return Mask
4637330f729Sjoergdefm WritePCmpEStrM : X86SchedWritePair<ReadAfterVecXLd>;
4647330f729Sjoerg// Packed Compare Implicit Length Strings, Return Index
4657330f729Sjoergdefm WritePCmpIStrI : X86SchedWritePair<ReadAfterVecXLd>;
4667330f729Sjoerg// Packed Compare Explicit Length Strings, Return Index
4677330f729Sjoergdefm WritePCmpEStrI : X86SchedWritePair<ReadAfterVecXLd>;
4687330f729Sjoerg
4697330f729Sjoerg// AES instructions.
4707330f729Sjoergdefm WriteAESDecEnc : X86SchedWritePair<ReadAfterVecXLd>; // Decryption, encryption.
4717330f729Sjoergdefm WriteAESIMC : X86SchedWritePair<ReadAfterVecXLd>; // InvMixColumn.
4727330f729Sjoergdefm WriteAESKeyGen : X86SchedWritePair<ReadAfterVecXLd>; // Key Generation.
4737330f729Sjoerg
4747330f729Sjoerg// Carry-less multiplication instructions.
4757330f729Sjoergdefm WriteCLMul : X86SchedWritePair<ReadAfterVecXLd>;
4767330f729Sjoerg
4777330f729Sjoerg// EMMS/FEMMS
4787330f729Sjoergdef WriteEMMS : SchedWrite;
4797330f729Sjoerg
4807330f729Sjoerg// Load/store MXCSR
4817330f729Sjoergdef WriteLDMXCSR : SchedWrite;
4827330f729Sjoergdef WriteSTMXCSR : SchedWrite;
4837330f729Sjoerg
4847330f729Sjoerg// Catch-all for expensive system instructions.
4857330f729Sjoergdef WriteSystem : SchedWrite;
4867330f729Sjoerg
4877330f729Sjoerg// AVX2.
4887330f729Sjoergdefm WriteFShuffle256 : X86SchedWritePair<ReadAfterVecYLd>; // Fp 256-bit width vector shuffles.
4897330f729Sjoergdefm WriteFVarShuffle256 : X86SchedWritePair<ReadAfterVecYLd>; // Fp 256-bit width variable shuffles.
4907330f729Sjoergdefm WriteShuffle256 : X86SchedWritePair<ReadAfterVecYLd>; // 256-bit width vector shuffles.
491*82d56013Sjoergdefm WriteVPMOV256 : X86SchedWritePair<ReadAfterVecYLd>; // 256-bit width packed vector width-changing move.
4927330f729Sjoergdefm WriteVarShuffle256 : X86SchedWritePair<ReadAfterVecYLd>; // 256-bit width vector variable shuffles.
4937330f729Sjoergdefm WriteVarVecShift  : X86SchedWritePair<ReadAfterVecXLd>; // Variable vector shifts.
4947330f729Sjoergdefm WriteVarVecShiftY : X86SchedWritePair<ReadAfterVecYLd>; // Variable vector shifts (YMM).
4957330f729Sjoergdefm WriteVarVecShiftZ : X86SchedWritePair<ReadAfterVecYLd>; // Variable vector shifts (ZMM).
4967330f729Sjoerg
4977330f729Sjoerg// Old microcoded instructions that nobody use.
4987330f729Sjoergdef WriteMicrocoded : SchedWrite;
4997330f729Sjoerg
5007330f729Sjoerg// Fence instructions.
5017330f729Sjoergdef WriteFence : SchedWrite;
5027330f729Sjoerg
5037330f729Sjoerg// Nop, not very useful expect it provides a model for nops!
5047330f729Sjoergdef WriteNop : SchedWrite;
5057330f729Sjoerg
5067330f729Sjoerg// Move/Load/Store wrappers.
5077330f729Sjoergdef WriteFMoveLS
5087330f729Sjoerg : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStore>;
5097330f729Sjoergdef WriteFMoveLSX
5107330f729Sjoerg : X86SchedWriteMoveLS<WriteFMoveX, WriteFLoadX, WriteFStoreX>;
5117330f729Sjoergdef WriteFMoveLSY
5127330f729Sjoerg : X86SchedWriteMoveLS<WriteFMoveY, WriteFLoadY, WriteFStoreY>;
5137330f729Sjoergdef SchedWriteFMoveLS
5147330f729Sjoerg  : X86SchedWriteMoveLSWidths<WriteFMoveLS, WriteFMoveLSX,
5157330f729Sjoerg                              WriteFMoveLSY, WriteFMoveLSY>;
5167330f729Sjoerg
5177330f729Sjoergdef WriteFMoveLSNT
5187330f729Sjoerg : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStoreNT>;
5197330f729Sjoergdef WriteFMoveLSNTX
5207330f729Sjoerg : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStoreNTX>;
5217330f729Sjoergdef WriteFMoveLSNTY
5227330f729Sjoerg : X86SchedWriteMoveLS<WriteFMoveY, WriteFLoadY, WriteFStoreNTY>;
5237330f729Sjoergdef SchedWriteFMoveLSNT
5247330f729Sjoerg  : X86SchedWriteMoveLSWidths<WriteFMoveLSNT, WriteFMoveLSNTX,
5257330f729Sjoerg                              WriteFMoveLSNTY, WriteFMoveLSNTY>;
5267330f729Sjoerg
5277330f729Sjoergdef WriteVecMoveLS
5287330f729Sjoerg : X86SchedWriteMoveLS<WriteVecMove, WriteVecLoad, WriteVecStore>;
5297330f729Sjoergdef WriteVecMoveLSX
5307330f729Sjoerg : X86SchedWriteMoveLS<WriteVecMoveX, WriteVecLoadX, WriteVecStoreX>;
5317330f729Sjoergdef WriteVecMoveLSY
5327330f729Sjoerg : X86SchedWriteMoveLS<WriteVecMoveY, WriteVecLoadY, WriteVecStoreY>;
5337330f729Sjoergdef SchedWriteVecMoveLS
5347330f729Sjoerg  : X86SchedWriteMoveLSWidths<WriteVecMoveLS, WriteVecMoveLSX,
5357330f729Sjoerg                              WriteVecMoveLSY, WriteVecMoveLSY>;
5367330f729Sjoerg
5377330f729Sjoergdef WriteVecMoveLSNT
5387330f729Sjoerg : X86SchedWriteMoveLS<WriteVecMove, WriteVecLoadNT, WriteVecStoreNT>;
5397330f729Sjoergdef WriteVecMoveLSNTX
5407330f729Sjoerg : X86SchedWriteMoveLS<WriteVecMoveX, WriteVecLoadNT, WriteVecStoreNT>;
5417330f729Sjoergdef WriteVecMoveLSNTY
5427330f729Sjoerg : X86SchedWriteMoveLS<WriteVecMoveY, WriteVecLoadNTY, WriteVecStoreNTY>;
5437330f729Sjoergdef SchedWriteVecMoveLSNT
5447330f729Sjoerg  : X86SchedWriteMoveLSWidths<WriteVecMoveLSNT, WriteVecMoveLSNTX,
5457330f729Sjoerg                              WriteVecMoveLSNTY, WriteVecMoveLSNTY>;
5467330f729Sjoerg
5477330f729Sjoerg// Conditional SIMD Packed Loads and Stores wrappers.
5487330f729Sjoergdef WriteFMaskMove32
5497330f729Sjoerg  : X86SchedWriteMaskMove<WriteFMaskedLoad, WriteFMaskedStore32>;
5507330f729Sjoergdef WriteFMaskMove64
5517330f729Sjoerg  : X86SchedWriteMaskMove<WriteFMaskedLoad, WriteFMaskedStore64>;
5527330f729Sjoergdef WriteFMaskMove32Y
5537330f729Sjoerg  : X86SchedWriteMaskMove<WriteFMaskedLoadY, WriteFMaskedStore32Y>;
5547330f729Sjoergdef WriteFMaskMove64Y
5557330f729Sjoerg  : X86SchedWriteMaskMove<WriteFMaskedLoadY, WriteFMaskedStore64Y>;
556*82d56013Sjoergdef WriteVecMaskMove32
557*82d56013Sjoerg  : X86SchedWriteMaskMove<WriteVecMaskedLoad, WriteVecMaskedStore32>;
558*82d56013Sjoergdef WriteVecMaskMove64
559*82d56013Sjoerg  : X86SchedWriteMaskMove<WriteVecMaskedLoad, WriteVecMaskedStore64>;
560*82d56013Sjoergdef WriteVecMaskMove32Y
561*82d56013Sjoerg  : X86SchedWriteMaskMove<WriteVecMaskedLoadY, WriteVecMaskedStore32Y>;
562*82d56013Sjoergdef WriteVecMaskMove64Y
563*82d56013Sjoerg  : X86SchedWriteMaskMove<WriteVecMaskedLoadY, WriteVecMaskedStore64Y>;
5647330f729Sjoerg
5657330f729Sjoerg// Vector width wrappers.
5667330f729Sjoergdef SchedWriteFAdd
5677330f729Sjoerg : X86SchedWriteWidths<WriteFAdd, WriteFAddX, WriteFAddY, WriteFAddZ>;
5687330f729Sjoergdef SchedWriteFAdd64
5697330f729Sjoerg : X86SchedWriteWidths<WriteFAdd64, WriteFAdd64X, WriteFAdd64Y, WriteFAdd64Z>;
5707330f729Sjoergdef SchedWriteFHAdd
5717330f729Sjoerg : X86SchedWriteWidths<WriteFHAdd, WriteFHAdd, WriteFHAddY, WriteFHAddZ>;
5727330f729Sjoergdef SchedWriteFCmp
5737330f729Sjoerg : X86SchedWriteWidths<WriteFCmp, WriteFCmpX, WriteFCmpY, WriteFCmpZ>;
5747330f729Sjoergdef SchedWriteFCmp64
5757330f729Sjoerg : X86SchedWriteWidths<WriteFCmp64, WriteFCmp64X, WriteFCmp64Y, WriteFCmp64Z>;
5767330f729Sjoergdef SchedWriteFMul
5777330f729Sjoerg : X86SchedWriteWidths<WriteFMul, WriteFMulX, WriteFMulY, WriteFMulZ>;
5787330f729Sjoergdef SchedWriteFMul64
5797330f729Sjoerg : X86SchedWriteWidths<WriteFMul64, WriteFMul64X, WriteFMul64Y, WriteFMul64Z>;
5807330f729Sjoergdef SchedWriteFMA
5817330f729Sjoerg : X86SchedWriteWidths<WriteFMA, WriteFMAX, WriteFMAY, WriteFMAZ>;
5827330f729Sjoergdef SchedWriteDPPD
5837330f729Sjoerg : X86SchedWriteWidths<WriteDPPD, WriteDPPD, WriteDPPD, WriteDPPD>;
5847330f729Sjoergdef SchedWriteDPPS
5857330f729Sjoerg : X86SchedWriteWidths<WriteDPPS, WriteDPPS, WriteDPPSY, WriteDPPSZ>;
5867330f729Sjoergdef SchedWriteFDiv
5877330f729Sjoerg : X86SchedWriteWidths<WriteFDiv, WriteFDivX, WriteFDivY, WriteFDivZ>;
5887330f729Sjoergdef SchedWriteFDiv64
5897330f729Sjoerg : X86SchedWriteWidths<WriteFDiv64, WriteFDiv64X, WriteFDiv64Y, WriteFDiv64Z>;
5907330f729Sjoergdef SchedWriteFSqrt
5917330f729Sjoerg : X86SchedWriteWidths<WriteFSqrt, WriteFSqrtX,
5927330f729Sjoerg                       WriteFSqrtY, WriteFSqrtZ>;
5937330f729Sjoergdef SchedWriteFSqrt64
5947330f729Sjoerg : X86SchedWriteWidths<WriteFSqrt64, WriteFSqrt64X,
5957330f729Sjoerg                       WriteFSqrt64Y, WriteFSqrt64Z>;
5967330f729Sjoergdef SchedWriteFRcp
5977330f729Sjoerg : X86SchedWriteWidths<WriteFRcp, WriteFRcpX, WriteFRcpY, WriteFRcpZ>;
5987330f729Sjoergdef SchedWriteFRsqrt
5997330f729Sjoerg : X86SchedWriteWidths<WriteFRsqrt, WriteFRsqrtX, WriteFRsqrtY, WriteFRsqrtZ>;
6007330f729Sjoergdef SchedWriteFRnd
6017330f729Sjoerg : X86SchedWriteWidths<WriteFRnd, WriteFRnd, WriteFRndY, WriteFRndZ>;
6027330f729Sjoergdef SchedWriteFLogic
6037330f729Sjoerg : X86SchedWriteWidths<WriteFLogic, WriteFLogic, WriteFLogicY, WriteFLogicZ>;
6047330f729Sjoergdef SchedWriteFTest
6057330f729Sjoerg : X86SchedWriteWidths<WriteFTest, WriteFTest, WriteFTestY, WriteFTestZ>;
6067330f729Sjoerg
6077330f729Sjoergdef SchedWriteFShuffle
6087330f729Sjoerg : X86SchedWriteWidths<WriteFShuffle, WriteFShuffle,
6097330f729Sjoerg                       WriteFShuffleY, WriteFShuffleZ>;
6107330f729Sjoergdef SchedWriteFVarShuffle
6117330f729Sjoerg : X86SchedWriteWidths<WriteFVarShuffle, WriteFVarShuffle,
6127330f729Sjoerg                       WriteFVarShuffleY, WriteFVarShuffleZ>;
6137330f729Sjoergdef SchedWriteFBlend
6147330f729Sjoerg : X86SchedWriteWidths<WriteFBlend, WriteFBlend, WriteFBlendY, WriteFBlendZ>;
6157330f729Sjoergdef SchedWriteFVarBlend
6167330f729Sjoerg : X86SchedWriteWidths<WriteFVarBlend, WriteFVarBlend,
6177330f729Sjoerg                       WriteFVarBlendY, WriteFVarBlendZ>;
6187330f729Sjoerg
6197330f729Sjoergdef SchedWriteCvtDQ2PD
6207330f729Sjoerg : X86SchedWriteWidths<WriteCvtI2SD, WriteCvtI2PD,
6217330f729Sjoerg                       WriteCvtI2PDY, WriteCvtI2PDZ>;
6227330f729Sjoergdef SchedWriteCvtDQ2PS
6237330f729Sjoerg : X86SchedWriteWidths<WriteCvtI2SS, WriteCvtI2PS,
6247330f729Sjoerg                       WriteCvtI2PSY, WriteCvtI2PSZ>;
6257330f729Sjoergdef SchedWriteCvtPD2DQ
6267330f729Sjoerg : X86SchedWriteWidths<WriteCvtSD2I, WriteCvtPD2I,
6277330f729Sjoerg                       WriteCvtPD2IY, WriteCvtPD2IZ>;
6287330f729Sjoergdef SchedWriteCvtPS2DQ
6297330f729Sjoerg : X86SchedWriteWidths<WriteCvtSS2I, WriteCvtPS2I,
6307330f729Sjoerg                       WriteCvtPS2IY, WriteCvtPS2IZ>;
6317330f729Sjoergdef SchedWriteCvtPS2PD
6327330f729Sjoerg : X86SchedWriteWidths<WriteCvtSS2SD, WriteCvtPS2PD,
6337330f729Sjoerg                       WriteCvtPS2PDY, WriteCvtPS2PDZ>;
6347330f729Sjoergdef SchedWriteCvtPD2PS
6357330f729Sjoerg : X86SchedWriteWidths<WriteCvtSD2SS, WriteCvtPD2PS,
6367330f729Sjoerg                       WriteCvtPD2PSY, WriteCvtPD2PSZ>;
6377330f729Sjoerg
6387330f729Sjoergdef SchedWriteVecALU
6397330f729Sjoerg : X86SchedWriteWidths<WriteVecALU, WriteVecALUX, WriteVecALUY, WriteVecALUZ>;
6407330f729Sjoergdef SchedWritePHAdd
6417330f729Sjoerg : X86SchedWriteWidths<WritePHAdd, WritePHAddX, WritePHAddY, WritePHAddZ>;
6427330f729Sjoergdef SchedWriteVecLogic
6437330f729Sjoerg : X86SchedWriteWidths<WriteVecLogic, WriteVecLogicX,
6447330f729Sjoerg                       WriteVecLogicY, WriteVecLogicZ>;
6457330f729Sjoergdef SchedWriteVecTest
6467330f729Sjoerg : X86SchedWriteWidths<WriteVecTest, WriteVecTest,
6477330f729Sjoerg                       WriteVecTestY, WriteVecTestZ>;
6487330f729Sjoergdef SchedWriteVecShift
6497330f729Sjoerg : X86SchedWriteWidths<WriteVecShift, WriteVecShiftX,
6507330f729Sjoerg                       WriteVecShiftY, WriteVecShiftZ>;
6517330f729Sjoergdef SchedWriteVecShiftImm
6527330f729Sjoerg : X86SchedWriteWidths<WriteVecShiftImm, WriteVecShiftImmX,
6537330f729Sjoerg                       WriteVecShiftImmY, WriteVecShiftImmZ>;
6547330f729Sjoergdef SchedWriteVarVecShift
6557330f729Sjoerg : X86SchedWriteWidths<WriteVarVecShift, WriteVarVecShift,
6567330f729Sjoerg                       WriteVarVecShiftY, WriteVarVecShiftZ>;
6577330f729Sjoergdef SchedWriteVecIMul
6587330f729Sjoerg : X86SchedWriteWidths<WriteVecIMul, WriteVecIMulX,
6597330f729Sjoerg                       WriteVecIMulY, WriteVecIMulZ>;
6607330f729Sjoergdef SchedWritePMULLD
6617330f729Sjoerg : X86SchedWriteWidths<WritePMULLD, WritePMULLD,
6627330f729Sjoerg                       WritePMULLDY, WritePMULLDZ>;
6637330f729Sjoergdef SchedWriteMPSAD
6647330f729Sjoerg : X86SchedWriteWidths<WriteMPSAD, WriteMPSAD,
6657330f729Sjoerg                       WriteMPSADY, WriteMPSADZ>;
6667330f729Sjoergdef SchedWritePSADBW
6677330f729Sjoerg : X86SchedWriteWidths<WritePSADBW, WritePSADBWX,
6687330f729Sjoerg                       WritePSADBWY, WritePSADBWZ>;
6697330f729Sjoerg
6707330f729Sjoergdef SchedWriteShuffle
6717330f729Sjoerg : X86SchedWriteWidths<WriteShuffle, WriteShuffleX,
6727330f729Sjoerg                       WriteShuffleY, WriteShuffleZ>;
6737330f729Sjoergdef SchedWriteVarShuffle
6747330f729Sjoerg : X86SchedWriteWidths<WriteVarShuffle, WriteVarShuffleX,
6757330f729Sjoerg                       WriteVarShuffleY, WriteVarShuffleZ>;
6767330f729Sjoergdef SchedWriteBlend
6777330f729Sjoerg : X86SchedWriteWidths<WriteBlend, WriteBlend, WriteBlendY, WriteBlendZ>;
6787330f729Sjoergdef SchedWriteVarBlend
6797330f729Sjoerg : X86SchedWriteWidths<WriteVarBlend, WriteVarBlend,
6807330f729Sjoerg                       WriteVarBlendY, WriteVarBlendZ>;
6817330f729Sjoerg
6827330f729Sjoerg// Vector size wrappers.
6837330f729Sjoergdef SchedWriteFAddSizes
6847330f729Sjoerg : X86SchedWriteSizes<SchedWriteFAdd, SchedWriteFAdd64>;
6857330f729Sjoergdef SchedWriteFCmpSizes
6867330f729Sjoerg : X86SchedWriteSizes<SchedWriteFCmp, SchedWriteFCmp64>;
6877330f729Sjoergdef SchedWriteFMulSizes
6887330f729Sjoerg : X86SchedWriteSizes<SchedWriteFMul, SchedWriteFMul64>;
6897330f729Sjoergdef SchedWriteFDivSizes
6907330f729Sjoerg : X86SchedWriteSizes<SchedWriteFDiv, SchedWriteFDiv64>;
6917330f729Sjoergdef SchedWriteFSqrtSizes
6927330f729Sjoerg : X86SchedWriteSizes<SchedWriteFSqrt, SchedWriteFSqrt64>;
6937330f729Sjoergdef SchedWriteFLogicSizes
6947330f729Sjoerg : X86SchedWriteSizes<SchedWriteFLogic, SchedWriteFLogic>;
6957330f729Sjoergdef SchedWriteFShuffleSizes
6967330f729Sjoerg : X86SchedWriteSizes<SchedWriteFShuffle, SchedWriteFShuffle>;
6977330f729Sjoerg
6987330f729Sjoerg//===----------------------------------------------------------------------===//
6997330f729Sjoerg// Generic Processor Scheduler Models.
7007330f729Sjoerg
7017330f729Sjoerg// IssueWidth is analogous to the number of decode units. Core and its
7027330f729Sjoerg// descendents, including Nehalem and SandyBridge have 4 decoders.
7037330f729Sjoerg// Resources beyond the decoder operate on micro-ops and are bufferred
7047330f729Sjoerg// so adjacent micro-ops don't directly compete.
7057330f729Sjoerg//
7067330f729Sjoerg// MicroOpBufferSize > 1 indicates that RAW dependencies can be
7077330f729Sjoerg// decoded in the same cycle. The value 32 is a reasonably arbitrary
7087330f729Sjoerg// number of in-flight instructions.
7097330f729Sjoerg//
7107330f729Sjoerg// HighLatency=10 is optimistic. X86InstrInfo::isHighLatencyDef
7117330f729Sjoerg// indicates high latency opcodes. Alternatively, InstrItinData
7127330f729Sjoerg// entries may be included here to define specific operand
7137330f729Sjoerg// latencies. Since these latencies are not used for pipeline hazards,
7147330f729Sjoerg// they do not need to be exact.
7157330f729Sjoerg//
7167330f729Sjoerg// The GenericX86Model contains no instruction schedules
7177330f729Sjoerg// and disables PostRAScheduler.
7187330f729Sjoergclass GenericX86Model : SchedMachineModel {
7197330f729Sjoerg  let IssueWidth = 4;
7207330f729Sjoerg  let MicroOpBufferSize = 32;
7217330f729Sjoerg  let LoadLatency = 4;
7227330f729Sjoerg  let HighLatency = 10;
7237330f729Sjoerg  let PostRAScheduler = 0;
7247330f729Sjoerg  let CompleteModel = 0;
7257330f729Sjoerg}
7267330f729Sjoerg
7277330f729Sjoergdef GenericModel : GenericX86Model;
7287330f729Sjoerg
7297330f729Sjoerg// Define a model with the PostRAScheduler enabled.
7307330f729Sjoergdef GenericPostRAModel : GenericX86Model {
7317330f729Sjoerg  let PostRAScheduler = 1;
7327330f729Sjoerg}
733