From: Vlastimil Kosar <ko...@rehivetech.com> LPM function rte_lpm_lookupx4() uses i686/x86_64 SIMD intrinsics. Therefore, the function is reimplemented using non-vector operations for non-x86 architectures.
LPM now builds for ARM. Signed-off-by: Vlastimil Kosar <kosar at rehivetech.com> Signed-off-by: Jan Viktorin <viktorin at rehivetech.com> --- v2 -> v3: as SIMD operations have been moved to rte_vect.h, this patch is now quite clear and just defines the non-x86 version of rte_lpm_lookupx4 --- config/defconfig_arm-armv7-a-linuxapp-gcc | 1 - lib/librte_lpm/rte_lpm.h | 24 +++++++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/config/defconfig_arm-armv7-a-linuxapp-gcc b/config/defconfig_arm-armv7-a-linuxapp-gcc index 5a778cf..a2c8b95 100644 --- a/config/defconfig_arm-armv7-a-linuxapp-gcc +++ b/config/defconfig_arm-armv7-a-linuxapp-gcc @@ -55,7 +55,6 @@ CONFIG_RTE_EAL_IGB_UIO=n # fails to compile on ARM CONFIG_RTE_LIBRTE_ACL=n -CONFIG_RTE_LIBRTE_LPM=n # cannot use those on ARM CONFIG_RTE_KNI_KMOD=n diff --git a/lib/librte_lpm/rte_lpm.h b/lib/librte_lpm/rte_lpm.h index c299ce2..c02b355 100644 --- a/lib/librte_lpm/rte_lpm.h +++ b/lib/librte_lpm/rte_lpm.h @@ -358,9 +358,6 @@ rte_lpm_lookup_bulk_func(const struct rte_lpm *lpm, const uint32_t * ips, return 0; } -/* Mask four results. */ -#define RTE_LPM_MASKX4_RES UINT64_C(0x00ff00ff00ff00ff) - /** * Lookup four IP addresses in an LPM table. * @@ -382,6 +379,14 @@ rte_lpm_lookup_bulk_func(const struct rte_lpm *lpm, const uint32_t * ips, */ static inline void rte_lpm_lookupx4(const struct rte_lpm *lpm, __m128i ip, uint16_t hop[4], + uint16_t defv); + +#if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686) +/* Mask four results. */ +#define RTE_LPM_MASKX4_RES UINT64_C(0x00ff00ff00ff00ff) + +static inline void +rte_lpm_lookupx4(const struct rte_lpm *lpm, __m128i ip, uint16_t hop[4], uint16_t defv) { __m128i i24; @@ -472,6 +477,19 @@ rte_lpm_lookupx4(const struct rte_lpm *lpm, __m128i ip, uint16_t hop[4], hop[2] = (tbl[2] & RTE_LPM_LOOKUP_SUCCESS) ? (uint8_t)tbl[2] : defv; hop[3] = (tbl[3] & RTE_LPM_LOOKUP_SUCCESS) ? (uint8_t)tbl[3] : defv; } +#else +static inline void +rte_lpm_lookupx4(const struct rte_lpm *lpm, __m128i ip, uint16_t hop[4], + uint16_t defv) +{ + rte_lpm_lookup_bulk(lpm, ip.val.uint32, hop, 4); + + hop[0] = (hop[0] & RTE_LPM_LOOKUP_SUCCESS) ? (uint8_t)hop[0] : defv; + hop[1] = (hop[1] & RTE_LPM_LOOKUP_SUCCESS) ? (uint8_t)hop[1] : defv; + hop[2] = (hop[2] & RTE_LPM_LOOKUP_SUCCESS) ? (uint8_t)hop[2] : defv; + hop[3] = (hop[3] & RTE_LPM_LOOKUP_SUCCESS) ? (uint8_t)hop[3] : defv; +} +#endif #ifdef __cplusplus } -- 2.6.1