Mercurial > crc32
diff crc32qw.c @ 0:422835bc1aca
*: checkin
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 09 Feb 2026 01:15:00 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/crc32qw.c Mon Feb 09 01:15:00 2026 -0500 @@ -0,0 +1,36 @@ +#include "crc32i.h" + +uint32_t crc32qw_r(uint32_t crc, const unsigned char *message, size_t sz) +{ + while (sz >= 4) { + union { + unsigned char b[4]; + uint32_t w; + } w; + +#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) + /* Tell GCC that we will be aliasing */ + w.w = *(__attribute__((__may_alias__)) uint32_t *)message; +#else + /* ... */ + w.b[0] = message[0]; + w.b[1] = message[1]; + w.b[2] = message[2]; + w.b[3] = message[3]; +#endif + + crc ^= w.w; + + crc = (crc >> 8) ^ crc32_tab[crc & 0xFF]; + crc = (crc >> 8) ^ crc32_tab[crc & 0xFF]; + crc = (crc >> 8) ^ crc32_tab[crc & 0xFF]; + crc = (crc >> 8) ^ crc32_tab[crc & 0xFF]; + + message += 4; + sz -= 4; + } + + if (!sz) return crc; + + return crc32c_r(crc, message, sz); +}
