1b335bb0453b866ff735c772666ec1af4a8563183Ying Wang/*===---- immintrin.h - Intel intrinsics -----------------------------------===
2b335bb0453b866ff735c772666ec1af4a8563183Ying Wang *
3b335bb0453b866ff735c772666ec1af4a8563183Ying Wang * Permission is hereby granted, free of charge, to any person obtaining a copy
4b335bb0453b866ff735c772666ec1af4a8563183Ying Wang * of this software and associated documentation files (the "Software"), to deal
5b335bb0453b866ff735c772666ec1af4a8563183Ying Wang * in the Software without restriction, including without limitation the rights
6b335bb0453b866ff735c772666ec1af4a8563183Ying Wang * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7b335bb0453b866ff735c772666ec1af4a8563183Ying Wang * copies of the Software, and to permit persons to whom the Software is
8b335bb0453b866ff735c772666ec1af4a8563183Ying Wang * furnished to do so, subject to the following conditions:
9b335bb0453b866ff735c772666ec1af4a8563183Ying Wang *
10b335bb0453b866ff735c772666ec1af4a8563183Ying Wang * The above copyright notice and this permission notice shall be included in
11b335bb0453b866ff735c772666ec1af4a8563183Ying Wang * all copies or substantial portions of the Software.
12b335bb0453b866ff735c772666ec1af4a8563183Ying Wang *
13b335bb0453b866ff735c772666ec1af4a8563183Ying Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14b335bb0453b866ff735c772666ec1af4a8563183Ying Wang * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15b335bb0453b866ff735c772666ec1af4a8563183Ying Wang * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16b335bb0453b866ff735c772666ec1af4a8563183Ying Wang * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17b335bb0453b866ff735c772666ec1af4a8563183Ying Wang * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18b335bb0453b866ff735c772666ec1af4a8563183Ying Wang * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19b335bb0453b866ff735c772666ec1af4a8563183Ying Wang * THE SOFTWARE.
20b335bb0453b866ff735c772666ec1af4a8563183Ying Wang *
21b335bb0453b866ff735c772666ec1af4a8563183Ying Wang *===-----------------------------------------------------------------------===
22b335bb0453b866ff735c772666ec1af4a8563183Ying Wang */
23b335bb0453b866ff735c772666ec1af4a8563183Ying Wang
24b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#ifndef __IMMINTRIN_H
25b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#define __IMMINTRIN_H
26b335bb0453b866ff735c772666ec1af4a8563183Ying Wang
27b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#ifdef __MMX__
28b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#include <mmintrin.h>
29b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#endif
30b335bb0453b866ff735c772666ec1af4a8563183Ying Wang
31b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#ifdef __SSE__
32b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#include <xmmintrin.h>
33b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#endif
34b335bb0453b866ff735c772666ec1af4a8563183Ying Wang
35b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#ifdef __SSE2__
36b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#include <emmintrin.h>
37b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#endif
38b335bb0453b866ff735c772666ec1af4a8563183Ying Wang
39b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#ifdef __SSE3__
40b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#include <pmmintrin.h>
41b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#endif
42b335bb0453b866ff735c772666ec1af4a8563183Ying Wang
43b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#ifdef __SSSE3__
44b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#include <tmmintrin.h>
45b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#endif
46b335bb0453b866ff735c772666ec1af4a8563183Ying Wang
47b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#if defined (__SSE4_2__) || defined (__SSE4_1__)
48b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#include <smmintrin.h>
49b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#endif
50b335bb0453b866ff735c772666ec1af4a8563183Ying Wang
5130047ab0b15bddc2ae0743e8d0b60226a1da9883Stephen Hines#if defined (__AES__) || defined (__PCLMUL__)
52b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#include <wmmintrin.h>
53b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#endif
54b335bb0453b866ff735c772666ec1af4a8563183Ying Wang
55b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#ifdef __AVX__
56b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#include <avxintrin.h>
57b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#endif
58b335bb0453b866ff735c772666ec1af4a8563183Ying Wang
596099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#ifdef __AVX2__
606099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#include <avx2intrin.h>
616099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#endif
626099914810f6f01c79e5da88794972fa4f1439c4Ying Wang
636099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#ifdef __BMI__
646099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#include <bmiintrin.h>
656099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#endif
666099914810f6f01c79e5da88794972fa4f1439c4Ying Wang
676099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#ifdef __BMI2__
686099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#include <bmi2intrin.h>
696099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#endif
706099914810f6f01c79e5da88794972fa4f1439c4Ying Wang
716099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#ifdef __LZCNT__
726099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#include <lzcntintrin.h>
736099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#endif
746099914810f6f01c79e5da88794972fa4f1439c4Ying Wang
756099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#ifdef __FMA__
766099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#include <fmaintrin.h>
776099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#endif
786099914810f6f01c79e5da88794972fa4f1439c4Ying Wang
79ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#ifdef __AVX512F__
80ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#include <avx512fintrin.h>
81ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#endif
82ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines
83ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#ifdef __AVX512VL__
84ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#include <avx512vlintrin.h>
85ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#endif
86ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines
87ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#ifdef __AVX512BW__
88ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#include <avx512bwintrin.h>
89ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#endif
90ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines
91ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#if defined (__AVX512VL__) && defined (__AVX512BW__)
92ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#include <avx512vlbwintrin.h>
93ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#endif
94ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines
95ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#ifdef __AVX512ER__
96ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#include <avx512erintrin.h>
97ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#endif
98ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines
996099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#ifdef __RDRND__
1006099914810f6f01c79e5da88794972fa4f1439c4Ying Wangstatic __inline__ int __attribute__((__always_inline__, __nodebug__))
1016099914810f6f01c79e5da88794972fa4f1439c4Ying Wang_rdrand16_step(unsigned short *__p)
1026099914810f6f01c79e5da88794972fa4f1439c4Ying Wang{
1036099914810f6f01c79e5da88794972fa4f1439c4Ying Wang  return __builtin_ia32_rdrand16_step(__p);
1046099914810f6f01c79e5da88794972fa4f1439c4Ying Wang}
1056099914810f6f01c79e5da88794972fa4f1439c4Ying Wang
1066099914810f6f01c79e5da88794972fa4f1439c4Ying Wangstatic __inline__ int __attribute__((__always_inline__, __nodebug__))
1076099914810f6f01c79e5da88794972fa4f1439c4Ying Wang_rdrand32_step(unsigned int *__p)
1086099914810f6f01c79e5da88794972fa4f1439c4Ying Wang{
1096099914810f6f01c79e5da88794972fa4f1439c4Ying Wang  return __builtin_ia32_rdrand32_step(__p);
1106099914810f6f01c79e5da88794972fa4f1439c4Ying Wang}
1116099914810f6f01c79e5da88794972fa4f1439c4Ying Wang
1126099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#ifdef __x86_64__
1136099914810f6f01c79e5da88794972fa4f1439c4Ying Wangstatic __inline__ int __attribute__((__always_inline__, __nodebug__))
1146099914810f6f01c79e5da88794972fa4f1439c4Ying Wang_rdrand64_step(unsigned long long *__p)
1156099914810f6f01c79e5da88794972fa4f1439c4Ying Wang{
1166099914810f6f01c79e5da88794972fa4f1439c4Ying Wang  return __builtin_ia32_rdrand64_step(__p);
1176099914810f6f01c79e5da88794972fa4f1439c4Ying Wang}
1186099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#endif
1196099914810f6f01c79e5da88794972fa4f1439c4Ying Wang#endif /* __RDRND__ */
1206099914810f6f01c79e5da88794972fa4f1439c4Ying Wang
121ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#ifdef __FSGSBASE__
122ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#ifdef __x86_64__
123ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hinesstatic __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
124ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines_readfsbase_u32(void)
125ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines{
126ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines  return __builtin_ia32_rdfsbase32();
127ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines}
128ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines
129ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hinesstatic __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
130ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines_readfsbase_u64(void)
131ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines{
132ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines  return __builtin_ia32_rdfsbase64();
133ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines}
134ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines
135ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hinesstatic __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
136ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines_readgsbase_u32(void)
137ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines{
138ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines  return __builtin_ia32_rdgsbase32();
139ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines}
140ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines
141ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hinesstatic __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
142ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines_readgsbase_u64(void)
143ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines{
144ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines  return __builtin_ia32_rdgsbase64();
145ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines}
146ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines
147ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hinesstatic __inline__ void __attribute__((__always_inline__, __nodebug__))
148ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines_writefsbase_u32(unsigned int __V)
149ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines{
150ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines  return __builtin_ia32_wrfsbase32(__V);
151ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines}
152ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines
153ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hinesstatic __inline__ void __attribute__((__always_inline__, __nodebug__))
154ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines_writefsbase_u64(unsigned long long __V)
155ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines{
156ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines  return __builtin_ia32_wrfsbase64(__V);
157ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines}
158ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines
159ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hinesstatic __inline__ void __attribute__((__always_inline__, __nodebug__))
160ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines_writegsbase_u32(unsigned int __V)
161ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines{
162ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines  return __builtin_ia32_wrgsbase32(__V);
163ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines}
164ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines
165ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hinesstatic __inline__ void __attribute__((__always_inline__, __nodebug__))
166ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines_writegsbase_u64(unsigned long long __V)
167ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines{
168ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines  return __builtin_ia32_wrgsbase64(__V);
169ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines}
170ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#endif
171ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#endif /* __FSGSBASE__ */
172ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines
173c6ee7dfdcb47cdfbdb2e3cb056d590f87ce3bcb1Stephen Hines#ifdef __RTM__
174c6ee7dfdcb47cdfbdb2e3cb056d590f87ce3bcb1Stephen Hines#include <rtmintrin.h>
175c6ee7dfdcb47cdfbdb2e3cb056d590f87ce3bcb1Stephen Hines#endif
176c6ee7dfdcb47cdfbdb2e3cb056d590f87ce3bcb1Stephen Hines
177996e4dcc9c7aa280b1c129a44c0ccd00afc9bc8bStephen Hines/* FIXME: check __HLE__ as well when HLE is supported. */
178996e4dcc9c7aa280b1c129a44c0ccd00afc9bc8bStephen Hines#if defined (__RTM__)
179996e4dcc9c7aa280b1c129a44c0ccd00afc9bc8bStephen Hinesstatic __inline__ int __attribute__((__always_inline__, __nodebug__))
180996e4dcc9c7aa280b1c129a44c0ccd00afc9bc8bStephen Hines_xtest(void)
181996e4dcc9c7aa280b1c129a44c0ccd00afc9bc8bStephen Hines{
182996e4dcc9c7aa280b1c129a44c0ccd00afc9bc8bStephen Hines  return __builtin_ia32_xtest();
183996e4dcc9c7aa280b1c129a44c0ccd00afc9bc8bStephen Hines}
184996e4dcc9c7aa280b1c129a44c0ccd00afc9bc8bStephen Hines#endif
185996e4dcc9c7aa280b1c129a44c0ccd00afc9bc8bStephen Hines
186803c468d0423f799a67ab2a98c5cadea90fd1665Stephen Hines#ifdef __SHA__
187803c468d0423f799a67ab2a98c5cadea90fd1665Stephen Hines#include <shaintrin.h>
188803c468d0423f799a67ab2a98c5cadea90fd1665Stephen Hines#endif
189803c468d0423f799a67ab2a98c5cadea90fd1665Stephen Hines
190ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines/* Some intrinsics inside adxintrin.h are available only if __ADX__ defined,
191ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines * whereas others are also available if __ADX__ undefined */
192ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines#include <adxintrin.h>
193ee4ca2823e2a0b61ec59538635b63b5c07df409fStephen Hines
194b335bb0453b866ff735c772666ec1af4a8563183Ying Wang#endif /* __IMMINTRIN_H */
195