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