https://github.com/xianyi/OpenBLAS/pull/3626 From 5af7b8638b3b972bd0e25597ec07927fffd52108 Mon Sep 17 00:00:00 2001 From: WANG Xuerui Date: Fri, 13 May 2022 15:26:33 +0800 Subject: [PATCH 1/3] Move LoongArch make rules to Makefile.loongarch64 --- Makefile.loongarch64 | 5 +++-- Makefile.system | 5 ----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/Makefile.loongarch64 b/Makefile.loongarch64 index 05ea9c679d..fced1a9462 100644 --- a/Makefile.loongarch64 +++ b/Makefile.loongarch64 @@ -1,3 +1,4 @@ -ifdef BINARY64 -else +ifeq ($(CORE), LOONGSON3R5) +CCOMMON_OPT += -march=loongarch64 -mabi=lp64 +FCOMMON_OPT += -march=loongarch64 -mabi=lp64 endif diff --git a/Makefile.system b/Makefile.system index 3be5efa0c2..9c91425b0f 100644 --- a/Makefile.system +++ b/Makefile.system @@ -895,11 +895,6 @@ ifeq ($(OSNAME), AIX) BINARY_DEFINED = 1 endif -ifeq ($(ARCH), loongarch64) -CCOMMON_OPT += -march=loongarch64 -mabi=lp64 -FCOMMON_OPT += -march=loongarch64 -mabi=lp64 -endif - endif ifndef BINARY_DEFINED From 869061c783d60ba0b799fab643952c493b57fb0a Mon Sep 17 00:00:00 2001 From: WANG Xuerui Date: Fri, 13 May 2022 15:53:22 +0800 Subject: [PATCH 2/3] Probe for old-world LASX flavor on LoongArch and use generic DGEMM kernel otherwise See: https://bugs.gentoo.org/844013 --- Makefile.system | 1 + c_check | 27 ++++++++++++++++++++++++++- kernel/loongarch64/KERNEL.LOONGSON3R5 | 5 +++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Makefile.system b/Makefile.system index 9c91425b0f..b86aafbddb 100644 --- a/Makefile.system +++ b/Makefile.system @@ -1702,6 +1702,7 @@ export TARGET_CORE export NO_AVX512 export NO_AVX2 export BUILD_BFLOAT16 +export NO_LASX export SBGEMM_UNROLL_M export SBGEMM_UNROLL_N diff --git a/c_check b/c_check index 01d4f4a7cf..a37e91f82c 100755 --- a/c_check +++ b/c_check @@ -112,7 +112,7 @@ case "$architecture" in defined=1 ;; arm|arm64) defined=1 ;; - zarch|e2k|alpha|ia64|riscv64|loonarch64) + zarch|e2k|alpha|ia64|riscv64|loongarch64) defined=1 BINARY=64 ;; @@ -240,6 +240,29 @@ if [ "$architecture" = "riscv64" ]; then rm -rf "$tmpd" fi +no_lasx=0 +if [ "$architecture" = "loongarch64" ]; then + tmpd=`mktemp -d` + tmpf="$tmpd/a.c" + # Old-world assembly flavor: LASX registers named "$xrNN", different + # from the ISA manual which suggests "$xNN". This is the flavor we + # currently support. + # + # As the LASX ISA manual is not out yet, we cannot predict what the + # new-world flavor would look like, so do not probe flavor for now. + # The compiler flags are also unsuitable for new-world gcc. + code='"xvld $xr0, $a0, 0\n"' + printf "int main(void){ __asm__ volatile(%s); }\n" "$code" >> "$tmpf" + args=" -march=loongarch64 -mabi=lp64 -mlasx -c -o $tmpf.o $tmpf" + no_lasx=0 + { + $compiler_name $flags $args >/dev/null 2>&1 + } || { + no_lasx=1 + } + rm -rf "$tmpd" +fi + c11_atomics=0 case "$data" in *HAVE_C11*) @@ -350,6 +373,7 @@ done [ "$makefile" = "-" ] && { [ "$no_rv64gv" -eq 1 ] && printf "NO_RV64GV=1\n" + [ "$no_lasx" -eq 1 ] && printf "NO_LASX=1\n" [ "$no_avx512" -eq 1 ] && printf "NO_AVX512=1\n" [ "$no_avx2" -eq 1 ] && printf "NO_AVX2=1\n" [ "$oldgcc" -eq 1 ] && printf "OLDGCC=1\n" @@ -380,6 +404,7 @@ done printf "MSA_FLAGS=%s\n" "$msa_flags" } [ "$no_rv64gv" -eq 1 ] && printf "NO_RV64GV=1\n" + [ "$no_lasx" -eq 1 ] && printf "NO_LASX=1\n" [ "$no_avx512" -eq 1 ] && printf "NO_AVX512=1\n" [ "$no_avx2" -eq 1 ] && printf "NO_AVX2=1\n" [ "$oldgcc" -eq 1 ] && printf "OLDGCC=1\n" diff --git a/kernel/loongarch64/KERNEL.LOONGSON3R5 b/kernel/loongarch64/KERNEL.LOONGSON3R5 index cda3590402..79b57d1e4d 100644 --- a/kernel/loongarch64/KERNEL.LOONGSON3R5 +++ b/kernel/loongarch64/KERNEL.LOONGSON3R5 @@ -1,3 +1,7 @@ +ifeq ($(NO_LASX), 1) +# No LASX support in compiler, unable to consume the optimized version +# leave out DGEMMKERNEL to pull in the generic version +else DGEMMKERNEL = dgemm_kernel_16x4.S DGEMMINCOPY = dgemm_ncopy_16.S DGEMMITCOPY = dgemm_tcopy_16.S @@ -7,6 +11,7 @@ DGEMMINCOPYOBJ = dgemm_incopy$(TSUFFIX).$(SUFFIX) DGEMMITCOPYOBJ = dgemm_itcopy$(TSUFFIX).$(SUFFIX) DGEMMONCOPYOBJ = dgemm_oncopy$(TSUFFIX).$(SUFFIX) DGEMMOTCOPYOBJ = dgemm_otcopy$(TSUFFIX).$(SUFFIX) +endif DTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c DTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c From 699c57d3767c9a5a5a69262a4b70a1f80e0bb2e2 Mon Sep 17 00:00:00 2001 From: WANG Xuerui Date: Fri, 13 May 2022 16:23:46 +0800 Subject: [PATCH 3/3] Fix ABI CFLAGS setting on new-world LoongArch See: https://bugs.gentoo.org/844013 --- Makefile.loongarch64 | 13 +++++++++++-- Makefile.system | 1 + c_check | 14 ++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Makefile.loongarch64 b/Makefile.loongarch64 index fced1a9462..d6cbe848cd 100644 --- a/Makefile.loongarch64 +++ b/Makefile.loongarch64 @@ -1,4 +1,13 @@ ifeq ($(CORE), LOONGSON3R5) -CCOMMON_OPT += -march=loongarch64 -mabi=lp64 -FCOMMON_OPT += -march=loongarch64 -mabi=lp64 +CCOMMON_OPT += -march=loongarch64 +FCOMMON_OPT += -march=loongarch64 + +ifeq ($(LOONGARCH_CC_FLAVOR), NEW) +CCOMMON_OPT += -mabi=lp64d +FCOMMON_OPT += -mabi=lp64d +endif +ifeq ($(LOONGARCH_CC_FLAVOR), OLD) +CCOMMON_OPT += -mabi=lp64 +FCOMMON_OPT += -mabi=lp64 +endif endif diff --git a/Makefile.system b/Makefile.system index b86aafbddb..4360a861cb 100644 --- a/Makefile.system +++ b/Makefile.system @@ -1702,6 +1702,7 @@ export TARGET_CORE export NO_AVX512 export NO_AVX2 export BUILD_BFLOAT16 +export LOONGARCH_CC_FLAVOR export NO_LASX export SBGEMM_UNROLL_M diff --git a/c_check b/c_check index a37e91f82c..573f0e52fd 100755 --- a/c_check +++ b/c_check @@ -240,8 +240,19 @@ if [ "$architecture" = "riscv64" ]; then rm -rf "$tmpd" fi +loongarch_cc_flavor="" no_lasx=0 if [ "$architecture" = "loongarch64" ]; then + # Currently there are only 2 flavors: new-world and old-world. + # They differ in ABI names accepted, so check it to avoid creating temp + # files. + loongarch_cc_flavor="NEW" + { + $compiler_name -mabi=lp64d -E -o - /dev/null >/dev/null 2>&1 + } || { + loongarch_cc_flavor="OLD" + } + tmpd=`mktemp -d` tmpf="$tmpd/a.c" # Old-world assembly flavor: LASX registers named "$xrNN", different @@ -260,6 +271,7 @@ if [ "$architecture" = "loongarch64" ]; then } || { no_lasx=1 } + rm -rf "$tmpd" fi @@ -377,6 +389,7 @@ done [ "$no_avx512" -eq 1 ] && printf "NO_AVX512=1\n" [ "$no_avx2" -eq 1 ] && printf "NO_AVX2=1\n" [ "$oldgcc" -eq 1 ] && printf "OLDGCC=1\n" + [ -n "$loongarch_cc_flavor" ] && printf "LOONGARCH_CC_FLAVOR=%s\n" "$loongarch_cc_flavor" exit 0 } @@ -408,6 +421,7 @@ done [ "$no_avx512" -eq 1 ] && printf "NO_AVX512=1\n" [ "$no_avx2" -eq 1 ] && printf "NO_AVX2=1\n" [ "$oldgcc" -eq 1 ] && printf "OLDGCC=1\n" + [ -n "$loongarch_cc_flavor" ] && printf "LOONGARCH_CC_FLAVOR=%s\n" "$loongarch_cc_flavor" } >> "$makefile" os=`echo "$os" | tr '[[:lower:]]' '[[:upper:]]'/ `