native 0.0.1
Vectors, masks and wide register packs for C++26
Loading...
Searching...
No Matches
crc32c.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_X86
10#include <immintrin.h>
11#endif
12
13#if NATIVE_HOST_X86 || defined(NATIVE_DOXYGEN)
14namespace native {
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);
30 } else {
31 return _mm_crc32_u8(accumulator, value);
32 }
33 }
34
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);
41 } else {
42 return _mm_crc32_u16(accumulator, value);
43 }
44 }
45
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);
52 } else {
53 return _mm_crc32_u32(accumulator, value);
54 }
55 }
56
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);
65 } else {
66 return static_cast<std::uint32_t>(_mm_crc32_u64(accumulator, value));
67 }
68 }
69#endif
70
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 {
75 return crc32c<isa<x86>{x86_feature::crc32}>(accumulator, value);
76 }
77
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 {
82 return crc32c<isa<x86>{x86_feature::crc32}>(accumulator, value);
83 }
84
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 {
89 return crc32c<isa<x86>{x86_feature::crc32}>(accumulator, value);
90 }
91
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 {
97 return crc32c<isa<x86>{x86_feature::crc32}>(accumulator, value);
98 }
99#endif
100
102}
103#endif
Compiler attributes for host code, with shader-safe shared modifiers.
#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.