native 0.0.1
Vectors, masks and wide register packs for C++26
Loading...
Searching...
No Matches
crc.h
1// SPDX-FileCopyrightText: 2026 Edward Kmett <ekmett@gmail.com>
2// SPDX-License-Identifier: BSD-2-Clause OR Apache-2.0
3#pragma once
4#include "native/config.h"
5#include "native/attributes.h"
6#include "native/isa.h"
7#include "native/detail/crc.h"
8#include <cstdint>
9#if NATIVE_HOST_NEON
10#include <arm_acle.h>
11#endif
12
13#if NATIVE_HOST_NEON || defined(NATIVE_DOXYGEN)
14namespace native {
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);
31 }
32
34 template<isa<arm> Arch> requires(!Arch.has(arm_feature::crc))
35 native_nodiscard consteval std::uint32_t crc32(std::uint32_t accumulator, std::uint8_t value) noexcept {
36 return detail::crc_update(accumulator,value,8,0xedb88320u);
37 }
38
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);
45 }
46
48 template<isa<arm> Arch> requires(!Arch.has(arm_feature::crc))
49 native_nodiscard consteval std::uint32_t crc32(std::uint32_t accumulator, std::uint16_t value) noexcept {
50 return detail::crc_update(accumulator,value,16,0xedb88320u);
51 }
52
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);
59 }
60
62 template<isa<arm> Arch> requires(!Arch.has(arm_feature::crc))
63 native_nodiscard consteval std::uint32_t crc32(std::uint32_t accumulator, std::uint32_t value) noexcept {
64 return detail::crc_update(accumulator,value,32,0xedb88320u);
65 }
66
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);
73 }
74
76 template<isa<arm> Arch> requires(!Arch.has(arm_feature::crc))
77 native_nodiscard consteval std::uint32_t crc32(std::uint32_t accumulator, std::uint64_t value) noexcept {
78 return detail::crc_update(accumulator,value,64,0xedb88320u);
79 }
80
82 template<isa<arm> Arch, class A, class B>
83 void crc32(A, B) = delete;
84
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);
91 }
92
94 template<isa<arm> Arch> requires(!Arch.has(arm_feature::crc))
95 native_nodiscard consteval std::uint32_t crc32c(std::uint32_t accumulator, std::uint8_t value) noexcept {
96 return detail::crc_update(accumulator,value,8,0x82f63b78u);
97 }
98
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);
105 }
106
108 template<isa<arm> Arch> requires(!Arch.has(arm_feature::crc))
109 native_nodiscard consteval std::uint32_t crc32c(std::uint32_t accumulator, std::uint16_t value) noexcept {
110 return detail::crc_update(accumulator,value,16,0x82f63b78u);
111 }
112
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);
119 }
120
122 template<isa<arm> Arch> requires(!Arch.has(arm_feature::crc))
123 native_nodiscard consteval std::uint32_t crc32c(std::uint32_t accumulator, std::uint32_t value) noexcept {
124 return detail::crc_update(accumulator,value,32,0x82f63b78u);
125 }
126
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);
133 }
134
136 template<isa<arm> Arch> requires(!Arch.has(arm_feature::crc))
137 native_nodiscard consteval std::uint32_t crc32c(std::uint32_t accumulator, std::uint64_t value) noexcept {
138 return detail::crc_update(accumulator,value,64,0x82f63b78u);
139 }
140
142 template<isa<arm> Arch, class A, class B>
143 void crc32c(A, B) = delete;
144
146}
147#endif
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.
Definition crc.h:28
#define native_inline
inline [[always_inline]]
Definition attributes.h:212
#define native_nodiscard
C++17 [[nodiscard]].
Definition attributes.h:189
#define native_const
[[const]] is not const
Definition attributes.h:108
#define native_target(x)
this indicates a required feature set for the current multiversioned function.
Definition attributes.h:476
constexpr std::uint32_t crc32c(std::uint32_t accumulator, std::uint8_t value) noexcept
Update a 32-bit CRC32C accumulator with exactly eight bits.
Definition crc32c.h:27
Architecture-tagged vectors, register packs and supporting value types. Native arithmetic follows its...
Standard-library adaptations documented here for SIMD value types.