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