build/run on machines that only have SSE2 with SIMDE (#303)

This allows the use of SIMDE library to emulate SSSE3/SSE4.2 instructions on SSE2-only (x86-64-v2) hardware.

---------

Co-authored-by: G.E <gregory.economou@vectorcamp.gr>
Co-authored-by: Konstantinos Margaritis <konstantinos@vectorcamp.gr>
This commit is contained in:
g. economou 2024-07-10 21:20:17 +03:00 committed by GitHub
parent aa832db892
commit cc11a3d738
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 75 additions and 14 deletions

View File

@ -129,6 +129,10 @@ include (${CMAKE_MODULE_PATH}/platform.cmake)
# Detect OS and if Fat Runtime is available # Detect OS and if Fat Runtime is available
include (${CMAKE_MODULE_PATH}/osdetection.cmake) 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) if(SIMDE_BACKEND)
include (${CMAKE_MODULE_PATH}/simde.cmake) include (${CMAKE_MODULE_PATH}/simde.cmake)
elseif (ARCH_IA32 OR ARCH_X86_64) elseif (ARCH_IA32 OR ARCH_X86_64)
@ -947,16 +951,36 @@ else ()
if (NOT BUILD_AVX512VBMI) if (NOT BUILD_AVX512VBMI)
set (DISPATCHER_DEFINE "${DISPATCHER_DEFINE} -DDISABLE_AVX512VBMI_DISPATCH") set (DISPATCHER_DEFINE "${DISPATCHER_DEFINE} -DDISABLE_AVX512VBMI_DISPATCH")
endif (NOT BUILD_AVX512VBMI) 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 set_source_files_properties(src/dispatcher.c PROPERTIES
COMPILE_FLAGS "-Wno-unused-parameter -Wno-unused-function ${DISPATCHER_DEFINE}") COMPILE_FLAGS "-Wno-unused-parameter -Wno-unused-function ${DISPATCHER_DEFINE}")
if (BUILD_STATIC_LIBS) if (BUILD_STATIC_LIBS)
add_library(hs_exec_core2 OBJECT ${hs_exec_SRCS})
list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_core2>) if (BUILD_SSE2_SIMDE)
set_target_properties(hs_exec_core2 PROPERTIES add_library(hs_exec_core2 OBJECT ${hs_exec_SRCS})
COMPILE_FLAGS "-march=core2 -msse4.2" list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_core2>)
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} core2 ${CMAKE_MODULE_PATH}/keep.syms.in" 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 $<TARGET_OBJECTS:hs_exec_core2>)
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}) add_library(hs_exec_corei7 OBJECT ${hs_exec_SRCS})
list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_corei7>) list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_corei7>)
@ -1015,13 +1039,32 @@ else ()
# build shared libs # build shared libs
add_library(hs_compile_shared OBJECT ${hs_compile_SRCS}) add_library(hs_compile_shared OBJECT ${hs_compile_SRCS})
set_target_properties(hs_compile_shared PROPERTIES POSITION_INDEPENDENT_CODE TRUE) 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 $<TARGET_OBJECTS:hs_exec_shared_core2>) if (BUILD_SSE2_SIMDE)
set_target_properties(hs_exec_shared_core2 PROPERTIES message("Building SIMDE SSE2 version..")
COMPILE_FLAGS "-march=core2 -msse4.2" add_library(hs_exec_shared_core2 OBJECT ${hs_exec_SRCS})
POSITION_INDEPENDENT_CODE TRUE list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_core2>)
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} core2 ${CMAKE_MODULE_PATH}/keep.syms.in"
) 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 $<TARGET_OBJECTS:hs_exec_shared_core2>)
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}) add_library(hs_exec_shared_corei7 OBJECT ${hs_exec_SRCS})
list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_corei7>) list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_corei7>)
set_target_properties(hs_exec_shared_corei7 PROPERTIES set_target_properties(hs_exec_shared_corei7 PROPERTIES

View File

@ -20,10 +20,21 @@ if (SIMDE_SSE42_H_FOUND)
endif() endif()
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_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") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVS_SIMDE_NATIVE -DSIMDE_ENABLE_OPENMP -fopenmp-simd")
endif() endif()
else() else()
message(FATAL_ERROR "SIMDe backend requested but SIMDe is not available on the system") message(FATAL_ERROR "SIMDe backend requested but SIMDe is not available on the system")
endif() endif()

View File

@ -42,6 +42,7 @@ HS_PUBLIC_API
hs_error_t HS_CDECL hs_valid_platform(void) { hs_error_t HS_CDECL hs_valid_platform(void) {
/* Hyperscan requires SSSE3, anything else is a bonus */ /* Hyperscan requires SSSE3, anything else is a bonus */
#if !defined(VS_SIMDE_BACKEND) && (defined(ARCH_IA32) || defined(ARCH_X86_64)) #if !defined(VS_SIMDE_BACKEND) && (defined(ARCH_IA32) || defined(ARCH_X86_64))
// cppcheck-suppress knownConditionTrueFalse
if (check_ssse3()) { if (check_ssse3()) {
return HS_SUCCESS; return HS_SUCCESS;
} else { } else {

View File

@ -210,9 +210,13 @@ int check_avx512vbmi(void) {
static inline static inline
int check_ssse3(void) { 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; unsigned int eax, ebx, ecx, edx;
cpuid(1, 0, &eax, &ebx, &ecx, &edx); cpuid(1, 0, &eax, &ebx, &ecx, &edx);
return !!(ecx & CPUID_SSSE3); return !!(ecx & CPUID_SSSE3);
#endif
} }
static inline static inline

View File

@ -36,7 +36,9 @@
#include "ue2common.h" #include "ue2common.h"
#if defined(VS_SIMDE_BACKEND) #if defined(VS_SIMDE_BACKEND)
#ifndef VECTORSIZE
#define VECTORSIZE 16 #define VECTORSIZE 16
#endif
#define SIMDE_ENABLE_NATIVE_ALIASES #define SIMDE_ENABLE_NATIVE_ALIASES
#if !defined(VS_SIMDE_NATIVE) #if !defined(VS_SIMDE_NATIVE)
#define SIMDE_NO_NATIVE #define SIMDE_NO_NATIVE