mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-09-29 19:24:25 +03:00
fix cmake refactor for arm builds
This commit is contained in:
@@ -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()
|
||||
|
||||
|
Reference in New Issue
Block a user