4#include "native/config.h"
7#include "native/detail/crc.h"
13#if NATIVE_HOST_X86 || defined(NATIVE_DOXYGEN)
25 template<isa<x86> Arch>
requires(Arch.has(x86_feature::crc32))
27 constexpr
std::uint32_t
crc32c(
std::uint32_t accumulator,
std::uint8_t value) noexcept {
28 if (__builtin_is_constant_evaluated()) {
29 return detail::crc_update(accumulator, value,
sizeof(value) * 8, 0x82f63b78u);
31 return _mm_crc32_u8(accumulator, value);
36 template<isa<x86> Arch>
requires(Arch.has(x86_feature::crc32))
38 constexpr std::uint32_t
crc32c(std::uint32_t accumulator, std::uint16_t value)
noexcept {
39 if (__builtin_is_constant_evaluated()) {
40 return detail::crc_update(accumulator, value,
sizeof(value) * 8, 0x82f63b78u);
42 return _mm_crc32_u16(accumulator, value);
47 template<isa<x86> Arch>
requires(Arch.has(x86_feature::crc32))
49 constexpr std::uint32_t
crc32c(std::uint32_t accumulator, std::uint32_t value)
noexcept {
50 if (__builtin_is_constant_evaluated()) {
51 return detail::crc_update(accumulator, value,
sizeof(value) * 8, 0x82f63b78u);
53 return _mm_crc32_u32(accumulator, value);
57#if defined(__x86_64__) || defined(_M_X64) || defined(NATIVE_DOXYGEN)
60 template<isa<x86> Arch>
requires(Arch.has(x86_feature::crc32))
62 constexpr std::uint32_t
crc32c(std::uint32_t accumulator, std::uint64_t value)
noexcept {
63 if (__builtin_is_constant_evaluated()) {
64 return detail::crc_update(accumulator, value,
sizeof(value) * 8, 0x82f63b78u);
66 return static_cast<std::uint32_t
>(_mm_crc32_u64(accumulator, value));
72 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::crc32))
74 consteval std::uint32_t
crc32c(std::uint32_t accumulator, std::uint8_t value)
noexcept {
79 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::crc32))
81 consteval std::uint32_t
crc32c(std::uint32_t accumulator, std::uint16_t value)
noexcept {
86 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::crc32))
88 consteval std::uint32_t
crc32c(std::uint32_t accumulator, std::uint32_t value)
noexcept {
92#if defined(__x86_64__) || defined(_M_X64) || defined(NATIVE_DOXYGEN)
94 template<isa<x86> Arch>
requires(!Arch.has(x86_feature::crc32))
96 consteval std::uint32_t
crc32c(std::uint32_t accumulator, 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
#define native_target(x)
this indicates a required feature set for the current multiversioned function.
constexpr std::uint32_t crc32c(std::uint32_t accumulator, std::uint8_t value) noexcept
Update a 32-bit CRC32C accumulator with exactly eight bits.
Architecture-tagged vectors, register packs and supporting value types. Native arithmetic follows its...
Standard-library adaptations documented here for SIMD value types.