*/
#undef BIHASH_TYPE
+#undef BIHASH_KVP_CACHE_SIZE
+#undef BIHASH_KVP_PER_PAGE
#define BIHASH_TYPE _48_8
#define BIHASH_KVP_PER_PAGE 4
+#define BIHASH_KVP_CACHE_SIZE 0
#ifndef __included_bihash_48_8_h__
#define __included_bihash_48_8_h__
+#include <vppinfra/crc32.h>
#include <vppinfra/heap.h>
#include <vppinfra/format.h>
#include <vppinfra/pool.h>
return 0;
}
-#if __SSE4_2__
-#ifndef __defined_crc_u32__
-#define __defined_crc_u32__
-static inline u32
-crc_u32 (u32 data, u32 value)
-{
- __asm__ volatile ("crc32l %[data], %[value];":[value] "+r" (value):[data]
- "rm" (data));
- return value;
-}
-#endif /* __defined_crc_u32__ */
-
static inline u64
clib_bihash_hash_48_8 (const clib_bihash_kv_48_8_t * v)
{
- const u32 *dp = (const u32 *) &v->key[0];
- u32 value = 0;
-
- value = crc_u32 (dp[0], value);
- value = crc_u32 (dp[1], value);
- value = crc_u32 (dp[2], value);
- value = crc_u32 (dp[3], value);
- value = crc_u32 (dp[4], value);
- value = crc_u32 (dp[5], value);
- value = crc_u32 (dp[6], value);
- value = crc_u32 (dp[7], value);
- value = crc_u32 (dp[8], value);
- value = crc_u32 (dp[9], value);
- value = crc_u32 (dp[10], value);
- value = crc_u32 (dp[11], value);
-
- return value;
-}
+#ifdef clib_crc32c_uses_intrinsics
+ return clib_crc32c ((u8 *) v->key, 48);
#else
-static inline u64
-clib_bihash_hash_48_8 (const clib_bihash_kv_48_8_t * v)
-{
u64 tmp = v->key[0] ^ v->key[1] ^ v->key[2] ^ v->key[3] ^ v->key[4]
^ v->key[5];
return clib_xxhash (tmp);
-}
#endif
+}
static inline u8 *
format_bihash_kvp_48_8 (u8 * s, va_list * args)
}
static inline int
-clib_bihash_key_compare_48_8 (const u64 * a, const u64 * b)
+clib_bihash_key_compare_48_8 (u64 * a, u64 * b)
{
+#if defined (CLIB_HAVE_VEC512)
+ u64x8 v = u64x8_load_unaligned (a) ^ u64x8_load_unaligned (b);
+ return (u64x8_is_zero_mask (v) & 0x3f) == 0;
+#elif defined (CLIB_HAVE_VEC256)
+ u64x4 v;
+ v = u64x4_load_unaligned (a) ^ u64x4_load_unaligned (b);
+ v |= u64x4_load_unaligned (a + 2) ^ u64x4_load_unaligned (b + 2);
+ return u64x4_is_all_zero (v);
+#elif defined(CLIB_HAVE_VEC128) && defined(CLIB_HAVE_VEC128_UNALIGNED_LOAD_STORE)
+ u64x2 v;
+ v = u64x2_load_unaligned (a) ^ u64x2_load_unaligned (b);
+ v |= u64x2_load_unaligned (a + 2) ^ u64x2_load_unaligned (b + 2);
+ v |= u64x2_load_unaligned (a + 4) ^ u64x2_load_unaligned (b + 4);
+ return u64x2_is_all_zero (v);
+#else
return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) | (a[3] ^ b[3])
| (a[4] ^ b[4]) | (a[5] ^ b[5])) == 0;
+#endif
}
#undef __included_bihash_template_h__