//===-- X86SchedPredicates.td - X86 Scheduling Predicates --*- tablegen -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file defines scheduling predicate definitions that are common to // all X86 subtargets. // //===----------------------------------------------------------------------===// // A predicate used to identify dependency-breaking instructions that clear the // content of the destination register. Note that this predicate only checks if // input registers are the same. This predicate doesn't make any assumptions on // the expected instruction opcodes, because different processors may implement // different zero-idioms. def ZeroIdiomPredicate : CheckSameRegOperand<1, 2>; // A predicate used to identify VPERM that have bits 3 and 7 of their mask set. // On some processors, these VPERM instructions are zero-idioms. def ZeroIdiomVPERMPredicate : CheckAll<[ ZeroIdiomPredicate, CheckImmOperand<3, 0x88> ]>; // A predicate used to check if a LEA instruction uses all three source // operands: base, index, and offset. def IsThreeOperandsLEAPredicate: CheckAll<[ // isRegOperand(Base) CheckIsRegOperand<1>, CheckNot>, // isRegOperand(Index) CheckIsRegOperand<3>, CheckNot>, // hasLEAOffset(Offset) CheckAny<[ CheckAll<[ CheckIsImmOperand<4>, CheckNot> ]>, CheckNonPortable<"MI.getOperand(4).isGlobal()"> ]> ]>; def LEACases : MCOpcodeSwitchCase< [LEA32r, LEA64r, LEA64_32r, LEA16r], MCReturnStatement >; // Used to generate the body of a TII member function. def IsThreeOperandsLEABody : MCOpcodeSwitchStatement<[LEACases], MCReturnStatement>; // This predicate evaluates to true only if the input machine instruction is a // 3-operands LEA. Tablegen automatically generates a new method for it in // X86GenInstrInfo. def IsThreeOperandsLEAFn : TIIPredicate<"isThreeOperandsLEA", IsThreeOperandsLEABody>; // A predicate to check for COND_A and COND_BE CMOVs which have an extra uop // on recent Intel CPUs. def IsCMOVArr_Or_CMOVBErr : CheckAny<[ CheckImmOperand_s<3, "X86::COND_A">, CheckImmOperand_s<3, "X86::COND_BE"> ]>; def IsCMOVArm_Or_CMOVBErm : CheckAny<[ CheckImmOperand_s<7, "X86::COND_A">, CheckImmOperand_s<7, "X86::COND_BE"> ]>; // A predicate to check for COND_A and COND_BE SETCCs which have an extra uop // on recent Intel CPUs. def IsSETAr_Or_SETBEr : CheckAny<[ CheckImmOperand_s<1, "X86::COND_A">, CheckImmOperand_s<1, "X86::COND_BE"> ]>; def IsSETAm_Or_SETBEm : CheckAny<[ CheckImmOperand_s<5, "X86::COND_A">, CheckImmOperand_s<5, "X86::COND_BE"> ]>; // A predicate used to check if an instruction has a LOCK prefix. def CheckLockPrefix : CheckFunctionPredicate< "X86_MC::hasLockPrefix", "X86InstrInfo::hasLockPrefix" >; def IsRegRegCompareAndSwap_8 : CheckOpcode<[ CMPXCHG8rr ]>; def IsRegMemCompareAndSwap_8 : CheckOpcode<[ LCMPXCHG8, CMPXCHG8rm ]>; def IsRegRegCompareAndSwap_16_32_64 : CheckOpcode<[ CMPXCHG16rr, CMPXCHG32rr, CMPXCHG64rr ]>; def IsRegMemCompareAndSwap_16_32_64 : CheckOpcode<[ CMPXCHG16rm, CMPXCHG32rm, CMPXCHG64rm, LCMPXCHG16, LCMPXCHG32, LCMPXCHG64, LCMPXCHG8B, LCMPXCHG16B ]>; def IsCompareAndSwap8B : CheckOpcode<[ CMPXCHG8B, LCMPXCHG8B ]>; def IsCompareAndSwap16B : CheckOpcode<[ CMPXCHG16B, LCMPXCHG16B ]>; def IsRegMemCompareAndSwap : CheckOpcode< !listconcat( IsRegMemCompareAndSwap_8.ValidOpcodes, IsRegMemCompareAndSwap_16_32_64.ValidOpcodes )>; def IsRegRegCompareAndSwap : CheckOpcode< !listconcat( IsRegRegCompareAndSwap_8.ValidOpcodes, IsRegRegCompareAndSwap_16_32_64.ValidOpcodes )>; def IsAtomicCompareAndSwap_8 : CheckAll<[ CheckLockPrefix, IsRegMemCompareAndSwap_8 ]>; def IsAtomicCompareAndSwap : CheckAll<[ CheckLockPrefix, IsRegMemCompareAndSwap ]>; def IsAtomicCompareAndSwap8B : CheckAll<[ CheckLockPrefix, IsCompareAndSwap8B ]>; def IsAtomicCompareAndSwap16B : CheckAll<[ CheckLockPrefix, IsCompareAndSwap16B ]>;