clang API Documentation

immintrin.h
Go to the documentation of this file.
00001 /*===---- immintrin.h - Intel intrinsics -----------------------------------===
00002  *
00003  * Permission is hereby granted, free of charge, to any person obtaining a copy
00004  * of this software and associated documentation files (the "Software"), to deal
00005  * in the Software without restriction, including without limitation the rights
00006  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00007  * copies of the Software, and to permit persons to whom the Software is
00008  * furnished to do so, subject to the following conditions:
00009  *
00010  * The above copyright notice and this permission notice shall be included in
00011  * all copies or substantial portions of the Software.
00012  *
00013  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00014  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00015  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00016  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00017  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00018  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00019  * THE SOFTWARE.
00020  *
00021  *===-----------------------------------------------------------------------===
00022  */
00023 
00024 #ifndef __IMMINTRIN_H
00025 #define __IMMINTRIN_H
00026 
00027 #ifdef __MMX__
00028 #include <mmintrin.h>
00029 #endif
00030 
00031 #ifdef __SSE__
00032 #include <xmmintrin.h>
00033 #endif
00034 
00035 #ifdef __SSE2__
00036 #include <emmintrin.h>
00037 #endif
00038 
00039 #ifdef __SSE3__
00040 #include <pmmintrin.h>
00041 #endif
00042 
00043 #ifdef __SSSE3__
00044 #include <tmmintrin.h>
00045 #endif
00046 
00047 #if defined (__SSE4_2__) || defined (__SSE4_1__)
00048 #include <smmintrin.h>
00049 #endif
00050 
00051 #if defined (__AES__) || defined (__PCLMUL__)
00052 #include <wmmintrin.h>
00053 #endif
00054 
00055 #ifdef __AVX__
00056 #include <avxintrin.h>
00057 #endif
00058 
00059 #ifdef __AVX2__
00060 #include <avx2intrin.h>
00061 #endif
00062 
00063 #ifdef __BMI__
00064 #include <bmiintrin.h>
00065 #endif
00066 
00067 #ifdef __BMI2__
00068 #include <bmi2intrin.h>
00069 #endif
00070 
00071 #ifdef __LZCNT__
00072 #include <lzcntintrin.h>
00073 #endif
00074 
00075 #ifdef __FMA__
00076 #include <fmaintrin.h>
00077 #endif
00078 
00079 #ifdef __AVX512F__
00080 #include <avx512fintrin.h>
00081 #endif
00082 
00083 #ifdef __AVX512VL__
00084 #include <avx512vlintrin.h>
00085 #endif
00086 
00087 #ifdef __AVX512BW__
00088 #include <avx512bwintrin.h>
00089 #endif
00090 
00091 #if defined (__AVX512VL__) && defined (__AVX512BW__)
00092 #include <avx512vlbwintrin.h>
00093 #endif
00094 
00095 #ifdef __AVX512ER__
00096 #include <avx512erintrin.h>
00097 #endif
00098 
00099 #ifdef __RDRND__
00100 static __inline__ int __attribute__((__always_inline__, __nodebug__))
00101 _rdrand16_step(unsigned short *__p)
00102 {
00103   return __builtin_ia32_rdrand16_step(__p);
00104 }
00105 
00106 static __inline__ int __attribute__((__always_inline__, __nodebug__))
00107 _rdrand32_step(unsigned int *__p)
00108 {
00109   return __builtin_ia32_rdrand32_step(__p);
00110 }
00111 
00112 #ifdef __x86_64__
00113 static __inline__ int __attribute__((__always_inline__, __nodebug__))
00114 _rdrand64_step(unsigned long long *__p)
00115 {
00116   return __builtin_ia32_rdrand64_step(__p);
00117 }
00118 #endif
00119 #endif /* __RDRND__ */
00120 
00121 #ifdef __FSGSBASE__
00122 #ifdef __x86_64__
00123 static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
00124 _readfsbase_u32(void)
00125 {
00126   return __builtin_ia32_rdfsbase32();
00127 }
00128 
00129 static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
00130 _readfsbase_u64(void)
00131 {
00132   return __builtin_ia32_rdfsbase64();
00133 }
00134 
00135 static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
00136 _readgsbase_u32(void)
00137 {
00138   return __builtin_ia32_rdgsbase32();
00139 }
00140 
00141 static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
00142 _readgsbase_u64(void)
00143 {
00144   return __builtin_ia32_rdgsbase64();
00145 }
00146 
00147 static __inline__ void __attribute__((__always_inline__, __nodebug__))
00148 _writefsbase_u32(unsigned int __V)
00149 {
00150   return __builtin_ia32_wrfsbase32(__V);
00151 }
00152 
00153 static __inline__ void __attribute__((__always_inline__, __nodebug__))
00154 _writefsbase_u64(unsigned long long __V)
00155 {
00156   return __builtin_ia32_wrfsbase64(__V);
00157 }
00158 
00159 static __inline__ void __attribute__((__always_inline__, __nodebug__))
00160 _writegsbase_u32(unsigned int __V)
00161 {
00162   return __builtin_ia32_wrgsbase32(__V);
00163 }
00164 
00165 static __inline__ void __attribute__((__always_inline__, __nodebug__))
00166 _writegsbase_u64(unsigned long long __V)
00167 {
00168   return __builtin_ia32_wrgsbase64(__V);
00169 }
00170 #endif
00171 #endif /* __FSGSBASE__ */
00172 
00173 #ifdef __RTM__
00174 #include <rtmintrin.h>
00175 #endif
00176 
00177 /* FIXME: check __HLE__ as well when HLE is supported. */
00178 #if defined (__RTM__)
00179 static __inline__ int __attribute__((__always_inline__, __nodebug__))
00180 _xtest(void)
00181 {
00182   return __builtin_ia32_xtest();
00183 }
00184 #endif
00185 
00186 #ifdef __SHA__
00187 #include <shaintrin.h>
00188 #endif
00189 
00190 /* Some intrinsics inside adxintrin.h are available only if __ADX__ defined,
00191  * whereas others are also available if __ADX__ undefined */
00192 #include <adxintrin.h>
00193 
00194 #endif /* __IMMINTRIN_H */