4 * Copyright(c) 2010-2015 Intel Corporation. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
17 * * Neither the name of Intel Corporation nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 #ifndef __INCLUDE_HASH_FUNC_H__
34 #define __INCLUDE_HASH_FUNC_H__
36 static inline uint64_t
37 hash_xor_key8(void *key, void *mask, __rte_unused uint32_t key_size,
44 xor0 = seed ^ (k[0] & m[0]);
46 return (xor0 >> 32) ^ xor0;
49 static inline uint64_t
50 hash_xor_key16(void *key, void *mask, __rte_unused uint32_t key_size,
57 xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
59 return (xor0 >> 32) ^ xor0;
62 static inline uint64_t
63 hash_xor_key24(void *key, void *mask, __rte_unused uint32_t key_size,
70 xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
74 return (xor0 >> 32) ^ xor0;
77 static inline uint64_t
78 hash_xor_key32(void *key, void *mask, __rte_unused uint32_t key_size,
85 xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
86 xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
90 return (xor0 >> 32) ^ xor0;
93 static inline uint64_t
94 hash_xor_key40(void *key, void *mask, __rte_unused uint32_t key_size,
101 xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
102 xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
108 return (xor0 >> 32) ^ xor0;
111 static inline uint64_t
112 hash_xor_key48(void *key, void *mask, __rte_unused uint32_t key_size,
117 uint64_t xor0, xor1, xor2;
119 xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
120 xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
121 xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
127 return (xor0 >> 32) ^ xor0;
130 static inline uint64_t
131 hash_xor_key56(void *key, void *mask, __rte_unused uint32_t key_size,
136 uint64_t xor0, xor1, xor2;
138 xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
139 xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
140 xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
147 return (xor0 >> 32) ^ xor0;
150 static inline uint64_t
151 hash_xor_key64(void *key, void *mask, __rte_unused uint32_t key_size,
156 uint64_t xor0, xor1, xor2, xor3;
158 xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
159 xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
160 xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
161 xor3 = (k[6] & m[6]) ^ (k[7] & m[7]);
168 return (xor0 >> 32) ^ xor0;
171 #if defined(RTE_ARCH_X86_64)
173 #include <x86intrin.h>
175 static inline uint64_t
176 hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
183 crc0 = _mm_crc32_u64(seed, k[0] & m[0]);
188 static inline uint64_t
189 hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
194 uint64_t k0, crc0, crc1;
198 crc0 = _mm_crc32_u64(k0, seed);
199 crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
206 static inline uint64_t
207 hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
212 uint64_t k0, k2, crc0, crc1;
217 crc0 = _mm_crc32_u64(k0, seed);
218 crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
220 crc0 = _mm_crc32_u64(crc0, k2);
227 static inline uint64_t
228 hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
233 uint64_t k0, k2, crc0, crc1, crc2, crc3;
238 crc0 = _mm_crc32_u64(k0, seed);
239 crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
241 crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
244 crc0 = _mm_crc32_u64(crc0, crc1);
245 crc1 = _mm_crc32_u64(crc2, crc3);
252 static inline uint64_t
253 hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
258 uint64_t k0, k2, crc0, crc1, crc2, crc3;
263 crc0 = _mm_crc32_u64(k0, seed);
264 crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
266 crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
267 crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
269 crc0 = _mm_crc32_u64(crc0, crc1);
270 crc1 = _mm_crc32_u64(crc2, crc3);
277 static inline uint64_t
278 hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
283 uint64_t k0, k2, k5, crc0, crc1, crc2, crc3;
289 crc0 = _mm_crc32_u64(k0, seed);
290 crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
292 crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
293 crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
295 crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
296 crc1 = _mm_crc32_u64(crc3, k5);
303 static inline uint64_t
304 hash_crc_key56(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]);
324 crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
325 crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
332 static inline uint64_t
333 hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
338 uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
344 crc0 = _mm_crc32_u64(k0, seed);
345 crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
347 crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
348 crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
350 crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
351 crc5 = _mm_crc32_u64(k5 >> 32, k[7] & m[7]);
353 crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
354 crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
361 #define hash_default_key8 hash_crc_key8
362 #define hash_default_key16 hash_crc_key16
363 #define hash_default_key24 hash_crc_key24
364 #define hash_default_key32 hash_crc_key32
365 #define hash_default_key40 hash_crc_key40
366 #define hash_default_key48 hash_crc_key48
367 #define hash_default_key56 hash_crc_key56
368 #define hash_default_key64 hash_crc_key64
370 #elif defined(RTE_ARCH_ARM64)
371 #include "hash_func_arm64.h"
374 #define hash_default_key8 hash_xor_key8
375 #define hash_default_key16 hash_xor_key16
376 #define hash_default_key24 hash_xor_key24
377 #define hash_default_key32 hash_xor_key32
378 #define hash_default_key40 hash_xor_key40
379 #define hash_default_key48 hash_xor_key48
380 #define hash_default_key56 hash_xor_key56
381 #define hash_default_key64 hash_xor_key64