DPDK 25.03.0-rc0
rte_cmp_x86.h
1/* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2015 Intel Corporation
3 */
4
5#include <rte_vect.h>
6
7/* Functions to compare multiple of 16 byte keys (up to 128 bytes) */
8static inline int
9rte_hash_k16_cmp_eq(const void *key1, const void *key2, size_t key_len __rte_unused)
10{
11 const __m128i k1 = _mm_loadu_si128((const __m128i *) key1);
12 const __m128i k2 = _mm_loadu_si128((const __m128i *) key2);
13 const __m128i x = _mm_xor_si128(k1, k2);
14
15 return !_mm_test_all_zeros(x, x);
16}
17
18static inline int
19rte_hash_k32_cmp_eq(const void *key1, const void *key2, size_t key_len)
20{
21 return rte_hash_k16_cmp_eq(key1, key2, key_len) ||
22 rte_hash_k16_cmp_eq((const char *) key1 + 16,
23 (const char *) key2 + 16, key_len);
24}
25
26static inline int
27rte_hash_k48_cmp_eq(const void *key1, const void *key2, size_t key_len)
28{
29 return rte_hash_k16_cmp_eq(key1, key2, key_len) ||
30 rte_hash_k16_cmp_eq((const char *) key1 + 16,
31 (const char *) key2 + 16, key_len) ||
32 rte_hash_k16_cmp_eq((const char *) key1 + 32,
33 (const char *) key2 + 32, key_len);
34}
35
36static inline int
37rte_hash_k64_cmp_eq(const void *key1, const void *key2, size_t key_len)
38{
39 return rte_hash_k32_cmp_eq(key1, key2, key_len) ||
40 rte_hash_k32_cmp_eq((const char *) key1 + 32,
41 (const char *) key2 + 32, key_len);
42}
43
44static inline int
45rte_hash_k80_cmp_eq(const void *key1, const void *key2, size_t key_len)
46{
47 return rte_hash_k64_cmp_eq(key1, key2, key_len) ||
48 rte_hash_k16_cmp_eq((const char *) key1 + 64,
49 (const char *) key2 + 64, key_len);
50}
51
52static inline int
53rte_hash_k96_cmp_eq(const void *key1, const void *key2, size_t key_len)
54{
55 return rte_hash_k64_cmp_eq(key1, key2, key_len) ||
56 rte_hash_k32_cmp_eq((const char *) key1 + 64,
57 (const char *) key2 + 64, key_len);
58}
59
60static inline int
61rte_hash_k112_cmp_eq(const void *key1, const void *key2, size_t key_len)
62{
63 return rte_hash_k64_cmp_eq(key1, key2, key_len) ||
64 rte_hash_k32_cmp_eq((const char *) key1 + 64,
65 (const char *) key2 + 64, key_len) ||
66 rte_hash_k16_cmp_eq((const char *) key1 + 96,
67 (const char *) key2 + 96, key_len);
68}
69
70static inline int
71rte_hash_k128_cmp_eq(const void *key1, const void *key2, size_t key_len)
72{
73 return rte_hash_k64_cmp_eq(key1, key2, key_len) ||
74 rte_hash_k64_cmp_eq((const char *) key1 + 64,
75 (const char *) key2 + 64, key_len);
76}
#define __rte_unused
Definition: rte_common.h:171