immintrin.h revision 296417
1169689Skan/*===---- immintrin.h - Intel intrinsics -----------------------------------===
2169689Skan *
3169689Skan * Permission is hereby granted, free of charge, to any person obtaining a copy
4169689Skan * of this software and associated documentation files (the "Software"), to deal
5169689Skan * in the Software without restriction, including without limitation the rights
6169689Skan * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7169689Skan * copies of the Software, and to permit persons to whom the Software is
8169689Skan * furnished to do so, subject to the following conditions:
9169689Skan *
10169689Skan * The above copyright notice and this permission notice shall be included in
11169689Skan * all copies or substantial portions of the Software.
12169689Skan *
13169689Skan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14169689Skan * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15169689Skan * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16169689Skan * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17169689Skan * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18169689Skan * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19169689Skan * THE SOFTWARE.
20169689Skan *
21169689Skan *===-----------------------------------------------------------------------===
22169689Skan */
23169689Skan
24169689Skan#ifndef __IMMINTRIN_H
25169689Skan#define __IMMINTRIN_H
26169689Skan
27169689Skan#include <mmintrin.h>
28169689Skan
29169689Skan#include <xmmintrin.h>
30169689Skan
31169689Skan#include <emmintrin.h>
32169689Skan
33169689Skan#include <pmmintrin.h>
34169689Skan
35169689Skan#include <tmmintrin.h>
36169689Skan
37169689Skan#include <smmintrin.h>
38169689Skan
39169689Skan#include <wmmintrin.h>
40169689Skan
41169689Skan#include <avxintrin.h>
42169689Skan
43169689Skan#include <avx2intrin.h>
44169689Skan
45169689Skan/* The 256-bit versions of functions in f16cintrin.h.
46169689Skan   Intel documents these as being in immintrin.h, and
47169689Skan   they depend on typedefs from avxintrin.h. */
48169689Skan
49169689Skan#define _mm256_cvtps_ph(a, imm) __extension__ ({ \
50169689Skan (__m128i)__builtin_ia32_vcvtps2ph256((__v8sf)(__m256)(a), (imm)); })
51169689Skan
52169689Skanstatic __inline __m256 __attribute__((__always_inline__, __nodebug__, __target__("f16c")))
53169689Skan_mm256_cvtph_ps(__m128i __a)
54169689Skan{
55169689Skan  return (__m256)__builtin_ia32_vcvtph2ps256((__v8hi)__a);
56169689Skan}
57169689Skan
58169689Skan#include <bmiintrin.h>
59169689Skan
60169689Skan#include <bmi2intrin.h>
61169689Skan
62169689Skan#include <lzcntintrin.h>
63169689Skan
64169689Skan#include <fmaintrin.h>
65169689Skan
66169689Skan#include <avx512fintrin.h>
67169689Skan
68169689Skan#include <avx512vlintrin.h>
69169689Skan
70169689Skan#include <avx512bwintrin.h>
71169689Skan
72169689Skan#include <avx512cdintrin.h>
73169689Skan
74169689Skan#include <avx512dqintrin.h>
75169689Skan
76169689Skan#include <avx512vlbwintrin.h>
77169689Skan
78169689Skan#include <avx512vldqintrin.h>
79169689Skan
80169689Skan#include <avx512erintrin.h>
81169689Skan
82169689Skan#include <pkuintrin.h>
83169689Skan
84169689Skanstatic __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
85169689Skan_rdrand16_step(unsigned short *__p)
86169689Skan{
87169689Skan  return __builtin_ia32_rdrand16_step(__p);
88169689Skan}
89169689Skan
90169689Skanstatic __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
91169689Skan_rdrand32_step(unsigned int *__p)
92169689Skan{
93169689Skan  return __builtin_ia32_rdrand32_step(__p);
94169689Skan}
95169689Skan
96169689Skan#ifdef __x86_64__
97169689Skanstatic __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd")))
98169689Skan_rdrand64_step(unsigned long long *__p)
99169689Skan{
100169689Skan  return __builtin_ia32_rdrand64_step(__p);
101169689Skan}
102169689Skan#endif
103169689Skan
104169689Skan#ifdef __x86_64__
105169689Skanstatic __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
106169689Skan_readfsbase_u32(void)
107169689Skan{
108169689Skan  return __builtin_ia32_rdfsbase32();
109169689Skan}
110169689Skan
111169689Skanstatic __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
112169689Skan_readfsbase_u64(void)
113169689Skan{
114169689Skan  return __builtin_ia32_rdfsbase64();
115169689Skan}
116169689Skan
117169689Skanstatic __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
118169689Skan_readgsbase_u32(void)
119169689Skan{
120169689Skan  return __builtin_ia32_rdgsbase32();
121169689Skan}
122169689Skan
123169689Skanstatic __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
124169689Skan_readgsbase_u64(void)
125169689Skan{
126169689Skan  return __builtin_ia32_rdgsbase64();
127169689Skan}
128169689Skan
129169689Skanstatic __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
130169689Skan_writefsbase_u32(unsigned int __V)
131169689Skan{
132169689Skan  return __builtin_ia32_wrfsbase32(__V);
133169689Skan}
134169689Skan
135169689Skanstatic __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
136169689Skan_writefsbase_u64(unsigned long long __V)
137169689Skan{
138169689Skan  return __builtin_ia32_wrfsbase64(__V);
139169689Skan}
140169689Skan
141169689Skanstatic __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
142169689Skan_writegsbase_u32(unsigned int __V)
143169689Skan{
144169689Skan  return __builtin_ia32_wrgsbase32(__V);
145169689Skan}
146169689Skan
147169689Skanstatic __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase")))
148169689Skan_writegsbase_u64(unsigned long long __V)
149169689Skan{
150169689Skan  return __builtin_ia32_wrgsbase64(__V);
151169689Skan}
152169689Skan#endif
153169689Skan
154169689Skan#include <rtmintrin.h>
155169689Skan
156169689Skan#include <xtestintrin.h>
157169689Skan
158169689Skan#include <shaintrin.h>
159169689Skan
160169689Skan#include <fxsrintrin.h>
161169689Skan
162169689Skan#include <xsaveintrin.h>
163169689Skan
164169689Skan#include <xsaveoptintrin.h>
165169689Skan
166169689Skan#include <xsavecintrin.h>
167169689Skan
168169689Skan#include <xsavesintrin.h>
169169689Skan
170169689Skan/* Some intrinsics inside adxintrin.h are available only on processors with ADX,
171169689Skan * whereas others are also available at all times. */
172169689Skan#include <adxintrin.h>
173169689Skan
174169689Skan#endif /* __IMMINTRIN_H */
175169689Skan