Move the compare_signatures function into architecture-specific files
They all have the default scalar option as an option if we disable
vectorisation.

Signed-off-by: Yoan Picchi <yoan.pic...@arm.com>
---
 .mailmap                                  |  1 +
 lib/hash/compare_signatures_arm_pvt.h     | 55 +++++++++++++++++++
 lib/hash/compare_signatures_generic_pvt.h | 33 ++++++++++++
 lib/hash/compare_signatures_x86_pvt.h     | 48 +++++++++++++++++
 lib/hash/rte_cuckoo_hash.c                | 65 +++--------------------
 5 files changed, 145 insertions(+), 57 deletions(-)
 create mode 100644 lib/hash/compare_signatures_arm_pvt.h
 create mode 100644 lib/hash/compare_signatures_generic_pvt.h
 create mode 100644 lib/hash/compare_signatures_x86_pvt.h

diff --git a/.mailmap b/.mailmap
index f76037213d..ec525981fe 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1661,6 +1661,7 @@ Yixue Wang <yixue.w...@intel.com>
 Yi Yang <yangy...@inspur.com> <yi.y.y...@intel.com>
 Yi Zhang <zhang.y...@zte.com.cn>
 Yoann Desmouceaux <ydesm...@cisco.com>
+Yoan Picchi <yoan.pic...@arm.com>
 Yogesh Jangra <yogesh.jan...@intel.com>
 Yogev Chaimovich <yo...@cgstowernetworks.com>
 Yongjie Gu <yongjiex...@intel.com>
diff --git a/lib/hash/compare_signatures_arm_pvt.h 
b/lib/hash/compare_signatures_arm_pvt.h
new file mode 100644
index 0000000000..80b6afb7a5
--- /dev/null
+++ b/lib/hash/compare_signatures_arm_pvt.h
@@ -0,0 +1,55 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2016 Intel Corporation
+ * Copyright(c) 2018-2024 Arm Limited
+ */
+
+#ifndef _COMPARE_SIGNATURE_ARM_PVT_H_
+#define _COMPARE_SIGNATURE_ARM_PVT_H_
+
+#include <inttypes.h>
+#include <rte_common.h>
+#include <rte_vect.h>
+
+#include "rte_cuckoo_hash.h"
+
+static inline void
+compare_signatures(uint32_t *prim_hash_matches, uint32_t *sec_hash_matches,
+                       const struct rte_hash_bucket *prim_bkt,
+                       const struct rte_hash_bucket *sec_bkt,
+                       uint16_t sig,
+                       enum rte_hash_sig_compare_function sig_cmp_fn)
+{
+       unsigned int i;
+
+       /* For match mask the first bit of every two bits indicates the match */
+       switch (sig_cmp_fn) {
+#if defined(__ARM_NEON)
+       case RTE_HASH_COMPARE_NEON: {
+               uint16x8_t vmat, vsig, x;
+               int16x8_t shift = {-15, -13, -11, -9, -7, -5, -3, -1};
+
+               vsig = vld1q_dup_u16((uint16_t const *)&sig);
+               /* Compare all signatures in the primary bucket */
+               vmat = vceqq_u16(vsig,
+                       vld1q_u16((uint16_t const *)prim_bkt->sig_current));
+               x = vshlq_u16(vandq_u16(vmat, vdupq_n_u16(0x8000)), shift);
+               *prim_hash_matches = (uint32_t)(vaddvq_u16(x));
+               /* Compare all signatures in the secondary bucket */
+               vmat = vceqq_u16(vsig,
+                       vld1q_u16((uint16_t const *)sec_bkt->sig_current));
+               x = vshlq_u16(vandq_u16(vmat, vdupq_n_u16(0x8000)), shift);
+               *sec_hash_matches = (uint32_t)(vaddvq_u16(x));
+               }
+               break;
+#endif
+       default:
+               for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) {
+                       *prim_hash_matches |=
+                               ((sig == prim_bkt->sig_current[i]) << (i << 1));
+                       *sec_hash_matches |=
+                               ((sig == sec_bkt->sig_current[i]) << (i << 1));
+               }
+       }
+}
+
+#endif
diff --git a/lib/hash/compare_signatures_generic_pvt.h 
b/lib/hash/compare_signatures_generic_pvt.h
new file mode 100644
index 0000000000..43587adcef
--- /dev/null
+++ b/lib/hash/compare_signatures_generic_pvt.h
@@ -0,0 +1,33 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2016 Intel Corporation
+ * Copyright(c) 2018-2024 Arm Limited
+ */
+
+#ifndef _COMPARE_SIGNATURE_GENERIC_PVT_H_
+#define _COMPARE_SIGNATURE_GENERIC_PVT_H_
+
+#include <inttypes.h>
+#include <rte_common.h>
+#include <rte_vect.h>
+
+#include "rte_cuckoo_hash.h"
+
+static inline void
+compare_signatures(uint32_t *prim_hash_matches, uint32_t *sec_hash_matches,
+                       const struct rte_hash_bucket *prim_bkt,
+                       const struct rte_hash_bucket *sec_bkt,
+                       uint16_t sig,
+                       enum rte_hash_sig_compare_function sig_cmp_fn)
+{
+       unsigned int i;
+
+       /* For match mask the first bit of every two bits indicates the match */
+       for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) {
+               *prim_hash_matches |=
+                       ((sig == prim_bkt->sig_current[i]) << (i << 1));
+               *sec_hash_matches |=
+                       ((sig == sec_bkt->sig_current[i]) << (i << 1));
+       }
+}
+
+#endif
diff --git a/lib/hash/compare_signatures_x86_pvt.h 
b/lib/hash/compare_signatures_x86_pvt.h
new file mode 100644
index 0000000000..11a82aced9
--- /dev/null
+++ b/lib/hash/compare_signatures_x86_pvt.h
@@ -0,0 +1,48 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2016 Intel Corporation
+ * Copyright(c) 2018-2024 Arm Limited
+ */
+
+#ifndef _COMPARE_SIGNATURE_X86_PVT_H_
+#define _COMPARE_SIGNATURE_X86_PVT_H_
+
+#include <inttypes.h>
+#include <rte_common.h>
+#include <rte_vect.h>
+
+#include "rte_cuckoo_hash.h"
+
+static inline void
+compare_signatures(uint32_t *prim_hash_matches, uint32_t *sec_hash_matches,
+                       const struct rte_hash_bucket *prim_bkt,
+                       const struct rte_hash_bucket *sec_bkt,
+                       uint16_t sig,
+                       enum rte_hash_sig_compare_function sig_cmp_fn)
+{
+       unsigned int i;
+
+       /* For match mask the first bit of every two bits indicates the match */
+       switch (sig_cmp_fn) {
+#if defined(__SSE2__)
+       case RTE_HASH_COMPARE_SSE:
+               /* Compare all signatures in the bucket */
+               *prim_hash_matches = 
_mm_movemask_epi8(_mm_cmpeq_epi16(_mm_load_si128(
+                       (__m128i const *)prim_bkt->sig_current), 
_mm_set1_epi16(sig)));
+               /* Extract the even-index bits only */
+               *prim_hash_matches &= 0x5555;
+               /* Compare all signatures in the bucket */
+               *sec_hash_matches = 
_mm_movemask_epi8(_mm_cmpeq_epi16(_mm_load_si128(
+                       (__m128i const *)sec_bkt->sig_current), 
_mm_set1_epi16(sig)));
+               /* Extract the even-index bits only */
+               *sec_hash_matches &= 0x5555;
+               break;
+#endif
+       default:
+               for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) {
+                       *prim_hash_matches |= (sig == prim_bkt->sig_current[i]) 
<< (i << 1);
+                       *sec_hash_matches |= (sig == sec_bkt->sig_current[i]) 
<< (i << 1);
+               }
+       }
+}
+
+#endif
diff --git a/lib/hash/rte_cuckoo_hash.c b/lib/hash/rte_cuckoo_hash.c
index e1d50e7d40..739f7927b8 100644
--- a/lib/hash/rte_cuckoo_hash.c
+++ b/lib/hash/rte_cuckoo_hash.c
@@ -43,6 +43,14 @@ enum rte_hash_sig_compare_function {
        RTE_HASH_COMPARE_NUM
 };
 
+#if defined(__ARM_NEON)
+#include "compare_signatures_arm_pvt.h"
+#elif defined(__SSE2__)
+#include "compare_signatures_x86_pvt.h"
+#else
+#include "compare_signatures_generic_pvt.h"
+#endif
+
 /* Mask of all flags supported by this version */
 #define RTE_HASH_EXTRA_FLAGS_MASK (RTE_HASH_EXTRA_FLAGS_TRANS_MEM_SUPPORT | \
                                   RTE_HASH_EXTRA_FLAGS_MULTI_WRITER_ADD | \
@@ -1890,63 +1898,6 @@ rte_hash_free_key_with_position(const struct rte_hash *h,
 
 }
 
-static inline void
-compare_signatures(uint32_t *prim_hash_matches, uint32_t *sec_hash_matches,
-                       const struct rte_hash_bucket *prim_bkt,
-                       const struct rte_hash_bucket *sec_bkt,
-                       uint16_t sig,
-                       enum rte_hash_sig_compare_function sig_cmp_fn)
-{
-       unsigned int i;
-
-       /* For match mask the first bit of every two bits indicates the match */
-       switch (sig_cmp_fn) {
-#if defined(__SSE2__)
-       case RTE_HASH_COMPARE_SSE:
-               /* Compare all signatures in the bucket */
-               *prim_hash_matches = _mm_movemask_epi8(_mm_cmpeq_epi16(
-                               _mm_load_si128(
-                                       (__m128i const *)prim_bkt->sig_current),
-                               _mm_set1_epi16(sig)));
-               /* Extract the even-index bits only */
-               *prim_hash_matches &= 0x5555;
-               /* Compare all signatures in the bucket */
-               *sec_hash_matches = _mm_movemask_epi8(_mm_cmpeq_epi16(
-                               _mm_load_si128(
-                                       (__m128i const *)sec_bkt->sig_current),
-                               _mm_set1_epi16(sig)));
-               /* Extract the even-index bits only */
-               *sec_hash_matches &= 0x5555;
-               break;
-#elif defined(__ARM_NEON)
-       case RTE_HASH_COMPARE_NEON: {
-               uint16x8_t vmat, vsig, x;
-               int16x8_t shift = {-15, -13, -11, -9, -7, -5, -3, -1};
-
-               vsig = vld1q_dup_u16((uint16_t const *)&sig);
-               /* Compare all signatures in the primary bucket */
-               vmat = vceqq_u16(vsig,
-                       vld1q_u16((uint16_t const *)prim_bkt->sig_current));
-               x = vshlq_u16(vandq_u16(vmat, vdupq_n_u16(0x8000)), shift);
-               *prim_hash_matches = (uint32_t)(vaddvq_u16(x));
-               /* Compare all signatures in the secondary bucket */
-               vmat = vceqq_u16(vsig,
-                       vld1q_u16((uint16_t const *)sec_bkt->sig_current));
-               x = vshlq_u16(vandq_u16(vmat, vdupq_n_u16(0x8000)), shift);
-               *sec_hash_matches = (uint32_t)(vaddvq_u16(x));
-               }
-               break;
-#endif
-       default:
-               for (i = 0; i < RTE_HASH_BUCKET_ENTRIES; i++) {
-                       *prim_hash_matches |=
-                               ((sig == prim_bkt->sig_current[i]) << (i << 1));
-                       *sec_hash_matches |=
-                               ((sig == sec_bkt->sig_current[i]) << (i << 1));
-               }
-       }
-}
-
 static inline void
 __bulk_lookup_l(const struct rte_hash *h, const void **keys,
                const struct rte_hash_bucket **primary_bkt,
-- 
2.34.1

Reply via email to