xref: /freebsd/contrib/llvm-project/llvm/lib/Target/X86/X86InstrPredicates.td (revision 647cbc5de815c5651677bf8582797f716ec7b48d)
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
115f757f3fSDimitry Andricdef HasEGPR      : Predicate<"Subtarget->hasEGPR()">;
125f757f3fSDimitry Andricdef NoEGPR       : Predicate<"!Subtarget->hasEGPR()">;
13*647cbc5dSDimitry Andricdef HasNDD       : Predicate<"Subtarget->hasNDD()">;
14*647cbc5dSDimitry Andricdef NoNDD        : Predicate<"!Subtarget->hasNDD()">;
155f757f3fSDimitry Andricdef HasCMOV      : Predicate<"Subtarget->canUseCMOV()">;
165f757f3fSDimitry Andricdef NoCMOV       : Predicate<"!Subtarget->canUseCMOV()">;
175f757f3fSDimitry Andricdef HasNOPL      : Predicate<"Subtarget->hasNOPL()">;
185f757f3fSDimitry Andricdef HasMMX       : Predicate<"Subtarget->hasMMX()">;
195f757f3fSDimitry Andricdef Has3DNow     : Predicate<"Subtarget->hasThreeDNow()">;
205f757f3fSDimitry Andricdef Has3DNowA    : Predicate<"Subtarget->hasThreeDNowA()">;
215f757f3fSDimitry Andricdef HasSSE1      : Predicate<"Subtarget->hasSSE1()">;
225f757f3fSDimitry Andricdef UseSSE1      : Predicate<"Subtarget->hasSSE1() && !Subtarget->hasAVX()">;
235f757f3fSDimitry Andricdef HasSSE2      : Predicate<"Subtarget->hasSSE2()">;
245f757f3fSDimitry Andricdef UseSSE2      : Predicate<"Subtarget->hasSSE2() && !Subtarget->hasAVX()">;
255f757f3fSDimitry Andricdef HasSSE3      : Predicate<"Subtarget->hasSSE3()">;
265f757f3fSDimitry Andricdef UseSSE3      : Predicate<"Subtarget->hasSSE3() && !Subtarget->hasAVX()">;
275f757f3fSDimitry Andricdef HasSSSE3     : Predicate<"Subtarget->hasSSSE3()">;
285f757f3fSDimitry Andricdef UseSSSE3     : Predicate<"Subtarget->hasSSSE3() && !Subtarget->hasAVX()">;
295f757f3fSDimitry Andricdef HasSSE41     : Predicate<"Subtarget->hasSSE41()">;
305f757f3fSDimitry Andricdef NoSSE41      : Predicate<"!Subtarget->hasSSE41()">;
315f757f3fSDimitry Andricdef UseSSE41     : Predicate<"Subtarget->hasSSE41() && !Subtarget->hasAVX()">;
325f757f3fSDimitry Andricdef HasSSE42     : Predicate<"Subtarget->hasSSE42()">;
335f757f3fSDimitry Andricdef UseSSE42     : Predicate<"Subtarget->hasSSE42() && !Subtarget->hasAVX()">;
345f757f3fSDimitry Andricdef HasSSE4A     : Predicate<"Subtarget->hasSSE4A()">;
355f757f3fSDimitry Andricdef NoAVX        : Predicate<"!Subtarget->hasAVX()">;
365f757f3fSDimitry Andricdef HasAVX       : Predicate<"Subtarget->hasAVX()">;
375f757f3fSDimitry Andricdef HasAVX2      : Predicate<"Subtarget->hasAVX2()">;
385f757f3fSDimitry Andricdef HasAVX1Only  : Predicate<"Subtarget->hasAVX() && !Subtarget->hasAVX2()">;
395f757f3fSDimitry Andricdef HasEVEX512   : Predicate<"Subtarget->hasEVEX512()">;
405f757f3fSDimitry Andricdef HasAVX10_1   : Predicate<"Subtarget->hasAVX10_1()">;
415f757f3fSDimitry Andricdef HasAVX10_1_512 : Predicate<"Subtarget->hasAVX10_1_512()">;
425f757f3fSDimitry Andricdef HasAVX512    : Predicate<"Subtarget->hasAVX512()">;
435f757f3fSDimitry Andricdef UseAVX       : Predicate<"Subtarget->hasAVX() && !Subtarget->hasAVX512()">;
445f757f3fSDimitry Andricdef UseAVX2      : Predicate<"Subtarget->hasAVX2() && !Subtarget->hasAVX512()">;
455f757f3fSDimitry Andricdef NoAVX512     : Predicate<"!Subtarget->hasAVX512()">;
465f757f3fSDimitry Andricdef HasCDI       : Predicate<"Subtarget->hasCDI()">;
475f757f3fSDimitry Andricdef HasVPOPCNTDQ : Predicate<"Subtarget->hasVPOPCNTDQ()">;
485f757f3fSDimitry Andricdef HasPFI       : Predicate<"Subtarget->hasPFI()">;
495f757f3fSDimitry Andricdef HasERI       : Predicate<"Subtarget->hasERI()">;
505f757f3fSDimitry Andricdef HasDQI       : Predicate<"Subtarget->hasDQI()">;
515f757f3fSDimitry Andricdef NoDQI        : Predicate<"!Subtarget->hasDQI()">;
525f757f3fSDimitry Andricdef HasBWI       : Predicate<"Subtarget->hasBWI()">;
535f757f3fSDimitry Andricdef NoBWI        : Predicate<"!Subtarget->hasBWI()">;
545f757f3fSDimitry Andricdef HasVLX       : Predicate<"Subtarget->hasVLX()">;
555f757f3fSDimitry Andricdef NoVLX        : Predicate<"!Subtarget->hasVLX()">;
565f757f3fSDimitry Andricdef NoVLX_Or_NoBWI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasBWI()">;
575f757f3fSDimitry Andricdef NoVLX_Or_NoDQI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasDQI()">;
585f757f3fSDimitry Andricdef HasPKU       : Predicate<"Subtarget->hasPKU()">;
595f757f3fSDimitry Andricdef HasVNNI      : Predicate<"Subtarget->hasVNNI()">;
605f757f3fSDimitry Andricdef HasVP2INTERSECT : Predicate<"Subtarget->hasVP2INTERSECT()">;
615f757f3fSDimitry Andricdef HasBF16      : Predicate<"Subtarget->hasBF16()">;
625f757f3fSDimitry Andricdef HasFP16      : Predicate<"Subtarget->hasFP16()">;
635f757f3fSDimitry Andricdef HasAVXVNNIINT16 : Predicate<"Subtarget->hasAVXVNNIINT16()">;
645f757f3fSDimitry Andricdef HasAVXVNNIINT8 : Predicate<"Subtarget->hasAVXVNNIINT8()">;
655f757f3fSDimitry Andricdef HasAVXVNNI : Predicate <"Subtarget->hasAVXVNNI()">;
665f757f3fSDimitry Andricdef NoVLX_Or_NoVNNI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVNNI()">;
675f757f3fSDimitry Andric
685f757f3fSDimitry Andricdef HasBITALG    : Predicate<"Subtarget->hasBITALG()">;
695f757f3fSDimitry Andricdef HasPOPCNT    : Predicate<"Subtarget->hasPOPCNT()">;
705f757f3fSDimitry Andricdef HasAES       : Predicate<"Subtarget->hasAES()">;
715f757f3fSDimitry Andricdef HasVAES      : Predicate<"Subtarget->hasVAES()">;
725f757f3fSDimitry Andricdef NoVLX_Or_NoVAES : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVAES()">;
735f757f3fSDimitry Andricdef HasFXSR      : Predicate<"Subtarget->hasFXSR()">;
745f757f3fSDimitry Andricdef HasX87       : Predicate<"Subtarget->hasX87()">;
755f757f3fSDimitry Andricdef HasXSAVE     : Predicate<"Subtarget->hasXSAVE()">;
765f757f3fSDimitry Andricdef HasXSAVEOPT  : Predicate<"Subtarget->hasXSAVEOPT()">;
775f757f3fSDimitry Andricdef HasXSAVEC    : Predicate<"Subtarget->hasXSAVEC()">;
785f757f3fSDimitry Andricdef HasXSAVES    : Predicate<"Subtarget->hasXSAVES()">;
795f757f3fSDimitry Andricdef HasPCLMUL    : Predicate<"Subtarget->hasPCLMUL()">;
805f757f3fSDimitry Andricdef NoVLX_Or_NoVPCLMULQDQ :
815f757f3fSDimitry Andric                    Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVPCLMULQDQ()">;
825f757f3fSDimitry Andricdef HasVPCLMULQDQ : Predicate<"Subtarget->hasVPCLMULQDQ()">;
835f757f3fSDimitry Andricdef HasGFNI      : Predicate<"Subtarget->hasGFNI()">;
845f757f3fSDimitry Andricdef HasFMA       : Predicate<"Subtarget->hasFMA()">;
855f757f3fSDimitry Andricdef HasFMA4      : Predicate<"Subtarget->hasFMA4()">;
865f757f3fSDimitry Andricdef NoFMA4       : Predicate<"!Subtarget->hasFMA4()">;
875f757f3fSDimitry Andricdef HasXOP       : Predicate<"Subtarget->hasXOP()">;
885f757f3fSDimitry Andricdef HasTBM       : Predicate<"Subtarget->hasTBM()">;
895f757f3fSDimitry Andricdef NoTBM        : Predicate<"!Subtarget->hasTBM()">;
905f757f3fSDimitry Andricdef HasLWP       : Predicate<"Subtarget->hasLWP()">;
915f757f3fSDimitry Andricdef HasMOVBE     : Predicate<"Subtarget->hasMOVBE()">;
925f757f3fSDimitry Andricdef HasRDRAND    : Predicate<"Subtarget->hasRDRAND()">;
935f757f3fSDimitry Andricdef HasF16C      : Predicate<"Subtarget->hasF16C()">;
945f757f3fSDimitry Andricdef HasFSGSBase  : Predicate<"Subtarget->hasFSGSBase()">;
955f757f3fSDimitry Andricdef HasLZCNT     : Predicate<"Subtarget->hasLZCNT()">;
965f757f3fSDimitry Andricdef HasBMI       : Predicate<"Subtarget->hasBMI()">;
975f757f3fSDimitry Andricdef HasBMI2      : Predicate<"Subtarget->hasBMI2()">;
985f757f3fSDimitry Andricdef NoBMI2       : Predicate<"!Subtarget->hasBMI2()">;
995f757f3fSDimitry Andricdef HasVBMI      : Predicate<"Subtarget->hasVBMI()">;
1005f757f3fSDimitry Andricdef HasVBMI2     : Predicate<"Subtarget->hasVBMI2()">;
1015f757f3fSDimitry Andricdef HasIFMA      : Predicate<"Subtarget->hasIFMA()">;
1025f757f3fSDimitry Andricdef HasAVXIFMA   : Predicate<"Subtarget->hasAVXIFMA()">;
1035f757f3fSDimitry Andricdef NoVLX_Or_NoIFMA : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasIFMA()">;
1045f757f3fSDimitry Andricdef HasRTM       : Predicate<"Subtarget->hasRTM()">;
1055f757f3fSDimitry Andricdef HasSHA       : Predicate<"Subtarget->hasSHA()">;
1065f757f3fSDimitry Andricdef HasSHA512    : Predicate<"Subtarget->hasSHA512()">;
1075f757f3fSDimitry Andricdef HasSGX       : Predicate<"Subtarget->hasSGX()">;
1085f757f3fSDimitry Andricdef HasSM3       : Predicate<"Subtarget->hasSM3()">;
1095f757f3fSDimitry Andricdef HasRDSEED    : Predicate<"Subtarget->hasRDSEED()">;
1105f757f3fSDimitry Andricdef HasSSEPrefetch : Predicate<"Subtarget->hasSSEPrefetch()">;
1115f757f3fSDimitry Andricdef NoSSEPrefetch : Predicate<"!Subtarget->hasSSEPrefetch()">;
1125f757f3fSDimitry Andricdef HasPRFCHW    : Predicate<"Subtarget->hasPRFCHW()">;
1135f757f3fSDimitry Andricdef HasPREFETCHI : Predicate<"Subtarget->hasPREFETCHI()">;
1145f757f3fSDimitry Andricdef HasPrefetchW : Predicate<"Subtarget->hasPrefetchW()">;
1155f757f3fSDimitry Andricdef HasPREFETCHWT1 : Predicate<"Subtarget->hasPREFETCHWT1()">;
1165f757f3fSDimitry Andricdef HasLAHFSAHF  : Predicate<"Subtarget->hasLAHFSAHF()">;
1175f757f3fSDimitry Andricdef HasLAHFSAHF64 : Predicate<"Subtarget->hasLAHFSAHF64()">;
1185f757f3fSDimitry Andricdef HasMWAITX    : Predicate<"Subtarget->hasMWAITX()">;
1195f757f3fSDimitry Andricdef HasCLZERO    : Predicate<"Subtarget->hasCLZERO()">;
1205f757f3fSDimitry Andricdef HasCLDEMOTE  : Predicate<"Subtarget->hasCLDEMOTE()">;
1215f757f3fSDimitry Andricdef HasMOVDIRI   : Predicate<"Subtarget->hasMOVDIRI()">;
1225f757f3fSDimitry Andricdef HasMOVDIR64B : Predicate<"Subtarget->hasMOVDIR64B()">;
1235f757f3fSDimitry Andricdef HasPTWRITE   : Predicate<"Subtarget->hasPTWRITE()">;
1245f757f3fSDimitry Andricdef FPStackf32   : Predicate<"!Subtarget->hasSSE1()">;
1255f757f3fSDimitry Andricdef FPStackf64   : Predicate<"!Subtarget->hasSSE2()">;
1265f757f3fSDimitry Andricdef HasSHSTK     : Predicate<"Subtarget->hasSHSTK()">;
1275f757f3fSDimitry Andricdef HasSM4       : Predicate<"Subtarget->hasSM4()">;
1285f757f3fSDimitry Andricdef HasCLFLUSH   : Predicate<"Subtarget->hasCLFLUSH()">;
1295f757f3fSDimitry Andricdef HasCLFLUSHOPT : Predicate<"Subtarget->hasCLFLUSHOPT()">;
1305f757f3fSDimitry Andricdef HasCLWB      : Predicate<"Subtarget->hasCLWB()">;
1315f757f3fSDimitry Andricdef HasWBNOINVD  : Predicate<"Subtarget->hasWBNOINVD()">;
1325f757f3fSDimitry Andricdef HasRDPID     : Predicate<"Subtarget->hasRDPID()">;
1335f757f3fSDimitry Andricdef HasRDPRU     : Predicate<"Subtarget->hasRDPRU()">;
1345f757f3fSDimitry Andricdef HasWAITPKG   : Predicate<"Subtarget->hasWAITPKG()">;
1355f757f3fSDimitry Andricdef HasINVPCID   : Predicate<"Subtarget->hasINVPCID()">;
1365f757f3fSDimitry Andricdef HasCX8       : Predicate<"Subtarget->hasCX8()">;
1375f757f3fSDimitry Andricdef HasCX16      : Predicate<"Subtarget->hasCX16()">;
1385f757f3fSDimitry Andricdef HasPCONFIG   : Predicate<"Subtarget->hasPCONFIG()">;
1395f757f3fSDimitry Andricdef HasENQCMD    : Predicate<"Subtarget->hasENQCMD()">;
1405f757f3fSDimitry Andricdef HasAMXFP16   : Predicate<"Subtarget->hasAMXFP16()">;
1415f757f3fSDimitry Andricdef HasCMPCCXADD : Predicate<"Subtarget->hasCMPCCXADD()">;
1425f757f3fSDimitry Andricdef HasAVXNECONVERT : Predicate<"Subtarget->hasAVXNECONVERT()">;
1435f757f3fSDimitry Andricdef HasKL        : Predicate<"Subtarget->hasKL()">;
1445f757f3fSDimitry Andricdef HasRAOINT    : Predicate<"Subtarget->hasRAOINT()">;
1455f757f3fSDimitry Andricdef HasWIDEKL    : Predicate<"Subtarget->hasWIDEKL()">;
1465f757f3fSDimitry Andricdef HasHRESET    : Predicate<"Subtarget->hasHRESET()">;
1475f757f3fSDimitry Andricdef HasSERIALIZE : Predicate<"Subtarget->hasSERIALIZE()">;
1485f757f3fSDimitry Andricdef HasTSXLDTRK  : Predicate<"Subtarget->hasTSXLDTRK()">;
1495f757f3fSDimitry Andricdef HasAMXTILE   : Predicate<"Subtarget->hasAMXTILE()">;
1505f757f3fSDimitry Andricdef HasAMXBF16   : Predicate<"Subtarget->hasAMXBF16()">;
1515f757f3fSDimitry Andricdef HasAMXINT8   : Predicate<"Subtarget->hasAMXINT8()">;
1525f757f3fSDimitry Andricdef HasAMXCOMPLEX : Predicate<"Subtarget->hasAMXCOMPLEX()">;
1535f757f3fSDimitry Andricdef HasUINTR     : Predicate<"Subtarget->hasUINTR()">;
1545f757f3fSDimitry Andricdef HasUSERMSR   : Predicate<"Subtarget->hasUSERMSR()">;
1555f757f3fSDimitry Andricdef HasCRC32     : Predicate<"Subtarget->hasCRC32()">;
1565f757f3fSDimitry Andric
1575f757f3fSDimitry Andricdef HasX86_64    : Predicate<"Subtarget->hasX86_64()">;
1585f757f3fSDimitry Andricdef Not64BitMode : Predicate<"!Subtarget->is64Bit()">,
1595f757f3fSDimitry Andric                             AssemblerPredicate<(all_of (not Is64Bit)), "Not 64-bit mode">;
1605f757f3fSDimitry Andricdef In64BitMode  : Predicate<"Subtarget->is64Bit()">,
1615f757f3fSDimitry Andric                             AssemblerPredicate<(all_of Is64Bit), "64-bit mode">;
1625f757f3fSDimitry Andricdef IsLP64  : Predicate<"Subtarget->isTarget64BitLP64()">;
1635f757f3fSDimitry Andricdef NotLP64 : Predicate<"!Subtarget->isTarget64BitLP64()">;
1645f757f3fSDimitry Andricdef In16BitMode  : Predicate<"Subtarget->is16Bit()">,
1655f757f3fSDimitry Andric                             AssemblerPredicate<(all_of Is16Bit), "16-bit mode">;
1665f757f3fSDimitry Andricdef Not16BitMode : Predicate<"!Subtarget->is16Bit()">,
1675f757f3fSDimitry Andric                             AssemblerPredicate<(all_of (not Is16Bit)), "Not 16-bit mode">;
1685f757f3fSDimitry Andricdef In32BitMode  : Predicate<"Subtarget->is32Bit()">,
1695f757f3fSDimitry Andric                             AssemblerPredicate<(all_of Is32Bit), "32-bit mode">;
1705f757f3fSDimitry Andricdef IsWin64      : Predicate<"Subtarget->isTargetWin64()">;
1715f757f3fSDimitry Andricdef NotWin64     : Predicate<"!Subtarget->isTargetWin64()">;
1725f757f3fSDimitry Andricdef NotWin64WithoutFP : Predicate<"!Subtarget->isTargetWin64() ||"
1735f757f3fSDimitry Andric                                  "Subtarget->getFrameLowering()->hasFP(*MF)"> {
1745f757f3fSDimitry Andric  let RecomputePerFunction = 1;
1755f757f3fSDimitry Andric}
1765f757f3fSDimitry Andricdef IsPS         : Predicate<"Subtarget->isTargetPS()">;
1775f757f3fSDimitry Andricdef NotPS        : Predicate<"!Subtarget->isTargetPS()">;
1785f757f3fSDimitry Andricdef IsNaCl       : Predicate<"Subtarget->isTargetNaCl()">;
1795f757f3fSDimitry Andricdef NotNaCl      : Predicate<"!Subtarget->isTargetNaCl()">;
1805f757f3fSDimitry Andricdef SmallCode    : Predicate<"TM.getCodeModel() == CodeModel::Small">;
1815f757f3fSDimitry Andricdef KernelCode   : Predicate<"TM.getCodeModel() == CodeModel::Kernel">;
1825f757f3fSDimitry Andricdef NearData     : Predicate<"TM.getCodeModel() == CodeModel::Small ||"
1835f757f3fSDimitry Andric                             "TM.getCodeModel() == CodeModel::Kernel">;
1845f757f3fSDimitry Andricdef IsNotPIC     : Predicate<"!TM.isPositionIndependent()">;
1855f757f3fSDimitry Andric
1865f757f3fSDimitry Andric// We could compute these on a per-module basis but doing so requires accessing
1875f757f3fSDimitry Andric// the Function object through the <Target>Subtarget and objections were raised
1885f757f3fSDimitry Andric// to that (see post-commit review comments for r301750).
1895f757f3fSDimitry Andriclet RecomputePerFunction = 1 in {
1905f757f3fSDimitry Andric  def OptForSize   : Predicate<"shouldOptForSize(MF)">;
1915f757f3fSDimitry Andric  def OptForMinSize : Predicate<"MF->getFunction().hasMinSize()">;
1925f757f3fSDimitry Andric  def OptForSpeed  : Predicate<"!shouldOptForSize(MF)">;
1935f757f3fSDimitry Andric  def UseIncDec : Predicate<"!Subtarget->slowIncDec() || "
1945f757f3fSDimitry Andric                            "shouldOptForSize(MF)">;
1955f757f3fSDimitry Andric  def NoSSE41_Or_OptForSize : Predicate<"shouldOptForSize(MF) || "
1965f757f3fSDimitry Andric                                        "!Subtarget->hasSSE41()">;
1975f757f3fSDimitry Andric}
1985f757f3fSDimitry Andric
1995f757f3fSDimitry Andricdef CallImmAddr  : Predicate<"Subtarget->isLegalToCallImmediateAddr()">;
2005f757f3fSDimitry Andricdef FavorMemIndirectCall  : Predicate<"!Subtarget->slowTwoMemOps()">;
2015f757f3fSDimitry Andricdef HasFastMem32 : Predicate<"!Subtarget->isUnalignedMem32Slow()">;
2025f757f3fSDimitry Andricdef HasFastLZCNT : Predicate<"Subtarget->hasFastLZCNT()">;
2035f757f3fSDimitry Andricdef HasFastSHLDRotate : Predicate<"Subtarget->hasFastSHLDRotate()">;
2045f757f3fSDimitry Andricdef HasERMSB : Predicate<"Subtarget->hasERMSB()">;
2055f757f3fSDimitry Andricdef HasFSRM : Predicate<"Subtarget->hasFSRM()">;
2065f757f3fSDimitry Andricdef HasMFence    : Predicate<"Subtarget->hasMFence()">;
2075f757f3fSDimitry Andricdef UseIndirectThunkCalls : Predicate<"Subtarget->useIndirectThunkCalls()">;
2085f757f3fSDimitry Andricdef NotUseIndirectThunkCalls : Predicate<"!Subtarget->useIndirectThunkCalls()">;
209