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