checksums-crc32c.c
text/x-csrc
#include "8x256_tables.c"
__attribute__ ((noinline)) static uint16
checksum_fast(char *page, uint32 blkno)
{
const uint8_t* p_buf = page;
uint32_t li;
uint32_t crc, term1, term2;
crc = 0xFFFFFFFF;
for(li=0; li < 4; li++) {
crc = crc_tableil8_o32[(crc ^ (blkno & 0xFF)) & 0x000000FF] ^ (crc >> 8);
blkno >>= 8;
}
for(li=0; li < PAGE_SIZE/8; li++)
{
crc ^= *(uint32_t *)p_buf;
if (li == 1)
crc ^= *(uint16_t *)p_buf;
p_buf += 4;
term1 = crc_tableil8_o88[crc & 0x000000FF] ^
crc_tableil8_o80[(crc >> 8) & 0x000000FF];
term2 = crc >> 16;
crc = term1 ^
crc_tableil8_o72[term2 & 0x000000FF] ^
crc_tableil8_o64[(term2 >> 8) & 0x000000FF];
term1 = crc_tableil8_o56[(*(uint32_t *)p_buf) & 0x000000FF] ^
crc_tableil8_o48[((*(uint32_t *)p_buf) >> 8) & 0x000000FF];
term2 = (*(uint32_t *)p_buf) >> 16;
crc = crc ^
term1 ^
crc_tableil8_o40[term2 & 0x000000FF] ^
crc_tableil8_o32[(term2 >> 8) & 0x000000FF];
p_buf += 4;
}
return (~crc) & 0xFFFF;
}
const uint32_t Polynomial = 0x82F63B78;
uint32_t crc32_bitwise(const void* data, size_t length, uint32_t previousCrc32)
{
uint32_t crc = ~previousCrc32;
unsigned char* current = (unsigned char*) data;
unsigned int j;
while (length--)
{
crc ^= *current++;
for (j = 0; j < 8; j++)
crc = (crc >> 1) ^ ((crc & 1) * Polynomial);
}
return ~crc; // same as crc ^ 0xFFFFFFFF
}
__attribute__((noinline))
static uint16
checksum_c(void *page, uint32_t blkno)
{
uint32_t crc = 0;
uint16_t pd_checksum = 0;
crc = crc32_bitwise(&blkno, 4, crc);
crc = crc32_bitwise(page, 8, crc);
crc = crc32_bitwise(&pd_checksum, 2, crc);
crc = crc32_bitwise(page+10, PAGE_SIZE-10, crc);
return crc & 0xFFFF;
}