numam-dpdk/lib/lpm/rte_lpm_sve.h
Bruce Richardson 99a2dd955f lib: remove librte_ prefix from directory names
There is no reason for the DPDK libraries to all have 'librte_' prefix on
the directory names. This prefix makes the directory names longer and also
makes it awkward to add features referring to individual libraries in the
build - should the lib names be specified with or without the prefix.
Therefore, we can just remove the library prefix and use the library's
unique name as the directory name, i.e. 'eal' rather than 'librte_eal'

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
2021-04-21 14:04:09 +02:00

84 lines
2.3 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2020 Arm Limited
*/
#ifndef _RTE_LPM_SVE_H_
#define _RTE_LPM_SVE_H_
#include <rte_vect.h>
#ifdef __cplusplus
extern "C" {
#endif
__rte_internal
static void
__rte_lpm_lookup_vec(const struct rte_lpm *lpm, const uint32_t *ips,
uint32_t *__rte_restrict next_hops, const uint32_t n)
{
uint32_t i = 0;
svuint32_t v_ip, v_idx, v_tbl24, v_tbl8, v_hop;
svuint32_t v_mask_xv, v_mask_v, v_mask_hop;
svbool_t pg = svwhilelt_b32(i, n);
svbool_t pv;
do {
v_ip = svld1(pg, &ips[i]);
/* Get indices for tbl24[] */
v_idx = svlsr_x(pg, v_ip, 8);
/* Extract values from tbl24[] */
v_tbl24 = svld1_gather_index(pg, (const uint32_t *)lpm->tbl24,
v_idx);
/* Create mask with valid set */
v_mask_v = svdup_u32_z(pg, RTE_LPM_LOOKUP_SUCCESS);
/* Create mask with valid and valid_group set */
v_mask_xv = svdup_u32_z(pg, RTE_LPM_VALID_EXT_ENTRY_BITMASK);
/* Create predicate for tbl24 entries: (valid && !valid_group) */
pv = svcmpeq(pg, svand_z(pg, v_tbl24, v_mask_xv), v_mask_v);
/* Create mask for next_hop in table entry */
v_mask_hop = svdup_u32_z(pg, 0x00ffffff);
/* Extract next_hop and write back */
v_hop = svand_x(pv, v_tbl24, v_mask_hop);
svst1(pv, &next_hops[i], v_hop);
/* Update predicate for tbl24 entries: (valid && valid_group) */
pv = svcmpeq(pg, svand_z(pg, v_tbl24, v_mask_xv), v_mask_xv);
/* Compute tbl8 index */
v_idx = svand_x(pv, v_tbl24, svdup_u32_z(pv, 0xffffff));
v_idx = svmul_x(pv, v_idx, RTE_LPM_TBL8_GROUP_NUM_ENTRIES);
v_idx = svadd_x(pv, svand_x(pv, v_ip, svdup_u32_z(pv, 0xff)),
v_idx);
/* Extract values from tbl8[] */
v_tbl8 = svld1_gather_index(pv, (const uint32_t *)lpm->tbl8,
v_idx);
/* Update predicate for tbl8 entries: (valid) */
pv = svcmpeq(pv, svand_z(pv, v_tbl8, v_mask_v), v_mask_v);
/* Extract next_hop and write back */
v_hop = svand_x(pv, v_tbl8, v_mask_hop);
svst1(pv, &next_hops[i], v_hop);
i += svlen(v_ip);
pg = svwhilelt_b32(i, n);
} while (svptest_any(svptrue_b32(), pg));
}
static inline void
rte_lpm_lookupx4(const struct rte_lpm *lpm, xmm_t ip, uint32_t hop[4],
uint32_t defv)
{
uint32_t i, ips[4];
vst1q_s32((int32_t *)ips, ip);
for (i = 0; i < 4; i++)
hop[i] = defv;
__rte_lpm_lookup_vec(lpm, ips, hop, 4);
}
#ifdef __cplusplus
}
#endif
#endif /* _RTE_LPM_SVE_H_ */