5#include "sw/device/lib/base/crc32.h"
12#ifdef OT_PLATFORM_RV32
17 kCrc32Poly = 0xedb88320,
18 kCrc32Mu = 0xf7011641,
22static uint32_t crc32_i(uint32_t x) {
26 "clmul %[result], %[x], %[mu];"
27 "clmulr %[result], %[result], %[poly];"
29 : [result]
"=&r"(result)
30 : [x]
"r"(x), [mu]
"r"(kCrc32Mu), [poly]
"r"(kCrc32Poly));
35static uint32_t crc32_internal_add8(uint32_t ctx, uint8_t
byte) {
37 return crc32_i(ctx << 24) ^ (ctx >> 8);
41static uint32_t crc32_internal_add32(uint32_t ctx, uint32_t word) {
50 kCrc32Poly = 0xedb88320,
62static uint32_t crc32_internal_add8(uint32_t ctx, uint8_t
byte) {
64 for (
size_t i = 0; i < 8; ++i) {
75static uint32_t crc32_internal_add32(uint32_t ctx, uint32_t word) {
76 char *bytes = (
char *)&word;
77 for (
size_t i = 0; i <
sizeof(uint32_t); ++i) {
78 ctx = crc32_internal_add8(ctx, bytes[i]);
84void crc32_init(uint32_t *ctx) { *ctx = UINT32_MAX; }
86void crc32_add8(uint32_t *ctx, uint8_t
byte) {
87 *ctx = crc32_internal_add8(*ctx,
byte);
90void crc32_add32(uint32_t *ctx, uint32_t word) {
91 *ctx = crc32_internal_add32(*ctx, word);
94void crc32_add(uint32_t *ctx,
const void *buf,
size_t len) {
95 const char *data = buf;
96 uint32_t state = *ctx;
98 for (; len > 0 && (uintptr_t)data & 0x3; --len, ++data) {
99 state = crc32_internal_add8(state, *data);
102 for (; len >=
sizeof(uint32_t);
103 len -=
sizeof(uint32_t), data +=
sizeof(uint32_t)) {
104 state = crc32_internal_add32(state, read_32(data));
107 for (; len > 0; --len, ++data) {
108 state = crc32_internal_add8(state, *data);
113uint32_t crc32_finish(
const uint32_t *ctx) {
return *ctx ^ UINT32_MAX; }
115uint32_t crc32(
const void *buf,
size_t len) {
118 crc32_add(&ctx, buf, len);
119 return crc32_finish(&ctx);