1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | #ifndef __IMMINTRIN_H |
25 | #error \ |
26 | "Never use <avx512vpopcntdqvlintrin.h> directly; include <immintrin.h> instead." |
27 | #endif |
28 | |
29 | #ifndef __AVX512VPOPCNTDQVLINTRIN_H |
30 | #define __AVX512VPOPCNTDQVLINTRIN_H |
31 | |
32 | |
33 | #define __DEFAULT_FN_ATTRS128 \ |
34 | __attribute__((__always_inline__, __nodebug__, __target__("avx512vpopcntdq,avx512vl"), __min_vector_width__(128))) |
35 | #define __DEFAULT_FN_ATTRS256 \ |
36 | __attribute__((__always_inline__, __nodebug__, __target__("avx512vpopcntdq,avx512vl"), __min_vector_width__(256))) |
37 | |
38 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
39 | _mm_popcnt_epi64(__m128i __A) { |
40 | return (__m128i)__builtin_ia32_vpopcntq_128((__v2di)__A); |
41 | } |
42 | |
43 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
44 | _mm_mask_popcnt_epi64(__m128i __W, __mmask8 __U, __m128i __A) { |
45 | return (__m128i)__builtin_ia32_selectq_128( |
46 | (__mmask8)__U, (__v2di)_mm_popcnt_epi64(__A), (__v2di)__W); |
47 | } |
48 | |
49 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
50 | _mm_maskz_popcnt_epi64(__mmask8 __U, __m128i __A) { |
51 | return _mm_mask_popcnt_epi64((__m128i)_mm_setzero_si128(), __U, __A); |
52 | } |
53 | |
54 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
55 | _mm_popcnt_epi32(__m128i __A) { |
56 | return (__m128i)__builtin_ia32_vpopcntd_128((__v4si)__A); |
57 | } |
58 | |
59 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
60 | _mm_mask_popcnt_epi32(__m128i __W, __mmask8 __U, __m128i __A) { |
61 | return (__m128i)__builtin_ia32_selectd_128( |
62 | (__mmask8)__U, (__v4si)_mm_popcnt_epi32(__A), (__v4si)__W); |
63 | } |
64 | |
65 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
66 | _mm_maskz_popcnt_epi32(__mmask8 __U, __m128i __A) { |
67 | return _mm_mask_popcnt_epi32((__m128i)_mm_setzero_si128(), __U, __A); |
68 | } |
69 | |
70 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
71 | _mm256_popcnt_epi64(__m256i __A) { |
72 | return (__m256i)__builtin_ia32_vpopcntq_256((__v4di)__A); |
73 | } |
74 | |
75 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
76 | _mm256_mask_popcnt_epi64(__m256i __W, __mmask8 __U, __m256i __A) { |
77 | return (__m256i)__builtin_ia32_selectq_256( |
78 | (__mmask8)__U, (__v4di)_mm256_popcnt_epi64(__A), (__v4di)__W); |
79 | } |
80 | |
81 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
82 | _mm256_maskz_popcnt_epi64(__mmask8 __U, __m256i __A) { |
83 | return _mm256_mask_popcnt_epi64((__m256i)_mm256_setzero_si256(), __U, __A); |
84 | } |
85 | |
86 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
87 | _mm256_popcnt_epi32(__m256i __A) { |
88 | return (__m256i)__builtin_ia32_vpopcntd_256((__v8si)__A); |
89 | } |
90 | |
91 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
92 | _mm256_mask_popcnt_epi32(__m256i __W, __mmask8 __U, __m256i __A) { |
93 | return (__m256i)__builtin_ia32_selectd_256( |
94 | (__mmask8)__U, (__v8si)_mm256_popcnt_epi32(__A), (__v8si)__W); |
95 | } |
96 | |
97 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
98 | _mm256_maskz_popcnt_epi32(__mmask8 __U, __m256i __A) { |
99 | return _mm256_mask_popcnt_epi32((__m256i)_mm256_setzero_si256(), __U, __A); |
100 | } |
101 | |
102 | #undef __DEFAULT_FN_ATTRS128 |
103 | #undef __DEFAULT_FN_ATTRS256 |
104 | |
105 | #endif |
106 | |