diff options
Diffstat (limited to 'lib/crc32.c')
| -rw-r--r-- | lib/crc32.c | 24 | 
1 files changed, 15 insertions, 9 deletions
diff --git a/lib/crc32.c b/lib/crc32.c index bc5b936e9142..4855995fcde9 100644 --- a/lib/crc32.c +++ b/lib/crc32.c @@ -48,12 +48,20 @@ MODULE_LICENSE("GPL");  #if CRC_LE_BITS == 8 || CRC_BE_BITS == 8  static inline u32 -crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 *tab) +crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])  {  # ifdef __LITTLE_ENDIAN -#  define DO_CRC(x) crc = tab[(crc ^ (x)) & 255 ] ^ (crc >> 8) +#  define DO_CRC(x) crc = tab[0][(crc ^ (x)) & 255] ^ (crc >> 8) +#  define DO_CRC4 crc = tab[3][(crc) & 255] ^ \ +		tab[2][(crc >> 8) & 255] ^ \ +		tab[1][(crc >> 16) & 255] ^ \ +		tab[0][(crc >> 24) & 255]  # else -#  define DO_CRC(x) crc = tab[((crc >> 24) ^ (x)) & 255] ^ (crc << 8) +#  define DO_CRC(x) crc = tab[0][((crc >> 24) ^ (x)) & 255] ^ (crc << 8) +#  define DO_CRC4 crc = tab[0][(crc) & 255] ^ \ +		tab[1][(crc >> 8) & 255] ^ \ +		tab[2][(crc >> 16) & 255] ^ \ +		tab[3][(crc >> 24) & 255]  # endif  	const u32 *b;  	size_t    rem_len; @@ -70,10 +78,7 @@ crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 *tab)  	b = (const u32 *)buf;  	for (--b; len; --len) {  		crc ^= *++b; /* use pre increment for speed */ -		DO_CRC(0); -		DO_CRC(0); -		DO_CRC(0); -		DO_CRC(0); +		DO_CRC4;  	}  	len = rem_len;  	/* And the last few bytes */ @@ -85,6 +90,7 @@ crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 *tab)  	}  	return crc;  #undef DO_CRC +#undef DO_CRC4  }  #endif  /** @@ -117,7 +123,7 @@ u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)  u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)  {  # if CRC_LE_BITS == 8 -	const u32      *tab = crc32table_le; +	const u32      (*tab)[] = crc32table_le;  	crc = __cpu_to_le32(crc);  	crc = crc32_body(crc, p, len, tab); @@ -174,7 +180,7 @@ u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)  u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)  {  # if CRC_BE_BITS == 8 -	const u32      *tab = crc32table_be; +	const u32      (*tab)[] = crc32table_be;  	crc = __cpu_to_be32(crc);  	crc = crc32_body(crc, p, len, tab);  |