- add a CMake option to enable/disable SSE2 with Visual C++. This is necessary because since VC 2012 SSE2 is the default instruction set.

This commit is contained in:
Christoph Oelckers 2013-11-29 12:35:45 +01:00
parent a8090dc22c
commit b9c032461e
2 changed files with 33 additions and 16 deletions

View file

@ -91,13 +91,27 @@ if( MSVC )
# Disable run-time type information # Disable run-time type information
set( ALL_C_FLAGS "/GF /Gy /GR-" ) set( ALL_C_FLAGS "/GF /Gy /GR-" )
if( CMAKE_SIZEOF_VOID_P MATCHES "4")
# SSE2 option (mostly to switch it off in VC2012 and later where it's the default
option (ZDOOM_USE_SSE2 "Use SSE2 instruction set")
if (ZDOOM_USE_SSE2)
set( ALL_C_FLAGS "${ALL_C_FLAGS} /arch:SSE2")
else (ZDOOM_USE_SSE2)
if (MSVC_VERSION GREATER 1699)
# On Visual C++ 2012 and later SSE2 is the default, so we need to switch it off explicitly
set( ALL_C_FLAGS "${ALL_C_FLAGS} /arch:IA32")
endif (MSVC_VERSION GREATER 1699)
endif (ZDOOM_USE_SSE2)
endif( CMAKE_SIZEOF_VOID_P MATCHES "4")
# Avoid CRT DLL dependancies in release builds, optionally generate assembly output for checking crash locations. # Avoid CRT DLL dependancies in release builds, optionally generate assembly output for checking crash locations.
option( ZDOOM_GENERATE_ASM "Generate assembly output." OFF ) option( ZDOOM_GENERATE_ASM "Generate assembly output." OFF )
if( ZDOOM_GENERATE_ASM ) if( ZDOOM_GENERATE_ASM )
set( REL_C_FLAGS "/MT /Oy /FAcs" ) set( REL_C_FLAGS "/MT /Oy /Oi /FAcs" )
else( ZDOOM_GENERATE_ASM ) else( ZDOOM_GENERATE_ASM )
set( REL_C_FLAGS "/MT /Oy" ) set( REL_C_FLAGS "/MT /Oy /Oi" )
endif( ZDOOM_GENERATE_ASM ) endif( ZDOOM_GENERATE_ASM )
# Debug allocations in debug builds # Debug allocations in debug builds
set( DEB_C_FLAGS "/D _CRTDBG_MAP_ALLOC /MTd" ) set( DEB_C_FLAGS "/D _CRTDBG_MAP_ALLOC /MTd" )

View file

@ -367,20 +367,23 @@ endif( NOT NO_ASM )
set( SSE_MATTERS NO ) set( SSE_MATTERS NO )
# SSE only matters on 32-bit targets. We check compiler flags to know if we can do it. # with global use of SSE 2 we do not need special handling for selected files
if( CMAKE_SIZEOF_VOID_P MATCHES "4" AND NOT CMAKE_OSX_ARCHITECTURES MATCHES ppc ) if (NOT ZDOOM_USE_SSE2)
CHECK_CXX_COMPILER_FLAG( "-msse2 -mfpmath=sse" CAN_DO_MFPMATH ) # SSE only matters on 32-bit targets. We check compiler flags to know if we can do it.
CHECK_CXX_COMPILER_FLAG( -arch:SSE2 CAN_DO_ARCHSSE2 ) if( CMAKE_SIZEOF_VOID_P MATCHES "4" AND NOT CMAKE_OSX_ARCHITECTURES MATCHES ppc )
if( CAN_DO_MFPMATH ) CHECK_CXX_COMPILER_FLAG( "-msse2 -mfpmath=sse" CAN_DO_MFPMATH )
set( SSE1_ENABLE "-msse -mfpmath=sse" ) CHECK_CXX_COMPILER_FLAG( -arch:SSE2 CAN_DO_ARCHSSE2 )
set( SSE2_ENABLE "-msse2 -mfpmath=sse" ) if( CAN_DO_MFPMATH )
set( SSE_MATTERS YES ) set( SSE1_ENABLE "-msse -mfpmath=sse" )
elseif( CAN_DO_ARCHSSE2 ) set( SSE2_ENABLE "-msse2 -mfpmath=sse" )
set( SSE1_ENABLE -arch:SSE ) set( SSE_MATTERS YES )
set( SSE2_ENABLE -arch:SSE2 ) elseif( CAN_DO_ARCHSSE2 )
set( SSE_MATTERS YES ) set( SSE1_ENABLE -arch:SSE )
endif( CAN_DO_MFPMATH ) set( SSE2_ENABLE -arch:SSE2 )
endif( CMAKE_SIZEOF_VOID_P MATCHES "4" AND NOT CMAKE_OSX_ARCHITECTURES MATCHES ppc ) set( SSE_MATTERS YES )
endif( CAN_DO_MFPMATH )
endif( CMAKE_SIZEOF_VOID_P MATCHES "4" AND NOT CMAKE_OSX_ARCHITECTURES MATCHES ppc )
endif (NOT ZDOOM_USE_SSE2)
if( SSE_MATTERS ) if( SSE_MATTERS )
if( WIN32 ) if( WIN32 )