clang  8.0.0svn
immintrin.h
Go to the documentation of this file.
1 /*===---- immintrin.h - Intel intrinsics -----------------------------------===
2  *
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 
24 #ifndef __IMMINTRIN_H
25 #define __IMMINTRIN_H
26 
27 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__MMX__)
28 #include <mmintrin.h>
29 #endif
30 
31 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__SSE__)
32 #include <xmmintrin.h>
33 #endif
34 
35 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__SSE2__)
36 #include <emmintrin.h>
37 #endif
38 
39 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__SSE3__)
40 #include <pmmintrin.h>
41 #endif
42 
43 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__SSSE3__)
44 #include <tmmintrin.h>
45 #endif
46 
47 #if !defined(_MSC_VER) || __has_feature(modules) || \
48  (defined(__SSE4_2__) || defined(__SSE4_1__))
49 #include <smmintrin.h>
50 #endif
51 
52 #if !defined(_MSC_VER) || __has_feature(modules) || \
53  (defined(__AES__) || defined(__PCLMUL__))
54 #include <wmmintrin.h>
55 #endif
56 
57 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__CLFLUSHOPT__)
58 #include <clflushoptintrin.h>
59 #endif
60 
61 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__CLWB__)
62 #include <clwbintrin.h>
63 #endif
64 
65 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX__)
66 #include <avxintrin.h>
67 #endif
68 
69 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX2__)
70 #include <avx2intrin.h>
71 #endif
72 
73 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__F16C__)
74 #include <f16cintrin.h>
75 #endif
76 
77 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__VPCLMULQDQ__)
78 #include <vpclmulqdqintrin.h>
79 #endif
80 
81 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__BMI__)
82 #include <bmiintrin.h>
83 #endif
84 
85 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__BMI2__)
86 #include <bmi2intrin.h>
87 #endif
88 
89 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__LZCNT__)
90 #include <lzcntintrin.h>
91 #endif
92 
93 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__POPCNT__)
94 #include <popcntintrin.h>
95 #endif
96 
97 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__FMA__)
98 #include <fmaintrin.h>
99 #endif
100 
101 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512F__)
102 #include <avx512fintrin.h>
103 #endif
104 
105 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512VL__)
106 #include <avx512vlintrin.h>
107 #endif
108 
109 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512BW__)
110 #include <avx512bwintrin.h>
111 #endif
112 
113 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512BITALG__)
114 #include <avx512bitalgintrin.h>
115 #endif
116 
117 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512CD__)
118 #include <avx512cdintrin.h>
119 #endif
120 
121 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512VPOPCNTDQ__)
122 #include <avx512vpopcntdqintrin.h>
123 #endif
124 
125 #if !defined(_MSC_VER) || __has_feature(modules) || \
126  (defined(__AVX512VL__) && defined(__AVX512VPOPCNTDQ__))
127 #include <avx512vpopcntdqvlintrin.h>
128 #endif
129 
130 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512VNNI__)
131 #include <avx512vnniintrin.h>
132 #endif
133 
134 #if !defined(_MSC_VER) || __has_feature(modules) || \
135  (defined(__AVX512VL__) && defined(__AVX512VNNI__))
136 #include <avx512vlvnniintrin.h>
137 #endif
138 
139 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512DQ__)
140 #include <avx512dqintrin.h>
141 #endif
142 
143 #if !defined(_MSC_VER) || __has_feature(modules) || \
144  (defined(__AVX512VL__) && defined(__AVX512BITALG__))
145 #include <avx512vlbitalgintrin.h>
146 #endif
147 
148 #if !defined(_MSC_VER) || __has_feature(modules) || \
149  (defined(__AVX512VL__) && defined(__AVX512BW__))
150 #include <avx512vlbwintrin.h>
151 #endif
152 
153 #if !defined(_MSC_VER) || __has_feature(modules) || \
154  (defined(__AVX512VL__) && defined(__AVX512CD__))
155 #include <avx512vlcdintrin.h>
156 #endif
157 
158 #if !defined(_MSC_VER) || __has_feature(modules) || \
159  (defined(__AVX512VL__) && defined(__AVX512DQ__))
160 #include <avx512vldqintrin.h>
161 #endif
162 
163 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512ER__)
164 #include <avx512erintrin.h>
165 #endif
166 
167 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512IFMA__)
168 #include <avx512ifmaintrin.h>
169 #endif
170 
171 #if !defined(_MSC_VER) || __has_feature(modules) || \
172  (defined(__AVX512IFMA__) && defined(__AVX512VL__))
173 #include <avx512ifmavlintrin.h>
174 #endif
175 
176 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512VBMI__)
177 #include <avx512vbmiintrin.h>
178 #endif
179 
180 #if !defined(_MSC_VER) || __has_feature(modules) || \
181  (defined(__AVX512VBMI__) && defined(__AVX512VL__))
182 #include <avx512vbmivlintrin.h>
183 #endif
184 
185 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512VBMI2__)
186 #include <avx512vbmi2intrin.h>
187 #endif
188 
189 #if !defined(_MSC_VER) || __has_feature(modules) || \
190  (defined(__AVX512VBMI2__) && defined(__AVX512VL__))
191 #include <avx512vlvbmi2intrin.h>
192 #endif
193 
194 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512PF__)
195 #include <avx512pfintrin.h>
196 #endif
197 
198 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__PKU__)
199 #include <pkuintrin.h>
200 #endif
201 
202 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__VAES__)
203 #include <vaesintrin.h>
204 #endif
205 
206 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__GFNI__)
207 #include <gfniintrin.h>
208 #endif
209 
210 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__RDPID__)
211 /// Returns the value of the IA32_TSC_AUX MSR (0xc0000103).
212 ///
213 /// \headerfile <immintrin.h>
214 ///
215 /// This intrinsic corresponds to the <c> RDPID </c> instruction.
216 static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("rdpid")))
217 _rdpid_u32(void) {
218  return __builtin_ia32_rdpid();
219 }
220 #endif // __RDPID__
221 
222 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__RDRND__)
223 static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
224 _rdrand16_step(unsigned short *__p)
225 {
226  return __builtin_ia32_rdrand16_step(__p);
227 }
228 
229 static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
230 _rdrand32_step(unsigned int *__p)
231 {
232  return __builtin_ia32_rdrand32_step(__p);
233 }
234 
235 #ifdef __x86_64__
236 static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
237 _rdrand64_step(unsigned long long *__p)
238 {
239  return __builtin_ia32_rdrand64_step(__p);
240 }
241 #endif
242 #endif /* __RDRND__ */
243 
244 /* __bit_scan_forward */
245 static __inline__ int __attribute__((__always_inline__, __nodebug__))
246 _bit_scan_forward(int __A) {
247  return __builtin_ctz(__A);
248 }
249 
250 /* __bit_scan_reverse */
251 static __inline__ int __attribute__((__always_inline__, __nodebug__))
252 _bit_scan_reverse(int __A) {
253  return 31 - __builtin_clz(__A);
254 }
255 
256 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__FSGSBASE__)
257 #ifdef __x86_64__
258 static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
259 _readfsbase_u32(void)
260 {
261  return __builtin_ia32_rdfsbase32();
262 }
263 
264 static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
265 _readfsbase_u64(void)
266 {
267  return __builtin_ia32_rdfsbase64();
268 }
269 
270 static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
271 _readgsbase_u32(void)
272 {
273  return __builtin_ia32_rdgsbase32();
274 }
275 
276 static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
277 _readgsbase_u64(void)
278 {
279  return __builtin_ia32_rdgsbase64();
280 }
281 
282 static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
283 _writefsbase_u32(unsigned int __V)
284 {
285  __builtin_ia32_wrfsbase32(__V);
286 }
287 
288 static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
289 _writefsbase_u64(unsigned long long __V)
290 {
291  __builtin_ia32_wrfsbase64(__V);
292 }
293 
294 static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
295 _writegsbase_u32(unsigned int __V)
296 {
297  __builtin_ia32_wrgsbase32(__V);
298 }
299 
300 static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
301 _writegsbase_u64(unsigned long long __V)
302 {
303  __builtin_ia32_wrgsbase64(__V);
304 }
305 
306 #endif
307 #endif /* __FSGSBASE__ */
308 
309 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__RTM__)
310 #include <rtmintrin.h>
311 #include <xtestintrin.h>
312 #endif
313 
314 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__SHA__)
315 #include <shaintrin.h>
316 #endif
317 
318 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__FXSR__)
319 #include <fxsrintrin.h>
320 #endif
321 
322 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__XSAVE__)
323 #include <xsaveintrin.h>
324 #endif
325 
326 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__XSAVEOPT__)
327 #include <xsaveoptintrin.h>
328 #endif
329 
330 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__XSAVEC__)
331 #include <xsavecintrin.h>
332 #endif
333 
334 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__XSAVES__)
335 #include <xsavesintrin.h>
336 #endif
337 
338 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__SHSTK__)
339 #include <cetintrin.h>
340 #endif
341 
342 /* Some intrinsics inside adxintrin.h are available only on processors with ADX,
343  * whereas others are also available at all times. */
344 #include <adxintrin.h>
345 
346 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__RDSEED__)
347 #include <rdseedintrin.h>
348 #endif
349 
350 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__WBNOINVD__)
351 #include <wbnoinvdintrin.h>
352 #endif
353 
354 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__CLDEMOTE__)
355 #include <cldemoteintrin.h>
356 #endif
357 
358 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__WAITPKG__)
359 #include <waitpkgintrin.h>
360 #endif
361 
362 #if !defined(_MSC_VER) || __has_feature(modules) || \
363  defined(__MOVDIRI__) || defined(__MOVDIR64B__)
364 #include <movdirintrin.h>
365 #endif
366 
367 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__PCONFIG__)
368 #include <pconfigintrin.h>
369 #endif
370 
371 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__SGX__)
372 #include <sgxintrin.h>
373 #endif
374 
375 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__PTWRITE__)
376 #include <ptwriteintrin.h>
377 #endif
378 
379 #if !defined(_MSC_VER) || __has_feature(modules) || defined(__INVPCID__)
380 #include <invpcidintrin.h>
381 #endif
382 
383 #ifdef _MSC_VER
384 /* Define the default attributes for these intrinsics */
385 #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__))
386 #ifdef __cplusplus
387 extern "C" {
388 #endif
389 /*----------------------------------------------------------------------------*\
390 |* Interlocked Exchange HLE
391 \*----------------------------------------------------------------------------*/
392 #if defined(__i386__) || defined(__x86_64__)
393 static __inline__ long __DEFAULT_FN_ATTRS
394 _InterlockedExchange_HLEAcquire(long volatile *_Target, long _Value) {
395  __asm__ __volatile__(".byte 0xf2 ; lock ; xchg %0, %1"
396  : "+r" (_Value), "+m" (*_Target) :: "memory");
397  return _Value;
398 }
399 static __inline__ long __DEFAULT_FN_ATTRS
400 _InterlockedExchange_HLERelease(long volatile *_Target, long _Value) {
401  __asm__ __volatile__(".byte 0xf3 ; lock ; xchg %0, %1"
402  : "+r" (_Value), "+m" (*_Target) :: "memory");
403  return _Value;
404 }
405 #endif
406 #if defined(__x86_64__)
407 static __inline__ __int64 __DEFAULT_FN_ATTRS
408 _InterlockedExchange64_HLEAcquire(__int64 volatile *_Target, __int64 _Value) {
409  __asm__ __volatile__(".byte 0xf2 ; lock ; xchg %0, %1"
410  : "+r" (_Value), "+m" (*_Target) :: "memory");
411  return _Value;
412 }
413 static __inline__ __int64 __DEFAULT_FN_ATTRS
414 _InterlockedExchange64_HLERelease(__int64 volatile *_Target, __int64 _Value) {
415  __asm__ __volatile__(".byte 0xf3 ; lock ; xchg %0, %1"
416  : "+r" (_Value), "+m" (*_Target) :: "memory");
417  return _Value;
418 }
419 #endif
420 /*----------------------------------------------------------------------------*\
421 |* Interlocked Compare Exchange HLE
422 \*----------------------------------------------------------------------------*/
423 #if defined(__i386__) || defined(__x86_64__)
424 static __inline__ long __DEFAULT_FN_ATTRS
425 _InterlockedCompareExchange_HLEAcquire(long volatile *_Destination,
426  long _Exchange, long _Comparand) {
427  __asm__ __volatile__(".byte 0xf2 ; lock ; cmpxchg %2, %1"
428  : "+a" (_Comparand), "+m" (*_Destination)
429  : "r" (_Exchange) : "memory");
430  return _Comparand;
431 }
432 static __inline__ long __DEFAULT_FN_ATTRS
433 _InterlockedCompareExchange_HLERelease(long volatile *_Destination,
434  long _Exchange, long _Comparand) {
435  __asm__ __volatile__(".byte 0xf3 ; lock ; cmpxchg %2, %1"
436  : "+a" (_Comparand), "+m" (*_Destination)
437  : "r" (_Exchange) : "memory");
438  return _Comparand;
439 }
440 #endif
441 #if defined(__x86_64__)
442 static __inline__ __int64 __DEFAULT_FN_ATTRS
443 _InterlockedCompareExchange64_HLEAcquire(__int64 volatile *_Destination,
444  __int64 _Exchange, __int64 _Comparand) {
445  __asm__ __volatile__(".byte 0xf2 ; lock ; cmpxchg %2, %1"
446  : "+a" (_Comparand), "+m" (*_Destination)
447  : "r" (_Exchange) : "memory");
448  return _Comparand;
449 }
450 static __inline__ __int64 __DEFAULT_FN_ATTRS
451 _InterlockedCompareExchange64_HLERelease(__int64 volatile *_Destination,
452  __int64 _Exchange, __int64 _Comparand) {
453  __asm__ __volatile__(".byte 0xf3 ; lock ; cmpxchg %2, %1"
454  : "+a" (_Comparand), "+m" (*_Destination)
455  : "r" (_Exchange) : "memory");
456  return _Comparand;
457 }
458 #endif
459 #ifdef __cplusplus
460 }
461 #endif
462 
463 #undef __DEFAULT_FN_ATTRS
464 
465 #endif /* _MSC_VER */
466 
467 #endif /* __IMMINTRIN_H */
static __inline unsigned char unsigned int unsigned int unsigned int * __p
Definition: adxintrin.h:38
#define __DEFAULT_FN_ATTRS
static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("rdpid"))) _rdpid_u32(void)
Returns the value of the IA32_TSC_AUX MSR (0xc0000103).
Definition: immintrin.h:216