/**
* @Author: jankincai
* @Date: 2023-05-05 16:35:47
* @Last Modified by: jankincai
* @Last Modified time: 2023-05-09 22:58:33
*/
#undef BIHASH_TYPE
#undef BIHASH_KVP_PER_PAGE
#undef BIHASH_32_64_SVM
#undef BIHASH_ENABLE_STATS
#undef BIHASH_KVP_AT_BUCKET_LEVEL
#undef BIHASH_LAZY_INSTANTIATE
#undef BIHASH_BUCKET_PREFETCH_CACHE_LINES
#undef BIHASH_USE_HEAP
#define BIHASH_TYPE _64_16
#define BIHASH_KVP_PER_PAGE 6
#define BIHASH_KVP_AT_BUCKET_LEVEL 0
#define BIHASH_LAZY_INSTANTIATE 1
#define BIHASH_BUCKET_PREFETCH_CACHE_LINES 1
#define BIHASH_USE_HEAP 1
#ifndef __included_bihash_64_16_h__
#define __included_bihash_64_16_h__
#include <vppinfra/crc32.h>
#include <vppinfra/heap.h>
#include <vppinfra/format.h>
#include <vppinfra/pool.h>
#include <vppinfra/xxhash.h>
typedef struct
{
u64 key[8];
u64 value[2];
}clib_bihash_kv_64_16_t;
static inline int clib_bihash_is_free_64_16 (const clib_bihash_kv_64_16_t *v)
{
/* Free values are clib_memset to 0xff, check a bit... */
if (v->key[0] == ~0ULL && v->value[0] == ~0ULL)
return 1;
return 0;
}
static inline u64 clib_bihash_hash_64_16 (const clib_bihash_kv_64_16_t *v)
{
#ifdef clib_crc32c_uses_intrinsics
// 对应key[8], 8个字节,64 bit
return clib_crc32c ((u8 *) v->key, 64);
#else
u64 tmp = v->key[0] ^ v->key[1] ^ v->key[2] ^ v->key[3] ^ v->key[4] ^ v->key[5] ^ v->key[6] ^ v->key[7];
return clib_xxhash (tmp);
#endif
}
static inline u8 *format_bihash_kvp_64_16 (u8 *s, va_list *args)
{
clib_bihash_kv_64_16_t *v = va_arg (*args, clib_bihash_kv_64_16_t *);
s = format (s,
"key %llu %llu %llu %llu %llu %llu %llu %llu"
"value %llu %llu",
v->key[0], v->key[1], v->key[2], v->key[3], v->key[4], v->key[5], v->key[6], v->key[7],
v->value[0], v->value[1]);
return s;
}
static inline int clib_bihash_key_compare_64_16 (u64 *a, u64 *b)
{
#if defined (CLIB_HAVE_VEC512)
u64x8 v = u64x8_load_unaligned (a) ^ u64x8_load_unaligned (b);
// 对应key[8], 8个字节
// 0xff 根据key的大小设置,比如:key[4]: 0x0f (0000 1111), key[6]: 0x3f (0011 1111), key[8]: 0xff (1111 1111)
return (u64x8_is_zero_mask (v) & 0xff) == 0;
// 2204以上版本写法
// return u64x8_is_equal (u64x8_mask_load_zero (a, 0xff),
// u64x8_mask_load_zero (b, 0xff));
#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);
v |= u64x2_load_unaligned (a + 6) ^ u64x2_load_unaligned (b + 6);
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]) | (a[6] ^ b[6]) | (a[7] ^ b[7])) == 0;
#endif
}
#undef __included_bihash_template_h__
#include <vppinfra/bihash_template.h>
#endif /* __included_bihash_64_16_h__ */
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。