diff --git a/CMakeLists.txt b/CMakeLists.txt index f41b8f5f..52e9e6a6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 $) 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 $) 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 $) 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 $) 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 $) 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 $) 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" ) diff --git a/cmake/cflags-arm.cmake b/cmake/cflags-arm.cmake index 61995cf9..d622ce64 100644 --- a/cmake/cflags-arm.cmake +++ b/cmake/cflags-arm.cmake @@ -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 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 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 +endif() +if (BUILD_SVE2) + set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE2_ARCH}") + CHECK_C_SOURCE_COMPILES("#include 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 + }" HAVE_SVE2) +endif() +if (BUILD_SVE) + set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE_ARCH}") + CHECK_C_SOURCE_COMPILES("#include 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() diff --git a/src/util/arch/arm/arm.h b/src/util/arch/arm/arm.h index 2ec55da2..c38ac697 100644 --- a/src/util/arch/arm/arm.h +++ b/src/util/arch/arm/arm.h @@ -41,5 +41,17 @@ #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_