]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
SIMDe is considered a valid platform (#390)
authorKonstantinos Margaritis <markos@users.noreply.github.com>
Fri, 17 Apr 2026 16:45:23 +0000 (19:45 +0300)
committerGitHub <noreply@github.com>
Fri, 17 Apr 2026 16:45:23 +0000 (19:45 +0300)
* 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

CMakeLists.txt
README.md
cmake/archdetect.cmake
cmake/build_wrapper.cmake [new file with mode: 0644]
cmake/simde.cmake
src/dispatcher.c
src/hs.cpp
src/hs_valid_platform.c
src/util/arch/x86/cpuid_inline.h

index ea0ae710fb34e24526039d9e956a649dc6f0edfb..6d716ad369eca8e660ac49c6b351a0aee1cd3681 100644 (file)
@@ -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 $<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
-                  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 $<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})
+           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 $<TARGET_OBJECTS:hs_exec_simde>)
+            endif()
+
+            add_fat_component("corei7" "hs_exec_corei7" "-march=corei7 -msse4.2" "${hs_exec_SRCS}" FALSE)
             list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_corei7>)
-            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 $<TARGET_OBJECTS:hs_exec_avx2>)
-                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 $<TARGET_OBJECTS:hs_exec_avx512>)
-                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 $<TARGET_OBJECTS:hs_exec_avx512vbmi>)
-                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 ()
                 $<TARGET_OBJECTS:hs_compile>
                 $<TARGET_OBJECTS:hs_exec_common>
                 ${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 $<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
-                  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 $<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
-                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 $<TARGET_OBJECTS:hs_exec_shared_simde>)
+            endif()
+            add_fat_component("corei7" "hs_exec_shared_corei7" "-march=corei7 -msse4.2" "${hs_exec_SRCS}" TRUE)
+           list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_corei7>)
 
             if (BUILD_AVX2)
-                add_library(hs_exec_shared_avx2 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS})
-                list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_avx2>)
-                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 $<TARGET_OBJECTS:hs_exec_shared_avx2>)
             endif (BUILD_AVX2)
             if (BUILD_AVX512)
-                add_library(hs_exec_shared_avx512 OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS})
-                list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_avx512>)
-                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 $<TARGET_OBJECTS:hs_exec_shared_avx512>)
             endif (BUILD_AVX512)
             if (BUILD_AVX512VBMI)
-                add_library(hs_exec_shared_avx512vbmi OBJECT ${hs_exec_SRCS} ${hs_exec_avx2_SRCS})
-                list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_avx512vbmi>)
-                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 $<TARGET_OBJECTS:hs_exec_shared_avx512vbmi>)
             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 $<TARGET_OBJECTS:hs_exec_neon>)
-            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 $<TARGET_OBJECTS:hs_exec_sve>)
-            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 $<TARGET_OBJECTS:hs_exec_sve2>)
-            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 $<TARGET_OBJECTS:hs_exec_shared_neon>)
-            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 $<TARGET_OBJECTS:hs_exec_shared_sve>)
-            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 $<TARGET_OBJECTS:hs_exec_shared_sve2>)
-            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 $<TARGET_OBJECTS:hs_exec_shared_neon>)
+
+           add_fat_component("sve" "hs_exec_shared_sve" "-march=${SVE_ARCH}" "${hs_exec_sve_SRCS}" TRUE)
+           list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_sve>)
+
+           add_fat_component("sve2" "hs_exec_shared_sve2" "-march=${SVE2_BITPERM_ARCH}" "${hs_exec_sve2_SRCS}" TRUE)
+           list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_sve2>)
+
+            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)
index 34038d0915cb497230d3b93f42dd801be471b2fc..29a2065f69d36ddbf51622600fbe4f881e91163d 100644 (file)
--- 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
 
index bee51de52f4103f4453bccc43185b51ab1fb9d92..3b0f5b06199e00d5c0e6c42169ebe15383b4e9b3 100644 (file)
@@ -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 (file)
index 0000000..80ea722
--- /dev/null
@@ -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()
index 9b15e17761d1bc1099dbed03262eb65c95785f6e..867592abff633d40dbb81e7db83af49e102a3e33 100644 (file)
@@ -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()
index e213bbe61544a35d375455ca45fdaba4f603ed4e..a07e943ef8a7cc64861c33916479a024f060ffb4 100644 (file)
 #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 */                           \
         }                                                                      \
         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);                       \
         }                                                                      \
 
 
index 22a9043b5300d0180417999f88e7aa9ce204ceea..4b1b46efed0528c12ce3e6296fa3570a6eae09ad 100644 (file)
@@ -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;
 }
index 4ab42df35caf3ac933f80a7733f1d664b7c7133f..a8f6d29bce03d46007a30d499a8f2ffea1970e55 100644 (file)
 #endif
 #endif
 
+#include <stdio.h>
+
 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;
 }
index fdbd893ca22cd1a1d13bfac72f321eedba93f6e2..5207fcfbdfe4319567c9c37901a39d6af2efd621 100644 (file)
@@ -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;