File indexing completed on 2026-05-10 08:36:51
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #ifndef LLVM_CLANG_BASIC_TARGETBUILTINS_H
0016 #define LLVM_CLANG_BASIC_TARGETBUILTINS_H
0017
0018 #include <algorithm>
0019 #include <stdint.h>
0020 #include "clang/Basic/Builtins.h"
0021 #include "llvm/Support/MathExtras.h"
0022 #undef PPC
0023
0024 namespace clang {
0025
0026 namespace NEON {
0027 enum {
0028 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
0029 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0030 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
0031 #include "clang/Basic/BuiltinsNEON.def"
0032 FirstTSBuiltin
0033 };
0034 }
0035
0036
0037 namespace ARM {
0038 enum {
0039 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
0040 LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
0041 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0042 #include "clang/Basic/BuiltinsARM.def"
0043 LastTSBuiltin
0044 };
0045 }
0046
0047 namespace SVE {
0048 enum {
0049 LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
0050 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0051 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
0052 #include "clang/Basic/BuiltinsSVE.def"
0053 FirstTSBuiltin,
0054 };
0055 }
0056
0057 namespace SME {
0058 enum {
0059 LastSVEBuiltin = SVE::FirstTSBuiltin - 1,
0060 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0061 #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
0062 #include "clang/Basic/BuiltinsSME.def"
0063 FirstTSBuiltin,
0064 };
0065 }
0066
0067
0068 namespace AArch64 {
0069 enum {
0070 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
0071 LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
0072 FirstSVEBuiltin = NEON::FirstTSBuiltin,
0073 LastSVEBuiltin = SVE::FirstTSBuiltin - 1,
0074 FirstSMEBuiltin = SVE::FirstTSBuiltin,
0075 LastSMEBuiltin = SME::FirstTSBuiltin - 1,
0076 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0077 #include "clang/Basic/BuiltinsAArch64.def"
0078 LastTSBuiltin
0079 };
0080 }
0081
0082
0083 namespace BPF {
0084 enum {
0085 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
0086 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0087 #include "clang/Basic/BuiltinsBPF.inc"
0088 LastTSBuiltin
0089 };
0090 }
0091
0092
0093 namespace PPC {
0094 enum {
0095 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
0096 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0097 #include "clang/Basic/BuiltinsPPC.def"
0098 LastTSBuiltin
0099 };
0100 }
0101
0102
0103 namespace NVPTX {
0104 enum {
0105 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
0106 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0107 #include "clang/Basic/BuiltinsNVPTX.inc"
0108 LastTSBuiltin
0109 };
0110 }
0111
0112
0113 namespace AMDGPU {
0114 enum {
0115 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
0116 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0117 #include "clang/Basic/BuiltinsAMDGPU.def"
0118 LastTSBuiltin
0119 };
0120 }
0121
0122
0123 namespace SPIRV {
0124 enum {
0125 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
0126 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0127 #include "clang/Basic/BuiltinsSPIRV.inc"
0128 LastTSBuiltin
0129 };
0130 }
0131
0132
0133 namespace X86 {
0134 enum {
0135 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
0136 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0137 #include "clang/Basic/BuiltinsX86.inc"
0138 FirstX86_64Builtin,
0139 LastX86CommonBuiltin = FirstX86_64Builtin - 1,
0140 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0141 #include "clang/Basic/BuiltinsX86_64.inc"
0142 LastTSBuiltin
0143 };
0144 }
0145
0146
0147 namespace VE {
0148 enum {
0149 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
0150 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0151 #include "clang/Basic/BuiltinsVE.def"
0152 LastTSBuiltin
0153 };
0154 }
0155
0156 namespace RISCVVector {
0157 enum {
0158 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
0159 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0160 #include "clang/Basic/BuiltinsRISCVVector.def"
0161 FirstTSBuiltin,
0162 };
0163 }
0164
0165
0166 namespace RISCV {
0167 enum {
0168 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
0169 FirstRVVBuiltin = clang::Builtin::FirstTSBuiltin,
0170 LastRVVBuiltin = RISCVVector::FirstTSBuiltin - 1,
0171 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0172 #include "clang/Basic/BuiltinsRISCV.inc"
0173 LastTSBuiltin
0174 };
0175 }
0176
0177
0178 namespace LoongArch {
0179 enum {
0180 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
0181 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0182 #include "clang/Basic/BuiltinsLoongArch.def"
0183 LastTSBuiltin
0184 };
0185 }
0186
0187
0188
0189
0190 class NeonTypeFlags {
0191 enum {
0192 EltTypeMask = 0xf,
0193 UnsignedFlag = 0x10,
0194 QuadFlag = 0x20
0195 };
0196 uint32_t Flags;
0197
0198 public:
0199 enum EltType {
0200 Int8,
0201 Int16,
0202 Int32,
0203 Int64,
0204 Poly8,
0205 Poly16,
0206 Poly64,
0207 Poly128,
0208 Float16,
0209 Float32,
0210 Float64,
0211 BFloat16,
0212 MFloat8
0213 };
0214
0215 NeonTypeFlags(unsigned F) : Flags(F) {}
0216 NeonTypeFlags(EltType ET, bool IsUnsigned, bool IsQuad) : Flags(ET) {
0217 if (IsUnsigned)
0218 Flags |= UnsignedFlag;
0219 if (IsQuad)
0220 Flags |= QuadFlag;
0221 }
0222
0223 EltType getEltType() const { return (EltType)(Flags & EltTypeMask); }
0224 bool isPoly() const {
0225 EltType ET = getEltType();
0226 return ET == Poly8 || ET == Poly16 || ET == Poly64;
0227 }
0228 bool isUnsigned() const { return (Flags & UnsignedFlag) != 0; }
0229 bool isQuad() const { return (Flags & QuadFlag) != 0; }
0230 unsigned getEltSizeInBits() const {
0231 switch (getEltType()) {
0232 case Int8:
0233 case Poly8:
0234 case MFloat8:
0235 return 8;
0236 case Int16:
0237 case Float16:
0238 case Poly16:
0239 case BFloat16:
0240 return 16;
0241 case Int32:
0242 case Float32:
0243 return 32;
0244 case Int64:
0245 case Float64:
0246 case Poly64:
0247 return 64;
0248 case Poly128:
0249 return 128;
0250 }
0251 llvm_unreachable("Invalid NeonTypeFlag!");
0252 }
0253 };
0254
0255
0256 enum ImmCheckType {
0257 #define LLVM_GET_ARM_INTRIN_IMMCHECKTYPES
0258 #include "clang/Basic/arm_immcheck_types.inc"
0259 #undef LLVM_GET_ARM_INTRIN_IMMCHECKTYPES
0260 };
0261
0262
0263 class SVETypeFlags {
0264 uint64_t Flags;
0265 unsigned EltTypeShift;
0266 unsigned MemEltTypeShift;
0267 unsigned MergeTypeShift;
0268 unsigned SplatOperandMaskShift;
0269
0270 public:
0271 #define LLVM_GET_SVE_TYPEFLAGS
0272 #include "clang/Basic/arm_sve_typeflags.inc"
0273 #undef LLVM_GET_SVE_TYPEFLAGS
0274
0275 enum EltType {
0276 #define LLVM_GET_SVE_ELTTYPES
0277 #include "clang/Basic/arm_sve_typeflags.inc"
0278 #undef LLVM_GET_SVE_ELTTYPES
0279 };
0280
0281 enum MemEltType {
0282 #define LLVM_GET_SVE_MEMELTTYPES
0283 #include "clang/Basic/arm_sve_typeflags.inc"
0284 #undef LLVM_GET_SVE_MEMELTTYPES
0285 };
0286
0287 enum MergeType {
0288 #define LLVM_GET_SVE_MERGETYPES
0289 #include "clang/Basic/arm_sve_typeflags.inc"
0290 #undef LLVM_GET_SVE_MERGETYPES
0291 };
0292
0293 SVETypeFlags(uint64_t F) : Flags(F) {
0294 EltTypeShift = llvm::countr_zero(EltTypeMask);
0295 MemEltTypeShift = llvm::countr_zero(MemEltTypeMask);
0296 MergeTypeShift = llvm::countr_zero(MergeTypeMask);
0297 SplatOperandMaskShift = llvm::countr_zero(SplatOperandMask);
0298 }
0299
0300 EltType getEltType() const {
0301 return (EltType)((Flags & EltTypeMask) >> EltTypeShift);
0302 }
0303
0304 MemEltType getMemEltType() const {
0305 return (MemEltType)((Flags & MemEltTypeMask) >> MemEltTypeShift);
0306 }
0307
0308 MergeType getMergeType() const {
0309 return (MergeType)((Flags & MergeTypeMask) >> MergeTypeShift);
0310 }
0311
0312 unsigned getSplatOperand() const {
0313 return ((Flags & SplatOperandMask) >> SplatOperandMaskShift) - 1;
0314 }
0315
0316 bool hasSplatOperand() const {
0317 return Flags & SplatOperandMask;
0318 }
0319
0320 bool isLoad() const { return Flags & IsLoad; }
0321 bool isStore() const { return Flags & IsStore; }
0322 bool isGatherLoad() const { return Flags & IsGatherLoad; }
0323 bool isScatterStore() const { return Flags & IsScatterStore; }
0324 bool isStructLoad() const { return Flags & IsStructLoad; }
0325 bool isStructStore() const { return Flags & IsStructStore; }
0326 bool isZExtReturn() const { return Flags & IsZExtReturn; }
0327 bool isByteIndexed() const { return Flags & IsByteIndexed; }
0328 bool isOverloadNone() const { return Flags & IsOverloadNone; }
0329 bool isOverloadWhileOrMultiVecCvt() const {
0330 return Flags & IsOverloadWhileOrMultiVecCvt;
0331 }
0332 bool isOverloadDefault() const { return !(Flags & OverloadKindMask); }
0333 bool isOverloadWhileRW() const { return Flags & IsOverloadWhileRW; }
0334 bool isOverloadCvt() const { return Flags & IsOverloadCvt; }
0335 bool isPrefetch() const { return Flags & IsPrefetch; }
0336 bool isReverseCompare() const { return Flags & ReverseCompare; }
0337 bool isAppendSVALL() const { return Flags & IsAppendSVALL; }
0338 bool isInsertOp1SVALL() const { return Flags & IsInsertOp1SVALL; }
0339 bool isGatherPrefetch() const { return Flags & IsGatherPrefetch; }
0340 bool isReverseUSDOT() const { return Flags & ReverseUSDOT; }
0341 bool isReverseMergeAnyBinOp() const { return Flags & ReverseMergeAnyBinOp; }
0342 bool isReverseMergeAnyAccOp() const { return Flags & ReverseMergeAnyAccOp; }
0343 bool isUndef() const { return Flags & IsUndef; }
0344 bool isTupleCreate() const { return Flags & IsTupleCreate; }
0345 bool isTupleGet() const { return Flags & IsTupleGet; }
0346 bool isTupleSet() const { return Flags & IsTupleSet; }
0347 bool isReadZA() const { return Flags & IsReadZA; }
0348 bool isWriteZA() const { return Flags & IsWriteZA; }
0349 bool setsFPMR() const { return Flags & SetsFPMR; }
0350 bool isReductionQV() const { return Flags & IsReductionQV; }
0351 uint64_t getBits() const { return Flags; }
0352 bool isFlagSet(uint64_t Flag) const { return Flags & Flag; }
0353 };
0354
0355
0356 namespace Hexagon {
0357 enum {
0358 LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
0359 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0360 #include "clang/Basic/BuiltinsHexagon.inc"
0361 LastTSBuiltin
0362 };
0363 }
0364
0365
0366 namespace Mips {
0367 enum {
0368 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
0369 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0370 #include "clang/Basic/BuiltinsMips.def"
0371 LastTSBuiltin
0372 };
0373 }
0374
0375
0376 namespace XCore {
0377 enum {
0378 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
0379 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0380 #include "clang/Basic/BuiltinsXCore.def"
0381 LastTSBuiltin
0382 };
0383 }
0384
0385
0386 namespace SystemZ {
0387 enum {
0388 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
0389 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0390 #include "clang/Basic/BuiltinsSystemZ.def"
0391 LastTSBuiltin
0392 };
0393 }
0394
0395
0396 namespace WebAssembly {
0397 enum {
0398 LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
0399 #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
0400 #include "clang/Basic/BuiltinsWebAssembly.def"
0401 LastTSBuiltin
0402 };
0403 }
0404
0405 static constexpr uint64_t LargestBuiltinID = std::max<uint64_t>(
0406 {ARM::LastTSBuiltin, AArch64::LastTSBuiltin, BPF::LastTSBuiltin,
0407 PPC::LastTSBuiltin, NVPTX::LastTSBuiltin, AMDGPU::LastTSBuiltin,
0408 X86::LastTSBuiltin, VE::LastTSBuiltin, RISCV::LastTSBuiltin,
0409 Hexagon::LastTSBuiltin, Mips::LastTSBuiltin, XCore::LastTSBuiltin,
0410 SystemZ::LastTSBuiltin, WebAssembly::LastTSBuiltin});
0411
0412 }
0413
0414 #endif