|  | //===-- 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<CheckInvalidRegOperand<1>>, | 
|  |  | 
|  | // isRegOperand(Index) | 
|  | CheckIsRegOperand<3>, | 
|  | CheckNot<CheckInvalidRegOperand<3>>, | 
|  |  | 
|  | // hasLEAOffset(Offset) | 
|  | CheckAny<[ | 
|  | CheckAll<[ | 
|  | CheckIsImmOperand<4>, | 
|  | CheckNot<CheckZeroOperand<4>> | 
|  | ]>, | 
|  | CheckNonPortable<"MI.getOperand(4).isGlobal()"> | 
|  | ]> | 
|  | ]>; | 
|  |  | 
|  | def LEACases : MCOpcodeSwitchCase< | 
|  | [LEA32r, LEA64r, LEA64_32r, LEA16r], | 
|  | MCReturnStatement<IsThreeOperandsLEAPredicate> | 
|  | >; | 
|  |  | 
|  | // Used to generate the body of a TII member function. | 
|  | def IsThreeOperandsLEABody : | 
|  | MCOpcodeSwitchStatement<[LEACases], MCReturnStatement<FalsePred>>; | 
|  |  | 
|  | // 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 | 
|  | ]>; |