Fix SSE check and cleanup

This commit is contained in:
James Sherratt 2022-08-24 18:16:01 +01:00
parent 0a0ca7507d
commit 1c8a6f3d8b
1 changed files with 98 additions and 89 deletions

View File

@ -21,89 +21,26 @@ macro(special_check_for_sse _max_sse_level_desired)
include(CheckCSourceRuns)
# Add vs_build to stop flags added to msbuild.
IF(NOT MINGW AND NOT VS_BUILD)
if( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX )
set(SSE_FLAGS)
set(CMAKE_REQUIRED_FLAGS "-msse3")
check_cxx_source_runs("
#include <pmmintrin.h>
int main()
{
__m128d a, b;
double vals[2] = {0};
a = _mm_loadu_pd(vals);
b = _mm_hadd_pd(a,a);
_mm_storeu_pd(vals, b);
return 0;
}"
HAS_SSE3_EXTENSIONS)
set(CMAKE_REQUIRED_FLAGS "-msse2")
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;
}"
HAS_SSE2_EXTENSIONS)
set(CMAKE_REQUIRED_FLAGS "-msse")
check_cxx_source_runs("
#include <xmmintrin.h>
int main()
{
__m128 a, b;
float vals[4] = {0};
a = _mm_loadu_ps(vals);
b = a;
b = _mm_add_ps(a,b);
_mm_storeu_ps(vals,b);
return 0;
}"
HAS_SSE_EXTENSIONS)
ELSE()
set(HAS_SSE_EXTENSIONS ON)
ENDIF()
IF(NOT MINGW)
set(SSE_FLAGS)
set(CMAKE_REQUIRED_FLAGS)
set(CMAKE_REQUIRED_FLAGS "-msse3")
check_cxx_source_runs("
#include <pmmintrin.h>
if(HAS_SSE3_EXTENSIONS AND (${_max_sse_level_desired} MATCHES "3"))
set(SSE_FLAGS "-msse3")
IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?Clang")
ELSE()
set(SSE_FLAGS "${SSE_FLAGS} -mfpmath=sse")
ENDIF()
message(STATUS "Found SSE3 extensions, using flags: ${SSE_FLAGS}")
elseif(HAS_SSE2_EXTENSIONS AND (${_max_sse_level_desired} MATCHES "2" OR ${_max_sse_level_desired} MATCHES "3"))
set(SSE_FLAGS "-msse2")
IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?Clang")
ELSE()
set(SSE_FLAGS "${SSE_FLAGS} -mfpmath=sse")
ENDIF()
message(STATUS "Found SSE2 extensions, using flags: ${SSE_FLAGS}")
elseif(HAS_SSE_EXTENSIONS AND (${_max_sse_level_desired} MATCHES "1" OR ${_max_sse_level_desired} MATCHES "2" OR ${_max_sse_level_desired} MATCHES "3"))
set(SSE_FLAGS "-msse")
IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?Clang")
ELSE()
set(SSE_FLAGS "${SSE_FLAGS} -mfpmath=sse")
ENDIF()
message(STATUS "Found SSE extensions, using flags: ${SSE_FLAGS}")
endif()
add_definitions(${SSE_FLAGS})
elseif(MSVC)
check_cxx_source_runs("
int main()
{
__m128d a, b;
double vals[2] = {0};
a = _mm_loadu_pd(vals);
b = _mm_hadd_pd(a,a);
_mm_storeu_pd(vals, b);
return 0;
}"
HAS_SSE3_EXTENSIONS)
set(CMAKE_REQUIRED_FLAGS "-msse2")
check_cxx_source_runs("
#include <emmintrin.h>
int main()
@ -114,14 +51,86 @@ macro(special_check_for_sse _max_sse_level_desired)
b = _mm_add_pd(a,a);
_mm_storeu_pd(vals,b);
return 0;
}"
HAS_SSE2_EXTENSIONS)
if( HAS_SSE2_EXTENSIONS AND (NOT ${_max_sse_level_desired} OR ${_max_sse_level_desired} MATCHES "2"))
message(STATUS "Found SSE2 extensions")
set(SSE_FLAGS "/arch:SSE2 /fp:fast -D__SSE__ -D__SSE2__" )
endif()
add_definitions(${SSE_FLAGS})
}"
HAS_SSE2_EXTENSIONS)
set(CMAKE_REQUIRED_FLAGS "-msse")
check_cxx_source_runs("
#include <xmmintrin.h>
int main()
{
__m128 a, b;
float vals[4] = {0};
a = _mm_loadu_ps(vals);
b = a;
b = _mm_add_ps(a,b);
_mm_storeu_ps(vals,b);
return 0;
}"
HAS_SSE_EXTENSIONS)
set(CMAKE_REQUIRED_FLAGS)
if(HAS_SSE3_EXTENSIONS AND (${_max_sse_level_desired} MATCHES "3"))
set(SSE_FLAGS "-msse3")
IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?Clang")
ELSE()
set(SSE_FLAGS "${SSE_FLAGS} -mfpmath=sse")
ENDIF()
IF(NOT MSVC)
message(STATUS "Found SSE3 extensions, using flags: ${SSE_FLAGS}")
ELSE()
message(STATUS "Found SSE3 extensions.")
ENDIF()
elseif(HAS_SSE2_EXTENSIONS AND (${_max_sse_level_desired} MATCHES "2" OR ${_max_sse_level_desired} MATCHES "3"))
set(SSE_FLAGS "-msse2")
IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?Clang")
ELSE()
set(SSE_FLAGS "${SSE_FLAGS} -mfpmath=sse")
ENDIF()
IF(NOT MSVC)
message(STATUS "Found SSE2 extensions, using flags: ${SSE_FLAGS}")
ELSE()
message(STATUS "Found SSE2 extensions.")
ENDIF()
elseif(HAS_SSE_EXTENSIONS AND (${_max_sse_level_desired} MATCHES "1" OR ${_max_sse_level_desired} MATCHES "2" OR ${_max_sse_level_desired} MATCHES "3"))
set(SSE_FLAGS "-msse")
IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?Clang")
ELSE()
set(SSE_FLAGS "${SSE_FLAGS} -mfpmath=sse")
ENDIF()
IF(NOT MSVC)
message(STATUS "Found SSE extensions, using flags: ${SSE_FLAGS}")
ELSE()
message(STATUS "Found SSE extensions.")
ENDIF()
endif()
IF(NOT MSVC)
add_definitions(${SSE_FLAGS})
ENDIF()
elseif(MSVC) #todo: remove this unused check for SSE.
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;
}"
HAS_SSE2_EXTENSIONS)
if( HAS_SSE2_EXTENSIONS AND (NOT ${_max_sse_level_desired} OR ${_max_sse_level_desired} MATCHES "2"))
message(STATUS "Found SSE2 extensions")
set(SSE_FLAGS "/arch:SSE2 /fp:fast -D__SSE__ -D__SSE2__" )
endif()
add_definitions(${SSE_FLAGS})
endif()
endmacro(special_check_for_sse)