Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-10 08:36:51

0001 //===--- TargetBuiltins.h - Target specific builtin IDs ---------*- C++ -*-===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 ///
0009 /// \file
0010 /// Enumerates target-specific builtins in their own namespaces within
0011 /// namespace ::clang.
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   /// ARM builtins
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   /// AArch64 builtins
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   /// BPF builtins
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   /// PPC builtins
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   /// NVPTX builtins
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   /// AMDGPU builtins
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   /// SPIRV builtins
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   } // namespace SPIRV
0131 
0132   /// X86 builtins
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   /// VE builtins
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   /// RISCV builtins
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   } // namespace RISCV
0176 
0177   /// LoongArch builtins
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   } // namespace LoongArch
0186 
0187   /// Flags to identify the types for overloaded Neon builtins.
0188   ///
0189   /// These must be kept in sync with the flags in utils/TableGen/NeonEmitter.h.
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   // Shared between SVE/SME and NEON
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   /// Flags to identify the types for overloaded SVE builtins.
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   /// Hexagon builtins
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   /// MIPS builtins
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   /// XCore builtins
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   /// SystemZ builtins
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   /// WebAssembly builtins
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 } // end namespace clang.
0413 
0414 #endif