//===--- TargetBuiltins.h - Target specific builtin IDs ---------*- C++ -*-===//
 
//
 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 
// See https://llvm.org/LICENSE.txt for license information.
 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
//
 
//===----------------------------------------------------------------------===//
 
///
 
/// \file
 
/// Enumerates target-specific builtins in their own namespaces within
 
/// namespace ::clang.
 
///
 
//===----------------------------------------------------------------------===//
 
 
 
#ifndef LLVM_CLANG_BASIC_TARGETBUILTINS_H
 
#define LLVM_CLANG_BASIC_TARGETBUILTINS_H
 
 
 
#include <algorithm>
 
#include <stdint.h>
 
#include "clang/Basic/Builtins.h"
 
#include "llvm/Support/MathExtras.h"
 
#undef PPC
 
 
 
namespace clang {
 
 
 
  namespace NEON {
 
  enum {
 
    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
 
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BI##ID,
 
#include "clang/Basic/BuiltinsNEON.def"
 
    FirstTSBuiltin
 
  };
 
  }
 
 
 
  /// ARM builtins
 
  namespace ARM {
 
    enum {
 
      LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
 
      LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
 
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
#include "clang/Basic/BuiltinsARM.def"
 
      LastTSBuiltin
 
    };
 
  }
 
 
 
  namespace SVE {
 
  enum {
 
    LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
 
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
#include "clang/Basic/BuiltinsSVE.def"
 
    FirstTSBuiltin,
 
  };
 
  }
 
 
 
  /// AArch64 builtins
 
  namespace AArch64 {
 
  enum {
 
    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
 
    LastNEONBuiltin = NEON::FirstTSBuiltin - 1,
 
    FirstSVEBuiltin = NEON::FirstTSBuiltin,
 
    LastSVEBuiltin = SVE::FirstTSBuiltin - 1,
 
  #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
  #include "clang/Basic/BuiltinsAArch64.def"
 
    LastTSBuiltin
 
  };
 
  }
 
 
 
  /// BPF builtins
 
  namespace BPF {
 
  enum {
 
    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
 
  #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
  #include "clang/Basic/BuiltinsBPF.def"
 
    LastTSBuiltin
 
  };
 
  }
 
 
 
  /// PPC builtins
 
  namespace PPC {
 
    enum {
 
        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
 
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
#include "clang/Basic/BuiltinsPPC.def"
 
        LastTSBuiltin
 
    };
 
  }
 
 
 
  /// NVPTX builtins
 
  namespace NVPTX {
 
    enum {
 
        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
 
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
#include "clang/Basic/BuiltinsNVPTX.def"
 
        LastTSBuiltin
 
    };
 
  }
 
 
 
  /// AMDGPU builtins
 
  namespace AMDGPU {
 
  enum {
 
    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
 
  #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
  #include "clang/Basic/BuiltinsAMDGPU.def"
 
    LastTSBuiltin
 
  };
 
  }
 
 
 
  /// X86 builtins
 
  namespace X86 {
 
  enum {
 
    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
 
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
#include "clang/Basic/BuiltinsX86.def"
 
    FirstX86_64Builtin,
 
    LastX86CommonBuiltin = FirstX86_64Builtin - 1,
 
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
#include "clang/Basic/BuiltinsX86_64.def"
 
    LastTSBuiltin
 
  };
 
  }
 
 
 
  /// VE builtins
 
  namespace VE {
 
  enum {
 
    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
 
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
#include "clang/Basic/BuiltinsVE.def"
 
    LastTSBuiltin
 
  };
 
  }
 
 
 
  namespace RISCVVector {
 
  enum {
 
    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
 
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
#include "clang/Basic/BuiltinsRISCVVector.def"
 
    FirstTSBuiltin,
 
  };
 
  }
 
 
 
  /// RISCV builtins
 
  namespace RISCV {
 
  enum {
 
    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
 
    FirstRVVBuiltin = clang::Builtin::FirstTSBuiltin,
 
    LastRVVBuiltin = RISCVVector::FirstTSBuiltin - 1,
 
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
#include "clang/Basic/BuiltinsRISCV.def"
 
    LastTSBuiltin
 
  };
 
  } // namespace RISCV
 
 
 
  /// LoongArch builtins
 
  namespace LoongArch {
 
  enum {
 
    LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
 
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
#include "clang/Basic/BuiltinsLoongArch.def"
 
    LastTSBuiltin
 
  };
 
  } // namespace LoongArch
 
 
 
  /// Flags to identify the types for overloaded Neon builtins.
 
  ///
 
  /// These must be kept in sync with the flags in utils/TableGen/NeonEmitter.h.
 
  class NeonTypeFlags {
 
    enum {
 
      EltTypeMask = 0xf,
 
      UnsignedFlag = 0x10,
 
      QuadFlag = 0x20
 
    };
 
    uint32_t Flags;
 
 
 
  public:
 
    enum EltType {
 
      Int8,
 
      Int16,
 
      Int32,
 
      Int64,
 
      Poly8,
 
      Poly16,
 
      Poly64,
 
      Poly128,
 
      Float16,
 
      Float32,
 
      Float64,
 
      BFloat16
 
    };
 
 
 
    NeonTypeFlags(unsigned F) : Flags(F) {}
 
    NeonTypeFlags(EltType ET, bool IsUnsigned, bool IsQuad) : Flags(ET) {
 
      if (IsUnsigned)
 
        Flags |= UnsignedFlag;
 
      if (IsQuad)
 
        Flags |= QuadFlag;
 
    }
 
 
 
    EltType getEltType() const { return (EltType)(Flags & EltTypeMask); }
 
    bool isPoly() const {
 
      EltType ET = getEltType();
 
      return ET == Poly8 || ET == Poly16 || ET == Poly64;
 
    }
 
    bool isUnsigned() const { return (Flags & UnsignedFlag) != 0; }
 
    bool isQuad() const { return (Flags & QuadFlag) != 0; }
 
  };
 
 
 
  /// Flags to identify the types for overloaded SVE builtins.
 
  class SVETypeFlags {
 
    uint64_t Flags;
 
    unsigned EltTypeShift;
 
    unsigned MemEltTypeShift;
 
    unsigned MergeTypeShift;
 
    unsigned SplatOperandMaskShift;
 
 
 
  public:
 
#define LLVM_GET_SVE_TYPEFLAGS
 
#include "clang/Basic/arm_sve_typeflags.inc"
 
#undef LLVM_GET_SVE_TYPEFLAGS
 
 
 
    enum EltType {
 
#define LLVM_GET_SVE_ELTTYPES
 
#include "clang/Basic/arm_sve_typeflags.inc"
 
#undef LLVM_GET_SVE_ELTTYPES
 
    };
 
 
 
    enum MemEltType {
 
#define LLVM_GET_SVE_MEMELTTYPES
 
#include "clang/Basic/arm_sve_typeflags.inc"
 
#undef LLVM_GET_SVE_MEMELTTYPES
 
    };
 
 
 
    enum MergeType {
 
#define LLVM_GET_SVE_MERGETYPES
 
#include "clang/Basic/arm_sve_typeflags.inc"
 
#undef LLVM_GET_SVE_MERGETYPES
 
    };
 
 
 
    enum ImmCheckType {
 
#define LLVM_GET_SVE_IMMCHECKTYPES
 
#include "clang/Basic/arm_sve_typeflags.inc"
 
#undef LLVM_GET_SVE_IMMCHECKTYPES
 
    };
 
 
 
    SVETypeFlags(uint64_t F) : Flags(F) {
 
      EltTypeShift = llvm::countTrailingZeros(EltTypeMask);
 
      MemEltTypeShift = llvm::countTrailingZeros(MemEltTypeMask);
 
      MergeTypeShift = llvm::countTrailingZeros(MergeTypeMask);
 
      SplatOperandMaskShift = llvm::countTrailingZeros(SplatOperandMask);
 
    }
 
 
 
    EltType getEltType() const {
 
      return (EltType)((Flags & EltTypeMask) >> EltTypeShift);
 
    }
 
 
 
    MemEltType getMemEltType() const {
 
      return (MemEltType)((Flags & MemEltTypeMask) >> MemEltTypeShift);
 
    }
 
 
 
    MergeType getMergeType() const {
 
      return (MergeType)((Flags & MergeTypeMask) >> MergeTypeShift);
 
    }
 
 
 
    unsigned getSplatOperand() const {
 
      return ((Flags & SplatOperandMask) >> SplatOperandMaskShift) - 1;
 
    }
 
 
 
    bool hasSplatOperand() const {
 
      return Flags & SplatOperandMask;
 
    }
 
 
 
    bool isLoad() const { return Flags & IsLoad; }
 
    bool isStore() const { return Flags & IsStore; }
 
    bool isGatherLoad() const { return Flags & IsGatherLoad; }
 
    bool isScatterStore() const { return Flags & IsScatterStore; }
 
    bool isStructLoad() const { return Flags & IsStructLoad; }
 
    bool isStructStore() const { return Flags & IsStructStore; }
 
    bool isZExtReturn() const { return Flags & IsZExtReturn; }
 
    bool isByteIndexed() const { return Flags & IsByteIndexed; }
 
    bool isOverloadNone() const { return Flags & IsOverloadNone; }
 
    bool isOverloadWhile() const { return Flags & IsOverloadWhile; }
 
    bool isOverloadDefault() const { return !(Flags & OverloadKindMask); }
 
    bool isOverloadWhileRW() const { return Flags & IsOverloadWhileRW; }
 
    bool isOverloadCvt() const { return Flags & IsOverloadCvt; }
 
    bool isPrefetch() const { return Flags & IsPrefetch; }
 
    bool isReverseCompare() const { return Flags & ReverseCompare; }
 
    bool isAppendSVALL() const { return Flags & IsAppendSVALL; }
 
    bool isInsertOp1SVALL() const { return Flags & IsInsertOp1SVALL; }
 
    bool isGatherPrefetch() const { return Flags & IsGatherPrefetch; }
 
    bool isReverseUSDOT() const { return Flags & ReverseUSDOT; }
 
    bool isUndef() const { return Flags & IsUndef; }
 
    bool isTupleCreate() const { return Flags & IsTupleCreate; }
 
    bool isTupleGet() const { return Flags & IsTupleGet; }
 
    bool isTupleSet() const { return Flags & IsTupleSet; }
 
 
 
    uint64_t getBits() const { return Flags; }
 
    bool isFlagSet(uint64_t Flag) const { return Flags & Flag; }
 
  };
 
 
 
  /// Hexagon builtins
 
  namespace Hexagon {
 
    enum {
 
        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
 
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
#include "clang/Basic/BuiltinsHexagon.def"
 
        LastTSBuiltin
 
    };
 
  }
 
 
 
  /// MIPS builtins
 
  namespace Mips {
 
    enum {
 
        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
 
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
#include "clang/Basic/BuiltinsMips.def"
 
        LastTSBuiltin
 
    };
 
  }
 
 
 
  /// XCore builtins
 
  namespace XCore {
 
    enum {
 
        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
 
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
#include "clang/Basic/BuiltinsXCore.def"
 
        LastTSBuiltin
 
    };
 
  }
 
 
 
  /// SystemZ builtins
 
  namespace SystemZ {
 
    enum {
 
        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
 
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
#include "clang/Basic/BuiltinsSystemZ.def"
 
        LastTSBuiltin
 
    };
 
  }
 
 
 
  /// WebAssembly builtins
 
  namespace WebAssembly {
 
    enum {
 
      LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
 
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
 
#include "clang/Basic/BuiltinsWebAssembly.def"
 
      LastTSBuiltin
 
    };
 
  }
 
 
 
  static constexpr uint64_t LargestBuiltinID = std::max<uint64_t>(
 
      {ARM::LastTSBuiltin, AArch64::LastTSBuiltin, BPF::LastTSBuiltin,
 
       PPC::LastTSBuiltin, NVPTX::LastTSBuiltin, AMDGPU::LastTSBuiltin,
 
       X86::LastTSBuiltin, VE::LastTSBuiltin, RISCV::LastTSBuiltin,
 
       Hexagon::LastTSBuiltin, Mips::LastTSBuiltin, XCore::LastTSBuiltin,
 
       SystemZ::LastTSBuiltin, WebAssembly::LastTSBuiltin});
 
 
 
} // end namespace clang.
 
 
 
#endif