1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2015 Intel Corporation
4 #ifndef __INCLUDE_HASH_FUNC_H__
5 #define __INCLUDE_HASH_FUNC_H__
8 hash_xor_key8(void *key, void *mask, __rte_unused uint32_t key_size,
15 xor0 = seed ^ (k[0] & m[0]);
17 return (xor0 >> 32) ^ xor0;
20 static inline uint64_t
21 hash_xor_key16(void *key, void *mask, __rte_unused uint32_t key_size,
28 xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
30 return (xor0 >> 32) ^ xor0;
33 static inline uint64_t
34 hash_xor_key24(void *key, void *mask, __rte_unused uint32_t key_size,
41 xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
45 return (xor0 >> 32) ^ xor0;
48 static inline uint64_t
49 hash_xor_key32(void *key, void *mask, __rte_unused uint32_t key_size,
56 xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
57 xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
61 return (xor0 >> 32) ^ xor0;
64 static inline uint64_t
65 hash_xor_key40(void *key, void *mask, __rte_unused uint32_t key_size,
72 xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
73 xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
79 return (xor0 >> 32) ^ xor0;
82 static inline uint64_t
83 hash_xor_key48(void *key, void *mask, __rte_unused uint32_t key_size,
88 uint64_t xor0, xor1, xor2;
90 xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
91 xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
92 xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
98 return (xor0 >> 32) ^ xor0;
101 static inline uint64_t
102 hash_xor_key56(void *key, void *mask, __rte_unused uint32_t key_size,
107 uint64_t xor0, xor1, xor2;
109 xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
110 xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
111 xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
118 return (xor0 >> 32) ^ xor0;
121 static inline uint64_t
122 hash_xor_key64(void *key, void *mask, __rte_unused uint32_t key_size,
127 uint64_t xor0, xor1, xor2, xor3;
129 xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
130 xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
131 xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
132 xor3 = (k[6] & m[6]) ^ (k[7] & m[7]);
139 return (xor0 >> 32) ^ xor0;
142 #if defined(RTE_ARCH_X86_64)
144 #include <x86intrin.h>
146 static inline uint64_t
147 hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
154 crc0 = _mm_crc32_u64(seed, k[0] & m[0]);
159 static inline uint64_t
160 hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
165 uint64_t k0, crc0, crc1;
169 crc0 = _mm_crc32_u64(k0, seed);
170 crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
177 static inline uint64_t
178 hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
183 uint64_t k0, k2, crc0, crc1;
188 crc0 = _mm_crc32_u64(k0, seed);
189 crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
191 crc0 = _mm_crc32_u64(crc0, k2);
198 static inline uint64_t
199 hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
204 uint64_t k0, k2, crc0, crc1, crc2, crc3;
209 crc0 = _mm_crc32_u64(k0, seed);
210 crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
212 crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
215 crc0 = _mm_crc32_u64(crc0, crc1);
216 crc1 = _mm_crc32_u64(crc2, crc3);
223 static inline uint64_t
224 hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
229 uint64_t k0, k2, crc0, crc1, crc2, crc3;
234 crc0 = _mm_crc32_u64(k0, seed);
235 crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
237 crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
238 crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
240 crc0 = _mm_crc32_u64(crc0, crc1);
241 crc1 = _mm_crc32_u64(crc2, crc3);
248 static inline uint64_t
249 hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
254 uint64_t k0, k2, k5, crc0, crc1, crc2, crc3;
260 crc0 = _mm_crc32_u64(k0, seed);
261 crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
263 crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
264 crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
266 crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
267 crc1 = _mm_crc32_u64(crc3, k5);
274 static inline uint64_t
275 hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
280 uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
286 crc0 = _mm_crc32_u64(k0, seed);
287 crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
289 crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
290 crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
292 crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
295 crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
296 crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
303 static inline uint64_t
304 hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
309 uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
315 crc0 = _mm_crc32_u64(k0, seed);
316 crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
318 crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
319 crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
321 crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
322 crc5 = _mm_crc32_u64(k5 >> 32, k[7] & m[7]);
324 crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
325 crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
332 #define hash_default_key8 hash_crc_key8
333 #define hash_default_key16 hash_crc_key16
334 #define hash_default_key24 hash_crc_key24
335 #define hash_default_key32 hash_crc_key32
336 #define hash_default_key40 hash_crc_key40
337 #define hash_default_key48 hash_crc_key48
338 #define hash_default_key56 hash_crc_key56
339 #define hash_default_key64 hash_crc_key64
341 #elif defined(RTE_ARCH_ARM64)
342 #include "hash_func_arm64.h"
345 #define hash_default_key8 hash_xor_key8
346 #define hash_default_key16 hash_xor_key16
347 #define hash_default_key24 hash_xor_key24
348 #define hash_default_key32 hash_xor_key32
349 #define hash_default_key40 hash_xor_key40
350 #define hash_default_key48 hash_xor_key48
351 #define hash_default_key56 hash_xor_key56
352 #define hash_default_key64 hash_xor_key64