diff --git a/CMake/OTBCheckSSEFeatures.cmake b/CMake/OTBCheckSSEFeatures.cmake index d13161f7c32a55a5a0cd1d9a3b4f3ae35790ae08..a7c67ed7de4f8274c379f86af8663f85630793c3 100644 --- a/CMake/OTBCheckSSEFeatures.cmake +++ b/CMake/OTBCheckSSEFeatures.cmake @@ -8,28 +8,42 @@ function(check_sse_features sse_flags ) message(STATUS "For apple assume sse2 is on for all intel builds") return() endif() - - if( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX ) + set(sse_flags_detected) + if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG) set(CMAKE_REQUIRED_FLAGS "-msse2") - check_cxx_source_runs(" + set(sse_flags_detected "-msse2 -mfpmath=sse") + elseif(MSVC AND NOT CMAKE_CL_64) + set(CMAKE_REQUIRED_FLAGS "/arch:SSE2") + set(sse_flags_detected "/arch:SSE2") + endif() + + check_cxx_source_runs(" #include <emmintrin.h> - int main() + int main () { - __m128d a, b; - double vals[2] = {0}; - a = _mm_loadu_pd(vals); - b = _mm_add_pd(a,a); - _mm_storeu_pd(vals,b); - return 0; - }" HAVE_SSE2_FLAGS) - - if(HAVE_SSE2_FLAGS) - set(${sse_flags} "-msse2 -mfpmath=sse" PARENT_SCOPE) - return() - endif() + __m128d a, b; + double vals[2] = {0}; + a = _mm_loadu_pd (vals); + b = _mm_add_pd (a,a); + _mm_storeu_pd (vals,b); + return (0); + }" + HAVE_SSE2_EXTENSIONS) + + if(HAVE_SSE2_EXTENSIONS) + set(${sse_flags} "${sse_flags_detected}" PARENT_SCOPE) + return() + endif() + if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG) set(CMAKE_REQUIRED_FLAGS "-msse") - check_cxx_source_runs(" + set(sse_flags_detected "-msse -mfpmath=sse") + elseif(MSVC AND NOT CMAKE_CL_64) + set(CMAKE_REQUIRED_FLAGS "/arch:SSE") + set(sse_flags_detected "/arch:SSE") + endif() + + check_cxx_source_runs(" #include <xmmintrin.h> int main() { @@ -40,37 +54,10 @@ function(check_sse_features sse_flags ) b = _mm_add_ps(a,b); _mm_storeu_ps(vals,b); return 0; - }" HAVE_SSE_FLAGS) - - if(HAVE_SSE_FLAGS) - set(${sse_flags} "-msse -mfpmath=sse" PARENT_SCOPE) - return() - endif() + }" HAVE_SSE_EXTENSIONS) - elseif(MSVC) - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - return() - endif() - check_cxx_source_runs(" - #include <emmintrin.h> - - int main() - { - __m128d a, b; - double vals[2] = {0}; - a = _mm_loadu_pd(vals); - b = _mm_add_pd(a,a); - _mm_storeu_pd(vals,b); - return 0; - }" HAVE_SSE_FLAGS) - - if(HAVE_SSE_FLAGS) - message(STATUS "Performing Test HAVE_SSE_FLAGS - Success") - set(${sse_flags} "/arch:SSE2 /fp:fast -D__SSE__ -D__SSE2__" PARENT_SCOPE) - return() - else() - message(STATUS "Performing Test HAVE_SSE_FLAGS - Failed") - return() - endif() -endif() + if(HAVE_SSE_EXTENSIONS) + set(${sse_flags} "${sse_flags_detected}" PARENT_SCOPE) + return() + endif() endfunction() #check_sse_features