4#include "native/config.h"
22 template<isa<x86> Arch>
requires(Arch.has(x86_feature::lzcnt))
25 if (__builtin_is_constant_evaluated()) {
26 return static_cast<std::uint16_t
>(std::countl_zero(value));
28 return __builtin_ia32_lzcnt_u16(value);
34 template<isa<x86> Arch>
requires(Arch.has(x86_feature::lzcnt))
36 constexpr std::uint32_t
lzcnt(std::uint32_t value)
noexcept {
37 if (__builtin_is_constant_evaluated()) {
38 return static_cast<std::uint32_t
>(std::countl_zero(value));
40 return _lzcnt_u32(value);
46 template<isa<x86> Arch>
requires(Arch.has(x86_feature::lzcnt))
48 constexpr std::uint64_t
lzcnt(std::uint64_t value)
noexcept {
49 if (__builtin_is_constant_evaluated()) {
50 return static_cast<std::uint64_t
>(std::countl_zero(value));
52 return _lzcnt_u64(value);
57 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::lzcnt))
59 consteval std::uint16_t
lzcnt(std::uint16_t value)
noexcept {
64 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::lzcnt))
66 consteval std::uint32_t
lzcnt(std::uint32_t value)
noexcept {
71 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::lzcnt))
73 consteval std::uint64_t
lzcnt(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 lzcnt(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.