xref: /llvm-project/llvm/lib/Target/X86/X86InstrPredicates.td (revision c1a3960abe5ca316e9a26e87cdc3a7f94e420dc6)
1689db42cSShengchen Kan//===---X86InstrPredicates.td - X86 Predicate Definitions --*- tablegen -*-===//
2689db42cSShengchen Kan//
3689db42cSShengchen Kan// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4689db42cSShengchen Kan// See https://llvm.org/LICENSE.txt for license information.
5689db42cSShengchen Kan// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6689db42cSShengchen Kan//
7689db42cSShengchen Kan//===----------------------------------------------------------------------===//
8689db42cSShengchen Kan
9689db42cSShengchen Kandef TruePredicate : Predicate<"true">;
10689db42cSShengchen Kan
114daea501SShengchen Kan// Intel x86 instructions have three separate encoding spaces: legacy, VEX, and
124daea501SShengchen Kan// EVEX. Not all X86 instructions are extended for EGPR. The following is an
134daea501SShengchen Kan// overview of which instructions are extended and how we implement them.
144daea501SShengchen Kan//
154daea501SShengchen Kan// * Legacy space
164daea501SShengchen Kan//   All instructions in legacy maps 0 and 1 that have explicit GPR or memory
174daea501SShengchen Kan//   operands can use the REX2 prefix to access the EGPR, except XSAVE*/XRSTOR.
184daea501SShengchen Kan//
194daea501SShengchen Kan// * EVEX space
204daea501SShengchen Kan//   All instructions in the EVEX space can access the EGPR in their
214daea501SShengchen Kan//   register/memory operands.
224daea501SShengchen Kan//
234daea501SShengchen Kan// For the above intructions, the only difference in encoding is reflected in
244daea501SShengchen Kan// the REX2/EVEX prefix when EGPR is used, i.e. the opcode and opcode name are
254daea501SShengchen Kan// unchanged. We don’t add new entries in TD, and instead we extend GPR with
264daea501SShengchen Kan// R16-R31 and make them allocatable only when the feature EGPR is available.
274daea501SShengchen Kan//
284daea501SShengchen Kan// Besides, some instructions in legacy space with map 2/3 and VEX space are
294daea501SShengchen Kan// promoted into EVEX space. Encoding space changes after the promotion, opcode
304daea501SShengchen Kan// and opcode map may change too sometimes. For these instructions, we add new
314daea501SShengchen Kan// entries in TD to avoid overcomplicating the assembler and disassembler.
324daea501SShengchen Kan//
334daea501SShengchen Kan// HasEGPR is for the new entries and NoEGPR is for the entries before
344daea501SShengchen Kan// promotion, so that the promoted variant can be selected first to benefit RA.
35689db42cSShengchen Kandef HasEGPR      : Predicate<"Subtarget->hasEGPR()">;
36689db42cSShengchen Kandef NoEGPR       : Predicate<"!Subtarget->hasEGPR()">;
374daea501SShengchen Kan
384daea501SShengchen Kan// APX extends some instructions with a new form that has an extra register
394daea501SShengchen Kan// operand called a new data destination (NDD). In such forms, NDD is the new
404daea501SShengchen Kan// destination register receiving the result of the computation and all other
414daea501SShengchen Kan// operands (including the original destination operand) become read-only source
424daea501SShengchen Kan// operands.
434daea501SShengchen Kan//
444daea501SShengchen Kan// HasNDD is for the new NDD entries and NoNDD is for the legacy 2-address
454daea501SShengchen Kan// entries, so that the NDD variant can be selected first to benefit RA.
46d79ccee8SShengchen Kandef HasNDD       : Predicate<"Subtarget->hasNDD()">;
47d79ccee8SShengchen Kandef NoNDD        : Predicate<"!Subtarget->hasNDD()">;
48*c1a3960aSDaniel Zabawadef HasZU        : Predicate<"Subtarget->hasZU()">;
497b766a6fSXinWang10def HasCF        : Predicate<"Subtarget->hasCF()">;
50689db42cSShengchen Kandef HasCMOV      : Predicate<"Subtarget->canUseCMOV()">;
51689db42cSShengchen Kandef NoCMOV       : Predicate<"!Subtarget->canUseCMOV()">;
52689db42cSShengchen Kandef HasNOPL      : Predicate<"Subtarget->hasNOPL()">;
53689db42cSShengchen Kandef HasMMX       : Predicate<"Subtarget->hasMMX()">;
54689db42cSShengchen Kandef HasSSE1      : Predicate<"Subtarget->hasSSE1()">;
55689db42cSShengchen Kandef UseSSE1      : Predicate<"Subtarget->hasSSE1() && !Subtarget->hasAVX()">;
56689db42cSShengchen Kandef HasSSE2      : Predicate<"Subtarget->hasSSE2()">;
57689db42cSShengchen Kandef UseSSE2      : Predicate<"Subtarget->hasSSE2() && !Subtarget->hasAVX()">;
58689db42cSShengchen Kandef HasSSE3      : Predicate<"Subtarget->hasSSE3()">;
59689db42cSShengchen Kandef UseSSE3      : Predicate<"Subtarget->hasSSE3() && !Subtarget->hasAVX()">;
60689db42cSShengchen Kandef HasSSSE3     : Predicate<"Subtarget->hasSSSE3()">;
61689db42cSShengchen Kandef UseSSSE3     : Predicate<"Subtarget->hasSSSE3() && !Subtarget->hasAVX()">;
62689db42cSShengchen Kandef HasSSE41     : Predicate<"Subtarget->hasSSE41()">;
63689db42cSShengchen Kandef NoSSE41      : Predicate<"!Subtarget->hasSSE41()">;
64689db42cSShengchen Kandef UseSSE41     : Predicate<"Subtarget->hasSSE41() && !Subtarget->hasAVX()">;
65689db42cSShengchen Kandef HasSSE42     : Predicate<"Subtarget->hasSSE42()">;
66689db42cSShengchen Kandef UseSSE42     : Predicate<"Subtarget->hasSSE42() && !Subtarget->hasAVX()">;
67689db42cSShengchen Kandef HasSSE4A     : Predicate<"Subtarget->hasSSE4A()">;
68689db42cSShengchen Kandef NoAVX        : Predicate<"!Subtarget->hasAVX()">;
69689db42cSShengchen Kandef HasAVX       : Predicate<"Subtarget->hasAVX()">;
70689db42cSShengchen Kandef HasAVX2      : Predicate<"Subtarget->hasAVX2()">;
71689db42cSShengchen Kandef HasAVX1Only  : Predicate<"Subtarget->hasAVX() && !Subtarget->hasAVX2()">;
72689db42cSShengchen Kandef HasEVEX512   : Predicate<"Subtarget->hasEVEX512()">;
73689db42cSShengchen Kandef HasAVX10_1   : Predicate<"Subtarget->hasAVX10_1()">;
74689db42cSShengchen Kandef HasAVX10_1_512 : Predicate<"Subtarget->hasAVX10_1_512()">;
75259ca9eeSPhoebe Wangdef HasAVX10_2   : Predicate<"Subtarget->hasAVX10_2()">;
76259ca9eeSPhoebe Wangdef HasAVX10_2_512 : Predicate<"Subtarget->hasAVX10_2_512()">;
77259ca9eeSPhoebe Wangdef NoAVX10_2    : Predicate<"!Subtarget->hasAVX10_2()">;
78689db42cSShengchen Kandef HasAVX512    : Predicate<"Subtarget->hasAVX512()">;
79689db42cSShengchen Kandef UseAVX       : Predicate<"Subtarget->hasAVX() && !Subtarget->hasAVX512()">;
80689db42cSShengchen Kandef UseAVX2      : Predicate<"Subtarget->hasAVX2() && !Subtarget->hasAVX512()">;
81689db42cSShengchen Kandef NoAVX512     : Predicate<"!Subtarget->hasAVX512()">;
82689db42cSShengchen Kandef HasCDI       : Predicate<"Subtarget->hasCDI()">;
83689db42cSShengchen Kandef HasVPOPCNTDQ : Predicate<"Subtarget->hasVPOPCNTDQ()">;
84689db42cSShengchen Kandef HasDQI       : Predicate<"Subtarget->hasDQI()">;
85689db42cSShengchen Kandef NoDQI        : Predicate<"!Subtarget->hasDQI()">;
86689db42cSShengchen Kandef HasBWI       : Predicate<"Subtarget->hasBWI()">;
87689db42cSShengchen Kandef NoBWI        : Predicate<"!Subtarget->hasBWI()">;
88689db42cSShengchen Kandef HasVLX       : Predicate<"Subtarget->hasVLX()">;
89689db42cSShengchen Kandef NoVLX        : Predicate<"!Subtarget->hasVLX()">;
90689db42cSShengchen Kandef NoVLX_Or_NoBWI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasBWI()">;
91689db42cSShengchen Kandef NoVLX_Or_NoDQI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasDQI()">;
92689db42cSShengchen Kandef HasPKU       : Predicate<"Subtarget->hasPKU()">;
93689db42cSShengchen Kandef HasVNNI      : Predicate<"Subtarget->hasVNNI()">;
94689db42cSShengchen Kandef HasVP2INTERSECT : Predicate<"Subtarget->hasVP2INTERSECT()">;
95689db42cSShengchen Kandef HasBF16      : Predicate<"Subtarget->hasBF16()">;
96689db42cSShengchen Kandef HasFP16      : Predicate<"Subtarget->hasFP16()">;
97689db42cSShengchen Kandef HasAVXVNNIINT16 : Predicate<"Subtarget->hasAVXVNNIINT16()">;
98689db42cSShengchen Kandef HasAVXVNNIINT8 : Predicate<"Subtarget->hasAVXVNNIINT8()">;
99689db42cSShengchen Kandef HasAVXVNNI : Predicate <"Subtarget->hasAVXVNNI()">;
100689db42cSShengchen Kandef NoVLX_Or_NoVNNI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVNNI()">;
101689db42cSShengchen Kan
102689db42cSShengchen Kandef HasBITALG    : Predicate<"Subtarget->hasBITALG()">;
103689db42cSShengchen Kandef HasPOPCNT    : Predicate<"Subtarget->hasPOPCNT()">;
104689db42cSShengchen Kandef HasAES       : Predicate<"Subtarget->hasAES()">;
105689db42cSShengchen Kandef HasVAES      : Predicate<"Subtarget->hasVAES()">;
106689db42cSShengchen Kandef NoVLX_Or_NoVAES : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVAES()">;
107689db42cSShengchen Kandef HasFXSR      : Predicate<"Subtarget->hasFXSR()">;
108689db42cSShengchen Kandef HasX87       : Predicate<"Subtarget->hasX87()">;
109689db42cSShengchen Kandef HasXSAVE     : Predicate<"Subtarget->hasXSAVE()">;
110689db42cSShengchen Kandef HasXSAVEOPT  : Predicate<"Subtarget->hasXSAVEOPT()">;
111689db42cSShengchen Kandef HasXSAVEC    : Predicate<"Subtarget->hasXSAVEC()">;
112689db42cSShengchen Kandef HasXSAVES    : Predicate<"Subtarget->hasXSAVES()">;
113689db42cSShengchen Kandef HasPCLMUL    : Predicate<"Subtarget->hasPCLMUL()">;
114689db42cSShengchen Kandef NoVLX_Or_NoVPCLMULQDQ :
115689db42cSShengchen Kan                    Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVPCLMULQDQ()">;
116689db42cSShengchen Kandef HasVPCLMULQDQ : Predicate<"Subtarget->hasVPCLMULQDQ()">;
117689db42cSShengchen Kandef HasGFNI      : Predicate<"Subtarget->hasGFNI()">;
118689db42cSShengchen Kandef HasFMA       : Predicate<"Subtarget->hasFMA()">;
119689db42cSShengchen Kandef HasFMA4      : Predicate<"Subtarget->hasFMA4()">;
120689db42cSShengchen Kandef NoFMA4       : Predicate<"!Subtarget->hasFMA4()">;
121689db42cSShengchen Kandef HasXOP       : Predicate<"Subtarget->hasXOP()">;
122689db42cSShengchen Kandef HasTBM       : Predicate<"Subtarget->hasTBM()">;
123689db42cSShengchen Kandef NoTBM        : Predicate<"!Subtarget->hasTBM()">;
124689db42cSShengchen Kandef HasLWP       : Predicate<"Subtarget->hasLWP()">;
125689db42cSShengchen Kandef HasMOVBE     : Predicate<"Subtarget->hasMOVBE()">;
12602d56801SXinWang10def NoNDD_Or_NoMOVBE     : Predicate<"!Subtarget->hasNDD() || !Subtarget->hasMOVBE()">;
127689db42cSShengchen Kandef HasRDRAND    : Predicate<"Subtarget->hasRDRAND()">;
128689db42cSShengchen Kandef HasF16C      : Predicate<"Subtarget->hasF16C()">;
129689db42cSShengchen Kandef HasFSGSBase  : Predicate<"Subtarget->hasFSGSBase()">;
130689db42cSShengchen Kandef HasLZCNT     : Predicate<"Subtarget->hasLZCNT()">;
131689db42cSShengchen Kandef HasBMI       : Predicate<"Subtarget->hasBMI()">;
132689db42cSShengchen Kandef HasBMI2      : Predicate<"Subtarget->hasBMI2()">;
133689db42cSShengchen Kandef NoBMI2       : Predicate<"!Subtarget->hasBMI2()">;
134689db42cSShengchen Kandef HasVBMI      : Predicate<"Subtarget->hasVBMI()">;
135689db42cSShengchen Kandef HasVBMI2     : Predicate<"Subtarget->hasVBMI2()">;
136689db42cSShengchen Kandef HasIFMA      : Predicate<"Subtarget->hasIFMA()">;
137689db42cSShengchen Kandef HasAVXIFMA   : Predicate<"Subtarget->hasAVXIFMA()">;
138689db42cSShengchen Kandef NoVLX_Or_NoIFMA : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasIFMA()">;
139689db42cSShengchen Kandef HasRTM       : Predicate<"Subtarget->hasRTM()">;
140689db42cSShengchen Kandef HasSHA       : Predicate<"Subtarget->hasSHA()">;
141689db42cSShengchen Kandef HasSHA512    : Predicate<"Subtarget->hasSHA512()">;
142689db42cSShengchen Kandef HasSGX       : Predicate<"Subtarget->hasSGX()">;
143689db42cSShengchen Kandef HasSM3       : Predicate<"Subtarget->hasSM3()">;
144689db42cSShengchen Kandef HasRDSEED    : Predicate<"Subtarget->hasRDSEED()">;
145689db42cSShengchen Kandef HasSSEPrefetch : Predicate<"Subtarget->hasSSEPrefetch()">;
146689db42cSShengchen Kandef HasPRFCHW    : Predicate<"Subtarget->hasPRFCHW()">;
147689db42cSShengchen Kandef HasPREFETCHI : Predicate<"Subtarget->hasPREFETCHI()">;
148689db42cSShengchen Kandef HasPrefetchW : Predicate<"Subtarget->hasPrefetchW()">;
149689db42cSShengchen Kandef HasLAHFSAHF  : Predicate<"Subtarget->hasLAHFSAHF()">;
150689db42cSShengchen Kandef HasLAHFSAHF64 : Predicate<"Subtarget->hasLAHFSAHF64()">;
151689db42cSShengchen Kandef HasMWAITX    : Predicate<"Subtarget->hasMWAITX()">;
152689db42cSShengchen Kandef HasCLZERO    : Predicate<"Subtarget->hasCLZERO()">;
153689db42cSShengchen Kandef HasCLDEMOTE  : Predicate<"Subtarget->hasCLDEMOTE()">;
154689db42cSShengchen Kandef HasMOVDIRI   : Predicate<"Subtarget->hasMOVDIRI()">;
155689db42cSShengchen Kandef HasMOVDIR64B : Predicate<"Subtarget->hasMOVDIR64B()">;
156c4248fa3SFreddy Yedef HasMOVRS     : Predicate<"Subtarget->hasMOVRS()">;
157689db42cSShengchen Kandef HasPTWRITE   : Predicate<"Subtarget->hasPTWRITE()">;
158689db42cSShengchen Kandef FPStackf32   : Predicate<"!Subtarget->hasSSE1()">;
159689db42cSShengchen Kandef FPStackf64   : Predicate<"!Subtarget->hasSSE2()">;
160689db42cSShengchen Kandef HasSHSTK     : Predicate<"Subtarget->hasSHSTK()">;
161689db42cSShengchen Kandef HasSM4       : Predicate<"Subtarget->hasSM4()">;
162689db42cSShengchen Kandef HasCLFLUSH   : Predicate<"Subtarget->hasCLFLUSH()">;
163689db42cSShengchen Kandef HasCLFLUSHOPT : Predicate<"Subtarget->hasCLFLUSHOPT()">;
164689db42cSShengchen Kandef HasCLWB      : Predicate<"Subtarget->hasCLWB()">;
165689db42cSShengchen Kandef HasWBNOINVD  : Predicate<"Subtarget->hasWBNOINVD()">;
166689db42cSShengchen Kandef HasRDPID     : Predicate<"Subtarget->hasRDPID()">;
167689db42cSShengchen Kandef HasRDPRU     : Predicate<"Subtarget->hasRDPRU()">;
168689db42cSShengchen Kandef HasWAITPKG   : Predicate<"Subtarget->hasWAITPKG()">;
169689db42cSShengchen Kandef HasINVPCID   : Predicate<"Subtarget->hasINVPCID()">;
170689db42cSShengchen Kandef HasCX8       : Predicate<"Subtarget->hasCX8()">;
171689db42cSShengchen Kandef HasCX16      : Predicate<"Subtarget->hasCX16()">;
172689db42cSShengchen Kandef HasPCONFIG   : Predicate<"Subtarget->hasPCONFIG()">;
173689db42cSShengchen Kandef HasENQCMD    : Predicate<"Subtarget->hasENQCMD()">;
174689db42cSShengchen Kandef HasAMXFP16   : Predicate<"Subtarget->hasAMXFP16()">;
175689db42cSShengchen Kandef HasCMPCCXADD : Predicate<"Subtarget->hasCMPCCXADD()">;
176689db42cSShengchen Kandef HasAVXNECONVERT : Predicate<"Subtarget->hasAVXNECONVERT()">;
177689db42cSShengchen Kandef HasKL        : Predicate<"Subtarget->hasKL()">;
178689db42cSShengchen Kandef HasRAOINT    : Predicate<"Subtarget->hasRAOINT()">;
179689db42cSShengchen Kandef HasWIDEKL    : Predicate<"Subtarget->hasWIDEKL()">;
180689db42cSShengchen Kandef HasHRESET    : Predicate<"Subtarget->hasHRESET()">;
181689db42cSShengchen Kandef HasSERIALIZE : Predicate<"Subtarget->hasSERIALIZE()">;
182689db42cSShengchen Kandef HasTSXLDTRK  : Predicate<"Subtarget->hasTSXLDTRK()">;
183689db42cSShengchen Kandef HasAMXTILE   : Predicate<"Subtarget->hasAMXTILE()">;
184689db42cSShengchen Kandef HasAMXBF16   : Predicate<"Subtarget->hasAMXBF16()">;
185689db42cSShengchen Kandef HasAMXINT8   : Predicate<"Subtarget->hasAMXINT8()">;
186689db42cSShengchen Kandef HasAMXCOMPLEX : Predicate<"Subtarget->hasAMXCOMPLEX()">;
18781271624SFeng Zoudef HasAMXFP8    : Predicate<"Subtarget->hasAMXFP8()">;
188f77101eaSMalay Sanghidef HasAMXMOVRS  : Predicate<"Subtarget->hasAMXMOVRS()">;
189c72a751dSPhoebe Wangdef HasAMXTRANSPOSE : Predicate<"Subtarget->hasAMXTRANSPOSE()">;
1908f440137SPhoebe Wangdef HasAMXAVX512 : Predicate<"Subtarget->hasAMXAVX512()">;
191eddb79d5SFeng Zoudef HasAMXTF32   : Predicate<"Subtarget->hasAMXTF32()">;
192689db42cSShengchen Kandef HasUINTR     : Predicate<"Subtarget->hasUINTR()">;
193689db42cSShengchen Kandef HasUSERMSR   : Predicate<"Subtarget->hasUSERMSR()">;
194689db42cSShengchen Kandef HasCRC32     : Predicate<"Subtarget->hasCRC32()">;
195689db42cSShengchen Kan
196689db42cSShengchen Kandef HasX86_64    : Predicate<"Subtarget->hasX86_64()">;
197689db42cSShengchen Kandef Not64BitMode : Predicate<"!Subtarget->is64Bit()">,
198689db42cSShengchen Kan                             AssemblerPredicate<(all_of (not Is64Bit)), "Not 64-bit mode">;
199689db42cSShengchen Kandef In64BitMode  : Predicate<"Subtarget->is64Bit()">,
200689db42cSShengchen Kan                             AssemblerPredicate<(all_of Is64Bit), "64-bit mode">;
201689db42cSShengchen Kandef IsLP64  : Predicate<"Subtarget->isTarget64BitLP64()">;
202689db42cSShengchen Kandef NotLP64 : Predicate<"!Subtarget->isTarget64BitLP64()">;
203689db42cSShengchen Kandef In16BitMode  : Predicate<"Subtarget->is16Bit()">,
204689db42cSShengchen Kan                             AssemblerPredicate<(all_of Is16Bit), "16-bit mode">;
205689db42cSShengchen Kandef Not16BitMode : Predicate<"!Subtarget->is16Bit()">,
206689db42cSShengchen Kan                             AssemblerPredicate<(all_of (not Is16Bit)), "Not 16-bit mode">;
207689db42cSShengchen Kandef In32BitMode  : Predicate<"Subtarget->is32Bit()">,
208689db42cSShengchen Kan                             AssemblerPredicate<(all_of Is32Bit), "32-bit mode">;
209689db42cSShengchen Kandef IsWin64      : Predicate<"Subtarget->isTargetWin64()">;
210689db42cSShengchen Kandef NotWin64     : Predicate<"!Subtarget->isTargetWin64()">;
211689db42cSShengchen Kandef NotWin64WithoutFP : Predicate<"!Subtarget->isTargetWin64() ||"
212689db42cSShengchen Kan                                  "Subtarget->getFrameLowering()->hasFP(*MF)"> {
213689db42cSShengchen Kan  let RecomputePerFunction = 1;
214689db42cSShengchen Kan}
215689db42cSShengchen Kandef IsPS         : Predicate<"Subtarget->isTargetPS()">;
216689db42cSShengchen Kandef NotPS        : Predicate<"!Subtarget->isTargetPS()">;
217689db42cSShengchen Kandef IsNaCl       : Predicate<"Subtarget->isTargetNaCl()">;
218689db42cSShengchen Kandef NotNaCl      : Predicate<"!Subtarget->isTargetNaCl()">;
219689db42cSShengchen Kandef SmallCode    : Predicate<"TM.getCodeModel() == CodeModel::Small">;
220689db42cSShengchen Kandef KernelCode   : Predicate<"TM.getCodeModel() == CodeModel::Kernel">;
221689db42cSShengchen Kandef NearData     : Predicate<"TM.getCodeModel() == CodeModel::Small ||"
222689db42cSShengchen Kan                             "TM.getCodeModel() == CodeModel::Kernel">;
223689db42cSShengchen Kandef IsNotPIC     : Predicate<"!TM.isPositionIndependent()">;
224689db42cSShengchen Kan
225689db42cSShengchen Kan// We could compute these on a per-module basis but doing so requires accessing
226689db42cSShengchen Kan// the Function object through the <Target>Subtarget and objections were raised
227689db42cSShengchen Kan// to that (see post-commit review comments for r301750).
228689db42cSShengchen Kanlet RecomputePerFunction = 1 in {
229689db42cSShengchen Kan  def OptForSize   : Predicate<"shouldOptForSize(MF)">;
230689db42cSShengchen Kan  def OptForMinSize : Predicate<"MF->getFunction().hasMinSize()">;
231689db42cSShengchen Kan  def OptForSpeed  : Predicate<"!shouldOptForSize(MF)">;
232689db42cSShengchen Kan  def UseIncDec : Predicate<"!Subtarget->slowIncDec() || "
233689db42cSShengchen Kan                            "shouldOptForSize(MF)">;
234689db42cSShengchen Kan  def NoSSE41_Or_OptForSize : Predicate<"shouldOptForSize(MF) || "
235689db42cSShengchen Kan                                        "!Subtarget->hasSSE41()">;
236689db42cSShengchen Kan}
237689db42cSShengchen Kan
238689db42cSShengchen Kandef CallImmAddr  : Predicate<"Subtarget->isLegalToCallImmediateAddr()">;
239689db42cSShengchen Kandef FavorMemIndirectCall  : Predicate<"!Subtarget->slowTwoMemOps()">;
240689db42cSShengchen Kandef HasFastMem32 : Predicate<"!Subtarget->isUnalignedMem32Slow()">;
241689db42cSShengchen Kandef HasFastLZCNT : Predicate<"Subtarget->hasFastLZCNT()">;
242689db42cSShengchen Kandef HasFastSHLDRotate : Predicate<"Subtarget->hasFastSHLDRotate()">;
243689db42cSShengchen Kandef HasERMSB : Predicate<"Subtarget->hasERMSB()">;
244689db42cSShengchen Kandef HasFSRM : Predicate<"Subtarget->hasFSRM()">;
245689db42cSShengchen Kandef HasMFence    : Predicate<"Subtarget->hasMFence()">;
24661fadd0bSGaneshdef HasFastDPWSSD: Predicate<"Subtarget->hasFastDPWSSD()">;
247689db42cSShengchen Kandef UseIndirectThunkCalls : Predicate<"Subtarget->useIndirectThunkCalls()">;
248689db42cSShengchen Kandef NotUseIndirectThunkCalls : Predicate<"!Subtarget->useIndirectThunkCalls()">;
249