return (u32) _mm512_movepi16_mask ((__m512i) v);
}
+/* 512-bit packs */
+#define _(f, t, fn) \
+ always_inline t t##_pack (f lo, f hi) \
+ { \
+ return (t) fn ((__m512i) lo, (__m512i) hi); \
+ }
+
+_ (i16x32, i8x64, _mm512_packs_epi16)
+_ (i16x32, u8x64, _mm512_packus_epi16)
+_ (i32x16, i16x32, _mm512_packs_epi32)
+_ (i32x16, u16x32, _mm512_packus_epi32)
+#undef _
+
static_always_inline u32x16
u32x16_byte_swap (u32x16 v)
{
return sum8[0] + sum8[4];
}
-static_always_inline u8x64
-u8x64_mask_load (u8x64 a, void *p, u64 mask)
-{
- return (u8x64) _mm512_mask_loadu_epi8 ((__m512i) a, mask, p);
-}
+#define _(t, m, p, i, e) \
+ static_always_inline t t##_mask_load (t a, void *p, m mask) \
+ { \
+ return (t) p##_mask_loadu_##e ((i) a, mask, p); \
+ } \
+ static_always_inline t t##_mask_load_zero (void *p, m mask) \
+ { \
+ return (t) p##_maskz_loadu_##e (mask, p); \
+ } \
+ static_always_inline void t##_mask_store (t a, void *p, m mask) \
+ { \
+ p##_mask_storeu_##e (p, mask, (i) a); \
+ }
-static_always_inline void
-u8x64_mask_store (u8x64 a, void *p, u64 mask)
-{
- _mm512_mask_storeu_epi8 (p, mask, (__m512i) a);
-}
+_ (u8x64, u64, _mm512, __m512i, epi8)
+_ (u8x32, u32, _mm256, __m256i, epi8)
+_ (u8x16, u16, _mm, __m128i, epi8)
+_ (u16x32, u32, _mm512, __m512i, epi16)
+_ (u16x16, u16, _mm256, __m256i, epi16)
+_ (u16x8, u8, _mm, __m128i, epi16)
+_ (u32x16, u16, _mm512, __m512i, epi32)
+_ (u32x8, u8, _mm256, __m256i, epi32)
+_ (u32x4, u8, _mm, __m128i, epi32)
+_ (u64x8, u8, _mm512, __m512i, epi64)
+_ (u64x4, u8, _mm256, __m256i, epi64)
+_ (u64x2, u8, _mm, __m128i, epi64)
+#undef _
+
+#ifdef CLIB_HAVE_VEC512
+#define CLIB_HAVE_VEC512_MASK_LOAD_STORE
+#endif
+#ifdef CLIB_HAVE_VEC256
+#define CLIB_HAVE_VEC256_MASK_LOAD_STORE
+#endif
+#ifdef CLIB_HAVE_VEC128
+#define CLIB_HAVE_VEC128_MASK_LOAD_STORE
+#endif
static_always_inline u8x64
u8x64_splat_u8x16 (u8x16 a)
_ (u32x8, u64x8, _mm512_cvtepu32_epi64, __m256i)
#undef _
-#define _(vt, mt, bits, epi) \
+#define _(vt, mt, p, it, epi) \
static_always_inline vt vt##_compress (vt a, mt mask) \
{ \
- return (vt) _mm##bits##_maskz_compress_##epi (mask, (__m##bits##i) a); \
+ return (vt) p##_maskz_compress_##epi (mask, (it) a); \
} \
static_always_inline vt vt##_expand (vt a, mt mask) \
{ \
- return (vt) _mm##bits##_maskz_expand_##epi (mask, (__m##bits##i) a); \
+ return (vt) p##_maskz_expand_##epi (mask, (it) a); \
+ } \
+ static_always_inline void vt##_compress_store (vt v, mt mask, void *p) \
+ { \
+ p##_mask_compressstoreu_##epi (p, mask, (it) v); \
}
-_ (u64x8, u8, 512, epi64)
-_ (u32x16, u16, 512, epi32)
-_ (u64x4, u8, 256, epi64)
-_ (u32x8, u8, 256, epi32)
+_ (u64x8, u8, _mm512, __m512i, epi64)
+_ (u32x16, u16, _mm512, __m512i, epi32)
+_ (u64x4, u8, _mm256, __m256i, epi64)
+_ (u32x8, u8, _mm256, __m256i, epi32)
+_ (u64x2, u8, _mm, __m128i, epi64)
+_ (u32x4, u8, _mm, __m128i, epi32)
#ifdef __AVX512VBMI2__
-_ (u16x32, u32, 512, epi16)
-_ (u8x64, u64, 512, epi8)
-_ (u16x16, u16, 256, epi16)
-_ (u8x32, u32, 256, epi8)
+_ (u16x32, u32, _mm512, __m512i, epi16)
+_ (u8x64, u64, _mm512, __m512i, epi8)
+_ (u16x16, u16, _mm256, __m256i, epi16)
+_ (u8x32, u32, _mm256, __m256i, epi8)
+_ (u16x8, u8, _mm, __m128i, epi16)
+_ (u8x16, u16, _mm, __m128i, epi8)
#endif
#undef _
+#ifdef CLIB_HAVE_VEC256
#define CLIB_HAVE_VEC256_COMPRESS
+#ifdef __AVX512VBMI2__
+#define CLIB_HAVE_VEC256_COMPRESS_U8_U16
+#endif
+
+#endif
+#ifdef CLIB_HAVE_VEC512
#define CLIB_HAVE_VEC512_COMPRESS
+#ifdef __AVX512VBMI2__
+#define CLIB_HAVE_VEC512_COMPRESS_U8_U16
+#endif
+
+#endif
#ifndef __AVX512VBMI2__
static_always_inline u16x16