clang API Documentation
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 */