xref: /llvm-project/llvm/lib/Target/X86/X86SchedPredicates.td (revision b1bdd97a2671c23a147e7b1c237e0e456131e4bc)
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