14# include <sycl/sycl.hpp>
18 template<
typename T_Arg>
21 constexpr auto operator()(alpaka::internal::SyclIntrinsic
const, T_Arg
const& val)
const
23 if constexpr(
sizeof(T_Arg) == 4u)
25 return sycl::popcount(std::bit_cast<unsigned int>(val));
27 else if constexpr(
sizeof(T_Arg) == 8u)
29 return sycl::popcount(std::bit_cast<unsigned long long>(val));
32 static_assert(!
sizeof(T_Arg),
"Unsupported data type, sizeof() must be 4 or 8");
38 template<
typename T_Arg>
41 constexpr auto operator()(alpaka::internal::SyclIntrinsic
const, T_Arg
const& val)
const
44 if constexpr(
sizeof(T_Arg) == 4u)
46 auto value = std::bit_cast<unsigned int>(val);
47 return (value == 0u) ? 0 : sycl::popcount(value ^ ~(-value));
49 else if constexpr(
sizeof(T_Arg) == 8u)
51 auto value = std::bit_cast<unsigned long long>(val);
52 return (value == 0u) ? 0 : sycl::popcount(value ^ ~(-value));
55 static_assert(!
sizeof(T_Arg),
"Unsupported data type, sizeof() must be 4 or 8");
61 template<
typename T_Arg>
64 constexpr auto operator()(alpaka::internal::SyclIntrinsic
const, T_Arg
const& val)
const
66 if constexpr(
sizeof(T_Arg) == 4u)
68 auto value = std::bit_cast<unsigned int>(val);
69 return sycl::clz(value);
71 else if constexpr(
sizeof(T_Arg) == 8u)
73 auto value = std::bit_cast<unsigned long long>(val);
74 return sycl::clz(value);
77 static_assert(!
sizeof(T_Arg),
"Unsupported data type, sizeof() must be 4 or 8");
#define ALPAKA_UNREACHABLE(...)
Before CUDA 11.5 nvcc is unable to correctly identify return statements in 'if constexpr' branches....
int32_t operator()(T_IntrinsicImpl const, T_Arg const &val) const
int32_t operator()(T_IntrinsicImpl const, T_Arg const &val) const
int32_t operator()(T_IntrinsicImpl const, T_Arg const &val) const