1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2016 Intel Corporation
3 * Copyright(c) 2018-2024 Arm Limited
4 */
5
6 #ifndef COMPARE_SIGNATURES_GENERIC_H
7 #define COMPARE_SIGNATURES_GENERIC_H
8
9 #include <inttypes.h>
10
11 #include <rte_common.h>
12 #include <rte_vect.h>
13
14 #include "rte_cuckoo_hash.h"
15
16 /*
17 * The generic version could use either a dense or sparsely packed hitmask buffer,
18 * but the dense one is slightly faster.
19 */
20 #define DENSE_HASH_BULK_LOOKUP 1
21
22 static inline void
compare_signatures_dense(uint16_t * hitmask_buffer,const uint16_t * prim_bucket_sigs,const uint16_t * sec_bucket_sigs,uint16_t sig,__rte_unused enum rte_hash_sig_compare_function sig_cmp_fn)23 compare_signatures_dense(uint16_t *hitmask_buffer,
24 const uint16_t *prim_bucket_sigs,
25 const uint16_t *sec_bucket_sigs,
26 uint16_t sig,
27 __rte_unused enum rte_hash_sig_compare_function sig_cmp_fn)
28 {
29 static_assert(sizeof(*hitmask_buffer) >= 2 * (RTE_HASH_BUCKET_ENTRIES / 8),
30 "hitmask_buffer must be wide enough to fit a dense hitmask");
31
32 /* For match mask every bits indicates the match */
33 for (unsigned int i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) {
34 *hitmask_buffer |= (sig == prim_bucket_sigs[i]) << i;
35 *hitmask_buffer |= ((sig == sec_bucket_sigs[i]) << i) << RTE_HASH_BUCKET_ENTRIES;
36 }
37 }
38 #endif /* COMPARE_SIGNATURES_GENERIC_H */
39