16 #ifndef included_vector_avx512_h 17 #define included_vector_avx512_h 20 #include <x86intrin.h> 23 #define foreach_avx512_vec512i \ 24 _(i,8,64,epi8) _(i,16,32,epi16) _(i,32,16,epi32) _(i,64,8,epi64) 25 #define foreach_avx512_vec512u \ 26 _(u,8,64,epi8) _(u,16,32,epi16) _(u,32,16,epi32) _(u,64,8,epi64) 27 #define foreach_avx512_vec512f \ 28 _(f,32,8,ps) _(f,64,4,pd) 32 #define _(t, s, c, i) \ 33 static_always_inline t##s##x##c \ 34 t##s##x##c##_splat (t##s x) \ 35 { return (t##s##x##c) _mm512_set1_##i (x); } \ 37 static_always_inline t##s##x##c \ 38 t##s##x##c##_load_unaligned (void *p) \ 39 { return (t##s##x##c) _mm512_loadu_si512 (p); } \ 41 static_always_inline void \ 42 t##s##x##c##_store_unaligned (t##s##x##c v, void *p) \ 43 { _mm512_storeu_si512 ((__m512i *) p, (__m512i) v); } \ 45 static_always_inline int \ 46 t##s##x##c##_is_all_zero (t##s##x##c v) \ 47 { return (_mm512_test_epi64_mask ((__m512i) v, (__m512i) v) == 0); } \ 49 static_always_inline int \ 50 t##s##x##c##_is_equal (t##s##x##c a, t##s##x##c b) \ 51 { return t##s##x##c##_is_all_zero (a ^ b); } \ 53 static_always_inline int \ 54 t##s##x##c##_is_all_equal (t##s##x##c v, t##s x) \ 55 { return t##s##x##c##_is_equal (v, t##s##x##c##_splat (x)); } \ 57 static_always_inline u##c \ 58 t##s##x##c##_is_zero_mask (t##s##x##c v) \ 59 { return _mm512_test_##i##_mask ((__m512i) v, (__m512i) v); } \ 69 return (
u32) _mm512_movepi16_mask ((__m512i) v);
#define static_always_inline
#define foreach_avx512_vec512i
foreach_avx512_vec512i foreach_avx512_vec512u static_always_inline u32 u16x32_msb_mask(u16x32 v)
#define foreach_avx512_vec512u