GY-63_MS5611/libraries/Fletcher/extras/Fletcher_compare_implementations/Fletcher_overflow.h
2022-09-13 16:31:43 +02:00

45 lines
933 B
C

#pragma once
/*
Author: Daniel Mohr
Date: 2022-09-09
Here are implementations with testing for overflow instead of modulo.
*/
#define FLETCHER_64_overflow 4294967295ULL
#ifdef ARDUINO_ARCH_AVR
uint32_t fletcher32_overflow(uint16_t *data, const uint16_t length)
{
uint16_t _s1 = 0;
uint16_t _s2 = 0;
for (uint16_t i = 0; i < length; i++)
{
if (__builtin_uadd_overflow(_s1, data[i], &_s1)) {
_s1++;
}
if (__builtin_uadd_overflow(_s2, _s1, &_s2)) {
_s2++;
}
}
return (((uint32_t) _s2) << 16) | ((uint32_t) _s1);
}
#endif
uint64_t fletcher64_overflow(uint32_t *data, const uint16_t length)
{
uint32_t _s1 = 0;
uint32_t _s2 = 0;
for (uint16_t i = 0; i < length; i++)
{
if (__builtin_uaddl_overflow(_s1, data[i], &_s1)) {
_s1++;
}
if (__builtin_uaddl_overflow(_s2, _s1, &_s2)) {
_s2++;
}
}
return (((uint64_t) _s2) << 32) | ((uint64_t) _s1);
}