1//===---X86InstrPredicates.td - X86 Predicate Definitions --*- tablegen -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9def TruePredicate : Predicate<"true">; 10 11// Intel x86 instructions have three separate encoding spaces: legacy, VEX, and 12// EVEX. Not all X86 instructions are extended for EGPR. The following is an 13// overview of which instructions are extended and how we implement them. 14// 15// * Legacy space 16// All instructions in legacy maps 0 and 1 that have explicit GPR or memory 17// operands can use the REX2 prefix to access the EGPR, except XSAVE*/XRSTOR. 18// 19// * EVEX space 20// All instructions in the EVEX space can access the EGPR in their 21// register/memory operands. 22// 23// For the above intructions, the only difference in encoding is reflected in 24// the REX2/EVEX prefix when EGPR is used, i.e. the opcode and opcode name are 25// unchanged. We don’t add new entries in TD, and instead we extend GPR with 26// R16-R31 and make them allocatable only when the feature EGPR is available. 27// 28// Besides, some instructions in legacy space with map 2/3 and VEX space are 29// promoted into EVEX space. Encoding space changes after the promotion, opcode 30// and opcode map may change too sometimes. For these instructions, we add new 31// entries in TD to avoid overcomplicating the assembler and disassembler. 32// 33// HasEGPR is for the new entries and NoEGPR is for the entries before 34// promotion, so that the promoted variant can be selected first to benefit RA. 35def HasEGPR : Predicate<"Subtarget->hasEGPR()">; 36def NoEGPR : Predicate<"!Subtarget->hasEGPR()">; 37 38// APX extends some instructions with a new form that has an extra register 39// operand called a new data destination (NDD). In such forms, NDD is the new 40// destination register receiving the result of the computation and all other 41// operands (including the original destination operand) become read-only source 42// operands. 43// 44// HasNDD is for the new NDD entries and NoNDD is for the legacy 2-address 45// entries, so that the NDD variant can be selected first to benefit RA. 46def HasNDD : Predicate<"Subtarget->hasNDD()">; 47def NoNDD : Predicate<"!Subtarget->hasNDD()">; 48def HasZU : Predicate<"Subtarget->hasZU()">; 49def HasCF : Predicate<"Subtarget->hasCF()">; 50def HasCMOV : Predicate<"Subtarget->canUseCMOV()">; 51def NoCMOV : Predicate<"!Subtarget->canUseCMOV()">; 52def HasNOPL : Predicate<"Subtarget->hasNOPL()">; 53def HasMMX : Predicate<"Subtarget->hasMMX()">; 54def HasSSE1 : Predicate<"Subtarget->hasSSE1()">; 55def UseSSE1 : Predicate<"Subtarget->hasSSE1() && !Subtarget->hasAVX()">; 56def HasSSE2 : Predicate<"Subtarget->hasSSE2()">; 57def UseSSE2 : Predicate<"Subtarget->hasSSE2() && !Subtarget->hasAVX()">; 58def HasSSE3 : Predicate<"Subtarget->hasSSE3()">; 59def UseSSE3 : Predicate<"Subtarget->hasSSE3() && !Subtarget->hasAVX()">; 60def HasSSSE3 : Predicate<"Subtarget->hasSSSE3()">; 61def UseSSSE3 : Predicate<"Subtarget->hasSSSE3() && !Subtarget->hasAVX()">; 62def HasSSE41 : Predicate<"Subtarget->hasSSE41()">; 63def NoSSE41 : Predicate<"!Subtarget->hasSSE41()">; 64def UseSSE41 : Predicate<"Subtarget->hasSSE41() && !Subtarget->hasAVX()">; 65def HasSSE42 : Predicate<"Subtarget->hasSSE42()">; 66def UseSSE42 : Predicate<"Subtarget->hasSSE42() && !Subtarget->hasAVX()">; 67def HasSSE4A : Predicate<"Subtarget->hasSSE4A()">; 68def NoAVX : Predicate<"!Subtarget->hasAVX()">; 69def HasAVX : Predicate<"Subtarget->hasAVX()">; 70def HasAVX2 : Predicate<"Subtarget->hasAVX2()">; 71def HasAVX1Only : Predicate<"Subtarget->hasAVX() && !Subtarget->hasAVX2()">; 72def HasEVEX512 : Predicate<"Subtarget->hasEVEX512()">; 73def HasAVX10_1 : Predicate<"Subtarget->hasAVX10_1()">; 74def HasAVX10_1_512 : Predicate<"Subtarget->hasAVX10_1_512()">; 75def HasAVX10_2 : Predicate<"Subtarget->hasAVX10_2()">; 76def HasAVX10_2_512 : Predicate<"Subtarget->hasAVX10_2_512()">; 77def NoAVX10_2 : Predicate<"!Subtarget->hasAVX10_2()">; 78def HasAVX512 : Predicate<"Subtarget->hasAVX512()">; 79def UseAVX : Predicate<"Subtarget->hasAVX() && !Subtarget->hasAVX512()">; 80def UseAVX2 : Predicate<"Subtarget->hasAVX2() && !Subtarget->hasAVX512()">; 81def NoAVX512 : Predicate<"!Subtarget->hasAVX512()">; 82def HasCDI : Predicate<"Subtarget->hasCDI()">; 83def HasVPOPCNTDQ : Predicate<"Subtarget->hasVPOPCNTDQ()">; 84def HasDQI : Predicate<"Subtarget->hasDQI()">; 85def NoDQI : Predicate<"!Subtarget->hasDQI()">; 86def HasBWI : Predicate<"Subtarget->hasBWI()">; 87def NoBWI : Predicate<"!Subtarget->hasBWI()">; 88def HasVLX : Predicate<"Subtarget->hasVLX()">; 89def NoVLX : Predicate<"!Subtarget->hasVLX()">; 90def NoVLX_Or_NoBWI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasBWI()">; 91def NoVLX_Or_NoDQI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasDQI()">; 92def HasPKU : Predicate<"Subtarget->hasPKU()">; 93def HasVNNI : Predicate<"Subtarget->hasVNNI()">; 94def HasVP2INTERSECT : Predicate<"Subtarget->hasVP2INTERSECT()">; 95def HasBF16 : Predicate<"Subtarget->hasBF16()">; 96def HasFP16 : Predicate<"Subtarget->hasFP16()">; 97def HasAVXVNNIINT16 : Predicate<"Subtarget->hasAVXVNNIINT16()">; 98def HasAVXVNNIINT8 : Predicate<"Subtarget->hasAVXVNNIINT8()">; 99def HasAVXVNNI : Predicate <"Subtarget->hasAVXVNNI()">; 100def NoVLX_Or_NoVNNI : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVNNI()">; 101 102def HasBITALG : Predicate<"Subtarget->hasBITALG()">; 103def HasPOPCNT : Predicate<"Subtarget->hasPOPCNT()">; 104def HasAES : Predicate<"Subtarget->hasAES()">; 105def HasVAES : Predicate<"Subtarget->hasVAES()">; 106def NoVLX_Or_NoVAES : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVAES()">; 107def HasFXSR : Predicate<"Subtarget->hasFXSR()">; 108def HasX87 : Predicate<"Subtarget->hasX87()">; 109def HasXSAVE : Predicate<"Subtarget->hasXSAVE()">; 110def HasXSAVEOPT : Predicate<"Subtarget->hasXSAVEOPT()">; 111def HasXSAVEC : Predicate<"Subtarget->hasXSAVEC()">; 112def HasXSAVES : Predicate<"Subtarget->hasXSAVES()">; 113def HasPCLMUL : Predicate<"Subtarget->hasPCLMUL()">; 114def NoVLX_Or_NoVPCLMULQDQ : 115 Predicate<"!Subtarget->hasVLX() || !Subtarget->hasVPCLMULQDQ()">; 116def HasVPCLMULQDQ : Predicate<"Subtarget->hasVPCLMULQDQ()">; 117def HasGFNI : Predicate<"Subtarget->hasGFNI()">; 118def HasFMA : Predicate<"Subtarget->hasFMA()">; 119def HasFMA4 : Predicate<"Subtarget->hasFMA4()">; 120def NoFMA4 : Predicate<"!Subtarget->hasFMA4()">; 121def HasXOP : Predicate<"Subtarget->hasXOP()">; 122def HasTBM : Predicate<"Subtarget->hasTBM()">; 123def NoTBM : Predicate<"!Subtarget->hasTBM()">; 124def HasLWP : Predicate<"Subtarget->hasLWP()">; 125def HasMOVBE : Predicate<"Subtarget->hasMOVBE()">; 126def NoNDD_Or_NoMOVBE : Predicate<"!Subtarget->hasNDD() || !Subtarget->hasMOVBE()">; 127def HasRDRAND : Predicate<"Subtarget->hasRDRAND()">; 128def HasF16C : Predicate<"Subtarget->hasF16C()">; 129def HasFSGSBase : Predicate<"Subtarget->hasFSGSBase()">; 130def HasLZCNT : Predicate<"Subtarget->hasLZCNT()">; 131def HasBMI : Predicate<"Subtarget->hasBMI()">; 132def HasBMI2 : Predicate<"Subtarget->hasBMI2()">; 133def NoBMI2 : Predicate<"!Subtarget->hasBMI2()">; 134def HasVBMI : Predicate<"Subtarget->hasVBMI()">; 135def HasVBMI2 : Predicate<"Subtarget->hasVBMI2()">; 136def HasIFMA : Predicate<"Subtarget->hasIFMA()">; 137def HasAVXIFMA : Predicate<"Subtarget->hasAVXIFMA()">; 138def NoVLX_Or_NoIFMA : Predicate<"!Subtarget->hasVLX() || !Subtarget->hasIFMA()">; 139def HasRTM : Predicate<"Subtarget->hasRTM()">; 140def HasSHA : Predicate<"Subtarget->hasSHA()">; 141def HasSHA512 : Predicate<"Subtarget->hasSHA512()">; 142def HasSGX : Predicate<"Subtarget->hasSGX()">; 143def HasSM3 : Predicate<"Subtarget->hasSM3()">; 144def HasRDSEED : Predicate<"Subtarget->hasRDSEED()">; 145def HasSSEPrefetch : Predicate<"Subtarget->hasSSEPrefetch()">; 146def HasPRFCHW : Predicate<"Subtarget->hasPRFCHW()">; 147def HasPREFETCHI : Predicate<"Subtarget->hasPREFETCHI()">; 148def HasPrefetchW : Predicate<"Subtarget->hasPrefetchW()">; 149def HasLAHFSAHF : Predicate<"Subtarget->hasLAHFSAHF()">; 150def HasLAHFSAHF64 : Predicate<"Subtarget->hasLAHFSAHF64()">; 151def HasMWAITX : Predicate<"Subtarget->hasMWAITX()">; 152def HasCLZERO : Predicate<"Subtarget->hasCLZERO()">; 153def HasCLDEMOTE : Predicate<"Subtarget->hasCLDEMOTE()">; 154def HasMOVDIRI : Predicate<"Subtarget->hasMOVDIRI()">; 155def HasMOVDIR64B : Predicate<"Subtarget->hasMOVDIR64B()">; 156def HasMOVRS : Predicate<"Subtarget->hasMOVRS()">; 157def HasPTWRITE : Predicate<"Subtarget->hasPTWRITE()">; 158def FPStackf32 : Predicate<"!Subtarget->hasSSE1()">; 159def FPStackf64 : Predicate<"!Subtarget->hasSSE2()">; 160def HasSHSTK : Predicate<"Subtarget->hasSHSTK()">; 161def HasSM4 : Predicate<"Subtarget->hasSM4()">; 162def HasCLFLUSH : Predicate<"Subtarget->hasCLFLUSH()">; 163def HasCLFLUSHOPT : Predicate<"Subtarget->hasCLFLUSHOPT()">; 164def HasCLWB : Predicate<"Subtarget->hasCLWB()">; 165def HasWBNOINVD : Predicate<"Subtarget->hasWBNOINVD()">; 166def HasRDPID : Predicate<"Subtarget->hasRDPID()">; 167def HasRDPRU : Predicate<"Subtarget->hasRDPRU()">; 168def HasWAITPKG : Predicate<"Subtarget->hasWAITPKG()">; 169def HasINVPCID : Predicate<"Subtarget->hasINVPCID()">; 170def HasCX8 : Predicate<"Subtarget->hasCX8()">; 171def HasCX16 : Predicate<"Subtarget->hasCX16()">; 172def HasPCONFIG : Predicate<"Subtarget->hasPCONFIG()">; 173def HasENQCMD : Predicate<"Subtarget->hasENQCMD()">; 174def HasAMXFP16 : Predicate<"Subtarget->hasAMXFP16()">; 175def HasCMPCCXADD : Predicate<"Subtarget->hasCMPCCXADD()">; 176def HasAVXNECONVERT : Predicate<"Subtarget->hasAVXNECONVERT()">; 177def HasKL : Predicate<"Subtarget->hasKL()">; 178def HasRAOINT : Predicate<"Subtarget->hasRAOINT()">; 179def HasWIDEKL : Predicate<"Subtarget->hasWIDEKL()">; 180def HasHRESET : Predicate<"Subtarget->hasHRESET()">; 181def HasSERIALIZE : Predicate<"Subtarget->hasSERIALIZE()">; 182def HasTSXLDTRK : Predicate<"Subtarget->hasTSXLDTRK()">; 183def HasAMXTILE : Predicate<"Subtarget->hasAMXTILE()">; 184def HasAMXBF16 : Predicate<"Subtarget->hasAMXBF16()">; 185def HasAMXINT8 : Predicate<"Subtarget->hasAMXINT8()">; 186def HasAMXCOMPLEX : Predicate<"Subtarget->hasAMXCOMPLEX()">; 187def HasAMXFP8 : Predicate<"Subtarget->hasAMXFP8()">; 188def HasAMXMOVRS : Predicate<"Subtarget->hasAMXMOVRS()">; 189def HasAMXTRANSPOSE : Predicate<"Subtarget->hasAMXTRANSPOSE()">; 190def HasAMXAVX512 : Predicate<"Subtarget->hasAMXAVX512()">; 191def HasAMXTF32 : Predicate<"Subtarget->hasAMXTF32()">; 192def HasUINTR : Predicate<"Subtarget->hasUINTR()">; 193def HasUSERMSR : Predicate<"Subtarget->hasUSERMSR()">; 194def HasCRC32 : Predicate<"Subtarget->hasCRC32()">; 195 196def HasX86_64 : Predicate<"Subtarget->hasX86_64()">; 197def Not64BitMode : Predicate<"!Subtarget->is64Bit()">, 198 AssemblerPredicate<(all_of (not Is64Bit)), "Not 64-bit mode">; 199def In64BitMode : Predicate<"Subtarget->is64Bit()">, 200 AssemblerPredicate<(all_of Is64Bit), "64-bit mode">; 201def IsLP64 : Predicate<"Subtarget->isTarget64BitLP64()">; 202def NotLP64 : Predicate<"!Subtarget->isTarget64BitLP64()">; 203def In16BitMode : Predicate<"Subtarget->is16Bit()">, 204 AssemblerPredicate<(all_of Is16Bit), "16-bit mode">; 205def Not16BitMode : Predicate<"!Subtarget->is16Bit()">, 206 AssemblerPredicate<(all_of (not Is16Bit)), "Not 16-bit mode">; 207def In32BitMode : Predicate<"Subtarget->is32Bit()">, 208 AssemblerPredicate<(all_of Is32Bit), "32-bit mode">; 209def IsWin64 : Predicate<"Subtarget->isTargetWin64()">; 210def NotWin64 : Predicate<"!Subtarget->isTargetWin64()">; 211def NotWin64WithoutFP : Predicate<"!Subtarget->isTargetWin64() ||" 212 "Subtarget->getFrameLowering()->hasFP(*MF)"> { 213 let RecomputePerFunction = 1; 214} 215def IsPS : Predicate<"Subtarget->isTargetPS()">; 216def NotPS : Predicate<"!Subtarget->isTargetPS()">; 217def IsNaCl : Predicate<"Subtarget->isTargetNaCl()">; 218def NotNaCl : Predicate<"!Subtarget->isTargetNaCl()">; 219def SmallCode : Predicate<"TM.getCodeModel() == CodeModel::Small">; 220def KernelCode : Predicate<"TM.getCodeModel() == CodeModel::Kernel">; 221def NearData : Predicate<"TM.getCodeModel() == CodeModel::Small ||" 222 "TM.getCodeModel() == CodeModel::Kernel">; 223def IsNotPIC : Predicate<"!TM.isPositionIndependent()">; 224 225// We could compute these on a per-module basis but doing so requires accessing 226// the Function object through the <Target>Subtarget and objections were raised 227// to that (see post-commit review comments for r301750). 228let RecomputePerFunction = 1 in { 229 def OptForSize : Predicate<"shouldOptForSize(MF)">; 230 def OptForMinSize : Predicate<"MF->getFunction().hasMinSize()">; 231 def OptForSpeed : Predicate<"!shouldOptForSize(MF)">; 232 def UseIncDec : Predicate<"!Subtarget->slowIncDec() || " 233 "shouldOptForSize(MF)">; 234 def NoSSE41_Or_OptForSize : Predicate<"shouldOptForSize(MF) || " 235 "!Subtarget->hasSSE41()">; 236} 237 238def CallImmAddr : Predicate<"Subtarget->isLegalToCallImmediateAddr()">; 239def FavorMemIndirectCall : Predicate<"!Subtarget->slowTwoMemOps()">; 240def HasFastMem32 : Predicate<"!Subtarget->isUnalignedMem32Slow()">; 241def HasFastLZCNT : Predicate<"Subtarget->hasFastLZCNT()">; 242def HasFastSHLDRotate : Predicate<"Subtarget->hasFastSHLDRotate()">; 243def HasERMSB : Predicate<"Subtarget->hasERMSB()">; 244def HasFSRM : Predicate<"Subtarget->hasFSRM()">; 245def HasMFence : Predicate<"Subtarget->hasMFence()">; 246def HasFastDPWSSD: Predicate<"Subtarget->hasFastDPWSSD()">; 247def UseIndirectThunkCalls : Predicate<"Subtarget->useIndirectThunkCalls()">; 248def NotUseIndirectThunkCalls : Predicate<"!Subtarget->useIndirectThunkCalls()">; 249