<div dir="auto"><div><br><br><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Tue, 1 Jul 2025, 20:21 , <<a href="mailto:uk7b@foxmail.com">uk7b@foxmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">From: Sun Yuechi <<a href="mailto:sunyuechi@iscas.ac.cn" target="_blank" rel="noreferrer">sunyuechi@iscas.ac.cn</a>><br>
<br>
Implement rte_fib_lookup_bulk function for RISC-V architecture using RISC-V<br>
Vector Extension instruction set<br>
<br>
Signed-off-by: Sun Yuechi <<a href="mailto:sunyuechi@iscas.ac.cn" target="_blank" rel="noreferrer">sunyuechi@iscas.ac.cn</a>><br></blockquote></div></div><div dir="auto">From RISC-V perspective:</div><div dir="auto"><br></div><div dir="auto">Reviewed-by: Stanisław Kardach <<a href="mailto:stanislaw.kardach@gmail.com">stanislaw.kardach@gmail.com</a>></div><div dir="auto"><div class="gmail_quote gmail_quote_container"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
---<br>
lib/fib/dir24_8.c | 20 ++++++++++++++<br>
lib/fib/dir24_8_rvv.c | 64 +++++++++++++++++++++++++++++++++++++++++++<br>
lib/fib/dir24_8_rvv.h | 24 ++++++++++++++++<br>
lib/fib/meson.build | 2 ++<br>
4 files changed, 110 insertions(+)<br>
create mode 100644 lib/fib/dir24_8_rvv.c<br>
create mode 100644 lib/fib/dir24_8_rvv.h<br>
<br>
diff --git a/lib/fib/dir24_8.c b/lib/fib/dir24_8.c<br>
index 2ba7e93511..c652d3ca98 100644<br>
--- a/lib/fib/dir24_8.c<br>
+++ b/lib/fib/dir24_8.c<br>
@@ -20,6 +20,10 @@<br>
<br>
#include "dir24_8_avx512.h"<br>
<br>
+#elif defined(RTE_RISCV_FEATURE_V)<br>
+<br>
+#include "dir24_8_rvv.h"<br>
+<br>
#endif /* CC_AVX512_SUPPORT */<br>
<br>
#define DIR24_8_NAMESIZE 64<br>
@@ -88,6 +92,22 @@ get_vector_fn(enum rte_fib_dir24_8_nh_sz nh_sz, bool be_addr)<br>
default:<br>
return NULL;<br>
}<br>
+#elif defined(RTE_RISCV_FEATURE_V)<br>
+ RTE_SET_USED(be_addr);<br>
+ if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_RISCV_ISA_V) <= 0)<br>
+ return NULL;<br>
+ switch (nh_sz) {<br>
+ case RTE_FIB_DIR24_8_1B:<br>
+ return rte_dir24_8_vec_lookup_bulk_1b;<br>
+ case RTE_FIB_DIR24_8_2B:<br>
+ return rte_dir24_8_vec_lookup_bulk_2b;<br>
+ case RTE_FIB_DIR24_8_4B:<br>
+ return rte_dir24_8_vec_lookup_bulk_4b;<br>
+ case RTE_FIB_DIR24_8_8B:<br>
+ return rte_dir24_8_vec_lookup_bulk_8b;<br>
+ default:<br>
+ return NULL;<br>
+ }<br>
#else<br>
RTE_SET_USED(nh_sz);<br>
RTE_SET_USED(be_addr);<br>
diff --git a/lib/fib/dir24_8_rvv.c b/lib/fib/dir24_8_rvv.c<br>
new file mode 100644<br>
index 0000000000..9c14ca0481<br>
--- /dev/null<br>
+++ b/lib/fib/dir24_8_rvv.c<br>
@@ -0,0 +1,64 @@<br>
+/* SPDX-License-Identifier: BSD-3-Clause<br>
+ * Copyright (c) 2025 Institute of Software Chinese Academy of Sciences (ISCAS).<br>
+ */<br>
+<br>
+#if defined(RTE_RISCV_FEATURE_V)<br>
+<br>
+#include <rte_vect.h><br>
+#include <rte_fib.h><br>
+<br>
+#include "dir24_8.h"<br>
+#include "dir24_8_rvv.h"<br>
+<br>
+#define DECLARE_VECTOR_FN(SFX, NH_SZ) \<br>
+void \<br>
+rte_dir24_8_vec_lookup_bulk_##SFX(void *p, \<br>
+ const uint32_t *ips, uint64_t *next_hops, unsigned int n) \<br>
+{ \<br>
+ const uint8_t idx_bits = 3 - NH_SZ; \<br>
+ const uint32_t idx_mask = (1u << (3 - NH_SZ)) - 1u; \<br>
+ const uint64_t e_mask = ~0ULL >> (64 - (8u << NH_SZ)); \<br>
+ struct dir24_8_tbl *tbl = (struct dir24_8_tbl *)p; \<br>
+ const uint64_t *tbl24 = tbl->tbl24; \<br>
+ size_t vl; \<br>
+ for (unsigned int i = 0; i < n; i += vl) { \<br>
+ vl = __riscv_vsetvl_e32m4(n - i); \<br>
+ vuint32m4_t v_ips = __riscv_vle32_v_u32m4(&ips[i], vl); \<br>
+ vuint64m8_t vtbl_word = __riscv_vluxei32_v_u64m8(tbl24, \<br>
+ __riscv_vsll_vx_u32m4( \<br>
+ __riscv_vsrl_vx_u32m4(v_ips, idx_bits + 8, vl), 3, vl), vl); \<br>
+ vuint32m4_t v_tbl_index = __riscv_vsrl_vx_u32m4(v_ips, 8, vl); \<br>
+ vuint32m4_t v_entry_idx = __riscv_vand_vx_u32m4(v_tbl_index, idx_mask, vl); \<br>
+ vuint32m4_t v_shift = __riscv_vsll_vx_u32m4(v_entry_idx, 3 + NH_SZ, vl); \<br>
+ vuint64m8_t vtbl_entry = __riscv_vand_vx_u64m8( \<br>
+ __riscv_vsrl_vv_u64m8(vtbl_word, \<br>
+ __riscv_vwcvtu_x_x_v_u64m8(v_shift, vl), vl), e_mask, vl); \<br>
+ vbool8_t mask = __riscv_vmseq_vx_u64m8_b8( \<br>
+ __riscv_vand_vx_u64m8(vtbl_entry, 1, vl), 1, vl); \<br>
+ if (__riscv_vcpop_m_b8(mask, vl)) { \<br>
+ const uint64_t *tbl8 = tbl->tbl8; \<br>
+ v_tbl_index = __riscv_vadd_vv_u32m4_mu(mask, v_tbl_index, \<br>
+ __riscv_vsll_vx_u32m4( \<br>
+ __riscv_vnsrl_wx_u32m4(vtbl_entry, 1, vl), 8, vl), \<br>
+ __riscv_vand_vx_u32m4(v_ips, 0xFF, vl), vl); \<br>
+ vtbl_word = __riscv_vluxei32_v_u64m8_mu(mask, vtbl_word, tbl8, \<br>
+ __riscv_vsll_vx_u32m4( \<br>
+ __riscv_vsrl_vx_u32m4(v_tbl_index, idx_bits, vl), 3, vl), \<br>
+ vl); \<br>
+ v_entry_idx = __riscv_vand_vx_u32m4(v_tbl_index, idx_mask, vl); \<br>
+ v_shift = __riscv_vsll_vx_u32m4(v_entry_idx, 3 + NH_SZ, vl); \<br>
+ vtbl_entry = __riscv_vand_vx_u64m8( \<br>
+ __riscv_vsrl_vv_u64m8(vtbl_word, \<br>
+ __riscv_vwcvtu_x_x_v_u64m8(v_shift, vl), vl), e_mask, vl); \<br>
+ } \<br>
+ __riscv_vse64_v_u64m8(&next_hops[i], \<br>
+ __riscv_vsrl_vx_u64m8(vtbl_entry, 1, vl), vl); \<br>
+ } \<br>
+}<br>
+<br>
+DECLARE_VECTOR_FN(1b, 0)<br>
+DECLARE_VECTOR_FN(2b, 1)<br>
+DECLARE_VECTOR_FN(4b, 2)<br>
+DECLARE_VECTOR_FN(8b, 3)<br>
+<br>
+#endif<br>
diff --git a/lib/fib/dir24_8_rvv.h b/lib/fib/dir24_8_rvv.h<br>
new file mode 100644<br>
index 0000000000..7be99f7882<br>
--- /dev/null<br>
+++ b/lib/fib/dir24_8_rvv.h<br>
@@ -0,0 +1,24 @@<br>
+/* SPDX-License-Identifier: BSD-3-Clause<br>
+ * Copyright (c) 2025 Institute of Software Chinese Academy of Sciences (ISCAS).<br>
+ */<br>
+<br>
+#ifndef _DIR248_RVV_H_<br>
+#define _DIR248_RVV_H_<br>
+<br>
+void<br>
+rte_dir24_8_vec_lookup_bulk_1b(void *p, const uint32_t *ips,<br>
+ uint64_t *next_hops, const unsigned int n);<br>
+<br>
+void<br>
+rte_dir24_8_vec_lookup_bulk_2b(void *p, const uint32_t *ips,<br>
+ uint64_t *next_hops, const unsigned int n);<br>
+<br>
+void<br>
+rte_dir24_8_vec_lookup_bulk_4b(void *p, const uint32_t *ips,<br>
+ uint64_t *next_hops, const unsigned int n);<br>
+<br>
+void<br>
+rte_dir24_8_vec_lookup_bulk_8b(void *p, const uint32_t *ips,<br>
+ uint64_t *next_hops, const unsigned int n);<br>
+<br>
+#endif /* _DIR248_RVV_H_ */<br>
diff --git a/lib/fib/meson.build b/lib/fib/meson.build<br>
index 6992ccc040..573fc50ff1 100644<br>
--- a/lib/fib/meson.build<br>
+++ b/lib/fib/meson.build<br>
@@ -10,4 +10,6 @@ deps += ['net']<br>
<br>
if dpdk_conf.has('RTE_ARCH_X86_64')<br>
sources_avx512 += files('dir24_8_avx512.c', 'trie_avx512.c')<br>
+elif dpdk_conf.has('RTE_ARCH_RISCV')<br>
+ sources += files('dir24_8_rvv.c')<br>
endif<br>
-- <br>
2.50.0<br>
<br>
</blockquote></div></div></div>