blob: d6c6ae5e4c57ffe379f5850e30cc1732735941ba [file] [log] [blame]
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +00001/*===---- 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
Nico Weber379a1952016-05-16 18:14:07 +000027#if !defined(_MSC_VER) || __has_feature(modules) || defined(__MMX__)
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +000028#include <mmintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +000029#endif
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +000030
Nico Weber379a1952016-05-16 18:14:07 +000031#if !defined(_MSC_VER) || __has_feature(modules) || defined(__SSE__)
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +000032#include <xmmintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +000033#endif
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +000034
Nico Weber379a1952016-05-16 18:14:07 +000035#if !defined(_MSC_VER) || __has_feature(modules) || defined(__SSE2__)
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +000036#include <emmintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +000037#endif
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +000038
Nico Weber379a1952016-05-16 18:14:07 +000039#if !defined(_MSC_VER) || __has_feature(modules) || defined(__SSE3__)
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +000040#include <pmmintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +000041#endif
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +000042
Nico Weber379a1952016-05-16 18:14:07 +000043#if !defined(_MSC_VER) || __has_feature(modules) || defined(__SSSE3__)
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +000044#include <tmmintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +000045#endif
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +000046
Nico Weber379a1952016-05-16 18:14:07 +000047#if !defined(_MSC_VER) || __has_feature(modules) || \
48 (defined(__SSE4_2__) || defined(__SSE4_1__))
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +000049#include <smmintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +000050#endif
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +000051
Nico Weber379a1952016-05-16 18:14:07 +000052#if !defined(_MSC_VER) || __has_feature(modules) || \
53 (defined(__AES__) || defined(__PCLMUL__))
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +000054#include <wmmintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +000055#endif
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +000056
Nico Weber379a1952016-05-16 18:14:07 +000057#if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX__)
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +000058#include <avxintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +000059#endif
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +000060
Nico Weber379a1952016-05-16 18:14:07 +000061#if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX2__)
Craig Topperdec792e2011-12-19 05:04:33 +000062#include <avx2intrin.h>
Craig Topperdec792e2011-12-19 05:04:33 +000063
Paul Robinson941bc912015-12-02 18:41:52 +000064/* The 256-bit versions of functions in f16cintrin.h.
65 Intel documents these as being in immintrin.h, and
66 they depend on typedefs from avxintrin.h. */
67
68#define _mm256_cvtps_ph(a, imm) __extension__ ({ \
69 (__m128i)__builtin_ia32_vcvtps2ph256((__v8sf)(__m256)(a), (imm)); })
70
71static __inline __m256 __attribute__((__always_inline__, __nodebug__, __target__("f16c")))
72_mm256_cvtph_ps(__m128i __a)
73{
74 return (__m256)__builtin_ia32_vcvtph2ps256((__v8hi)__a);
75}
Nico Weber379a1952016-05-16 18:14:07 +000076#endif /* __AVX2__ */
Paul Robinson941bc912015-12-02 18:41:52 +000077
Nico Weber379a1952016-05-16 18:14:07 +000078#if !defined(_MSC_VER) || __has_feature(modules) || defined(__BMI__)
Craig Topperf2855ad2011-12-25 06:25:37 +000079#include <bmiintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +000080#endif
Craig Topperf2855ad2011-12-25 06:25:37 +000081
Nico Weber379a1952016-05-16 18:14:07 +000082#if !defined(_MSC_VER) || __has_feature(modules) || defined(__BMI2__)
Craig Topperc334dd62011-12-26 02:31:10 +000083#include <bmi2intrin.h>
Nico Weber379a1952016-05-16 18:14:07 +000084#endif
Craig Topperc334dd62011-12-26 02:31:10 +000085
Nico Weber379a1952016-05-16 18:14:07 +000086#if !defined(_MSC_VER) || __has_feature(modules) || defined(__LZCNT__)
Craig Topperf2855ad2011-12-25 06:25:37 +000087#include <lzcntintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +000088#endif
Craig Topperf2855ad2011-12-25 06:25:37 +000089
Nico Weber379a1952016-05-16 18:14:07 +000090#if !defined(_MSC_VER) || __has_feature(modules) || defined(__FMA__)
Craig Topper2b1eda32012-06-04 03:42:47 +000091#include <fmaintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +000092#endif
Craig Topper2b1eda32012-06-04 03:42:47 +000093
Nico Weber379a1952016-05-16 18:14:07 +000094#if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512F__)
Elena Demikhovskyfcc6df32014-07-22 11:31:39 +000095#include <avx512fintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +000096#endif
Elena Demikhovskyfcc6df32014-07-22 11:31:39 +000097
Nico Weber379a1952016-05-16 18:14:07 +000098#if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512VL__)
Robert Khasanovb9f3a912014-10-08 17:18:13 +000099#include <avx512vlintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000100#endif
Robert Khasanovb9f3a912014-10-08 17:18:13 +0000101
Nico Weber379a1952016-05-16 18:14:07 +0000102#if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512BW__)
Robert Khasanovb9f3a912014-10-08 17:18:13 +0000103#include <avx512bwintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000104#endif
Robert Khasanovb9f3a912014-10-08 17:18:13 +0000105
Nico Weber379a1952016-05-16 18:14:07 +0000106#if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512CD__)
Asaf Badouha45b7ca2015-06-29 12:51:53 +0000107#include <avx512cdintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000108#endif
Asaf Badouha45b7ca2015-06-29 12:51:53 +0000109
Nico Weber379a1952016-05-16 18:14:07 +0000110#if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512DQ__)
Elena Demikhovskye7d4c2e2015-04-30 09:24:29 +0000111#include <avx512dqintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000112#endif
Elena Demikhovskye7d4c2e2015-04-30 09:24:29 +0000113
Nico Weber379a1952016-05-16 18:14:07 +0000114#if !defined(_MSC_VER) || __has_feature(modules) || \
115 (defined(__AVX512VL__) && defined(__AVX512BW__))
Robert Khasanovb9f3a912014-10-08 17:18:13 +0000116#include <avx512vlbwintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000117#endif
Robert Khasanovb9f3a912014-10-08 17:18:13 +0000118
Nico Weber379a1952016-05-16 18:14:07 +0000119#if !defined(_MSC_VER) || __has_feature(modules) || \
120 (defined(__AVX512VL__) && defined(__AVX512CD__))
Michael Zuckerman8c2900f2016-04-27 11:43:14 +0000121#include <avx512vlcdintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000122#endif
Michael Zuckerman8c2900f2016-04-27 11:43:14 +0000123
Nico Weber379a1952016-05-16 18:14:07 +0000124#if !defined(_MSC_VER) || __has_feature(modules) || \
125 (defined(__AVX512VL__) && defined(__AVX512DQ__))
Elena Demikhovskye7d4c2e2015-04-30 09:24:29 +0000126#include <avx512vldqintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000127#endif
Elena Demikhovskye7d4c2e2015-04-30 09:24:29 +0000128
Nico Weber379a1952016-05-16 18:14:07 +0000129#if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512ER__)
Elena Demikhovskyfcc6df32014-07-22 11:31:39 +0000130#include <avx512erintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000131#endif
Elena Demikhovskyfcc6df32014-07-22 11:31:39 +0000132
Nico Weber379a1952016-05-16 18:14:07 +0000133#if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512IFMA__)
Michael Zuckerman0190c652016-03-07 09:55:55 +0000134#include <avx512ifmaintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000135#endif
Michael Zuckerman0190c652016-03-07 09:55:55 +0000136
Nico Weber379a1952016-05-16 18:14:07 +0000137#if !defined(_MSC_VER) || __has_feature(modules) || \
138 (defined(__AVX512IFMA__) && defined(__AVX512VL__))
Michael Zuckerman0190c652016-03-07 09:55:55 +0000139#include <avx512ifmavlintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000140#endif
Michael Zuckerman0190c652016-03-07 09:55:55 +0000141
Nico Weber379a1952016-05-16 18:14:07 +0000142#if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512VBMI__)
Michael Zuckerman9f338482016-03-07 17:04:11 +0000143#include <avx512vbmiintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000144#endif
Michael Zuckerman9f338482016-03-07 17:04:11 +0000145
Nico Weber379a1952016-05-16 18:14:07 +0000146#if !defined(_MSC_VER) || __has_feature(modules) || \
147 (defined(__AVX512VBMI__) && defined(__AVX512VL__))
Michael Zuckerman9f338482016-03-07 17:04:11 +0000148#include <avx512vbmivlintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000149#endif
Michael Zuckerman9f338482016-03-07 17:04:11 +0000150
Nico Weber379a1952016-05-16 18:14:07 +0000151#if !defined(_MSC_VER) || __has_feature(modules) || defined(__AVX512PF__)
Michael Zuckerman4fa96af2016-04-21 12:47:27 +0000152#include <avx512pfintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000153#endif
Michael Zuckerman4fa96af2016-04-21 12:47:27 +0000154
Nico Weber379a1952016-05-16 18:14:07 +0000155#if !defined(_MSC_VER) || __has_feature(modules) || defined(__PKU__)
Asaf Badouha9d1e182015-12-31 14:14:07 +0000156#include <pkuintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000157#endif
Asaf Badouha9d1e182015-12-31 14:14:07 +0000158
Nico Weber379a1952016-05-16 18:14:07 +0000159#if !defined(_MSC_VER) || __has_feature(modules) || defined(__RDRND__)
Eric Christopher9fc7fb22015-06-17 07:09:32 +0000160static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
Benjamin Kramera43b6992012-07-12 09:33:03 +0000161_rdrand16_step(unsigned short *__p)
162{
163 return __builtin_ia32_rdrand16_step(__p);
164}
165
Eric Christopher9fc7fb22015-06-17 07:09:32 +0000166static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
Benjamin Kramera43b6992012-07-12 09:33:03 +0000167_rdrand32_step(unsigned int *__p)
168{
169 return __builtin_ia32_rdrand32_step(__p);
170}
171
172#ifdef __x86_64__
Eric Christopher9fc7fb22015-06-17 07:09:32 +0000173static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
Benjamin Kramera43b6992012-07-12 09:33:03 +0000174_rdrand64_step(unsigned long long *__p)
175{
176 return __builtin_ia32_rdrand64_step(__p);
177}
178#endif
Nico Weber379a1952016-05-16 18:14:07 +0000179#endif /* __RDRND__ */
Benjamin Kramera43b6992012-07-12 09:33:03 +0000180
Nico Weber379a1952016-05-16 18:14:07 +0000181#if !defined(_MSC_VER) || __has_feature(modules) || defined(__FSGSBASE__)
Craig Topper8c7f2512014-11-03 06:51:41 +0000182#ifdef __x86_64__
Eric Christopher9fc7fb22015-06-17 07:09:32 +0000183static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
Craig Topper8c7f2512014-11-03 06:51:41 +0000184_readfsbase_u32(void)
185{
186 return __builtin_ia32_rdfsbase32();
187}
188
Eric Christopher9fc7fb22015-06-17 07:09:32 +0000189static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
Craig Topper8c7f2512014-11-03 06:51:41 +0000190_readfsbase_u64(void)
191{
192 return __builtin_ia32_rdfsbase64();
193}
194
Eric Christopher9fc7fb22015-06-17 07:09:32 +0000195static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
Craig Topper8c7f2512014-11-03 06:51:41 +0000196_readgsbase_u32(void)
197{
198 return __builtin_ia32_rdgsbase32();
199}
200
Eric Christopher9fc7fb22015-06-17 07:09:32 +0000201static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
Craig Topper8c7f2512014-11-03 06:51:41 +0000202_readgsbase_u64(void)
203{
204 return __builtin_ia32_rdgsbase64();
205}
206
Eric Christopher9fc7fb22015-06-17 07:09:32 +0000207static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
Craig Topper8c7f2512014-11-03 06:51:41 +0000208_writefsbase_u32(unsigned int __V)
209{
210 return __builtin_ia32_wrfsbase32(__V);
211}
212
Eric Christopher9fc7fb22015-06-17 07:09:32 +0000213static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
Craig Topper8c7f2512014-11-03 06:51:41 +0000214_writefsbase_u64(unsigned long long __V)
215{
216 return __builtin_ia32_wrfsbase64(__V);
217}
218
Eric Christopher9fc7fb22015-06-17 07:09:32 +0000219static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
Craig Topper8c7f2512014-11-03 06:51:41 +0000220_writegsbase_u32(unsigned int __V)
221{
222 return __builtin_ia32_wrgsbase32(__V);
223}
224
Eric Christopher9fc7fb22015-06-17 07:09:32 +0000225static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
Craig Topper8c7f2512014-11-03 06:51:41 +0000226_writegsbase_u64(unsigned long long __V)
227{
228 return __builtin_ia32_wrgsbase64(__V);
229}
230#endif
Nico Weber379a1952016-05-16 18:14:07 +0000231#endif /* __FSGSBASE__ */
Craig Topper8c7f2512014-11-03 06:51:41 +0000232
Nico Weber379a1952016-05-16 18:14:07 +0000233#if !defined(_MSC_VER) || __has_feature(modules) || defined(__RTM__)
Michael Liao625a8752012-11-10 05:17:46 +0000234#include <rtmintrin.h>
Eric Christopher3d920ee2015-06-17 18:42:07 +0000235#include <xtestintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000236#endif
Michael Liao4442f792013-03-29 05:14:06 +0000237
Nico Weber379a1952016-05-16 18:14:07 +0000238#if !defined(_MSC_VER) || __has_feature(modules) || defined(__SHA__)
Ben Langmuir6efe3a82013-09-19 14:00:22 +0000239#include <shaintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000240#endif
Ben Langmuir6efe3a82013-09-19 14:00:22 +0000241
Nico Weber379a1952016-05-16 18:14:07 +0000242#if !defined(_MSC_VER) || __has_feature(modules) || defined(__FXSR__)
Michael Kupersteina3c7b742015-06-30 09:45:38 +0000243#include <fxsrintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000244#endif
Michael Kupersteina3c7b742015-06-30 09:45:38 +0000245
Nico Weber379a1952016-05-16 18:14:07 +0000246#if !defined(_MSC_VER) || __has_feature(modules) || defined(__XSAVE__)
Amjad Aboud2b9b8a52015-10-13 12:29:35 +0000247#include <xsaveintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000248#endif
Amjad Aboud2b9b8a52015-10-13 12:29:35 +0000249
Nico Weber379a1952016-05-16 18:14:07 +0000250#if !defined(_MSC_VER) || __has_feature(modules) || defined(__XSAVEOPT__)
Amjad Aboud2b9b8a52015-10-13 12:29:35 +0000251#include <xsaveoptintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000252#endif
Amjad Aboud2b9b8a52015-10-13 12:29:35 +0000253
Nico Weber379a1952016-05-16 18:14:07 +0000254#if !defined(_MSC_VER) || __has_feature(modules) || defined(__XSAVEC__)
Amjad Aboud2b9b8a52015-10-13 12:29:35 +0000255#include <xsavecintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000256#endif
Amjad Aboud2b9b8a52015-10-13 12:29:35 +0000257
Nico Weber379a1952016-05-16 18:14:07 +0000258#if !defined(_MSC_VER) || __has_feature(modules) || defined(__XSAVES__)
Amjad Aboud2b9b8a52015-10-13 12:29:35 +0000259#include <xsavesintrin.h>
Nico Weber379a1952016-05-16 18:14:07 +0000260#endif
Amjad Aboud2b9b8a52015-10-13 12:29:35 +0000261
Eric Christopher29b78092015-06-17 18:42:03 +0000262/* Some intrinsics inside adxintrin.h are available only on processors with ADX,
263 * whereas others are also available at all times. */
Robert Khasanov83c419b2014-09-19 10:17:06 +0000264#include <adxintrin.h>
265
Benjamin Kramer65b9f7b2010-08-20 18:04:07 +0000266#endif /* __IMMINTRIN_H */