21 #define INSTRSET_H 116
24 #if (defined(_M_AMD64) || defined(_M_X64) || defined(__amd64) ) && ! defined(__x86_64__)
25 #define __x86_64__ 1 // There are many different macros for this, decide on only one
31 #if defined ( __AVX512F__ ) || defined ( __AVX512__ ) // || defined ( __AVX512ER__ )
33 #elif defined ( __AVX2__ )
35 #elif defined ( __AVX__ )
37 #elif defined ( __SSE4_2__ )
39 #elif defined ( __SSE4_1__ )
41 #elif defined ( __SSSE3__ )
43 #elif defined ( __SSE3__ )
45 #elif defined ( __SSE2__ ) || defined ( __x86_64__ )
47 #elif defined ( __SSE__ )
49 #elif defined ( _M_IX86_FP ) // Defined in MS compiler. 1: SSE, 2: SSE2
50 #define INSTRSET _M_IX86_FP
53 #endif // instruction set defines
57 #if INSTRSET > 7 // AVX2 and later
58 #if defined (__GNUC__) && ! defined (__INTEL_COMPILER)
59 #include <x86intrin.h>
63 #include <immintrin.h>
66 #include <immintrin.h>
68 #include <nmmintrin.h>
70 #include <smmintrin.h>
72 #include <tmmintrin.h>
74 #include <pmmintrin.h>
76 #include <emmintrin.h>
78 #include <xmmintrin.h>
81 #if INSTRSET >= 8 && !defined(__FMA__)
83 #if defined (__GNUC__) && ! defined (__INTEL_COMPILER) && ! defined (__clang__)
85 #pragma message "It is recommended to specify also option -mfma when using -mavx2 or higher"
92 #if defined (__XOP__) || defined (__FMA4__)
94 #include <x86intrin.h>
96 #include <ammintrin.h>
98 #elif defined (__SSE4A__) // AMD SSE4A
99 #include <ammintrin.h>
103 #if defined (__FMA__) && (defined(__GNUC__) || defined(__clang__)) && ! defined (__INTEL_COMPILER)
104 #include <fmaintrin.h>
108 #if defined (__FMA4__) && (defined(__GNUC__) || defined(__clang__))
109 #include <fma4intrin.h>
114 #if defined(__GNUC__) || defined(__clang__) || (defined(_MSC_VER) && _MSC_VER >= 1600)
117 #elif defined(_MSC_VER)
119 typedef signed __int8
int8_t;
120 typedef unsigned __int8
uint8_t;
121 typedef signed __int16
int16_t;
123 typedef signed __int32
int32_t;
125 typedef signed __int64
int64_t;
127 #ifndef _INTPTR_T_DEFINED
128 #define _INTPTR_T_DEFINED
154 #ifdef _MSC_VER // Microsoft compiler or compatible Intel compiler
165 #if defined(__GNUC__) && !defined (GCC_VERSION) && !defined (__clang__)
166 #define GCC_VERSION ((__GNUC__) * 10000 + (__GNUC_MINOR__) * 100 + (__GNUC_PATCHLEVEL__))
170 #if defined (__clang__)
171 #define CLANG_VERSION ((__clang_major__) * 10000 + (__clang_minor__) * 100 + (__clang_patchlevel__))
179 #if defined (_WINDEF_) && defined(min) && defined(max)
191 #define const_int(n) (Const_int_t <n>()) // n must be compile-time integer constant
192 #define const_uint(n) (Const_uint_t<n>()) // n must be compile-time unsigned integer constant
unsigned long long uint64_t
unsigned short int uint16_t
int instrset_detect(void)