10b57cec5SDimitry Andric//===-- X86SchedPredicates.td - X86 Scheduling Predicates --*- tablegen -*-===// 20b57cec5SDimitry Andric// 30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric// 70b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric// 90b57cec5SDimitry Andric// This file defines scheduling predicate definitions that are common to 100b57cec5SDimitry Andric// all X86 subtargets. 110b57cec5SDimitry Andric// 120b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric// A predicate used to identify dependency-breaking instructions that clear the 150b57cec5SDimitry Andric// content of the destination register. Note that this predicate only checks if 160b57cec5SDimitry Andric// input registers are the same. This predicate doesn't make any assumptions on 170b57cec5SDimitry Andric// the expected instruction opcodes, because different processors may implement 180b57cec5SDimitry Andric// different zero-idioms. 190b57cec5SDimitry Andricdef ZeroIdiomPredicate : CheckSameRegOperand<1, 2>; 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric// A predicate used to identify VPERM that have bits 3 and 7 of their mask set. 220b57cec5SDimitry Andric// On some processors, these VPERM instructions are zero-idioms. 230b57cec5SDimitry Andricdef ZeroIdiomVPERMPredicate : CheckAll<[ 240b57cec5SDimitry Andric ZeroIdiomPredicate, 250b57cec5SDimitry Andric CheckImmOperand<3, 0x88> 260b57cec5SDimitry Andric]>; 270b57cec5SDimitry Andric 280b57cec5SDimitry Andric// A predicate used to check if a LEA instruction uses all three source 290b57cec5SDimitry Andric// operands: base, index, and offset. 300b57cec5SDimitry Andricdef IsThreeOperandsLEAPredicate: CheckAll<[ 310b57cec5SDimitry Andric // isRegOperand(Base) 320b57cec5SDimitry Andric CheckIsRegOperand<1>, 330b57cec5SDimitry Andric CheckNot<CheckInvalidRegOperand<1>>, 340b57cec5SDimitry Andric 350b57cec5SDimitry Andric // isRegOperand(Index) 360b57cec5SDimitry Andric CheckIsRegOperand<3>, 370b57cec5SDimitry Andric CheckNot<CheckInvalidRegOperand<3>>, 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric // hasLEAOffset(Offset) 400b57cec5SDimitry Andric CheckAny<[ 410b57cec5SDimitry Andric CheckAll<[ 420b57cec5SDimitry Andric CheckIsImmOperand<4>, 430b57cec5SDimitry Andric CheckNot<CheckZeroOperand<4>> 440b57cec5SDimitry Andric ]>, 450b57cec5SDimitry Andric CheckNonPortable<"MI.getOperand(4).isGlobal()"> 460b57cec5SDimitry Andric ]> 470b57cec5SDimitry Andric]>; 480b57cec5SDimitry Andric 490b57cec5SDimitry Andricdef LEACases : MCOpcodeSwitchCase< 500b57cec5SDimitry Andric [LEA32r, LEA64r, LEA64_32r, LEA16r], 510b57cec5SDimitry Andric MCReturnStatement<IsThreeOperandsLEAPredicate> 520b57cec5SDimitry Andric>; 530b57cec5SDimitry Andric 540b57cec5SDimitry Andric// Used to generate the body of a TII member function. 550b57cec5SDimitry Andricdef IsThreeOperandsLEABody : 560b57cec5SDimitry Andric MCOpcodeSwitchStatement<[LEACases], MCReturnStatement<FalsePred>>; 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric// This predicate evaluates to true only if the input machine instruction is a 590b57cec5SDimitry Andric// 3-operands LEA. Tablegen automatically generates a new method for it in 600b57cec5SDimitry Andric// X86GenInstrInfo. 610b57cec5SDimitry Andricdef IsThreeOperandsLEAFn : 620b57cec5SDimitry Andric TIIPredicate<"isThreeOperandsLEA", IsThreeOperandsLEABody>; 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric// A predicate to check for COND_A and COND_BE CMOVs which have an extra uop 650b57cec5SDimitry Andric// on recent Intel CPUs. 660b57cec5SDimitry Andricdef IsCMOVArr_Or_CMOVBErr : CheckAny<[ 670b57cec5SDimitry Andric CheckImmOperand_s<3, "X86::COND_A">, 680b57cec5SDimitry Andric CheckImmOperand_s<3, "X86::COND_BE"> 690b57cec5SDimitry Andric]>; 700b57cec5SDimitry Andric 710b57cec5SDimitry Andricdef IsCMOVArm_Or_CMOVBErm : CheckAny<[ 720b57cec5SDimitry Andric CheckImmOperand_s<7, "X86::COND_A">, 730b57cec5SDimitry Andric CheckImmOperand_s<7, "X86::COND_BE"> 740b57cec5SDimitry Andric]>; 750b57cec5SDimitry Andric 760b57cec5SDimitry Andric// A predicate to check for COND_A and COND_BE SETCCs which have an extra uop 770b57cec5SDimitry Andric// on recent Intel CPUs. 780b57cec5SDimitry Andricdef IsSETAr_Or_SETBEr : CheckAny<[ 790b57cec5SDimitry Andric CheckImmOperand_s<1, "X86::COND_A">, 800b57cec5SDimitry Andric CheckImmOperand_s<1, "X86::COND_BE"> 810b57cec5SDimitry Andric]>; 820b57cec5SDimitry Andric 830b57cec5SDimitry Andricdef IsSETAm_Or_SETBEm : CheckAny<[ 840b57cec5SDimitry Andric CheckImmOperand_s<5, "X86::COND_A">, 850b57cec5SDimitry Andric CheckImmOperand_s<5, "X86::COND_BE"> 860b57cec5SDimitry Andric]>; 87*8bcb0991SDimitry Andric 88*8bcb0991SDimitry Andric// A predicate used to check if an instruction has a LOCK prefix. 89*8bcb0991SDimitry Andricdef CheckLockPrefix : CheckFunctionPredicate< 90*8bcb0991SDimitry Andric "X86_MC::hasLockPrefix", 91*8bcb0991SDimitry Andric "X86InstrInfo::hasLockPrefix" 92*8bcb0991SDimitry Andric>; 93*8bcb0991SDimitry Andric 94*8bcb0991SDimitry Andricdef IsRegRegCompareAndSwap_8 : CheckOpcode<[ CMPXCHG8rr ]>; 95*8bcb0991SDimitry Andric 96*8bcb0991SDimitry Andricdef IsRegMemCompareAndSwap_8 : CheckOpcode<[ 97*8bcb0991SDimitry Andric LCMPXCHG8, CMPXCHG8rm 98*8bcb0991SDimitry Andric]>; 99*8bcb0991SDimitry Andric 100*8bcb0991SDimitry Andricdef IsRegRegCompareAndSwap_16_32_64 : CheckOpcode<[ 101*8bcb0991SDimitry Andric CMPXCHG16rr, CMPXCHG32rr, CMPXCHG64rr 102*8bcb0991SDimitry Andric]>; 103*8bcb0991SDimitry Andric 104*8bcb0991SDimitry Andricdef IsRegMemCompareAndSwap_16_32_64 : CheckOpcode<[ 105*8bcb0991SDimitry Andric CMPXCHG16rm, CMPXCHG32rm, CMPXCHG64rm, 106*8bcb0991SDimitry Andric LCMPXCHG16, LCMPXCHG32, LCMPXCHG64, 107*8bcb0991SDimitry Andric LCMPXCHG8B, LCMPXCHG16B 108*8bcb0991SDimitry Andric]>; 109*8bcb0991SDimitry Andric 110*8bcb0991SDimitry Andricdef IsCompareAndSwap8B : CheckOpcode<[ CMPXCHG8B, LCMPXCHG8B ]>; 111*8bcb0991SDimitry Andricdef IsCompareAndSwap16B : CheckOpcode<[ CMPXCHG16B, LCMPXCHG16B ]>; 112*8bcb0991SDimitry Andric 113*8bcb0991SDimitry Andricdef IsRegMemCompareAndSwap : CheckOpcode< 114*8bcb0991SDimitry Andric !listconcat( 115*8bcb0991SDimitry Andric IsRegMemCompareAndSwap_8.ValidOpcodes, 116*8bcb0991SDimitry Andric IsRegMemCompareAndSwap_16_32_64.ValidOpcodes 117*8bcb0991SDimitry Andric )>; 118*8bcb0991SDimitry Andric 119*8bcb0991SDimitry Andricdef IsRegRegCompareAndSwap : CheckOpcode< 120*8bcb0991SDimitry Andric !listconcat( 121*8bcb0991SDimitry Andric IsRegRegCompareAndSwap_8.ValidOpcodes, 122*8bcb0991SDimitry Andric IsRegRegCompareAndSwap_16_32_64.ValidOpcodes 123*8bcb0991SDimitry Andric )>; 124*8bcb0991SDimitry Andric 125*8bcb0991SDimitry Andricdef IsAtomicCompareAndSwap_8 : CheckAll<[ 126*8bcb0991SDimitry Andric CheckLockPrefix, 127*8bcb0991SDimitry Andric IsRegMemCompareAndSwap_8 128*8bcb0991SDimitry Andric]>; 129*8bcb0991SDimitry Andric 130*8bcb0991SDimitry Andricdef IsAtomicCompareAndSwap : CheckAll<[ 131*8bcb0991SDimitry Andric CheckLockPrefix, 132*8bcb0991SDimitry Andric IsRegMemCompareAndSwap 133*8bcb0991SDimitry Andric]>; 134*8bcb0991SDimitry Andric 135*8bcb0991SDimitry Andricdef IsAtomicCompareAndSwap8B : CheckAll<[ 136*8bcb0991SDimitry Andric CheckLockPrefix, 137*8bcb0991SDimitry Andric IsCompareAndSwap8B 138*8bcb0991SDimitry Andric]>; 139*8bcb0991SDimitry Andric 140*8bcb0991SDimitry Andricdef IsAtomicCompareAndSwap16B : CheckAll<[ 141*8bcb0991SDimitry Andric CheckLockPrefix, 142*8bcb0991SDimitry Andric IsCompareAndSwap16B 143*8bcb0991SDimitry Andric]>; 144