blob: 8a75895c6c5f1ddb4c9c3ec36586d9381df1f9c7 [file] [log] [blame]
Logan Chien2833ffb2018-10-09 10:03:24 +08001/*===---- immintrin.h - Intel intrinsics -----------------------------------===
2 *
Logan Chiendf4f7662019-09-04 16:45:23 -07003 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 * See https://llvm.org/LICENSE.txt for license information.
5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Logan Chien2833ffb2018-10-09 10:03:24 +08006 *
7 *===-----------------------------------------------------------------------===
8 */
9
10#ifndef __IMMINTRIN_H
11#define __IMMINTRIN_H
12
Pirama Arumuga Nainar986b8802021-06-03 16:00:34 -070013#include <x86gprintrin.h>
14
Sasha Smundak0fc590b2020-10-07 08:11:59 -070015#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
16 defined(__MMX__)
Logan Chien2833ffb2018-10-09 10:03:24 +080017#include <mmintrin.h>
18#endif
19
Sasha Smundak0fc590b2020-10-07 08:11:59 -070020#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
21 defined(__SSE__)
Logan Chien2833ffb2018-10-09 10:03:24 +080022#include <xmmintrin.h>
23#endif
24
Sasha Smundak0fc590b2020-10-07 08:11:59 -070025#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
26 defined(__SSE2__)
Logan Chien2833ffb2018-10-09 10:03:24 +080027#include <emmintrin.h>
28#endif
29
Sasha Smundak0fc590b2020-10-07 08:11:59 -070030#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
31 defined(__SSE3__)
Logan Chien2833ffb2018-10-09 10:03:24 +080032#include <pmmintrin.h>
33#endif
34
Sasha Smundak0fc590b2020-10-07 08:11:59 -070035#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
36 defined(__SSSE3__)
Logan Chien2833ffb2018-10-09 10:03:24 +080037#include <tmmintrin.h>
38#endif
39
Sasha Smundak0fc590b2020-10-07 08:11:59 -070040#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien2833ffb2018-10-09 10:03:24 +080041 (defined(__SSE4_2__) || defined(__SSE4_1__))
42#include <smmintrin.h>
43#endif
44
Sasha Smundak0fc590b2020-10-07 08:11:59 -070045#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien2833ffb2018-10-09 10:03:24 +080046 (defined(__AES__) || defined(__PCLMUL__))
47#include <wmmintrin.h>
48#endif
49
Sasha Smundak0fc590b2020-10-07 08:11:59 -070050#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
51 defined(__CLFLUSHOPT__)
Logan Chien2833ffb2018-10-09 10:03:24 +080052#include <clflushoptintrin.h>
53#endif
54
Sasha Smundak0fc590b2020-10-07 08:11:59 -070055#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
56 defined(__CLWB__)
Logan Chien55afb0a2018-10-15 10:42:14 +080057#include <clwbintrin.h>
58#endif
59
Sasha Smundak0fc590b2020-10-07 08:11:59 -070060#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
61 defined(__AVX__)
Logan Chien2833ffb2018-10-09 10:03:24 +080062#include <avxintrin.h>
63#endif
64
Sasha Smundak0fc590b2020-10-07 08:11:59 -070065#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
66 defined(__AVX2__)
Logan Chien2833ffb2018-10-09 10:03:24 +080067#include <avx2intrin.h>
Logan Chien55afb0a2018-10-15 10:42:14 +080068#endif
Logan Chien2833ffb2018-10-09 10:03:24 +080069
Sasha Smundak0fc590b2020-10-07 08:11:59 -070070#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
71 defined(__F16C__)
Logan Chien55afb0a2018-10-15 10:42:14 +080072#include <f16cintrin.h>
73#endif
Logan Chien2833ffb2018-10-09 10:03:24 +080074
Sasha Smundak746b0222020-02-25 09:19:04 -080075/* No feature check desired due to internal checks */
Logan Chien2833ffb2018-10-09 10:03:24 +080076#include <bmiintrin.h>
Logan Chien2833ffb2018-10-09 10:03:24 +080077
Sasha Smundak0fc590b2020-10-07 08:11:59 -070078#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
79 defined(__BMI2__)
Logan Chien2833ffb2018-10-09 10:03:24 +080080#include <bmi2intrin.h>
81#endif
82
Sasha Smundak0fc590b2020-10-07 08:11:59 -070083#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
84 defined(__LZCNT__)
Logan Chien2833ffb2018-10-09 10:03:24 +080085#include <lzcntintrin.h>
86#endif
87
Sasha Smundak0fc590b2020-10-07 08:11:59 -070088#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
89 defined(__POPCNT__)
Logan Chien55afb0a2018-10-15 10:42:14 +080090#include <popcntintrin.h>
91#endif
92
Sasha Smundak0fc590b2020-10-07 08:11:59 -070093#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
94 defined(__FMA__)
Logan Chien2833ffb2018-10-09 10:03:24 +080095#include <fmaintrin.h>
96#endif
97
Sasha Smundak0fc590b2020-10-07 08:11:59 -070098#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
99 defined(__AVX512F__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800100#include <avx512fintrin.h>
101#endif
102
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700103#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
104 defined(__AVX512VL__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800105#include <avx512vlintrin.h>
106#endif
107
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700108#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
109 defined(__AVX512BW__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800110#include <avx512bwintrin.h>
111#endif
112
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700113#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
114 defined(__AVX512BITALG__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800115#include <avx512bitalgintrin.h>
116#endif
117
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700118#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
119 defined(__AVX512CD__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800120#include <avx512cdintrin.h>
121#endif
122
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700123#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
124 defined(__AVX512VPOPCNTDQ__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800125#include <avx512vpopcntdqintrin.h>
126#endif
127
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700128#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien55afb0a2018-10-15 10:42:14 +0800129 (defined(__AVX512VL__) && defined(__AVX512VPOPCNTDQ__))
130#include <avx512vpopcntdqvlintrin.h>
131#endif
132
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700133#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
134 defined(__AVX512VNNI__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800135#include <avx512vnniintrin.h>
136#endif
137
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700138#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien55afb0a2018-10-15 10:42:14 +0800139 (defined(__AVX512VL__) && defined(__AVX512VNNI__))
140#include <avx512vlvnniintrin.h>
141#endif
142
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700143#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Pirama Arumuga Nainar986b8802021-06-03 16:00:34 -0700144 defined(__AVXVNNI__)
145#include <avxvnniintrin.h>
146#endif
147
148#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700149 defined(__AVX512DQ__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800150#include <avx512dqintrin.h>
151#endif
152
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700153#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien55afb0a2018-10-15 10:42:14 +0800154 (defined(__AVX512VL__) && defined(__AVX512BITALG__))
155#include <avx512vlbitalgintrin.h>
156#endif
157
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700158#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien2833ffb2018-10-09 10:03:24 +0800159 (defined(__AVX512VL__) && defined(__AVX512BW__))
160#include <avx512vlbwintrin.h>
161#endif
162
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700163#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien2833ffb2018-10-09 10:03:24 +0800164 (defined(__AVX512VL__) && defined(__AVX512CD__))
165#include <avx512vlcdintrin.h>
166#endif
167
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700168#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien2833ffb2018-10-09 10:03:24 +0800169 (defined(__AVX512VL__) && defined(__AVX512DQ__))
170#include <avx512vldqintrin.h>
171#endif
172
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700173#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
174 defined(__AVX512ER__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800175#include <avx512erintrin.h>
176#endif
177
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700178#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
179 defined(__AVX512IFMA__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800180#include <avx512ifmaintrin.h>
181#endif
182
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700183#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien2833ffb2018-10-09 10:03:24 +0800184 (defined(__AVX512IFMA__) && defined(__AVX512VL__))
185#include <avx512ifmavlintrin.h>
186#endif
187
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700188#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
189 defined(__AVX512VBMI__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800190#include <avx512vbmiintrin.h>
191#endif
192
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700193#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien2833ffb2018-10-09 10:03:24 +0800194 (defined(__AVX512VBMI__) && defined(__AVX512VL__))
195#include <avx512vbmivlintrin.h>
196#endif
197
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700198#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
199 defined(__AVX512VBMI2__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800200#include <avx512vbmi2intrin.h>
201#endif
202
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700203#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien55afb0a2018-10-15 10:42:14 +0800204 (defined(__AVX512VBMI2__) && defined(__AVX512VL__))
205#include <avx512vlvbmi2intrin.h>
206#endif
207
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700208#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
209 defined(__AVX512PF__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800210#include <avx512pfintrin.h>
211#endif
212
Pirama Arumuga Nainar494f6452021-12-02 10:42:14 -0800213/*
214 * FIXME: _Float16 type is legal only when HW support float16 operation.
215 * We use __AVX512FP16__ to identify if float16 is supported or not, so
216 * when float16 is not supported, the related header is not included.
217 *
218 */
219#if defined(__AVX512FP16__)
220#include <avx512fp16intrin.h>
221#endif
222
223#if defined(__AVX512FP16__) && defined(__AVX512VL__)
224#include <avx512vlfp16intrin.h>
225#endif
226
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700227#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
228 defined(__AVX512BF16__)
Logan Chiendf4f7662019-09-04 16:45:23 -0700229#include <avx512bf16intrin.h>
230#endif
231
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700232#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chiendf4f7662019-09-04 16:45:23 -0700233 (defined(__AVX512VL__) && defined(__AVX512BF16__))
234#include <avx512vlbf16intrin.h>
235#endif
236
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700237#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
238 defined(__PKU__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800239#include <pkuintrin.h>
240#endif
241
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700242#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Pirama Arumuga Nainar7e1f8392021-08-16 17:30:48 -0700243 defined(__VPCLMULQDQ__)
244#include <vpclmulqdqintrin.h>
245#endif
246
247#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700248 defined(__VAES__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800249#include <vaesintrin.h>
250#endif
251
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700252#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
253 defined(__GFNI__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800254#include <gfniintrin.h>
255#endif
256
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700257#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
258 defined(__RDPID__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800259/// Returns the value of the IA32_TSC_AUX MSR (0xc0000103).
260///
261/// \headerfile <immintrin.h>
262///
263/// This intrinsic corresponds to the <c> RDPID </c> instruction.
264static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("rdpid")))
265_rdpid_u32(void) {
266 return __builtin_ia32_rdpid();
267}
268#endif // __RDPID__
269
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700270#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
271 defined(__RDRND__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800272static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
273_rdrand16_step(unsigned short *__p)
274{
275 return __builtin_ia32_rdrand16_step(__p);
276}
277
278static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
279_rdrand32_step(unsigned int *__p)
280{
281 return __builtin_ia32_rdrand32_step(__p);
282}
283
Logan Chien55afb0a2018-10-15 10:42:14 +0800284#ifdef __x86_64__
285static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
286_rdrand64_step(unsigned long long *__p)
287{
288 return __builtin_ia32_rdrand64_step(__p);
289}
290#endif
291#endif /* __RDRND__ */
292
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700293#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
294 defined(__FSGSBASE__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800295#ifdef __x86_64__
296static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
297_readfsbase_u32(void)
298{
299 return __builtin_ia32_rdfsbase32();
300}
301
302static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
303_readfsbase_u64(void)
304{
305 return __builtin_ia32_rdfsbase64();
306}
307
308static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
309_readgsbase_u32(void)
310{
311 return __builtin_ia32_rdgsbase32();
312}
313
314static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
315_readgsbase_u64(void)
316{
317 return __builtin_ia32_rdgsbase64();
318}
319
320static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
321_writefsbase_u32(unsigned int __V)
322{
Logan Chien55afb0a2018-10-15 10:42:14 +0800323 __builtin_ia32_wrfsbase32(__V);
Logan Chien2833ffb2018-10-09 10:03:24 +0800324}
325
326static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
327_writefsbase_u64(unsigned long long __V)
328{
Logan Chien55afb0a2018-10-15 10:42:14 +0800329 __builtin_ia32_wrfsbase64(__V);
Logan Chien2833ffb2018-10-09 10:03:24 +0800330}
331
332static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
333_writegsbase_u32(unsigned int __V)
334{
Logan Chien55afb0a2018-10-15 10:42:14 +0800335 __builtin_ia32_wrgsbase32(__V);
Logan Chien2833ffb2018-10-09 10:03:24 +0800336}
337
338static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
339_writegsbase_u64(unsigned long long __V)
340{
Logan Chien55afb0a2018-10-15 10:42:14 +0800341 __builtin_ia32_wrgsbase64(__V);
Logan Chien2833ffb2018-10-09 10:03:24 +0800342}
343
344#endif
345#endif /* __FSGSBASE__ */
346
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700347#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
348 defined(__MOVBE__)
Logan Chienb0c84022018-11-09 16:19:54 +0800349
350/* The structs used below are to force the load/store to be unaligned. This
351 * is accomplished with the __packed__ attribute. The __may_alias__ prevents
352 * tbaa metadata from being generated based on the struct and the type of the
353 * field inside of it.
354 */
355
356static __inline__ short __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
357_loadbe_i16(void const * __P) {
358 struct __loadu_i16 {
359 short __v;
360 } __attribute__((__packed__, __may_alias__));
Sasha Smundak33d5ddd2020-05-04 13:37:26 -0700361 return __builtin_bswap16(((const struct __loadu_i16*)__P)->__v);
Logan Chienb0c84022018-11-09 16:19:54 +0800362}
363
364static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
365_storebe_i16(void * __P, short __D) {
366 struct __storeu_i16 {
367 short __v;
368 } __attribute__((__packed__, __may_alias__));
369 ((struct __storeu_i16*)__P)->__v = __builtin_bswap16(__D);
370}
371
372static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
373_loadbe_i32(void const * __P) {
374 struct __loadu_i32 {
375 int __v;
376 } __attribute__((__packed__, __may_alias__));
Sasha Smundak33d5ddd2020-05-04 13:37:26 -0700377 return __builtin_bswap32(((const struct __loadu_i32*)__P)->__v);
Logan Chienb0c84022018-11-09 16:19:54 +0800378}
379
380static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
381_storebe_i32(void * __P, int __D) {
382 struct __storeu_i32 {
383 int __v;
384 } __attribute__((__packed__, __may_alias__));
385 ((struct __storeu_i32*)__P)->__v = __builtin_bswap32(__D);
386}
387
388#ifdef __x86_64__
389static __inline__ long long __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
390_loadbe_i64(void const * __P) {
391 struct __loadu_i64 {
392 long long __v;
393 } __attribute__((__packed__, __may_alias__));
Sasha Smundak33d5ddd2020-05-04 13:37:26 -0700394 return __builtin_bswap64(((const struct __loadu_i64*)__P)->__v);
Logan Chienb0c84022018-11-09 16:19:54 +0800395}
396
397static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
398_storebe_i64(void * __P, long long __D) {
399 struct __storeu_i64 {
400 long long __v;
401 } __attribute__((__packed__, __may_alias__));
402 ((struct __storeu_i64*)__P)->__v = __builtin_bswap64(__D);
403}
404#endif
405#endif /* __MOVBE */
406
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700407#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
408 defined(__RTM__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800409#include <rtmintrin.h>
410#include <xtestintrin.h>
411#endif
412
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700413#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
414 defined(__SHA__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800415#include <shaintrin.h>
416#endif
417
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700418#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
419 defined(__FXSR__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800420#include <fxsrintrin.h>
421#endif
422
Logan Chiendbcf4122019-03-21 10:50:25 +0800423/* No feature check desired due to internal MSC_VER checks */
Logan Chien2833ffb2018-10-09 10:03:24 +0800424#include <xsaveintrin.h>
Logan Chien2833ffb2018-10-09 10:03:24 +0800425
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700426#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
427 defined(__XSAVEOPT__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800428#include <xsaveoptintrin.h>
429#endif
430
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700431#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
432 defined(__XSAVEC__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800433#include <xsavecintrin.h>
434#endif
435
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700436#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
437 defined(__XSAVES__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800438#include <xsavesintrin.h>
439#endif
440
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700441#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
442 defined(__SHSTK__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800443#include <cetintrin.h>
444#endif
445
Logan Chien2833ffb2018-10-09 10:03:24 +0800446/* Some intrinsics inside adxintrin.h are available only on processors with ADX,
447 * whereas others are also available at all times. */
448#include <adxintrin.h>
449
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700450#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
451 defined(__RDSEED__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800452#include <rdseedintrin.h>
453#endif
454
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700455#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
456 defined(__WBNOINVD__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800457#include <wbnoinvdintrin.h>
458#endif
459
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700460#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
461 defined(__CLDEMOTE__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800462#include <cldemoteintrin.h>
463#endif
464
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700465#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
466 defined(__WAITPKG__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800467#include <waitpkgintrin.h>
468#endif
469
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700470#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
471 defined(__MOVDIRI__) || defined(__MOVDIR64B__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800472#include <movdirintrin.h>
473#endif
474
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700475#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
476 defined(__PCONFIG__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800477#include <pconfigintrin.h>
478#endif
479
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700480#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
481 defined(__SGX__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800482#include <sgxintrin.h>
483#endif
484
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700485#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
486 defined(__PTWRITE__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800487#include <ptwriteintrin.h>
488#endif
489
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700490#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
491 defined(__INVPCID__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800492#include <invpcidintrin.h>
493#endif
494
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700495#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Sasha Smundak4b1f33a2021-01-11 15:05:07 -0800496 defined(__KL__) || defined(__WIDEKL__)
497#include <keylockerintrin.h>
498#endif
499
500#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700501 defined(__AMXTILE__) || defined(__AMXINT8__) || defined(__AMXBF16__)
502#include <amxintrin.h>
503#endif
504
505#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
506 defined(__AVX512VP2INTERSECT__)
Logan Chiendf4f7662019-09-04 16:45:23 -0700507#include <avx512vp2intersectintrin.h>
508#endif
509
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700510#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
511 (defined(__AVX512VL__) && defined(__AVX512VP2INTERSECT__))
Logan Chiendf4f7662019-09-04 16:45:23 -0700512#include <avx512vlvp2intersectintrin.h>
513#endif
514
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700515#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
516 defined(__ENQCMD__)
Logan Chiendf4f7662019-09-04 16:45:23 -0700517#include <enqcmdintrin.h>
518#endif
519
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700520#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
521 defined(__SERIALIZE__)
522#include <serializeintrin.h>
523#endif
524
525#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
526 defined(__TSXLDTRK__)
527#include <tsxldtrkintrin.h>
528#endif
529
Logan Chiendf4f7662019-09-04 16:45:23 -0700530#if defined(_MSC_VER) && __has_extension(gnu_asm)
Logan Chien55afb0a2018-10-15 10:42:14 +0800531/* Define the default attributes for these intrinsics */
532#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__))
533#ifdef __cplusplus
534extern "C" {
535#endif
536/*----------------------------------------------------------------------------*\
537|* Interlocked Exchange HLE
538\*----------------------------------------------------------------------------*/
539#if defined(__i386__) || defined(__x86_64__)
540static __inline__ long __DEFAULT_FN_ATTRS
541_InterlockedExchange_HLEAcquire(long volatile *_Target, long _Value) {
542 __asm__ __volatile__(".byte 0xf2 ; lock ; xchg %0, %1"
543 : "+r" (_Value), "+m" (*_Target) :: "memory");
544 return _Value;
545}
546static __inline__ long __DEFAULT_FN_ATTRS
547_InterlockedExchange_HLERelease(long volatile *_Target, long _Value) {
548 __asm__ __volatile__(".byte 0xf3 ; lock ; xchg %0, %1"
549 : "+r" (_Value), "+m" (*_Target) :: "memory");
550 return _Value;
551}
552#endif
553#if defined(__x86_64__)
554static __inline__ __int64 __DEFAULT_FN_ATTRS
555_InterlockedExchange64_HLEAcquire(__int64 volatile *_Target, __int64 _Value) {
556 __asm__ __volatile__(".byte 0xf2 ; lock ; xchg %0, %1"
557 : "+r" (_Value), "+m" (*_Target) :: "memory");
558 return _Value;
559}
560static __inline__ __int64 __DEFAULT_FN_ATTRS
561_InterlockedExchange64_HLERelease(__int64 volatile *_Target, __int64 _Value) {
562 __asm__ __volatile__(".byte 0xf3 ; lock ; xchg %0, %1"
563 : "+r" (_Value), "+m" (*_Target) :: "memory");
564 return _Value;
565}
566#endif
567/*----------------------------------------------------------------------------*\
568|* Interlocked Compare Exchange HLE
569\*----------------------------------------------------------------------------*/
570#if defined(__i386__) || defined(__x86_64__)
571static __inline__ long __DEFAULT_FN_ATTRS
572_InterlockedCompareExchange_HLEAcquire(long volatile *_Destination,
573 long _Exchange, long _Comparand) {
574 __asm__ __volatile__(".byte 0xf2 ; lock ; cmpxchg %2, %1"
575 : "+a" (_Comparand), "+m" (*_Destination)
576 : "r" (_Exchange) : "memory");
577 return _Comparand;
578}
579static __inline__ long __DEFAULT_FN_ATTRS
580_InterlockedCompareExchange_HLERelease(long volatile *_Destination,
581 long _Exchange, long _Comparand) {
582 __asm__ __volatile__(".byte 0xf3 ; lock ; cmpxchg %2, %1"
583 : "+a" (_Comparand), "+m" (*_Destination)
584 : "r" (_Exchange) : "memory");
585 return _Comparand;
586}
587#endif
588#if defined(__x86_64__)
589static __inline__ __int64 __DEFAULT_FN_ATTRS
590_InterlockedCompareExchange64_HLEAcquire(__int64 volatile *_Destination,
591 __int64 _Exchange, __int64 _Comparand) {
592 __asm__ __volatile__(".byte 0xf2 ; lock ; cmpxchg %2, %1"
593 : "+a" (_Comparand), "+m" (*_Destination)
594 : "r" (_Exchange) : "memory");
595 return _Comparand;
596}
597static __inline__ __int64 __DEFAULT_FN_ATTRS
598_InterlockedCompareExchange64_HLERelease(__int64 volatile *_Destination,
599 __int64 _Exchange, __int64 _Comparand) {
600 __asm__ __volatile__(".byte 0xf3 ; lock ; cmpxchg %2, %1"
601 : "+a" (_Comparand), "+m" (*_Destination)
602 : "r" (_Exchange) : "memory");
603 return _Comparand;
604}
605#endif
606#ifdef __cplusplus
607}
608#endif
609
610#undef __DEFAULT_FN_ATTRS
611
Logan Chiendf4f7662019-09-04 16:45:23 -0700612#endif /* defined(_MSC_VER) && __has_extension(gnu_asm) */
Logan Chien55afb0a2018-10-15 10:42:14 +0800613
Logan Chien2833ffb2018-10-09 10:03:24 +0800614#endif /* __IMMINTRIN_H */