/* { dg-do compile } */ | |
/* { dg-options "-fdump-tree-crc-details -w" } */ | |
/* { dg-skip-if "" { *-*-* } { "-O0" "-O1" "-Os" "-flto" } } */ | |
/* We don't detect, it's optimized to branch-less CRC. */ | |
#define CRC32_POLY_LE 0xedb88320 | |
typedef unsigned int u32; | |
u32 calc_crc(unsigned char *buf, int len) | |
{ | |
u32 reg; | |
u32 tmp; | |
int j, k; | |
reg = 0xffffffff; | |
for (j = 0; j < len; j++) { | |
reg ^= buf[j]; | |
for (k = 0; k < 8; k++) { | |
tmp = reg & 0x01; | |
reg >>= 1; | |
if (tmp) | |
reg ^= CRC32_POLY_LE; | |
} | |
} | |
return ~reg; | |
} |