fix cmake refactor for arm builds

This commit is contained in:
Konstantinos Margaritis 2023-10-09 10:03:53 +00:00
parent 981576a5fe
commit 4d539f2c87
3 changed files with 49 additions and 94 deletions

View File

@ -1042,29 +1042,23 @@ else ()
if (ARCH_AARCH64) if (ARCH_AARCH64)
set(BUILD_WRAPPER "${PROJECT_SOURCE_DIR}/cmake/build_wrapper.sh") set(BUILD_WRAPPER "${PROJECT_SOURCE_DIR}/cmake/build_wrapper.sh")
if (BUILD_STATIC_LIBS) if (BUILD_STATIC_LIBS)
set (BUILD_SVE OFF) add_library(hs_exec_neon OBJECT ${hs_exec_SRCS} ${hs_exec_neon_SRCS})
set (BUILD_SVE2 OFF)
set (BUILD_SVE2_BITPERM OFF)
add_library(hs_exec_neon OBJECT ${hs_exec_SRCS} ${hs_exec_neon_SRCS})
list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_neon>) list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_neon>)
set_target_properties(hs_exec_neon PROPERTIES 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" 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}) add_library(hs_exec_sve OBJECT ${hs_exec_SRCS} ${hs_exec_sve_SRCS})
list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_sve>) list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_sve>)
set_target_properties(hs_exec_sve PROPERTIES 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" 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}) add_library(hs_exec_sve2 OBJECT ${hs_exec_SRCS} ${hs_exec_sve2_SRCS})
list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_sve2>) list(APPEND RUNTIME_LIBS $<TARGET_OBJECTS:hs_exec_sve2>)
set_target_properties(hs_exec_sve2 PROPERTIES 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" RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve2 ${CMAKE_MODULE_PATH}/keep.syms.in"
) )
@ -1096,28 +1090,25 @@ 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_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>) list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_neon>)
set_target_properties(hs_exec_shared_neon PROPERTIES set_target_properties(hs_exec_shared_neon PROPERTIES
COMPILE_FLAGS "-march=armv8-a" COMPILE_FLAGS "-march=${ARMV8_ARCH}"
POSITION_INDEPENDENT_CODE TRUE POSITION_INDEPENDENT_CODE TRUE
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} neon ${CMAKE_MODULE_PATH}/keep.syms.in" 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}) add_library(hs_exec_shared_sve OBJECT ${hs_exec_SRCS} ${hs_exec_sve_SRCS})
list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_sve>) list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_sve>)
set_target_properties(hs_exec_shared_sve PROPERTIES 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 POSITION_INDEPENDENT_CODE TRUE
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve ${CMAKE_MODULE_PATH}/keep.syms.in" 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}) add_library(hs_exec_shared_sve2 OBJECT ${hs_exec_SRCS} ${hs_exec_sve2_SRCS})
list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_sve2>) list(APPEND RUNTIME_SHLIBS $<TARGET_OBJECTS:hs_exec_shared_sve2>)
set_target_properties(hs_exec_shared_sve2 PROPERTIES 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 POSITION_INDEPENDENT_CODE TRUE
RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve2 ${CMAKE_MODULE_PATH}/keep.syms.in" RULE_LAUNCH_COMPILE "${BUILD_WRAPPER} sve2 ${CMAKE_MODULE_PATH}/keep.syms.in"
) )

View File

@ -9,122 +9,74 @@ if (NOT FAT_RUNTIME)
endif () endif ()
endif () endif ()
if (ARCH_AARCH64) set(SVE2_BITPERM_ARCH "armv9-a+sve2-bitperm")
if (NOT FAT_RUNTIME) set(SVE2_ARCH "armv9-a")
if (BUILD_SVE2_BITPERM AND NOT SVE2_BITPERM_FOUND) set(SVE_ARCH "armv8-a+sve")
set(GNUCC_ARCH "${GNUCC_ARCH}+sve2-bitperm") set(ARMV8_ARCH "armv8-a")
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)
CHECK_INCLUDE_FILE_CXX(arm_neon.h HAVE_C_ARM_NEON_H) 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 (BUILD_SVE OR BUILD_SVE2 OR BUILD_SVE2_BITPERM OR FAT_RUNTIME)
if (CMAKE_COMPILER_IS_CLANG) set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE_ARCH}")
set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=armv8-a+sve")
else()
set(CMAKE_REQUIRED_FLAGS ${ARCH_CXX_FLAGS})
endif()
CHECK_INCLUDE_FILE_CXX(arm_sve.h HAVE_C_ARM_SVE_H) CHECK_INCLUDE_FILE_CXX(arm_sve.h HAVE_C_ARM_SVE_H)
if (NOT HAVE_C_ARM_SVE_H) if (NOT HAVE_C_ARM_SVE_H)
message(FATAL_ERROR "arm_sve.h is required to build for SVE.") message(FATAL_ERROR "arm_sve.h is required to build for SVE.")
endif() endif()
endif() endif()
if (HAVE_C_EC_H) CHECK_C_SOURCE_COMPILES("#include <arm_neon.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}>
int main() { int main() {
int32x4_t a = vdupq_n_s32(1); int32x4_t a = vdupq_n_s32(1);
(void)a; (void)a;
}" HAVE_NEON) }" HAVE_NEON)
endif ()
set(PREV_FLAGS "${CMAKE_C_FLAGS}")
if (BUILD_SVE2_BITPERM) 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> CHECK_C_SOURCE_COMPILES("#include <arm_sve.h>
int main() { int main() {
svuint8_t a = svbext(svdup_u8(1), svdup_u8(2)); svuint8_t a = svbext(svdup_u8(1), svdup_u8(2));
(void)a; (void)a;
}" HAVE_SVE2_BITPERM) }" HAVE_SVE2_BITPERM)
if (HAVE_SVE2_BITPERM AND NOT FAT_RUNTIME) endif()
add_definitions(-DHAVE_SVE2_BITPERM) if (BUILD_SVE2)
endif () set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE2_ARCH}")
endif() CHECK_C_SOURCE_COMPILES("#include <arm_sve.h>
if (BUILD_SVE2)
set(CMAKE_C_FLAGS "-march=${GNUCC_ARCH} ${CMAKE_C_FLAGS}")
CHECK_C_SOURCE_COMPILES("#include <arm_sve.h>
int main() { int main() {
svuint8_t a = svbsl(svdup_u8(1), svdup_u8(2), svdup_u8(3)); svuint8_t a = svbsl(svdup_u8(1), svdup_u8(2), svdup_u8(3));
(void)a; (void)a;
}" HAVE_SVE2) }" HAVE_SVE2)
endif() endif()
if ((HAVE_SVE2 OR HAVE_SVE2_BITPERM) AND NOT FAT_RUNTIME) if (BUILD_SVE)
add_definitions(-DHAVE_SVE2) set(CMAKE_REQUIRED_FLAGS "-${ARCH_FLAG}=${SVE_ARCH}")
endif () CHECK_C_SOURCE_COMPILES("#include <arm_sve.h>
if (BUILD_SVE)
set(CMAKE_C_FLAGS "-march=${GNUCC_ARCH} ${CMAKE_C_FLAGS}")
CHECK_C_SOURCE_COMPILES("#include <arm_sve.h>
int main() { int main() {
svuint8_t a = svdup_u8(1); svuint8_t a = svdup_u8(1);
(void)a; (void)a;
}" HAVE_SVE) }" HAVE_SVE)
endif () 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()
if (FAT_RUNTIME) if (FAT_RUNTIME)
if ((ARCH_IA32 OR ARCH_X86_64) AND NOT HAVE_SSE42) if (NOT HAVE_NEON)
message(FATAL_ERROR "SSE4.2 support required to build fat runtime") message(FATAL_ERROR "NEON support required to build fat runtime")
endif () endif ()
if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX2 AND NOT HAVE_AVX2) if (BUILD_SVE AND NOT HAVE_SVE)
message(FATAL_ERROR "AVX2 support required to build fat runtime") message(FATAL_ERROR "SVE support required to build fat runtime")
endif () endif ()
if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512 AND NOT HAVE_AVX512) if (BUILD_SVE2 AND NOT HAVE_SVE2)
message(FATAL_ERROR "AVX512 support requested but not supported") message(FATAL_ERROR "SVE2 support required to build fat runtime")
endif () endif ()
if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512VBMI AND NOT HAVE_AVX512VBMI) if (BUILD_SVE2_BITPERM AND NOT HAVE_SVE2_BITPERM)
message(FATAL_ERROR "AVX512VBMI support requested but not supported") message(FATAL_ERROR "SVE2 support required to build fat runtime")
endif () endif ()
else (NOT FAT_RUNTIME) else (NOT FAT_RUNTIME)
if (ARCH_AARCH64 AND NOT BUILD_SVE) if (NOT BUILD_SVE)
message(STATUS "Building without SVE support") message(STATUS "Building without SVE support")
endif () endif ()
if (ARCH_AARCH64 AND NOT BUILD_SVE2) if (NOT BUILD_SVE2)
message(STATUS "Building without SVE2 support") message(STATUS "Building without SVE2 support")
endif () 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") message(FATAL_ERROR "Neon/ASIMD support required for Arm support")
endif () endif ()
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()

View File

@ -41,5 +41,17 @@
#define VECTORSIZE 16 #define VECTORSIZE 16
#endif #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_ #endif // UTIL_ARCH_ARM_H_