/**
 * @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__ */

Jankin Cai
1 声望0 粉丝