xref: /freebsd/contrib/llvm-project/llvm/lib/Target/X86/X86InstrPredicates.td (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
1*5f757f3fSDimitry Andric//===---X86InstrPredicates.td - X86 Predicate Definitions --*- tablegen -*-===//
2*5f757f3fSDimitry Andric//
3*5f757f3fSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*5f757f3fSDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5*5f757f3fSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*5f757f3fSDimitry Andric//
7*5f757f3fSDimitry Andric//===----------------------------------------------------------------------===//
8*5f757f3fSDimitry Andric
9*5f757f3fSDimitry Andricdef TruePredicate : Predicate<"true">;
10*5f757f3fSDimitry Andric
11*5f757f3fSDimitry Andricdef HasEGPR      : Predicate<"Subtarget->hasEGPR()">;
12*5f757f3fSDimitry Andricdef NoEGPR       : Predicate<"!Subtarget->hasEGPR()">;
13*5f757f3fSDimitry Andricdef HasCMOV      : Predicate<"Subtarget->canUseCMOV()">;
14*5f757f3fSDimitry Andricdef NoCMOV       : Predicate<"!Subtarget->canUseCMOV()">;
15*5f757f3fSDimitry Andricdef HasNOPL      : Predicate<"Subtarget->hasNOPL()">;
16*5f757f3fSDimitry Andricdef HasMMX       : Predicate<"Subtarget->hasMMX()">;
17*5f757f3fSDimitry Andricdef Has3DNow     : Predicate<"Subtarget->hasThreeDNow()">;
18*5f757f3fSDimitry Andricdef Has3DNowA    : Predicate<"Subtarget->hasThreeDNowA()">;
19*5f757f3fSDimitry Andricdef HasSSE1      : Predicate<"Subtarget->hasSSE1()">;
20*5f757f3fSDimitry Andricdef UseSSE1      : Predicate<"Subtarget->hasSSE1() && !Subtarget->hasAVX()">;
21*5f757f3fSDimitry Andricdef HasSSE2      : Predicate<"Subtarget->hasSSE2()">;
22*5f757f3fSDimitry Andricdef UseSSE2      : Predicate<"Subtarget->hasSSE2() && !Subtarget->hasAVX()">;
23*5f757f3fSDimitry Andricdef HasSSE3      : Predicate<"Subtarget->hasSSE3()">;
24*5f757f3fSDimitry Andricdef UseSSE3      : Predicate<"Subtarget->hasSSE3() && !Subtarget->hasAVX()">;
25*5f757f3fSDimitry Andricdef HasSSSE3     : Predicate<"Subtarget->hasSSSE3()">;
26*5f757f3fSDimitry Andricdef UseSSSE3     : Predicate<"Subtarget->hasSSSE3() && !Subtarget->hasAVX()">;
27*5f757f3fSDimitry Andricdef HasSSE41     : Predicate<"Subtarget->hasSSE41()">;
28*5f757f3fSDimitry Andricdef NoSSE41      : Predicate<"!Subtarget->hasSSE41()">;
29*5f757f3fSDimitry Andricdef UseSSE41     : Predicate<"Subtarget->hasSSE41() && !Subtarget->hasAVX()">;
30*5f757f3fSDimitry Andricdef HasSSE42     : Predicate<"Subtarget->hasSSE42()">;
31*5f757f3fSDimitry Andricdef UseSSE42     : Predicate<"Subtarget->hasSSE42() && !Subtarget->hasAVX()">;
32*5f757f3fSDimitry Andricdef HasSSE4A     : Predicate<"Subtarget->hasSSE4A()">;
33*5f757f3fSDimitry Andricdef NoAVX        : Predicate<"!Subtarget->hasAVX()">;
34*5f757f3fSDimitry Andricdef HasAVX       : Predicate<"Subtarget->hasAVX()">;
35*5f757f3fSDimitry Andricdef HasAVX2      : Predicate<"Subtarget->hasAVX2()">;
36*5f757f3fSDimitry Andricdef HasAVX1Only  : Predicate<"Subtarget->hasAVX() && !Subtarget->hasAVX2()">;
37*5f757f3fSDimitry Andricdef HasEVEX512   : Predicate<"Subtarget->hasEVEX512()">;
38*5f757f3fSDimitry Andricdef HasAVX10_1   : Predicate<"Subtarget->hasAVX10_1()">;
39*5f757f3fSDimitry Andricdef HasAVX10_1_512 : Predicate<"Subtarget->hasAVX10_1_512()">;
40*5f757f3fSDimitry Andricdef HasAVX512    : Predicate<"Subtarget->hasAVX512()">;
41*5f757f3fSDimitry Andricdef UseAVX       : Predicate<"Subtarget->hasAVX() && !Subtarget->hasAVX512()">;
42*5f757f3fSDimitry Andricdef UseAVX2      : Predicate<"Subtarget->hasAVX2() && !Subtarget->hasAVX512()">;
43*5f757f3fSDimitry Andricdef NoAVX512     : Predicate<"!Subtarget->hasAVX512()">;
44*5f757f3fSDimitry Andricdef HasCDI       : Predicate<"Subtarget->hasCDI()">;
45*5f757f3fSDimitry Andricdef HasVPOPCNTDQ : Predicate<"Subtarget->hasVPOPCNTDQ()">;
46*5f757f3fSDimitry Andricdef HasPFI       : Predicate<"Subtarget->hasPFI()">;
47*5f757f3fSDimitry Andricdef HasERI       : Predicate<"Subtarget->hasERI()">;
48*5f757f3fSDimitry Andricdef HasDQI       : Predicate<"Subtarget->hasDQI()">;
49*5f757f3fSDimitry Andricdef NoDQI        : Predicate<"!Subtarget->hasDQI()">;
50*5f757f3fSDimitry Andricdef HasBWI       : Predicate<"Subtarget->hasBWI()">;
51*5f757f3fSDimitry Andricdef NoBWI        : Predicate<"!Subtarget->hasBWI()">;
52*5f757f3fSDimitry Andricdef HasVLX       : Predicate<"Subtarget->hasVLX()">;
53*5f757f3fSDimitry Andricdef NoVLX        : Predicate<"!Subtarget->hasVLX()">;
54*5f757f3fSDimitry Andricdef NoVLX_Or_NoBWI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasBWI()">;
55*5f757f3fSDimitry Andricdef NoVLX_Or_NoDQI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasDQI()">;
56*5f757f3fSDimitry Andricdef HasPKU       : Predicate<"Subtarget->hasPKU()">;
57*5f757f3fSDimitry Andricdef HasVNNI      : Predicate<"Subtarget->hasVNNI()">;
58*5f757f3fSDimitry Andricdef HasVP2INTERSECT : Predicate<"Subtarget->hasVP2INTERSECT()">;
59*5f757f3fSDimitry Andricdef HasBF16      : Predicate<"Subtarget->hasBF16()">;
60*5f757f3fSDimitry Andricdef HasFP16      : Predicate<"Subtarget->hasFP16()">;
61*5f757f3fSDimitry Andricdef HasAVXVNNIINT16 : Predicate<"Subtarget->hasAVXVNNIINT16()">;
62*5f757f3fSDimitry Andricdef HasAVXVNNIINT8 : Predicate<"Subtarget->hasAVXVNNIINT8()">;
63*5f757f3fSDimitry Andricdef HasAVXVNNI : Predicate <"Subtarget->hasAVXVNNI()">;
64*5f757f3fSDimitry Andricdef NoVLX_Or_NoVNNI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVNNI()">;
65*5f757f3fSDimitry Andric
66*5f757f3fSDimitry Andricdef HasBITALG    : Predicate<"Subtarget->hasBITALG()">;
67*5f757f3fSDimitry Andricdef HasPOPCNT    : Predicate<"Subtarget->hasPOPCNT()">;
68*5f757f3fSDimitry Andricdef HasAES       : Predicate<"Subtarget->hasAES()">;
69*5f757f3fSDimitry Andricdef HasVAES      : Predicate<"Subtarget->hasVAES()">;
70*5f757f3fSDimitry Andricdef NoVLX_Or_NoVAES : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVAES()">;
71*5f757f3fSDimitry Andricdef HasFXSR      : Predicate<"Subtarget->hasFXSR()">;
72*5f757f3fSDimitry Andricdef HasX87       : Predicate<"Subtarget->hasX87()">;
73*5f757f3fSDimitry Andricdef HasXSAVE     : Predicate<"Subtarget->hasXSAVE()">;
74*5f757f3fSDimitry Andricdef HasXSAVEOPT  : Predicate<"Subtarget->hasXSAVEOPT()">;
75*5f757f3fSDimitry Andricdef HasXSAVEC    : Predicate<"Subtarget->hasXSAVEC()">;
76*5f757f3fSDimitry Andricdef HasXSAVES    : Predicate<"Subtarget->hasXSAVES()">;
77*5f757f3fSDimitry Andricdef HasPCLMUL    : Predicate<"Subtarget->hasPCLMUL()">;
78*5f757f3fSDimitry Andricdef NoVLX_Or_NoVPCLMULQDQ :
79*5f757f3fSDimitry Andric                    Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVPCLMULQDQ()">;
80*5f757f3fSDimitry Andricdef HasVPCLMULQDQ : Predicate<"Subtarget->hasVPCLMULQDQ()">;
81*5f757f3fSDimitry Andricdef HasGFNI      : Predicate<"Subtarget->hasGFNI()">;
82*5f757f3fSDimitry Andricdef HasFMA       : Predicate<"Subtarget->hasFMA()">;
83*5f757f3fSDimitry Andricdef HasFMA4      : Predicate<"Subtarget->hasFMA4()">;
84*5f757f3fSDimitry Andricdef NoFMA4       : Predicate<"!Subtarget->hasFMA4()">;
85*5f757f3fSDimitry Andricdef HasXOP       : Predicate<"Subtarget->hasXOP()">;
86*5f757f3fSDimitry Andricdef HasTBM       : Predicate<"Subtarget->hasTBM()">;
87*5f757f3fSDimitry Andricdef NoTBM        : Predicate<"!Subtarget->hasTBM()">;
88*5f757f3fSDimitry Andricdef HasLWP       : Predicate<"Subtarget->hasLWP()">;
89*5f757f3fSDimitry Andricdef HasMOVBE     : Predicate<"Subtarget->hasMOVBE()">;
90*5f757f3fSDimitry Andricdef HasRDRAND    : Predicate<"Subtarget->hasRDRAND()">;
91*5f757f3fSDimitry Andricdef HasF16C      : Predicate<"Subtarget->hasF16C()">;
92*5f757f3fSDimitry Andricdef HasFSGSBase  : Predicate<"Subtarget->hasFSGSBase()">;
93*5f757f3fSDimitry Andricdef HasLZCNT     : Predicate<"Subtarget->hasLZCNT()">;
94*5f757f3fSDimitry Andricdef HasBMI       : Predicate<"Subtarget->hasBMI()">;
95*5f757f3fSDimitry Andricdef HasBMI2      : Predicate<"Subtarget->hasBMI2()">;
96*5f757f3fSDimitry Andricdef NoBMI2       : Predicate<"!Subtarget->hasBMI2()">;
97*5f757f3fSDimitry Andricdef HasVBMI      : Predicate<"Subtarget->hasVBMI()">;
98*5f757f3fSDimitry Andricdef HasVBMI2     : Predicate<"Subtarget->hasVBMI2()">;
99*5f757f3fSDimitry Andricdef HasIFMA      : Predicate<"Subtarget->hasIFMA()">;
100*5f757f3fSDimitry Andricdef HasAVXIFMA   : Predicate<"Subtarget->hasAVXIFMA()">;
101*5f757f3fSDimitry Andricdef NoVLX_Or_NoIFMA : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasIFMA()">;
102*5f757f3fSDimitry Andricdef HasRTM       : Predicate<"Subtarget->hasRTM()">;
103*5f757f3fSDimitry Andricdef HasADX       : Predicate<"Subtarget->hasADX()">;
104*5f757f3fSDimitry Andricdef HasSHA       : Predicate<"Subtarget->hasSHA()">;
105*5f757f3fSDimitry Andricdef HasSHA512    : Predicate<"Subtarget->hasSHA512()">;
106*5f757f3fSDimitry Andricdef HasSGX       : Predicate<"Subtarget->hasSGX()">;
107*5f757f3fSDimitry Andricdef HasSM3       : Predicate<"Subtarget->hasSM3()">;
108*5f757f3fSDimitry Andricdef HasRDSEED    : Predicate<"Subtarget->hasRDSEED()">;
109*5f757f3fSDimitry Andricdef HasSSEPrefetch : Predicate<"Subtarget->hasSSEPrefetch()">;
110*5f757f3fSDimitry Andricdef NoSSEPrefetch : Predicate<"!Subtarget->hasSSEPrefetch()">;
111*5f757f3fSDimitry Andricdef HasPRFCHW    : Predicate<"Subtarget->hasPRFCHW()">;
112*5f757f3fSDimitry Andricdef HasPREFETCHI : Predicate<"Subtarget->hasPREFETCHI()">;
113*5f757f3fSDimitry Andricdef HasPrefetchW : Predicate<"Subtarget->hasPrefetchW()">;
114*5f757f3fSDimitry Andricdef HasPREFETCHWT1 : Predicate<"Subtarget->hasPREFETCHWT1()">;
115*5f757f3fSDimitry Andricdef HasLAHFSAHF  : Predicate<"Subtarget->hasLAHFSAHF()">;
116*5f757f3fSDimitry Andricdef HasLAHFSAHF64 : Predicate<"Subtarget->hasLAHFSAHF64()">;
117*5f757f3fSDimitry Andricdef HasMWAITX    : Predicate<"Subtarget->hasMWAITX()">;
118*5f757f3fSDimitry Andricdef HasCLZERO    : Predicate<"Subtarget->hasCLZERO()">;
119*5f757f3fSDimitry Andricdef HasCLDEMOTE  : Predicate<"Subtarget->hasCLDEMOTE()">;
120*5f757f3fSDimitry Andricdef HasMOVDIRI   : Predicate<"Subtarget->hasMOVDIRI()">;
121*5f757f3fSDimitry Andricdef HasMOVDIR64B : Predicate<"Subtarget->hasMOVDIR64B()">;
122*5f757f3fSDimitry Andricdef HasPTWRITE   : Predicate<"Subtarget->hasPTWRITE()">;
123*5f757f3fSDimitry Andricdef FPStackf32   : Predicate<"!Subtarget->hasSSE1()">;
124*5f757f3fSDimitry Andricdef FPStackf64   : Predicate<"!Subtarget->hasSSE2()">;
125*5f757f3fSDimitry Andricdef HasSHSTK     : Predicate<"Subtarget->hasSHSTK()">;
126*5f757f3fSDimitry Andricdef HasSM4       : Predicate<"Subtarget->hasSM4()">;
127*5f757f3fSDimitry Andricdef HasCLFLUSH   : Predicate<"Subtarget->hasCLFLUSH()">;
128*5f757f3fSDimitry Andricdef HasCLFLUSHOPT : Predicate<"Subtarget->hasCLFLUSHOPT()">;
129*5f757f3fSDimitry Andricdef HasCLWB      : Predicate<"Subtarget->hasCLWB()">;
130*5f757f3fSDimitry Andricdef HasWBNOINVD  : Predicate<"Subtarget->hasWBNOINVD()">;
131*5f757f3fSDimitry Andricdef HasRDPID     : Predicate<"Subtarget->hasRDPID()">;
132*5f757f3fSDimitry Andricdef HasRDPRU     : Predicate<"Subtarget->hasRDPRU()">;
133*5f757f3fSDimitry Andricdef HasWAITPKG   : Predicate<"Subtarget->hasWAITPKG()">;
134*5f757f3fSDimitry Andricdef HasINVPCID   : Predicate<"Subtarget->hasINVPCID()">;
135*5f757f3fSDimitry Andricdef HasCX8       : Predicate<"Subtarget->hasCX8()">;
136*5f757f3fSDimitry Andricdef HasCX16      : Predicate<"Subtarget->hasCX16()">;
137*5f757f3fSDimitry Andricdef HasPCONFIG   : Predicate<"Subtarget->hasPCONFIG()">;
138*5f757f3fSDimitry Andricdef HasENQCMD    : Predicate<"Subtarget->hasENQCMD()">;
139*5f757f3fSDimitry Andricdef HasAMXFP16   : Predicate<"Subtarget->hasAMXFP16()">;
140*5f757f3fSDimitry Andricdef HasCMPCCXADD : Predicate<"Subtarget->hasCMPCCXADD()">;
141*5f757f3fSDimitry Andricdef HasAVXNECONVERT : Predicate<"Subtarget->hasAVXNECONVERT()">;
142*5f757f3fSDimitry Andricdef HasKL        : Predicate<"Subtarget->hasKL()">;
143*5f757f3fSDimitry Andricdef HasRAOINT    : Predicate<"Subtarget->hasRAOINT()">;
144*5f757f3fSDimitry Andricdef HasWIDEKL    : Predicate<"Subtarget->hasWIDEKL()">;
145*5f757f3fSDimitry Andricdef HasHRESET    : Predicate<"Subtarget->hasHRESET()">;
146*5f757f3fSDimitry Andricdef HasSERIALIZE : Predicate<"Subtarget->hasSERIALIZE()">;
147*5f757f3fSDimitry Andricdef HasTSXLDTRK  : Predicate<"Subtarget->hasTSXLDTRK()">;
148*5f757f3fSDimitry Andricdef HasAMXTILE   : Predicate<"Subtarget->hasAMXTILE()">;
149*5f757f3fSDimitry Andricdef HasAMXBF16   : Predicate<"Subtarget->hasAMXBF16()">;
150*5f757f3fSDimitry Andricdef HasAMXINT8   : Predicate<"Subtarget->hasAMXINT8()">;
151*5f757f3fSDimitry Andricdef HasAMXCOMPLEX : Predicate<"Subtarget->hasAMXCOMPLEX()">;
152*5f757f3fSDimitry Andricdef HasUINTR     : Predicate<"Subtarget->hasUINTR()">;
153*5f757f3fSDimitry Andricdef HasUSERMSR   : Predicate<"Subtarget->hasUSERMSR()">;
154*5f757f3fSDimitry Andricdef HasCRC32     : Predicate<"Subtarget->hasCRC32()">;
155*5f757f3fSDimitry Andric
156*5f757f3fSDimitry Andricdef HasX86_64    : Predicate<"Subtarget->hasX86_64()">;
157*5f757f3fSDimitry Andricdef Not64BitMode : Predicate<"!Subtarget->is64Bit()">,
158*5f757f3fSDimitry Andric                             AssemblerPredicate<(all_of (not Is64Bit)), "Not 64-bit mode">;
159*5f757f3fSDimitry Andricdef In64BitMode  : Predicate<"Subtarget->is64Bit()">,
160*5f757f3fSDimitry Andric                             AssemblerPredicate<(all_of Is64Bit), "64-bit mode">;
161*5f757f3fSDimitry Andricdef IsLP64  : Predicate<"Subtarget->isTarget64BitLP64()">;
162*5f757f3fSDimitry Andricdef NotLP64 : Predicate<"!Subtarget->isTarget64BitLP64()">;
163*5f757f3fSDimitry Andricdef In16BitMode  : Predicate<"Subtarget->is16Bit()">,
164*5f757f3fSDimitry Andric                             AssemblerPredicate<(all_of Is16Bit), "16-bit mode">;
165*5f757f3fSDimitry Andricdef Not16BitMode : Predicate<"!Subtarget->is16Bit()">,
166*5f757f3fSDimitry Andric                             AssemblerPredicate<(all_of (not Is16Bit)), "Not 16-bit mode">;
167*5f757f3fSDimitry Andricdef In32BitMode  : Predicate<"Subtarget->is32Bit()">,
168*5f757f3fSDimitry Andric                             AssemblerPredicate<(all_of Is32Bit), "32-bit mode">;
169*5f757f3fSDimitry Andricdef IsWin64      : Predicate<"Subtarget->isTargetWin64()">;
170*5f757f3fSDimitry Andricdef NotWin64     : Predicate<"!Subtarget->isTargetWin64()">;
171*5f757f3fSDimitry Andricdef NotWin64WithoutFP : Predicate<"!Subtarget->isTargetWin64() ||"
172*5f757f3fSDimitry Andric                                  "Subtarget->getFrameLowering()->hasFP(*MF)"> {
173*5f757f3fSDimitry Andric  let RecomputePerFunction = 1;
174*5f757f3fSDimitry Andric}
175*5f757f3fSDimitry Andricdef IsPS         : Predicate<"Subtarget->isTargetPS()">;
176*5f757f3fSDimitry Andricdef NotPS        : Predicate<"!Subtarget->isTargetPS()">;
177*5f757f3fSDimitry Andricdef IsNaCl       : Predicate<"Subtarget->isTargetNaCl()">;
178*5f757f3fSDimitry Andricdef NotNaCl      : Predicate<"!Subtarget->isTargetNaCl()">;
179*5f757f3fSDimitry Andricdef SmallCode    : Predicate<"TM.getCodeModel() == CodeModel::Small">;
180*5f757f3fSDimitry Andricdef KernelCode   : Predicate<"TM.getCodeModel() == CodeModel::Kernel">;
181*5f757f3fSDimitry Andricdef NearData     : Predicate<"TM.getCodeModel() == CodeModel::Small ||"
182*5f757f3fSDimitry Andric                             "TM.getCodeModel() == CodeModel::Kernel">;
183*5f757f3fSDimitry Andricdef IsNotPIC     : Predicate<"!TM.isPositionIndependent()">;
184*5f757f3fSDimitry Andric
185*5f757f3fSDimitry Andric// We could compute these on a per-module basis but doing so requires accessing
186*5f757f3fSDimitry Andric// the Function object through the <Target>Subtarget and objections were raised
187*5f757f3fSDimitry Andric// to that (see post-commit review comments for r301750).
188*5f757f3fSDimitry Andriclet RecomputePerFunction = 1 in {
189*5f757f3fSDimitry Andric  def OptForSize   : Predicate<"shouldOptForSize(MF)">;
190*5f757f3fSDimitry Andric  def OptForMinSize : Predicate<"MF->getFunction().hasMinSize()">;
191*5f757f3fSDimitry Andric  def OptForSpeed  : Predicate<"!shouldOptForSize(MF)">;
192*5f757f3fSDimitry Andric  def UseIncDec : Predicate<"!Subtarget->slowIncDec() || "
193*5f757f3fSDimitry Andric                            "shouldOptForSize(MF)">;
194*5f757f3fSDimitry Andric  def NoSSE41_Or_OptForSize : Predicate<"shouldOptForSize(MF) || "
195*5f757f3fSDimitry Andric                                        "!Subtarget->hasSSE41()">;
196*5f757f3fSDimitry Andric}
197*5f757f3fSDimitry Andric
198*5f757f3fSDimitry Andricdef CallImmAddr  : Predicate<"Subtarget->isLegalToCallImmediateAddr()">;
199*5f757f3fSDimitry Andricdef FavorMemIndirectCall  : Predicate<"!Subtarget->slowTwoMemOps()">;
200*5f757f3fSDimitry Andricdef HasFastMem32 : Predicate<"!Subtarget->isUnalignedMem32Slow()">;
201*5f757f3fSDimitry Andricdef HasFastLZCNT : Predicate<"Subtarget->hasFastLZCNT()">;
202*5f757f3fSDimitry Andricdef HasFastSHLDRotate : Predicate<"Subtarget->hasFastSHLDRotate()">;
203*5f757f3fSDimitry Andricdef HasERMSB : Predicate<"Subtarget->hasERMSB()">;
204*5f757f3fSDimitry Andricdef HasFSRM : Predicate<"Subtarget->hasFSRM()">;
205*5f757f3fSDimitry Andricdef HasMFence    : Predicate<"Subtarget->hasMFence()">;
206*5f757f3fSDimitry Andricdef UseIndirectThunkCalls : Predicate<"Subtarget->useIndirectThunkCalls()">;
207*5f757f3fSDimitry Andricdef NotUseIndirectThunkCalls : Predicate<"!Subtarget->useIndirectThunkCalls()">;
208