//===--- DeviceUtils.h - OpenMP device runtime utility functions -- 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 // //===----------------------------------------------------------------------===// // // //===----------------------------------------------------------------------===// #ifndef OMPTARGET_DEVICERTL_DEVICE_UTILS_H #define OMPTARGET_DEVICERTL_DEVICE_UTILS_H #include "DeviceTypes.h" #include "Shared/Utils.h" namespace utils { template struct type_identity { using type = T; }; template struct integral_constant { inline static constexpr T value = v; }; /// Freestanding SFINAE helpers. template struct remove_cv : type_identity {}; template struct remove_cv : type_identity {}; template struct remove_cv : type_identity {}; template struct remove_cv : type_identity {}; template using remove_cv_t = typename remove_cv::type; using true_type = integral_constant; using false_type = integral_constant; template struct is_same : false_type {}; template struct is_same : true_type {}; template inline constexpr bool is_same_v = is_same::value; template struct is_floating_point { inline static constexpr bool value = is_same_v, float> || is_same_v, double>; }; template inline constexpr bool is_floating_point_v = is_floating_point::value; template struct enable_if; template struct enable_if : type_identity {}; template using enable_if_t = typename enable_if::type; template struct remove_addrspace : type_identity {}; template struct remove_addrspace : type_identity {}; template using remove_addrspace_t = typename remove_addrspace::type; template inline To bitCast(From V) { static_assert(sizeof(To) == sizeof(From), "Bad conversion"); return __builtin_bit_cast(To, V); } /// Return the value \p Var from thread Id \p SrcLane in the warp if the thread /// is identified by \p Mask. int32_t shuffle(uint64_t Mask, int32_t Var, int32_t SrcLane, int32_t Width); int32_t shuffleDown(uint64_t Mask, int32_t Var, uint32_t Delta, int32_t Width); int64_t shuffleDown(uint64_t Mask, int64_t Var, uint32_t Delta, int32_t Width); uint64_t ballotSync(uint64_t Mask, int32_t Pred); /// Return \p LowBits and \p HighBits packed into a single 64 bit value. uint64_t pack(uint32_t LowBits, uint32_t HighBits); /// Unpack \p Val into \p LowBits and \p HighBits. void unpack(uint64_t Val, uint32_t &LowBits, uint32_t &HighBits); /// Return true iff \p Ptr is pointing into shared (local) memory (AS(3)). bool isSharedMemPtr(void *Ptr); /// Return true iff \p Ptr is pointing into (thread) local memory (AS(5)). bool isThreadLocalMemPtr(void *Ptr); /// A pointer variable that has by design an `undef` value. Use with care. [[clang::loader_uninitialized]] static void *const UndefPtr; #define OMP_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true) #define OMP_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false) } // namespace utils #endif