blob: 903a7c25493f3f1ed407bac684c1f283c9656a00 [file] [log] [blame]
Craig Topper934f86a2018-05-04 21:45:25 +00001/*===---- avx512vlcdintrin.h - AVX512VL and AVX512CD intrinsics ------------===
Michael Zuckerman8c2900f2016-04-27 11:43:14 +00002 *
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to deal
5 * in the Software without restriction, including without limitation the rights
6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 * copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions:
9 *
10 * The above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 * THE SOFTWARE.
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/* Define the default attributes for the functions in this file. */
Craig Topper74c10e32018-07-09 19:00:16 +000031#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)))
Michael Zuckerman8c2900f2016-04-27 11:43:14 +000033
34
Craig Topper74c10e32018-07-09 19:00:16 +000035static __inline__ __m128i __DEFAULT_FN_ATTRS128
Michael Zuckerman8c2900f2016-04-27 11:43:14 +000036_mm_broadcastmb_epi64 (__mmask8 __A)
Fangrui Song6907ce22018-07-30 19:24:48 +000037{
Jina Nahias48e298b2017-11-06 07:04:12 +000038 return (__m128i) _mm_set1_epi64x((long long) __A);
Michael Zuckerman8c2900f2016-04-27 11:43:14 +000039}
40
Craig Topper74c10e32018-07-09 19:00:16 +000041static __inline__ __m256i __DEFAULT_FN_ATTRS256
Michael Zuckerman8c2900f2016-04-27 11:43:14 +000042_mm256_broadcastmb_epi64 (__mmask8 __A)
43{
Jina Nahias48e298b2017-11-06 07:04:12 +000044 return (__m256i) _mm256_set1_epi64x((long long)__A);
Michael Zuckerman8c2900f2016-04-27 11:43:14 +000045}
46
Craig Topper74c10e32018-07-09 19:00:16 +000047static __inline__ __m128i __DEFAULT_FN_ATTRS128
Michael Zuckerman8c2900f2016-04-27 11:43:14 +000048_mm_broadcastmw_epi32 (__mmask16 __A)
49{
Jina Nahias48e298b2017-11-06 07:04:12 +000050 return (__m128i) _mm_set1_epi32((int)__A);
Michael Zuckerman8c2900f2016-04-27 11:43:14 +000051}
52
Craig Topper74c10e32018-07-09 19:00:16 +000053static __inline__ __m256i __DEFAULT_FN_ATTRS256
Michael Zuckerman8c2900f2016-04-27 11:43:14 +000054_mm256_broadcastmw_epi32 (__mmask16 __A)
55{
Jina Nahias48e298b2017-11-06 07:04:12 +000056 return (__m256i) _mm256_set1_epi32((int)__A);
Michael Zuckerman8c2900f2016-04-27 11:43:14 +000057}
58
59
Craig Topper74c10e32018-07-09 19:00:16 +000060static __inline__ __m128i __DEFAULT_FN_ATTRS128
Michael Zuckerman514f0552016-04-27 15:35:13 +000061_mm_conflict_epi64 (__m128i __A)
62{
63 return (__m128i) __builtin_ia32_vpconflictdi_128_mask ((__v2di) __A,
64 (__v2di) _mm_undefined_si128 (),
65 (__mmask8) -1);
66}
67
Craig Topper74c10e32018-07-09 19:00:16 +000068static __inline__ __m128i __DEFAULT_FN_ATTRS128
Michael Zuckerman514f0552016-04-27 15:35:13 +000069_mm_mask_conflict_epi64 (__m128i __W, __mmask8 __U, __m128i __A)
70{
71 return (__m128i) __builtin_ia32_vpconflictdi_128_mask ((__v2di) __A,
72 (__v2di) __W,
73 (__mmask8) __U);
74}
75
Craig Topper74c10e32018-07-09 19:00:16 +000076static __inline__ __m128i __DEFAULT_FN_ATTRS128
Michael Zuckerman514f0552016-04-27 15:35:13 +000077_mm_maskz_conflict_epi64 (__mmask8 __U, __m128i __A)
78{
79 return (__m128i) __builtin_ia32_vpconflictdi_128_mask ((__v2di) __A,
80 (__v2di)
Craig Topperdff5b312018-05-30 18:02:11 +000081 _mm_setzero_si128 (),
Michael Zuckerman514f0552016-04-27 15:35:13 +000082 (__mmask8) __U);
83}
84
Craig Topper74c10e32018-07-09 19:00:16 +000085static __inline__ __m256i __DEFAULT_FN_ATTRS256
Michael Zuckerman514f0552016-04-27 15:35:13 +000086_mm256_conflict_epi64 (__m256i __A)
87{
88 return (__m256i) __builtin_ia32_vpconflictdi_256_mask ((__v4di) __A,
89 (__v4di) _mm256_undefined_si256 (),
90 (__mmask8) -1);
91}
92
Craig Topper74c10e32018-07-09 19:00:16 +000093static __inline__ __m256i __DEFAULT_FN_ATTRS256
Michael Zuckerman514f0552016-04-27 15:35:13 +000094_mm256_mask_conflict_epi64 (__m256i __W, __mmask8 __U, __m256i __A)
95{
96 return (__m256i) __builtin_ia32_vpconflictdi_256_mask ((__v4di) __A,
97 (__v4di) __W,
98 (__mmask8) __U);
99}
100
Craig Topper74c10e32018-07-09 19:00:16 +0000101static __inline__ __m256i __DEFAULT_FN_ATTRS256
Michael Zuckerman514f0552016-04-27 15:35:13 +0000102_mm256_maskz_conflict_epi64 (__mmask8 __U, __m256i __A)
103{
104 return (__m256i) __builtin_ia32_vpconflictdi_256_mask ((__v4di) __A,
105 (__v4di) _mm256_setzero_si256 (),
106 (__mmask8) __U);
107}
108
Craig Topper74c10e32018-07-09 19:00:16 +0000109static __inline__ __m128i __DEFAULT_FN_ATTRS128
Michael Zuckerman514f0552016-04-27 15:35:13 +0000110_mm_conflict_epi32 (__m128i __A)
111{
112 return (__m128i) __builtin_ia32_vpconflictsi_128_mask ((__v4si) __A,
113 (__v4si) _mm_undefined_si128 (),
114 (__mmask8) -1);
115}
116
Craig Topper74c10e32018-07-09 19:00:16 +0000117static __inline__ __m128i __DEFAULT_FN_ATTRS128
Michael Zuckerman514f0552016-04-27 15:35:13 +0000118_mm_mask_conflict_epi32 (__m128i __W, __mmask8 __U, __m128i __A)
119{
120 return (__m128i) __builtin_ia32_vpconflictsi_128_mask ((__v4si) __A,
121 (__v4si) __W,
122 (__mmask8) __U);
123}
124
Craig Topper74c10e32018-07-09 19:00:16 +0000125static __inline__ __m128i __DEFAULT_FN_ATTRS128
Michael Zuckerman514f0552016-04-27 15:35:13 +0000126_mm_maskz_conflict_epi32 (__mmask8 __U, __m128i __A)
127{
128 return (__m128i) __builtin_ia32_vpconflictsi_128_mask ((__v4si) __A,
129 (__v4si) _mm_setzero_si128 (),
130 (__mmask8) __U);
131}
132
Craig Topper74c10e32018-07-09 19:00:16 +0000133static __inline__ __m256i __DEFAULT_FN_ATTRS256
Michael Zuckerman514f0552016-04-27 15:35:13 +0000134_mm256_conflict_epi32 (__m256i __A)
135{
136 return (__m256i) __builtin_ia32_vpconflictsi_256_mask ((__v8si) __A,
137 (__v8si) _mm256_undefined_si256 (),
138 (__mmask8) -1);
139}
140
Craig Topper74c10e32018-07-09 19:00:16 +0000141static __inline__ __m256i __DEFAULT_FN_ATTRS256
Michael Zuckerman514f0552016-04-27 15:35:13 +0000142_mm256_mask_conflict_epi32 (__m256i __W, __mmask8 __U, __m256i __A)
143{
144 return (__m256i) __builtin_ia32_vpconflictsi_256_mask ((__v8si) __A,
145 (__v8si) __W,
146 (__mmask8) __U);
147}
148
Craig Topper74c10e32018-07-09 19:00:16 +0000149static __inline__ __m256i __DEFAULT_FN_ATTRS256
Michael Zuckerman514f0552016-04-27 15:35:13 +0000150_mm256_maskz_conflict_epi32 (__mmask8 __U, __m256i __A)
151{
152 return (__m256i) __builtin_ia32_vpconflictsi_256_mask ((__v8si) __A,
153 (__v8si)
154 _mm256_setzero_si256 (),
155 (__mmask8) __U);
156}
157
Craig Topper74c10e32018-07-09 19:00:16 +0000158static __inline__ __m128i __DEFAULT_FN_ATTRS128
Craig Topper879b0972016-06-21 06:53:58 +0000159_mm_lzcnt_epi32 (__m128i __A)
160{
Craig Topper8e3689c2018-05-22 20:48:24 +0000161 return (__m128i) __builtin_ia32_vplzcntd_128 ((__v4si) __A);
Craig Topper879b0972016-06-21 06:53:58 +0000162}
163
Craig Topper74c10e32018-07-09 19:00:16 +0000164static __inline__ __m128i __DEFAULT_FN_ATTRS128
Craig Topper879b0972016-06-21 06:53:58 +0000165_mm_mask_lzcnt_epi32 (__m128i __W, __mmask8 __U, __m128i __A)
166{
Craig Topper8e3689c2018-05-22 20:48:24 +0000167 return (__m128i)__builtin_ia32_selectd_128((__mmask8)__U,
168 (__v4si)_mm_lzcnt_epi32(__A),
169 (__v4si)__W);
Craig Topper879b0972016-06-21 06:53:58 +0000170}
171
Craig Topper74c10e32018-07-09 19:00:16 +0000172static __inline__ __m128i __DEFAULT_FN_ATTRS128
Craig Topper879b0972016-06-21 06:53:58 +0000173_mm_maskz_lzcnt_epi32 (__mmask8 __U, __m128i __A)
174{
Craig Topper8e3689c2018-05-22 20:48:24 +0000175 return (__m128i)__builtin_ia32_selectd_128((__mmask8)__U,
176 (__v4si)_mm_lzcnt_epi32(__A),
177 (__v4si)_mm_setzero_si128());
Craig Topper879b0972016-06-21 06:53:58 +0000178}
179
Craig Topper74c10e32018-07-09 19:00:16 +0000180static __inline__ __m256i __DEFAULT_FN_ATTRS256
Craig Topper879b0972016-06-21 06:53:58 +0000181_mm256_lzcnt_epi32 (__m256i __A)
182{
Craig Topper8e3689c2018-05-22 20:48:24 +0000183 return (__m256i) __builtin_ia32_vplzcntd_256 ((__v8si) __A);
Craig Topper879b0972016-06-21 06:53:58 +0000184}
185
Craig Topper74c10e32018-07-09 19:00:16 +0000186static __inline__ __m256i __DEFAULT_FN_ATTRS256
Craig Topper879b0972016-06-21 06:53:58 +0000187_mm256_mask_lzcnt_epi32 (__m256i __W, __mmask8 __U, __m256i __A)
188{
Craig Topper8e3689c2018-05-22 20:48:24 +0000189 return (__m256i)__builtin_ia32_selectd_256((__mmask8)__U,
190 (__v8si)_mm256_lzcnt_epi32(__A),
191 (__v8si)__W);
Craig Topper879b0972016-06-21 06:53:58 +0000192}
193
Craig Topper74c10e32018-07-09 19:00:16 +0000194static __inline__ __m256i __DEFAULT_FN_ATTRS256
Craig Topper879b0972016-06-21 06:53:58 +0000195_mm256_maskz_lzcnt_epi32 (__mmask8 __U, __m256i __A)
196{
Craig Topper8e3689c2018-05-22 20:48:24 +0000197 return (__m256i)__builtin_ia32_selectd_256((__mmask8)__U,
198 (__v8si)_mm256_lzcnt_epi32(__A),
199 (__v8si)_mm256_setzero_si256());
Craig Topper879b0972016-06-21 06:53:58 +0000200}
201
Craig Topper74c10e32018-07-09 19:00:16 +0000202static __inline__ __m128i __DEFAULT_FN_ATTRS128
Craig Topper879b0972016-06-21 06:53:58 +0000203_mm_lzcnt_epi64 (__m128i __A)
204{
Craig Topper8e3689c2018-05-22 20:48:24 +0000205 return (__m128i) __builtin_ia32_vplzcntq_128 ((__v2di) __A);
Craig Topper879b0972016-06-21 06:53:58 +0000206}
207
Craig Topper74c10e32018-07-09 19:00:16 +0000208static __inline__ __m128i __DEFAULT_FN_ATTRS128
Craig Topper879b0972016-06-21 06:53:58 +0000209_mm_mask_lzcnt_epi64 (__m128i __W, __mmask8 __U, __m128i __A)
210{
Craig Topper8e3689c2018-05-22 20:48:24 +0000211 return (__m128i)__builtin_ia32_selectq_128((__mmask8)__U,
212 (__v2di)_mm_lzcnt_epi64(__A),
213 (__v2di)__W);
Craig Topper879b0972016-06-21 06:53:58 +0000214}
215
Craig Topper74c10e32018-07-09 19:00:16 +0000216static __inline__ __m128i __DEFAULT_FN_ATTRS128
Craig Topper879b0972016-06-21 06:53:58 +0000217_mm_maskz_lzcnt_epi64 (__mmask8 __U, __m128i __A)
218{
Craig Topper8e3689c2018-05-22 20:48:24 +0000219 return (__m128i)__builtin_ia32_selectq_128((__mmask8)__U,
220 (__v2di)_mm_lzcnt_epi64(__A),
Craig Topperdff5b312018-05-30 18:02:11 +0000221 (__v2di)_mm_setzero_si128());
Craig Topper879b0972016-06-21 06:53:58 +0000222}
223
Craig Topper74c10e32018-07-09 19:00:16 +0000224static __inline__ __m256i __DEFAULT_FN_ATTRS256
Craig Topper879b0972016-06-21 06:53:58 +0000225_mm256_lzcnt_epi64 (__m256i __A)
226{
Craig Topper8e3689c2018-05-22 20:48:24 +0000227 return (__m256i) __builtin_ia32_vplzcntq_256 ((__v4di) __A);
Craig Topper879b0972016-06-21 06:53:58 +0000228}
229
Craig Topper74c10e32018-07-09 19:00:16 +0000230static __inline__ __m256i __DEFAULT_FN_ATTRS256
Craig Topper879b0972016-06-21 06:53:58 +0000231_mm256_mask_lzcnt_epi64 (__m256i __W, __mmask8 __U, __m256i __A)
232{
Craig Topper8e3689c2018-05-22 20:48:24 +0000233 return (__m256i)__builtin_ia32_selectq_256((__mmask8)__U,
234 (__v4di)_mm256_lzcnt_epi64(__A),
235 (__v4di)__W);
Craig Topper879b0972016-06-21 06:53:58 +0000236}
237
Craig Topper74c10e32018-07-09 19:00:16 +0000238static __inline__ __m256i __DEFAULT_FN_ATTRS256
Craig Topper879b0972016-06-21 06:53:58 +0000239_mm256_maskz_lzcnt_epi64 (__mmask8 __U, __m256i __A)
240{
Craig Topper8e3689c2018-05-22 20:48:24 +0000241 return (__m256i)__builtin_ia32_selectq_256((__mmask8)__U,
242 (__v4di)_mm256_lzcnt_epi64(__A),
243 (__v4di)_mm256_setzero_si256());
Craig Topper879b0972016-06-21 06:53:58 +0000244}
245
Craig Topper74c10e32018-07-09 19:00:16 +0000246#undef __DEFAULT_FN_ATTRS128
247#undef __DEFAULT_FN_ATTRS256
Michael Zuckerman8c2900f2016-04-27 11:43:14 +0000248
Craig Topper879b0972016-06-21 06:53:58 +0000249#endif /* __AVX512VLCDINTRIN_H */