1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause 2d30ea906Sjfb8856606 * Copyright(c) 2010-2018 Intel Corporation 3d30ea906Sjfb8856606 */ 4d30ea906Sjfb8856606 5d30ea906Sjfb8856606 #ifndef __INCLUDE_RTE_TABLE_HASH_FUNC_H__ 6d30ea906Sjfb8856606 #define __INCLUDE_RTE_TABLE_HASH_FUNC_H__ 7d30ea906Sjfb8856606 8d30ea906Sjfb8856606 #ifdef __cplusplus 9d30ea906Sjfb8856606 extern "C" { 10d30ea906Sjfb8856606 #endif 11d30ea906Sjfb8856606 12d30ea906Sjfb8856606 #include <stdint.h> 13d30ea906Sjfb8856606 14d30ea906Sjfb8856606 #include <rte_compat.h> 15d30ea906Sjfb8856606 #include <rte_common.h> 16d30ea906Sjfb8856606 17*4418919fSjohnjiang __rte_experimental 18*4418919fSjohnjiang static inline uint64_t 19d30ea906Sjfb8856606 rte_crc32_u64_generic(uint64_t crc, uint64_t value) 20d30ea906Sjfb8856606 { 21d30ea906Sjfb8856606 int i; 22d30ea906Sjfb8856606 23d30ea906Sjfb8856606 crc = (crc & 0xFFFFFFFFLLU) ^ value; 24d30ea906Sjfb8856606 for (i = 63; i >= 0; i--) { 25d30ea906Sjfb8856606 uint64_t mask; 26d30ea906Sjfb8856606 27d30ea906Sjfb8856606 mask = -(crc & 1LLU); 28d30ea906Sjfb8856606 crc = (crc >> 1LLU) ^ (0x82F63B78LLU & mask); 29d30ea906Sjfb8856606 } 30d30ea906Sjfb8856606 31d30ea906Sjfb8856606 return crc; 32d30ea906Sjfb8856606 } 33d30ea906Sjfb8856606 34d30ea906Sjfb8856606 #if defined(RTE_ARCH_X86_64) 35d30ea906Sjfb8856606 36d30ea906Sjfb8856606 #include <x86intrin.h> 37d30ea906Sjfb8856606 38d30ea906Sjfb8856606 static inline uint64_t 39d30ea906Sjfb8856606 rte_crc32_u64(uint64_t crc, uint64_t v) 40d30ea906Sjfb8856606 { 41d30ea906Sjfb8856606 return _mm_crc32_u64(crc, v); 42d30ea906Sjfb8856606 } 43d30ea906Sjfb8856606 441646932aSjfb8856606 #elif defined(RTE_ARCH_ARM64) && defined(RTE_MACHINE_CPUFLAG_CRC32) 45d30ea906Sjfb8856606 #include "rte_table_hash_func_arm64.h" 46d30ea906Sjfb8856606 #else 47d30ea906Sjfb8856606 48d30ea906Sjfb8856606 static inline uint64_t 49d30ea906Sjfb8856606 rte_crc32_u64(uint64_t crc, uint64_t v) 50d30ea906Sjfb8856606 { 51d30ea906Sjfb8856606 return rte_crc32_u64_generic(crc, v); 52d30ea906Sjfb8856606 } 53d30ea906Sjfb8856606 54d30ea906Sjfb8856606 #endif 55d30ea906Sjfb8856606 56*4418919fSjohnjiang __rte_experimental 57*4418919fSjohnjiang static inline uint64_t 58d30ea906Sjfb8856606 rte_table_hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size, 59d30ea906Sjfb8856606 uint64_t seed) 60d30ea906Sjfb8856606 { 61d30ea906Sjfb8856606 uint64_t *k = key; 62d30ea906Sjfb8856606 uint64_t *m = mask; 63d30ea906Sjfb8856606 uint64_t crc0; 64d30ea906Sjfb8856606 65d30ea906Sjfb8856606 crc0 = rte_crc32_u64(seed, k[0] & m[0]); 66d30ea906Sjfb8856606 67d30ea906Sjfb8856606 return crc0; 68d30ea906Sjfb8856606 } 69d30ea906Sjfb8856606 70*4418919fSjohnjiang __rte_experimental 71*4418919fSjohnjiang static inline uint64_t 72d30ea906Sjfb8856606 rte_table_hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size, 73d30ea906Sjfb8856606 uint64_t seed) 74d30ea906Sjfb8856606 { 75d30ea906Sjfb8856606 uint64_t *k = key; 76d30ea906Sjfb8856606 uint64_t *m = mask; 77d30ea906Sjfb8856606 uint64_t k0, crc0, crc1; 78d30ea906Sjfb8856606 79d30ea906Sjfb8856606 k0 = k[0] & m[0]; 80d30ea906Sjfb8856606 81d30ea906Sjfb8856606 crc0 = rte_crc32_u64(k0, seed); 82d30ea906Sjfb8856606 crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]); 83d30ea906Sjfb8856606 84d30ea906Sjfb8856606 crc0 ^= crc1; 85d30ea906Sjfb8856606 86d30ea906Sjfb8856606 return crc0; 87d30ea906Sjfb8856606 } 88d30ea906Sjfb8856606 89*4418919fSjohnjiang __rte_experimental 90*4418919fSjohnjiang static inline uint64_t 91d30ea906Sjfb8856606 rte_table_hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size, 92d30ea906Sjfb8856606 uint64_t seed) 93d30ea906Sjfb8856606 { 94d30ea906Sjfb8856606 uint64_t *k = key; 95d30ea906Sjfb8856606 uint64_t *m = mask; 96d30ea906Sjfb8856606 uint64_t k0, k2, crc0, crc1; 97d30ea906Sjfb8856606 98d30ea906Sjfb8856606 k0 = k[0] & m[0]; 99d30ea906Sjfb8856606 k2 = k[2] & m[2]; 100d30ea906Sjfb8856606 101d30ea906Sjfb8856606 crc0 = rte_crc32_u64(k0, seed); 102d30ea906Sjfb8856606 crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]); 103d30ea906Sjfb8856606 104d30ea906Sjfb8856606 crc0 = rte_crc32_u64(crc0, k2); 105d30ea906Sjfb8856606 106d30ea906Sjfb8856606 crc0 ^= crc1; 107d30ea906Sjfb8856606 108d30ea906Sjfb8856606 return crc0; 109d30ea906Sjfb8856606 } 110d30ea906Sjfb8856606 111*4418919fSjohnjiang __rte_experimental 112*4418919fSjohnjiang static inline uint64_t 113d30ea906Sjfb8856606 rte_table_hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size, 114d30ea906Sjfb8856606 uint64_t seed) 115d30ea906Sjfb8856606 { 116d30ea906Sjfb8856606 uint64_t *k = key; 117d30ea906Sjfb8856606 uint64_t *m = mask; 118d30ea906Sjfb8856606 uint64_t k0, k2, crc0, crc1, crc2, crc3; 119d30ea906Sjfb8856606 120d30ea906Sjfb8856606 k0 = k[0] & m[0]; 121d30ea906Sjfb8856606 k2 = k[2] & m[2]; 122d30ea906Sjfb8856606 123d30ea906Sjfb8856606 crc0 = rte_crc32_u64(k0, seed); 124d30ea906Sjfb8856606 crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]); 125d30ea906Sjfb8856606 126d30ea906Sjfb8856606 crc2 = rte_crc32_u64(k2, k[3] & m[3]); 127d30ea906Sjfb8856606 crc3 = k2 >> 32; 128d30ea906Sjfb8856606 129d30ea906Sjfb8856606 crc0 = rte_crc32_u64(crc0, crc1); 130d30ea906Sjfb8856606 crc1 = rte_crc32_u64(crc2, crc3); 131d30ea906Sjfb8856606 132d30ea906Sjfb8856606 crc0 ^= crc1; 133d30ea906Sjfb8856606 134d30ea906Sjfb8856606 return crc0; 135d30ea906Sjfb8856606 } 136d30ea906Sjfb8856606 137*4418919fSjohnjiang __rte_experimental 138*4418919fSjohnjiang static inline uint64_t 139d30ea906Sjfb8856606 rte_table_hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size, 140d30ea906Sjfb8856606 uint64_t seed) 141d30ea906Sjfb8856606 { 142d30ea906Sjfb8856606 uint64_t *k = key; 143d30ea906Sjfb8856606 uint64_t *m = mask; 144d30ea906Sjfb8856606 uint64_t k0, k2, crc0, crc1, crc2, crc3; 145d30ea906Sjfb8856606 146d30ea906Sjfb8856606 k0 = k[0] & m[0]; 147d30ea906Sjfb8856606 k2 = k[2] & m[2]; 148d30ea906Sjfb8856606 149d30ea906Sjfb8856606 crc0 = rte_crc32_u64(k0, seed); 150d30ea906Sjfb8856606 crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]); 151d30ea906Sjfb8856606 152d30ea906Sjfb8856606 crc2 = rte_crc32_u64(k2, k[3] & m[3]); 153d30ea906Sjfb8856606 crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]); 154d30ea906Sjfb8856606 155d30ea906Sjfb8856606 crc0 = rte_crc32_u64(crc0, crc1); 156d30ea906Sjfb8856606 crc1 = rte_crc32_u64(crc2, crc3); 157d30ea906Sjfb8856606 158d30ea906Sjfb8856606 crc0 ^= crc1; 159d30ea906Sjfb8856606 160d30ea906Sjfb8856606 return crc0; 161d30ea906Sjfb8856606 } 162d30ea906Sjfb8856606 163*4418919fSjohnjiang __rte_experimental 164*4418919fSjohnjiang static inline uint64_t 165d30ea906Sjfb8856606 rte_table_hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size, 166d30ea906Sjfb8856606 uint64_t seed) 167d30ea906Sjfb8856606 { 168d30ea906Sjfb8856606 uint64_t *k = key; 169d30ea906Sjfb8856606 uint64_t *m = mask; 170d30ea906Sjfb8856606 uint64_t k0, k2, k5, crc0, crc1, crc2, crc3; 171d30ea906Sjfb8856606 172d30ea906Sjfb8856606 k0 = k[0] & m[0]; 173d30ea906Sjfb8856606 k2 = k[2] & m[2]; 174d30ea906Sjfb8856606 k5 = k[5] & m[5]; 175d30ea906Sjfb8856606 176d30ea906Sjfb8856606 crc0 = rte_crc32_u64(k0, seed); 177d30ea906Sjfb8856606 crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]); 178d30ea906Sjfb8856606 179d30ea906Sjfb8856606 crc2 = rte_crc32_u64(k2, k[3] & m[3]); 180d30ea906Sjfb8856606 crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]); 181d30ea906Sjfb8856606 182d30ea906Sjfb8856606 crc0 = rte_crc32_u64(crc0, (crc1 << 32) ^ crc2); 183d30ea906Sjfb8856606 crc1 = rte_crc32_u64(crc3, k5); 184d30ea906Sjfb8856606 185d30ea906Sjfb8856606 crc0 ^= crc1; 186d30ea906Sjfb8856606 187d30ea906Sjfb8856606 return crc0; 188d30ea906Sjfb8856606 } 189d30ea906Sjfb8856606 190*4418919fSjohnjiang __rte_experimental 191*4418919fSjohnjiang static inline uint64_t 192d30ea906Sjfb8856606 rte_table_hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size, 193d30ea906Sjfb8856606 uint64_t seed) 194d30ea906Sjfb8856606 { 195d30ea906Sjfb8856606 uint64_t *k = key; 196d30ea906Sjfb8856606 uint64_t *m = mask; 197d30ea906Sjfb8856606 uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5; 198d30ea906Sjfb8856606 199d30ea906Sjfb8856606 k0 = k[0] & m[0]; 200d30ea906Sjfb8856606 k2 = k[2] & m[2]; 201d30ea906Sjfb8856606 k5 = k[5] & m[5]; 202d30ea906Sjfb8856606 203d30ea906Sjfb8856606 crc0 = rte_crc32_u64(k0, seed); 204d30ea906Sjfb8856606 crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]); 205d30ea906Sjfb8856606 206d30ea906Sjfb8856606 crc2 = rte_crc32_u64(k2, k[3] & m[3]); 207d30ea906Sjfb8856606 crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]); 208d30ea906Sjfb8856606 209d30ea906Sjfb8856606 crc4 = rte_crc32_u64(k5, k[6] & m[6]); 210d30ea906Sjfb8856606 crc5 = k5 >> 32; 211d30ea906Sjfb8856606 212d30ea906Sjfb8856606 crc0 = rte_crc32_u64(crc0, (crc1 << 32) ^ crc2); 213d30ea906Sjfb8856606 crc1 = rte_crc32_u64(crc3, (crc4 << 32) ^ crc5); 214d30ea906Sjfb8856606 215d30ea906Sjfb8856606 crc0 ^= crc1; 216d30ea906Sjfb8856606 217d30ea906Sjfb8856606 return crc0; 218d30ea906Sjfb8856606 } 219d30ea906Sjfb8856606 220*4418919fSjohnjiang __rte_experimental 221*4418919fSjohnjiang static inline uint64_t 222d30ea906Sjfb8856606 rte_table_hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size, 223d30ea906Sjfb8856606 uint64_t seed) 224d30ea906Sjfb8856606 { 225d30ea906Sjfb8856606 uint64_t *k = key; 226d30ea906Sjfb8856606 uint64_t *m = mask; 227d30ea906Sjfb8856606 uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5; 228d30ea906Sjfb8856606 229d30ea906Sjfb8856606 k0 = k[0] & m[0]; 230d30ea906Sjfb8856606 k2 = k[2] & m[2]; 231d30ea906Sjfb8856606 k5 = k[5] & m[5]; 232d30ea906Sjfb8856606 233d30ea906Sjfb8856606 crc0 = rte_crc32_u64(k0, seed); 234d30ea906Sjfb8856606 crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]); 235d30ea906Sjfb8856606 236d30ea906Sjfb8856606 crc2 = rte_crc32_u64(k2, k[3] & m[3]); 237d30ea906Sjfb8856606 crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]); 238d30ea906Sjfb8856606 239d30ea906Sjfb8856606 crc4 = rte_crc32_u64(k5, k[6] & m[6]); 240d30ea906Sjfb8856606 crc5 = rte_crc32_u64(k5 >> 32, k[7] & m[7]); 241d30ea906Sjfb8856606 242d30ea906Sjfb8856606 crc0 = rte_crc32_u64(crc0, (crc1 << 32) ^ crc2); 243d30ea906Sjfb8856606 crc1 = rte_crc32_u64(crc3, (crc4 << 32) ^ crc5); 244d30ea906Sjfb8856606 245d30ea906Sjfb8856606 crc0 ^= crc1; 246d30ea906Sjfb8856606 247d30ea906Sjfb8856606 return crc0; 248d30ea906Sjfb8856606 } 249d30ea906Sjfb8856606 250d30ea906Sjfb8856606 #ifdef __cplusplus 251d30ea906Sjfb8856606 } 252d30ea906Sjfb8856606 #endif 253d30ea906Sjfb8856606 254d30ea906Sjfb8856606 #endif 255