if (NOT FAT_RUNTIME) if (BUILD_SVE2_BITPERM) message (STATUS "SVE2_BITPERM implies SVE2, enabling BUILD_SVE2") set(BUILD_SVE2 ON) endif () if (BUILD_SVE2) message (STATUS "SVE2 implies SVE, enabling BUILD_SVE") set(BUILD_SVE ON) 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) 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() 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}> 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}") 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 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 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() 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") 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") endif () if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512 AND NOT HAVE_AVX512) message(FATAL_ERROR "AVX512 support requested but not supported") endif () if ((ARCH_IA32 OR ARCH_X86_64) AND BUILD_AVX512VBMI AND NOT HAVE_AVX512VBMI) message(FATAL_ERROR "AVX512VBMI support requested but not supported") endif () else (NOT FAT_RUNTIME) if (ARCH_AARCH64 AND NOT BUILD_SVE) message(STATUS "Building without SVE support") endif () if (ARCH_AARCH64 AND NOT BUILD_SVE2) message(STATUS "Building without SVE2 support") endif () if ((ARCH_ARM32 OR ARCH_AARCH64) AND 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()