[PATCH 2/3] lpm: fix xmm_t casting for C++ in scalar version
Stanislaw Kardach
kda at semihalf.com
Thu Jun 9 14:17:00 CEST 2022
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).
Signed-off-by: Stanislaw Kardach <kda at semihalf.com>
---
lib/lpm/rte_lpm_scalar.h | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/lib/lpm/rte_lpm_scalar.h b/lib/lpm/rte_lpm_scalar.h
index f0d9f37894..161b40ff80 100644
--- a/lib/lpm/rte_lpm_scalar.h
+++ b/lib/lpm/rte_lpm_scalar.h
@@ -15,18 +15,19 @@ extern "C" {
static inline void
rte_lpm_lookupx4(const struct rte_lpm *lpm, xmm_t ip, uint32_t hop[4],
- uint32_t defv)
+ 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.30.2
More information about the dev
mailing list