4#include "native/config.h"
7#include "native/detail/crc.h"
13#if NATIVE_HOST_NEON || defined(NATIVE_DOXYGEN)
26 template<isa<arm> Arch>
requires(Arch.has(arm_feature::crc))
28 constexpr
std::uint32_t
crc32(
std::uint32_t accumulator,
std::uint8_t value) noexcept {
29 if(__builtin_is_constant_evaluated())
return detail::crc_update(accumulator,value,8,0xedb88320u);
30 return __crc32b(accumulator,value);
34 template<isa<arm> Arch>
requires(!Arch.has(arm_feature::crc))
36 return detail::crc_update(accumulator,value,8,0xedb88320u);
40 template<isa<arm> Arch>
requires(Arch.has(arm_feature::crc))
42 constexpr
std::uint32_t
crc32(
std::uint32_t accumulator,
std::uint16_t value) noexcept {
43 if(__builtin_is_constant_evaluated())
return detail::crc_update(accumulator,value,16,0xedb88320u);
44 return __crc32h(accumulator,value);
48 template<isa<arm> Arch>
requires(!Arch.has(arm_feature::crc))
50 return detail::crc_update(accumulator,value,16,0xedb88320u);
54 template<isa<arm> Arch>
requires(Arch.has(arm_feature::crc))
56 constexpr
std::uint32_t
crc32(
std::uint32_t accumulator,
std::uint32_t value) noexcept {
57 if(__builtin_is_constant_evaluated())
return detail::crc_update(accumulator,value,32,0xedb88320u);
58 return __crc32w(accumulator,value);
62 template<isa<arm> Arch>
requires(!Arch.has(arm_feature::crc))
64 return detail::crc_update(accumulator,value,32,0xedb88320u);
68 template<isa<arm> Arch>
requires(Arch.has(arm_feature::crc))
70 constexpr
std::uint32_t
crc32(
std::uint32_t accumulator,
std::uint64_t value) noexcept {
71 if(__builtin_is_constant_evaluated())
return detail::crc_update(accumulator,value,64,0xedb88320u);
72 return __crc32d(accumulator,value);
76 template<isa<arm> Arch>
requires(!Arch.has(arm_feature::crc))
78 return detail::crc_update(accumulator,value,64,0xedb88320u);
82 template<isa<arm> Arch,
class A,
class B>
86 template<isa<arm> Arch>
requires(Arch.has(arm_feature::crc))
88 constexpr
std::uint32_t
crc32c(
std::uint32_t accumulator,
std::uint8_t value) noexcept {
89 if(__builtin_is_constant_evaluated())
return detail::crc_update(accumulator,value,8,0x82f63b78u);
90 return __crc32cb(accumulator,value);
94 template<isa<arm> Arch>
requires(!Arch.has(arm_feature::crc))
96 return detail::crc_update(accumulator,value,8,0x82f63b78u);
100 template<isa<arm> Arch>
requires(Arch.has(arm_feature::crc))
102 constexpr
std::uint32_t
crc32c(
std::uint32_t accumulator,
std::uint16_t value) noexcept {
103 if(__builtin_is_constant_evaluated())
return detail::crc_update(accumulator,value,16,0x82f63b78u);
104 return __crc32ch(accumulator,value);
108 template<isa<arm> Arch>
requires(!Arch.has(arm_feature::crc))
110 return detail::crc_update(accumulator,value,16,0x82f63b78u);
114 template<isa<arm> Arch>
requires(Arch.has(arm_feature::crc))
116 constexpr
std::uint32_t
crc32c(
std::uint32_t accumulator,
std::uint32_t value) noexcept {
117 if(__builtin_is_constant_evaluated())
return detail::crc_update(accumulator,value,32,0x82f63b78u);
118 return __crc32cw(accumulator,value);
122 template<isa<arm> Arch>
requires(!Arch.has(arm_feature::crc))
124 return detail::crc_update(accumulator,value,32,0x82f63b78u);
128 template<isa<arm> Arch>
requires(Arch.has(arm_feature::crc))
130 constexpr
std::uint32_t
crc32c(
std::uint32_t accumulator,
std::uint64_t value) noexcept {
131 if(__builtin_is_constant_evaluated())
return detail::crc_update(accumulator,value,64,0x82f63b78u);
132 return __crc32cd(accumulator,value);
136 template<isa<arm> Arch>
requires(!Arch.has(arm_feature::crc))
138 return detail::crc_update(accumulator,value,64,0x82f63b78u);
142 template<isa<arm> Arch,
class A,
class B>
Compiler attributes for host code, with shader-safe shared modifiers.
constexpr std::uint32_t crc32(std::uint32_t accumulator, std::uint8_t value) noexcept
Update the CRC32 accumulator with exactly 8 input bits.
#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.