]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
fix cmake refactor for arm builds
authorKonstantinos Margaritis <konma@vectorcamp.gr>
Mon, 9 Oct 2023 10:03:53 +0000 (10:03 +0000)
committerKonstantinos Margaritis <konma@vectorcamp.gr>
Mon, 9 Oct 2023 10:03:53 +0000 (10:03 +0000)
CMakeLists.txt
cmake/cflags-arm.cmake
src/util/arch/arm/arm.h

index f41b8f5ffed2007d3ba0f9a3c40a39da291c27a5..52e9e6a6d76e183d622dff02fe721e622a9386bd 100644 (file)
@@ -1042,29 +1042,23 @@ else ()
     if (ARCH_AARCH64)
         set(BUILD_WRAPPER "${PROJECT_SOURCE_DIR}/cmake/build_wrapper.sh")
         if (BUILD_STATIC_LIBS)
-           set (BUILD_SVE OFF)
-           set (BUILD_SVE2 OFF)
-           set (BUILD_SVE2_BITPERM OFF)
-           add_library(hs_exec_neon OBJECT ${hs_exec_SRCS} ${hs_exec_neon_SRCS})
+            add_library(hs_exec_neon OBJECT ${hs_exec_SRCS} ${hs_exec_neon_SRCS})
             list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_neon>)
             set_target_properties(hs_exec_neon PROPERTIES
-                COMPILE_FLAGS "-march=armv8-a"
+                COMPILE_FLAGS "-march=${ARMV8_ARCH}"
                 RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} neon ${CMAKE_MODULE_PATH}/keep.syms.in"
                 )
 
-            set (BUILD_SVE ON)
             add_library(hs_exec_sve OBJECT ${hs_exec_SRCS} ${hs_exec_sve_SRCS})
             list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_sve>)
             set_target_properties(hs_exec_sve PROPERTIES
-                COMPILE_FLAGS "-march=armv8-a+sve -DHAVE_SVE"
+                COMPILE_FLAGS "-march=${SVE_ARCH}"
                 RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve ${CMAKE_MODULE_PATH}/keep.syms.in"
                 )
-            set (BUILD_SVE2 ON)
-           set (BUILD_SVE2_BITPERM ON)
             add_library(hs_exec_sve2 OBJECT ${hs_exec_SRCS} ${hs_exec_sve2_SRCS})
             list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_sve2>)
             set_target_properties(hs_exec_sve2 PROPERTIES
-                COMPILE_FLAGS "-march=armv9-a+sve+sve2+sve2-bitperm -DHAVE_SVE -DHAVE_SVE2"
+                COMPILE_FLAGS "-march=${SVE2_BITPERM_ARCH}"
                 RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve2 ${CMAKE_MODULE_PATH}/keep.syms.in"
                 )
 
@@ -1096,28 +1090,25 @@ 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})
+                 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-a"
+                COMPILE_FLAGS "-march=${ARMV8_ARCH}"
                 POSITION_INDEPENDENT_CODE TRUE
                 RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} neon ${CMAKE_MODULE_PATH}/keep.syms.in"
                 )
 
-            set (BUILD_SVE ON)
             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=armv8-a+sve -DHAVE_SVE"
+                           COMPILE_FLAGS "-march=${SVE_ARCH}"
                 POSITION_INDEPENDENT_CODE TRUE
                 RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve ${CMAKE_MODULE_PATH}/keep.syms.in"
                 )
-            set (BUILD_SVE2 ON)
-            set (BUILD_SVE2_BITPERM ON)
             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=armv8-a+sve+sve2+sve2-bitperm -DHAVE_SVE -DHAVE_SVE2"
+                COMPILE_FLAGS "-march=${SVE2_BITPERM_ARCH}"
                 POSITION_INDEPENDENT_CODE TRUE
                 RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve2 ${CMAKE_MODULE_PATH}/keep.syms.in"
                 )
index 61995cf9058fe853af0974f581bc3e34e0c346ec..d622ce64848e26ecf03c345b4973d96d6b3c4ccb 100644 (file)
@@ -9,122 +9,74 @@ if (NOT FAT_RUNTIME)
     endif ()
 endif ()
 
-if (ARCH_AARCH64)
-    if (NOT FAT_RUNTIME)
-        if (BUILD_SVE2_BITPERM AND NOT SVE2_BITPERM_FOUND)
-            set(GNUCC_ARCH "${GNUCC_ARCH}+sve2-bitperm")
-        elseif (BUILD_SVE2 AND NOT SVE2_FOUND)
-            set(GNUCC_ARCH "${GNUCC_ARCH}+sve2")
-        elseif (BUILD_SVE AND NOT SVE_FOUND)
-            set(GNUCC_ARCH "${GNUCC_ARCH}+sve")
-        endif ()
-    else()
-        set(ARCH_C_FLAGS "")
-        set(ARCH_CXX_FLAGS "")
-    endif()
-endif(ARCH_AARCH64)
+set(SVE2_BITPERM_ARCH "armv9-a+sve2-bitperm")
+set(SVE2_ARCH "armv9-a")
+set(SVE_ARCH "armv8-a+sve")
+set(ARMV8_ARCH "armv8-a")
 
 CHECK_INCLUDE_FILE_CXX(arm_neon.h HAVE_C_ARM_NEON_H)
 if (BUILD_SVE OR BUILD_SVE2 OR BUILD_SVE2_BITPERM OR FAT_RUNTIME)
-  if (CMAKE_COMPILER_IS_CLANG)
-    set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=armv8-a+sve")
-  else()
-    set(CMAKE_REQUIRED_FLAGS ${ARCH_CXX_FLAGS})
-  endif()
+  set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE_ARCH}")
   CHECK_INCLUDE_FILE_CXX(arm_sve.h HAVE_C_ARM_SVE_H)
   if (NOT HAVE_C_ARM_SVE_H)
     message(FATAL_ERROR "arm_sve.h is required to build for SVE.")
   endif()
 endif()
 
-if (HAVE_C_EC_H)
-    set (INTRIN_INC_H "altivec.h")
-else()
-    message (FATAL_ERROR "No intrinsics header found for VSX")
-endif ()
-
-if (ARCH_ARM32 OR ARCH_AARCH64)
-    CHECK_C_SOURCE_COMPILES("#include <${INTRIN_INC_H}>
+CHECK_C_SOURCE_COMPILES("#include <arm_neon.h>
 int main() {
     int32x4_t a = vdupq_n_s32(1);
     (void)a;
 }" HAVE_NEON)
-endif ()
 
-set(PREV_FLAGS "${CMAKE_C_FLAGS}")
 if (BUILD_SVE2_BITPERM)
-    set(CMAKE_C_FLAGS "-march=${GNUCC_ARCH} ${CMAKE_C_FLAGS}")
+    set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE2_BITPERM_ARCH}")
     CHECK_C_SOURCE_COMPILES("#include <arm_sve.h>
     int main() {
         svuint8_t a = svbext(svdup_u8(1), svdup_u8(2));
         (void)a;
     }" HAVE_SVE2_BITPERM)
-       if (HAVE_SVE2_BITPERM AND NOT FAT_RUNTIME)
-            add_definitions(-DHAVE_SVE2_BITPERM)
-        endif ()
-    endif()
-    if (BUILD_SVE2)
-        set(CMAKE_C_FLAGS "-march=${GNUCC_ARCH} ${CMAKE_C_FLAGS}")
-        CHECK_C_SOURCE_COMPILES("#include <arm_sve.h>
+endif()
+if (BUILD_SVE2)
+    set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE2_ARCH}")
+    CHECK_C_SOURCE_COMPILES("#include <arm_sve.h>
         int main() {
             svuint8_t a = svbsl(svdup_u8(1), svdup_u8(2), svdup_u8(3));
             (void)a;
-        }" HAVE_SVE2)
-    endif()
-    if ((HAVE_SVE2 OR HAVE_SVE2_BITPERM) AND NOT FAT_RUNTIME)
-        add_definitions(-DHAVE_SVE2)
-    endif ()
-    if (BUILD_SVE)
-        set(CMAKE_C_FLAGS "-march=${GNUCC_ARCH} ${CMAKE_C_FLAGS}")
-        CHECK_C_SOURCE_COMPILES("#include <arm_sve.h>
+    }" HAVE_SVE2)
+endif()
+if (BUILD_SVE)
+    set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE_ARCH}")
+    CHECK_C_SOURCE_COMPILES("#include <arm_sve.h>
         int main() {
             svuint8_t a = svdup_u8(1);
             (void)a;
-        }" HAVE_SVE)
-    endif ()
-    if ((HAVE_SVE OR HAVE_SVE2 OR HAVE_SVE2_BITPERM) AND NOT FAT_RUNTIME)
-        add_definitions(-DHAVE_SVE)
-    endif ()
-    set(CMAKE_C_FLAGS "${PREV_FLAGS}")
-endif()
+    }" HAVE_SVE)
+endif ()
 
 if (FAT_RUNTIME)
-    if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_SSE42)
-        message(FATAL_ERROR "SSE4.2 support required to build fat runtime")
+    if (NOT HAVE_NEON)
+        message(FATAL_ERROR "NEON support required to build fat runtime")
     endif ()
-    if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX2 AND NOT HAVE_AVX2)
-        message(FATAL_ERROR "AVX2 support required to build fat runtime")
+    if (BUILD_SVE AND NOT HAVE_SVE)
+        message(FATAL_ERROR "SVE support required to build fat runtime")
     endif ()
-    if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512 AND NOT HAVE_AVX512)
-        message(FATAL_ERROR "AVX512 support requested but not supported")
+    if (BUILD_SVE2 AND NOT HAVE_SVE2)
+        message(FATAL_ERROR "SVE2 support required to build fat runtime")
     endif ()
-    if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512VBMI AND NOT HAVE_AVX512VBMI)
-        message(FATAL_ERROR "AVX512VBMI support requested but not supported")
+    if (BUILD_SVE2_BITPERM AND NOT HAVE_SVE2_BITPERM)
+        message(FATAL_ERROR "SVE2 support required to build fat runtime")
     endif ()
 else (NOT FAT_RUNTIME)
-    if (ARCH_AARCH64 AND NOT BUILD_SVE)
+    if (NOT BUILD_SVE)
         message(STATUS "Building without SVE support")
     endif ()
-    if (ARCH_AARCH64 AND NOT BUILD_SVE2)
+    if (NOT BUILD_SVE2)
         message(STATUS "Building without SVE2 support")
     endif ()
-    if ((ARCH_ARM32 OR ARCH_AARCH64) AND NOT HAVE_NEON)
+    if (NOT HAVE_NEON)
         message(FATAL_ERROR "Neon/ASIMD support required for Arm support")
     endif ()
 endif ()
 
-    string(FIND "${GNUCC_ARCH}" "sve" POS_SVE)
-    string(FIND "${GNUCC_ARCH}" "sve2" POS_SVE2)
-    string(FIND "${GNUCC_ARCH}" "sve2-bitperm" POS_SVE2_BITPERM)
-    if(NOT POS_SVE2_BITPERM EQUAL 0)
-        set(SVE2_BITPERM_FOUND 1)
-        set(SVE2_FOUND 1)
-        set(SVE_FOUND 1)
-    elseif(NOT POS_SVE2 EQUAL 0)
-        set(SVE2_FOUND 1)
-        set(SVE_FOUND 1)
-    elseif (NOT POS_SVE EQUAL 0)
-        set(SVE_FOUND 1)
-        set(SVE2_BITPERM_FOUND 1)
-    endif()
 
index 2ec55da219863b31de98bd97d4432bf676e343bc..c38ac697b247e954064678cb70e8cda2288a9661 100644 (file)
 #define VECTORSIZE 16
 #endif
 
+#if defined(__ARM_FEATURE_SVE)
+#define HAVE_SVE
+#endif
+
+#if defined(__ARM_FEATURE_SVE2)
+#define HAVE_SVE2
+#endif
+
+#if defined(__ARM_FEATURE_SVE2_BITPERM)
+#define HAVE_SVE2_BITPERM
+#endif
+
 #endif // UTIL_ARCH_ARM_H_