1*5f757f3fSDimitry Andric//===---X86InstrPredicates.td - X86 Predicate Definitions --*- tablegen -*-===// 2*5f757f3fSDimitry Andric// 3*5f757f3fSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*5f757f3fSDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*5f757f3fSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*5f757f3fSDimitry Andric// 7*5f757f3fSDimitry Andric//===----------------------------------------------------------------------===// 8*5f757f3fSDimitry Andric 9*5f757f3fSDimitry Andricdef TruePredicate : Predicate<"true">; 10*5f757f3fSDimitry Andric 11*5f757f3fSDimitry Andricdef HasEGPR : Predicate<"Subtarget->hasEGPR()">; 12*5f757f3fSDimitry Andricdef NoEGPR : Predicate<"!Subtarget->hasEGPR()">; 13*5f757f3fSDimitry Andricdef HasCMOV : Predicate<"Subtarget->canUseCMOV()">; 14*5f757f3fSDimitry Andricdef NoCMOV : Predicate<"!Subtarget->canUseCMOV()">; 15*5f757f3fSDimitry Andricdef HasNOPL : Predicate<"Subtarget->hasNOPL()">; 16*5f757f3fSDimitry Andricdef HasMMX : Predicate<"Subtarget->hasMMX()">; 17*5f757f3fSDimitry Andricdef Has3DNow : Predicate<"Subtarget->hasThreeDNow()">; 18*5f757f3fSDimitry Andricdef Has3DNowA : Predicate<"Subtarget->hasThreeDNowA()">; 19*5f757f3fSDimitry Andricdef HasSSE1 : Predicate<"Subtarget->hasSSE1()">; 20*5f757f3fSDimitry Andricdef UseSSE1 : Predicate<"Subtarget->hasSSE1() && !Subtarget->hasAVX()">; 21*5f757f3fSDimitry Andricdef HasSSE2 : Predicate<"Subtarget->hasSSE2()">; 22*5f757f3fSDimitry Andricdef UseSSE2 : Predicate<"Subtarget->hasSSE2() && !Subtarget->hasAVX()">; 23*5f757f3fSDimitry Andricdef HasSSE3 : Predicate<"Subtarget->hasSSE3()">; 24*5f757f3fSDimitry Andricdef UseSSE3 : Predicate<"Subtarget->hasSSE3() && !Subtarget->hasAVX()">; 25*5f757f3fSDimitry Andricdef HasSSSE3 : Predicate<"Subtarget->hasSSSE3()">; 26*5f757f3fSDimitry Andricdef UseSSSE3 : Predicate<"Subtarget->hasSSSE3() && !Subtarget->hasAVX()">; 27*5f757f3fSDimitry Andricdef HasSSE41 : Predicate<"Subtarget->hasSSE41()">; 28*5f757f3fSDimitry Andricdef NoSSE41 : Predicate<"!Subtarget->hasSSE41()">; 29*5f757f3fSDimitry Andricdef UseSSE41 : Predicate<"Subtarget->hasSSE41() && !Subtarget->hasAVX()">; 30*5f757f3fSDimitry Andricdef HasSSE42 : Predicate<"Subtarget->hasSSE42()">; 31*5f757f3fSDimitry Andricdef UseSSE42 : Predicate<"Subtarget->hasSSE42() && !Subtarget->hasAVX()">; 32*5f757f3fSDimitry Andricdef HasSSE4A : Predicate<"Subtarget->hasSSE4A()">; 33*5f757f3fSDimitry Andricdef NoAVX : Predicate<"!Subtarget->hasAVX()">; 34*5f757f3fSDimitry Andricdef HasAVX : Predicate<"Subtarget->hasAVX()">; 35*5f757f3fSDimitry Andricdef HasAVX2 : Predicate<"Subtarget->hasAVX2()">; 36*5f757f3fSDimitry Andricdef HasAVX1Only : Predicate<"Subtarget->hasAVX() && !Subtarget->hasAVX2()">; 37*5f757f3fSDimitry Andricdef HasEVEX512 : Predicate<"Subtarget->hasEVEX512()">; 38*5f757f3fSDimitry Andricdef HasAVX10_1 : Predicate<"Subtarget->hasAVX10_1()">; 39*5f757f3fSDimitry Andricdef HasAVX10_1_512 : Predicate<"Subtarget->hasAVX10_1_512()">; 40*5f757f3fSDimitry Andricdef HasAVX512 : Predicate<"Subtarget->hasAVX512()">; 41*5f757f3fSDimitry Andricdef UseAVX : Predicate<"Subtarget->hasAVX() && !Subtarget->hasAVX512()">; 42*5f757f3fSDimitry Andricdef UseAVX2 : Predicate<"Subtarget->hasAVX2() && !Subtarget->hasAVX512()">; 43*5f757f3fSDimitry Andricdef NoAVX512 : Predicate<"!Subtarget->hasAVX512()">; 44*5f757f3fSDimitry Andricdef HasCDI : Predicate<"Subtarget->hasCDI()">; 45*5f757f3fSDimitry Andricdef HasVPOPCNTDQ : Predicate<"Subtarget->hasVPOPCNTDQ()">; 46*5f757f3fSDimitry Andricdef HasPFI : Predicate<"Subtarget->hasPFI()">; 47*5f757f3fSDimitry Andricdef HasERI : Predicate<"Subtarget->hasERI()">; 48*5f757f3fSDimitry Andricdef HasDQI : Predicate<"Subtarget->hasDQI()">; 49*5f757f3fSDimitry Andricdef NoDQI : Predicate<"!Subtarget->hasDQI()">; 50*5f757f3fSDimitry Andricdef HasBWI : Predicate<"Subtarget->hasBWI()">; 51*5f757f3fSDimitry Andricdef NoBWI : Predicate<"!Subtarget->hasBWI()">; 52*5f757f3fSDimitry Andricdef HasVLX : Predicate<"Subtarget->hasVLX()">; 53*5f757f3fSDimitry Andricdef NoVLX : Predicate<"!Subtarget->hasVLX()">; 54*5f757f3fSDimitry Andricdef NoVLX_Or_NoBWI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasBWI()">; 55*5f757f3fSDimitry Andricdef NoVLX_Or_NoDQI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasDQI()">; 56*5f757f3fSDimitry Andricdef HasPKU : Predicate<"Subtarget->hasPKU()">; 57*5f757f3fSDimitry Andricdef HasVNNI : Predicate<"Subtarget->hasVNNI()">; 58*5f757f3fSDimitry Andricdef HasVP2INTERSECT : Predicate<"Subtarget->hasVP2INTERSECT()">; 59*5f757f3fSDimitry Andricdef HasBF16 : Predicate<"Subtarget->hasBF16()">; 60*5f757f3fSDimitry Andricdef HasFP16 : Predicate<"Subtarget->hasFP16()">; 61*5f757f3fSDimitry Andricdef HasAVXVNNIINT16 : Predicate<"Subtarget->hasAVXVNNIINT16()">; 62*5f757f3fSDimitry Andricdef HasAVXVNNIINT8 : Predicate<"Subtarget->hasAVXVNNIINT8()">; 63*5f757f3fSDimitry Andricdef HasAVXVNNI : Predicate <"Subtarget->hasAVXVNNI()">; 64*5f757f3fSDimitry Andricdef NoVLX_Or_NoVNNI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVNNI()">; 65*5f757f3fSDimitry Andric 66*5f757f3fSDimitry Andricdef HasBITALG : Predicate<"Subtarget->hasBITALG()">; 67*5f757f3fSDimitry Andricdef HasPOPCNT : Predicate<"Subtarget->hasPOPCNT()">; 68*5f757f3fSDimitry Andricdef HasAES : Predicate<"Subtarget->hasAES()">; 69*5f757f3fSDimitry Andricdef HasVAES : Predicate<"Subtarget->hasVAES()">; 70*5f757f3fSDimitry Andricdef NoVLX_Or_NoVAES : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVAES()">; 71*5f757f3fSDimitry Andricdef HasFXSR : Predicate<"Subtarget->hasFXSR()">; 72*5f757f3fSDimitry Andricdef HasX87 : Predicate<"Subtarget->hasX87()">; 73*5f757f3fSDimitry Andricdef HasXSAVE : Predicate<"Subtarget->hasXSAVE()">; 74*5f757f3fSDimitry Andricdef HasXSAVEOPT : Predicate<"Subtarget->hasXSAVEOPT()">; 75*5f757f3fSDimitry Andricdef HasXSAVEC : Predicate<"Subtarget->hasXSAVEC()">; 76*5f757f3fSDimitry Andricdef HasXSAVES : Predicate<"Subtarget->hasXSAVES()">; 77*5f757f3fSDimitry Andricdef HasPCLMUL : Predicate<"Subtarget->hasPCLMUL()">; 78*5f757f3fSDimitry Andricdef NoVLX_Or_NoVPCLMULQDQ : 79*5f757f3fSDimitry Andric Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVPCLMULQDQ()">; 80*5f757f3fSDimitry Andricdef HasVPCLMULQDQ : Predicate<"Subtarget->hasVPCLMULQDQ()">; 81*5f757f3fSDimitry Andricdef HasGFNI : Predicate<"Subtarget->hasGFNI()">; 82*5f757f3fSDimitry Andricdef HasFMA : Predicate<"Subtarget->hasFMA()">; 83*5f757f3fSDimitry Andricdef HasFMA4 : Predicate<"Subtarget->hasFMA4()">; 84*5f757f3fSDimitry Andricdef NoFMA4 : Predicate<"!Subtarget->hasFMA4()">; 85*5f757f3fSDimitry Andricdef HasXOP : Predicate<"Subtarget->hasXOP()">; 86*5f757f3fSDimitry Andricdef HasTBM : Predicate<"Subtarget->hasTBM()">; 87*5f757f3fSDimitry Andricdef NoTBM : Predicate<"!Subtarget->hasTBM()">; 88*5f757f3fSDimitry Andricdef HasLWP : Predicate<"Subtarget->hasLWP()">; 89*5f757f3fSDimitry Andricdef HasMOVBE : Predicate<"Subtarget->hasMOVBE()">; 90*5f757f3fSDimitry Andricdef HasRDRAND : Predicate<"Subtarget->hasRDRAND()">; 91*5f757f3fSDimitry Andricdef HasF16C : Predicate<"Subtarget->hasF16C()">; 92*5f757f3fSDimitry Andricdef HasFSGSBase : Predicate<"Subtarget->hasFSGSBase()">; 93*5f757f3fSDimitry Andricdef HasLZCNT : Predicate<"Subtarget->hasLZCNT()">; 94*5f757f3fSDimitry Andricdef HasBMI : Predicate<"Subtarget->hasBMI()">; 95*5f757f3fSDimitry Andricdef HasBMI2 : Predicate<"Subtarget->hasBMI2()">; 96*5f757f3fSDimitry Andricdef NoBMI2 : Predicate<"!Subtarget->hasBMI2()">; 97*5f757f3fSDimitry Andricdef HasVBMI : Predicate<"Subtarget->hasVBMI()">; 98*5f757f3fSDimitry Andricdef HasVBMI2 : Predicate<"Subtarget->hasVBMI2()">; 99*5f757f3fSDimitry Andricdef HasIFMA : Predicate<"Subtarget->hasIFMA()">; 100*5f757f3fSDimitry Andricdef HasAVXIFMA : Predicate<"Subtarget->hasAVXIFMA()">; 101*5f757f3fSDimitry Andricdef NoVLX_Or_NoIFMA : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasIFMA()">; 102*5f757f3fSDimitry Andricdef HasRTM : Predicate<"Subtarget->hasRTM()">; 103*5f757f3fSDimitry Andricdef HasADX : Predicate<"Subtarget->hasADX()">; 104*5f757f3fSDimitry Andricdef HasSHA : Predicate<"Subtarget->hasSHA()">; 105*5f757f3fSDimitry Andricdef HasSHA512 : Predicate<"Subtarget->hasSHA512()">; 106*5f757f3fSDimitry Andricdef HasSGX : Predicate<"Subtarget->hasSGX()">; 107*5f757f3fSDimitry Andricdef HasSM3 : Predicate<"Subtarget->hasSM3()">; 108*5f757f3fSDimitry Andricdef HasRDSEED : Predicate<"Subtarget->hasRDSEED()">; 109*5f757f3fSDimitry Andricdef HasSSEPrefetch : Predicate<"Subtarget->hasSSEPrefetch()">; 110*5f757f3fSDimitry Andricdef NoSSEPrefetch : Predicate<"!Subtarget->hasSSEPrefetch()">; 111*5f757f3fSDimitry Andricdef HasPRFCHW : Predicate<"Subtarget->hasPRFCHW()">; 112*5f757f3fSDimitry Andricdef HasPREFETCHI : Predicate<"Subtarget->hasPREFETCHI()">; 113*5f757f3fSDimitry Andricdef HasPrefetchW : Predicate<"Subtarget->hasPrefetchW()">; 114*5f757f3fSDimitry Andricdef HasPREFETCHWT1 : Predicate<"Subtarget->hasPREFETCHWT1()">; 115*5f757f3fSDimitry Andricdef HasLAHFSAHF : Predicate<"Subtarget->hasLAHFSAHF()">; 116*5f757f3fSDimitry Andricdef HasLAHFSAHF64 : Predicate<"Subtarget->hasLAHFSAHF64()">; 117*5f757f3fSDimitry Andricdef HasMWAITX : Predicate<"Subtarget->hasMWAITX()">; 118*5f757f3fSDimitry Andricdef HasCLZERO : Predicate<"Subtarget->hasCLZERO()">; 119*5f757f3fSDimitry Andricdef HasCLDEMOTE : Predicate<"Subtarget->hasCLDEMOTE()">; 120*5f757f3fSDimitry Andricdef HasMOVDIRI : Predicate<"Subtarget->hasMOVDIRI()">; 121*5f757f3fSDimitry Andricdef HasMOVDIR64B : Predicate<"Subtarget->hasMOVDIR64B()">; 122*5f757f3fSDimitry Andricdef HasPTWRITE : Predicate<"Subtarget->hasPTWRITE()">; 123*5f757f3fSDimitry Andricdef FPStackf32 : Predicate<"!Subtarget->hasSSE1()">; 124*5f757f3fSDimitry Andricdef FPStackf64 : Predicate<"!Subtarget->hasSSE2()">; 125*5f757f3fSDimitry Andricdef HasSHSTK : Predicate<"Subtarget->hasSHSTK()">; 126*5f757f3fSDimitry Andricdef HasSM4 : Predicate<"Subtarget->hasSM4()">; 127*5f757f3fSDimitry Andricdef HasCLFLUSH : Predicate<"Subtarget->hasCLFLUSH()">; 128*5f757f3fSDimitry Andricdef HasCLFLUSHOPT : Predicate<"Subtarget->hasCLFLUSHOPT()">; 129*5f757f3fSDimitry Andricdef HasCLWB : Predicate<"Subtarget->hasCLWB()">; 130*5f757f3fSDimitry Andricdef HasWBNOINVD : Predicate<"Subtarget->hasWBNOINVD()">; 131*5f757f3fSDimitry Andricdef HasRDPID : Predicate<"Subtarget->hasRDPID()">; 132*5f757f3fSDimitry Andricdef HasRDPRU : Predicate<"Subtarget->hasRDPRU()">; 133*5f757f3fSDimitry Andricdef HasWAITPKG : Predicate<"Subtarget->hasWAITPKG()">; 134*5f757f3fSDimitry Andricdef HasINVPCID : Predicate<"Subtarget->hasINVPCID()">; 135*5f757f3fSDimitry Andricdef HasCX8 : Predicate<"Subtarget->hasCX8()">; 136*5f757f3fSDimitry Andricdef HasCX16 : Predicate<"Subtarget->hasCX16()">; 137*5f757f3fSDimitry Andricdef HasPCONFIG : Predicate<"Subtarget->hasPCONFIG()">; 138*5f757f3fSDimitry Andricdef HasENQCMD : Predicate<"Subtarget->hasENQCMD()">; 139*5f757f3fSDimitry Andricdef HasAMXFP16 : Predicate<"Subtarget->hasAMXFP16()">; 140*5f757f3fSDimitry Andricdef HasCMPCCXADD : Predicate<"Subtarget->hasCMPCCXADD()">; 141*5f757f3fSDimitry Andricdef HasAVXNECONVERT : Predicate<"Subtarget->hasAVXNECONVERT()">; 142*5f757f3fSDimitry Andricdef HasKL : Predicate<"Subtarget->hasKL()">; 143*5f757f3fSDimitry Andricdef HasRAOINT : Predicate<"Subtarget->hasRAOINT()">; 144*5f757f3fSDimitry Andricdef HasWIDEKL : Predicate<"Subtarget->hasWIDEKL()">; 145*5f757f3fSDimitry Andricdef HasHRESET : Predicate<"Subtarget->hasHRESET()">; 146*5f757f3fSDimitry Andricdef HasSERIALIZE : Predicate<"Subtarget->hasSERIALIZE()">; 147*5f757f3fSDimitry Andricdef HasTSXLDTRK : Predicate<"Subtarget->hasTSXLDTRK()">; 148*5f757f3fSDimitry Andricdef HasAMXTILE : Predicate<"Subtarget->hasAMXTILE()">; 149*5f757f3fSDimitry Andricdef HasAMXBF16 : Predicate<"Subtarget->hasAMXBF16()">; 150*5f757f3fSDimitry Andricdef HasAMXINT8 : Predicate<"Subtarget->hasAMXINT8()">; 151*5f757f3fSDimitry Andricdef HasAMXCOMPLEX : Predicate<"Subtarget->hasAMXCOMPLEX()">; 152*5f757f3fSDimitry Andricdef HasUINTR : Predicate<"Subtarget->hasUINTR()">; 153*5f757f3fSDimitry Andricdef HasUSERMSR : Predicate<"Subtarget->hasUSERMSR()">; 154*5f757f3fSDimitry Andricdef HasCRC32 : Predicate<"Subtarget->hasCRC32()">; 155*5f757f3fSDimitry Andric 156*5f757f3fSDimitry Andricdef HasX86_64 : Predicate<"Subtarget->hasX86_64()">; 157*5f757f3fSDimitry Andricdef Not64BitMode : Predicate<"!Subtarget->is64Bit()">, 158*5f757f3fSDimitry Andric AssemblerPredicate<(all_of (not Is64Bit)), "Not 64-bit mode">; 159*5f757f3fSDimitry Andricdef In64BitMode : Predicate<"Subtarget->is64Bit()">, 160*5f757f3fSDimitry Andric AssemblerPredicate<(all_of Is64Bit), "64-bit mode">; 161*5f757f3fSDimitry Andricdef IsLP64 : Predicate<"Subtarget->isTarget64BitLP64()">; 162*5f757f3fSDimitry Andricdef NotLP64 : Predicate<"!Subtarget->isTarget64BitLP64()">; 163*5f757f3fSDimitry Andricdef In16BitMode : Predicate<"Subtarget->is16Bit()">, 164*5f757f3fSDimitry Andric AssemblerPredicate<(all_of Is16Bit), "16-bit mode">; 165*5f757f3fSDimitry Andricdef Not16BitMode : Predicate<"!Subtarget->is16Bit()">, 166*5f757f3fSDimitry Andric AssemblerPredicate<(all_of (not Is16Bit)), "Not 16-bit mode">; 167*5f757f3fSDimitry Andricdef In32BitMode : Predicate<"Subtarget->is32Bit()">, 168*5f757f3fSDimitry Andric AssemblerPredicate<(all_of Is32Bit), "32-bit mode">; 169*5f757f3fSDimitry Andricdef IsWin64 : Predicate<"Subtarget->isTargetWin64()">; 170*5f757f3fSDimitry Andricdef NotWin64 : Predicate<"!Subtarget->isTargetWin64()">; 171*5f757f3fSDimitry Andricdef NotWin64WithoutFP : Predicate<"!Subtarget->isTargetWin64() ||" 172*5f757f3fSDimitry Andric "Subtarget->getFrameLowering()->hasFP(*MF)"> { 173*5f757f3fSDimitry Andric let RecomputePerFunction = 1; 174*5f757f3fSDimitry Andric} 175*5f757f3fSDimitry Andricdef IsPS : Predicate<"Subtarget->isTargetPS()">; 176*5f757f3fSDimitry Andricdef NotPS : Predicate<"!Subtarget->isTargetPS()">; 177*5f757f3fSDimitry Andricdef IsNaCl : Predicate<"Subtarget->isTargetNaCl()">; 178*5f757f3fSDimitry Andricdef NotNaCl : Predicate<"!Subtarget->isTargetNaCl()">; 179*5f757f3fSDimitry Andricdef SmallCode : Predicate<"TM.getCodeModel() == CodeModel::Small">; 180*5f757f3fSDimitry Andricdef KernelCode : Predicate<"TM.getCodeModel() == CodeModel::Kernel">; 181*5f757f3fSDimitry Andricdef NearData : Predicate<"TM.getCodeModel() == CodeModel::Small ||" 182*5f757f3fSDimitry Andric "TM.getCodeModel() == CodeModel::Kernel">; 183*5f757f3fSDimitry Andricdef IsNotPIC : Predicate<"!TM.isPositionIndependent()">; 184*5f757f3fSDimitry Andric 185*5f757f3fSDimitry Andric// We could compute these on a per-module basis but doing so requires accessing 186*5f757f3fSDimitry Andric// the Function object through the <Target>Subtarget and objections were raised 187*5f757f3fSDimitry Andric// to that (see post-commit review comments for r301750). 188*5f757f3fSDimitry Andriclet RecomputePerFunction = 1 in { 189*5f757f3fSDimitry Andric def OptForSize : Predicate<"shouldOptForSize(MF)">; 190*5f757f3fSDimitry Andric def OptForMinSize : Predicate<"MF->getFunction().hasMinSize()">; 191*5f757f3fSDimitry Andric def OptForSpeed : Predicate<"!shouldOptForSize(MF)">; 192*5f757f3fSDimitry Andric def UseIncDec : Predicate<"!Subtarget->slowIncDec() || " 193*5f757f3fSDimitry Andric "shouldOptForSize(MF)">; 194*5f757f3fSDimitry Andric def NoSSE41_Or_OptForSize : Predicate<"shouldOptForSize(MF) || " 195*5f757f3fSDimitry Andric "!Subtarget->hasSSE41()">; 196*5f757f3fSDimitry Andric} 197*5f757f3fSDimitry Andric 198*5f757f3fSDimitry Andricdef CallImmAddr : Predicate<"Subtarget->isLegalToCallImmediateAddr()">; 199*5f757f3fSDimitry Andricdef FavorMemIndirectCall : Predicate<"!Subtarget->slowTwoMemOps()">; 200*5f757f3fSDimitry Andricdef HasFastMem32 : Predicate<"!Subtarget->isUnalignedMem32Slow()">; 201*5f757f3fSDimitry Andricdef HasFastLZCNT : Predicate<"Subtarget->hasFastLZCNT()">; 202*5f757f3fSDimitry Andricdef HasFastSHLDRotate : Predicate<"Subtarget->hasFastSHLDRotate()">; 203*5f757f3fSDimitry Andricdef HasERMSB : Predicate<"Subtarget->hasERMSB()">; 204*5f757f3fSDimitry Andricdef HasFSRM : Predicate<"Subtarget->hasFSRM()">; 205*5f757f3fSDimitry Andricdef HasMFence : Predicate<"Subtarget->hasMFence()">; 206*5f757f3fSDimitry Andricdef UseIndirectThunkCalls : Predicate<"Subtarget->useIndirectThunkCalls()">; 207*5f757f3fSDimitry Andricdef NotUseIndirectThunkCalls : Predicate<"!Subtarget->useIndirectThunkCalls()">; 208