1b6022aa8SAndrea Di Biagio//===-- X86SchedPredicates.td - X86 Scheduling Predicates --*- tablegen -*-===// 2b6022aa8SAndrea Di Biagio// 32946cd70SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth// See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6b6022aa8SAndrea Di Biagio// 7b6022aa8SAndrea Di Biagio//===----------------------------------------------------------------------===// 8b6022aa8SAndrea Di Biagio// 9b6022aa8SAndrea Di Biagio// This file defines scheduling predicate definitions that are common to 10b6022aa8SAndrea Di Biagio// all X86 subtargets. 11b6022aa8SAndrea Di Biagio// 12b6022aa8SAndrea Di Biagio//===----------------------------------------------------------------------===// 13b6022aa8SAndrea Di Biagio 14b6022aa8SAndrea Di Biagio// A predicate used to identify dependency-breaking instructions that clear the 15b6022aa8SAndrea Di Biagio// content of the destination register. Note that this predicate only checks if 16b6022aa8SAndrea Di Biagio// input registers are the same. This predicate doesn't make any assumptions on 17b6022aa8SAndrea Di Biagio// the expected instruction opcodes, because different processors may implement 18b6022aa8SAndrea Di Biagio// different zero-idioms. 19b6022aa8SAndrea Di Biagiodef ZeroIdiomPredicate : CheckSameRegOperand<1, 2>; 20b6022aa8SAndrea Di Biagio 2124ea1630SAndrea Di Biagio// A predicate used to identify VPERM that have bits 3 and 7 of their mask set. 2224ea1630SAndrea Di Biagio// On some processors, these VPERM instructions are zero-idioms. 2324ea1630SAndrea Di Biagiodef ZeroIdiomVPERMPredicate : CheckAll<[ 2424ea1630SAndrea Di Biagio ZeroIdiomPredicate, 2524ea1630SAndrea Di Biagio CheckImmOperand<3, 0x88> 2624ea1630SAndrea Di Biagio]>; 2724ea1630SAndrea Di Biagio 28f3bde048SAndrea Di Biagio// A predicate used to check if a LEA instruction uses all three source 29f3bde048SAndrea Di Biagio// operands: base, index, and offset. 30b6022aa8SAndrea Di Biagiodef IsThreeOperandsLEAPredicate: CheckAll<[ 31b6022aa8SAndrea Di Biagio // isRegOperand(Base) 32b6022aa8SAndrea Di Biagio CheckIsRegOperand<1>, 33b6022aa8SAndrea Di Biagio CheckNot<CheckInvalidRegOperand<1>>, 34b6022aa8SAndrea Di Biagio 35b6022aa8SAndrea Di Biagio // isRegOperand(Index) 36b6022aa8SAndrea Di Biagio CheckIsRegOperand<3>, 37b6022aa8SAndrea Di Biagio CheckNot<CheckInvalidRegOperand<3>>, 38b6022aa8SAndrea Di Biagio 39b6022aa8SAndrea Di Biagio // hasLEAOffset(Offset) 40b6022aa8SAndrea Di Biagio CheckAny<[ 41b6022aa8SAndrea Di Biagio CheckAll<[ 42b6022aa8SAndrea Di Biagio CheckIsImmOperand<4>, 43b6022aa8SAndrea Di Biagio CheckNot<CheckZeroOperand<4>> 44b6022aa8SAndrea Di Biagio ]>, 45b6022aa8SAndrea Di Biagio CheckNonPortable<"MI.getOperand(4).isGlobal()"> 46b6022aa8SAndrea Di Biagio ]> 47b6022aa8SAndrea Di Biagio]>; 48b6022aa8SAndrea Di Biagio 49f3bde048SAndrea Di Biagiodef LEACases : MCOpcodeSwitchCase< 50f3bde048SAndrea Di Biagio [LEA32r, LEA64r, LEA64_32r, LEA16r], 51f3bde048SAndrea Di Biagio MCReturnStatement<IsThreeOperandsLEAPredicate> 52f3bde048SAndrea Di Biagio>; 53f3bde048SAndrea Di Biagio 54f3bde048SAndrea Di Biagio// Used to generate the body of a TII member function. 55f3bde048SAndrea Di Biagiodef IsThreeOperandsLEABody : 56f3bde048SAndrea Di Biagio MCOpcodeSwitchStatement<[LEACases], MCReturnStatement<FalsePred>>; 57f3bde048SAndrea Di Biagio 58b6022aa8SAndrea Di Biagio// This predicate evaluates to true only if the input machine instruction is a 59b6022aa8SAndrea Di Biagio// 3-operands LEA. Tablegen automatically generates a new method for it in 60b6022aa8SAndrea Di Biagio// X86GenInstrInfo. 61b6022aa8SAndrea Di Biagiodef IsThreeOperandsLEAFn : 629eaf5aa0SAndrea Di Biagio TIIPredicate<"isThreeOperandsLEA", IsThreeOperandsLEABody>; 63e0bfeb5fSCraig Topper 64e0bfeb5fSCraig Topper// A predicate to check for COND_A and COND_BE CMOVs which have an extra uop 65e0bfeb5fSCraig Topper// on recent Intel CPUs. 66e0bfeb5fSCraig Topperdef IsCMOVArr_Or_CMOVBErr : CheckAny<[ 67e0bfeb5fSCraig Topper CheckImmOperand_s<3, "X86::COND_A">, 68e0bfeb5fSCraig Topper CheckImmOperand_s<3, "X86::COND_BE"> 69e0bfeb5fSCraig Topper]>; 70e0bfeb5fSCraig Topper 71e0bfeb5fSCraig Topperdef IsCMOVArm_Or_CMOVBErm : CheckAny<[ 72e0bfeb5fSCraig Topper CheckImmOperand_s<7, "X86::COND_A">, 73e0bfeb5fSCraig Topper CheckImmOperand_s<7, "X86::COND_BE"> 74e0bfeb5fSCraig Topper]>; 757323c2bfSCraig Topper 767323c2bfSCraig Topper// A predicate to check for COND_A and COND_BE SETCCs which have an extra uop 777323c2bfSCraig Topper// on recent Intel CPUs. 787323c2bfSCraig Topperdef IsSETAr_Or_SETBEr : CheckAny<[ 797323c2bfSCraig Topper CheckImmOperand_s<1, "X86::COND_A">, 807323c2bfSCraig Topper CheckImmOperand_s<1, "X86::COND_BE"> 817323c2bfSCraig Topper]>; 827323c2bfSCraig Topper 837323c2bfSCraig Topperdef IsSETAm_Or_SETBEm : CheckAny<[ 847323c2bfSCraig Topper CheckImmOperand_s<5, "X86::COND_A">, 857323c2bfSCraig Topper CheckImmOperand_s<5, "X86::COND_BE"> 867323c2bfSCraig Topper]>; 87*b1bdd97aSAndrea Di Biagio 88*b1bdd97aSAndrea Di Biagio// A predicate used to check if an instruction has a LOCK prefix. 89*b1bdd97aSAndrea Di Biagiodef CheckLockPrefix : CheckFunctionPredicate< 90*b1bdd97aSAndrea Di Biagio "X86_MC::hasLockPrefix", 91*b1bdd97aSAndrea Di Biagio "X86InstrInfo::hasLockPrefix" 92*b1bdd97aSAndrea Di Biagio>; 93*b1bdd97aSAndrea Di Biagio 94*b1bdd97aSAndrea Di Biagiodef IsRegRegCompareAndSwap_8 : CheckOpcode<[ CMPXCHG8rr ]>; 95*b1bdd97aSAndrea Di Biagio 96*b1bdd97aSAndrea Di Biagiodef IsRegMemCompareAndSwap_8 : CheckOpcode<[ 97*b1bdd97aSAndrea Di Biagio LCMPXCHG8, CMPXCHG8rm 98*b1bdd97aSAndrea Di Biagio]>; 99*b1bdd97aSAndrea Di Biagio 100*b1bdd97aSAndrea Di Biagiodef IsRegRegCompareAndSwap_16_32_64 : CheckOpcode<[ 101*b1bdd97aSAndrea Di Biagio CMPXCHG16rr, CMPXCHG32rr, CMPXCHG64rr 102*b1bdd97aSAndrea Di Biagio]>; 103*b1bdd97aSAndrea Di Biagio 104*b1bdd97aSAndrea Di Biagiodef IsRegMemCompareAndSwap_16_32_64 : CheckOpcode<[ 105*b1bdd97aSAndrea Di Biagio CMPXCHG16rm, CMPXCHG32rm, CMPXCHG64rm, 106*b1bdd97aSAndrea Di Biagio LCMPXCHG16, LCMPXCHG32, LCMPXCHG64, 107*b1bdd97aSAndrea Di Biagio LCMPXCHG8B, LCMPXCHG16B 108*b1bdd97aSAndrea Di Biagio]>; 109*b1bdd97aSAndrea Di Biagio 110*b1bdd97aSAndrea Di Biagiodef IsCompareAndSwap8B : CheckOpcode<[ CMPXCHG8B, LCMPXCHG8B ]>; 111*b1bdd97aSAndrea Di Biagiodef IsCompareAndSwap16B : CheckOpcode<[ CMPXCHG16B, LCMPXCHG16B ]>; 112*b1bdd97aSAndrea Di Biagio 113*b1bdd97aSAndrea Di Biagiodef IsRegMemCompareAndSwap : CheckOpcode< 114*b1bdd97aSAndrea Di Biagio !listconcat( 115*b1bdd97aSAndrea Di Biagio IsRegMemCompareAndSwap_8.ValidOpcodes, 116*b1bdd97aSAndrea Di Biagio IsRegMemCompareAndSwap_16_32_64.ValidOpcodes 117*b1bdd97aSAndrea Di Biagio )>; 118*b1bdd97aSAndrea Di Biagio 119*b1bdd97aSAndrea Di Biagiodef IsRegRegCompareAndSwap : CheckOpcode< 120*b1bdd97aSAndrea Di Biagio !listconcat( 121*b1bdd97aSAndrea Di Biagio IsRegRegCompareAndSwap_8.ValidOpcodes, 122*b1bdd97aSAndrea Di Biagio IsRegRegCompareAndSwap_16_32_64.ValidOpcodes 123*b1bdd97aSAndrea Di Biagio )>; 124*b1bdd97aSAndrea Di Biagio 125*b1bdd97aSAndrea Di Biagiodef IsAtomicCompareAndSwap_8 : CheckAll<[ 126*b1bdd97aSAndrea Di Biagio CheckLockPrefix, 127*b1bdd97aSAndrea Di Biagio IsRegMemCompareAndSwap_8 128*b1bdd97aSAndrea Di Biagio]>; 129*b1bdd97aSAndrea Di Biagio 130*b1bdd97aSAndrea Di Biagiodef IsAtomicCompareAndSwap : CheckAll<[ 131*b1bdd97aSAndrea Di Biagio CheckLockPrefix, 132*b1bdd97aSAndrea Di Biagio IsRegMemCompareAndSwap 133*b1bdd97aSAndrea Di Biagio]>; 134*b1bdd97aSAndrea Di Biagio 135*b1bdd97aSAndrea Di Biagiodef IsAtomicCompareAndSwap8B : CheckAll<[ 136*b1bdd97aSAndrea Di Biagio CheckLockPrefix, 137*b1bdd97aSAndrea Di Biagio IsCompareAndSwap8B 138*b1bdd97aSAndrea Di Biagio]>; 139*b1bdd97aSAndrea Di Biagio 140*b1bdd97aSAndrea Di Biagiodef IsAtomicCompareAndSwap16B : CheckAll<[ 141*b1bdd97aSAndrea Di Biagio CheckLockPrefix, 142*b1bdd97aSAndrea Di Biagio IsCompareAndSwap16B 143*b1bdd97aSAndrea Di Biagio]>; 144