| 2 | #include "sb8.h" |
| 3 | |
| 4 | uint32_t crc32c(const uint8_t* buf, uint32_t sz) |
| 5 | { |
| 6 | uint32_t crc = 0; |
| 7 | /* Process misaligned data byte at a time */ |
| 8 | intptr_t misaligned = (intptr_t)buf & (sizeof(intptr_t) - 1); |
| 9 | unsigned adj = misaligned ? sizeof(intptr_t) - misaligned : 0; |
| 10 | if (adj > sz) adj = sz; |
| 11 | int i = 0; |
| 12 | switch (adj) { |
| 13 | case 7: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i; |
| 14 | case 6: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i; |
| 15 | case 5: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i; |
| 16 | case 4: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i; |
| 17 | case 3: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i; |
| 18 | case 2: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i; |
| 19 | case 1: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i; |
| 20 | sz -= adj; |
| 21 | buf += i; |
| 22 | } |
| 23 | /* Process 8 bytes at a time */ |
| 24 | const uint8_t *end = buf + (sz & (~0x7)); |
| 25 | while (buf < end) { |
| 26 | // read two little endian ints |
| 27 | uint32_t u32a, u32b; |
| 28 | u32a = (buf[0]<<0) | (buf[1]<<8) | (buf[2]<<16) | (buf[3]<<24); |
| 29 | buf += 4; |
| 30 | u32b = (buf[0]<<0) | (buf[1]<<8) | (buf[2]<<16) | (buf[3]<<24); |
| 31 | buf += 4; |
| 32 | crc ^= u32a; |
| 33 | uint32_t term1 = crc_tableil8_o88[crc & 0x000000FF] ^ crc_tableil8_o80[(crc >> 8) & 0x000000FF]; |
| 34 | uint32_t term2 = crc >> 16; |
| 35 | crc = term1 ^ crc_tableil8_o72[term2 & 0x000000FF] ^ crc_tableil8_o64[(term2 >> 8) & 0x000000FF]; |
| 36 | term1 = crc_tableil8_o56[u32b & 0x000000FF] ^ crc_tableil8_o48[(u32b >> 8) & 0x000000FF]; |
| 37 | term2 = u32b >> 16; |
| 38 | crc = crc ^ term1 ^ crc_tableil8_o40[term2 & 0x000000FF] ^ crc_tableil8_o32[(term2 >> 8) & 0x000000FF]; |
| 39 | } |
| 40 | /* Process the last 7 (or less) bytes */ |
| 41 | sz &= 0x7; |
| 42 | i = 0; |
| 43 | switch (sz) { |
| 44 | case 7: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i; |
| 45 | case 6: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i; |
| 46 | case 5: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i; |
| 47 | case 4: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i; |
| 48 | case 3: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i; |
| 49 | case 2: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i; |
| 50 | case 1: crc = crc_tableil8_o32[(crc ^ buf[i]) & 0x000000FF] ^ (crc >> 8); ++i; |
| 51 | } |
| 52 | return crc; |
| 53 | } |
| 54 | |
| 55 | uint32_t __ham_func4(const uint8_t *k, uint32_t len) |
| 56 | { |
no outgoing calls