xref: /dpdk/lib/hash/compare_signatures_generic.h (revision ef801b590990c440f52cc8d3707ae269f8386027)
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