]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
build/run on machines that only have SSE2 with SIMDE (#303)
authorg. economou <8426352+isildur-g@users.noreply.github.com>
Wed, 10 Jul 2024 18:20:17 +0000 (21:20 +0300)
committerGitHub <noreply@github.com>
Wed, 10 Jul 2024 18:20:17 +0000 (21:20 +0300)
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>
CMakeLists.txt
cmake/simde.cmake
src/hs_valid_platform.c
src/util/arch/x86/cpuid_inline.h
src/util/simd_types.h

index b1daee702ba2421ab138c6e60d509627dd80b3a4..b09d1af7c3a982b65fbec9651ac2e597f26a9de7 100644 (file)
@@ -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 $<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"
-                )
+
+            if (BUILD_SSE2_SIMDE)
+              add_library(hs_exec_core2 OBJECT ${hs_exec_SRCS})
+              list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_core2>)
+              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})
             list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_corei7>)
@@ -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 $<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"
-                )
+
+            if (BUILD_SSE2_SIMDE)
+              message("Building SIMDE SSE2 version..")
+              add_library(hs_exec_shared_core2 OBJECT ${hs_exec_SRCS})
+              list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_core2>)
+  
+              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})
             list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_corei7>)
             set_target_properties(hs_exec_shared_corei7 PROPERTIES
index 9240fdc2d1514e4a1c31c0cf8bfde33d0f904f47..9b15e17761d1bc1099dbed03262eb65c95785f6e 100644 (file)
@@ -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()
index 00c612bc9c6e48b8dec8e938c1f6724e83e737ce..b1d44ff4b144bd89c2556f305439a9e2ceded2ef 100644 (file)
@@ -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 {
index d5ff210cba9ea7819eb7f0d98c0adbafd478375a..fdbd893ca22cd1a1d13bfac72f321eedba93f6e2 100644 (file)
@@ -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
index e393d081a9b2f22913af446f7e007d91fdde32df..5290680f606ae0fcd1f49bf180f9838634571efe 100644 (file)
@@ -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