https://github.com/xianyi/OpenBLAS/pull/3626, rebased on top of v0.3.20. From: WANG Xuerui Date: Fri, 13 May 2022 15:26:33 +0800 Subject: [PATCH 1/3] Move LoongArch make rules to Makefile.loongarch64 --- 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 --- a/Makefile.system +++ b/Makefile.system @@ -886,13 +886,6 @@ ifeq ($(OSNAME), AIX) BINARY_DEFINED = 1 endif -ifeq ($(ARCH), loongarch64) -ifeq ($(CORE), LOONGSON3R5) -CCOMMON_OPT += -march=loongarch64 -mabi=lp64 -FCOMMON_OPT += -march=loongarch64 -mabi=lp64 -endif -endif - endif ifndef BINARY_DEFINED 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 --- a/Makefile.system +++ b/Makefile.system @@ -1683,6 +1683,7 @@ export TARGET_CORE export NO_AVX512 export NO_AVX2 export BUILD_BFLOAT16 +export NO_LASX export SBGEMM_UNROLL_M export SBGEMM_UNROLL_N --- a/c_check +++ b/c_check @@ -270,6 +270,37 @@ if (($architecture eq "x86") || ($architecture eq "x86_64")) { } } +$no_lasx = 0; +if (($architecture eq "loongarch64")) { + eval "use File::Temp qw(tempfile)"; + if ($@){ + warn "could not load PERL module File::Temp, so could not check compiler compatibility with the LoongArch LASX extension"; + # Assume no LASX, because currently LASX is only present in vendor + # toolchains, undocumented nor upstreamed. + $no_lasx = 1; + } else { + # 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. + ($fh,$tmpf) = tempfile( SUFFIX => '.c' , UNLINK => 1 ); + $code = '"xvld $xr0, $a0, 0\n"'; + print $fh "int main(void){ __asm__ volatile($code); }\n"; + $args = " -march=loongarch64 -mabi=lp64 -mlasx -c -o $tmpf.o $tmpf"; + my @cmd = ("$compiler_name $flags $args >/dev/null 2>/dev/null"); + system(@cmd) == 0; + if ($? != 0) { + $no_lasx = 1; + } else { + $no_lasx = 0; + } + unlink("$tmpf.o"); + } +} + $c11_atomics = 0; if ($data =~ /HAVE_C11/) { eval "use File::Temp qw(tempfile)"; @@ -393,6 +424,7 @@ print MAKEFILE "HAVE_MSA=1\n" if $have_msa eq 1; print MAKEFILE "MSA_FLAGS=$msa_flags\n" if $have_msa eq 1; print MAKEFILE "NO_AVX512=1\n" if $no_avx512 eq 1; print MAKEFILE "NO_AVX2=1\n" if $no_avx2 eq 1; +print MAKEFILE "NO_LASX=1\n" if $no_lasx eq 1; print MAKEFILE "OLDGCC=1\n" if $oldgcc eq 1; $os =~ tr/[a-z]/[A-Z]/; --- 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.o DGEMMITCOPYOBJ = dgemm_itcopy.o DGEMMONCOPYOBJ = dgemm_oncopy.o DGEMMOTCOPYOBJ = dgemm_otcopy.o +endif DTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c DTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c 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 --- 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 --- a/Makefile.system +++ b/Makefile.system @@ -1683,6 +1683,7 @@ export TARGET_CORE export NO_AVX512 export NO_AVX2 export BUILD_BFLOAT16 +export LOONGARCH_CC_FLAVOR export NO_LASX export SBGEMM_UNROLL_M --- a/c_check +++ b/c_check @@ -270,6 +270,21 @@ if (($architecture eq "x86") || ($architecture eq "x86_64")) { } } +$loongarch_cc_flavor = ""; +if (($architecture eq "loongarch64")) { + # 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. + $args = " -mabi=lp64d -E -o - /dev/null"; + my @cmd = ("$compiler_name $flags $args >/dev/null 2>/dev/null"); + system(@cmd) == 0; + if ($? != 0) { + $loongarch_cc_flavor = "OLD"; + } else { + $loongarch_cc_flavor = "NEW"; + } +} + $no_lasx = 0; if (($architecture eq "loongarch64")) { eval "use File::Temp qw(tempfile)"; @@ -424,6 +439,7 @@ print MAKEFILE "HAVE_MSA=1\n" if $have_msa eq 1; print MAKEFILE "MSA_FLAGS=$msa_flags\n" if $have_msa eq 1; print MAKEFILE "NO_AVX512=1\n" if $no_avx512 eq 1; print MAKEFILE "NO_AVX2=1\n" if $no_avx2 eq 1; +print MAKEFILE "LOONGARCH_CC_FLAVOR=$loongarch_cc_flavor\n" if $architecture eq "loongarch64"; print MAKEFILE "NO_LASX=1\n" if $no_lasx eq 1; print MAKEFILE "OLDGCC=1\n" if $oldgcc eq 1;