xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/X86/X86InstrPredicates.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
15f757f3fSDimitry Andric//===---X86InstrPredicates.td - X86 Predicate Definitions --*- tablegen -*-===//
25f757f3fSDimitry Andric//
35f757f3fSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45f757f3fSDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
55f757f3fSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65f757f3fSDimitry Andric//
75f757f3fSDimitry Andric//===----------------------------------------------------------------------===//
85f757f3fSDimitry Andric
95f757f3fSDimitry Andricdef TruePredicate : Predicate<"true">;
105f757f3fSDimitry Andric
111db9f3b2SDimitry Andric// Intel x86 instructions have three separate encoding spaces: legacy, VEX, and
121db9f3b2SDimitry Andric// EVEX. Not all X86 instructions are extended for EGPR. The following is an
131db9f3b2SDimitry Andric// overview of which instructions are extended and how we implement them.
141db9f3b2SDimitry Andric//
151db9f3b2SDimitry Andric// * Legacy space
161db9f3b2SDimitry Andric//   All instructions in legacy maps 0 and 1 that have explicit GPR or memory
171db9f3b2SDimitry Andric//   operands can use the REX2 prefix to access the EGPR, except XSAVE*/XRSTOR.
181db9f3b2SDimitry Andric//
191db9f3b2SDimitry Andric// * EVEX space
201db9f3b2SDimitry Andric//   All instructions in the EVEX space can access the EGPR in their
211db9f3b2SDimitry Andric//   register/memory operands.
221db9f3b2SDimitry Andric//
231db9f3b2SDimitry Andric// For the above intructions, the only difference in encoding is reflected in
241db9f3b2SDimitry Andric// the REX2/EVEX prefix when EGPR is used, i.e. the opcode and opcode name are
251db9f3b2SDimitry Andric// unchanged. We don’t add new entries in TD, and instead we extend GPR with
261db9f3b2SDimitry Andric// R16-R31 and make them allocatable only when the feature EGPR is available.
271db9f3b2SDimitry Andric//
281db9f3b2SDimitry Andric// Besides, some instructions in legacy space with map 2/3 and VEX space are
291db9f3b2SDimitry Andric// promoted into EVEX space. Encoding space changes after the promotion, opcode
301db9f3b2SDimitry Andric// and opcode map may change too sometimes. For these instructions, we add new
311db9f3b2SDimitry Andric// entries in TD to avoid overcomplicating the assembler and disassembler.
321db9f3b2SDimitry Andric//
331db9f3b2SDimitry Andric// HasEGPR is for the new entries and NoEGPR is for the entries before
341db9f3b2SDimitry Andric// promotion, so that the promoted variant can be selected first to benefit RA.
355f757f3fSDimitry Andricdef HasEGPR      : Predicate<"Subtarget->hasEGPR()">;
365f757f3fSDimitry Andricdef NoEGPR       : Predicate<"!Subtarget->hasEGPR()">;
371db9f3b2SDimitry Andric
381db9f3b2SDimitry Andric// APX extends some instructions with a new form that has an extra register
391db9f3b2SDimitry Andric// operand called a new data destination (NDD). In such forms, NDD is the new
401db9f3b2SDimitry Andric// destination register receiving the result of the computation and all other
411db9f3b2SDimitry Andric// operands (including the original destination operand) become read-only source
421db9f3b2SDimitry Andric// operands.
431db9f3b2SDimitry Andric//
441db9f3b2SDimitry Andric// HasNDD is for the new NDD entries and NoNDD is for the legacy 2-address
451db9f3b2SDimitry Andric// entries, so that the NDD variant can be selected first to benefit RA.
46647cbc5dSDimitry Andricdef HasNDD       : Predicate<"Subtarget->hasNDD()">;
47647cbc5dSDimitry Andricdef NoNDD        : Predicate<"!Subtarget->hasNDD()">;
48*0fca6ea1SDimitry Andricdef HasCF        : Predicate<"Subtarget->hasCF()">;
495f757f3fSDimitry Andricdef HasCMOV      : Predicate<"Subtarget->canUseCMOV()">;
505f757f3fSDimitry Andricdef NoCMOV       : Predicate<"!Subtarget->canUseCMOV()">;
515f757f3fSDimitry Andricdef HasNOPL      : Predicate<"Subtarget->hasNOPL()">;
525f757f3fSDimitry Andricdef HasMMX       : Predicate<"Subtarget->hasMMX()">;
535f757f3fSDimitry Andricdef HasSSE1      : Predicate<"Subtarget->hasSSE1()">;
545f757f3fSDimitry Andricdef UseSSE1      : Predicate<"Subtarget->hasSSE1() && !Subtarget->hasAVX()">;
555f757f3fSDimitry Andricdef HasSSE2      : Predicate<"Subtarget->hasSSE2()">;
565f757f3fSDimitry Andricdef UseSSE2      : Predicate<"Subtarget->hasSSE2() && !Subtarget->hasAVX()">;
575f757f3fSDimitry Andricdef HasSSE3      : Predicate<"Subtarget->hasSSE3()">;
585f757f3fSDimitry Andricdef UseSSE3      : Predicate<"Subtarget->hasSSE3() && !Subtarget->hasAVX()">;
595f757f3fSDimitry Andricdef HasSSSE3     : Predicate<"Subtarget->hasSSSE3()">;
605f757f3fSDimitry Andricdef UseSSSE3     : Predicate<"Subtarget->hasSSSE3() && !Subtarget->hasAVX()">;
615f757f3fSDimitry Andricdef HasSSE41     : Predicate<"Subtarget->hasSSE41()">;
625f757f3fSDimitry Andricdef NoSSE41      : Predicate<"!Subtarget->hasSSE41()">;
635f757f3fSDimitry Andricdef UseSSE41     : Predicate<"Subtarget->hasSSE41() && !Subtarget->hasAVX()">;
645f757f3fSDimitry Andricdef HasSSE42     : Predicate<"Subtarget->hasSSE42()">;
655f757f3fSDimitry Andricdef UseSSE42     : Predicate<"Subtarget->hasSSE42() && !Subtarget->hasAVX()">;
665f757f3fSDimitry Andricdef HasSSE4A     : Predicate<"Subtarget->hasSSE4A()">;
675f757f3fSDimitry Andricdef NoAVX        : Predicate<"!Subtarget->hasAVX()">;
685f757f3fSDimitry Andricdef HasAVX       : Predicate<"Subtarget->hasAVX()">;
695f757f3fSDimitry Andricdef HasAVX2      : Predicate<"Subtarget->hasAVX2()">;
705f757f3fSDimitry Andricdef HasAVX1Only  : Predicate<"Subtarget->hasAVX() && !Subtarget->hasAVX2()">;
715f757f3fSDimitry Andricdef HasEVEX512   : Predicate<"Subtarget->hasEVEX512()">;
725f757f3fSDimitry Andricdef HasAVX10_1   : Predicate<"Subtarget->hasAVX10_1()">;
735f757f3fSDimitry Andricdef HasAVX10_1_512 : Predicate<"Subtarget->hasAVX10_1_512()">;
745f757f3fSDimitry Andricdef HasAVX512    : Predicate<"Subtarget->hasAVX512()">;
755f757f3fSDimitry Andricdef UseAVX       : Predicate<"Subtarget->hasAVX() && !Subtarget->hasAVX512()">;
765f757f3fSDimitry Andricdef UseAVX2      : Predicate<"Subtarget->hasAVX2() && !Subtarget->hasAVX512()">;
775f757f3fSDimitry Andricdef NoAVX512     : Predicate<"!Subtarget->hasAVX512()">;
785f757f3fSDimitry Andricdef HasCDI       : Predicate<"Subtarget->hasCDI()">;
795f757f3fSDimitry Andricdef HasVPOPCNTDQ : Predicate<"Subtarget->hasVPOPCNTDQ()">;
805f757f3fSDimitry Andricdef HasDQI       : Predicate<"Subtarget->hasDQI()">;
815f757f3fSDimitry Andricdef NoDQI        : Predicate<"!Subtarget->hasDQI()">;
825f757f3fSDimitry Andricdef HasBWI       : Predicate<"Subtarget->hasBWI()">;
835f757f3fSDimitry Andricdef NoBWI        : Predicate<"!Subtarget->hasBWI()">;
845f757f3fSDimitry Andricdef HasVLX       : Predicate<"Subtarget->hasVLX()">;
855f757f3fSDimitry Andricdef NoVLX        : Predicate<"!Subtarget->hasVLX()">;
865f757f3fSDimitry Andricdef NoVLX_Or_NoBWI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasBWI()">;
875f757f3fSDimitry Andricdef NoVLX_Or_NoDQI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasDQI()">;
885f757f3fSDimitry Andricdef HasPKU       : Predicate<"Subtarget->hasPKU()">;
895f757f3fSDimitry Andricdef HasVNNI      : Predicate<"Subtarget->hasVNNI()">;
905f757f3fSDimitry Andricdef HasVP2INTERSECT : Predicate<"Subtarget->hasVP2INTERSECT()">;
915f757f3fSDimitry Andricdef HasBF16      : Predicate<"Subtarget->hasBF16()">;
925f757f3fSDimitry Andricdef HasFP16      : Predicate<"Subtarget->hasFP16()">;
935f757f3fSDimitry Andricdef HasAVXVNNIINT16 : Predicate<"Subtarget->hasAVXVNNIINT16()">;
945f757f3fSDimitry Andricdef HasAVXVNNIINT8 : Predicate<"Subtarget->hasAVXVNNIINT8()">;
955f757f3fSDimitry Andricdef HasAVXVNNI : Predicate <"Subtarget->hasAVXVNNI()">;
965f757f3fSDimitry Andricdef NoVLX_Or_NoVNNI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVNNI()">;
975f757f3fSDimitry Andric
985f757f3fSDimitry Andricdef HasBITALG    : Predicate<"Subtarget->hasBITALG()">;
995f757f3fSDimitry Andricdef HasPOPCNT    : Predicate<"Subtarget->hasPOPCNT()">;
1005f757f3fSDimitry Andricdef HasAES       : Predicate<"Subtarget->hasAES()">;
1015f757f3fSDimitry Andricdef HasVAES      : Predicate<"Subtarget->hasVAES()">;
1025f757f3fSDimitry Andricdef NoVLX_Or_NoVAES : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVAES()">;
1035f757f3fSDimitry Andricdef HasFXSR      : Predicate<"Subtarget->hasFXSR()">;
1045f757f3fSDimitry Andricdef HasX87       : Predicate<"Subtarget->hasX87()">;
1055f757f3fSDimitry Andricdef HasXSAVE     : Predicate<"Subtarget->hasXSAVE()">;
1065f757f3fSDimitry Andricdef HasXSAVEOPT  : Predicate<"Subtarget->hasXSAVEOPT()">;
1075f757f3fSDimitry Andricdef HasXSAVEC    : Predicate<"Subtarget->hasXSAVEC()">;
1085f757f3fSDimitry Andricdef HasXSAVES    : Predicate<"Subtarget->hasXSAVES()">;
1095f757f3fSDimitry Andricdef HasPCLMUL    : Predicate<"Subtarget->hasPCLMUL()">;
1105f757f3fSDimitry Andricdef NoVLX_Or_NoVPCLMULQDQ :
1115f757f3fSDimitry Andric                    Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVPCLMULQDQ()">;
1125f757f3fSDimitry Andricdef HasVPCLMULQDQ : Predicate<"Subtarget->hasVPCLMULQDQ()">;
1135f757f3fSDimitry Andricdef HasGFNI      : Predicate<"Subtarget->hasGFNI()">;
1145f757f3fSDimitry Andricdef HasFMA       : Predicate<"Subtarget->hasFMA()">;
1155f757f3fSDimitry Andricdef HasFMA4      : Predicate<"Subtarget->hasFMA4()">;
1165f757f3fSDimitry Andricdef NoFMA4       : Predicate<"!Subtarget->hasFMA4()">;
1175f757f3fSDimitry Andricdef HasXOP       : Predicate<"Subtarget->hasXOP()">;
1185f757f3fSDimitry Andricdef HasTBM       : Predicate<"Subtarget->hasTBM()">;
1195f757f3fSDimitry Andricdef NoTBM        : Predicate<"!Subtarget->hasTBM()">;
1205f757f3fSDimitry Andricdef HasLWP       : Predicate<"Subtarget->hasLWP()">;
1215f757f3fSDimitry Andricdef HasMOVBE     : Predicate<"Subtarget->hasMOVBE()">;
122*0fca6ea1SDimitry Andricdef NoNDD_Or_NoMOVBE     : Predicate<"!Subtarget->hasNDD() || !Subtarget->hasMOVBE()">;
1235f757f3fSDimitry Andricdef HasRDRAND    : Predicate<"Subtarget->hasRDRAND()">;
1245f757f3fSDimitry Andricdef HasF16C      : Predicate<"Subtarget->hasF16C()">;
1255f757f3fSDimitry Andricdef HasFSGSBase  : Predicate<"Subtarget->hasFSGSBase()">;
1265f757f3fSDimitry Andricdef HasLZCNT     : Predicate<"Subtarget->hasLZCNT()">;
1275f757f3fSDimitry Andricdef HasBMI       : Predicate<"Subtarget->hasBMI()">;
1285f757f3fSDimitry Andricdef HasBMI2      : Predicate<"Subtarget->hasBMI2()">;
1295f757f3fSDimitry Andricdef NoBMI2       : Predicate<"!Subtarget->hasBMI2()">;
1305f757f3fSDimitry Andricdef HasVBMI      : Predicate<"Subtarget->hasVBMI()">;
1315f757f3fSDimitry Andricdef HasVBMI2     : Predicate<"Subtarget->hasVBMI2()">;
1325f757f3fSDimitry Andricdef HasIFMA      : Predicate<"Subtarget->hasIFMA()">;
1335f757f3fSDimitry Andricdef HasAVXIFMA   : Predicate<"Subtarget->hasAVXIFMA()">;
1345f757f3fSDimitry Andricdef NoVLX_Or_NoIFMA : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasIFMA()">;
1355f757f3fSDimitry Andricdef HasRTM       : Predicate<"Subtarget->hasRTM()">;
1365f757f3fSDimitry Andricdef HasSHA       : Predicate<"Subtarget->hasSHA()">;
1375f757f3fSDimitry Andricdef HasSHA512    : Predicate<"Subtarget->hasSHA512()">;
1385f757f3fSDimitry Andricdef HasSGX       : Predicate<"Subtarget->hasSGX()">;
1395f757f3fSDimitry Andricdef HasSM3       : Predicate<"Subtarget->hasSM3()">;
1405f757f3fSDimitry Andricdef HasRDSEED    : Predicate<"Subtarget->hasRDSEED()">;
1415f757f3fSDimitry Andricdef HasSSEPrefetch : Predicate<"Subtarget->hasSSEPrefetch()">;
1425f757f3fSDimitry Andricdef HasPRFCHW    : Predicate<"Subtarget->hasPRFCHW()">;
1435f757f3fSDimitry Andricdef HasPREFETCHI : Predicate<"Subtarget->hasPREFETCHI()">;
1445f757f3fSDimitry Andricdef HasPrefetchW : Predicate<"Subtarget->hasPrefetchW()">;
1455f757f3fSDimitry Andricdef HasLAHFSAHF  : Predicate<"Subtarget->hasLAHFSAHF()">;
1465f757f3fSDimitry Andricdef HasLAHFSAHF64 : Predicate<"Subtarget->hasLAHFSAHF64()">;
1475f757f3fSDimitry Andricdef HasMWAITX    : Predicate<"Subtarget->hasMWAITX()">;
1485f757f3fSDimitry Andricdef HasCLZERO    : Predicate<"Subtarget->hasCLZERO()">;
1495f757f3fSDimitry Andricdef HasCLDEMOTE  : Predicate<"Subtarget->hasCLDEMOTE()">;
1505f757f3fSDimitry Andricdef HasMOVDIRI   : Predicate<"Subtarget->hasMOVDIRI()">;
1515f757f3fSDimitry Andricdef HasMOVDIR64B : Predicate<"Subtarget->hasMOVDIR64B()">;
1525f757f3fSDimitry Andricdef HasPTWRITE   : Predicate<"Subtarget->hasPTWRITE()">;
1535f757f3fSDimitry Andricdef FPStackf32   : Predicate<"!Subtarget->hasSSE1()">;
1545f757f3fSDimitry Andricdef FPStackf64   : Predicate<"!Subtarget->hasSSE2()">;
1555f757f3fSDimitry Andricdef HasSHSTK     : Predicate<"Subtarget->hasSHSTK()">;
1565f757f3fSDimitry Andricdef HasSM4       : Predicate<"Subtarget->hasSM4()">;
1575f757f3fSDimitry Andricdef HasCLFLUSH   : Predicate<"Subtarget->hasCLFLUSH()">;
1585f757f3fSDimitry Andricdef HasCLFLUSHOPT : Predicate<"Subtarget->hasCLFLUSHOPT()">;
1595f757f3fSDimitry Andricdef HasCLWB      : Predicate<"Subtarget->hasCLWB()">;
1605f757f3fSDimitry Andricdef HasWBNOINVD  : Predicate<"Subtarget->hasWBNOINVD()">;
1615f757f3fSDimitry Andricdef HasRDPID     : Predicate<"Subtarget->hasRDPID()">;
1625f757f3fSDimitry Andricdef HasRDPRU     : Predicate<"Subtarget->hasRDPRU()">;
1635f757f3fSDimitry Andricdef HasWAITPKG   : Predicate<"Subtarget->hasWAITPKG()">;
1645f757f3fSDimitry Andricdef HasINVPCID   : Predicate<"Subtarget->hasINVPCID()">;
1655f757f3fSDimitry Andricdef HasCX8       : Predicate<"Subtarget->hasCX8()">;
1665f757f3fSDimitry Andricdef HasCX16      : Predicate<"Subtarget->hasCX16()">;
1675f757f3fSDimitry Andricdef HasPCONFIG   : Predicate<"Subtarget->hasPCONFIG()">;
1685f757f3fSDimitry Andricdef HasENQCMD    : Predicate<"Subtarget->hasENQCMD()">;
1695f757f3fSDimitry Andricdef HasAMXFP16   : Predicate<"Subtarget->hasAMXFP16()">;
1705f757f3fSDimitry Andricdef HasCMPCCXADD : Predicate<"Subtarget->hasCMPCCXADD()">;
1715f757f3fSDimitry Andricdef HasAVXNECONVERT : Predicate<"Subtarget->hasAVXNECONVERT()">;
1725f757f3fSDimitry Andricdef HasKL        : Predicate<"Subtarget->hasKL()">;
1735f757f3fSDimitry Andricdef HasRAOINT    : Predicate<"Subtarget->hasRAOINT()">;
1745f757f3fSDimitry Andricdef HasWIDEKL    : Predicate<"Subtarget->hasWIDEKL()">;
1755f757f3fSDimitry Andricdef HasHRESET    : Predicate<"Subtarget->hasHRESET()">;
1765f757f3fSDimitry Andricdef HasSERIALIZE : Predicate<"Subtarget->hasSERIALIZE()">;
1775f757f3fSDimitry Andricdef HasTSXLDTRK  : Predicate<"Subtarget->hasTSXLDTRK()">;
1785f757f3fSDimitry Andricdef HasAMXTILE   : Predicate<"Subtarget->hasAMXTILE()">;
1795f757f3fSDimitry Andricdef HasAMXBF16   : Predicate<"Subtarget->hasAMXBF16()">;
1805f757f3fSDimitry Andricdef HasAMXINT8   : Predicate<"Subtarget->hasAMXINT8()">;
1815f757f3fSDimitry Andricdef HasAMXCOMPLEX : Predicate<"Subtarget->hasAMXCOMPLEX()">;
1825f757f3fSDimitry Andricdef HasUINTR     : Predicate<"Subtarget->hasUINTR()">;
1835f757f3fSDimitry Andricdef HasUSERMSR   : Predicate<"Subtarget->hasUSERMSR()">;
1845f757f3fSDimitry Andricdef HasCRC32     : Predicate<"Subtarget->hasCRC32()">;
1855f757f3fSDimitry Andric
1865f757f3fSDimitry Andricdef HasX86_64    : Predicate<"Subtarget->hasX86_64()">;
1875f757f3fSDimitry Andricdef Not64BitMode : Predicate<"!Subtarget->is64Bit()">,
1885f757f3fSDimitry Andric                             AssemblerPredicate<(all_of (not Is64Bit)), "Not 64-bit mode">;
1895f757f3fSDimitry Andricdef In64BitMode  : Predicate<"Subtarget->is64Bit()">,
1905f757f3fSDimitry Andric                             AssemblerPredicate<(all_of Is64Bit), "64-bit mode">;
1915f757f3fSDimitry Andricdef IsLP64  : Predicate<"Subtarget->isTarget64BitLP64()">;
1925f757f3fSDimitry Andricdef NotLP64 : Predicate<"!Subtarget->isTarget64BitLP64()">;
1935f757f3fSDimitry Andricdef In16BitMode  : Predicate<"Subtarget->is16Bit()">,
1945f757f3fSDimitry Andric                             AssemblerPredicate<(all_of Is16Bit), "16-bit mode">;
1955f757f3fSDimitry Andricdef Not16BitMode : Predicate<"!Subtarget->is16Bit()">,
1965f757f3fSDimitry Andric                             AssemblerPredicate<(all_of (not Is16Bit)), "Not 16-bit mode">;
1975f757f3fSDimitry Andricdef In32BitMode  : Predicate<"Subtarget->is32Bit()">,
1985f757f3fSDimitry Andric                             AssemblerPredicate<(all_of Is32Bit), "32-bit mode">;
1995f757f3fSDimitry Andricdef IsWin64      : Predicate<"Subtarget->isTargetWin64()">;
2005f757f3fSDimitry Andricdef NotWin64     : Predicate<"!Subtarget->isTargetWin64()">;
2015f757f3fSDimitry Andricdef NotWin64WithoutFP : Predicate<"!Subtarget->isTargetWin64() ||"
2025f757f3fSDimitry Andric                                  "Subtarget->getFrameLowering()->hasFP(*MF)"> {
2035f757f3fSDimitry Andric  let RecomputePerFunction = 1;
2045f757f3fSDimitry Andric}
2055f757f3fSDimitry Andricdef IsPS         : Predicate<"Subtarget->isTargetPS()">;
2065f757f3fSDimitry Andricdef NotPS        : Predicate<"!Subtarget->isTargetPS()">;
2075f757f3fSDimitry Andricdef IsNaCl       : Predicate<"Subtarget->isTargetNaCl()">;
2085f757f3fSDimitry Andricdef NotNaCl      : Predicate<"!Subtarget->isTargetNaCl()">;
2095f757f3fSDimitry Andricdef SmallCode    : Predicate<"TM.getCodeModel() == CodeModel::Small">;
2105f757f3fSDimitry Andricdef KernelCode   : Predicate<"TM.getCodeModel() == CodeModel::Kernel">;
2115f757f3fSDimitry Andricdef NearData     : Predicate<"TM.getCodeModel() == CodeModel::Small ||"
2125f757f3fSDimitry Andric                             "TM.getCodeModel() == CodeModel::Kernel">;
2135f757f3fSDimitry Andricdef IsNotPIC     : Predicate<"!TM.isPositionIndependent()">;
2145f757f3fSDimitry Andric
2155f757f3fSDimitry Andric// We could compute these on a per-module basis but doing so requires accessing
2165f757f3fSDimitry Andric// the Function object through the <Target>Subtarget and objections were raised
2175f757f3fSDimitry Andric// to that (see post-commit review comments for r301750).
2185f757f3fSDimitry Andriclet RecomputePerFunction = 1 in {
2195f757f3fSDimitry Andric  def OptForSize   : Predicate<"shouldOptForSize(MF)">;
2205f757f3fSDimitry Andric  def OptForMinSize : Predicate<"MF->getFunction().hasMinSize()">;
2215f757f3fSDimitry Andric  def OptForSpeed  : Predicate<"!shouldOptForSize(MF)">;
2225f757f3fSDimitry Andric  def UseIncDec : Predicate<"!Subtarget->slowIncDec() || "
2235f757f3fSDimitry Andric                            "shouldOptForSize(MF)">;
2245f757f3fSDimitry Andric  def NoSSE41_Or_OptForSize : Predicate<"shouldOptForSize(MF) || "
2255f757f3fSDimitry Andric                                        "!Subtarget->hasSSE41()">;
2265f757f3fSDimitry Andric}
2275f757f3fSDimitry Andric
2285f757f3fSDimitry Andricdef CallImmAddr  : Predicate<"Subtarget->isLegalToCallImmediateAddr()">;
2295f757f3fSDimitry Andricdef FavorMemIndirectCall  : Predicate<"!Subtarget->slowTwoMemOps()">;
2305f757f3fSDimitry Andricdef HasFastMem32 : Predicate<"!Subtarget->isUnalignedMem32Slow()">;
2315f757f3fSDimitry Andricdef HasFastLZCNT : Predicate<"Subtarget->hasFastLZCNT()">;
2325f757f3fSDimitry Andricdef HasFastSHLDRotate : Predicate<"Subtarget->hasFastSHLDRotate()">;
2335f757f3fSDimitry Andricdef HasERMSB : Predicate<"Subtarget->hasERMSB()">;
2345f757f3fSDimitry Andricdef HasFSRM : Predicate<"Subtarget->hasFSRM()">;
2355f757f3fSDimitry Andricdef HasMFence    : Predicate<"Subtarget->hasMFence()">;
236*0fca6ea1SDimitry Andricdef HasFastDPWSSD: Predicate<"Subtarget->hasFastDPWSSD()">;
2375f757f3fSDimitry Andricdef UseIndirectThunkCalls : Predicate<"Subtarget->useIndirectThunkCalls()">;
2385f757f3fSDimitry Andricdef NotUseIndirectThunkCalls : Predicate<"!Subtarget->useIndirectThunkCalls()">;
239