10b57cec5SDimitry Andric /*===---- immintrin.h - Intel intrinsics -----------------------------------=== 20b57cec5SDimitry Andric * 30b57cec5SDimitry Andric * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric * See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric * 70b57cec5SDimitry Andric *===-----------------------------------------------------------------------=== 80b57cec5SDimitry Andric */ 90b57cec5SDimitry Andric 100b57cec5SDimitry Andric #ifndef __IMMINTRIN_H 110b57cec5SDimitry Andric #define __IMMINTRIN_H 120b57cec5SDimitry Andric 13*349cc55cSDimitry Andric #if !defined(__i386__) && !defined(__x86_64__) 14*349cc55cSDimitry Andric #error "This header is only meant to be used on x86 and x64 architecture" 15*349cc55cSDimitry Andric #endif 16*349cc55cSDimitry Andric 17e8d8bef9SDimitry Andric #include <x86gprintrin.h> 18e8d8bef9SDimitry Andric 195ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 205ffd83dbSDimitry Andric defined(__MMX__) 210b57cec5SDimitry Andric #include <mmintrin.h> 220b57cec5SDimitry Andric #endif 230b57cec5SDimitry Andric 245ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 255ffd83dbSDimitry Andric defined(__SSE__) 260b57cec5SDimitry Andric #include <xmmintrin.h> 270b57cec5SDimitry Andric #endif 280b57cec5SDimitry Andric 295ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 305ffd83dbSDimitry Andric defined(__SSE2__) 310b57cec5SDimitry Andric #include <emmintrin.h> 320b57cec5SDimitry Andric #endif 330b57cec5SDimitry Andric 345ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 355ffd83dbSDimitry Andric defined(__SSE3__) 360b57cec5SDimitry Andric #include <pmmintrin.h> 370b57cec5SDimitry Andric #endif 380b57cec5SDimitry Andric 395ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 405ffd83dbSDimitry Andric defined(__SSSE3__) 410b57cec5SDimitry Andric #include <tmmintrin.h> 420b57cec5SDimitry Andric #endif 430b57cec5SDimitry Andric 445ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 450b57cec5SDimitry Andric (defined(__SSE4_2__) || defined(__SSE4_1__)) 460b57cec5SDimitry Andric #include <smmintrin.h> 470b57cec5SDimitry Andric #endif 480b57cec5SDimitry Andric 495ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 500b57cec5SDimitry Andric (defined(__AES__) || defined(__PCLMUL__)) 510b57cec5SDimitry Andric #include <wmmintrin.h> 520b57cec5SDimitry Andric #endif 530b57cec5SDimitry Andric 545ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 555ffd83dbSDimitry Andric defined(__CLFLUSHOPT__) 560b57cec5SDimitry Andric #include <clflushoptintrin.h> 570b57cec5SDimitry Andric #endif 580b57cec5SDimitry Andric 595ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 605ffd83dbSDimitry Andric defined(__CLWB__) 610b57cec5SDimitry Andric #include <clwbintrin.h> 620b57cec5SDimitry Andric #endif 630b57cec5SDimitry Andric 645ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 655ffd83dbSDimitry Andric defined(__AVX__) 660b57cec5SDimitry Andric #include <avxintrin.h> 670b57cec5SDimitry Andric #endif 680b57cec5SDimitry Andric 695ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 705ffd83dbSDimitry Andric defined(__AVX2__) 710b57cec5SDimitry Andric #include <avx2intrin.h> 720b57cec5SDimitry Andric #endif 730b57cec5SDimitry Andric 745ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 755ffd83dbSDimitry Andric defined(__F16C__) 760b57cec5SDimitry Andric #include <f16cintrin.h> 770b57cec5SDimitry Andric #endif 780b57cec5SDimitry Andric 79a7dea167SDimitry Andric /* No feature check desired due to internal checks */ 800b57cec5SDimitry Andric #include <bmiintrin.h> 810b57cec5SDimitry Andric 825ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 835ffd83dbSDimitry Andric defined(__BMI2__) 840b57cec5SDimitry Andric #include <bmi2intrin.h> 850b57cec5SDimitry Andric #endif 860b57cec5SDimitry Andric 875ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 885ffd83dbSDimitry Andric defined(__LZCNT__) 890b57cec5SDimitry Andric #include <lzcntintrin.h> 900b57cec5SDimitry Andric #endif 910b57cec5SDimitry Andric 925ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 935ffd83dbSDimitry Andric defined(__POPCNT__) 940b57cec5SDimitry Andric #include <popcntintrin.h> 950b57cec5SDimitry Andric #endif 960b57cec5SDimitry Andric 975ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 985ffd83dbSDimitry Andric defined(__FMA__) 990b57cec5SDimitry Andric #include <fmaintrin.h> 1000b57cec5SDimitry Andric #endif 1010b57cec5SDimitry Andric 1025ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1035ffd83dbSDimitry Andric defined(__AVX512F__) 1040b57cec5SDimitry Andric #include <avx512fintrin.h> 1050b57cec5SDimitry Andric #endif 1060b57cec5SDimitry Andric 1075ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1085ffd83dbSDimitry Andric defined(__AVX512VL__) 1090b57cec5SDimitry Andric #include <avx512vlintrin.h> 1100b57cec5SDimitry Andric #endif 1110b57cec5SDimitry Andric 1125ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1135ffd83dbSDimitry Andric defined(__AVX512BW__) 1140b57cec5SDimitry Andric #include <avx512bwintrin.h> 1150b57cec5SDimitry Andric #endif 1160b57cec5SDimitry Andric 1175ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1185ffd83dbSDimitry Andric defined(__AVX512BITALG__) 1190b57cec5SDimitry Andric #include <avx512bitalgintrin.h> 1200b57cec5SDimitry Andric #endif 1210b57cec5SDimitry Andric 1225ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1235ffd83dbSDimitry Andric defined(__AVX512CD__) 1240b57cec5SDimitry Andric #include <avx512cdintrin.h> 1250b57cec5SDimitry Andric #endif 1260b57cec5SDimitry Andric 1275ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1285ffd83dbSDimitry Andric defined(__AVX512VPOPCNTDQ__) 1290b57cec5SDimitry Andric #include <avx512vpopcntdqintrin.h> 1300b57cec5SDimitry Andric #endif 1310b57cec5SDimitry Andric 1325ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1330b57cec5SDimitry Andric (defined(__AVX512VL__) && defined(__AVX512VPOPCNTDQ__)) 1340b57cec5SDimitry Andric #include <avx512vpopcntdqvlintrin.h> 1350b57cec5SDimitry Andric #endif 1360b57cec5SDimitry Andric 1375ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1385ffd83dbSDimitry Andric defined(__AVX512VNNI__) 1390b57cec5SDimitry Andric #include <avx512vnniintrin.h> 1400b57cec5SDimitry Andric #endif 1410b57cec5SDimitry Andric 1425ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1430b57cec5SDimitry Andric (defined(__AVX512VL__) && defined(__AVX512VNNI__)) 1440b57cec5SDimitry Andric #include <avx512vlvnniintrin.h> 1450b57cec5SDimitry Andric #endif 1460b57cec5SDimitry Andric 1475ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 148e8d8bef9SDimitry Andric defined(__AVXVNNI__) 149e8d8bef9SDimitry Andric #include <avxvnniintrin.h> 150e8d8bef9SDimitry Andric #endif 151e8d8bef9SDimitry Andric 152e8d8bef9SDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1535ffd83dbSDimitry Andric defined(__AVX512DQ__) 1540b57cec5SDimitry Andric #include <avx512dqintrin.h> 1550b57cec5SDimitry Andric #endif 1560b57cec5SDimitry Andric 1575ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1580b57cec5SDimitry Andric (defined(__AVX512VL__) && defined(__AVX512BITALG__)) 1590b57cec5SDimitry Andric #include <avx512vlbitalgintrin.h> 1600b57cec5SDimitry Andric #endif 1610b57cec5SDimitry Andric 1625ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1630b57cec5SDimitry Andric (defined(__AVX512VL__) && defined(__AVX512BW__)) 1640b57cec5SDimitry Andric #include <avx512vlbwintrin.h> 1650b57cec5SDimitry Andric #endif 1660b57cec5SDimitry Andric 1675ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1680b57cec5SDimitry Andric (defined(__AVX512VL__) && defined(__AVX512CD__)) 1690b57cec5SDimitry Andric #include <avx512vlcdintrin.h> 1700b57cec5SDimitry Andric #endif 1710b57cec5SDimitry Andric 1725ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1730b57cec5SDimitry Andric (defined(__AVX512VL__) && defined(__AVX512DQ__)) 1740b57cec5SDimitry Andric #include <avx512vldqintrin.h> 1750b57cec5SDimitry Andric #endif 1760b57cec5SDimitry Andric 1775ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1785ffd83dbSDimitry Andric defined(__AVX512ER__) 1790b57cec5SDimitry Andric #include <avx512erintrin.h> 1800b57cec5SDimitry Andric #endif 1810b57cec5SDimitry Andric 1825ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1835ffd83dbSDimitry Andric defined(__AVX512IFMA__) 1840b57cec5SDimitry Andric #include <avx512ifmaintrin.h> 1850b57cec5SDimitry Andric #endif 1860b57cec5SDimitry Andric 1875ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1880b57cec5SDimitry Andric (defined(__AVX512IFMA__) && defined(__AVX512VL__)) 1890b57cec5SDimitry Andric #include <avx512ifmavlintrin.h> 1900b57cec5SDimitry Andric #endif 1910b57cec5SDimitry Andric 1925ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1935ffd83dbSDimitry Andric defined(__AVX512VBMI__) 1940b57cec5SDimitry Andric #include <avx512vbmiintrin.h> 1950b57cec5SDimitry Andric #endif 1960b57cec5SDimitry Andric 1975ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 1980b57cec5SDimitry Andric (defined(__AVX512VBMI__) && defined(__AVX512VL__)) 1990b57cec5SDimitry Andric #include <avx512vbmivlintrin.h> 2000b57cec5SDimitry Andric #endif 2010b57cec5SDimitry Andric 2025ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 2035ffd83dbSDimitry Andric defined(__AVX512VBMI2__) 2040b57cec5SDimitry Andric #include <avx512vbmi2intrin.h> 2050b57cec5SDimitry Andric #endif 2060b57cec5SDimitry Andric 2075ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 2080b57cec5SDimitry Andric (defined(__AVX512VBMI2__) && defined(__AVX512VL__)) 2090b57cec5SDimitry Andric #include <avx512vlvbmi2intrin.h> 2100b57cec5SDimitry Andric #endif 2110b57cec5SDimitry Andric 2125ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 2135ffd83dbSDimitry Andric defined(__AVX512PF__) 2140b57cec5SDimitry Andric #include <avx512pfintrin.h> 2150b57cec5SDimitry Andric #endif 2160b57cec5SDimitry Andric 217*349cc55cSDimitry Andric /* 218*349cc55cSDimitry Andric * FIXME: _Float16 type is legal only when HW support float16 operation. 219*349cc55cSDimitry Andric * We use __AVX512FP16__ to identify if float16 is supported or not, so 220*349cc55cSDimitry Andric * when float16 is not supported, the related header is not included. 221*349cc55cSDimitry Andric * 222*349cc55cSDimitry Andric */ 223*349cc55cSDimitry Andric #if defined(__AVX512FP16__) 224*349cc55cSDimitry Andric #include <avx512fp16intrin.h> 225*349cc55cSDimitry Andric #endif 226*349cc55cSDimitry Andric 227*349cc55cSDimitry Andric #if defined(__AVX512FP16__) && defined(__AVX512VL__) 228*349cc55cSDimitry Andric #include <avx512vlfp16intrin.h> 229*349cc55cSDimitry Andric #endif 230*349cc55cSDimitry Andric 2315ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 2325ffd83dbSDimitry Andric defined(__AVX512BF16__) 2330b57cec5SDimitry Andric #include <avx512bf16intrin.h> 2340b57cec5SDimitry Andric #endif 2350b57cec5SDimitry Andric 2365ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 2370b57cec5SDimitry Andric (defined(__AVX512VL__) && defined(__AVX512BF16__)) 2380b57cec5SDimitry Andric #include <avx512vlbf16intrin.h> 2390b57cec5SDimitry Andric #endif 2400b57cec5SDimitry Andric 2415ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 2425ffd83dbSDimitry Andric defined(__PKU__) 2430b57cec5SDimitry Andric #include <pkuintrin.h> 2440b57cec5SDimitry Andric #endif 2450b57cec5SDimitry Andric 2465ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 247fe6060f1SDimitry Andric defined(__VPCLMULQDQ__) 248fe6060f1SDimitry Andric #include <vpclmulqdqintrin.h> 249fe6060f1SDimitry Andric #endif 250fe6060f1SDimitry Andric 251fe6060f1SDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 2525ffd83dbSDimitry Andric defined(__VAES__) 2530b57cec5SDimitry Andric #include <vaesintrin.h> 2540b57cec5SDimitry Andric #endif 2550b57cec5SDimitry Andric 2565ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 2575ffd83dbSDimitry Andric defined(__GFNI__) 2580b57cec5SDimitry Andric #include <gfniintrin.h> 2590b57cec5SDimitry Andric #endif 2600b57cec5SDimitry Andric 2615ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 2625ffd83dbSDimitry Andric defined(__RDPID__) 2630b57cec5SDimitry Andric /// Returns the value of the IA32_TSC_AUX MSR (0xc0000103). 2640b57cec5SDimitry Andric /// 2650b57cec5SDimitry Andric /// \headerfile <immintrin.h> 2660b57cec5SDimitry Andric /// 2670b57cec5SDimitry Andric /// This intrinsic corresponds to the <c> RDPID </c> instruction. 2680b57cec5SDimitry Andric static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("rdpid"))) 2690b57cec5SDimitry Andric _rdpid_u32(void) { 2700b57cec5SDimitry Andric return __builtin_ia32_rdpid(); 2710b57cec5SDimitry Andric } 2720b57cec5SDimitry Andric #endif // __RDPID__ 2730b57cec5SDimitry Andric 2745ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 2755ffd83dbSDimitry Andric defined(__RDRND__) 2760b57cec5SDimitry Andric static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd"))) 2770b57cec5SDimitry Andric _rdrand16_step(unsigned short *__p) 2780b57cec5SDimitry Andric { 2790b57cec5SDimitry Andric return __builtin_ia32_rdrand16_step(__p); 2800b57cec5SDimitry Andric } 2810b57cec5SDimitry Andric 2820b57cec5SDimitry Andric static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd"))) 2830b57cec5SDimitry Andric _rdrand32_step(unsigned int *__p) 2840b57cec5SDimitry Andric { 2850b57cec5SDimitry Andric return __builtin_ia32_rdrand32_step(__p); 2860b57cec5SDimitry Andric } 2870b57cec5SDimitry Andric 2880b57cec5SDimitry Andric #ifdef __x86_64__ 2890b57cec5SDimitry Andric static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("rdrnd"))) 2900b57cec5SDimitry Andric _rdrand64_step(unsigned long long *__p) 2910b57cec5SDimitry Andric { 2920b57cec5SDimitry Andric return __builtin_ia32_rdrand64_step(__p); 2930b57cec5SDimitry Andric } 2940b57cec5SDimitry Andric #endif 2950b57cec5SDimitry Andric #endif /* __RDRND__ */ 2960b57cec5SDimitry Andric 2975ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 2985ffd83dbSDimitry Andric defined(__FSGSBASE__) 2990b57cec5SDimitry Andric #ifdef __x86_64__ 3000b57cec5SDimitry Andric static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase"))) 3010b57cec5SDimitry Andric _readfsbase_u32(void) 3020b57cec5SDimitry Andric { 3030b57cec5SDimitry Andric return __builtin_ia32_rdfsbase32(); 3040b57cec5SDimitry Andric } 3050b57cec5SDimitry Andric 3060b57cec5SDimitry Andric static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase"))) 3070b57cec5SDimitry Andric _readfsbase_u64(void) 3080b57cec5SDimitry Andric { 3090b57cec5SDimitry Andric return __builtin_ia32_rdfsbase64(); 3100b57cec5SDimitry Andric } 3110b57cec5SDimitry Andric 3120b57cec5SDimitry Andric static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase"))) 3130b57cec5SDimitry Andric _readgsbase_u32(void) 3140b57cec5SDimitry Andric { 3150b57cec5SDimitry Andric return __builtin_ia32_rdgsbase32(); 3160b57cec5SDimitry Andric } 3170b57cec5SDimitry Andric 3180b57cec5SDimitry Andric static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase"))) 3190b57cec5SDimitry Andric _readgsbase_u64(void) 3200b57cec5SDimitry Andric { 3210b57cec5SDimitry Andric return __builtin_ia32_rdgsbase64(); 3220b57cec5SDimitry Andric } 3230b57cec5SDimitry Andric 3240b57cec5SDimitry Andric static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase"))) 3250b57cec5SDimitry Andric _writefsbase_u32(unsigned int __V) 3260b57cec5SDimitry Andric { 3270b57cec5SDimitry Andric __builtin_ia32_wrfsbase32(__V); 3280b57cec5SDimitry Andric } 3290b57cec5SDimitry Andric 3300b57cec5SDimitry Andric static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase"))) 3310b57cec5SDimitry Andric _writefsbase_u64(unsigned long long __V) 3320b57cec5SDimitry Andric { 3330b57cec5SDimitry Andric __builtin_ia32_wrfsbase64(__V); 3340b57cec5SDimitry Andric } 3350b57cec5SDimitry Andric 3360b57cec5SDimitry Andric static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase"))) 3370b57cec5SDimitry Andric _writegsbase_u32(unsigned int __V) 3380b57cec5SDimitry Andric { 3390b57cec5SDimitry Andric __builtin_ia32_wrgsbase32(__V); 3400b57cec5SDimitry Andric } 3410b57cec5SDimitry Andric 3420b57cec5SDimitry Andric static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("fsgsbase"))) 3430b57cec5SDimitry Andric _writegsbase_u64(unsigned long long __V) 3440b57cec5SDimitry Andric { 3450b57cec5SDimitry Andric __builtin_ia32_wrgsbase64(__V); 3460b57cec5SDimitry Andric } 3470b57cec5SDimitry Andric 3480b57cec5SDimitry Andric #endif 3490b57cec5SDimitry Andric #endif /* __FSGSBASE__ */ 3500b57cec5SDimitry Andric 3515ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 3525ffd83dbSDimitry Andric defined(__MOVBE__) 3530b57cec5SDimitry Andric 3540b57cec5SDimitry Andric /* The structs used below are to force the load/store to be unaligned. This 3550b57cec5SDimitry Andric * is accomplished with the __packed__ attribute. The __may_alias__ prevents 3560b57cec5SDimitry Andric * tbaa metadata from being generated based on the struct and the type of the 3570b57cec5SDimitry Andric * field inside of it. 3580b57cec5SDimitry Andric */ 3590b57cec5SDimitry Andric 3600b57cec5SDimitry Andric static __inline__ short __attribute__((__always_inline__, __nodebug__, __target__("movbe"))) 3610b57cec5SDimitry Andric _loadbe_i16(void const * __P) { 3620b57cec5SDimitry Andric struct __loadu_i16 { 3630b57cec5SDimitry Andric short __v; 3640b57cec5SDimitry Andric } __attribute__((__packed__, __may_alias__)); 365480093f4SDimitry Andric return __builtin_bswap16(((const struct __loadu_i16*)__P)->__v); 3660b57cec5SDimitry Andric } 3670b57cec5SDimitry Andric 3680b57cec5SDimitry Andric static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("movbe"))) 3690b57cec5SDimitry Andric _storebe_i16(void * __P, short __D) { 3700b57cec5SDimitry Andric struct __storeu_i16 { 3710b57cec5SDimitry Andric short __v; 3720b57cec5SDimitry Andric } __attribute__((__packed__, __may_alias__)); 3730b57cec5SDimitry Andric ((struct __storeu_i16*)__P)->__v = __builtin_bswap16(__D); 3740b57cec5SDimitry Andric } 3750b57cec5SDimitry Andric 3760b57cec5SDimitry Andric static __inline__ int __attribute__((__always_inline__, __nodebug__, __target__("movbe"))) 3770b57cec5SDimitry Andric _loadbe_i32(void const * __P) { 3780b57cec5SDimitry Andric struct __loadu_i32 { 3790b57cec5SDimitry Andric int __v; 3800b57cec5SDimitry Andric } __attribute__((__packed__, __may_alias__)); 381480093f4SDimitry Andric return __builtin_bswap32(((const struct __loadu_i32*)__P)->__v); 3820b57cec5SDimitry Andric } 3830b57cec5SDimitry Andric 3840b57cec5SDimitry Andric static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("movbe"))) 3850b57cec5SDimitry Andric _storebe_i32(void * __P, int __D) { 3860b57cec5SDimitry Andric struct __storeu_i32 { 3870b57cec5SDimitry Andric int __v; 3880b57cec5SDimitry Andric } __attribute__((__packed__, __may_alias__)); 3890b57cec5SDimitry Andric ((struct __storeu_i32*)__P)->__v = __builtin_bswap32(__D); 3900b57cec5SDimitry Andric } 3910b57cec5SDimitry Andric 3920b57cec5SDimitry Andric #ifdef __x86_64__ 3930b57cec5SDimitry Andric static __inline__ long long __attribute__((__always_inline__, __nodebug__, __target__("movbe"))) 3940b57cec5SDimitry Andric _loadbe_i64(void const * __P) { 3950b57cec5SDimitry Andric struct __loadu_i64 { 3960b57cec5SDimitry Andric long long __v; 3970b57cec5SDimitry Andric } __attribute__((__packed__, __may_alias__)); 398480093f4SDimitry Andric return __builtin_bswap64(((const struct __loadu_i64*)__P)->__v); 3990b57cec5SDimitry Andric } 4000b57cec5SDimitry Andric 4010b57cec5SDimitry Andric static __inline__ void __attribute__((__always_inline__, __nodebug__, __target__("movbe"))) 4020b57cec5SDimitry Andric _storebe_i64(void * __P, long long __D) { 4030b57cec5SDimitry Andric struct __storeu_i64 { 4040b57cec5SDimitry Andric long long __v; 4050b57cec5SDimitry Andric } __attribute__((__packed__, __may_alias__)); 4060b57cec5SDimitry Andric ((struct __storeu_i64*)__P)->__v = __builtin_bswap64(__D); 4070b57cec5SDimitry Andric } 4080b57cec5SDimitry Andric #endif 4090b57cec5SDimitry Andric #endif /* __MOVBE */ 4100b57cec5SDimitry Andric 4115ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 4125ffd83dbSDimitry Andric defined(__RTM__) 4130b57cec5SDimitry Andric #include <rtmintrin.h> 4140b57cec5SDimitry Andric #include <xtestintrin.h> 4150b57cec5SDimitry Andric #endif 4160b57cec5SDimitry Andric 4175ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 4185ffd83dbSDimitry Andric defined(__SHA__) 4190b57cec5SDimitry Andric #include <shaintrin.h> 4200b57cec5SDimitry Andric #endif 4210b57cec5SDimitry Andric 4225ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 4235ffd83dbSDimitry Andric defined(__FXSR__) 4240b57cec5SDimitry Andric #include <fxsrintrin.h> 4250b57cec5SDimitry Andric #endif 4260b57cec5SDimitry Andric 4270b57cec5SDimitry Andric /* No feature check desired due to internal MSC_VER checks */ 4280b57cec5SDimitry Andric #include <xsaveintrin.h> 4290b57cec5SDimitry Andric 4305ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 4315ffd83dbSDimitry Andric defined(__XSAVEOPT__) 4320b57cec5SDimitry Andric #include <xsaveoptintrin.h> 4330b57cec5SDimitry Andric #endif 4340b57cec5SDimitry Andric 4355ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 4365ffd83dbSDimitry Andric defined(__XSAVEC__) 4370b57cec5SDimitry Andric #include <xsavecintrin.h> 4380b57cec5SDimitry Andric #endif 4390b57cec5SDimitry Andric 4405ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 4415ffd83dbSDimitry Andric defined(__XSAVES__) 4420b57cec5SDimitry Andric #include <xsavesintrin.h> 4430b57cec5SDimitry Andric #endif 4440b57cec5SDimitry Andric 4455ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 4465ffd83dbSDimitry Andric defined(__SHSTK__) 4470b57cec5SDimitry Andric #include <cetintrin.h> 4480b57cec5SDimitry Andric #endif 4490b57cec5SDimitry Andric 4500b57cec5SDimitry Andric /* Some intrinsics inside adxintrin.h are available only on processors with ADX, 4510b57cec5SDimitry Andric * whereas others are also available at all times. */ 4520b57cec5SDimitry Andric #include <adxintrin.h> 4530b57cec5SDimitry Andric 4545ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 4555ffd83dbSDimitry Andric defined(__RDSEED__) 4560b57cec5SDimitry Andric #include <rdseedintrin.h> 4570b57cec5SDimitry Andric #endif 4580b57cec5SDimitry Andric 4595ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 4605ffd83dbSDimitry Andric defined(__WBNOINVD__) 4610b57cec5SDimitry Andric #include <wbnoinvdintrin.h> 4620b57cec5SDimitry Andric #endif 4630b57cec5SDimitry Andric 4645ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 4655ffd83dbSDimitry Andric defined(__CLDEMOTE__) 4660b57cec5SDimitry Andric #include <cldemoteintrin.h> 4670b57cec5SDimitry Andric #endif 4680b57cec5SDimitry Andric 4695ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 4705ffd83dbSDimitry Andric defined(__WAITPKG__) 4710b57cec5SDimitry Andric #include <waitpkgintrin.h> 4720b57cec5SDimitry Andric #endif 4730b57cec5SDimitry Andric 4745ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 4750b57cec5SDimitry Andric defined(__MOVDIRI__) || defined(__MOVDIR64B__) 4760b57cec5SDimitry Andric #include <movdirintrin.h> 4770b57cec5SDimitry Andric #endif 4780b57cec5SDimitry Andric 4795ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 4805ffd83dbSDimitry Andric defined(__PCONFIG__) 4810b57cec5SDimitry Andric #include <pconfigintrin.h> 4820b57cec5SDimitry Andric #endif 4830b57cec5SDimitry Andric 4845ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 4855ffd83dbSDimitry Andric defined(__SGX__) 4860b57cec5SDimitry Andric #include <sgxintrin.h> 4870b57cec5SDimitry Andric #endif 4880b57cec5SDimitry Andric 4895ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 4905ffd83dbSDimitry Andric defined(__PTWRITE__) 4910b57cec5SDimitry Andric #include <ptwriteintrin.h> 4920b57cec5SDimitry Andric #endif 4930b57cec5SDimitry Andric 4945ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 4955ffd83dbSDimitry Andric defined(__INVPCID__) 4960b57cec5SDimitry Andric #include <invpcidintrin.h> 4970b57cec5SDimitry Andric #endif 4980b57cec5SDimitry Andric 4995ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 500e8d8bef9SDimitry Andric defined(__KL__) || defined(__WIDEKL__) 501e8d8bef9SDimitry Andric #include <keylockerintrin.h> 502e8d8bef9SDimitry Andric #endif 503e8d8bef9SDimitry Andric 504e8d8bef9SDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 5055ffd83dbSDimitry Andric defined(__AMXTILE__) || defined(__AMXINT8__) || defined(__AMXBF16__) 5065ffd83dbSDimitry Andric #include <amxintrin.h> 5075ffd83dbSDimitry Andric #endif 5085ffd83dbSDimitry Andric 5095ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 5100b57cec5SDimitry Andric defined(__AVX512VP2INTERSECT__) 5110b57cec5SDimitry Andric #include <avx512vp2intersectintrin.h> 5120b57cec5SDimitry Andric #endif 5130b57cec5SDimitry Andric 5145ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 5150b57cec5SDimitry Andric (defined(__AVX512VL__) && defined(__AVX512VP2INTERSECT__)) 5160b57cec5SDimitry Andric #include <avx512vlvp2intersectintrin.h> 5170b57cec5SDimitry Andric #endif 5180b57cec5SDimitry Andric 5195ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 5205ffd83dbSDimitry Andric defined(__ENQCMD__) 5210b57cec5SDimitry Andric #include <enqcmdintrin.h> 5220b57cec5SDimitry Andric #endif 5230b57cec5SDimitry Andric 5245ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 5255ffd83dbSDimitry Andric defined(__SERIALIZE__) 5265ffd83dbSDimitry Andric #include <serializeintrin.h> 5275ffd83dbSDimitry Andric #endif 5285ffd83dbSDimitry Andric 5295ffd83dbSDimitry Andric #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \ 5305ffd83dbSDimitry Andric defined(__TSXLDTRK__) 5315ffd83dbSDimitry Andric #include <tsxldtrkintrin.h> 5325ffd83dbSDimitry Andric #endif 5335ffd83dbSDimitry Andric 5340b57cec5SDimitry Andric #if defined(_MSC_VER) && __has_extension(gnu_asm) 5350b57cec5SDimitry Andric /* Define the default attributes for these intrinsics */ 5360b57cec5SDimitry Andric #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__)) 5370b57cec5SDimitry Andric #ifdef __cplusplus 5380b57cec5SDimitry Andric extern "C" { 5390b57cec5SDimitry Andric #endif 5400b57cec5SDimitry Andric /*----------------------------------------------------------------------------*\ 5410b57cec5SDimitry Andric |* Interlocked Exchange HLE 5420b57cec5SDimitry Andric \*----------------------------------------------------------------------------*/ 5430b57cec5SDimitry Andric #if defined(__i386__) || defined(__x86_64__) 5440b57cec5SDimitry Andric static __inline__ long __DEFAULT_FN_ATTRS 5450b57cec5SDimitry Andric _InterlockedExchange_HLEAcquire(long volatile *_Target, long _Value) { 546*349cc55cSDimitry Andric __asm__ __volatile__(".byte 0xf2 ; lock ; xchg {%0, %1|%1, %0}" 5470b57cec5SDimitry Andric : "+r" (_Value), "+m" (*_Target) :: "memory"); 5480b57cec5SDimitry Andric return _Value; 5490b57cec5SDimitry Andric } 5500b57cec5SDimitry Andric static __inline__ long __DEFAULT_FN_ATTRS 5510b57cec5SDimitry Andric _InterlockedExchange_HLERelease(long volatile *_Target, long _Value) { 552*349cc55cSDimitry Andric __asm__ __volatile__(".byte 0xf3 ; lock ; xchg {%0, %1|%1, %0}" 5530b57cec5SDimitry Andric : "+r" (_Value), "+m" (*_Target) :: "memory"); 5540b57cec5SDimitry Andric return _Value; 5550b57cec5SDimitry Andric } 5560b57cec5SDimitry Andric #endif 5570b57cec5SDimitry Andric #if defined(__x86_64__) 5580b57cec5SDimitry Andric static __inline__ __int64 __DEFAULT_FN_ATTRS 5590b57cec5SDimitry Andric _InterlockedExchange64_HLEAcquire(__int64 volatile *_Target, __int64 _Value) { 560*349cc55cSDimitry Andric __asm__ __volatile__(".byte 0xf2 ; lock ; xchg {%0, %1|%1, %0}" 5610b57cec5SDimitry Andric : "+r" (_Value), "+m" (*_Target) :: "memory"); 5620b57cec5SDimitry Andric return _Value; 5630b57cec5SDimitry Andric } 5640b57cec5SDimitry Andric static __inline__ __int64 __DEFAULT_FN_ATTRS 5650b57cec5SDimitry Andric _InterlockedExchange64_HLERelease(__int64 volatile *_Target, __int64 _Value) { 566*349cc55cSDimitry Andric __asm__ __volatile__(".byte 0xf3 ; lock ; xchg {%0, %1|%1, %0}" 5670b57cec5SDimitry Andric : "+r" (_Value), "+m" (*_Target) :: "memory"); 5680b57cec5SDimitry Andric return _Value; 5690b57cec5SDimitry Andric } 5700b57cec5SDimitry Andric #endif 5710b57cec5SDimitry Andric /*----------------------------------------------------------------------------*\ 5720b57cec5SDimitry Andric |* Interlocked Compare Exchange HLE 5730b57cec5SDimitry Andric \*----------------------------------------------------------------------------*/ 5740b57cec5SDimitry Andric #if defined(__i386__) || defined(__x86_64__) 5750b57cec5SDimitry Andric static __inline__ long __DEFAULT_FN_ATTRS 5760b57cec5SDimitry Andric _InterlockedCompareExchange_HLEAcquire(long volatile *_Destination, 5770b57cec5SDimitry Andric long _Exchange, long _Comparand) { 578*349cc55cSDimitry Andric __asm__ __volatile__(".byte 0xf2 ; lock ; cmpxchg {%2, %1|%1, %2}" 5790b57cec5SDimitry Andric : "+a" (_Comparand), "+m" (*_Destination) 5800b57cec5SDimitry Andric : "r" (_Exchange) : "memory"); 5810b57cec5SDimitry Andric return _Comparand; 5820b57cec5SDimitry Andric } 5830b57cec5SDimitry Andric static __inline__ long __DEFAULT_FN_ATTRS 5840b57cec5SDimitry Andric _InterlockedCompareExchange_HLERelease(long volatile *_Destination, 5850b57cec5SDimitry Andric long _Exchange, long _Comparand) { 586*349cc55cSDimitry Andric __asm__ __volatile__(".byte 0xf3 ; lock ; cmpxchg {%2, %1|%1, %2}" 5870b57cec5SDimitry Andric : "+a" (_Comparand), "+m" (*_Destination) 5880b57cec5SDimitry Andric : "r" (_Exchange) : "memory"); 5890b57cec5SDimitry Andric return _Comparand; 5900b57cec5SDimitry Andric } 5910b57cec5SDimitry Andric #endif 5920b57cec5SDimitry Andric #if defined(__x86_64__) 5930b57cec5SDimitry Andric static __inline__ __int64 __DEFAULT_FN_ATTRS 5940b57cec5SDimitry Andric _InterlockedCompareExchange64_HLEAcquire(__int64 volatile *_Destination, 5950b57cec5SDimitry Andric __int64 _Exchange, __int64 _Comparand) { 596*349cc55cSDimitry Andric __asm__ __volatile__(".byte 0xf2 ; lock ; cmpxchg {%2, %1|%1, %2}" 5970b57cec5SDimitry Andric : "+a" (_Comparand), "+m" (*_Destination) 5980b57cec5SDimitry Andric : "r" (_Exchange) : "memory"); 5990b57cec5SDimitry Andric return _Comparand; 6000b57cec5SDimitry Andric } 6010b57cec5SDimitry Andric static __inline__ __int64 __DEFAULT_FN_ATTRS 6020b57cec5SDimitry Andric _InterlockedCompareExchange64_HLERelease(__int64 volatile *_Destination, 6030b57cec5SDimitry Andric __int64 _Exchange, __int64 _Comparand) { 604*349cc55cSDimitry Andric __asm__ __volatile__(".byte 0xf3 ; lock ; cmpxchg {%2, %1|%1, %2}" 6050b57cec5SDimitry Andric : "+a" (_Comparand), "+m" (*_Destination) 6060b57cec5SDimitry Andric : "r" (_Exchange) : "memory"); 6070b57cec5SDimitry Andric return _Comparand; 6080b57cec5SDimitry Andric } 6090b57cec5SDimitry Andric #endif 6100b57cec5SDimitry Andric #ifdef __cplusplus 6110b57cec5SDimitry Andric } 6120b57cec5SDimitry Andric #endif 6130b57cec5SDimitry Andric 6140b57cec5SDimitry Andric #undef __DEFAULT_FN_ATTRS 6150b57cec5SDimitry Andric 6160b57cec5SDimitry Andric #endif /* defined(_MSC_VER) && __has_extension(gnu_asm) */ 6170b57cec5SDimitry Andric 6180b57cec5SDimitry Andric #endif /* __IMMINTRIN_H */ 619