numam-dpdk/lib/table/rte_table_hash_func.h
Bruce Richardson 99a2dd955f lib: remove librte_ prefix from directory names
There is no reason for the DPDK libraries to all have 'librte_' prefix on
the directory names. This prefix makes the directory names longer and also
makes it awkward to add features referring to individual libraries in the
build - should the lib names be specified with or without the prefix.
Therefore, we can just remove the library prefix and use the library's
unique name as the directory name, i.e. 'eal' rather than 'librte_eal'

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
2021-04-21 14:04:09 +02:00

255 lines
4.8 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2010-2018 Intel Corporation
*/
#ifndef __INCLUDE_RTE_TABLE_HASH_FUNC_H__
#define __INCLUDE_RTE_TABLE_HASH_FUNC_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <rte_compat.h>
#include <rte_common.h>
__rte_experimental
static inline uint64_t
rte_crc32_u64_generic(uint64_t crc, uint64_t value)
{
int i;
crc = (crc & 0xFFFFFFFFLLU) ^ value;
for (i = 63; i >= 0; i--) {
uint64_t mask;
mask = -(crc & 1LLU);
crc = (crc >> 1LLU) ^ (0x82F63B78LLU & mask);
}
return crc;
}
#if defined(RTE_ARCH_X86_64)
#include <x86intrin.h>
static inline uint64_t
rte_crc32_u64(uint64_t crc, uint64_t v)
{
return _mm_crc32_u64(crc, v);
}
#elif defined(RTE_ARCH_ARM64) && defined(__ARM_FEATURE_CRC32)
#include "rte_table_hash_func_arm64.h"
#else
static inline uint64_t
rte_crc32_u64(uint64_t crc, uint64_t v)
{
return rte_crc32_u64_generic(crc, v);
}
#endif
__rte_experimental
static inline uint64_t
rte_table_hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
uint64_t seed)
{
uint64_t *k = key;
uint64_t *m = mask;
uint64_t crc0;
crc0 = rte_crc32_u64(seed, k[0] & m[0]);
return crc0;
}
__rte_experimental
static inline uint64_t
rte_table_hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
uint64_t seed)
{
uint64_t *k = key;
uint64_t *m = mask;
uint64_t k0, crc0, crc1;
k0 = k[0] & m[0];
crc0 = rte_crc32_u64(k0, seed);
crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
crc0 ^= crc1;
return crc0;
}
__rte_experimental
static inline uint64_t
rte_table_hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
uint64_t seed)
{
uint64_t *k = key;
uint64_t *m = mask;
uint64_t k0, k2, crc0, crc1;
k0 = k[0] & m[0];
k2 = k[2] & m[2];
crc0 = rte_crc32_u64(k0, seed);
crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
crc0 = rte_crc32_u64(crc0, k2);
crc0 ^= crc1;
return crc0;
}
__rte_experimental
static inline uint64_t
rte_table_hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
uint64_t seed)
{
uint64_t *k = key;
uint64_t *m = mask;
uint64_t k0, k2, crc0, crc1, crc2, crc3;
k0 = k[0] & m[0];
k2 = k[2] & m[2];
crc0 = rte_crc32_u64(k0, seed);
crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
crc2 = rte_crc32_u64(k2, k[3] & m[3]);
crc3 = k2 >> 32;
crc0 = rte_crc32_u64(crc0, crc1);
crc1 = rte_crc32_u64(crc2, crc3);
crc0 ^= crc1;
return crc0;
}
__rte_experimental
static inline uint64_t
rte_table_hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
uint64_t seed)
{
uint64_t *k = key;
uint64_t *m = mask;
uint64_t k0, k2, crc0, crc1, crc2, crc3;
k0 = k[0] & m[0];
k2 = k[2] & m[2];
crc0 = rte_crc32_u64(k0, seed);
crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
crc2 = rte_crc32_u64(k2, k[3] & m[3]);
crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]);
crc0 = rte_crc32_u64(crc0, crc1);
crc1 = rte_crc32_u64(crc2, crc3);
crc0 ^= crc1;
return crc0;
}
__rte_experimental
static inline uint64_t
rte_table_hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
uint64_t seed)
{
uint64_t *k = key;
uint64_t *m = mask;
uint64_t k0, k2, k5, crc0, crc1, crc2, crc3;
k0 = k[0] & m[0];
k2 = k[2] & m[2];
k5 = k[5] & m[5];
crc0 = rte_crc32_u64(k0, seed);
crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
crc2 = rte_crc32_u64(k2, k[3] & m[3]);
crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]);
crc0 = rte_crc32_u64(crc0, (crc1 << 32) ^ crc2);
crc1 = rte_crc32_u64(crc3, k5);
crc0 ^= crc1;
return crc0;
}
__rte_experimental
static inline uint64_t
rte_table_hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
uint64_t seed)
{
uint64_t *k = key;
uint64_t *m = mask;
uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
k0 = k[0] & m[0];
k2 = k[2] & m[2];
k5 = k[5] & m[5];
crc0 = rte_crc32_u64(k0, seed);
crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
crc2 = rte_crc32_u64(k2, k[3] & m[3]);
crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]);
crc4 = rte_crc32_u64(k5, k[6] & m[6]);
crc5 = k5 >> 32;
crc0 = rte_crc32_u64(crc0, (crc1 << 32) ^ crc2);
crc1 = rte_crc32_u64(crc3, (crc4 << 32) ^ crc5);
crc0 ^= crc1;
return crc0;
}
__rte_experimental
static inline uint64_t
rte_table_hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
uint64_t seed)
{
uint64_t *k = key;
uint64_t *m = mask;
uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
k0 = k[0] & m[0];
k2 = k[2] & m[2];
k5 = k[5] & m[5];
crc0 = rte_crc32_u64(k0, seed);
crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]);
crc2 = rte_crc32_u64(k2, k[3] & m[3]);
crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]);
crc4 = rte_crc32_u64(k5, k[6] & m[6]);
crc5 = rte_crc32_u64(k5 >> 32, k[7] & m[7]);
crc0 = rte_crc32_u64(crc0, (crc1 << 32) ^ crc2);
crc1 = rte_crc32_u64(crc3, (crc4 << 32) ^ crc5);
crc0 ^= crc1;
return crc0;
}
#ifdef __cplusplus
}
#endif
#endif