X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Fcrc32.h;h=fec67cd9757fbfe478b8d6736b901ae650800354;hb=refs%2Fchanges%2F22%2F26422%2F2;hp=abb2953fb4de79a3c2b1ca8b6d5532cf8a2ec648;hpb=0f68c79a9d8533d492c8221f924b14cf4e222136;p=vpp.git diff --git a/src/vppinfra/crc32.h b/src/vppinfra/crc32.h index abb2953fb4d..fec67cd9757 100644 --- a/src/vppinfra/crc32.h +++ b/src/vppinfra/crc32.h @@ -16,21 +16,29 @@ #ifndef __included_crc32_h__ #define __included_crc32_h__ +#include + #if __SSE4_2__ +#define clib_crc32c_uses_intrinsics #include +#define crc32_u64 _mm_crc32_u64 +#define crc32_u32 _mm_crc32_u32 + static_always_inline u32 clib_crc32c (u8 * s, int len) { u32 v = 0; -#if __x86_64__ +#if defined(__x86_64__) for (; len >= 8; len -= 8, s += 8) v = _mm_crc32_u64 (v, *((u64 *) s)); #else /* workaround weird GCC bug when using _mm_crc32_u32 which happens with -O2 optimization */ - volatile ("":::"memory"); +#if !defined (__i686__) + asm volatile ("":::"memory"); +#endif #endif for (; len >= 4; len -= 4, s += 4) @@ -45,8 +53,35 @@ clib_crc32c (u8 * s, int len) return v; } -#endif +#elif __ARM_FEATURE_CRC32 +#define clib_crc32c_uses_intrinsics +#include + + +#define crc32_u64 __crc32cd +#define crc32_u32 __crc32cw +static_always_inline u32 +clib_crc32c (u8 * s, int len) +{ + u32 v = 0; + + for (; len >= 8; len -= 8, s += 8) + v = __crc32cd (v, *((u64 *) s)); + + for (; len >= 4; len -= 4, s += 4) + v = __crc32cw (v, *((u32 *) s)); + + for (; len >= 2; len -= 2, s += 2) + v = __crc32ch (v, *((u16 *) s)); + + for (; len >= 1; len -= 1, s += 1) + v = __crc32cb (v, *((u8 *) s)); + + return v; +} + +#endif #endif /* __included_crc32_h__ */ /*