mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
45 lines
933 B
C
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);
|
|
}
|