From b13fb775834c690c433de9397dee9e87a32503eb Mon Sep 17 00:00:00 2001 From: Stanislaw Kardach Date: Thu, 9 Jun 2022 14:17:00 +0200 Subject: [PATCH] lpm: fix scalar version header for C++ rte_xmm_t is a union type which wraps around xmm_t and maps its contents to scalar structures. Since C++ has stricter type conversion rules than C, the rte_xmm_t::x has to be used instead of C-casting. The generated assembly is identical to the code without the fix (checked both on x86 and RISC-V). Fixes: 406937f89ffd ("lpm: add scalar version of lookupx4") Signed-off-by: Stanislaw Kardach Reviewed-by: David Marchand --- lib/lpm/rte_lpm_scalar.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/lpm/rte_lpm_scalar.h b/lib/lpm/rte_lpm_scalar.h index f0d9f37894..df4f83fa48 100644 --- a/lib/lpm/rte_lpm_scalar.h +++ b/lib/lpm/rte_lpm_scalar.h @@ -17,16 +17,17 @@ static inline void rte_lpm_lookupx4(const struct rte_lpm *lpm, xmm_t ip, uint32_t hop[4], uint32_t defv) { + rte_xmm_t xip = { .x = ip }; uint32_t nh; int ret; - ret = rte_lpm_lookup(lpm, ((rte_xmm_t)ip).u32[0], &nh); + ret = rte_lpm_lookup(lpm, xip.u32[0], &nh); hop[0] = (ret == 0) ? nh : defv; - ret = rte_lpm_lookup(lpm, ((rte_xmm_t)ip).u32[1], &nh); + ret = rte_lpm_lookup(lpm, xip.u32[1], &nh); hop[1] = (ret == 0) ? nh : defv; - ret = rte_lpm_lookup(lpm, ((rte_xmm_t)ip).u32[2], &nh); + ret = rte_lpm_lookup(lpm, xip.u32[2], &nh); hop[2] = (ret == 0) ? nh : defv; - ret = rte_lpm_lookup(lpm, ((rte_xmm_t)ip).u32[3], &nh); + ret = rte_lpm_lookup(lpm, xip.u32[3], &nh); hop[3] = (ret == 0) ? nh : defv; } -- 2.39.5