From: Konstantinos Margaritis Date: Fri, 17 Apr 2026 16:45:23 +0000 (+0300) Subject: SIMDe is considered a valid platform (#390) X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=ecab70848ad41c8b5a0302bfaeb387203118045e;p=thirdparty%2Fvectorscan.git SIMDe is considered a valid platform (#390) * SIMDe is considered a valid platform * Refactor CMakeLists.txt, simplify fat building * SIMDe can be the fallback option in the fat library * remove redundant checks in hs.cpp * Rework valid platform checks around SIMEe in fat library * remove SIMDE checks in check_sse42, remove check_ssse3 * fix fat builds for aarch64 * reinstate cppcheck-suppress * Fix SIMDE builds on non-x86 * fix x86 SIMDE fat builds once again * another fix for x86 fat builds * rename SIMDE_BACKEND to BUILD_SIMDE_BACKEND * fail on CPU_NATIVE is enabled with clang, it doesn't support it and it has caused more trouble than it's worth * rename SIMDE_NATIVE to BUILD_SIMDE_NATIVE as well --- diff --git a/CMakeLists.txt b/CMakeLists.txt index ea0ae710..6d716ad3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -115,7 +115,6 @@ if(DEBUG_OUTPUT) set(RELEASE_BUILD FALSE) endif(DEBUG_OUTPUT) - #for config if (RELEASE_BUILD) set(HS_OPTIMIZE ON) @@ -123,17 +122,17 @@ if (RELEASE_BUILD) endif() # Architecture detection - include (${CMAKE_MODULE_PATH}/platform.cmake) # Detect OS and if Fat Runtime is available include (${CMAKE_MODULE_PATH}/osdetection.cmake) -if(ARCH_X86_64 AND BUILD_SSE2_SIMDE AND NOT FAT_RUNTIME) - set(SIMDE_BACKEND True) +if(ARCH_X86_64 AND FAT_RUNTIME AND NOT NO_SIMDE_IN_FAT) + include (${CMAKE_MODULE_PATH}/simde.cmake) + set(BUILD_SIMDE_NATIVE True) endif() -if(SIMDE_BACKEND) +if(BUILD_SIMDE_BACKEND) include (${CMAKE_MODULE_PATH}/simde.cmake) elseif (ARCH_IA32 OR ARCH_X86_64) include (${CMAKE_MODULE_PATH}/cflags-x86.cmake) @@ -276,7 +275,7 @@ set (hs_exec_common_SRCS src/util/arch/common/cpuid_flags.h src/util/multibit.c ) -if (SIMDE_BACKEND) +if (BUILD_SIMDE_BACKEND) set (hs_exec_common_SRCS ${hs_exec_common_SRCS} src/util/arch/simde/cpuid_flags.c) @@ -438,7 +437,7 @@ set (hs_exec_SRCS src/database.h ) -if (SIMDE_BACKEND) +if (BUILD_SIMDE_BACKEND) set (hs_exec_SRCS ${hs_exec_SRCS} src/nfa/vermicelli_simd.cpp @@ -920,6 +919,9 @@ set (LIB_VERSION ${HS_VERSION}) set (LIB_SOVERSION ${HS_MAJOR_VERSION}) if (NOT FAT_RUNTIME) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SIMDE_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SIMDE_FLAGS}") + set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_common_SRCS}) if (ARCH_IA32 OR ARCH_X86_64) @@ -957,92 +959,47 @@ if (NOT FAT_RUNTIME) set_target_properties(hs_compile_shared PROPERTIES POSITION_INDEPENDENT_CODE TRUE) endif() else () + include(cmake/build_wrapper.cmake) + if (ARCH_IA32 OR ARCH_X86_64) - set(BUILD_WRAPPER "${PROJECT_SOURCE_DIR}/cmake/build_wrapper.sh") if (NOT BUILD_AVX512) set (DISPATCHER_DEFINE "-DDISABLE_AVX512_DISPATCH") endif (NOT BUILD_AVX512) if (NOT BUILD_AVX512VBMI) set (DISPATCHER_DEFINE "${DISPATCHER_DEFINE} -DDISABLE_AVX512VBMI_DISPATCH") endif (NOT BUILD_AVX512VBMI) - if(BUILD_SSE2_SIMDE) - set (DISPATCHER_DEFINE "${DISPATCHER_DEFINE} -DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2") - endif(BUILD_SSE2_SIMDE) + # Make the dispatcher use the lowest arch denominator + set (DISPATCHER_DEFINE "${DISPATCHER_DEFINE} -march=x86-64 -msse2 ${SIMDE_FLAGS}") set_source_files_properties(src/dispatcher.c PROPERTIES COMPILE_FLAGS "-Wno-unused-parameter -Wno-unused-function ${DISPATCHER_DEFINE}") - if(BUILD_SSE2_SIMDE AND NOT BUILD_AVX2 AND NOT BUILD_AVX512 AND NOT BUILD_AVX512VBMI) - set_source_files_properties(src/crc32.c PROPERTIES - COMPILE_FLAGS "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2") - set_source_files_properties(src/hs.cpp PROPERTIES - COMPILE_FLAGS "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2") - - string(REGEX REPLACE "-msse4.2" "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") - string(REGEX REPLACE "-msse4.2" "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - endif() if (BUILD_STATIC_LIBS) - if (BUILD_SSE2_SIMDE) - add_library(hs_exec_core2 OBJECT ${hs_exec_SRCS}) - list(APPEND RUNTIME_LIBS $) - message("Building SIMDE SSE2 version..") - include_directories(${PROJECT_SOURCE_DIR}/simde) - if (CMAKE_COMPILER_IS_CLANG) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSIMDE_NO_CHECK_IMMEDIATE_CONSTANT") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSIMDE_NO_CHECK_IMMEDIATE_CONSTANT") - endif() - - set_target_properties(hs_exec_core2 PROPERTIES - string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") - string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - COMPILE_FLAGS "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2" - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} core2 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - else() - add_library(hs_exec_core2 OBJECT ${hs_exec_SRCS}) - list(APPEND RUNTIME_LIBS $) - set_target_properties(hs_exec_core2 PROPERTIES - COMPILE_FLAGS "-march=core2 -msse4.2" - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} core2 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - endif(BUILD_SSE2_SIMDE) - - add_library(hs_exec_corei7 OBJECT ${hs_exec_SRCS}) + if (NOT NO_SIMDE_IN_FAT) + message(STATUS "Building SIMDE backend in static fat runtime..") + include_directories(${PROJECT_SOURCE_DIR}/simde) + add_fat_component("simde" "hs_exec_simde" "${SIMDE_FLAGS} -march=x86-64 -msse2" "${hs_exec_SRCS}" FALSE) + list(APPEND RUNTIME_LIBS $) + endif() + + add_fat_component("corei7" "hs_exec_corei7" "-march=corei7 -msse4.2" "${hs_exec_SRCS}" FALSE) list(APPEND RUNTIME_LIBS $) - set_target_properties(hs_exec_corei7 PROPERTIES - COMPILE_FLAGS "-march=corei7 -msse4.2" - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} corei7 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) if (BUILD_AVX2) - add_library(hs_exec_avx2 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) + set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) + add_fat_component("avx2" "hs_exec_avx2" "-march=core-avx2" "${hs_exec_SRCS}" FALSE) list(APPEND RUNTIME_LIBS $) - set_target_properties(hs_exec_avx2 PROPERTIES - COMPILE_FLAGS "-march=core-avx2 -mavx2" - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx2 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) endif (BUILD_AVX2) if (BUILD_AVX512) - add_library(hs_exec_avx512 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) + add_fat_component("avx512" "hs_exec_avx512" "${SKYLAKE_FLAG}" "${hs_exec_SRCS}" FALSE) list(APPEND RUNTIME_LIBS $) - set_target_properties(hs_exec_avx512 PROPERTIES - COMPILE_FLAGS "${SKYLAKE_FLAG}" - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx512 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) endif (BUILD_AVX512) if (BUILD_AVX512VBMI) - add_library(hs_exec_avx512vbmi OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) + add_fat_component("avx512vbmi" "hs_exec_avx512vbmi" "${SKYLAKE_FLAG}" "${hs_exec_SRCS}" FALSE) list(APPEND RUNTIME_LIBS $) - set_target_properties(hs_exec_avx512vbmi PROPERTIES - COMPILE_FLAGS "${ICELAKE_FLAG}" - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx512vbmi ${CMAKE_MODULE_PATH}/keep.syms.in" - ) endif (BUILD_AVX512VBMI) - add_library(hs_exec_common OBJECT - ${hs_exec_common_SRCS} - src/dispatcher.c - ) + add_library(hs_exec_common OBJECT ${hs_exec_common_SRCS} src/dispatcher.c) # hs_version.c is added explicitly to avoid some build systems that refuse to # create a lib without any src (I'm looking at you Xcode) @@ -1058,19 +1015,8 @@ else () $ $ ${RUNTIME_LIBS}) - - if (BUILD_SSE2_SIMDE) - set_target_properties(hs_compile PROPERTIES - string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") - string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - COMPILE_FLAGS "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2" - ) - set_target_properties(hs PROPERTIES - string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") - string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - COMPILE_FLAGS "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2" - ) - endif (BUILD_SSE2_SIMDE) + set_source_files_properties(src/hs_valid_platform.c PROPERTIES + COMPILE_FLAGS "${SIMDE_FLAGS}") endif (BUILD_STATIC_LIBS) @@ -1079,110 +1025,55 @@ else () add_library(hs_compile_shared OBJECT ${hs_compile_SRCS}) set_target_properties(hs_compile_shared PROPERTIES POSITION_INDEPENDENT_CODE TRUE) - if (BUILD_SSE2_SIMDE) - message("Building SIMDE SSE2 version..") - add_library(hs_exec_shared_core2 OBJECT ${hs_exec_SRCS}) - list(APPEND RUNTIME_SHLIBS $) - - include_directories(${PROJECT_SOURCE_DIR}/simde) - if (CMAKE_COMPILER_IS_CLANG) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSIMDE_NO_CHECK_IMMEDIATE_CONSTANT") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSIMDE_NO_CHECK_IMMEDIATE_CONSTANT") - endif() - set_target_properties(hs_exec_shared_core2 PROPERTIES - string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") - string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - COMPILE_FLAGS "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2" - POSITION_INDEPENDENT_CODE TRUE - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} core2 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - set_target_properties(hs_compile_shared PROPERTIES - string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") - string(REGEX REPLACE "-msse4.2" "-msse2" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - COMPILE_FLAGS "-DVS_SIMDE_BACKEND -DVS_SIMDE_NATIVE -march=core2 -msse2" - ) - else() - add_library(hs_exec_shared_core2 OBJECT ${hs_exec_SRCS}) - list(APPEND RUNTIME_SHLIBS $) - set_target_properties(hs_exec_shared_core2 PROPERTIES - COMPILE_FLAGS "-march=core2 -msse4.2" - POSITION_INDEPENDENT_CODE TRUE - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} core2 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - endif (BUILD_SSE2_SIMDE) - - add_library(hs_exec_shared_corei7 OBJECT ${hs_exec_SRCS}) - list(APPEND RUNTIME_SHLIBS $) - set_target_properties(hs_exec_shared_corei7 PROPERTIES - COMPILE_FLAGS "-march=corei7 -msse4.2" - POSITION_INDEPENDENT_CODE TRUE - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} corei7 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) + if (NOT NO_SIMDE_IN_FAT) + message(STATUS "Building SIMDE backend in shared fat runtime..") + include_directories(${PROJECT_SOURCE_DIR}/simde) + add_fat_component("simde" "hs_exec_shared_simde" "${SIMDE_FLAGS} -march=x86-64 -msse2" "${hs_exec_SRCS}" TRUE) + list(APPEND RUNTIME_SHLIBS $) + endif() + + add_fat_component("corei7" "hs_exec_shared_corei7" "-march=corei7 -msse4.2" "${hs_exec_SRCS}" TRUE) + list(APPEND RUNTIME_SHLIBS $) if (BUILD_AVX2) - add_library(hs_exec_shared_avx2 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) - list(APPEND RUNTIME_SHLIBS $) - set_target_properties(hs_exec_shared_avx2 PROPERTIES - COMPILE_FLAGS "-march=core-avx2 -mavx2" - POSITION_INDEPENDENT_CODE TRUE - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx2 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) + set(hs_exec_SRCS ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) + add_fat_component("avx2" "hs_exec_shared_avx2" "-march=core-avx2" "${hs_exec_SRCS}" TRUE) + list(APPEND RUNTIME_SHLIBS $) endif (BUILD_AVX2) if (BUILD_AVX512) - add_library(hs_exec_shared_avx512 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) - list(APPEND RUNTIME_SHLIBS $) - set_target_properties(hs_exec_shared_avx512 PROPERTIES - COMPILE_FLAGS "${SKYLAKE_FLAG}" - POSITION_INDEPENDENT_CODE TRUE - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx512 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) + add_fat_component("avx512" "hs_exec_shared_avx512" "${SKYLAKE_FLAG}" "${hs_exec_SRCS}" TRUE) + list(APPEND RUNTIME_SHLIBS $) endif (BUILD_AVX512) if (BUILD_AVX512VBMI) - add_library(hs_exec_shared_avx512vbmi OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS}) - list(APPEND RUNTIME_SHLIBS $) - set_target_properties(hs_exec_shared_avx512vbmi PROPERTIES - COMPILE_FLAGS "${ICELAKE_FLAG}" - POSITION_INDEPENDENT_CODE TRUE - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} avx512vbmi ${CMAKE_MODULE_PATH}/keep.syms.in" - ) + add_fat_component("avx512vbmi" "hs_exec_shared_avx512vbmi" "${SKYLAKE_FLAG}" "${hs_exec_SRCS}" TRUE) + list(APPEND RUNTIME_SHLIBS $) endif (BUILD_AVX512VBMI) - add_library(hs_exec_common_shared OBJECT - ${hs_exec_common_SRCS} - src/dispatcher.c - ) + + add_library(hs_exec_common_shared OBJECT ${hs_exec_common_SRCS} src/dispatcher.c) set_target_properties(hs_exec_common_shared PROPERTIES OUTPUT_NAME hs_exec_common POSITION_INDEPENDENT_CODE TRUE) - + set_source_files_properties(src/hs_valid_platform.c PROPERTIES + COMPILE_FLAGS "${SIMDE_FLAGS}") endif() # SHARED endif (ARCH_IA32 OR ARCH_X86_64) if (ARCH_AARCH64) - set(BUILD_WRAPPER "${PROJECT_SOURCE_DIR}/cmake/build_wrapper.sh") + set(hs_exec_neon_SRCS ${hs_exec_SRCS} ${hs_exec_neon_SRCS}) + set(hs_exec_sve_SRCS ${hs_exec_SRCS} ${hs_exec_sve_SRCS}) + set(hs_exec_sve2_SRCS ${hs_exec_SRCS} ${hs_exec_sve2_SRCS}) + if (BUILD_STATIC_LIBS) - add_library(hs_exec_neon OBJECT ${hs_exec_SRCS} ${hs_exec_neon_SRCS}) + + add_fat_component("neon" "hs_exec_neon" "-march=${ARMV8_ARCH}" "${hs_exec_neon_SRCS}" FALSE) list(APPEND RUNTIME_LIBS $) - set_target_properties(hs_exec_neon PROPERTIES - COMPILE_FLAGS "-march=${ARMV8_ARCH}" - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} neon ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - add_library(hs_exec_sve OBJECT ${hs_exec_SRCS} ${hs_exec_sve_SRCS}) + add_fat_component("sve" "hs_exec_sve" "-march=${SVE_ARCH}" "${hs_exec_sve_SRCS}" FALSE) list(APPEND RUNTIME_LIBS $) - set_target_properties(hs_exec_sve PROPERTIES - COMPILE_FLAGS "-march=${SVE_ARCH}" - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - add_library(hs_exec_sve2 OBJECT ${hs_exec_SRCS} ${hs_exec_sve2_SRCS}) + + add_fat_component("sve2" "hs_exec_sve2" "-march=${SVE2_BITPERM_ARCH}" "${hs_exec_sve2_SRCS}" FALSE) list(APPEND RUNTIME_LIBS $) - set_target_properties(hs_exec_sve2 PROPERTIES - COMPILE_FLAGS "-march=${SVE2_BITPERM_ARCH}" - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve2 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - add_library(hs_exec_common OBJECT - ${hs_exec_common_SRCS} - src/dispatcher.c - ) + add_library(hs_exec_common OBJECT ${hs_exec_common_SRCS} src/dispatcher.c) # hs_version.c is added explicitly to avoid some build systems that refuse to # create a lib without any src (I'm looking at you Xcode) @@ -1204,32 +1095,17 @@ else () # build shared libs add_library(hs_compile_shared OBJECT ${hs_compile_SRCS}) set_target_properties(hs_compile_shared PROPERTIES POSITION_INDEPENDENT_CODE TRUE) - add_library(hs_exec_shared_neon OBJECT ${hs_exec_SRCS} ${hs_exec_neon_SRCS}) - list(APPEND RUNTIME_SHLIBS $) - set_target_properties(hs_exec_shared_neon PROPERTIES - COMPILE_FLAGS "-march=${ARMV8_ARCH}" - POSITION_INDEPENDENT_CODE TRUE - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} neon ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - - add_library(hs_exec_shared_sve OBJECT ${hs_exec_SRCS} ${hs_exec_sve_SRCS}) - list(APPEND RUNTIME_SHLIBS $) - set_target_properties(hs_exec_shared_sve PROPERTIES - COMPILE_FLAGS "-march=${SVE_ARCH}" - POSITION_INDEPENDENT_CODE TRUE - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - add_library(hs_exec_shared_sve2 OBJECT ${hs_exec_SRCS} ${hs_exec_sve2_SRCS}) - list(APPEND RUNTIME_SHLIBS $) - set_target_properties(hs_exec_shared_sve2 PROPERTIES - COMPILE_FLAGS "-march=${SVE2_BITPERM_ARCH}" - POSITION_INDEPENDENT_CODE TRUE - RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve2 ${CMAKE_MODULE_PATH}/keep.syms.in" - ) - add_library(hs_exec_common_shared OBJECT - ${hs_exec_common_SRCS} - src/dispatcher.c - ) + + add_fat_component("neon" "hs_exec_shared_neon" "-march=${ARMV8_ARCH}" "${hs_exec_neon_SRCS}" TRUE) + list(APPEND RUNTIME_SHLIBS $) + + add_fat_component("sve" "hs_exec_shared_sve" "-march=${SVE_ARCH}" "${hs_exec_sve_SRCS}" TRUE) + list(APPEND RUNTIME_SHLIBS $) + + add_fat_component("sve2" "hs_exec_shared_sve2" "-march=${SVE2_BITPERM_ARCH}" "${hs_exec_sve2_SRCS}" TRUE) + list(APPEND RUNTIME_SHLIBS $) + + add_library(hs_exec_common_shared OBJECT ${hs_exec_common_SRCS} src/dispatcher.c) set_target_properties(hs_exec_common_shared PROPERTIES OUTPUT_NAME hs_exec_common POSITION_INDEPENDENT_CODE TRUE) diff --git a/README.md b/README.md index 34038d09..29a2065f 100644 --- a/README.md +++ b/README.md @@ -233,8 +233,8 @@ Common options for Cmake are: ## SIMDe options -* `SIMDE_BACKEND=[On|Off]` Enable SIMDe backend. If this is chosen all native (SSE/AVX/AVX512/Neon/SVE/VSX) backends will be disabled and a SIMDe SSE4.2 emulation backend will be enabled. This will enable Vectorscan to build and run on architectures without SIMD. -* `SIMDE_NATIVE=[On|Off]` Enable SIMDe native emulation of x86 SSE4.2 intrinsics on the building platform. That is, SSE4.2 intrinsics will be emulated using Neon on an Arm platform, or VSX on a Power platform, etc. +* `BUILD_SIMDE_BACKEND=[On|Off]` Enable SIMDe backend. If this is chosen all native (SSE/AVX/AVX512/Neon/SVE/VSX) backends will be disabled and a SIMDe SSE4.2 emulation backend will be enabled. This will enable Vectorscan to build and run on architectures without SIMD. +* `BUILD_SIMDE_NATIVE=[On|Off]` Enable SIMDe native emulation of x86 SSE4.2 intrinsics on the building platform. That is, SSE4.2 intrinsics will be emulated using Neon on an Arm platform, or VSX on a Power platform, etc. ## Build diff --git a/cmake/archdetect.cmake b/cmake/archdetect.cmake index bee51de5..3b0f5b06 100644 --- a/cmake/archdetect.cmake +++ b/cmake/archdetect.cmake @@ -56,28 +56,7 @@ if (USE_CPU_NATIVE) message(STATUS "gcc will tune for ${GNUCC_ARCH}, ${GNUCC_TUNE}") endif() elseif (CMAKE_COMPILER_IS_CLANG) - if (ARCH_IA32 OR ARCH_X86_64) - set(GNUCC_ARCH x86-64-v2) - set(TUNE_FLAG generic) - elseif(ARCH_AARCH64) - if (BUILD_SVE2_BITPERM) - set(GNUCC_ARCH ${SVE2_BITPERM_ARCH}) - elseif (BUILD_SVE2) - set(GNUCC_ARCH ${SVE2_ARCH}) - elseif (BUILD_SVE) - set(GNUCC_ARCH ${SVE_ARCH}) - else () - set(GNUCC_ARCH ${ARMV8_ARCH}) - endif() - set(TUNE_FLAG generic) - elseif(ARCH_ARM32) - set(GNUCC_ARCH armv7-a) - set(TUNE_FLAG generic-armv7-a) - else() - set(GNUCC_ARCH native) - set(TUNE_FLAG generic) - endif() - message(STATUS "clang will tune for ${GNUCC_ARCH}, ${TUNE_FLAG}") + message(FATAL_ERROR "CPU Native detection is not supported by Clang/LLVM, use GCC!") endif() else() if (SIMDE_BACKEND) diff --git a/cmake/build_wrapper.cmake b/cmake/build_wrapper.cmake new file mode 100644 index 00000000..80ea722f --- /dev/null +++ b/cmake/build_wrapper.cmake @@ -0,0 +1,9 @@ +function(add_fat_component component objects compile_flags sources isPIC) + set(BUILD_WRAPPER "${PROJECT_SOURCE_DIR}/cmake/build_wrapper.sh") + add_library(${objects} OBJECT ${sources}) + set_target_properties(${objects} PROPERTIES + COMPILE_FLAGS "${compile_flags}" + POSITION_INDEPENDENT_CODE ${isPIC} + RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} ${component} ${CMAKE_MODULE_PATH}/keep.syms.in" + ) +endfunction() diff --git a/cmake/simde.cmake b/cmake/simde.cmake index 9b15e177..867592ab 100644 --- a/cmake/simde.cmake +++ b/cmake/simde.cmake @@ -3,36 +3,29 @@ LIST(APPEND CMAKE_REQUIRED_INCLUDES ${PROJECT_SOURCE_DIR}/simde) CHECK_INCLUDE_FILES(simde/x86/sse4.2.h SIMDE_SSE42_H_FOUND) if (SIMDE_SSE42_H_FOUND) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DVS_SIMDE_BACKEND") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVS_SIMDE_BACKEND") + set(SIMDE_FLAGS "-DVS_SIMDE_BACKEND") include_directories(${PROJECT_SOURCE_DIR}/simde) if (CMAKE_COMPILER_IS_CLANG) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSIMDE_NO_CHECK_IMMEDIATE_CONSTANT") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSIMDE_NO_CHECK_IMMEDIATE_CONSTANT") + set(SIMDE_FLAGS "${SIMDE_FLAGS} -DSIMDE_NO_CHECK_IMMEDIATE_CONSTANT") if (ARCH_PPC64EL) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-altivec-src-compat") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-altivec-src-compat") + set(SIMDE_FLAGS "${SIMDE_FLAGS} -Wno-deprecated-altivec-src-compat") if (CLANG_MAJOR_VERSION EQUAL 15) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecate-lax-vec-conv-all") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecate-lax-vec-conv-all") + set(SIMDE_FLAGS "${SIMDE_FLAGS} -Wno-deprecate-lax-vec-conv-all") endif () endif() endif() - if (BUILD_SSE2_SIMDE) - message("using BUILD_SSE2_SIMDE..") - set(SIMDE_NATIVE true) + if (ARCH_IA32 OR ARCH_X86_64) + set(BUILD_SIMDE_NATIVE TRUE) set(ARCH_C_FLAGS "-msse2") set(ARCH_CXX_FLAGS "-msse2") set(X86_ARCH "x86-64") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DVS_SIMDE_NATIVE -DVS_SIMDE_BACKEND") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVS_SIMDE_NATIVE -DVS_SIMDE_BACKEND") endif() - - if (SIMDE_NATIVE AND NOT BUILD_SSE2_SIMDE) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DVS_SIMDE_NATIVE -DSIMDE_ENABLE_OPENMP -fopenmp-simd") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVS_SIMDE_NATIVE -DSIMDE_ENABLE_OPENMP -fopenmp-simd") + if (BUILD_SIMDE_NATIVE) + set(SIMDE_FLAGS "${SIMDE_FLAGS} -DVS_SIMDE_NATIVE") + else() + set(SIMDE_FLAGS "${SIMDE_FLAGS} -DSIMDE_ENABLE_OPENMP -fopenmp-simd") endif() else() diff --git a/src/dispatcher.c b/src/dispatcher.c index e213bbe6..a07e943e 100644 --- a/src/dispatcher.c +++ b/src/dispatcher.c @@ -78,18 +78,22 @@ #define check_avx512vbmi() (0) #endif +#if !defined(VS_SIMDE_BACKEND) +#define simde_ error_ +#endif + #define CREATE_DISPATCH(RTYPE, NAME, ...) \ + /* error func */ \ + static inline RTYPE JOIN(error_, NAME)(__VA_ARGS__) { \ + return (RTYPE)HS_ARCH_ERROR; \ + } \ + \ /* create defns */ \ RTYPE JOIN(avx512vbmi_, NAME)(__VA_ARGS__); \ RTYPE JOIN(avx512_, NAME)(__VA_ARGS__); \ RTYPE JOIN(avx2_, NAME)(__VA_ARGS__); \ RTYPE JOIN(corei7_, NAME)(__VA_ARGS__); \ - RTYPE JOIN(core2_, NAME)(__VA_ARGS__); \ - \ - /* error func */ \ - static inline RTYPE JOIN(error_, NAME)(__VA_ARGS__) { \ - return (RTYPE)HS_ARCH_ERROR; \ - } \ + RTYPE JOIN(simde_, NAME)(__VA_ARGS__); \ \ /* dispatch routing pointer for this function */ \ /* initially point it at the resolve function */ \ @@ -110,12 +114,9 @@ } \ else if (check_sse42() && check_popcnt()) { \ fat_dispatch_ ## NAME = &JOIN(corei7_, NAME); \ - } \ - else if (check_ssse3()) { \ - fat_dispatch_ ## NAME = &JOIN(core2_, NAME); \ } else { \ - /* anything else is fail */ \ - fat_dispatch_ ## NAME = &JOIN(error_, NAME); \ + /* If no SSE4.2 is available we fallback to SIMDe */ \ + fat_dispatch_ ## NAME = &JOIN(simde_, NAME); \ } \ diff --git a/src/hs.cpp b/src/hs.cpp index 22a9043b..4b1b46ef 100644 --- a/src/hs.cpp +++ b/src/hs.cpp @@ -198,16 +198,6 @@ hs_compile_multi_int(const char *const *expressions, const unsigned *flags, return HS_COMPILER_ERROR; } -#if defined(FAT_RUNTIME) -#if defined(ARCH_IA32) || defined(ARCH_X86_64) - if (!check_ssse3()) { - *db = nullptr; - *comp_error = generateCompileError("Unsupported architecture", -1); - return HS_ARCH_ERROR; - } -#endif -#endif - if (!checkMode(mode, comp_error)) { *db = nullptr; assert(*comp_error); // set by checkMode. @@ -322,15 +312,6 @@ hs_compile_lit_multi_int(const char *const *expressions, const unsigned *flags, *comp_error = generateCompileError("Invalid parameter: elements is zero", -1); return HS_COMPILER_ERROR; } -#if defined(FAT_RUNTIME) -#if defined(ARCH_IA32) || defined(ARCH_X86_64) - if (!check_ssse3()) { - *db = nullptr; - *comp_error = generateCompileError("Unsupported architecture", -1); - return HS_ARCH_ERROR; - } -#endif -#endif if (!checkMode(mode, comp_error)) { *db = nullptr; @@ -502,15 +483,6 @@ hs_error_t hs_expression_info_int(const char *expression, unsigned int flags, return HS_COMPILER_ERROR; } -#if defined(FAT_RUNTIME) -#if defined(ARCH_IA32) || defined(ARCH_X86_64) - if (!check_ssse3()) { - *error = generateCompileError("Unsupported architecture", -1); - return HS_ARCH_ERROR; - } -#endif -#endif - if (!info) { *error = generateCompileError("Invalid parameter: info is NULL", -1); return HS_COMPILER_ERROR; @@ -635,13 +607,6 @@ hs_error_t HS_CDECL hs_populate_platform(hs_platform_info_t *platform) { extern "C" HS_PUBLIC_API hs_error_t HS_CDECL hs_free_compile_error(hs_compile_error_t *error) { -#if defined(FAT_RUNTIME) -#if defined(ARCH_IA32) || defined(ARCH_X86_64) - if (!check_ssse3()) { - return HS_ARCH_ERROR; - } -#endif -#endif freeCompileError(error); return HS_SUCCESS; } diff --git a/src/hs_valid_platform.c b/src/hs_valid_platform.c index 4ab42df3..a8f6d29b 100644 --- a/src/hs_valid_platform.c +++ b/src/hs_valid_platform.c @@ -38,25 +38,33 @@ #endif #endif +#include + HS_PUBLIC_API hs_error_t HS_CDECL hs_valid_platform(void) { /* Vectorscan requires SSE4.2, anything else is a bonus */ -#if !defined(VS_SIMDE_BACKEND) && (defined(ARCH_IA32) || defined(ARCH_X86_64)) +#if defined(FAT_RUNTIME) +#if (defined(ARCH_IA32) || defined(ARCH_X86_64)) +#if defined(VS_SIMDE_BACKEND) + // Now that we have SIMDe fallback we can always return success. + return HS_SUCCESS; +#else + printf("checking SSE42 support\n"); + return check_sse42()? HS_SUCCESS: HS_ARCH_ERROR; +#endif +#elif (defined(ARCH_ARM32) || defined(ARCH_AARCH64)) // cppcheck-suppress knownConditionTrueFalse - if (check_sse42()) { - return HS_SUCCESS; - } else { - return HS_ARCH_ERROR; - } + return check_neon()? HS_SUCCESS: HS_ARCH_ERROR; +#endif +#else +#if !defined(VS_SIMDE_BACKEND) && (defined(ARCH_IA32) || defined(ARCH_X86_64)) + return check_sse42()? HS_SUCCESS: HS_ARCH_ERROR; #elif !defined(VS_SIMDE_BACKEND) && (defined(ARCH_ARM32) || defined(ARCH_AARCH64)) - //check_neon returns true for now - // cppcheck-suppress knownConditionTrueFalse - if (check_neon()) { - return HS_SUCCESS; - } else { - return HS_ARCH_ERROR; - } + // cppcheck-suppress knownConditionTrueFalse + return check_neon()? HS_SUCCESS: HS_ARCH_ERROR; #elif defined(ARCH_PPC64EL) || defined(VS_SIMDE_BACKEND) return HS_SUCCESS; #endif +#endif + return HS_SUCCESS; } diff --git a/src/util/arch/x86/cpuid_inline.h b/src/util/arch/x86/cpuid_inline.h index fdbd893c..5207fcfb 100644 --- a/src/util/arch/x86/cpuid_inline.h +++ b/src/util/arch/x86/cpuid_inline.h @@ -208,17 +208,6 @@ int check_avx512vbmi(void) { return 0; } -static inline -int check_ssse3(void) { -#if defined(VS_SIMDE_NATIVE) && (defined(ARCH_IA32) || defined(ARCH_X86_64)) - return 1; -#else - unsigned int eax, ebx, ecx, edx; - cpuid(1, 0, &eax, &ebx, &ecx, &edx); - return !!(ecx & CPUID_SSSE3); -#endif -} - static inline int check_sse42(void) { unsigned int eax, ebx, ecx, edx;