From 203db3d09519d5ed0ee36dd9669f418c1f0ee82d Mon Sep 17 00:00:00 2001 From: Erik Hofman Date: Fri, 16 Dec 2016 10:49:44 +0100 Subject: [PATCH] Enable SSE and SSE2 by default --- CMakeLists.txt | 14 +++++++++++++ CMakeModules/DetectArch.cmake | 37 +++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 CMakeModules/DetectArch.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index c476a5de..cd0f695a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,6 +114,9 @@ option(ENABLE_SOUND "Set to OFF to disable building SimGear's sound support" option(USE_AEONWAVE "Set to ON to use AeonWave instead of OpenAL" OFF) option(ENABLE_PKGUTIL "Set to ON to build the sg_pkgutil application (default)" ON) option(ENABLE_DNS "Set to ON to use udns library and DNS service resolver" ON) +option(ENABLE_SIMD "Enable SSE/SSE2 support for x86 compilers" ON) + +include (DetectArch) # until the fstream fix is applied and generally available in OSG, # keep the compatability link option as the default @@ -332,6 +335,12 @@ if(CMAKE_COMPILER_IS_GNUCXX) message(WARNING "GCC 4.4 will be required soon, please upgrade") endif() + if(ENABLE_SIMD) + if (X86 OR X86_64) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse3 -mfpmath=sse") + endif() + endif() + # certain GCC versions don't provide the atomic builds, and hence # require is to provide them in SGAtomic.cxx set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH}) @@ -369,6 +378,11 @@ if(WIN32) if(MSVC) set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /MP") + if(ENABLE_SIMD) + if (X86 OR X86_64) + set(MSVC_FLAGS "${MSVC_FLAGS} /arch:SSE /arch:SSE2 /Ox") + endif() + endif() if (NOT OSG_FSTREAM_EXPORT_FIXED) message(STATUS "For better linking performance, use OSG with patched fstream header") diff --git a/CMakeModules/DetectArch.cmake b/CMakeModules/DetectArch.cmake new file mode 100644 index 00000000..33849d1a --- /dev/null +++ b/CMakeModules/DetectArch.cmake @@ -0,0 +1,37 @@ +IF(CMAKE_SYSTEM_PROCESSOR MATCHES amd64.*|x86_64.* OR CMAKE_GENERATOR MATCHES "Visual Studio.*Win64") + IF(CMAKE_C_FLAGS MATCHES -m32 OR CMAKE_CXX_FLAGS MATCHES -m32) + SET(X86 1) + ELSE(CMAKE_C_FLAGS MATCHES -m32 OR CMAKE_CXX_FLAGS MATCHES -m32) + SET(X86_64 1) + ENDIF(CMAKE_C_FLAGS MATCHES -m32 OR CMAKE_CXX_FLAGS MATCHES -m32) +ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES i686.*|i386.*|x86.* OR WIN32) + IF(CMAKE_C_FLAGS MATCHES -m64 OR CMAKE_CXX_FLAGS MATCHES -m64) + SET(X86_64 1) + ELSE(CMAKE_C_FLAGS MATCHES -m64 OR CMAKE_CXX_FLAGS MATCHES -m64) + SET(X86 1) + ENDIF(CMAKE_C_FLAGS MATCHES -m64 OR CMAKE_CXX_FLAGS MATCHES -m64) +ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES arm.* AND CMAKE_SYSTEM_NAME STREQUAL "Linux") + SET(ARM 1) +ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES mips) + SET(MIPS 1) +ENDIF() + +IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") + # using Clang + SET(CLANG 1) +ELSEIF ("${CMAKE_C_COMPILER_ID}" STREQUAL "TinyCC") + # using TinyCC + SET(TINYCC 1) +ELSEIF ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") + # using GCC + SET(GCC 1) +ELSEIF ("${CMAKE_C_COMPILER_ID}" STREQUAL "Intel") + # using Intel C++ + SET(INTELCC 1) +ELSEIF ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") + # using Visual Studio C++ + SET(MSVC 1) +ELSEIF ("${CMAKE_C_COMPILER_ID}" STREQUAL "MIPSpro") + # using SGI MIPSpro + SET(MIPSPRO 1) +ENDIF()