DPDK 26.11.0-rc1
rte_lpm_scalar.h
1/* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2022 StarFive
3 * Copyright(c) 2022 SiFive
4 * Copyright(c) 2022 Semihalf
5 */
6
7#ifndef _RTE_LPM_SCALAR_H_
8#define _RTE_LPM_SCALAR_H_
9
10#include <rte_vect.h>
11
12#ifdef __cplusplus
13extern "C" {
14#endif
15
16static inline uint32_t
17__rte_lpm_lookupx4_hop(const struct rte_lpm *lpm, uint32_t tbl_entry,
18 uint32_t ip, uint32_t defv)
19{
20 if (unlikely((tbl_entry & RTE_LPM_VALID_EXT_ENTRY_BITMASK) ==
21 RTE_LPM_VALID_EXT_ENTRY_BITMASK)) {
22 const uint32_t *tbl8 = (const uint32_t *)lpm->tbl8;
23
24 tbl_entry = tbl8[(uint8_t)ip + (tbl_entry & 0x00FFFFFF) *
25 RTE_LPM_TBL8_GROUP_NUM_ENTRIES];
26 }
27
28 return (tbl_entry & RTE_LPM_LOOKUP_SUCCESS) ?
29 (tbl_entry & 0x00FFFFFF) : defv;
30}
31
32static inline void
33rte_lpm_lookupx4(const struct rte_lpm *lpm, xmm_t ip, uint32_t hop[4],
34 uint32_t defv)
35{
36 rte_xmm_t xip = { .x = ip };
37 const uint32_t *tbl24 = (const uint32_t *)lpm->tbl24;
38 uint32_t tbl0, tbl1, tbl2, tbl3;
39
40 /* Issue the four tbl24 loads before any entry is examined. */
41 tbl0 = tbl24[xip.u32[0] >> 8];
42 tbl1 = tbl24[xip.u32[1] >> 8];
43 tbl2 = tbl24[xip.u32[2] >> 8];
44 tbl3 = tbl24[xip.u32[3] >> 8];
45
46 hop[0] = __rte_lpm_lookupx4_hop(lpm, tbl0, xip.u32[0], defv);
47 hop[1] = __rte_lpm_lookupx4_hop(lpm, tbl1, xip.u32[1], defv);
48 hop[2] = __rte_lpm_lookupx4_hop(lpm, tbl2, xip.u32[2], defv);
49 hop[3] = __rte_lpm_lookupx4_hop(lpm, tbl3, xip.u32[3], defv);
50}
51
52#ifdef __cplusplus
53}
54#endif
55
56#endif /* _RTE_LPM_SCALAR_H_ */
#define unlikely(x)
static void rte_lpm_lookupx4(const struct rte_lpm *lpm, xmm_t ip, uint32_t hop[4], uint32_t defv)
#define RTE_LPM_LOOKUP_SUCCESS
Definition: rte_lpm.h:63