How can I check the code if SSE / SSE2 is enabled or not by the Visual Studio compiler?
I tried #ifdef __SSE__ , but that didn't work.
#ifdef __SSE__
From the documentation :
_M_IX86_FPExpands to a value indicating which compiler option / arch was used:0 if / arch: IA32 was used.1 if / arch: SSE was used.2 if / arch: SSE2 was used. This value is the default if / arch is not specified.
_M_IX86_FP
Expands to a value indicating which compiler option / arch was used:
I do not see mention of _SSE_ .
_SSE_
Learn more about _M_IX86_FP .
_M_IX86_FP is defined only for 32-bit code. 64-bit x86 code has at least SSE2. You can use _M_AMD64 or _M_X64 to determine if the code is 64-bit.
#ifdef __AVX2__ //AVX2 #elif defined ( __AVX__ ) //AVX #elif (defined(_M_AMD64) || defined(_M_X64)) //SSE2 x64 #elif _M_IX86_FP == 2 //SSE2 x32 #elif _M_IX86_FP == 1 //SSE x32 #else //nothing #endif
Corresponding preprocessor macros have two underscores at each end:
#ifdef __SSE__ #ifdef __SSE2__ #ifdef __SSE3__ #ifdef __SSE4_1__ #ifdef __AVX__ ...etc...
UPDATE Apparently, the above macros are not automatically defined for you when using Visual Studio (although they are in all other x86 compilers I have ever used), so you may need to define them yourself if you want to port using gcc, clang, ICC, etc ...
This is a late answer, but on MSDN you can find an article on __cpuid and __cpuidex. I remade the class into a function and it checks for support for MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1. https://docs.microsoft.com/en-us/cpp/intrinsics/cpuid-cpuidex?view=vs-2019
[[nodiscard]] bool CheckSimdSupport() noexcept { std::array<int, 4> cpui; int nIds_{}; std::bitset<32> f_1_ECX_{}; std::bitset<32> f_1_EDX_{}; std::vector<std::array<int, 4>> data_; __cpuid(cpui.data(), 0); nIds_ = cpui[0]; for (int i = 0; i <= 1; ++i) { __cpuid(cpui.data(), i); data_.push_back(cpui); } if (nIds_ >= 1) { f_1_ECX_ = data_[1][2]; f_1_EDX_ = data_[1][3]; } // f_1_ECX_[0] - SSE3 // f_1_ECX_[9] - SSSE3 // f_1_ECX_[19] - SSE4.1 // f_1_EDX_[23] - MMX // f_1_EDX_[25] - SSE // f_1_EDX_[26] - SSE2 return f_1_ECX_[0] && f_1_ECX_[9] && f_1_ECX_[19] && f_1_EDX_[23] && f_1_EDX_[25] && f_1_EDX_[26]; }