annotate crc32qw.c @ 0:422835bc1aca

*: checkin
author Paper <paper@tflc.us>
date Mon, 09 Feb 2026 01:15:00 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "crc32i.h"
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
2
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
3 uint32_t crc32qw_r(uint32_t crc, const unsigned char *message, size_t sz)
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
4 {
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
5 while (sz >= 4) {
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
6 union {
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
7 unsigned char b[4];
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
8 uint32_t w;
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
9 } w;
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
10
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
11 #if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
12 /* Tell GCC that we will be aliasing */
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
13 w.w = *(__attribute__((__may_alias__)) uint32_t *)message;
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
14 #else
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
15 /* ... */
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
16 w.b[0] = message[0];
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
17 w.b[1] = message[1];
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
18 w.b[2] = message[2];
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
19 w.b[3] = message[3];
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
20 #endif
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
21
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
22 crc ^= w.w;
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
23
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
24 crc = (crc >> 8) ^ crc32_tab[crc & 0xFF];
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
25 crc = (crc >> 8) ^ crc32_tab[crc & 0xFF];
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
26 crc = (crc >> 8) ^ crc32_tab[crc & 0xFF];
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
27 crc = (crc >> 8) ^ crc32_tab[crc & 0xFF];
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
28
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
29 message += 4;
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
30 sz -= 4;
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
31 }
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
32
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
33 if (!sz) return crc;
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
34
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
35 return crc32c_r(crc, message, sz);
422835bc1aca *: checkin
Paper <paper@tflc.us>
parents:
diff changeset
36 }