blob: e5174f8785e5de6400e4a31faa8bcb8b51b8e8f8 [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 Nainarec8c89d2022-02-23 09:26:16 -080013#if !defined(__i386__) && !defined(__x86_64__)
14#error "This header is only meant to be used on x86 and x64 architecture"
15#endif
16
Pirama Arumuga Nainar986b8802021-06-03 16:00:34 -070017#include <x86gprintrin.h>
18
Sasha Smundak0fc590b2020-10-07 08:11:59 -070019#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
20 defined(__MMX__)
Logan Chien2833ffb2018-10-09 10:03:24 +080021#include <mmintrin.h>
22#endif
23
Sasha Smundak0fc590b2020-10-07 08:11:59 -070024#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
25 defined(__SSE__)
Logan Chien2833ffb2018-10-09 10:03:24 +080026#include <xmmintrin.h>
27#endif
28
Sasha Smundak0fc590b2020-10-07 08:11:59 -070029#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
30 defined(__SSE2__)
Logan Chien2833ffb2018-10-09 10:03:24 +080031#include <emmintrin.h>
32#endif
33
Sasha Smundak0fc590b2020-10-07 08:11:59 -070034#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
35 defined(__SSE3__)
Logan Chien2833ffb2018-10-09 10:03:24 +080036#include <pmmintrin.h>
37#endif
38
Sasha Smundak0fc590b2020-10-07 08:11:59 -070039#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
40 defined(__SSSE3__)
Logan Chien2833ffb2018-10-09 10:03:24 +080041#include <tmmintrin.h>
42#endif
43
Sasha Smundak0fc590b2020-10-07 08:11:59 -070044#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien2833ffb2018-10-09 10:03:24 +080045 (defined(__SSE4_2__) || defined(__SSE4_1__))
46#include <smmintrin.h>
47#endif
48
Sasha Smundak0fc590b2020-10-07 08:11:59 -070049#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien2833ffb2018-10-09 10:03:24 +080050 (defined(__AES__) || defined(__PCLMUL__))
51#include <wmmintrin.h>
52#endif
53
Sasha Smundak0fc590b2020-10-07 08:11:59 -070054#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
55 defined(__CLFLUSHOPT__)
Logan Chien2833ffb2018-10-09 10:03:24 +080056#include <clflushoptintrin.h>
57#endif
58
Sasha Smundak0fc590b2020-10-07 08:11:59 -070059#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
60 defined(__CLWB__)
Logan Chien55afb0a2018-10-15 10:42:14 +080061#include <clwbintrin.h>
62#endif
63
Sasha Smundak0fc590b2020-10-07 08:11:59 -070064#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
65 defined(__AVX__)
Logan Chien2833ffb2018-10-09 10:03:24 +080066#include <avxintrin.h>
67#endif
68
Sasha Smundak0fc590b2020-10-07 08:11:59 -070069#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
70 defined(__AVX2__)
Logan Chien2833ffb2018-10-09 10:03:24 +080071#include <avx2intrin.h>
Logan Chien55afb0a2018-10-15 10:42:14 +080072#endif
Logan Chien2833ffb2018-10-09 10:03:24 +080073
Sasha Smundak0fc590b2020-10-07 08:11:59 -070074#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
75 defined(__F16C__)
Logan Chien55afb0a2018-10-15 10:42:14 +080076#include <f16cintrin.h>
77#endif
Logan Chien2833ffb2018-10-09 10:03:24 +080078
Sasha Smundak746b0222020-02-25 09:19:04 -080079/* No feature check desired due to internal checks */
Logan Chien2833ffb2018-10-09 10:03:24 +080080#include <bmiintrin.h>
Logan Chien2833ffb2018-10-09 10:03:24 +080081
Sasha Smundak0fc590b2020-10-07 08:11:59 -070082#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
83 defined(__BMI2__)
Logan Chien2833ffb2018-10-09 10:03:24 +080084#include <bmi2intrin.h>
85#endif
86
Sasha Smundak0fc590b2020-10-07 08:11:59 -070087#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
88 defined(__LZCNT__)
Logan Chien2833ffb2018-10-09 10:03:24 +080089#include <lzcntintrin.h>
90#endif
91
Sasha Smundak0fc590b2020-10-07 08:11:59 -070092#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
93 defined(__POPCNT__)
Logan Chien55afb0a2018-10-15 10:42:14 +080094#include <popcntintrin.h>
95#endif
96
Sasha Smundak0fc590b2020-10-07 08:11:59 -070097#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
98 defined(__FMA__)
Logan Chien2833ffb2018-10-09 10:03:24 +080099#include <fmaintrin.h>
100#endif
101
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700102#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
103 defined(__AVX512F__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800104#include <avx512fintrin.h>
105#endif
106
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700107#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
108 defined(__AVX512VL__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800109#include <avx512vlintrin.h>
110#endif
111
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700112#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
113 defined(__AVX512BW__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800114#include <avx512bwintrin.h>
115#endif
116
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700117#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
118 defined(__AVX512BITALG__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800119#include <avx512bitalgintrin.h>
120#endif
121
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700122#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
123 defined(__AVX512CD__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800124#include <avx512cdintrin.h>
125#endif
126
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700127#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
128 defined(__AVX512VPOPCNTDQ__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800129#include <avx512vpopcntdqintrin.h>
130#endif
131
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700132#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien55afb0a2018-10-15 10:42:14 +0800133 (defined(__AVX512VL__) && defined(__AVX512VPOPCNTDQ__))
134#include <avx512vpopcntdqvlintrin.h>
135#endif
136
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700137#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
138 defined(__AVX512VNNI__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800139#include <avx512vnniintrin.h>
140#endif
141
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700142#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien55afb0a2018-10-15 10:42:14 +0800143 (defined(__AVX512VL__) && defined(__AVX512VNNI__))
144#include <avx512vlvnniintrin.h>
145#endif
146
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700147#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Pirama Arumuga Nainar986b8802021-06-03 16:00:34 -0700148 defined(__AVXVNNI__)
149#include <avxvnniintrin.h>
150#endif
151
152#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700153 defined(__AVX512DQ__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800154#include <avx512dqintrin.h>
155#endif
156
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700157#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien55afb0a2018-10-15 10:42:14 +0800158 (defined(__AVX512VL__) && defined(__AVX512BITALG__))
159#include <avx512vlbitalgintrin.h>
160#endif
161
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700162#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien2833ffb2018-10-09 10:03:24 +0800163 (defined(__AVX512VL__) && defined(__AVX512BW__))
164#include <avx512vlbwintrin.h>
165#endif
166
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700167#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien2833ffb2018-10-09 10:03:24 +0800168 (defined(__AVX512VL__) && defined(__AVX512CD__))
169#include <avx512vlcdintrin.h>
170#endif
171
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700172#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien2833ffb2018-10-09 10:03:24 +0800173 (defined(__AVX512VL__) && defined(__AVX512DQ__))
174#include <avx512vldqintrin.h>
175#endif
176
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700177#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
178 defined(__AVX512ER__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800179#include <avx512erintrin.h>
180#endif
181
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700182#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
183 defined(__AVX512IFMA__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800184#include <avx512ifmaintrin.h>
185#endif
186
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700187#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien2833ffb2018-10-09 10:03:24 +0800188 (defined(__AVX512IFMA__) && defined(__AVX512VL__))
189#include <avx512ifmavlintrin.h>
190#endif
191
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700192#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
193 defined(__AVX512VBMI__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800194#include <avx512vbmiintrin.h>
195#endif
196
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700197#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien2833ffb2018-10-09 10:03:24 +0800198 (defined(__AVX512VBMI__) && defined(__AVX512VL__))
199#include <avx512vbmivlintrin.h>
200#endif
201
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700202#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
203 defined(__AVX512VBMI2__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800204#include <avx512vbmi2intrin.h>
205#endif
206
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700207#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chien55afb0a2018-10-15 10:42:14 +0800208 (defined(__AVX512VBMI2__) && defined(__AVX512VL__))
209#include <avx512vlvbmi2intrin.h>
210#endif
211
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700212#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
213 defined(__AVX512PF__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800214#include <avx512pfintrin.h>
215#endif
216
Pirama Arumuga Nainar494f6452021-12-02 10:42:14 -0800217/*
218 * FIXME: _Float16 type is legal only when HW support float16 operation.
219 * We use __AVX512FP16__ to identify if float16 is supported or not, so
220 * when float16 is not supported, the related header is not included.
221 *
222 */
223#if defined(__AVX512FP16__)
224#include <avx512fp16intrin.h>
225#endif
226
227#if defined(__AVX512FP16__) && defined(__AVX512VL__)
228#include <avx512vlfp16intrin.h>
229#endif
230
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700231#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
232 defined(__AVX512BF16__)
Logan Chiendf4f7662019-09-04 16:45:23 -0700233#include <avx512bf16intrin.h>
234#endif
235
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700236#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Logan Chiendf4f7662019-09-04 16:45:23 -0700237 (defined(__AVX512VL__) && defined(__AVX512BF16__))
238#include <avx512vlbf16intrin.h>
239#endif
240
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700241#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
242 defined(__PKU__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800243#include <pkuintrin.h>
244#endif
245
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700246#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Pirama Arumuga Nainar7e1f8392021-08-16 17:30:48 -0700247 defined(__VPCLMULQDQ__)
248#include <vpclmulqdqintrin.h>
249#endif
250
251#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700252 defined(__VAES__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800253#include <vaesintrin.h>
254#endif
255
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700256#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
257 defined(__GFNI__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800258#include <gfniintrin.h>
259#endif
260
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700261#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
262 defined(__RDPID__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800263/// Returns the value of the IA32_TSC_AUX MSR (0xc0000103).
264///
265/// \headerfile <immintrin.h>
266///
267/// This intrinsic corresponds to the <c> RDPID </c> instruction.
268static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("rdpid")))
269_rdpid_u32(void) {
270 return __builtin_ia32_rdpid();
271}
272#endif // __RDPID__
273
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700274#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
275 defined(__RDRND__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800276static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
277_rdrand16_step(unsigned short *__p)
278{
279 return __builtin_ia32_rdrand16_step(__p);
280}
281
282static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
283_rdrand32_step(unsigned int *__p)
284{
285 return __builtin_ia32_rdrand32_step(__p);
286}
287
Logan Chien55afb0a2018-10-15 10:42:14 +0800288#ifdef __x86_64__
289static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
290_rdrand64_step(unsigned long long *__p)
291{
292 return __builtin_ia32_rdrand64_step(__p);
293}
294#endif
295#endif /* __RDRND__ */
296
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700297#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
298 defined(__FSGSBASE__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800299#ifdef __x86_64__
300static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
301_readfsbase_u32(void)
302{
303 return __builtin_ia32_rdfsbase32();
304}
305
306static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
307_readfsbase_u64(void)
308{
309 return __builtin_ia32_rdfsbase64();
310}
311
312static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
313_readgsbase_u32(void)
314{
315 return __builtin_ia32_rdgsbase32();
316}
317
318static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
319_readgsbase_u64(void)
320{
321 return __builtin_ia32_rdgsbase64();
322}
323
324static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
325_writefsbase_u32(unsigned int __V)
326{
Logan Chien55afb0a2018-10-15 10:42:14 +0800327 __builtin_ia32_wrfsbase32(__V);
Logan Chien2833ffb2018-10-09 10:03:24 +0800328}
329
330static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
331_writefsbase_u64(unsigned long long __V)
332{
Logan Chien55afb0a2018-10-15 10:42:14 +0800333 __builtin_ia32_wrfsbase64(__V);
Logan Chien2833ffb2018-10-09 10:03:24 +0800334}
335
336static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
337_writegsbase_u32(unsigned int __V)
338{
Logan Chien55afb0a2018-10-15 10:42:14 +0800339 __builtin_ia32_wrgsbase32(__V);
Logan Chien2833ffb2018-10-09 10:03:24 +0800340}
341
342static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
343_writegsbase_u64(unsigned long long __V)
344{
Logan Chien55afb0a2018-10-15 10:42:14 +0800345 __builtin_ia32_wrgsbase64(__V);
Logan Chien2833ffb2018-10-09 10:03:24 +0800346}
347
348#endif
349#endif /* __FSGSBASE__ */
350
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700351#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
352 defined(__MOVBE__)
Logan Chienb0c84022018-11-09 16:19:54 +0800353
354/* The structs used below are to force the load/store to be unaligned. This
355 * is accomplished with the __packed__ attribute. The __may_alias__ prevents
356 * tbaa metadata from being generated based on the struct and the type of the
357 * field inside of it.
358 */
359
360static __inline__ short __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
361_loadbe_i16(void const * __P) {
362 struct __loadu_i16 {
363 short __v;
364 } __attribute__((__packed__, __may_alias__));
Sasha Smundak33d5ddd2020-05-04 13:37:26 -0700365 return __builtin_bswap16(((const struct __loadu_i16*)__P)->__v);
Logan Chienb0c84022018-11-09 16:19:54 +0800366}
367
368static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
369_storebe_i16(void * __P, short __D) {
370 struct __storeu_i16 {
371 short __v;
372 } __attribute__((__packed__, __may_alias__));
373 ((struct __storeu_i16*)__P)->__v = __builtin_bswap16(__D);
374}
375
376static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
377_loadbe_i32(void const * __P) {
378 struct __loadu_i32 {
379 int __v;
380 } __attribute__((__packed__, __may_alias__));
Sasha Smundak33d5ddd2020-05-04 13:37:26 -0700381 return __builtin_bswap32(((const struct __loadu_i32*)__P)->__v);
Logan Chienb0c84022018-11-09 16:19:54 +0800382}
383
384static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
385_storebe_i32(void * __P, int __D) {
386 struct __storeu_i32 {
387 int __v;
388 } __attribute__((__packed__, __may_alias__));
389 ((struct __storeu_i32*)__P)->__v = __builtin_bswap32(__D);
390}
391
392#ifdef __x86_64__
393static __inline__ long long __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
394_loadbe_i64(void const * __P) {
395 struct __loadu_i64 {
396 long long __v;
397 } __attribute__((__packed__, __may_alias__));
Sasha Smundak33d5ddd2020-05-04 13:37:26 -0700398 return __builtin_bswap64(((const struct __loadu_i64*)__P)->__v);
Logan Chienb0c84022018-11-09 16:19:54 +0800399}
400
401static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("movbe")))
402_storebe_i64(void * __P, long long __D) {
403 struct __storeu_i64 {
404 long long __v;
405 } __attribute__((__packed__, __may_alias__));
406 ((struct __storeu_i64*)__P)->__v = __builtin_bswap64(__D);
407}
408#endif
409#endif /* __MOVBE */
410
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700411#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
412 defined(__RTM__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800413#include <rtmintrin.h>
414#include <xtestintrin.h>
415#endif
416
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700417#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
418 defined(__SHA__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800419#include <shaintrin.h>
420#endif
421
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700422#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
423 defined(__FXSR__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800424#include <fxsrintrin.h>
425#endif
426
Logan Chiendbcf4122019-03-21 10:50:25 +0800427/* No feature check desired due to internal MSC_VER checks */
Logan Chien2833ffb2018-10-09 10:03:24 +0800428#include <xsaveintrin.h>
Logan Chien2833ffb2018-10-09 10:03:24 +0800429
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700430#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
431 defined(__XSAVEOPT__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800432#include <xsaveoptintrin.h>
433#endif
434
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700435#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
436 defined(__XSAVEC__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800437#include <xsavecintrin.h>
438#endif
439
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700440#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
441 defined(__XSAVES__)
Logan Chien2833ffb2018-10-09 10:03:24 +0800442#include <xsavesintrin.h>
443#endif
444
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700445#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
446 defined(__SHSTK__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800447#include <cetintrin.h>
448#endif
449
Logan Chien2833ffb2018-10-09 10:03:24 +0800450/* Some intrinsics inside adxintrin.h are available only on processors with ADX,
451 * whereas others are also available at all times. */
452#include <adxintrin.h>
453
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700454#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
455 defined(__RDSEED__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800456#include <rdseedintrin.h>
457#endif
458
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700459#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
460 defined(__WBNOINVD__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800461#include <wbnoinvdintrin.h>
462#endif
463
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700464#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
465 defined(__CLDEMOTE__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800466#include <cldemoteintrin.h>
467#endif
468
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700469#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
470 defined(__WAITPKG__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800471#include <waitpkgintrin.h>
472#endif
473
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700474#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
475 defined(__MOVDIRI__) || defined(__MOVDIR64B__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800476#include <movdirintrin.h>
477#endif
478
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700479#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
480 defined(__PCONFIG__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800481#include <pconfigintrin.h>
482#endif
483
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700484#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
485 defined(__SGX__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800486#include <sgxintrin.h>
487#endif
488
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700489#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
490 defined(__PTWRITE__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800491#include <ptwriteintrin.h>
492#endif
493
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700494#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
495 defined(__INVPCID__)
Logan Chien55afb0a2018-10-15 10:42:14 +0800496#include <invpcidintrin.h>
497#endif
498
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700499#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Sasha Smundak4b1f33a2021-01-11 15:05:07 -0800500 defined(__KL__) || defined(__WIDEKL__)
501#include <keylockerintrin.h>
502#endif
503
504#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700505 defined(__AMXTILE__) || defined(__AMXINT8__) || defined(__AMXBF16__)
506#include <amxintrin.h>
507#endif
508
509#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
510 defined(__AVX512VP2INTERSECT__)
Logan Chiendf4f7662019-09-04 16:45:23 -0700511#include <avx512vp2intersectintrin.h>
512#endif
513
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700514#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
515 (defined(__AVX512VL__) && defined(__AVX512VP2INTERSECT__))
Logan Chiendf4f7662019-09-04 16:45:23 -0700516#include <avx512vlvp2intersectintrin.h>
517#endif
518
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700519#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
520 defined(__ENQCMD__)
Logan Chiendf4f7662019-09-04 16:45:23 -0700521#include <enqcmdintrin.h>
522#endif
523
Sasha Smundak0fc590b2020-10-07 08:11:59 -0700524#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
525 defined(__SERIALIZE__)
526#include <serializeintrin.h>
527#endif
528
529#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
530 defined(__TSXLDTRK__)
531#include <tsxldtrkintrin.h>
532#endif
533
Logan Chiendf4f7662019-09-04 16:45:23 -0700534#if defined(_MSC_VER) && __has_extension(gnu_asm)
Logan Chien55afb0a2018-10-15 10:42:14 +0800535/* Define the default attributes for these intrinsics */
536#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__))
537#ifdef __cplusplus
538extern "C" {
539#endif
540/*----------------------------------------------------------------------------*\
541|* Interlocked Exchange HLE
542\*----------------------------------------------------------------------------*/
543#if defined(__i386__) || defined(__x86_64__)
544static __inline__ long __DEFAULT_FN_ATTRS
545_InterlockedExchange_HLEAcquire(long volatile *_Target, long _Value) {
Pirama Arumuga Nainarec8c89d2022-02-23 09:26:16 -0800546 __asm__ __volatile__(".byte 0xf2 ; lock ; xchg {%0, %1|%1, %0}"
Logan Chien55afb0a2018-10-15 10:42:14 +0800547 : "+r" (_Value), "+m" (*_Target) :: "memory");
548 return _Value;
549}
550static __inline__ long __DEFAULT_FN_ATTRS
551_InterlockedExchange_HLERelease(long volatile *_Target, long _Value) {
Pirama Arumuga Nainarec8c89d2022-02-23 09:26:16 -0800552 __asm__ __volatile__(".byte 0xf3 ; lock ; xchg {%0, %1|%1, %0}"
Logan Chien55afb0a2018-10-15 10:42:14 +0800553 : "+r" (_Value), "+m" (*_Target) :: "memory");
554 return _Value;
555}
556#endif
557#if defined(__x86_64__)
558static __inline__ __int64 __DEFAULT_FN_ATTRS
559_InterlockedExchange64_HLEAcquire(__int64 volatile *_Target, __int64 _Value) {
Pirama Arumuga Nainarec8c89d2022-02-23 09:26:16 -0800560 __asm__ __volatile__(".byte 0xf2 ; lock ; xchg {%0, %1|%1, %0}"
Logan Chien55afb0a2018-10-15 10:42:14 +0800561 : "+r" (_Value), "+m" (*_Target) :: "memory");
562 return _Value;
563}
564static __inline__ __int64 __DEFAULT_FN_ATTRS
565_InterlockedExchange64_HLERelease(__int64 volatile *_Target, __int64 _Value) {
Pirama Arumuga Nainarec8c89d2022-02-23 09:26:16 -0800566 __asm__ __volatile__(".byte 0xf3 ; lock ; xchg {%0, %1|%1, %0}"
Logan Chien55afb0a2018-10-15 10:42:14 +0800567 : "+r" (_Value), "+m" (*_Target) :: "memory");
568 return _Value;
569}
570#endif
571/*----------------------------------------------------------------------------*\
572|* Interlocked Compare Exchange HLE
573\*----------------------------------------------------------------------------*/
574#if defined(__i386__) || defined(__x86_64__)
575static __inline__ long __DEFAULT_FN_ATTRS
576_InterlockedCompareExchange_HLEAcquire(long volatile *_Destination,
577 long _Exchange, long _Comparand) {
Pirama Arumuga Nainarec8c89d2022-02-23 09:26:16 -0800578 __asm__ __volatile__(".byte 0xf2 ; lock ; cmpxchg {%2, %1|%1, %2}"
Logan Chien55afb0a2018-10-15 10:42:14 +0800579 : "+a" (_Comparand), "+m" (*_Destination)
580 : "r" (_Exchange) : "memory");
581 return _Comparand;
582}
583static __inline__ long __DEFAULT_FN_ATTRS
584_InterlockedCompareExchange_HLERelease(long volatile *_Destination,
585 long _Exchange, long _Comparand) {
Pirama Arumuga Nainarec8c89d2022-02-23 09:26:16 -0800586 __asm__ __volatile__(".byte 0xf3 ; lock ; cmpxchg {%2, %1|%1, %2}"
Logan Chien55afb0a2018-10-15 10:42:14 +0800587 : "+a" (_Comparand), "+m" (*_Destination)
588 : "r" (_Exchange) : "memory");
589 return _Comparand;
590}
591#endif
592#if defined(__x86_64__)
593static __inline__ __int64 __DEFAULT_FN_ATTRS
594_InterlockedCompareExchange64_HLEAcquire(__int64 volatile *_Destination,
595 __int64 _Exchange, __int64 _Comparand) {
Pirama Arumuga Nainarec8c89d2022-02-23 09:26:16 -0800596 __asm__ __volatile__(".byte 0xf2 ; lock ; cmpxchg {%2, %1|%1, %2}"
Logan Chien55afb0a2018-10-15 10:42:14 +0800597 : "+a" (_Comparand), "+m" (*_Destination)
598 : "r" (_Exchange) : "memory");
599 return _Comparand;
600}
601static __inline__ __int64 __DEFAULT_FN_ATTRS
602_InterlockedCompareExchange64_HLERelease(__int64 volatile *_Destination,
603 __int64 _Exchange, __int64 _Comparand) {
Pirama Arumuga Nainarec8c89d2022-02-23 09:26:16 -0800604 __asm__ __volatile__(".byte 0xf3 ; lock ; cmpxchg {%2, %1|%1, %2}"
Logan Chien55afb0a2018-10-15 10:42:14 +0800605 : "+a" (_Comparand), "+m" (*_Destination)
606 : "r" (_Exchange) : "memory");
607 return _Comparand;
608}
609#endif
610#ifdef __cplusplus
611}
612#endif
613
614#undef __DEFAULT_FN_ATTRS
615
Logan Chiendf4f7662019-09-04 16:45:23 -0700616#endif /* defined(_MSC_VER) && __has_extension(gnu_asm) */
Logan Chien55afb0a2018-10-15 10:42:14 +0800617
Logan Chien2833ffb2018-10-09 10:03:24 +0800618#endif /* __IMMINTRIN_H */