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