4#include "native/config.h"
22 template<isa<x86> Arch>
requires(Arch.has(x86_feature::popcnt))
25 if (__builtin_is_constant_evaluated()) {
26 return static_cast<std::uint16_t
>(std::popcount(value));
28 return static_cast<std::uint16_t
>(_mm_popcnt_u32(value));
34 template<isa<x86> Arch>
requires(Arch.has(x86_feature::popcnt))
36 constexpr std::uint32_t
popcnt(std::uint32_t value)
noexcept {
37 if (__builtin_is_constant_evaluated()) {
38 return static_cast<std::uint32_t
>(std::popcount(value));
40 return static_cast<std::uint32_t
>(_mm_popcnt_u32(value));
46 template<isa<x86> Arch>
requires(Arch.has(x86_feature::popcnt))
48 constexpr std::uint64_t
popcnt(std::uint64_t value)
noexcept {
49 if (__builtin_is_constant_evaluated()) {
50 return static_cast<std::uint64_t
>(std::popcount(value));
52 return static_cast<std::uint64_t
>(_mm_popcnt_u64(value));
57 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::popcnt))
59 consteval std::uint16_t
popcnt(std::uint16_t value)
noexcept {
64 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::popcnt))
66 consteval std::uint32_t
popcnt(std::uint32_t value)
noexcept {
71 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::popcnt))
73 consteval std::uint64_t
popcnt(std::uint64_t value)
noexcept {
Compiler attributes for host code, with shader-safe shared modifiers.
#define native_inline
inline [[always_inline]]
#define native_nodiscard
C++17 [[nodiscard]].
#define native_const
[[const]] is not const
constexpr std::uint16_t popcnt(std::uint16_t value) noexcept
Architecture-tagged vectors, register packs and supporting value types. Native arithmetic follows its...
constexpr int target
First matching requirement, with every later choice checked for shadowing.
Standard-library adaptations documented here for SIMD value types.