xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/X86/X86SchedPredicates.td (revision 5b27928474e6a4103d65b347544705c40c9618fd)
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