1//===-- X86Schedule.td - X86 Scheduling Definitions --------*- tablegen -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9//===----------------------------------------------------------------------===// 10// InstrSchedModel annotations for out-of-order CPUs. 11 12// Instructions with folded loads need to read the memory operand immediately, 13// but other register operands don't have to be read until the load is ready. 14// These operands are marked with ReadAfterLd. 15def ReadAfterLd : SchedRead; 16def ReadAfterVecLd : SchedRead; 17def ReadAfterVecXLd : SchedRead; 18def ReadAfterVecYLd : SchedRead; 19 20// Instructions that move data between general purpose registers and vector 21// registers may be subject to extra latency due to data bypass delays. 22// This SchedRead describes a bypass delay caused by data being moved from the 23// integer unit to the floating point unit. 24def ReadInt2Fpu : SchedRead; 25 26// Instructions with both a load and a store folded are modeled as a folded 27// load + WriteRMW. 28def WriteRMW : SchedWrite; 29 30// Helper to set SchedWrite ExePorts/Latency/ResourceCycles/NumMicroOps. 31multiclass X86WriteRes<SchedWrite SchedRW, 32 list<ProcResourceKind> ExePorts, 33 int Lat, list<int> Res, int UOps> { 34 def : WriteRes<SchedRW, ExePorts> { 35 let Latency = Lat; 36 let ResourceCycles = Res; 37 let NumMicroOps = UOps; 38 } 39} 40 41// Most instructions can fold loads, so almost every SchedWrite comes in two 42// variants: With and without a folded load. 43// An X86FoldableSchedWrite holds a reference to the corresponding SchedWrite 44// with a folded load. 45class X86FoldableSchedWrite : SchedWrite { 46 // The SchedWrite to use when a load is folded into the instruction. 47 SchedWrite Folded; 48 // The SchedRead to tag register operands than don't need to be ready 49 // until the folded load has completed. 50 SchedRead ReadAfterFold; 51} 52 53// Multiclass that produces a linked pair of SchedWrites. 54multiclass X86SchedWritePair<SchedRead ReadAfter = ReadAfterLd> { 55 // Register-Memory operation. 56 def Ld : SchedWrite; 57 // Register-Register operation. 58 def NAME : X86FoldableSchedWrite { 59 let Folded = !cast<SchedWrite>(NAME#"Ld"); 60 let ReadAfterFold = ReadAfter; 61 } 62} 63 64// Helpers to mark SchedWrites as unsupported. 65multiclass X86WriteResUnsupported<SchedWrite SchedRW> { 66 let Unsupported = 1 in { 67 def : WriteRes<SchedRW, []>; 68 } 69} 70multiclass X86WriteResPairUnsupported<X86FoldableSchedWrite SchedRW> { 71 let Unsupported = 1 in { 72 def : WriteRes<SchedRW, []>; 73 def : WriteRes<SchedRW.Folded, []>; 74 } 75} 76 77// Multiclass that wraps X86FoldableSchedWrite for each vector width. 78class X86SchedWriteWidths<X86FoldableSchedWrite sScl, 79 X86FoldableSchedWrite s128, 80 X86FoldableSchedWrite s256, 81 X86FoldableSchedWrite s512> { 82 X86FoldableSchedWrite Scl = sScl; // Scalar float/double operations. 83 X86FoldableSchedWrite MMX = sScl; // MMX operations. 84 X86FoldableSchedWrite XMM = s128; // XMM operations. 85 X86FoldableSchedWrite YMM = s256; // YMM operations. 86 X86FoldableSchedWrite ZMM = s512; // ZMM operations. 87} 88 89// Multiclass that wraps X86SchedWriteWidths for each fp vector type. 90class X86SchedWriteSizes<X86SchedWriteWidths sPS, 91 X86SchedWriteWidths sPD> { 92 X86SchedWriteWidths PS = sPS; 93 X86SchedWriteWidths PD = sPD; 94} 95 96// Multiclass that wraps move/load/store triple for a vector width. 97class X86SchedWriteMoveLS<SchedWrite MoveRR, 98 SchedWrite LoadRM, 99 SchedWrite StoreMR> { 100 SchedWrite RR = MoveRR; 101 SchedWrite RM = LoadRM; 102 SchedWrite MR = StoreMR; 103} 104 105// Multiclass that wraps masked load/store writes for a vector width. 106class X86SchedWriteMaskMove<SchedWrite LoadRM, SchedWrite StoreMR> { 107 SchedWrite RM = LoadRM; 108 SchedWrite MR = StoreMR; 109} 110 111// Multiclass that wraps X86SchedWriteMoveLS for each vector width. 112class X86SchedWriteMoveLSWidths<X86SchedWriteMoveLS sScl, 113 X86SchedWriteMoveLS s128, 114 X86SchedWriteMoveLS s256, 115 X86SchedWriteMoveLS s512> { 116 X86SchedWriteMoveLS Scl = sScl; // Scalar float/double operations. 117 X86SchedWriteMoveLS MMX = sScl; // MMX operations. 118 X86SchedWriteMoveLS XMM = s128; // XMM operations. 119 X86SchedWriteMoveLS YMM = s256; // YMM operations. 120 X86SchedWriteMoveLS ZMM = s512; // ZMM operations. 121} 122 123// Loads, stores, and moves, not folded with other operations. 124def WriteLoad : SchedWrite; 125def WriteStore : SchedWrite; 126def WriteStoreNT : SchedWrite; 127def WriteMove : SchedWrite; 128def WriteCopy : WriteSequence<[WriteLoad, WriteStore]>; // mem->mem copy 129 130// Arithmetic. 131defm WriteALU : X86SchedWritePair; // Simple integer ALU op. 132defm WriteADC : X86SchedWritePair; // Integer ALU + flags op. 133def WriteALURMW : WriteSequence<[WriteALULd, WriteRMW]>; 134def WriteADCRMW : WriteSequence<[WriteADCLd, WriteRMW]>; 135def WriteLEA : SchedWrite; // LEA instructions can't fold loads. 136 137// Integer multiplication 138defm WriteIMul8 : X86SchedWritePair; // Integer 8-bit multiplication. 139defm WriteIMul16 : X86SchedWritePair; // Integer 16-bit multiplication. 140defm WriteIMul16Imm : X86SchedWritePair; // Integer 16-bit multiplication by immediate. 141defm WriteIMul16Reg : X86SchedWritePair; // Integer 16-bit multiplication by register. 142defm WriteIMul32 : X86SchedWritePair; // Integer 32-bit multiplication. 143defm WriteIMul32Imm : X86SchedWritePair; // Integer 32-bit multiplication by immediate. 144defm WriteIMul32Reg : X86SchedWritePair; // Integer 32-bit multiplication by register. 145defm WriteIMul64 : X86SchedWritePair; // Integer 64-bit multiplication. 146defm WriteIMul64Imm : X86SchedWritePair; // Integer 64-bit multiplication by immediate. 147defm WriteIMul64Reg : X86SchedWritePair; // Integer 64-bit multiplication by register. 148def WriteIMulH : SchedWrite; // Integer multiplication, high part. 149 150def WriteBSWAP32 : SchedWrite; // Byte Order (Endianness) 32-bit Swap. 151def WriteBSWAP64 : SchedWrite; // Byte Order (Endianness) 64-bit Swap. 152defm WriteCMPXCHG : X86SchedWritePair; // Compare and set, compare and swap. 153def WriteCMPXCHGRMW : SchedWrite; // Compare and set, compare and swap. 154def WriteXCHG : SchedWrite; // Compare+Exchange - TODO RMW support. 155 156// Integer division. 157defm WriteDiv8 : X86SchedWritePair; 158defm WriteDiv16 : X86SchedWritePair; 159defm WriteDiv32 : X86SchedWritePair; 160defm WriteDiv64 : X86SchedWritePair; 161defm WriteIDiv8 : X86SchedWritePair; 162defm WriteIDiv16 : X86SchedWritePair; 163defm WriteIDiv32 : X86SchedWritePair; 164defm WriteIDiv64 : X86SchedWritePair; 165 166defm WriteBSF : X86SchedWritePair; // Bit scan forward. 167defm WriteBSR : X86SchedWritePair; // Bit scan reverse. 168defm WritePOPCNT : X86SchedWritePair; // Bit population count. 169defm WriteLZCNT : X86SchedWritePair; // Leading zero count. 170defm WriteTZCNT : X86SchedWritePair; // Trailing zero count. 171defm WriteCMOV : X86SchedWritePair; // Conditional move. 172def WriteFCMOV : SchedWrite; // X87 conditional move. 173def WriteSETCC : SchedWrite; // Set register based on condition code. 174def WriteSETCCStore : SchedWrite; 175def WriteLAHFSAHF : SchedWrite; // Load/Store flags in AH. 176 177def WriteBitTest : SchedWrite; // Bit Test 178def WriteBitTestImmLd : SchedWrite; 179def WriteBitTestRegLd : SchedWrite; 180 181def WriteBitTestSet : SchedWrite; // Bit Test + Set 182def WriteBitTestSetImmLd : SchedWrite; 183def WriteBitTestSetRegLd : SchedWrite; 184def WriteBitTestSetImmRMW : WriteSequence<[WriteBitTestSetImmLd, WriteRMW]>; 185def WriteBitTestSetRegRMW : WriteSequence<[WriteBitTestSetRegLd, WriteRMW]>; 186 187// Integer shifts and rotates. 188defm WriteShift : X86SchedWritePair; 189defm WriteShiftCL : X86SchedWritePair; 190defm WriteRotate : X86SchedWritePair; 191defm WriteRotateCL : X86SchedWritePair; 192 193// Double shift instructions. 194def WriteSHDrri : SchedWrite; 195def WriteSHDrrcl : SchedWrite; 196def WriteSHDmri : SchedWrite; 197def WriteSHDmrcl : SchedWrite; 198 199// BMI1 BEXTR/BLS, BMI2 BZHI 200defm WriteBEXTR : X86SchedWritePair; 201defm WriteBLS : X86SchedWritePair; 202defm WriteBZHI : X86SchedWritePair; 203 204// Idioms that clear a register, like xorps %xmm0, %xmm0. 205// These can often bypass execution ports completely. 206def WriteZero : SchedWrite; 207 208// Branches don't produce values, so they have no latency, but they still 209// consume resources. Indirect branches can fold loads. 210defm WriteJump : X86SchedWritePair; 211 212// Floating point. This covers both scalar and vector operations. 213def WriteFLD0 : SchedWrite; 214def WriteFLD1 : SchedWrite; 215def WriteFLDC : SchedWrite; 216def WriteFLoad : SchedWrite; 217def WriteFLoadX : SchedWrite; 218def WriteFLoadY : SchedWrite; 219def WriteFMaskedLoad : SchedWrite; 220def WriteFMaskedLoadY : SchedWrite; 221def WriteFStore : SchedWrite; 222def WriteFStoreX : SchedWrite; 223def WriteFStoreY : SchedWrite; 224def WriteFStoreNT : SchedWrite; 225def WriteFStoreNTX : SchedWrite; 226def WriteFStoreNTY : SchedWrite; 227 228def WriteFMaskedStore32 : SchedWrite; 229def WriteFMaskedStore64 : SchedWrite; 230def WriteFMaskedStore32Y : SchedWrite; 231def WriteFMaskedStore64Y : SchedWrite; 232 233def WriteFMove : SchedWrite; 234def WriteFMoveX : SchedWrite; 235def WriteFMoveY : SchedWrite; 236 237defm WriteFAdd : X86SchedWritePair<ReadAfterVecLd>; // Floating point add/sub. 238defm WriteFAddX : X86SchedWritePair<ReadAfterVecXLd>; // Floating point add/sub (XMM). 239defm WriteFAddY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point add/sub (YMM). 240defm WriteFAddZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point add/sub (ZMM). 241defm WriteFAdd64 : X86SchedWritePair<ReadAfterVecLd>; // Floating point double add/sub. 242defm WriteFAdd64X : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double add/sub (XMM). 243defm WriteFAdd64Y : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double add/sub (YMM). 244defm WriteFAdd64Z : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double add/sub (ZMM). 245defm WriteFCmp : X86SchedWritePair<ReadAfterVecLd>; // Floating point compare. 246defm WriteFCmpX : X86SchedWritePair<ReadAfterVecXLd>; // Floating point compare (XMM). 247defm WriteFCmpY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point compare (YMM). 248defm WriteFCmpZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point compare (ZMM). 249defm WriteFCmp64 : X86SchedWritePair<ReadAfterVecLd>; // Floating point double compare. 250defm WriteFCmp64X : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double compare (XMM). 251defm WriteFCmp64Y : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double compare (YMM). 252defm WriteFCmp64Z : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double compare (ZMM). 253defm WriteFCom : X86SchedWritePair<ReadAfterVecLd>; // Floating point compare to flags (X87). 254defm WriteFComX : X86SchedWritePair<ReadAfterVecLd>; // Floating point compare to flags (SSE). 255defm WriteFMul : X86SchedWritePair<ReadAfterVecLd>; // Floating point multiplication. 256defm WriteFMulX : X86SchedWritePair<ReadAfterVecXLd>; // Floating point multiplication (XMM). 257defm WriteFMulY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point multiplication (YMM). 258defm WriteFMulZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point multiplication (YMM). 259defm WriteFMul64 : X86SchedWritePair<ReadAfterVecLd>; // Floating point double multiplication. 260defm WriteFMul64X : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double multiplication (XMM). 261defm WriteFMul64Y : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double multiplication (YMM). 262defm WriteFMul64Z : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double multiplication (ZMM). 263defm WriteFDiv : X86SchedWritePair<ReadAfterVecLd>; // Floating point division. 264defm WriteFDivX : X86SchedWritePair<ReadAfterVecXLd>; // Floating point division (XMM). 265defm WriteFDivY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point division (YMM). 266defm WriteFDivZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point division (ZMM). 267defm WriteFDiv64 : X86SchedWritePair<ReadAfterVecLd>; // Floating point double division. 268defm WriteFDiv64X : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double division (XMM). 269defm WriteFDiv64Y : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double division (YMM). 270defm WriteFDiv64Z : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double division (ZMM). 271defm WriteFSqrt : X86SchedWritePair<ReadAfterVecLd>; // Floating point square root. 272defm WriteFSqrtX : X86SchedWritePair<ReadAfterVecXLd>; // Floating point square root (XMM). 273defm WriteFSqrtY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point square root (YMM). 274defm WriteFSqrtZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point square root (ZMM). 275defm WriteFSqrt64 : X86SchedWritePair<ReadAfterVecLd>; // Floating point double square root. 276defm WriteFSqrt64X : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double square root (XMM). 277defm WriteFSqrt64Y : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double square root (YMM). 278defm WriteFSqrt64Z : X86SchedWritePair<ReadAfterVecYLd>; // Floating point double square root (ZMM). 279defm WriteFSqrt80 : X86SchedWritePair<ReadAfterVecLd>; // Floating point long double square root. 280defm WriteFRcp : X86SchedWritePair<ReadAfterVecLd>; // Floating point reciprocal estimate. 281defm WriteFRcpX : X86SchedWritePair<ReadAfterVecXLd>; // Floating point reciprocal estimate (XMM). 282defm WriteFRcpY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point reciprocal estimate (YMM). 283defm WriteFRcpZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point reciprocal estimate (ZMM). 284defm WriteFRsqrt : X86SchedWritePair<ReadAfterVecLd>; // Floating point reciprocal square root estimate. 285defm WriteFRsqrtX: X86SchedWritePair<ReadAfterVecXLd>; // Floating point reciprocal square root estimate (XMM). 286defm WriteFRsqrtY: X86SchedWritePair<ReadAfterVecYLd>; // Floating point reciprocal square root estimate (YMM). 287defm WriteFRsqrtZ: X86SchedWritePair<ReadAfterVecYLd>; // Floating point reciprocal square root estimate (ZMM). 288defm WriteFMA : X86SchedWritePair<ReadAfterVecLd>; // Fused Multiply Add. 289defm WriteFMAX : X86SchedWritePair<ReadAfterVecXLd>; // Fused Multiply Add (XMM). 290defm WriteFMAY : X86SchedWritePair<ReadAfterVecYLd>; // Fused Multiply Add (YMM). 291defm WriteFMAZ : X86SchedWritePair<ReadAfterVecYLd>; // Fused Multiply Add (ZMM). 292defm WriteDPPD : X86SchedWritePair<ReadAfterVecXLd>; // Floating point double dot product. 293defm WriteDPPS : X86SchedWritePair<ReadAfterVecXLd>; // Floating point single dot product. 294defm WriteDPPSY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point single dot product (YMM). 295defm WriteDPPSZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point single dot product (ZMM). 296defm WriteFSign : X86SchedWritePair<ReadAfterVecLd>; // Floating point fabs/fchs. 297defm WriteFRnd : X86SchedWritePair<ReadAfterVecXLd>; // Floating point rounding. 298defm WriteFRndY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point rounding (YMM). 299defm WriteFRndZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point rounding (ZMM). 300defm WriteFLogic : X86SchedWritePair<ReadAfterVecXLd>; // Floating point and/or/xor logicals. 301defm WriteFLogicY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point and/or/xor logicals (YMM). 302defm WriteFLogicZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point and/or/xor logicals (ZMM). 303defm WriteFTest : X86SchedWritePair<ReadAfterVecXLd>; // Floating point TEST instructions. 304defm WriteFTestY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point TEST instructions (YMM). 305defm WriteFTestZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point TEST instructions (ZMM). 306defm WriteFShuffle : X86SchedWritePair<ReadAfterVecXLd>; // Floating point vector shuffles. 307defm WriteFShuffleY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector shuffles (YMM). 308defm WriteFShuffleZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector shuffles (ZMM). 309defm WriteFVarShuffle : X86SchedWritePair<ReadAfterVecXLd>; // Floating point vector variable shuffles. 310defm WriteFVarShuffleY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector variable shuffles (YMM). 311defm WriteFVarShuffleZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector variable shuffles (ZMM). 312defm WriteFBlend : X86SchedWritePair<ReadAfterVecXLd>; // Floating point vector blends. 313defm WriteFBlendY : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector blends (YMM). 314defm WriteFBlendZ : X86SchedWritePair<ReadAfterVecYLd>; // Floating point vector blends (ZMM). 315defm WriteFVarBlend : X86SchedWritePair<ReadAfterVecXLd>; // Fp vector variable blends. 316defm WriteFVarBlendY : X86SchedWritePair<ReadAfterVecYLd>; // Fp vector variable blends (YMM). 317defm WriteFVarBlendZ : X86SchedWritePair<ReadAfterVecYLd>; // Fp vector variable blends (YMZMM). 318 319// FMA Scheduling helper class. 320class FMASC { X86FoldableSchedWrite Sched = WriteFAdd; } 321 322// Horizontal Add/Sub (float and integer) 323defm WriteFHAdd : X86SchedWritePair<ReadAfterVecXLd>; 324defm WriteFHAddY : X86SchedWritePair<ReadAfterVecYLd>; 325defm WriteFHAddZ : X86SchedWritePair<ReadAfterVecYLd>; 326defm WritePHAdd : X86SchedWritePair<ReadAfterVecLd>; 327defm WritePHAddX : X86SchedWritePair<ReadAfterVecXLd>; 328defm WritePHAddY : X86SchedWritePair<ReadAfterVecYLd>; 329defm WritePHAddZ : X86SchedWritePair<ReadAfterVecYLd>; 330 331// Vector integer operations. 332def WriteVecLoad : SchedWrite; 333def WriteVecLoadX : SchedWrite; 334def WriteVecLoadY : SchedWrite; 335def WriteVecLoadNT : SchedWrite; 336def WriteVecLoadNTY : SchedWrite; 337def WriteVecMaskedLoad : SchedWrite; 338def WriteVecMaskedLoadY : SchedWrite; 339def WriteVecStore : SchedWrite; 340def WriteVecStoreX : SchedWrite; 341def WriteVecStoreY : SchedWrite; 342def WriteVecStoreNT : SchedWrite; 343def WriteVecStoreNTY : SchedWrite; 344def WriteVecMaskedStore32 : SchedWrite; 345def WriteVecMaskedStore64 : SchedWrite; 346def WriteVecMaskedStore32Y : SchedWrite; 347def WriteVecMaskedStore64Y : SchedWrite; 348def WriteVecMove : SchedWrite; 349def WriteVecMoveX : SchedWrite; 350def WriteVecMoveY : SchedWrite; 351def WriteVecMoveToGpr : SchedWrite; 352def WriteVecMoveFromGpr : SchedWrite; 353 354defm WriteVecALU : X86SchedWritePair<ReadAfterVecLd>; // Vector integer ALU op, no logicals. 355defm WriteVecALUX : X86SchedWritePair<ReadAfterVecXLd>; // Vector integer ALU op, no logicals (XMM). 356defm WriteVecALUY : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer ALU op, no logicals (YMM). 357defm WriteVecALUZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer ALU op, no logicals (ZMM). 358defm WriteVecLogic : X86SchedWritePair<ReadAfterVecLd>; // Vector integer and/or/xor logicals. 359defm WriteVecLogicX : X86SchedWritePair<ReadAfterVecXLd>; // Vector integer and/or/xor logicals (XMM). 360defm WriteVecLogicY : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer and/or/xor logicals (YMM). 361defm WriteVecLogicZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer and/or/xor logicals (ZMM). 362defm WriteVecTest : X86SchedWritePair<ReadAfterVecXLd>; // Vector integer TEST instructions. 363defm WriteVecTestY : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer TEST instructions (YMM). 364defm WriteVecTestZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer TEST instructions (ZMM). 365defm WriteVecShift : X86SchedWritePair<ReadAfterVecLd>; // Vector integer shifts (default). 366defm WriteVecShiftX : X86SchedWritePair<ReadAfterVecXLd>; // Vector integer shifts (XMM). 367defm WriteVecShiftY : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer shifts (YMM). 368defm WriteVecShiftZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer shifts (ZMM). 369defm WriteVecShiftImm : X86SchedWritePair<ReadAfterVecLd>; // Vector integer immediate shifts (default). 370defm WriteVecShiftImmX: X86SchedWritePair<ReadAfterVecXLd>; // Vector integer immediate shifts (XMM). 371defm WriteVecShiftImmY: X86SchedWritePair<ReadAfterVecYLd>; // Vector integer immediate shifts (YMM). 372defm WriteVecShiftImmZ: X86SchedWritePair<ReadAfterVecYLd>; // Vector integer immediate shifts (ZMM). 373defm WriteVecIMul : X86SchedWritePair<ReadAfterVecLd>; // Vector integer multiply (default). 374defm WriteVecIMulX : X86SchedWritePair<ReadAfterVecXLd>; // Vector integer multiply (XMM). 375defm WriteVecIMulY : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer multiply (YMM). 376defm WriteVecIMulZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector integer multiply (ZMM). 377defm WritePMULLD : X86SchedWritePair<ReadAfterVecXLd>; // Vector PMULLD. 378defm WritePMULLDY : X86SchedWritePair<ReadAfterVecYLd>; // Vector PMULLD (YMM). 379defm WritePMULLDZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector PMULLD (ZMM). 380defm WriteShuffle : X86SchedWritePair<ReadAfterVecLd>; // Vector shuffles. 381defm WriteShuffleX : X86SchedWritePair<ReadAfterVecXLd>; // Vector shuffles (XMM). 382defm WriteShuffleY : X86SchedWritePair<ReadAfterVecYLd>; // Vector shuffles (YMM). 383defm WriteShuffleZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector shuffles (ZMM). 384defm WriteVarShuffle : X86SchedWritePair<ReadAfterVecLd>; // Vector variable shuffles. 385defm WriteVarShuffleX : X86SchedWritePair<ReadAfterVecXLd>; // Vector variable shuffles (XMM). 386defm WriteVarShuffleY : X86SchedWritePair<ReadAfterVecYLd>; // Vector variable shuffles (YMM). 387defm WriteVarShuffleZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector variable shuffles (ZMM). 388defm WriteBlend : X86SchedWritePair<ReadAfterVecXLd>; // Vector blends. 389defm WriteBlendY : X86SchedWritePair<ReadAfterVecYLd>; // Vector blends (YMM). 390defm WriteBlendZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector blends (ZMM). 391defm WriteVarBlend : X86SchedWritePair<ReadAfterVecXLd>; // Vector variable blends. 392defm WriteVarBlendY : X86SchedWritePair<ReadAfterVecYLd>; // Vector variable blends (YMM). 393defm WriteVarBlendZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector variable blends (ZMM). 394defm WritePSADBW : X86SchedWritePair<ReadAfterVecLd>; // Vector PSADBW. 395defm WritePSADBWX : X86SchedWritePair<ReadAfterVecXLd>; // Vector PSADBW (XMM). 396defm WritePSADBWY : X86SchedWritePair<ReadAfterVecYLd>; // Vector PSADBW (YMM). 397defm WritePSADBWZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector PSADBW (ZMM). 398defm WriteMPSAD : X86SchedWritePair<ReadAfterVecXLd>; // Vector MPSAD. 399defm WriteMPSADY : X86SchedWritePair<ReadAfterVecYLd>; // Vector MPSAD (YMM). 400defm WriteMPSADZ : X86SchedWritePair<ReadAfterVecYLd>; // Vector MPSAD (ZMM). 401defm WritePHMINPOS : X86SchedWritePair<ReadAfterVecXLd>; // Vector PHMINPOS. 402 403// Vector insert/extract operations. 404defm WriteVecInsert : X86SchedWritePair; // Insert gpr to vector element. 405def WriteVecExtract : SchedWrite; // Extract vector element to gpr. 406def WriteVecExtractSt : SchedWrite; // Extract vector element and store. 407 408// MOVMSK operations. 409def WriteFMOVMSK : SchedWrite; 410def WriteVecMOVMSK : SchedWrite; 411def WriteVecMOVMSKY : SchedWrite; 412def WriteMMXMOVMSK : SchedWrite; 413 414// Conversion between integer and float. 415defm WriteCvtSD2I : X86SchedWritePair<ReadAfterVecLd>; // Double -> Integer. 416defm WriteCvtPD2I : X86SchedWritePair<ReadAfterVecXLd>; // Double -> Integer (XMM). 417defm WriteCvtPD2IY : X86SchedWritePair<ReadAfterVecYLd>; // Double -> Integer (YMM). 418defm WriteCvtPD2IZ : X86SchedWritePair<ReadAfterVecYLd>; // Double -> Integer (ZMM). 419 420defm WriteCvtSS2I : X86SchedWritePair<ReadAfterVecLd>; // Float -> Integer. 421defm WriteCvtPS2I : X86SchedWritePair<ReadAfterVecXLd>; // Float -> Integer (XMM). 422defm WriteCvtPS2IY : X86SchedWritePair<ReadAfterVecYLd>; // Float -> Integer (YMM). 423defm WriteCvtPS2IZ : X86SchedWritePair<ReadAfterVecYLd>; // Float -> Integer (ZMM). 424 425defm WriteCvtI2SD : X86SchedWritePair<ReadAfterVecLd>; // Integer -> Double. 426defm WriteCvtI2PD : X86SchedWritePair<ReadAfterVecXLd>; // Integer -> Double (XMM). 427defm WriteCvtI2PDY : X86SchedWritePair<ReadAfterVecYLd>; // Integer -> Double (YMM). 428defm WriteCvtI2PDZ : X86SchedWritePair<ReadAfterVecYLd>; // Integer -> Double (ZMM). 429 430defm WriteCvtI2SS : X86SchedWritePair<ReadAfterVecLd>; // Integer -> Float. 431defm WriteCvtI2PS : X86SchedWritePair<ReadAfterVecXLd>; // Integer -> Float (XMM). 432defm WriteCvtI2PSY : X86SchedWritePair<ReadAfterVecYLd>; // Integer -> Float (YMM). 433defm WriteCvtI2PSZ : X86SchedWritePair<ReadAfterVecYLd>; // Integer -> Float (ZMM). 434 435defm WriteCvtSS2SD : X86SchedWritePair<ReadAfterVecLd>; // Float -> Double size conversion. 436defm WriteCvtPS2PD : X86SchedWritePair<ReadAfterVecXLd>; // Float -> Double size conversion (XMM). 437defm WriteCvtPS2PDY : X86SchedWritePair<ReadAfterVecYLd>; // Float -> Double size conversion (YMM). 438defm WriteCvtPS2PDZ : X86SchedWritePair<ReadAfterVecYLd>; // Float -> Double size conversion (ZMM). 439 440defm WriteCvtSD2SS : X86SchedWritePair<ReadAfterVecLd>; // Double -> Float size conversion. 441defm WriteCvtPD2PS : X86SchedWritePair<ReadAfterVecXLd>; // Double -> Float size conversion (XMM). 442defm WriteCvtPD2PSY : X86SchedWritePair<ReadAfterVecYLd>; // Double -> Float size conversion (YMM). 443defm WriteCvtPD2PSZ : X86SchedWritePair<ReadAfterVecYLd>; // Double -> Float size conversion (ZMM). 444 445defm WriteCvtPH2PS : X86SchedWritePair<ReadAfterVecXLd>; // Half -> Float size conversion. 446defm WriteCvtPH2PSY : X86SchedWritePair<ReadAfterVecYLd>; // Half -> Float size conversion (YMM). 447defm WriteCvtPH2PSZ : X86SchedWritePair<ReadAfterVecYLd>; // Half -> Float size conversion (ZMM). 448 449def WriteCvtPS2PH : SchedWrite; // // Float -> Half size conversion. 450def WriteCvtPS2PHY : SchedWrite; // // Float -> Half size conversion (YMM). 451def WriteCvtPS2PHZ : SchedWrite; // // Float -> Half size conversion (ZMM). 452def WriteCvtPS2PHSt : SchedWrite; // // Float -> Half + store size conversion. 453def WriteCvtPS2PHYSt : SchedWrite; // // Float -> Half + store size conversion (YMM). 454def WriteCvtPS2PHZSt : SchedWrite; // // Float -> Half + store size conversion (ZMM). 455 456// CRC32 instruction. 457defm WriteCRC32 : X86SchedWritePair<ReadAfterLd>; 458 459// Strings instructions. 460// Packed Compare Implicit Length Strings, Return Mask 461defm WritePCmpIStrM : X86SchedWritePair<ReadAfterVecXLd>; 462// Packed Compare Explicit Length Strings, Return Mask 463defm WritePCmpEStrM : X86SchedWritePair<ReadAfterVecXLd>; 464// Packed Compare Implicit Length Strings, Return Index 465defm WritePCmpIStrI : X86SchedWritePair<ReadAfterVecXLd>; 466// Packed Compare Explicit Length Strings, Return Index 467defm WritePCmpEStrI : X86SchedWritePair<ReadAfterVecXLd>; 468 469// AES instructions. 470defm WriteAESDecEnc : X86SchedWritePair<ReadAfterVecXLd>; // Decryption, encryption. 471defm WriteAESIMC : X86SchedWritePair<ReadAfterVecXLd>; // InvMixColumn. 472defm WriteAESKeyGen : X86SchedWritePair<ReadAfterVecXLd>; // Key Generation. 473 474// Carry-less multiplication instructions. 475defm WriteCLMul : X86SchedWritePair<ReadAfterVecXLd>; 476 477// EMMS/FEMMS 478def WriteEMMS : SchedWrite; 479 480// Load/store MXCSR 481def WriteLDMXCSR : SchedWrite; 482def WriteSTMXCSR : SchedWrite; 483 484// Catch-all for expensive system instructions. 485def WriteSystem : SchedWrite; 486 487// AVX2. 488defm WriteFShuffle256 : X86SchedWritePair<ReadAfterVecYLd>; // Fp 256-bit width vector shuffles. 489defm WriteFVarShuffle256 : X86SchedWritePair<ReadAfterVecYLd>; // Fp 256-bit width variable shuffles. 490defm WriteShuffle256 : X86SchedWritePair<ReadAfterVecYLd>; // 256-bit width vector shuffles. 491defm WriteVPMOV256 : X86SchedWritePair<ReadAfterVecYLd>; // 256-bit width packed vector width-changing move. 492defm WriteVarShuffle256 : X86SchedWritePair<ReadAfterVecYLd>; // 256-bit width vector variable shuffles. 493defm WriteVarVecShift : X86SchedWritePair<ReadAfterVecXLd>; // Variable vector shifts. 494defm WriteVarVecShiftY : X86SchedWritePair<ReadAfterVecYLd>; // Variable vector shifts (YMM). 495defm WriteVarVecShiftZ : X86SchedWritePair<ReadAfterVecYLd>; // Variable vector shifts (ZMM). 496 497// Old microcoded instructions that nobody use. 498def WriteMicrocoded : SchedWrite; 499 500// Fence instructions. 501def WriteFence : SchedWrite; 502 503// Nop, not very useful expect it provides a model for nops! 504def WriteNop : SchedWrite; 505 506// Move/Load/Store wrappers. 507def WriteFMoveLS 508 : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStore>; 509def WriteFMoveLSX 510 : X86SchedWriteMoveLS<WriteFMoveX, WriteFLoadX, WriteFStoreX>; 511def WriteFMoveLSY 512 : X86SchedWriteMoveLS<WriteFMoveY, WriteFLoadY, WriteFStoreY>; 513def SchedWriteFMoveLS 514 : X86SchedWriteMoveLSWidths<WriteFMoveLS, WriteFMoveLSX, 515 WriteFMoveLSY, WriteFMoveLSY>; 516 517def WriteFMoveLSNT 518 : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStoreNT>; 519def WriteFMoveLSNTX 520 : X86SchedWriteMoveLS<WriteFMove, WriteFLoad, WriteFStoreNTX>; 521def WriteFMoveLSNTY 522 : X86SchedWriteMoveLS<WriteFMoveY, WriteFLoadY, WriteFStoreNTY>; 523def SchedWriteFMoveLSNT 524 : X86SchedWriteMoveLSWidths<WriteFMoveLSNT, WriteFMoveLSNTX, 525 WriteFMoveLSNTY, WriteFMoveLSNTY>; 526 527def WriteVecMoveLS 528 : X86SchedWriteMoveLS<WriteVecMove, WriteVecLoad, WriteVecStore>; 529def WriteVecMoveLSX 530 : X86SchedWriteMoveLS<WriteVecMoveX, WriteVecLoadX, WriteVecStoreX>; 531def WriteVecMoveLSY 532 : X86SchedWriteMoveLS<WriteVecMoveY, WriteVecLoadY, WriteVecStoreY>; 533def SchedWriteVecMoveLS 534 : X86SchedWriteMoveLSWidths<WriteVecMoveLS, WriteVecMoveLSX, 535 WriteVecMoveLSY, WriteVecMoveLSY>; 536 537def WriteVecMoveLSNT 538 : X86SchedWriteMoveLS<WriteVecMove, WriteVecLoadNT, WriteVecStoreNT>; 539def WriteVecMoveLSNTX 540 : X86SchedWriteMoveLS<WriteVecMoveX, WriteVecLoadNT, WriteVecStoreNT>; 541def WriteVecMoveLSNTY 542 : X86SchedWriteMoveLS<WriteVecMoveY, WriteVecLoadNTY, WriteVecStoreNTY>; 543def SchedWriteVecMoveLSNT 544 : X86SchedWriteMoveLSWidths<WriteVecMoveLSNT, WriteVecMoveLSNTX, 545 WriteVecMoveLSNTY, WriteVecMoveLSNTY>; 546 547// Conditional SIMD Packed Loads and Stores wrappers. 548def WriteFMaskMove32 549 : X86SchedWriteMaskMove<WriteFMaskedLoad, WriteFMaskedStore32>; 550def WriteFMaskMove64 551 : X86SchedWriteMaskMove<WriteFMaskedLoad, WriteFMaskedStore64>; 552def WriteFMaskMove32Y 553 : X86SchedWriteMaskMove<WriteFMaskedLoadY, WriteFMaskedStore32Y>; 554def WriteFMaskMove64Y 555 : X86SchedWriteMaskMove<WriteFMaskedLoadY, WriteFMaskedStore64Y>; 556def WriteVecMaskMove32 557 : X86SchedWriteMaskMove<WriteVecMaskedLoad, WriteVecMaskedStore32>; 558def WriteVecMaskMove64 559 : X86SchedWriteMaskMove<WriteVecMaskedLoad, WriteVecMaskedStore64>; 560def WriteVecMaskMove32Y 561 : X86SchedWriteMaskMove<WriteVecMaskedLoadY, WriteVecMaskedStore32Y>; 562def WriteVecMaskMove64Y 563 : X86SchedWriteMaskMove<WriteVecMaskedLoadY, WriteVecMaskedStore64Y>; 564 565// Vector width wrappers. 566def SchedWriteFAdd 567 : X86SchedWriteWidths<WriteFAdd, WriteFAddX, WriteFAddY, WriteFAddZ>; 568def SchedWriteFAdd64 569 : X86SchedWriteWidths<WriteFAdd64, WriteFAdd64X, WriteFAdd64Y, WriteFAdd64Z>; 570def SchedWriteFHAdd 571 : X86SchedWriteWidths<WriteFHAdd, WriteFHAdd, WriteFHAddY, WriteFHAddZ>; 572def SchedWriteFCmp 573 : X86SchedWriteWidths<WriteFCmp, WriteFCmpX, WriteFCmpY, WriteFCmpZ>; 574def SchedWriteFCmp64 575 : X86SchedWriteWidths<WriteFCmp64, WriteFCmp64X, WriteFCmp64Y, WriteFCmp64Z>; 576def SchedWriteFMul 577 : X86SchedWriteWidths<WriteFMul, WriteFMulX, WriteFMulY, WriteFMulZ>; 578def SchedWriteFMul64 579 : X86SchedWriteWidths<WriteFMul64, WriteFMul64X, WriteFMul64Y, WriteFMul64Z>; 580def SchedWriteFMA 581 : X86SchedWriteWidths<WriteFMA, WriteFMAX, WriteFMAY, WriteFMAZ>; 582def SchedWriteDPPD 583 : X86SchedWriteWidths<WriteDPPD, WriteDPPD, WriteDPPD, WriteDPPD>; 584def SchedWriteDPPS 585 : X86SchedWriteWidths<WriteDPPS, WriteDPPS, WriteDPPSY, WriteDPPSZ>; 586def SchedWriteFDiv 587 : X86SchedWriteWidths<WriteFDiv, WriteFDivX, WriteFDivY, WriteFDivZ>; 588def SchedWriteFDiv64 589 : X86SchedWriteWidths<WriteFDiv64, WriteFDiv64X, WriteFDiv64Y, WriteFDiv64Z>; 590def SchedWriteFSqrt 591 : X86SchedWriteWidths<WriteFSqrt, WriteFSqrtX, 592 WriteFSqrtY, WriteFSqrtZ>; 593def SchedWriteFSqrt64 594 : X86SchedWriteWidths<WriteFSqrt64, WriteFSqrt64X, 595 WriteFSqrt64Y, WriteFSqrt64Z>; 596def SchedWriteFRcp 597 : X86SchedWriteWidths<WriteFRcp, WriteFRcpX, WriteFRcpY, WriteFRcpZ>; 598def SchedWriteFRsqrt 599 : X86SchedWriteWidths<WriteFRsqrt, WriteFRsqrtX, WriteFRsqrtY, WriteFRsqrtZ>; 600def SchedWriteFRnd 601 : X86SchedWriteWidths<WriteFRnd, WriteFRnd, WriteFRndY, WriteFRndZ>; 602def SchedWriteFLogic 603 : X86SchedWriteWidths<WriteFLogic, WriteFLogic, WriteFLogicY, WriteFLogicZ>; 604def SchedWriteFTest 605 : X86SchedWriteWidths<WriteFTest, WriteFTest, WriteFTestY, WriteFTestZ>; 606 607def SchedWriteFShuffle 608 : X86SchedWriteWidths<WriteFShuffle, WriteFShuffle, 609 WriteFShuffleY, WriteFShuffleZ>; 610def SchedWriteFVarShuffle 611 : X86SchedWriteWidths<WriteFVarShuffle, WriteFVarShuffle, 612 WriteFVarShuffleY, WriteFVarShuffleZ>; 613def SchedWriteFBlend 614 : X86SchedWriteWidths<WriteFBlend, WriteFBlend, WriteFBlendY, WriteFBlendZ>; 615def SchedWriteFVarBlend 616 : X86SchedWriteWidths<WriteFVarBlend, WriteFVarBlend, 617 WriteFVarBlendY, WriteFVarBlendZ>; 618 619def SchedWriteCvtDQ2PD 620 : X86SchedWriteWidths<WriteCvtI2SD, WriteCvtI2PD, 621 WriteCvtI2PDY, WriteCvtI2PDZ>; 622def SchedWriteCvtDQ2PS 623 : X86SchedWriteWidths<WriteCvtI2SS, WriteCvtI2PS, 624 WriteCvtI2PSY, WriteCvtI2PSZ>; 625def SchedWriteCvtPD2DQ 626 : X86SchedWriteWidths<WriteCvtSD2I, WriteCvtPD2I, 627 WriteCvtPD2IY, WriteCvtPD2IZ>; 628def SchedWriteCvtPS2DQ 629 : X86SchedWriteWidths<WriteCvtSS2I, WriteCvtPS2I, 630 WriteCvtPS2IY, WriteCvtPS2IZ>; 631def SchedWriteCvtPS2PD 632 : X86SchedWriteWidths<WriteCvtSS2SD, WriteCvtPS2PD, 633 WriteCvtPS2PDY, WriteCvtPS2PDZ>; 634def SchedWriteCvtPD2PS 635 : X86SchedWriteWidths<WriteCvtSD2SS, WriteCvtPD2PS, 636 WriteCvtPD2PSY, WriteCvtPD2PSZ>; 637 638def SchedWriteVecALU 639 : X86SchedWriteWidths<WriteVecALU, WriteVecALUX, WriteVecALUY, WriteVecALUZ>; 640def SchedWritePHAdd 641 : X86SchedWriteWidths<WritePHAdd, WritePHAddX, WritePHAddY, WritePHAddZ>; 642def SchedWriteVecLogic 643 : X86SchedWriteWidths<WriteVecLogic, WriteVecLogicX, 644 WriteVecLogicY, WriteVecLogicZ>; 645def SchedWriteVecTest 646 : X86SchedWriteWidths<WriteVecTest, WriteVecTest, 647 WriteVecTestY, WriteVecTestZ>; 648def SchedWriteVecShift 649 : X86SchedWriteWidths<WriteVecShift, WriteVecShiftX, 650 WriteVecShiftY, WriteVecShiftZ>; 651def SchedWriteVecShiftImm 652 : X86SchedWriteWidths<WriteVecShiftImm, WriteVecShiftImmX, 653 WriteVecShiftImmY, WriteVecShiftImmZ>; 654def SchedWriteVarVecShift 655 : X86SchedWriteWidths<WriteVarVecShift, WriteVarVecShift, 656 WriteVarVecShiftY, WriteVarVecShiftZ>; 657def SchedWriteVecIMul 658 : X86SchedWriteWidths<WriteVecIMul, WriteVecIMulX, 659 WriteVecIMulY, WriteVecIMulZ>; 660def SchedWritePMULLD 661 : X86SchedWriteWidths<WritePMULLD, WritePMULLD, 662 WritePMULLDY, WritePMULLDZ>; 663def SchedWriteMPSAD 664 : X86SchedWriteWidths<WriteMPSAD, WriteMPSAD, 665 WriteMPSADY, WriteMPSADZ>; 666def SchedWritePSADBW 667 : X86SchedWriteWidths<WritePSADBW, WritePSADBWX, 668 WritePSADBWY, WritePSADBWZ>; 669 670def SchedWriteShuffle 671 : X86SchedWriteWidths<WriteShuffle, WriteShuffleX, 672 WriteShuffleY, WriteShuffleZ>; 673def SchedWriteVarShuffle 674 : X86SchedWriteWidths<WriteVarShuffle, WriteVarShuffleX, 675 WriteVarShuffleY, WriteVarShuffleZ>; 676def SchedWriteBlend 677 : X86SchedWriteWidths<WriteBlend, WriteBlend, WriteBlendY, WriteBlendZ>; 678def SchedWriteVarBlend 679 : X86SchedWriteWidths<WriteVarBlend, WriteVarBlend, 680 WriteVarBlendY, WriteVarBlendZ>; 681 682// Vector size wrappers. 683def SchedWriteFAddSizes 684 : X86SchedWriteSizes<SchedWriteFAdd, SchedWriteFAdd64>; 685def SchedWriteFCmpSizes 686 : X86SchedWriteSizes<SchedWriteFCmp, SchedWriteFCmp64>; 687def SchedWriteFMulSizes 688 : X86SchedWriteSizes<SchedWriteFMul, SchedWriteFMul64>; 689def SchedWriteFDivSizes 690 : X86SchedWriteSizes<SchedWriteFDiv, SchedWriteFDiv64>; 691def SchedWriteFSqrtSizes 692 : X86SchedWriteSizes<SchedWriteFSqrt, SchedWriteFSqrt64>; 693def SchedWriteFLogicSizes 694 : X86SchedWriteSizes<SchedWriteFLogic, SchedWriteFLogic>; 695def SchedWriteFShuffleSizes 696 : X86SchedWriteSizes<SchedWriteFShuffle, SchedWriteFShuffle>; 697 698//===----------------------------------------------------------------------===// 699// Generic Processor Scheduler Models. 700 701// IssueWidth is analogous to the number of decode units. Core and its 702// descendents, including Nehalem and SandyBridge have 4 decoders. 703// Resources beyond the decoder operate on micro-ops and are bufferred 704// so adjacent micro-ops don't directly compete. 705// 706// MicroOpBufferSize > 1 indicates that RAW dependencies can be 707// decoded in the same cycle. The value 32 is a reasonably arbitrary 708// number of in-flight instructions. 709// 710// HighLatency=10 is optimistic. X86InstrInfo::isHighLatencyDef 711// indicates high latency opcodes. Alternatively, InstrItinData 712// entries may be included here to define specific operand 713// latencies. Since these latencies are not used for pipeline hazards, 714// they do not need to be exact. 715// 716// The GenericX86Model contains no instruction schedules 717// and disables PostRAScheduler. 718class GenericX86Model : SchedMachineModel { 719 let IssueWidth = 4; 720 let MicroOpBufferSize = 32; 721 let LoadLatency = 4; 722 let HighLatency = 10; 723 let PostRAScheduler = 0; 724 let CompleteModel = 0; 725} 726 727def GenericModel : GenericX86Model; 728 729// Define a model with the PostRAScheduler enabled. 730def GenericPostRAModel : GenericX86Model { 731 let PostRAScheduler = 1; 732} 733