diff --git a/Makefile.system b/Makefile.system index 4350165f5..6e98b3fc8 100644 --- a/Makefile.system +++ b/Makefile.system @@ -284,8 +284,10 @@ GETARCH_FLAGS += -DHAVE_GAS=$(HAVE_GAS) # Generating Makefile.conf and config.h DUMMY := $(shell $(MAKE) -C $(TOPDIR) -f Makefile.prebuild CC="$(CC)" FC="$(FC)" HOSTCC="$(HOSTCC)" HOST_CFLAGS="$(GETARCH_FLAGS)" CFLAGS="$(CFLAGS)" BINARY=$(BINARY) USE_OPENMP=$(USE_OPENMP) DYNAMIC_ARCH=$(DYNAMIC_ARCH) TARGET_CORE=$(TARGET_CORE) ONLY_CBLAS=$(ONLY_CBLAS) TARGET=$(TARGET) all) +endif + ifndef TARGET_CORE -include $(TOPDIR)/Makefile.conf +-include $(TOPDIR)/Makefile.conf else HAVE_NEON= HAVE_VFP= @@ -306,7 +308,6 @@ HAVE_FMA3= include $(TOPDIR)/Makefile_kernel.conf endif -endif ifndef NUM_PARALLEL NUM_PARALLEL = 1 @@ -664,8 +665,10 @@ DYNAMIC_CORE += CORTEXA57 DYNAMIC_CORE += CORTEXA72 DYNAMIC_CORE += CORTEXA73 DYNAMIC_CORE += NEOVERSEN1 +ifneq ($(NO_SVE), 1) DYNAMIC_CORE += NEOVERSEV1 DYNAMIC_CORE += NEOVERSEN2 +endif DYNAMIC_CORE += CORTEXA55 DYNAMIC_CORE += FALKOR DYNAMIC_CORE += THUNDERX @@ -1382,6 +1385,10 @@ ifeq ($(NO_AVX512), 1) CCOMMON_OPT += -DNO_AVX512 endif +ifeq ($(NO_SVE), 1) +CCOMMON_OPT += -DNO_SVE +endif + ifdef SMP CCOMMON_OPT += -DSMP_SERVER diff --git a/c_check b/c_check index d2bd47524..178e755fb 100755 --- a/c_check +++ b/c_check @@ -240,6 +240,21 @@ if [ "$architecture" = "riscv64" ]; then rm -rf "$tmpd" fi +no_sve=0 +if [ "$architecture" = "arm64" ]; then + tmpd=`mktemp -d` + tmpf="$tmpd/a.c" + printf "#include \n\n int main(void){}\n">> "$tmpf" + args=" -march=armv8-a+sve -c -o $tmpf.o $tmpf" + no_sve=0 + { + $compiler_name $flags $args >/dev/null 2>&1 + } || { + no_sve=1 + } + rm -rf "$tmpd" +fi + c11_atomics=0 case "$data" in *HAVE_C11*) @@ -379,6 +394,7 @@ done printf "HAVE_MSA=1\n" printf "MSA_FLAGS=%s\n" "$msa_flags" } + [ "$no_sve" -eq 1 ] && printf "NO_SVE=1\n" [ "$no_rv64gv" -eq 1 ] && printf "NO_RV64GV=1\n" [ "$no_avx512" -eq 1 ] && printf "NO_AVX512=1\n" [ "$no_avx2" -eq 1 ] && printf "NO_AVX2=1\n" diff --git a/cmake/arch.cmake b/cmake/arch.cmake index f4a135e82..c1f0d5f62 100644 --- a/cmake/arch.cmake +++ b/cmake/arch.cmake @@ -44,9 +44,12 @@ endif () if (DYNAMIC_ARCH) if (ARM64) - set(DYNAMIC_CORE ARMV8 CORTEXA53 CORTEXA55 CORTEXA57 CORTEXA72 CORTEXA73 FALKOR THUNDERX THUNDERX2T99 TSV110 EMAG8180 NEOVERSEN1 NEOVERSEV1 NEOVERSEN2 THUNDERX3T110) + set(DYNAMIC_CORE ARMV8 CORTEXA53 CORTEXA55 CORTEXA57 CORTEXA72 CORTEXA73 FALKOR THUNDERX THUNDERX2T99 TSV110 EMAG8180 NEOVERSEN1 THUNDERX3T110) + if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER 9.99) + set(DYNAMIC_CORE "${DYNAMIC_CORE} NEOVERSEV1 NEOVERSEN2") + endif () if (DYNAMIC_LIST) - set(DYNAMIC_CORE ARMV8 ${DYNAMIC_LIST}) + set(DYNAMIC_CORE ARMV8 ${DYNAMIC_LIST}) endif () endif () diff --git a/driver/others/dynamic_arm64.c b/driver/others/dynamic_arm64.c index d88b1da40..0f47b287c 100644 --- a/driver/others/dynamic_arm64.c +++ b/driver/others/dynamic_arm64.c @@ -125,8 +125,13 @@ extern gotoblas_t gotoblas_THUNDERX2T99; extern gotoblas_t gotoblas_TSV110; extern gotoblas_t gotoblas_EMAG8180; extern gotoblas_t gotoblas_NEOVERSEN1; +#ifndef NO_SVE extern gotoblas_t gotoblas_NEOVERSEV1; extern gotoblas_t gotoblas_NEOVERSEN2; +#else +#define gotoblas_NEOVERSEV1 gotoblas_ARMV8 +#define gotoblas_NEOVERSEN2 gotoblas_ARMV8 +#endif extern gotoblas_t gotoblas_THUNDERX3T110; extern gotoblas_t gotoblas_CORTEXA55; #endif @@ -237,7 +242,7 @@ static gotoblas_t *get_coretype(void) { p = (char *) NULL ; infile = fopen("/sys/devices/system/cpu/cpu0/regs/identification/midr_el1","r"); if (!infile) return NULL; - fgets(buffer, sizeof(buffer), infile); + (void)fgets(buffer, sizeof(buffer), infile); midr_el1=strtoul(buffer,NULL,16); fclose(infile); #else @@ -274,10 +279,12 @@ static gotoblas_t *get_coretype(void) { return &gotoblas_CORTEXA73; case 0xd0c: // Neoverse N1 return &gotoblas_NEOVERSEN1; +#ifndef NO_SVE case 0xd49: return &gotoblas_NEOVERSEN2; case 0xd40: return &gotoblas_NEOVERSEV1; +#endif case 0xd05: // Cortex A55 return &gotoblas_CORTEXA55; }