summaryrefslogtreecommitdiff
path: root/sci-libs/openblas/files/openblas-0.3.21-fix-loong.patch
blob: ed112d62380b0645100c55ebc784d1c56d4aa7a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
https://github.com/xianyi/OpenBLAS/pull/3626

From 5af7b8638b3b972bd0e25597ec07927fffd52108 Mon Sep 17 00:00:00 2001
From: WANG Xuerui <xen0n@gentoo.org>
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 <xen0n@gentoo.org>
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 <xen0n@gentoo.org>
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:]]'/ `