diff --git a/CMakeLists.txt b/CMakeLists.txt index b1daee702..b09d1af7c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -129,6 +129,10 @@ 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) +endif() + if(SIMDE_BACKEND) include (${CMAKE_MODULE_PATH}/simde.cmake) elseif (ARCH_IA32 OR ARCH_X86_64) @@ -947,16 +951,36 @@ else () 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) set_source_files_properties(src/dispatcher.c PROPERTIES COMPILE_FLAGS "-Wno-unused-parameter -Wno-unused-function ${DISPATCHER_DEFINE}") if (BUILD_STATIC_LIBS) - 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" - ) + + 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 + 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}) list(APPEND RUNTIME_LIBS $) @@ -1015,13 +1039,32 @@ 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_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" - ) + + 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 + 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" + ) + 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 diff --git a/cmake/simde.cmake b/cmake/simde.cmake index 9240fdc2d..9b15e1776 100644 --- a/cmake/simde.cmake +++ b/cmake/simde.cmake @@ -20,10 +20,21 @@ if (SIMDE_SSE42_H_FOUND) endif() endif() - if (SIMDE_NATIVE) + if (BUILD_SSE2_SIMDE) + message("using BUILD_SSE2_SIMDE..") + set(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") endif() + else() message(FATAL_ERROR "SIMDe backend requested but SIMDe is not available on the system") endif() diff --git a/src/hs_valid_platform.c b/src/hs_valid_platform.c index 00c612bc9..b1d44ff4b 100644 --- a/src/hs_valid_platform.c +++ b/src/hs_valid_platform.c @@ -42,6 +42,7 @@ HS_PUBLIC_API hs_error_t HS_CDECL hs_valid_platform(void) { /* Hyperscan requires SSSE3, anything else is a bonus */ #if !defined(VS_SIMDE_BACKEND) && (defined(ARCH_IA32) || defined(ARCH_X86_64)) + // cppcheck-suppress knownConditionTrueFalse if (check_ssse3()) { return HS_SUCCESS; } else { diff --git a/src/util/arch/x86/cpuid_inline.h b/src/util/arch/x86/cpuid_inline.h index d5ff210cb..fdbd893ca 100644 --- a/src/util/arch/x86/cpuid_inline.h +++ b/src/util/arch/x86/cpuid_inline.h @@ -210,9 +210,13 @@ int check_avx512vbmi(void) { 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 diff --git a/src/util/simd_types.h b/src/util/simd_types.h index e393d081a..5290680f6 100644 --- a/src/util/simd_types.h +++ b/src/util/simd_types.h @@ -36,7 +36,9 @@ #include "ue2common.h" #if defined(VS_SIMDE_BACKEND) +#ifndef VECTORSIZE #define VECTORSIZE 16 +#endif #define SIMDE_ENABLE_NATIVE_ALIASES #if !defined(VS_SIMDE_NATIVE) #define SIMDE_NO_NATIVE