Everett
Loading...
Searching...
No Matches
crc32c.h
Go to the documentation of this file.
1
13#pragma once
14
15#include <everett/backend.h>
16
17#include <cstddef>
18#include <cstdint>
19#include <span>
20
21namespace everett {
22 // Reflected Castagnoli CRC with conventional initial/final complement.
23 // Generated kernels live in the compiled library, outside consumer BMIs.
24 std::uint32_t crc32c(std::span<std::byte const> bytes,
25 std::uint32_t previous_crc = 0) noexcept;
26 namespace crc32c_detail {
27 std::uint32_t run(simd::neon, std::span<std::byte const>, std::uint32_t) noexcept;
28 std::uint32_t run(simd::avx2, std::span<std::byte const>, std::uint32_t) noexcept;
29 std::uint32_t run(simd::avx512, std::span<std::byte const>, std::uint32_t) noexcept;
30 }
31 // Native policies link their matching compiled archive. The baseline
32 // function remains safe to call before native feature admission.
33 template <simd::architecture Arch>
34 std::uint32_t crc32c(std::span<std::byte const> bytes, std::uint32_t previous_crc = 0) noexcept {
35 if constexpr (std::same_as<Arch, simd::scalar>) return crc32c(bytes, previous_crc);
36 else return crc32c_detail::run(Arch{}, bytes, previous_crc);
37 }
38 // Combine finalized checksums without rereading either input.
39 std::uint32_t crc32c_combine(std::uint32_t first, std::uint32_t second,
40 std::uint64_t second_bytes) noexcept;
41}
Shares explicit SIMD architecture traits with Everett's kernels.
std::uint32_t run(simd::neon, std::span< std::byte const >, std::uint32_t) noexcept
Definition active_engine.h:18
std::uint32_t crc32c(std::span< std::byte const > bytes, std::uint32_t previous_crc=0) noexcept
std::uint32_t crc32c_combine(std::uint32_t first, std::uint32_t second, std::uint64_t second_bytes) noexcept