mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-06-28 16:41:01 +03:00
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:
parent
aa832db892
commit
cc11a3d738
@ -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
|
||||||
|
@ -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()
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user