| //===-- X86Schedule.td - X86 Scheduling Definitions --------*- tablegen -*-===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is distributed under the University of Illinois Open Source | 
 | // License. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | //===----------------------------------------------------------------------===// | 
 | // InstrSchedModel annotations for out-of-order CPUs. | 
 |  | 
 | // Instructions with folded loads need to read the memory operand immediately, | 
 | // but other register operands don't have to be read until the load is ready. | 
 | // These operands are marked with ReadAfterLd. | 
 | def ReadAfterLd : SchedRead; | 
 |  | 
 | // Instructions with both a load and a store folded are modeled as a folded | 
 | // load + WriteRMW. | 
 | def WriteRMW : SchedWrite; | 
 |  | 
 | // Helper to set SchedWrite ExePorts/Latency/ResourceCycles/NumMicroOps. | 
 | multiclass X86WriteRes<SchedWrite SchedRW, | 
 |                        list<ProcResourceKind> ExePorts, | 
 |                        int Lat, list<int> Res, int UOps> { | 
 |   def : WriteRes<SchedRW, ExePorts> { | 
 |     let Latency = Lat; | 
 |     let ResourceCycles = Res; | 
 |     let NumMicroOps = UOps; | 
 |   } | 
 | } | 
 |  | 
 | // Most instructions can fold loads, so almost every SchedWrite comes in two | 
 | // variants: With and without a folded load. | 
 | // An X86FoldableSchedWrite holds a reference to the corresponding SchedWrite | 
 | // with a folded load. | 
 | class X86FoldableSchedWrite : SchedWrite { | 
 |   // The SchedWrite to use when a load is folded into the instruction. | 
 |   SchedWrite Folded; | 
 | } | 
 |  | 
 | // Multiclass that produces a linked pair of SchedWrites. | 
 | multiclass X86SchedWritePair { | 
 |   // Register-Memory operation. | 
 |   def Ld : SchedWrite; | 
 |   // Register-Register operation. | 
 |   def NAME : X86FoldableSchedWrite { | 
 |     let Folded = !cast<SchedWrite>(NAME#"Ld"); | 
 |   } | 
 | } | 
 |  | 
 | // Helpers to mark SchedWrites as unsupported. | 
 | multiclass X86WriteResUnsupported<SchedWrite SchedRW> { | 
 |   let Unsupported = 1 in { | 
 |     def : WriteRes<SchedRW, []>; | 
 |   } | 
 | } | 
 | multiclass X86WriteResPairUnsupported<X86FoldableSchedWrite SchedRW> { | 
 |   let Unsupported = 1 in { | 
 |     def : WriteRes<SchedRW, []>; | 
 |     def : WriteRes<SchedRW.Folded, []>; | 
 |   } | 
 | } | 
 |  | 
 | // Multiclass that wraps X86FoldableSchedWrite for each vector width. | 
 | class X86SchedWriteWidths<X86FoldableSchedWrite sScl, | 
 |                           X86FoldableSchedWrite s128, | 
 |                           X86FoldableSchedWrite s256, | 
 |                           X86FoldableSchedWrite s512> { | 
 |   X86FoldableSchedWrite Scl = sScl; // Scalar float/double operations. | 
 |   X86FoldableSchedWrite MMX = sScl; // MMX operations. | 
 |   X86FoldableSchedWrite XMM = s128; // XMM operations. | 
 |   X86FoldableSchedWrite YMM = s256; // YMM operations. | 
 |   X86FoldableSchedWrite ZMM = s512; // ZMM operations. | 
 | } | 
 |  | 
 | // Multiclass that wraps X86SchedWriteWidths for each fp vector type. | 
 | class X86SchedWriteSizes<X86SchedWriteWidths sPS, | 
 |                          X86SchedWriteWidths sPD> { | 
 |   X86SchedWriteWidths PS = sPS; | 
 |   X86SchedWriteWidths PD = sPD; | 
 | } | 
 |  | 
 | // Multiclass that wraps move/load/store triple for a vector width. | 
 | class X86SchedWriteMoveLS<SchedWrite MoveRR, | 
 |                           SchedWrite LoadRM, | 
 |                           SchedWrite StoreMR> { | 
 |   SchedWrite RR = MoveRR; | 
 |   SchedWrite RM = LoadRM; | 
 |   SchedWrite MR = StoreMR; | 
 | } | 
 |  | 
 | // Multiclass that wraps X86SchedWriteMoveLS for each vector width. | 
 | class X86SchedWriteMoveLSWidths<X86SchedWriteMoveLS sScl, | 
 |                                 X86SchedWriteMoveLS s128, | 
 |                                 X86SchedWriteMoveLS s256, | 
 |                                 X86SchedWriteMoveLS s512> { | 
 |   X86SchedWriteMoveLS Scl = sScl; // Scalar float/double operations. | 
 |   X86SchedWriteMoveLS MMX = sScl; // MMX operations. | 
 |   X86SchedWriteMoveLS XMM = s128; // XMM operations. | 
 |   X86SchedWriteMoveLS YMM = s256; // YMM operations. | 
 |   X86SchedWriteMoveLS ZMM = s512; // ZMM operations. | 
 | } | 
 |  | 
 | // Loads, stores, and moves, not folded with other operations. | 
 | def WriteLoad    : SchedWrite; | 
 | def WriteStore   : SchedWrite; | 
 | def WriteStoreNT : SchedWrite; | 
 | def WriteMove    : SchedWrite; | 
 |  | 
 | // Arithmetic. | 
 | defm WriteALU    : X86SchedWritePair; // Simple integer ALU op. | 
 | defm WriteADC    : X86SchedWritePair; // Integer ALU + flags op. | 
 | def  WriteALURMW : WriteSequence<[WriteALULd, WriteStore]>; | 
 | def  WriteADCRMW : WriteSequence<[WriteADCLd, WriteStore]>; | 
 | defm WriteIMul   : X86SchedWritePair; // Integer multiplication. | 
 | defm WriteIMul64 : X86SchedWritePair; // Integer 64-bit multiplication. | 
 | def  WriteIMulH  : SchedWrite;        // Integer multiplication, high part. | 
 | def  WriteLEA    : SchedWrite;        // LEA instructions can't fold loads. | 
 |  | 
 | def  WriteBSWAP32 : SchedWrite; // Byte Order (Endianness) 32-bit Swap. | 
 | def  WriteBSWAP64 : SchedWrite; // Byte Order (Endianness) 64-bit Swap. | 
 |  | 
 | // Integer division. | 
 | defm WriteDiv8   : X86SchedWritePair; | 
 | defm WriteDiv16  : X86SchedWritePair; | 
 | defm WriteDiv32  : X86SchedWritePair; | 
 | defm WriteDiv64  : X86SchedWritePair; | 
 | defm WriteIDiv8  : X86SchedWritePair; | 
 | defm WriteIDiv16 : X86SchedWritePair; | 
 | defm WriteIDiv32 : X86SchedWritePair; | 
 | defm WriteIDiv64 : X86SchedWritePair; | 
 |  | 
 | defm WriteBSF : X86SchedWritePair; // Bit scan forward. | 
 | defm WriteBSR : X86SchedWritePair; // Bit scan reverse. | 
 | defm WritePOPCNT : X86SchedWritePair; // Bit population count. | 
 | defm WriteLZCNT : X86SchedWritePair; // Leading zero count. | 
 | defm WriteTZCNT : X86SchedWritePair; // Trailing zero count. | 
 | defm WriteCMOV  : X86SchedWritePair; // Conditional move. | 
 | defm WriteCMOV2 : X86SchedWritePair; // Conditional (CF + ZF flag) move. | 
 | def  WriteFCMOV : SchedWrite; // X87 conditional move. | 
 | def  WriteSETCC : SchedWrite; // Set register based on condition code. | 
 | def  WriteSETCCStore : SchedWrite; | 
 | def  WriteLAHFSAHF : SchedWrite; // Load/Store flags in AH. | 
 | def  WriteBitTest  : SchedWrite; // Bit Test - TODO add memory folding support | 
 |  | 
 | // Integer shifts and rotates. | 
 | defm WriteShift : X86SchedWritePair; | 
 | // Double shift instructions. | 
 | def  WriteSHDrri  : SchedWrite; | 
 | def  WriteSHDrrcl : SchedWrite; | 
 | def  WriteSHDmri  : SchedWrite; | 
 | def  WriteSHDmrcl : SchedWrite; | 
 |  | 
 | // BMI1 BEXTR, BMI2 BZHI | 
 | defm WriteBEXTR : X86SchedWritePair; | 
 | defm WriteBZHI  : X86SchedWritePair; | 
 |  | 
 | // Idioms that clear a register, like xorps %xmm0, %xmm0. | 
 | // These can often bypass execution ports completely. | 
 | def WriteZero : SchedWrite; | 
 |  | 
 | // Branches don't produce values, so they have no latency, but they still | 
 | // consume resources. Indirect branches can fold loads. | 
 | defm WriteJump : X86SchedWritePair; | 
 |  | 
 | // Floating point. This covers both scalar and vector operations. | 
 | def  WriteFLD0          : SchedWrite; | 
 | def  WriteFLD1          : SchedWrite; | 
 | def  WriteFLDC          : SchedWrite; | 
 | def  WriteFLoad         : SchedWrite; | 
 | def  WriteFLoadX        : SchedWrite; | 
 | def  WriteFLoadY        : SchedWrite; | 
 | def  WriteFMaskedLoad   : SchedWrite; | 
 | def  WriteFMaskedLoadY  : SchedWrite; | 
 | def  WriteFStore        : SchedWrite; | 
 | def  WriteFStoreX       : SchedWrite; | 
 | def  WriteFStoreY       : SchedWrite; | 
 | def  WriteFStoreNT      : SchedWrite; | 
 | def  WriteFStoreNTX     : SchedWrite; | 
 | def  WriteFStoreNTY     : SchedWrite; | 
 | def  WriteFMaskedStore  : SchedWrite; | 
 | def  WriteFMaskedStoreY : SchedWrite; | 
 | def  WriteFMove         : SchedWrite; | 
 | def  WriteFMoveX        : SchedWrite; | 
 | def  WriteFMoveY        : SchedWrite; | 
 |  | 
 | defm WriteFAdd    : X86SchedWritePair; // Floating point add/sub. | 
 | defm WriteFAddX   : X86SchedWritePair; // Floating point add/sub (XMM). | 
 | defm WriteFAddY   : X86SchedWritePair; // Floating point add/sub (YMM). | 
 | defm WriteFAddZ   : X86SchedWritePair; // Floating point add/sub (ZMM). | 
 | defm WriteFAdd64  : X86SchedWritePair; // Floating point double add/sub. | 
 | defm WriteFAdd64X : X86SchedWritePair; // Floating point double add/sub (XMM). | 
 | defm WriteFAdd64Y : X86SchedWritePair; // Floating point double add/sub (YMM). | 
 | defm WriteFAdd64Z : X86SchedWritePair; // Floating point double add/sub (ZMM). | 
 | defm WriteFCmp    : X86SchedWritePair; // Floating point compare. | 
 | defm WriteFCmpX   : X86SchedWritePair; // Floating point compare (XMM). | 
 | defm WriteFCmpY   : X86SchedWritePair; // Floating point compare (YMM). | 
 | defm WriteFCmpZ   : X86SchedWritePair; // Floating point compare (ZMM). | 
 | defm WriteFCmp64  : X86SchedWritePair; // Floating point double compare. | 
 | defm WriteFCmp64X : X86SchedWritePair; // Floating point double compare (XMM). | 
 | defm WriteFCmp64Y : X86SchedWritePair; // Floating point double compare (YMM). | 
 | defm WriteFCmp64Z : X86SchedWritePair; // Floating point double compare (ZMM). | 
 | defm WriteFCom    : X86SchedWritePair; // Floating point compare to flags. | 
 | defm WriteFMul    : X86SchedWritePair; // Floating point multiplication. | 
 | defm WriteFMulX   : X86SchedWritePair; // Floating point multiplication (XMM). | 
 | defm WriteFMulY   : X86SchedWritePair; // Floating point multiplication (YMM). | 
 | defm WriteFMulZ   : X86SchedWritePair; // Floating point multiplication (YMM). | 
 | defm WriteFMul64  : X86SchedWritePair; // Floating point double multiplication. | 
 | defm WriteFMul64X : X86SchedWritePair; // Floating point double multiplication (XMM). | 
 | defm WriteFMul64Y : X86SchedWritePair; // Floating point double multiplication (YMM). | 
 | defm WriteFMul64Z : X86SchedWritePair; // Floating point double multiplication (ZMM). | 
 | defm WriteFDiv    : X86SchedWritePair; // Floating point division. | 
 | defm WriteFDivX   : X86SchedWritePair; // Floating point division (XMM). | 
 | defm WriteFDivY   : X86SchedWritePair; // Floating point division (YMM). | 
 | defm WriteFDivZ   : X86SchedWritePair; // Floating point division (ZMM). | 
 | defm WriteFDiv64  : X86SchedWritePair; // Floating point double division. | 
 | defm WriteFDiv64X : X86SchedWritePair; // Floating point double division (XMM). | 
 | defm WriteFDiv64Y : X86SchedWritePair; // Floating point double division (YMM). | 
 | defm WriteFDiv64Z : X86SchedWritePair; // Floating point double division (ZMM). | 
 | defm WriteFSqrt  : X86SchedWritePair; // Floating point square root. | 
 | defm WriteFSqrtX : X86SchedWritePair; // Floating point square root (XMM). | 
 | defm WriteFSqrtY : X86SchedWritePair; // Floating point square root (YMM). | 
 | defm WriteFSqrtZ : X86SchedWritePair; // Floating point square root (ZMM). | 
 | defm WriteFSqrt64  : X86SchedWritePair; // Floating point double square root. | 
 | defm WriteFSqrt64X : X86SchedWritePair; // Floating point double square root (XMM). | 
 | defm WriteFSqrt64Y : X86SchedWritePair; // Floating point double square root (YMM). | 
 | defm WriteFSqrt64Z : X86SchedWritePair; // Floating point double square root (ZMM). | 
 | defm WriteFSqrt80  : X86SchedWritePair; // Floating point long double square root. | 
 | defm WriteFRcp   : X86SchedWritePair; // Floating point reciprocal estimate. | 
 | defm WriteFRcpX  : X86SchedWritePair; // Floating point reciprocal estimate (XMM). | 
 | defm WriteFRcpY  : X86SchedWritePair; // Floating point reciprocal estimate (YMM). | 
 | defm WriteFRcpZ  : X86SchedWritePair; // Floating point reciprocal estimate (ZMM). | 
 | defm WriteFRsqrt : X86SchedWritePair; // Floating point reciprocal square root estimate. | 
 | defm WriteFRsqrtX: X86SchedWritePair; // Floating point reciprocal square root estimate (XMM). | 
 | defm WriteFRsqrtY: X86SchedWritePair; // Floating point reciprocal square root estimate (YMM). | 
 | defm WriteFRsqrtZ: X86SchedWritePair; // Floating point reciprocal square root estimate (ZMM). | 
 | defm WriteFMA    : X86SchedWritePair; // Fused Multiply Add. | 
 | defm WriteFMAX   : X86SchedWritePair; // Fused Multiply Add (XMM). | 
 | defm WriteFMAY   : X86SchedWritePair; // Fused Multiply Add (YMM). | 
 | defm WriteFMAZ   : X86SchedWritePair; // Fused Multiply Add (ZMM). | 
 | defm WriteDPPD   : X86SchedWritePair; // Floating point double dot product. | 
 | defm WriteDPPS   : X86SchedWritePair; // Floating point single dot product. | 
 | defm WriteDPPSY  : X86SchedWritePair; // Floating point single dot product (YMM). | 
 | defm WriteDPPSZ  : X86SchedWritePair; // Floating point single dot product (ZMM). | 
 | defm WriteFSign  : X86SchedWritePair; // Floating point fabs/fchs. | 
 | defm WriteFRnd   : X86SchedWritePair; // Floating point rounding. | 
 | defm WriteFRndY  : X86SchedWritePair; // Floating point rounding (YMM). | 
 | defm WriteFRndZ  : X86SchedWritePair; // Floating point rounding (ZMM). | 
 | defm WriteFLogic  : X86SchedWritePair; // Floating point and/or/xor logicals. | 
 | defm WriteFLogicY : X86SchedWritePair; // Floating point and/or/xor logicals (YMM). | 
 | defm WriteFLogicZ : X86SchedWritePair; // Floating point and/or/xor logicals (ZMM). | 
 | defm WriteFTest   : X86SchedWritePair; // Floating point TEST instructions. | 
 | defm WriteFTestY  : X86SchedWritePair; // Floating point TEST instructions (YMM). | 
 | defm WriteFTestZ  : X86SchedWritePair; // Floating point TEST instructions (ZMM). | 
 | defm WriteFShuffle  : X86SchedWritePair; // Floating point vector shuffles. | 
 | defm WriteFShuffleY : X86SchedWritePair; // Floating point vector shuffles (YMM). | 
 | defm WriteFShuffleZ : X86SchedWritePair; // Floating point vector shuffles (ZMM). | 
 | defm WriteFVarShuffle  : X86SchedWritePair; // Floating point vector variable shuffles. | 
 | defm WriteFVarShuffleY : X86SchedWritePair; // Floating point vector variable shuffles (YMM). | 
 | defm WriteFVarShuffleZ : X86SchedWritePair; // Floating point vector variable shuffles (ZMM). | 
 | defm WriteFBlend  : X86SchedWritePair; // Floating point vector blends. | 
 | defm WriteFBlendY : X86SchedWritePair; // Floating point vector blends (YMM). | 
 | defm WriteFBlendZ : X86SchedWritePair; // Floating point vector blends (ZMM). | 
 | defm WriteFVarBlend  : X86SchedWritePair; // Fp vector variable blends. | 
 | defm WriteFVarBlendY : X86SchedWritePair; // Fp vector variable blends (YMM). | 
 | defm WriteFVarBlendZ : X86SchedWritePair; // Fp vector variable blends (YMZMM). | 
 |  | 
 | // FMA Scheduling helper class. | 
 | class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; } | 
 |  | 
 | // Horizontal Add/Sub (float and integer) | 
 | defm WriteFHAdd  : X86SchedWritePair; | 
 | defm WriteFHAddY : X86SchedWritePair; | 
 | defm WriteFHAddZ : X86SchedWritePair; | 
 | defm WritePHAdd  : X86SchedWritePair; | 
 | defm WritePHAddX : X86SchedWritePair; | 
 | defm WritePHAddY : X86SchedWritePair; | 
 | defm WritePHAddZ : X86SchedWritePair; | 
 |  | 
 | // Vector integer operations. | 
 | def  WriteVecLoad         : SchedWrite; | 
 | def  WriteVecLoadX        : SchedWrite; | 
 | def  WriteVecLoadY        : SchedWrite; | 
 | def  WriteVecLoadNT       : SchedWrite; | 
 | def  WriteVecLoadNTY      : SchedWrite; | 
 | def  WriteVecMaskedLoad   : SchedWrite; | 
 | def  WriteVecMaskedLoadY  : SchedWrite; | 
 | def  WriteVecStore        : SchedWrite; | 
 | def  WriteVecStoreX       : SchedWrite; | 
 | def  WriteVecStoreY       : SchedWrite; | 
 | def  WriteVecStoreNT      : SchedWrite; | 
 | def  WriteVecStoreNTY     : SchedWrite; | 
 | def  WriteVecMaskedStore  : SchedWrite; | 
 | def  WriteVecMaskedStoreY : SchedWrite; | 
 | def  WriteVecMove         : SchedWrite; | 
 | def  WriteVecMoveX        : SchedWrite; | 
 | def  WriteVecMoveY        : SchedWrite; | 
 | def  WriteVecMoveToGpr    : SchedWrite; | 
 | def  WriteVecMoveFromGpr  : SchedWrite; | 
 |  | 
 | defm WriteVecALU    : X86SchedWritePair; // Vector integer ALU op, no logicals. | 
 | defm WriteVecALUX   : X86SchedWritePair; // Vector integer ALU op, no logicals (XMM). | 
 | defm WriteVecALUY   : X86SchedWritePair; // Vector integer ALU op, no logicals (YMM). | 
 | defm WriteVecALUZ   : X86SchedWritePair; // Vector integer ALU op, no logicals (ZMM). | 
 | defm WriteVecLogic  : X86SchedWritePair; // Vector integer and/or/xor logicals. | 
 | defm WriteVecLogicX : X86SchedWritePair; // Vector integer and/or/xor logicals (XMM). | 
 | defm WriteVecLogicY : X86SchedWritePair; // Vector integer and/or/xor logicals (YMM). | 
 | defm WriteVecLogicZ : X86SchedWritePair; // Vector integer and/or/xor logicals (ZMM). | 
 | defm WriteVecTest  : X86SchedWritePair; // Vector integer TEST instructions. | 
 | defm WriteVecTestY : X86SchedWritePair; // Vector integer TEST instructions (YMM). | 
 | defm WriteVecTestZ : X86SchedWritePair; // Vector integer TEST instructions (ZMM). | 
 | defm WriteVecShift  : X86SchedWritePair; // Vector integer shifts (default). | 
 | defm WriteVecShiftX : X86SchedWritePair; // Vector integer shifts (XMM). | 
 | defm WriteVecShiftY : X86SchedWritePair; // Vector integer shifts (YMM). | 
 | defm WriteVecShiftZ : X86SchedWritePair; // Vector integer shifts (ZMM). | 
 | defm WriteVecShiftImm : X86SchedWritePair; // Vector integer immediate shifts (default). | 
 | defm WriteVecShiftImmX: X86SchedWritePair; // Vector integer immediate shifts (XMM). | 
 | defm WriteVecShiftImmY: X86SchedWritePair; // Vector integer immediate shifts (YMM). | 
 | defm WriteVecShiftImmZ: X86SchedWritePair; // Vector integer immediate shifts (ZMM). | 
 | defm WriteVecIMul  : X86SchedWritePair; // Vector integer multiply (default). | 
 | defm WriteVecIMulX : X86SchedWritePair; // Vector integer multiply (XMM). | 
 | defm WriteVecIMulY : X86SchedWritePair; // Vector integer multiply (YMM). | 
 | defm WriteVecIMulZ : X86SchedWritePair; // Vector integer multiply (ZMM). | 
 | defm WritePMULLD   : X86SchedWritePair; // Vector PMULLD. | 
 | defm WritePMULLDY   : X86SchedWritePair; // Vector PMULLD (YMM). | 
 | defm WritePMULLDZ   : X86SchedWritePair; // Vector PMULLD (ZMM). | 
 | defm WriteShuffle  : X86SchedWritePair; // Vector shuffles. | 
 | defm WriteShuffleX : X86SchedWritePair; // Vector shuffles (XMM). | 
 | defm WriteShuffleY : X86SchedWritePair; // Vector shuffles (YMM). | 
 | defm WriteShuffleZ : X86SchedWritePair; // Vector shuffles (ZMM). | 
 | defm WriteVarShuffle  : X86SchedWritePair; // Vector variable shuffles. | 
 | defm WriteVarShuffleX : X86SchedWritePair; // Vector variable shuffles (XMM). | 
 | defm WriteVarShuffleY : X86SchedWritePair; // Vector variable shuffles (YMM). | 
 | defm WriteVarShuffleZ : X86SchedWritePair; // Vector variable shuffles (ZMM). | 
 | defm WriteBlend  : X86SchedWritePair; // Vector blends. | 
 | defm WriteBlendY : X86SchedWritePair; // Vector blends (YMM). | 
 | defm WriteBlendZ : X86SchedWritePair; // Vector blends (ZMM). | 
 | defm WriteVarBlend  : X86SchedWritePair; // Vector variable blends. | 
 | defm WriteVarBlendY : X86SchedWritePair; // Vector variable blends (YMM). | 
 | defm WriteVarBlendZ : X86SchedWritePair; // Vector variable blends (ZMM). | 
 | defm WritePSADBW  : X86SchedWritePair; // Vector PSADBW. | 
 | defm WritePSADBWX : X86SchedWritePair; // Vector PSADBW (XMM). | 
 | defm WritePSADBWY : X86SchedWritePair; // Vector PSADBW (YMM). | 
 | defm WritePSADBWZ : X86SchedWritePair; // Vector PSADBW (ZMM). | 
 | defm WriteMPSAD  : X86SchedWritePair; // Vector MPSAD. | 
 | defm WriteMPSADY : X86SchedWritePair; // Vector MPSAD (YMM). | 
 | defm WriteMPSADZ : X86SchedWritePair; // Vector MPSAD (ZMM). | 
 | defm WritePHMINPOS : X86SchedWritePair; // Vector PHMINPOS. | 
 |  | 
 | // Vector insert/extract operations. | 
 | defm WriteVecInsert : X86SchedWritePair; // Insert gpr to vector element. | 
 | def  WriteVecExtract : SchedWrite; // Extract vector element to gpr. | 
 | def  WriteVecExtractSt : SchedWrite; // Extract vector element and store. | 
 |  | 
 | // MOVMSK operations. | 
 | def WriteFMOVMSK    : SchedWrite; | 
 | def WriteVecMOVMSK  : SchedWrite; | 
 | def WriteVecMOVMSKY : SchedWrite; | 
 | def WriteMMXMOVMSK  : SchedWrite; | 
 |  | 
 | // Conversion between integer and float. | 
 | defm WriteCvtSD2I  : X86SchedWritePair; // Double -> Integer. | 
 | defm WriteCvtPD2I  : X86SchedWritePair; // Double -> Integer (XMM). | 
 | defm WriteCvtPD2IY : X86SchedWritePair; // Double -> Integer (YMM). | 
 | defm WriteCvtPD2IZ : X86SchedWritePair; // Double -> Integer (ZMM). | 
 |  | 
 | defm WriteCvtSS2I  : X86SchedWritePair; // Float -> Integer. | 
 | defm WriteCvtPS2I  : X86SchedWritePair; // Float -> Integer (XMM). | 
 | defm WriteCvtPS2IY : X86SchedWritePair; // Float -> Integer (YMM). | 
 | defm WriteCvtPS2IZ : X86SchedWritePair; // Float -> Integer (ZMM). | 
 |  | 
 | defm WriteCvtI2SD  : X86SchedWritePair; // Integer -> Double. | 
 | defm WriteCvtI2PD  : X86SchedWritePair; // Integer -> Double (XMM). | 
 | defm WriteCvtI2PDY : X86SchedWritePair; // Integer -> Double (YMM). | 
 | defm WriteCvtI2PDZ : X86SchedWritePair; // Integer -> Double (ZMM). | 
 |  | 
 | defm WriteCvtI2SS  : X86SchedWritePair; // Integer -> Float. | 
 | defm WriteCvtI2PS  : X86SchedWritePair; // Integer -> Float (XMM). | 
 | defm WriteCvtI2PSY : X86SchedWritePair; // Integer -> Float (YMM). | 
 | defm WriteCvtI2PSZ : X86SchedWritePair; // Integer -> Float (ZMM). | 
 |  | 
 | defm WriteCvtSS2SD  : X86SchedWritePair; // Float -> Double size conversion. | 
 | defm WriteCvtPS2PD  : X86SchedWritePair; // Float -> Double size conversion (XMM). | 
 | defm WriteCvtPS2PDY : X86SchedWritePair; // Float -> Double size conversion (YMM). | 
 | defm WriteCvtPS2PDZ : X86SchedWritePair; // Float -> Double size conversion (ZMM). | 
 |  | 
 | defm WriteCvtSD2SS  : X86SchedWritePair; // Double -> Float size conversion. | 
 | defm WriteCvtPD2PS  : X86SchedWritePair; // Double -> Float size conversion (XMM). | 
 | defm WriteCvtPD2PSY : X86SchedWritePair; // Double -> Float size conversion (YMM). | 
 | defm WriteCvtPD2PSZ : X86SchedWritePair; // Double -> Float size conversion (ZMM). | 
 |  | 
 | defm WriteCvtPH2PS    : X86SchedWritePair; // Half -> Float size conversion. | 
 | defm WriteCvtPH2PSY   : X86SchedWritePair; // Half -> Float size conversion (YMM). | 
 | defm WriteCvtPH2PSZ   : X86SchedWritePair; // Half -> Float size conversion (ZMM). | 
 |  | 
 | def  WriteCvtPS2PH    : SchedWrite; // // Float -> Half size conversion. | 
 | def  WriteCvtPS2PHY   : SchedWrite; // // Float -> Half size conversion (YMM). | 
 | def  WriteCvtPS2PHZ   : SchedWrite; // // Float -> Half size conversion (ZMM). | 
 | def  WriteCvtPS2PHSt  : SchedWrite; // // Float -> Half + store size conversion. | 
 | def  WriteCvtPS2PHYSt : SchedWrite; // // Float -> Half + store size conversion (YMM). | 
 | def  WriteCvtPS2PHZSt : SchedWrite; // // Float -> Half + store size conversion (ZMM). | 
 |  | 
 | // CRC32 instruction. | 
 | defm WriteCRC32 : X86SchedWritePair; | 
 |  | 
 | // Strings instructions. | 
 | // Packed Compare Implicit Length Strings, Return Mask | 
 | defm WritePCmpIStrM : X86SchedWritePair; | 
 | // Packed Compare Explicit Length Strings, Return Mask | 
 | defm WritePCmpEStrM : X86SchedWritePair; | 
 | // Packed Compare Implicit Length Strings, Return Index | 
 | defm WritePCmpIStrI : X86SchedWritePair; | 
 | // Packed Compare Explicit Length Strings, Return Index | 
 | defm WritePCmpEStrI : X86SchedWritePair; | 
 |  | 
 | // AES instructions. | 
 | defm WriteAESDecEnc : X86SchedWritePair; // Decryption, encryption. | 
 | defm WriteAESIMC : X86SchedWritePair; // InvMixColumn. | 
 | defm WriteAESKeyGen : X86SchedWritePair; // Key Generation. | 
 |  | 
 | // Carry-less multiplication instructions. | 
 | defm WriteCLMul : X86SchedWritePair; | 
 |  | 
 | // EMMS/FEMMS | 
 | def WriteEMMS : SchedWrite; | 
 |  | 
 | // Load/store MXCSR | 
 | def WriteLDMXCSR : SchedWrite; | 
 | def WriteSTMXCSR : SchedWrite; | 
 |  | 
 | // Catch-all for expensive system instructions. | 
 | def WriteSystem : SchedWrite; | 
 |  | 
 | // AVX2. | 
 | defm WriteFShuffle256 : X86SchedWritePair; // Fp 256-bit width vector shuffles. | 
 | defm WriteFVarShuffle256 : X86SchedWritePair; // Fp 256-bit width variable shuffles. | 
 | defm WriteShuffle256 : X86SchedWritePair; // 256-bit width vector shuffles. | 
 | defm WriteVarShuffle256 : X86SchedWritePair; // 256-bit width vector variable shuffles. | 
 | defm WriteVarVecShift  : X86SchedWritePair; // Variable vector shifts. | 
 | defm WriteVarVecShiftY : X86SchedWritePair; // Variable vector shifts (YMM). | 
 | defm WriteVarVecShiftZ : X86SchedWritePair; // Variable vector shifts (ZMM). | 
 |  | 
 | // Old microcoded instructions that nobody use. | 
 | def WriteMicrocoded : SchedWrite; | 
 |  | 
 | // Fence instructions. | 
 | def WriteFence : SchedWrite; | 
 |  | 
 | // Nop, not very useful expect it provides a model for nops! | 
 | def WriteNop : SchedWrite; | 
 |  | 
 | // Move/Load/Store wrappers. | 
 | def WriteFMoveLS | 
 |  : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStore>; | 
 | def WriteFMoveLSX | 
 |  : X86SchedWriteMoveLS<WriteFMoveX, WriteFLoadX, WriteFStoreX>; | 
 | def WriteFMoveLSY | 
 |  : X86SchedWriteMoveLS<WriteFMoveY, WriteFLoadY, WriteFStoreY>; | 
 | def SchedWriteFMoveLS | 
 |   : X86SchedWriteMoveLSWidths<WriteFMoveLS, WriteFMoveLSX, | 
 |                               WriteFMoveLSY, WriteFMoveLSY>; | 
 |  | 
 | def WriteFMoveLSNT | 
 |  : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStoreNT>; | 
 | def WriteFMoveLSNTX | 
 |  : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStoreNTX>; | 
 | def WriteFMoveLSNTY | 
 |  : X86SchedWriteMoveLS<WriteFMoveY, WriteFLoadY, WriteFStoreNTY>; | 
 | def SchedWriteFMoveLSNT | 
 |   : X86SchedWriteMoveLSWidths<WriteFMoveLSNT, WriteFMoveLSNTX, | 
 |                               WriteFMoveLSNTY, WriteFMoveLSNTY>; | 
 |  | 
 | def WriteVecMoveLS | 
 |  : X86SchedWriteMoveLS<WriteVecMove, WriteVecLoad, WriteVecStore>; | 
 | def WriteVecMoveLSX | 
 |  : X86SchedWriteMoveLS<WriteVecMoveX, WriteVecLoadX, WriteVecStoreX>; | 
 | def WriteVecMoveLSY | 
 |  : X86SchedWriteMoveLS<WriteVecMoveY, WriteVecLoadY, WriteVecStoreY>; | 
 | def SchedWriteVecMoveLS | 
 |   : X86SchedWriteMoveLSWidths<WriteVecMoveLS, WriteVecMoveLSX, | 
 |                               WriteVecMoveLSY, WriteVecMoveLSY>; | 
 |  | 
 | def WriteVecMoveLSNT | 
 |  : X86SchedWriteMoveLS<WriteVecMove, WriteVecLoadNT, WriteVecStoreNT>; | 
 | def WriteVecMoveLSNTX | 
 |  : X86SchedWriteMoveLS<WriteVecMoveX, WriteVecLoadNT, WriteVecStoreNT>; | 
 | def WriteVecMoveLSNTY | 
 |  : X86SchedWriteMoveLS<WriteVecMoveY, WriteVecLoadNTY, WriteVecStoreNTY>; | 
 | def SchedWriteVecMoveLSNT | 
 |   : X86SchedWriteMoveLSWidths<WriteVecMoveLSNT, WriteVecMoveLSNTX, | 
 |                               WriteVecMoveLSNTY, WriteVecMoveLSNTY>; | 
 |  | 
 | // Vector width wrappers. | 
 | def SchedWriteFAdd | 
 |  : X86SchedWriteWidths<WriteFAdd, WriteFAddX, WriteFAddY, WriteFAddZ>; | 
 | def SchedWriteFAdd64 | 
 |  : X86SchedWriteWidths<WriteFAdd64, WriteFAdd64X, WriteFAdd64Y, WriteFAdd64Z>; | 
 | def SchedWriteFHAdd | 
 |  : X86SchedWriteWidths<WriteFHAdd, WriteFHAdd, WriteFHAddY, WriteFHAddZ>; | 
 | def SchedWriteFCmp | 
 |  : X86SchedWriteWidths<WriteFCmp, WriteFCmpX, WriteFCmpY, WriteFCmpZ>; | 
 | def SchedWriteFCmp64 | 
 |  : X86SchedWriteWidths<WriteFCmp64, WriteFCmp64X, WriteFCmp64Y, WriteFCmp64Z>; | 
 | def SchedWriteFMul | 
 |  : X86SchedWriteWidths<WriteFMul, WriteFMulX, WriteFMulY, WriteFMulZ>; | 
 | def SchedWriteFMul64 | 
 |  : X86SchedWriteWidths<WriteFMul64, WriteFMul64X, WriteFMul64Y, WriteFMul64Z>; | 
 | def SchedWriteFMA | 
 |  : X86SchedWriteWidths<WriteFMA, WriteFMAX, WriteFMAY, WriteFMAZ>; | 
 | def SchedWriteDPPD | 
 |  : X86SchedWriteWidths<WriteDPPD, WriteDPPD, WriteDPPD, WriteDPPD>; | 
 | def SchedWriteDPPS | 
 |  : X86SchedWriteWidths<WriteDPPS, WriteDPPS, WriteDPPSY, WriteDPPSZ>; | 
 | def SchedWriteFDiv | 
 |  : X86SchedWriteWidths<WriteFDiv, WriteFDivX, WriteFDivY, WriteFDivZ>; | 
 | def SchedWriteFDiv64 | 
 |  : X86SchedWriteWidths<WriteFDiv64, WriteFDiv64X, WriteFDiv64Y, WriteFDiv64Z>; | 
 | def SchedWriteFSqrt | 
 |  : X86SchedWriteWidths<WriteFSqrt, WriteFSqrtX, | 
 |                        WriteFSqrtY, WriteFSqrtZ>; | 
 | def SchedWriteFSqrt64 | 
 |  : X86SchedWriteWidths<WriteFSqrt64, WriteFSqrt64X, | 
 |                        WriteFSqrt64Y, WriteFSqrt64Z>; | 
 | def SchedWriteFRcp | 
 |  : X86SchedWriteWidths<WriteFRcp, WriteFRcpX, WriteFRcpY, WriteFRcpZ>; | 
 | def SchedWriteFRsqrt | 
 |  : X86SchedWriteWidths<WriteFRsqrt, WriteFRsqrtX, WriteFRsqrtY, WriteFRsqrtZ>; | 
 | def SchedWriteFRnd | 
 |  : X86SchedWriteWidths<WriteFRnd, WriteFRnd, WriteFRndY, WriteFRndZ>; | 
 | def SchedWriteFLogic | 
 |  : X86SchedWriteWidths<WriteFLogic, WriteFLogic, WriteFLogicY, WriteFLogicZ>; | 
 | def SchedWriteFTest | 
 |  : X86SchedWriteWidths<WriteFTest, WriteFTest, WriteFTestY, WriteFTestZ>; | 
 |  | 
 | def SchedWriteFShuffle | 
 |  : X86SchedWriteWidths<WriteFShuffle, WriteFShuffle, | 
 |                        WriteFShuffleY, WriteFShuffleZ>; | 
 | def SchedWriteFVarShuffle | 
 |  : X86SchedWriteWidths<WriteFVarShuffle, WriteFVarShuffle, | 
 |                        WriteFVarShuffleY, WriteFVarShuffleZ>; | 
 | def SchedWriteFBlend | 
 |  : X86SchedWriteWidths<WriteFBlend, WriteFBlend, WriteFBlendY, WriteFBlendZ>; | 
 | def SchedWriteFVarBlend | 
 |  : X86SchedWriteWidths<WriteFVarBlend, WriteFVarBlend, | 
 |                        WriteFVarBlendY, WriteFVarBlendZ>; | 
 |  | 
 | def SchedWriteCvtDQ2PD | 
 |  : X86SchedWriteWidths<WriteCvtI2SD, WriteCvtI2PD, | 
 |                        WriteCvtI2PDY, WriteCvtI2PDZ>; | 
 | def SchedWriteCvtDQ2PS | 
 |  : X86SchedWriteWidths<WriteCvtI2SS, WriteCvtI2PS, | 
 |                        WriteCvtI2PSY, WriteCvtI2PSZ>; | 
 | def SchedWriteCvtPD2DQ | 
 |  : X86SchedWriteWidths<WriteCvtSD2I, WriteCvtPD2I, | 
 |                        WriteCvtPD2IY, WriteCvtPD2IZ>; | 
 | def SchedWriteCvtPS2DQ | 
 |  : X86SchedWriteWidths<WriteCvtSS2I, WriteCvtPS2I, | 
 |                        WriteCvtPS2IY, WriteCvtPS2IZ>; | 
 | def SchedWriteCvtPS2PD | 
 |  : X86SchedWriteWidths<WriteCvtSS2SD, WriteCvtPS2PD, | 
 |                        WriteCvtPS2PDY, WriteCvtPS2PDZ>; | 
 | def SchedWriteCvtPD2PS | 
 |  : X86SchedWriteWidths<WriteCvtSD2SS, WriteCvtPD2PS, | 
 |                        WriteCvtPD2PSY, WriteCvtPD2PSZ>; | 
 |  | 
 | def SchedWriteVecALU | 
 |  : X86SchedWriteWidths<WriteVecALU, WriteVecALUX, WriteVecALUY, WriteVecALUZ>; | 
 | def SchedWritePHAdd | 
 |  : X86SchedWriteWidths<WritePHAdd, WritePHAddX, WritePHAddY, WritePHAddZ>; | 
 | def SchedWriteVecLogic | 
 |  : X86SchedWriteWidths<WriteVecLogic, WriteVecLogicX, | 
 |                        WriteVecLogicY, WriteVecLogicZ>; | 
 | def SchedWriteVecTest | 
 |  : X86SchedWriteWidths<WriteVecTest, WriteVecTest, | 
 |                        WriteVecTestY, WriteVecTestZ>; | 
 | def SchedWriteVecShift | 
 |  : X86SchedWriteWidths<WriteVecShift, WriteVecShiftX, | 
 |                        WriteVecShiftY, WriteVecShiftZ>; | 
 | def SchedWriteVecShiftImm | 
 |  : X86SchedWriteWidths<WriteVecShiftImm, WriteVecShiftImmX, | 
 |                        WriteVecShiftImmY, WriteVecShiftImmZ>; | 
 | def SchedWriteVarVecShift | 
 |  : X86SchedWriteWidths<WriteVarVecShift, WriteVarVecShift, | 
 |                        WriteVarVecShiftY, WriteVarVecShiftZ>; | 
 | def SchedWriteVecIMul | 
 |  : X86SchedWriteWidths<WriteVecIMul, WriteVecIMulX, | 
 |                        WriteVecIMulY, WriteVecIMulZ>; | 
 | def SchedWritePMULLD | 
 |  : X86SchedWriteWidths<WritePMULLD, WritePMULLD, | 
 |                        WritePMULLDY, WritePMULLDZ>; | 
 | def SchedWriteMPSAD | 
 |  : X86SchedWriteWidths<WriteMPSAD, WriteMPSAD, | 
 |                        WriteMPSADY, WriteMPSADZ>; | 
 | def SchedWritePSADBW | 
 |  : X86SchedWriteWidths<WritePSADBW, WritePSADBWX, | 
 |                        WritePSADBWY, WritePSADBWZ>; | 
 |  | 
 | def SchedWriteShuffle | 
 |  : X86SchedWriteWidths<WriteShuffle, WriteShuffleX, | 
 |                        WriteShuffleY, WriteShuffleZ>; | 
 | def SchedWriteVarShuffle | 
 |  : X86SchedWriteWidths<WriteVarShuffle, WriteVarShuffleX, | 
 |                        WriteVarShuffleY, WriteVarShuffleZ>; | 
 | def SchedWriteBlend | 
 |  : X86SchedWriteWidths<WriteBlend, WriteBlend, WriteBlendY, WriteBlendZ>; | 
 | def SchedWriteVarBlend | 
 |  : X86SchedWriteWidths<WriteVarBlend, WriteVarBlend, | 
 |                        WriteVarBlendY, WriteVarBlendZ>; | 
 |  | 
 | // Vector size wrappers. | 
 | def SchedWriteFAddSizes | 
 |  : X86SchedWriteSizes<SchedWriteFAdd, SchedWriteFAdd64>; | 
 | def SchedWriteFCmpSizes | 
 |  : X86SchedWriteSizes<SchedWriteFCmp, SchedWriteFCmp64>; | 
 | def SchedWriteFMulSizes | 
 |  : X86SchedWriteSizes<SchedWriteFMul, SchedWriteFMul64>; | 
 | def SchedWriteFDivSizes | 
 |  : X86SchedWriteSizes<SchedWriteFDiv, SchedWriteFDiv64>; | 
 | def SchedWriteFSqrtSizes | 
 |  : X86SchedWriteSizes<SchedWriteFSqrt, SchedWriteFSqrt64>; | 
 | def SchedWriteFLogicSizes | 
 |  : X86SchedWriteSizes<SchedWriteFLogic, SchedWriteFLogic>; | 
 | def SchedWriteFShuffleSizes | 
 |  : X86SchedWriteSizes<SchedWriteFShuffle, SchedWriteFShuffle>; | 
 |  | 
 | //===----------------------------------------------------------------------===// | 
 | // Generic Processor Scheduler Models. | 
 |  | 
 | // IssueWidth is analogous to the number of decode units. Core and its | 
 | // descendents, including Nehalem and SandyBridge have 4 decoders. | 
 | // Resources beyond the decoder operate on micro-ops and are bufferred | 
 | // so adjacent micro-ops don't directly compete. | 
 | // | 
 | // MicroOpBufferSize > 1 indicates that RAW dependencies can be | 
 | // decoded in the same cycle. The value 32 is a reasonably arbitrary | 
 | // number of in-flight instructions. | 
 | // | 
 | // HighLatency=10 is optimistic. X86InstrInfo::isHighLatencyDef | 
 | // indicates high latency opcodes. Alternatively, InstrItinData | 
 | // entries may be included here to define specific operand | 
 | // latencies. Since these latencies are not used for pipeline hazards, | 
 | // they do not need to be exact. | 
 | // | 
 | // The GenericX86Model contains no instruction schedules | 
 | // and disables PostRAScheduler. | 
 | class GenericX86Model : SchedMachineModel { | 
 |   let IssueWidth = 4; | 
 |   let MicroOpBufferSize = 32; | 
 |   let LoadLatency = 4; | 
 |   let HighLatency = 10; | 
 |   let PostRAScheduler = 0; | 
 |   let CompleteModel = 0; | 
 | } | 
 |  | 
 | def GenericModel : GenericX86Model; | 
 |  | 
 | // Define a model with the PostRAScheduler enabled. | 
 | def GenericPostRAModel : GenericX86Model { | 
 |   let PostRAScheduler = 1; | 
 | } |