From 029bff4b9a60ceabad8744059427b8736fe48a2b Mon Sep 17 00:00:00 2001 From: Damjan Marion Date: Fri, 29 Sep 2023 15:09:11 +0200 Subject: vppinfra: splat and gather vector inlines Type: improvement Change-Id: I4b00b3a6ff63fc8b313c89217ccdea356c0783a3 Signed-off-by: Damjan Marion --- src/vppinfra/vector_avx2.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/vppinfra/vector_avx2.h') diff --git a/src/vppinfra/vector_avx2.h b/src/vppinfra/vector_avx2.h index 17271b8fcd0..ee3d5404f91 100644 --- a/src/vppinfra/vector_avx2.h +++ b/src/vppinfra/vector_avx2.h @@ -335,6 +335,18 @@ u32x8_scatter_one (u32x8 r, int index, void *p) *(u32 *) p = r[index]; } +#define u32x8_gather_u32(base, indices, scale) \ + (u32x8) _mm256_i32gather_epi32 (base, (__m256i) indices, scale) + +#ifdef __AVX512F__ +#define u32x8_scatter_u32(base, indices, v, scale) \ + _mm256_i32scatter_epi32 (base, (__m256i) indices, (__m256i) v, scale) +#else +#define u32x8_scatter_u32(base, indices, v, scale) \ + for (u32 i = 0; i < 8; i++) \ + *((u32u *) ((u8 *) base + (scale) * (indices)[i])) = (v)[i]; +#endif + static_always_inline u8x32 u8x32_blend (u8x32 v1, u8x32 v2, u8x32 mask) { @@ -428,6 +440,12 @@ u32x8_splat_u32x4 (u32x4 a) return (u32x8) _mm256_broadcastsi128_si256 ((__m128i) a); } +static_always_inline u64x4 +u64x4_splat_u64x2 (u64x2 a) +{ + return (u64x4) _mm256_broadcastsi128_si256 ((__m128i) a); +} + static_always_inline u8x32 u8x32_load_partial (u8 *data, uword n) { -- cgit 1.2.3-korg