From d1f423d9dbcda88f2db016b07b4a897f8352dc04 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 25 Nov 2022 01:27:44 +0100 Subject: [PATCH] cmake: make all assembly options depend on SDL_ASSEMBLY and architecture --- CMakeLists.txt | 71 ++++++++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b281ef8fc..f22da7140 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -135,8 +135,11 @@ set(SDL_GENERATED_HEADERS) #message(STATUS "${LT_VERSION} :: ${LT_AGE} :: ${LT_REVISION} :: ${LT_CURRENT} :: ${LT_RELEASE}") -# General settings & flags -set(LIBRARY_OUTPUT_DIRECTORY "build") +check_cpu_architecture(x86 SDL_CPU_X86) +check_cpu_architecture(x64 SDL_CPU_X64) +check_cpu_architecture(arm32 SDL_CPU_ARM32) +check_cpu_architecture(arm64 SDL_CPU_ARM64) + # Check for 64 or 32 bit set(SIZEOF_VOIDP ${CMAKE_SIZEOF_VOID_P}) if(CMAKE_SIZEOF_VOID_P EQUAL 8) @@ -284,11 +287,6 @@ if(USE_GCC OR USE_CLANG) endif() # Default option knobs -if(APPLE OR ARCH_64 OR MSVC_CLANG) - if(NOT "${CMAKE_OSX_ARCHITECTURES}" MATCHES "arm") - set(OPT_DEF_SSEMATH ON) - endif() -endif() if(UNIX OR MINGW OR MSYS OR (USE_CLANG AND NOT WINDOWS) OR VITA OR PSP OR PS2 OR N3DS) set(OPT_DEF_LIBC ON) endif() @@ -376,7 +374,6 @@ endif() # All these ENABLED_BY_DEFAULT vars will default to ON if not specified, so # you only need to have a platform override them if they are disabling. -set(OPT_DEF_ASM TRUE) if(EMSCRIPTEN) # Set up default values for the currently supported set of subsystems: # Emscripten/Javascript does not have assembly support, a dynamic library @@ -440,18 +437,19 @@ set_option(SDL3_DISABLE_UNINSTALL "Disable uninstallation of SDL3" OFF) option_string(SDL_ASSERTIONS "Enable internal sanity checks (auto/disabled/release/enabled/paranoid)" "auto") #set_option(SDL_DEPENDENCY_TRACKING "Use gcc -MMD -MT dependency tracking" ON) +set_option(SDL_ASSEMBLY "Enable assembly routines" ${OPT_DEF_ASM}) +dep_option(SDL_SSEMATH "Allow GCC to use SSE floating point math" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) +dep_option(SDL_SSE "Use SSE assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) +dep_option(SDL_SSE2 "Use SSE2 assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) +dep_option(SDL_SSE3 "Use SSE3 assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) +dep_option(SDL_MMX "Use MMX assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) +dep_option(SDL_3DNOW "Use 3Dnow! MMX assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) +dep_option(SDL_ALTIVEC "Use Altivec assembly routines" ON "SDL_ASSEMBLY" OFF) +dep_option(SDL_ARMSIMD "Use SIMD assembly blitters on ARM" OFF "SDL_ASSEMBLY;SDL_CPU_ARM32" OFF) +dep_option(SDL_ARMNEON "Use NEON assembly blitters on ARM" OFF "SDL_ASSEMBLY;SDL_CPU_ARM32" OFF) + set_option(SDL_LIBC "Use the system C library" ${OPT_DEF_LIBC}) set_option(SDL_GCC_ATOMICS "Use gcc builtin atomics" ${OPT_DEF_GCC_ATOMICS}) -set_option(SDL_ASSEMBLY "Enable assembly routines" ${OPT_DEF_ASM}) -set_option(SDL_SSEMATH "Allow GCC to use SSE floating point math" ${OPT_DEF_SSEMATH}) -set_option(SDL_MMX "Use MMX assembly routines" ${OPT_DEF_ASM}) -set_option(SDL_3DNOW "Use 3Dnow! MMX assembly routines" ${OPT_DEF_ASM}) -set_option(SDL_SSE "Use SSE assembly routines" ${OPT_DEF_ASM}) -set_option(SDL_SSE2 "Use SSE2 assembly routines" ${OPT_DEF_SSEMATH}) -set_option(SDL_SSE3 "Use SSE3 assembly routines" ${OPT_DEF_SSEMATH}) -set_option(SDL_ALTIVEC "Use Altivec assembly routines" ${OPT_DEF_ASM}) -set_option(SDL_ARMSIMD "use SIMD assembly blitters on ARM" OFF) -set_option(SDL_ARMNEON "use NEON assembly blitters on ARM" OFF) dep_option(SDL_DBUS "Enable D-Bus support" ON ${UNIX_SYS} OFF) set_option(SDL_DISKAUDIO "Support the disk writer audio driver" ON) set_option(SDL_DUMMYAUDIO "Support the dummy audio driver" ON) @@ -834,8 +832,9 @@ if(SDL_ASSEMBLY) #ifndef __SSE2__ #error Assembler CPP flag not enabled #endif - int main(int argc, char **argv) { return 0; }" HAVE_SSE2) - if(HAVE_SSE2) + int main(int argc, char **argv) { return 0; }" CPU_SUPPORTS_SSE2) + if(CPU_SUPPORTS_SSE2) + set(HAVE_SSE2 TRUE) list(APPEND EXTRA_CFLAGS "-msse2") endif() set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS}) @@ -857,8 +856,9 @@ if(SDL_ASSEMBLY) #ifndef __SSE3__ #error Assembler CPP flag not enabled #endif - int main(int argc, char **argv) { return 0; }" HAVE_SSE3) - if(HAVE_SSE3) + int main(int argc, char **argv) { return 0; }" CPU_SUPPORTS_SSE3) + if(CPU_SUPPORTS_SSE3) + set(HAVE_SSE3 TRUE) list(APPEND EXTRA_CFLAGS "-msse3") endif() set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS}) @@ -891,9 +891,9 @@ if(SDL_ASSEMBLY) vector unsigned int vzero() { return vec_splat_u32(0); } - int main(int argc, char **argv) { return 0; }" HAVE_ALTIVEC) + int main(int argc, char **argv) { return 0; }" CPU_SUPPORTS_ALTIVEC) set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS}) - if(HAVE_ALTIVEC OR HAVE_ALTIVEC_H_HDR) + if(CPU_SUPPORTS_ALTIVEC OR HAVE_ALTIVEC_H_HDR) set(HAVE_ALTIVEC TRUE) # if only HAVE_ALTIVEC_H_HDR is set list(APPEND EXTRA_CFLAGS "-maltivec") set(SDL_ALTIVEC_BLITTERS 1) @@ -961,12 +961,22 @@ if(SDL_ASSEMBLY) # TODO: SDL_cpuinfo.h needs to support the user's configuration wish # for MSVC - right now it is always activated if(NOT ARCH_64) - set(HAVE_MMX TRUE) - set(HAVE_3DNOW TRUE) + if(SDL_MMX) + set(HAVE_MMX TRUE) + endif() + if(SDL_3DNOW) + set(HAVE_3DNOW TRUE) + endif() + endif() + if(SDL_SSE) + set(HAVE_SSE TRUE) + endif() + if(SDL_SSE2) + set(HAVE_SSE2 TRUE) + endif() + if(SDL_SSE3) + set(HAVE_SSE3 TRUE) endif() - set(HAVE_SSE TRUE) - set(HAVE_SSE2 TRUE) - set(HAVE_SSE3 TRUE) check_include_file("immintrin.h" HAVE_IMMINTRIN_H) endif() endif() @@ -3204,8 +3214,7 @@ if(SDL_SHARED) add_library(SDL3::SDL3 ALIAS SDL3) set_target_properties(SDL3 PROPERTIES POSITION_INDEPENDENT_CODE TRUE) if(NOT SDL_LIBC) - check_cpu_architecture(x86 HAS_X86) - if(HAS_X86) + if(SDL_CPU_X86) # FIXME: should be added for all architectures (missing symbols for ARM) target_link_libraries(SDL3 PRIVATE "-nodefaultlib:MSVCRT") endif()