1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | #ifndef __IMMINTRIN_H |
24 | #error "Never use <avx512vlcdintrin.h> directly; include <immintrin.h> instead." |
25 | #endif |
26 | |
27 | #ifndef __AVX512VLCDINTRIN_H |
28 | #define __AVX512VLCDINTRIN_H |
29 | |
30 | |
31 | #define __DEFAULT_FN_ATTRS128 __attribute__((__always_inline__, __nodebug__, __target__("avx512vl,avx512cd"), __min_vector_width__(128))) |
32 | #define __DEFAULT_FN_ATTRS256 __attribute__((__always_inline__, __nodebug__, __target__("avx512vl,avx512cd"), __min_vector_width__(256))) |
33 | |
34 | |
35 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
36 | _mm_broadcastmb_epi64 (__mmask8 __A) |
37 | { |
38 | return (__m128i) _mm_set1_epi64x((long long) __A); |
39 | } |
40 | |
41 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
42 | _mm256_broadcastmb_epi64 (__mmask8 __A) |
43 | { |
44 | return (__m256i) _mm256_set1_epi64x((long long)__A); |
45 | } |
46 | |
47 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
48 | _mm_broadcastmw_epi32 (__mmask16 __A) |
49 | { |
50 | return (__m128i) _mm_set1_epi32((int)__A); |
51 | } |
52 | |
53 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
54 | _mm256_broadcastmw_epi32 (__mmask16 __A) |
55 | { |
56 | return (__m256i) _mm256_set1_epi32((int)__A); |
57 | } |
58 | |
59 | |
60 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
61 | _mm_conflict_epi64 (__m128i __A) |
62 | { |
63 | return (__m128i) __builtin_ia32_vpconflictdi_128 ((__v2di) __A); |
64 | } |
65 | |
66 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
67 | _mm_mask_conflict_epi64 (__m128i __W, __mmask8 __U, __m128i __A) |
68 | { |
69 | return (__m128i)__builtin_ia32_selectq_128((__mmask8)__U, |
70 | (__v2di)_mm_conflict_epi64(__A), |
71 | (__v2di)__W); |
72 | } |
73 | |
74 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
75 | _mm_maskz_conflict_epi64 (__mmask8 __U, __m128i __A) |
76 | { |
77 | return (__m128i)__builtin_ia32_selectq_128((__mmask8)__U, |
78 | (__v2di)_mm_conflict_epi64(__A), |
79 | (__v2di)_mm_setzero_si128()); |
80 | } |
81 | |
82 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
83 | _mm256_conflict_epi64 (__m256i __A) |
84 | { |
85 | return (__m256i) __builtin_ia32_vpconflictdi_256 ((__v4di) __A); |
86 | } |
87 | |
88 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
89 | _mm256_mask_conflict_epi64 (__m256i __W, __mmask8 __U, __m256i __A) |
90 | { |
91 | return (__m256i)__builtin_ia32_selectq_256((__mmask8)__U, |
92 | (__v4di)_mm256_conflict_epi64(__A), |
93 | (__v4di)__W); |
94 | } |
95 | |
96 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
97 | _mm256_maskz_conflict_epi64 (__mmask8 __U, __m256i __A) |
98 | { |
99 | return (__m256i)__builtin_ia32_selectq_256((__mmask8)__U, |
100 | (__v4di)_mm256_conflict_epi64(__A), |
101 | (__v4di)_mm256_setzero_si256()); |
102 | } |
103 | |
104 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
105 | _mm_conflict_epi32 (__m128i __A) |
106 | { |
107 | return (__m128i) __builtin_ia32_vpconflictsi_128 ((__v4si) __A); |
108 | } |
109 | |
110 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
111 | _mm_mask_conflict_epi32 (__m128i __W, __mmask8 __U, __m128i __A) |
112 | { |
113 | return (__m128i)__builtin_ia32_selectd_128((__mmask8)__U, |
114 | (__v4si)_mm_conflict_epi32(__A), |
115 | (__v4si)__W); |
116 | } |
117 | |
118 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
119 | _mm_maskz_conflict_epi32 (__mmask8 __U, __m128i __A) |
120 | { |
121 | return (__m128i)__builtin_ia32_selectd_128((__mmask8)__U, |
122 | (__v4si)_mm_conflict_epi32(__A), |
123 | (__v4si)_mm_setzero_si128()); |
124 | } |
125 | |
126 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
127 | _mm256_conflict_epi32 (__m256i __A) |
128 | { |
129 | return (__m256i) __builtin_ia32_vpconflictsi_256 ((__v8si) __A); |
130 | } |
131 | |
132 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
133 | _mm256_mask_conflict_epi32 (__m256i __W, __mmask8 __U, __m256i __A) |
134 | { |
135 | return (__m256i)__builtin_ia32_selectd_256((__mmask8)__U, |
136 | (__v8si)_mm256_conflict_epi32(__A), |
137 | (__v8si)__W); |
138 | } |
139 | |
140 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
141 | _mm256_maskz_conflict_epi32 (__mmask8 __U, __m256i __A) |
142 | { |
143 | return (__m256i)__builtin_ia32_selectd_256((__mmask8)__U, |
144 | (__v8si)_mm256_conflict_epi32(__A), |
145 | (__v8si)_mm256_setzero_si256()); |
146 | } |
147 | |
148 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
149 | _mm_lzcnt_epi32 (__m128i __A) |
150 | { |
151 | return (__m128i) __builtin_ia32_vplzcntd_128 ((__v4si) __A); |
152 | } |
153 | |
154 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
155 | _mm_mask_lzcnt_epi32 (__m128i __W, __mmask8 __U, __m128i __A) |
156 | { |
157 | return (__m128i)__builtin_ia32_selectd_128((__mmask8)__U, |
158 | (__v4si)_mm_lzcnt_epi32(__A), |
159 | (__v4si)__W); |
160 | } |
161 | |
162 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
163 | _mm_maskz_lzcnt_epi32 (__mmask8 __U, __m128i __A) |
164 | { |
165 | return (__m128i)__builtin_ia32_selectd_128((__mmask8)__U, |
166 | (__v4si)_mm_lzcnt_epi32(__A), |
167 | (__v4si)_mm_setzero_si128()); |
168 | } |
169 | |
170 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
171 | _mm256_lzcnt_epi32 (__m256i __A) |
172 | { |
173 | return (__m256i) __builtin_ia32_vplzcntd_256 ((__v8si) __A); |
174 | } |
175 | |
176 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
177 | _mm256_mask_lzcnt_epi32 (__m256i __W, __mmask8 __U, __m256i __A) |
178 | { |
179 | return (__m256i)__builtin_ia32_selectd_256((__mmask8)__U, |
180 | (__v8si)_mm256_lzcnt_epi32(__A), |
181 | (__v8si)__W); |
182 | } |
183 | |
184 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
185 | _mm256_maskz_lzcnt_epi32 (__mmask8 __U, __m256i __A) |
186 | { |
187 | return (__m256i)__builtin_ia32_selectd_256((__mmask8)__U, |
188 | (__v8si)_mm256_lzcnt_epi32(__A), |
189 | (__v8si)_mm256_setzero_si256()); |
190 | } |
191 | |
192 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
193 | _mm_lzcnt_epi64 (__m128i __A) |
194 | { |
195 | return (__m128i) __builtin_ia32_vplzcntq_128 ((__v2di) __A); |
196 | } |
197 | |
198 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
199 | _mm_mask_lzcnt_epi64 (__m128i __W, __mmask8 __U, __m128i __A) |
200 | { |
201 | return (__m128i)__builtin_ia32_selectq_128((__mmask8)__U, |
202 | (__v2di)_mm_lzcnt_epi64(__A), |
203 | (__v2di)__W); |
204 | } |
205 | |
206 | static __inline__ __m128i __DEFAULT_FN_ATTRS128 |
207 | _mm_maskz_lzcnt_epi64 (__mmask8 __U, __m128i __A) |
208 | { |
209 | return (__m128i)__builtin_ia32_selectq_128((__mmask8)__U, |
210 | (__v2di)_mm_lzcnt_epi64(__A), |
211 | (__v2di)_mm_setzero_si128()); |
212 | } |
213 | |
214 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
215 | _mm256_lzcnt_epi64 (__m256i __A) |
216 | { |
217 | return (__m256i) __builtin_ia32_vplzcntq_256 ((__v4di) __A); |
218 | } |
219 | |
220 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
221 | _mm256_mask_lzcnt_epi64 (__m256i __W, __mmask8 __U, __m256i __A) |
222 | { |
223 | return (__m256i)__builtin_ia32_selectq_256((__mmask8)__U, |
224 | (__v4di)_mm256_lzcnt_epi64(__A), |
225 | (__v4di)__W); |
226 | } |
227 | |
228 | static __inline__ __m256i __DEFAULT_FN_ATTRS256 |
229 | _mm256_maskz_lzcnt_epi64 (__mmask8 __U, __m256i __A) |
230 | { |
231 | return (__m256i)__builtin_ia32_selectq_256((__mmask8)__U, |
232 | (__v4di)_mm256_lzcnt_epi64(__A), |
233 | (__v4di)_mm256_setzero_si256()); |
234 | } |
235 | |
236 | #undef __DEFAULT_FN_ATTRS128 |
237 | #undef __DEFAULT_FN_ATTRS256 |
238 | |
239 | #endif |
240 | |