fix build error
[platform/upstream/openblas.git] / kernel / mips / strsm_kernel_RN_8x8_msa.c
1 /*******************************************************************************
2 Copyright (c) 2016, The OpenBLAS Project
3 All rights reserved.
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are
6 met:
7 1. Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 2. Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in
11 the documentation and/or other materials provided with the
12 distribution.
13 3. Neither the name of the OpenBLAS project nor the names of
14 its contributors may be used to endorse or promote products
15 derived from this software without specific prior written permission.
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBLAS PROJECT OR CONTRIBUTORS BE
20 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
25 USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 *******************************************************************************/
27
28 #include "common.h"
29 #include "macros_msa.h"
30
31 static void ssolve_8x8_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
32 {
33     v4f32 src_c0, src_c1, src_c2, src_c3, src_c4, src_c5, src_c6, src_c7;
34     v4f32 src_c8, src_c9, src_c10, src_c11, src_c12, src_c13, src_c14, src_c15;
35     v4f32 src_b0, src_b1, src_b2, src_b3, src_b4, src_b5, src_b6, src_b7;
36     v4f32 src_b9, src_b10, src_b11, src_b12, src_b13, src_b14, src_b15, src_b18;
37     v4f32 src_b19, src_b20, src_b21, src_b22, src_b23, src_b27, src_b28;
38     v4f32 src_b29, src_b30, src_b31, src_b36, src_b37, src_b38, src_b39;
39     v4f32 src_b45, src_b46, src_b47, src_b54, src_b55, src_b63, src_b;
40     FLOAT *c_nxt1line = c + ldc;
41     FLOAT *c_nxt2line = c + 2 * ldc;
42     FLOAT *c_nxt3line = c + 3 * ldc;
43     FLOAT *c_nxt4line = c + 4 * ldc;
44     FLOAT *c_nxt5line = c + 5 * ldc;
45     FLOAT *c_nxt6line = c + 6 * ldc;
46     FLOAT *c_nxt7line = c + 7 * ldc;
47
48     LD_SP2(c, 4, src_c0, src_c1);
49     LD_SP2(c_nxt1line, 4, src_c2, src_c3);
50     LD_SP2(c_nxt2line, 4, src_c4, src_c5);
51     LD_SP2(c_nxt3line, 4, src_c6, src_c7);
52     LD_SP2(c_nxt4line, 4, src_c8, src_c9);
53     LD_SP2(c_nxt5line, 4, src_c10, src_c11);
54     LD_SP2(c_nxt6line, 4, src_c12, src_c13);
55     LD_SP2(c_nxt7line, 4, src_c14, src_c15);
56
57     if (bk > 0)
58     {
59         BLASLONG k, pref_offset;
60         FLOAT *pa0_pref;
61         v4f32 src_a0, src_a1, src_bb0, src_bb1;
62
63         pref_offset = (uintptr_t)a & (L1_DATA_LINESIZE - 1);
64
65         if (pref_offset)
66         {
67             pref_offset = L1_DATA_LINESIZE - pref_offset;
68             pref_offset = pref_offset / sizeof(FLOAT);
69         }
70
71         pa0_pref = a + pref_offset;
72
73         for (k = 0; k < (bk >> 1); k++)
74         {
75             PREF_OFFSET(pa0_pref, 64);
76             PREF_OFFSET(pa0_pref, 96);
77
78             LD_SP2_INC(a, 4, src_a0, src_a1);
79             LD_SP2_INC(b, 4, src_bb0, src_bb1);
80
81             SPLATI_W4_SP(src_bb0, src_b0, src_b1, src_b2, src_b3);
82             src_c0 -= src_a0 * src_b0;
83             src_c1 -= src_a1 * src_b0;
84             src_c2 -= src_a0 * src_b1;
85             src_c3 -= src_a1 * src_b1;
86             src_c4 -= src_a0 * src_b2;
87             src_c5 -= src_a1 * src_b2;
88             src_c6 -= src_a0 * src_b3;
89             src_c7 -= src_a1 * src_b3;
90
91             SPLATI_W4_SP(src_bb1, src_b0, src_b1, src_b2, src_b3);
92             src_c8 -= src_a0 * src_b0;
93             src_c9 -= src_a1 * src_b0;
94             src_c10 -= src_a0 * src_b1;
95             src_c11 -= src_a1 * src_b1;
96             src_c12 -= src_a0 * src_b2;
97             src_c13 -= src_a1 * src_b2;
98             src_c14 -= src_a0 * src_b3;
99             src_c15 -= src_a1 * src_b3;
100
101             LD_SP2_INC(a, 4, src_a0, src_a1);
102             LD_SP2_INC(b, 4, src_bb0, src_bb1);
103
104             SPLATI_W4_SP(src_bb0, src_b0, src_b1, src_b2, src_b3);
105             src_c0 -= src_a0 * src_b0;
106             src_c1 -= src_a1 * src_b0;
107             src_c2 -= src_a0 * src_b1;
108             src_c3 -= src_a1 * src_b1;
109             src_c4 -= src_a0 * src_b2;
110             src_c5 -= src_a1 * src_b2;
111             src_c6 -= src_a0 * src_b3;
112             src_c7 -= src_a1 * src_b3;
113
114             SPLATI_W4_SP(src_bb1, src_b0, src_b1, src_b2, src_b3);
115             src_c8 -= src_a0 * src_b0;
116             src_c9 -= src_a1 * src_b0;
117             src_c10 -= src_a0 * src_b1;
118             src_c11 -= src_a1 * src_b1;
119             src_c12 -= src_a0 * src_b2;
120             src_c13 -= src_a1 * src_b2;
121             src_c14 -= src_a0 * src_b3;
122             src_c15 -= src_a1 * src_b3;
123
124             pa0_pref += 16;
125         }
126
127         if (bk & 1)
128         {
129             LD_SP2_INC(a, 4, src_a0, src_a1);
130             LD_SP2_INC(b, 4, src_bb0, src_bb1);
131
132             SPLATI_W4_SP(src_bb0, src_b0, src_b1, src_b2, src_b3);
133             src_c0 -= src_a0 * src_b0;
134             src_c1 -= src_a1 * src_b0;
135             src_c2 -= src_a0 * src_b1;
136             src_c3 -= src_a1 * src_b1;
137             src_c4 -= src_a0 * src_b2;
138             src_c5 -= src_a1 * src_b2;
139             src_c6 -= src_a0 * src_b3;
140             src_c7 -= src_a1 * src_b3;
141
142             SPLATI_W4_SP(src_bb1, src_b0, src_b1, src_b2, src_b3);
143             src_c8 -= src_a0 * src_b0;
144             src_c9 -= src_a1 * src_b0;
145             src_c10 -= src_a0 * src_b1;
146             src_c11 -= src_a1 * src_b1;
147             src_c12 -= src_a0 * src_b2;
148             src_c13 -= src_a1 * src_b2;
149             src_c14 -= src_a0 * src_b3;
150             src_c15 -= src_a1 * src_b3;
151         }
152     }
153
154     src_b = LD_SP(b + 0);
155     SPLATI_W4_SP(src_b, src_b0, src_b1, src_b2, src_b3);
156     src_b = LD_SP(b + 4);
157     SPLATI_W4_SP(src_b, src_b4, src_b5, src_b6, src_b7);
158
159     src_b = LD_SP(b + 9);
160     SPLATI_W4_SP(src_b, src_b9, src_b10, src_b11, src_b12);
161     src_b13 = LD_SP(b + 13);
162     src_b15 = (v4f32) __msa_splati_w((v4i32) src_b13, 2);
163     src_b14 = (v4f32) __msa_splati_w((v4i32) src_b13, 1);
164     src_b13 = (v4f32) __msa_splati_w((v4i32) src_b13, 0);
165
166     src_c0 *= src_b0;
167     src_c1 *= src_b0;
168     src_c2 -= src_c0 * src_b1;
169     src_c3 -= src_c1 * src_b1;
170     src_c4 -= src_c0 * src_b2;
171     src_c5 -= src_c1 * src_b2;
172     src_c6 -= src_c0 * src_b3;
173     src_c7 -= src_c1 * src_b3;
174     src_c8 -= src_c0 * src_b4;
175     src_c9 -= src_c1 * src_b4;
176     src_c10 -= src_c0 * src_b5;
177     src_c11 -= src_c1 * src_b5;
178     src_c12 -= src_c0 * src_b6;
179     src_c13 -= src_c1 * src_b6;
180     src_c14 -= src_c0 * src_b7;
181     src_c15 -= src_c1 * src_b7;
182
183     ST_SP2(src_c0, src_c1, a, 4);
184     ST_SP2(src_c0, src_c1, c, 4);
185
186     src_c2 *= src_b9;
187     src_c3 *= src_b9;
188     src_c4 -= src_c2 * src_b10;
189     src_c5 -= src_c3 * src_b10;
190     src_c6 -= src_c2 * src_b11;
191     src_c7 -= src_c3 * src_b11;
192     src_c8 -= src_c2 * src_b12;
193     src_c9 -= src_c3 * src_b12;
194     src_c10 -= src_c2 * src_b13;
195     src_c11 -= src_c3 * src_b13;
196     src_c12 -= src_c2 * src_b14;
197     src_c13 -= src_c3 * src_b14;
198     src_c14 -= src_c2 * src_b15;
199     src_c15 -= src_c3 * src_b15;
200
201     ST_SP2(src_c2, src_c3, a + 8, 4);
202     ST_SP2(src_c2, src_c3, c_nxt1line, 4);
203
204     src_b = LD_SP(b + 18);
205     SPLATI_W4_SP(src_b, src_b18, src_b19, src_b20, src_b21);
206     src_b22 = LD_SP(b + 22);
207     src_b23 = (v4f32) __msa_splati_w((v4i32) src_b22, 1);
208     src_b22 = (v4f32) __msa_splati_w((v4i32) src_b22, 0);
209
210     src_b = LD_SP(b + 27);
211     SPLATI_W4_SP(src_b, src_b27, src_b28, src_b29, src_b30);
212     src_b31 = COPY_FLOAT_TO_VECTOR(*(b + 31));
213
214     src_c4 *= src_b18;
215     src_c5 *= src_b18;
216     src_c6 -= src_c4 * src_b19;
217     src_c7 -= src_c5 * src_b19;
218     src_c8 -= src_c4 * src_b20;
219     src_c9 -= src_c5 * src_b20;
220     src_c10 -= src_c4 * src_b21;
221     src_c11 -= src_c5 * src_b21;
222     src_c12 -= src_c4 * src_b22;
223     src_c13 -= src_c5 * src_b22;
224     src_c14 -= src_c4 * src_b23;
225     src_c15 -= src_c5 * src_b23;
226
227     ST_SP2(src_c4, src_c5, a + 16, 4);
228     ST_SP2(src_c4, src_c5, c_nxt2line, 4);
229
230     src_c6 *= src_b27;
231     src_c7 *= src_b27;
232     src_c8 -= src_c6 * src_b28;
233     src_c9 -= src_c7 * src_b28;
234     src_c10 -= src_c6 * src_b29;
235     src_c11 -= src_c7 * src_b29;
236     src_c12 -= src_c6 * src_b30;
237     src_c13 -= src_c7 * src_b30;
238     src_c14 -= src_c6 * src_b31;
239     src_c15 -= src_c7 * src_b31;
240
241     ST_SP2(src_c6, src_c7, a + 24, 4);
242     ST_SP2(src_c6, src_c7, c_nxt3line, 4);
243
244     src_b = LD_SP(b + 36);
245     SPLATI_W4_SP(src_b, src_b36, src_b37, src_b38, src_b39);
246
247     src_b45 = LD_SP(b + 45);
248     src_b47 = (v4f32) __msa_splati_w((v4i32) src_b45, 2);
249     src_b46 = (v4f32) __msa_splati_w((v4i32) src_b45, 1);
250     src_b45 = (v4f32) __msa_splati_w((v4i32) src_b45, 0);
251
252     src_b54 = COPY_FLOAT_TO_VECTOR(*(b + 54));
253     src_b55 = COPY_FLOAT_TO_VECTOR(*(b + 55));
254     src_b63 = COPY_FLOAT_TO_VECTOR(*(b + 63));
255
256     src_c8 *= src_b36;
257     src_c9 *= src_b36;
258     src_c10 -= src_c8 * src_b37;
259     src_c11 -= src_c9 * src_b37;
260     src_c12 -= src_c8 * src_b38;
261     src_c13 -= src_c9 * src_b38;
262     src_c14 -= src_c8 * src_b39;
263     src_c15 -= src_c9 * src_b39;
264
265     ST_SP2(src_c8, src_c9, a + 32, 4);
266     ST_SP2(src_c8, src_c9, c_nxt4line, 4);
267
268     src_c10 *= src_b45;
269     src_c11 *= src_b45;
270     src_c12 -= src_c10 * src_b46;
271     src_c13 -= src_c11 * src_b46;
272     src_c14 -= src_c10 * src_b47;
273     src_c15 -= src_c11 * src_b47;
274
275     ST_SP2(src_c10, src_c11, a + 40, 4);
276     ST_SP2(src_c10, src_c11, c_nxt5line, 4);
277
278     src_c12 *= src_b54;
279     src_c13 *= src_b54;
280     src_c14 -= src_c12 * src_b55;
281     src_c15 -= src_c13 * src_b55;
282
283     ST_SP2(src_c12, src_c13, a + 48, 4);
284     ST_SP2(src_c12, src_c13, c_nxt6line, 4);
285
286     src_c14 *= src_b63;
287     src_c15 *= src_b63;
288
289     ST_SP2(src_c14, src_c15, a + 56, 4);
290     ST_SP2(src_c14, src_c15, c_nxt7line, 4);
291 }
292
293 static void ssolve_8x4_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
294 {
295     BLASLONG k;
296     v4f32 src_c0, src_c1, src_c2, src_c3, src_c4, src_c5, src_c6, src_c7;
297     v4f32 src_b0, src_b1, src_b2, src_b3, src_b5, src_b6, src_b7;
298     v4f32 src_b10, src_b11, src_b15, src_b, src_a0, src_a1;
299     FLOAT *c_nxt1line = c + ldc;
300     FLOAT *c_nxt2line = c + 2 * ldc;
301     FLOAT *c_nxt3line = c + 3 * ldc;
302
303     LD_SP2(c, 4, src_c0, src_c1);
304     LD_SP2(c_nxt1line, 4, src_c2, src_c3);
305     LD_SP2(c_nxt2line, 4, src_c4, src_c5);
306     LD_SP2(c_nxt3line, 4, src_c6, src_c7);
307
308     for (k = 0; k < (bk >> 1); k++)
309     {
310         LD_SP2(a, 4, src_a0, src_a1);
311
312         src_b = LD_SP(b + 0);
313         SPLATI_W4_SP(src_b, src_b0, src_b1, src_b2, src_b3);
314         src_c0 -= src_a0 * src_b0;
315         src_c1 -= src_a1 * src_b0;
316         src_c2 -= src_a0 * src_b1;
317         src_c3 -= src_a1 * src_b1;
318         src_c4 -= src_a0 * src_b2;
319         src_c5 -= src_a1 * src_b2;
320         src_c6 -= src_a0 * src_b3;
321         src_c7 -= src_a1 * src_b3;
322
323         a += 8;
324         b += 4;
325
326         LD_SP2(a, 4, src_a0, src_a1);
327
328         src_b = LD_SP(b + 0);
329         SPLATI_W4_SP(src_b, src_b0, src_b1, src_b2, src_b3);
330         src_c0 -= src_a0 * src_b0;
331         src_c1 -= src_a1 * src_b0;
332         src_c2 -= src_a0 * src_b1;
333         src_c3 -= src_a1 * src_b1;
334         src_c4 -= src_a0 * src_b2;
335         src_c5 -= src_a1 * src_b2;
336         src_c6 -= src_a0 * src_b3;
337         src_c7 -= src_a1 * src_b3;
338
339         a += 8;
340         b += 4;
341     }
342
343     if ((bk & 1) && (bk > 0))
344     {
345         LD_SP2(a, 4, src_a0, src_a1);
346
347         src_b = LD_SP(b + 0);
348         SPLATI_W4_SP(src_b, src_b0, src_b1, src_b2, src_b3);
349         src_c0 -= src_a0 * src_b0;
350         src_c1 -= src_a1 * src_b0;
351         src_c2 -= src_a0 * src_b1;
352         src_c3 -= src_a1 * src_b1;
353         src_c4 -= src_a0 * src_b2;
354         src_c5 -= src_a1 * src_b2;
355         src_c6 -= src_a0 * src_b3;
356         src_c7 -= src_a1 * src_b3;
357
358         a += 8;
359         b += 4;
360     }
361
362     src_b = LD_SP(b + 0);
363     SPLATI_W4_SP(src_b, src_b0, src_b1, src_b2, src_b3);
364     src_b5 = LD_SP(b + 5);
365     src_b7 = (v4f32) __msa_splati_w((v4i32) src_b5, 2);
366     src_b6 = (v4f32) __msa_splati_w((v4i32) src_b5, 1);
367     src_b5 = (v4f32) __msa_splati_w((v4i32) src_b5, 0);
368     src_b10 = COPY_FLOAT_TO_VECTOR(*(b + 10));
369     src_b11 = COPY_FLOAT_TO_VECTOR(*(b + 11));
370     src_b15 = COPY_FLOAT_TO_VECTOR(*(b + 15));
371
372     src_c0 *= src_b0;
373     src_c1 *= src_b0;
374     src_c2 -= src_c0 * src_b1;
375     src_c3 -= src_c1 * src_b1;
376     src_c4 -= src_c0 * src_b2;
377     src_c5 -= src_c1 * src_b2;
378     src_c6 -= src_c0 * src_b3;
379     src_c7 -= src_c1 * src_b3;
380
381     src_c2 *= src_b5;
382     src_c3 *= src_b5;
383     src_c4 -= src_c2 * src_b6;
384     src_c5 -= src_c3 * src_b6;
385     src_c6 -= src_c2 * src_b7;
386     src_c7 -= src_c3 * src_b7;
387
388     src_c4 *= src_b10;
389     src_c5 *= src_b10;
390     src_c6 -= src_c4 * src_b11;
391     src_c7 -= src_c5 * src_b11;
392
393     src_c6 *= src_b15;
394     src_c7 *= src_b15;
395
396     ST_SP4(src_c0, src_c1, src_c2, src_c3, a, 4);
397     ST_SP4(src_c4, src_c5, src_c6, src_c7, a + 16, 4);
398
399     ST_SP2(src_c0, src_c1, c, 4);
400     ST_SP2(src_c2, src_c3, c_nxt1line, 4);
401     ST_SP2(src_c4, src_c5, c_nxt2line, 4);
402     ST_SP2(src_c6, src_c7, c_nxt3line, 4);
403 }
404
405 static void ssolve_8x2_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
406 {
407     BLASLONG k;
408     v4f32 src_a0, src_a1;
409     v4f32 src_c0, src_c1, src_c2, src_c3, src_b0, src_b1, src_b3;
410     FLOAT *c_nxt1line = c + ldc;
411
412     LD_SP2(c, 4, src_c0, src_c1);
413     LD_SP2(c_nxt1line, 4, src_c2, src_c3);
414
415     for (k = 0; k < (bk >> 1); k++)
416     {
417         LD_SP2(a, 4, src_a0, src_a1);
418
419         src_b0 = COPY_FLOAT_TO_VECTOR(*(b + 0));
420         src_b1 = COPY_FLOAT_TO_VECTOR(*(b + 1));
421
422         src_c0 -= src_a0 * src_b0;
423         src_c1 -= src_a1 * src_b0;
424         src_c2 -= src_a0 * src_b1;
425         src_c3 -= src_a1 * src_b1;
426
427         a += 8;
428         b += 2;
429
430         LD_SP2(a, 4, src_a0, src_a1);
431
432         src_b0 = COPY_FLOAT_TO_VECTOR(*(b + 0));
433         src_b1 = COPY_FLOAT_TO_VECTOR(*(b + 1));
434
435         src_c0 -= src_a0 * src_b0;
436         src_c1 -= src_a1 * src_b0;
437         src_c2 -= src_a0 * src_b1;
438         src_c3 -= src_a1 * src_b1;
439
440         a += 8;
441         b += 2;
442     }
443
444     if ((bk & 1) && (bk > 0))
445     {
446         LD_SP2(a, 4, src_a0, src_a1);
447
448         src_b0 = COPY_FLOAT_TO_VECTOR(*(b + 0));
449         src_b1 = COPY_FLOAT_TO_VECTOR(*(b + 1));
450
451         src_c0 -= src_a0 * src_b0;
452         src_c1 -= src_a1 * src_b0;
453         src_c2 -= src_a0 * src_b1;
454         src_c3 -= src_a1 * src_b1;
455
456         a += 8;
457         b += 2;
458     }
459
460     src_b0 = COPY_FLOAT_TO_VECTOR(*(b + 0));
461     src_b1 = COPY_FLOAT_TO_VECTOR(*(b + 1));
462     src_b3 = COPY_FLOAT_TO_VECTOR(*(b + 3));
463
464     src_c0 *= src_b0;
465     src_c1 *= src_b0;
466     src_c2 -= src_c0 * src_b1;
467     src_c3 -= src_c1 * src_b1;
468     src_c2 *= src_b3;
469     src_c3 *= src_b3;
470
471     ST_SP4(src_c0, src_c1, src_c2, src_c3, a, 4);
472     ST_SP2(src_c0, src_c1, c, 4);
473     ST_SP2(src_c2, src_c3, c_nxt1line, 4);
474 }
475
476 static void ssolve_8x1_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
477 {
478     BLASLONG k;
479     v4f32 src_a0, src_a1, src_c0, src_c1, src_b0;
480
481     LD_SP2(c, 4, src_c0, src_c1);
482
483     for (k = 0; k < (bk >> 2); k++)
484     {
485         LD_SP2(a, 4, src_a0, src_a1);
486
487         src_b0 = COPY_FLOAT_TO_VECTOR(*(b + 0));
488
489         src_c0 -= src_a0 * src_b0;
490         src_c1 -= src_a1 * src_b0;
491
492         a += 8;
493         b += 1;
494
495         LD_SP2(a, 4, src_a0, src_a1);
496
497         src_b0 = COPY_FLOAT_TO_VECTOR(*(b + 0));
498
499         src_c0 -= src_a0 * src_b0;
500         src_c1 -= src_a1 * src_b0;
501
502         a += 8;
503         b += 1;
504
505         LD_SP2(a, 4, src_a0, src_a1);
506
507         src_b0 = COPY_FLOAT_TO_VECTOR(*(b + 0));
508
509         src_c0 -= src_a0 * src_b0;
510         src_c1 -= src_a1 * src_b0;
511
512         a += 8;
513         b += 1;
514
515         LD_SP2(a, 4, src_a0, src_a1);
516
517         src_b0 = COPY_FLOAT_TO_VECTOR(*(b + 0));
518
519         src_c0 -= src_a0 * src_b0;
520         src_c1 -= src_a1 * src_b0;
521
522         a += 8;
523         b += 1;
524     }
525
526     if ((bk & 3) && (bk > 0))
527     {
528         if (bk & 2)
529         {
530             LD_SP2(a, 4, src_a0, src_a1);
531
532             src_b0 = COPY_FLOAT_TO_VECTOR(*(b + 0));
533
534             src_c0 -= src_a0 * src_b0;
535             src_c1 -= src_a1 * src_b0;
536
537             a += 8;
538             b += 1;
539
540             LD_SP2(a, 4, src_a0, src_a1);
541
542             src_b0 = COPY_FLOAT_TO_VECTOR(*(b + 0));
543
544             src_c0 -= src_a0 * src_b0;
545             src_c1 -= src_a1 * src_b0;
546
547             a += 8;
548             b += 1;
549         }
550
551         if (bk & 1)
552         {
553             LD_SP2(a, 4, src_a0, src_a1);
554
555             src_b0 = COPY_FLOAT_TO_VECTOR(*(b + 0));
556
557             src_c0 -= src_a0 * src_b0;
558             src_c1 -= src_a1 * src_b0;
559
560             a += 8;
561             b += 1;
562         }
563     }
564
565     src_b0 = COPY_FLOAT_TO_VECTOR(*(b + 0));
566
567     src_c0 *= src_b0;
568     src_c1 *= src_b0;
569
570     ST_SP2(src_c0, src_c1, a, 4);
571     ST_SP2(src_c0, src_c1, c, 4);
572 }
573
574 static void ssolve_4x8_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
575 {
576     BLASLONG k;
577     v4f32 src_c0, src_c1, src_c2, src_c3, src_c4, src_c5, src_c6, src_c7;
578     v4f32 src_b0, src_b1, src_b2, src_b3, src_b4, src_b5, src_b6, src_b7;
579     v4f32 src_b9, src_b10, src_b11, src_b12, src_b13, src_b14, src_b15, src_b18;
580     v4f32 src_b19, src_b20, src_b21, src_b22, src_b23, src_b27, src_b28;
581     v4f32 src_b29, src_b30, src_b31, src_b36, src_b37, src_b38, src_b39;
582     v4f32 src_b45, src_b46, src_b47, src_b54, src_b55, src_b63, src_b, src_a0;
583     FLOAT *c_nxt1line = c + ldc;
584     FLOAT *c_nxt2line = c + 2 * ldc;
585     FLOAT *c_nxt3line = c + 3 * ldc;
586     FLOAT *c_nxt4line = c + 4 * ldc;
587     FLOAT *c_nxt5line = c + 5 * ldc;
588     FLOAT *c_nxt6line = c + 6 * ldc;
589     FLOAT *c_nxt7line = c + 7 * ldc;
590
591     src_c0 = LD_SP(c);
592     src_c1 = LD_SP(c_nxt1line);
593     src_c2 = LD_SP(c_nxt2line);
594     src_c3 = LD_SP(c_nxt3line);
595     src_c4 = LD_SP(c_nxt4line);
596     src_c5 = LD_SP(c_nxt5line);
597     src_c6 = LD_SP(c_nxt6line);
598     src_c7 = LD_SP(c_nxt7line);
599
600     for (k = 0; k < bk; k++)
601     {
602         src_a0 = LD_SP(a);
603
604         src_b = LD_SP(b + 0);
605         SPLATI_W4_SP(src_b, src_b0, src_b1, src_b2, src_b3);
606         src_c0 -= src_a0 * src_b0;
607         src_c1 -= src_a0 * src_b1;
608         src_c2 -= src_a0 * src_b2;
609         src_c3 -= src_a0 * src_b3;
610
611         src_b = LD_SP(b + 4);
612         SPLATI_W4_SP(src_b, src_b0, src_b1, src_b2, src_b3);
613         src_c4 -= src_a0 * src_b0;
614         src_c5 -= src_a0 * src_b1;
615         src_c6 -= src_a0 * src_b2;
616         src_c7 -= src_a0 * src_b3;
617
618         a += 4;
619         b += 8;
620     }
621
622     src_b = LD_SP(b + 0);
623     SPLATI_W4_SP(src_b, src_b0, src_b1, src_b2, src_b3);
624     src_b = LD_SP(b + 4);
625     SPLATI_W4_SP(src_b, src_b4, src_b5, src_b6, src_b7);
626
627     src_b = LD_SP(b + 9);
628     SPLATI_W4_SP(src_b, src_b9, src_b10, src_b11, src_b12);
629     src_b13 = LD_SP(b + 13);
630     src_b15 = (v4f32) __msa_splati_w((v4i32) src_b13, 2);
631     src_b14 = (v4f32) __msa_splati_w((v4i32) src_b13, 1);
632     src_b13 = (v4f32) __msa_splati_w((v4i32) src_b13, 0);
633
634     src_b = LD_SP(b + 18);
635     SPLATI_W4_SP(src_b, src_b18, src_b19, src_b20, src_b21);
636     src_b22 = LD_SP(b + 22);
637     src_b23 = (v4f32) __msa_splati_w((v4i32) src_b22, 1);
638     src_b22 = (v4f32) __msa_splati_w((v4i32) src_b22, 0);
639
640     src_b = LD_SP(b + 27);
641     SPLATI_W4_SP(src_b, src_b27, src_b28, src_b29, src_b30);
642     src_b31 = COPY_FLOAT_TO_VECTOR(*(b + 31));
643
644     src_b = LD_SP(b + 36);
645     SPLATI_W4_SP(src_b, src_b36, src_b37, src_b38, src_b39);
646
647     src_b45 = LD_SP(b + 45);
648     src_b47 = (v4f32) __msa_splati_w((v4i32) src_b45, 2);
649     src_b46 = (v4f32) __msa_splati_w((v4i32) src_b45, 1);
650     src_b45 = (v4f32) __msa_splati_w((v4i32) src_b45, 0);
651
652     src_b54 = COPY_FLOAT_TO_VECTOR(*(b + 54));
653     src_b55 = COPY_FLOAT_TO_VECTOR(*(b + 55));
654     src_b63 = COPY_FLOAT_TO_VECTOR(*(b + 63));
655
656     src_c0 *= src_b0;
657     src_c1 -= src_c0 * src_b1;
658     src_c2 -= src_c0 * src_b2;
659     src_c3 -= src_c0 * src_b3;
660     src_c4 -= src_c0 * src_b4;
661     src_c5 -= src_c0 * src_b5;
662     src_c6 -= src_c0 * src_b6;
663     src_c7 -= src_c0 * src_b7;
664
665     src_c1 *= src_b9;
666     src_c2 -= src_c1 * src_b10;
667     src_c3 -= src_c1 * src_b11;
668     src_c4 -= src_c1 * src_b12;
669     src_c5 -= src_c1 * src_b13;
670     src_c6 -= src_c1 * src_b14;
671     src_c7 -= src_c1 * src_b15;
672
673     src_c2 *= src_b18;
674     src_c3 -= src_c2 * src_b19;
675     src_c4 -= src_c2 * src_b20;
676     src_c5 -= src_c2 * src_b21;
677     src_c6 -= src_c2 * src_b22;
678     src_c7 -= src_c2 * src_b23;
679
680     src_c3 *= src_b27;
681     src_c4 -= src_c3 * src_b28;
682     src_c5 -= src_c3 * src_b29;
683     src_c6 -= src_c3 * src_b30;
684     src_c7 -= src_c3 * src_b31;
685
686     src_c4 *= src_b36;
687     src_c5 -= src_c4 * src_b37;
688     src_c6 -= src_c4 * src_b38;
689     src_c7 -= src_c4 * src_b39;
690
691     src_c5 *= src_b45;
692     src_c6 -= src_c5 * src_b46;
693     src_c7 -= src_c5 * src_b47;
694
695     src_c6 *= src_b54;
696     src_c7 -= src_c6 * src_b55;
697
698     src_c7 *= src_b63;
699
700     ST_SP4(src_c0, src_c1, src_c2, src_c3, a, 4);
701     ST_SP4(src_c4, src_c5, src_c6, src_c7, a + 16, 4);
702
703     ST_SP(src_c0, c);
704     ST_SP(src_c1, c_nxt1line);
705     ST_SP(src_c2, c_nxt2line);
706     ST_SP(src_c3, c_nxt3line);
707     ST_SP(src_c4, c_nxt4line);
708     ST_SP(src_c5, c_nxt5line);
709     ST_SP(src_c6, c_nxt6line);
710     ST_SP(src_c7, c_nxt7line);
711 }
712
713 static void ssolve_4x4_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
714 {
715     BLASLONG k;
716     v4f32 src_c0, src_c1, src_c2, src_c3,  src_b0, src_b1, src_b2, src_b3;
717     v4f32 src_b5, src_b6, src_b7, src_b10, src_b11, src_b15, src_b, src_a0;
718     FLOAT *c_nxt1line = c + ldc;
719     FLOAT *c_nxt2line = c + 2 * ldc;
720     FLOAT *c_nxt3line = c + 3 * ldc;
721
722     src_c0 = LD_SP(c);
723     src_c1 = LD_SP(c_nxt1line);
724     src_c2 = LD_SP(c_nxt2line);
725     src_c3 = LD_SP(c_nxt3line);
726
727     for (k = 0; k < (bk >> 1); k++)
728     {
729         src_a0 = LD_SP(a);
730
731         src_b = LD_SP(b + 0);
732         SPLATI_W4_SP(src_b, src_b0, src_b1, src_b2, src_b3);
733         src_c0 -= src_a0 * src_b0;
734         src_c1 -= src_a0 * src_b1;
735         src_c2 -= src_a0 * src_b2;
736         src_c3 -= src_a0 * src_b3;
737
738         a += 4;
739         b += 4;
740
741         src_a0 = LD_SP(a);
742
743         src_b = LD_SP(b + 0);
744         SPLATI_W4_SP(src_b, src_b0, src_b1, src_b2, src_b3);
745         src_c0 -= src_a0 * src_b0;
746         src_c1 -= src_a0 * src_b1;
747         src_c2 -= src_a0 * src_b2;
748         src_c3 -= src_a0 * src_b3;
749
750         a += 4;
751         b += 4;
752     }
753
754     if ((bk & 1) && (bk > 0))
755     {
756         src_a0 = LD_SP(a);
757
758         src_b = LD_SP(b + 0);
759         SPLATI_W4_SP(src_b, src_b0, src_b1, src_b2, src_b3);
760         src_c0 -= src_a0 * src_b0;
761         src_c1 -= src_a0 * src_b1;
762         src_c2 -= src_a0 * src_b2;
763         src_c3 -= src_a0 * src_b3;
764
765         a += 4;
766         b += 4;
767     }
768
769     src_b = LD_SP(b + 0);
770     SPLATI_W4_SP(src_b, src_b0, src_b1, src_b2, src_b3);
771     src_b5 = LD_SP(b + 5);
772     src_b7 = (v4f32) __msa_splati_w((v4i32) src_b5, 2);
773     src_b6 = (v4f32) __msa_splati_w((v4i32) src_b5, 1);
774     src_b5 = (v4f32) __msa_splati_w((v4i32) src_b5, 0);
775     src_b10 = COPY_FLOAT_TO_VECTOR(*(b + 10));
776     src_b11 = COPY_FLOAT_TO_VECTOR(*(b + 11));
777     src_b15 = COPY_FLOAT_TO_VECTOR(*(b + 15));
778
779     src_c0 *= src_b0;
780     src_c1 -= src_c0 * src_b1;
781     src_c2 -= src_c0 * src_b2;
782     src_c3 -= src_c0 * src_b3;
783
784     src_c1 *= src_b5;
785     src_c2 -= src_c1 * src_b6;
786     src_c3 -= src_c1 * src_b7;
787
788     src_c2 *= src_b10;
789     src_c3 -= src_c2 * src_b11;
790
791     src_c3 *= src_b15;
792
793     ST_SP4(src_c0, src_c1, src_c2, src_c3, a, 4);
794
795     ST_SP(src_c0, c);
796     ST_SP(src_c1, c_nxt1line);
797     ST_SP(src_c2, c_nxt2line);
798     ST_SP(src_c3, c_nxt3line);
799 }
800
801 static void ssolve_4x2_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
802 {
803     BLASLONG k;
804     v4f32 src_a, src_c0, src_c1, src_b0, src_b1, src_b3;
805     FLOAT *c_nxt1line = c + ldc;
806
807     src_c0 = LD_SP(c);
808     src_c1 = LD_SP(c_nxt1line);
809
810     for (k = 0; k < (bk >> 2); k++)
811     {
812         src_a = LD_SP(a);
813         src_b0 = LD_SP(b);
814         src_b1 = (v4f32) __msa_splati_w((v4i32) src_b0, 1);
815         src_b0 = (v4f32) __msa_splati_w((v4i32) src_b0, 0);
816
817         src_c0 -= src_a * src_b0;
818         src_c1 -= src_a * src_b1;
819
820         a += 4;
821         b += 2;
822
823         src_a = LD_SP(a);
824         src_b0 = LD_SP(b);
825         src_b1 = (v4f32) __msa_splati_w((v4i32) src_b0, 1);
826         src_b0 = (v4f32) __msa_splati_w((v4i32) src_b0, 0);
827
828         src_c0 -= src_a * src_b0;
829         src_c1 -= src_a * src_b1;
830
831         a += 4;
832         b += 2;
833
834         src_a = LD_SP(a);
835         src_b0 = LD_SP(b);
836         src_b1 = (v4f32) __msa_splati_w((v4i32) src_b0, 1);
837         src_b0 = (v4f32) __msa_splati_w((v4i32) src_b0, 0);
838
839         src_c0 -= src_a * src_b0;
840         src_c1 -= src_a * src_b1;
841
842         a += 4;
843         b += 2;
844
845         src_a = LD_SP(a);
846         src_b0 = LD_SP(b);
847         src_b1 = (v4f32) __msa_splati_w((v4i32) src_b0, 1);
848         src_b0 = (v4f32) __msa_splati_w((v4i32) src_b0, 0);
849
850         src_c0 -= src_a * src_b0;
851         src_c1 -= src_a * src_b1;
852
853         a += 4;
854         b += 2;
855     }
856
857     if ((bk & 3) && (bk > 0))
858     {
859         if (bk & 2)
860         {
861             src_a = LD_SP(a);
862             src_b0 = LD_SP(b);
863             src_b1 = (v4f32) __msa_splati_w((v4i32) src_b0, 1);
864             src_b0 = (v4f32) __msa_splati_w((v4i32) src_b0, 0);
865
866             src_c0 -= src_a * src_b0;
867             src_c1 -= src_a * src_b1;
868
869             a += 4;
870             b += 2;
871
872             src_a = LD_SP(a);
873             src_b0 = LD_SP(b);
874             src_b1 = (v4f32) __msa_splati_w((v4i32) src_b0, 1);
875             src_b0 = (v4f32) __msa_splati_w((v4i32) src_b0, 0);
876
877             src_c0 -= src_a * src_b0;
878             src_c1 -= src_a * src_b1;
879
880             a += 4;
881             b += 2;
882         }
883
884         if (bk & 1)
885         {
886             src_a = LD_SP(a);
887             src_b0 = LD_SP(b);
888             src_b1 = (v4f32) __msa_splati_w((v4i32) src_b0, 1);
889             src_b0 = (v4f32) __msa_splati_w((v4i32) src_b0, 0);
890
891             src_c0 -= src_a * src_b0;
892             src_c1 -= src_a * src_b1;
893
894             a += 4;
895             b += 2;
896         }
897     }
898
899     src_b0 = COPY_FLOAT_TO_VECTOR(*(b + 0));
900     src_b1 = COPY_FLOAT_TO_VECTOR(*(b + 1));
901     src_b3 = COPY_FLOAT_TO_VECTOR(*(b + 3));
902
903     src_c0 *= src_b0;
904     src_c1 -= src_c0 * src_b1;
905     src_c1 *= src_b3;
906
907     ST_SP2(src_c0, src_c1, a, 4);
908
909     ST_SP(src_c0, c);
910     ST_SP(src_c1, c_nxt1line);
911 }
912
913 static void ssolve_4x1_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
914 {
915     BLASLONG k;
916     FLOAT b0, c0, c1, c2, c3;
917
918     c0 = *(c + 0);
919     c1 = *(c + 1);
920     c2 = *(c + 2);
921     c3 = *(c + 3);
922
923     for (k = 0; k < bk; k++)
924     {
925         c0 -= a[0] * b[0];
926         c1 -= a[1] * b[0];
927         c2 -= a[2] * b[0];
928         c3 -= a[3] * b[0];
929
930         a += 4;
931         b += 1;
932     }
933
934     b0 = *(b + 0);
935
936     c0 *= b0;
937     c1 *= b0;
938     c2 *= b0;
939     c3 *= b0;
940
941     *(a + 0) = c0;
942     *(a + 1) = c1;
943     *(a + 2) = c2;
944     *(a + 3) = c3;
945
946     *(c + 0) = c0;
947     *(c + 1) = c1;
948     *(c + 2) = c2;
949     *(c + 3) = c3;
950 }
951
952 static void ssolve_2x8_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
953 {
954     BLASLONG k;
955     FLOAT b0, b1, b2, b3, b4, b5, b6, b7, b9, b10, b11, b12, b13, b14, b15;
956     FLOAT b18, b19, b20, b21, b22, b23, b27, b28, b29, b30, b31;
957     FLOAT b36, b37, b38, b39, b45, b46, b47, b54, b55, b63;
958     FLOAT c0, c1, c0_nxt1, c1_nxt1, c0_nxt2, c1_nxt2, c0_nxt3, c1_nxt3;
959     FLOAT c0_nxt4, c1_nxt4, c0_nxt5, c1_nxt5, c0_nxt6, c1_nxt6;
960     FLOAT c0_nxt7, c1_nxt7;
961
962     c0 = *(c + 0);
963     c1 = *(c + 1);
964     c0_nxt1 = *(c + 0 + 1 * ldc);
965     c1_nxt1 = *(c + 1 + 1 * ldc);
966     c0_nxt2 = *(c + 0 + 2 * ldc);
967     c1_nxt2 = *(c + 1 + 2 * ldc);
968     c0_nxt3 = *(c + 0 + 3 * ldc);
969     c1_nxt3 = *(c + 1 + 3 * ldc);
970     c0_nxt4 = *(c + 0 + 4 * ldc);
971     c1_nxt4 = *(c + 1 + 4 * ldc);
972     c0_nxt5 = *(c + 0 + 5 * ldc);
973     c1_nxt5 = *(c + 1 + 5 * ldc);
974     c0_nxt6 = *(c + 0 + 6 * ldc);
975     c1_nxt6 = *(c + 1 + 6 * ldc);
976     c0_nxt7 = *(c + 0 + 7 * ldc);
977     c1_nxt7 = *(c + 1 + 7 * ldc);
978
979     for (k = 0; k < bk; k++)
980     {
981         c0 -= a[0] * b[0];
982         c1 -= a[1] * b[0];
983         c0_nxt1 -= a[0] * b[1];
984         c1_nxt1 -= a[1] * b[1];
985         c0_nxt2 -= a[0] * b[2];
986         c1_nxt2 -= a[1] * b[2];
987         c0_nxt3 -= a[0] * b[3];
988         c1_nxt3 -= a[1] * b[3];
989         c0_nxt4 -= a[0] * b[4];
990         c1_nxt4 -= a[1] * b[4];
991         c0_nxt5 -= a[0] * b[5];
992         c1_nxt5 -= a[1] * b[5];
993         c0_nxt6 -= a[0] * b[6];
994         c1_nxt6 -= a[1] * b[6];
995         c0_nxt7 -= a[0] * b[7];
996         c1_nxt7 -= a[1] * b[7];
997
998         a += 2;
999         b += 8;
1000     }
1001
1002     b0 = *(b + 0);
1003     b1 = *(b + 1);
1004     b2 = *(b + 2);
1005     b3 = *(b + 3);
1006     b4 = *(b + 4);
1007     b5 = *(b + 5);
1008     b6 = *(b + 6);
1009     b7 = *(b + 7);
1010     b9 = *(b + 9);
1011     b10 = *(b + 10);
1012     b11 = *(b + 11);
1013     b12 = *(b + 12);
1014     b13 = *(b + 13);
1015     b14 = *(b + 14);
1016     b15 = *(b + 15);
1017     b18 = *(b + 18);
1018     b19 = *(b + 19);
1019     b20 = *(b + 20);
1020     b21 = *(b + 21);
1021     b22 = *(b + 22);
1022     b23 = *(b + 23);
1023     b27 = *(b + 27);
1024     b28 = *(b + 28);
1025     b29 = *(b + 29);
1026     b30 = *(b + 30);
1027     b31 = *(b + 31);
1028     b36 = *(b + 36);
1029     b37 = *(b + 37);
1030     b38 = *(b + 38);
1031     b39 = *(b + 39);
1032     b45 = *(b + 45);
1033     b46 = *(b + 46);
1034     b47 = *(b + 47);
1035     b54 = *(b + 54);
1036     b55 = *(b + 55);
1037     b63 = *(b + 63);
1038
1039     c0 *= b0;
1040     c1 *= b0;
1041
1042     c0_nxt1 -= c0 * b1;
1043     c1_nxt1 -= c1 * b1;
1044
1045     c0_nxt2 -= c0 * b2;
1046     c1_nxt2 -= c1 * b2;
1047
1048     c0_nxt3 -= c0 * b3;
1049     c1_nxt3 -= c1 * b3;
1050
1051     c0_nxt4 -= c0 * b4;
1052     c1_nxt4 -= c1 * b4;
1053
1054     c0_nxt5 -= c0 * b5;
1055     c1_nxt5 -= c1 * b5;
1056
1057     c0_nxt6 -= c0 * b6;
1058     c1_nxt6 -= c1 * b6;
1059
1060     c0_nxt7 -= c0 * b7;
1061     c1_nxt7 -= c1 * b7;
1062
1063     c0_nxt1 *= b9;
1064     c1_nxt1 *= b9;
1065
1066     c0_nxt2 -= c0_nxt1 * b10;
1067     c1_nxt2 -= c1_nxt1 * b10;
1068
1069     c0_nxt3 -= c0_nxt1 * b11;
1070     c1_nxt3 -= c1_nxt1 * b11;
1071
1072     c0_nxt4 -= c0_nxt1 * b12;
1073     c1_nxt4 -= c1_nxt1 * b12;
1074
1075     c0_nxt5 -= c0_nxt1 * b13;
1076     c1_nxt5 -= c1_nxt1 * b13;
1077
1078     c0_nxt6 -= c0_nxt1 * b14;
1079     c1_nxt6 -= c1_nxt1 * b14;
1080
1081     c0_nxt7 -= c0_nxt1 * b15;
1082     c1_nxt7 -= c1_nxt1 * b15;
1083
1084     c0_nxt2 *= b18;
1085     c1_nxt2 *= b18;
1086
1087     c0_nxt3 -= c0_nxt2 * b19;
1088     c1_nxt3 -= c1_nxt2 * b19;
1089
1090     c0_nxt4 -= c0_nxt2 * b20;
1091     c1_nxt4 -= c1_nxt2 * b20;
1092
1093     c0_nxt5 -= c0_nxt2 * b21;
1094     c1_nxt5 -= c1_nxt2 * b21;
1095
1096     c0_nxt6 -= c0_nxt2 * b22;
1097     c1_nxt6 -= c1_nxt2 * b22;
1098
1099     c0_nxt7 -= c0_nxt2 * b23;
1100     c1_nxt7 -= c1_nxt2 * b23;
1101
1102     c0_nxt3 *= b27;
1103     c1_nxt3 *= b27;
1104
1105     c0_nxt4 -= c0_nxt3 * b28;
1106     c1_nxt4 -= c1_nxt3 * b28;
1107
1108     c0_nxt5 -= c0_nxt3 * b29;
1109     c1_nxt5 -= c1_nxt3 * b29;
1110
1111     c0_nxt6 -= c0_nxt3 * b30;
1112     c1_nxt6 -= c1_nxt3 * b30;
1113
1114     c0_nxt7 -= c0_nxt3 * b31;
1115     c1_nxt7 -= c1_nxt3 * b31;
1116
1117     c0_nxt4 *= b36;
1118     c1_nxt4 *= b36;
1119
1120     c0_nxt5 -= c0_nxt4 * b37;
1121     c1_nxt5 -= c1_nxt4 * b37;
1122
1123     c0_nxt6 -= c0_nxt4 * b38;
1124     c1_nxt6 -= c1_nxt4 * b38;
1125
1126     c0_nxt7 -= c0_nxt4 * b39;
1127     c1_nxt7 -= c1_nxt4 * b39;
1128
1129     c0_nxt5 *= b45;
1130     c1_nxt5 *= b45;
1131
1132     c0_nxt6 -= c0_nxt5 * b46;
1133     c1_nxt6 -= c1_nxt5 * b46;
1134
1135     c0_nxt7 -= c0_nxt5 * b47;
1136     c1_nxt7 -= c1_nxt5 * b47;
1137
1138     c0_nxt6 *= b54;
1139     c1_nxt6 *= b54;
1140
1141     c0_nxt7 -= c0_nxt6 * b55;
1142     c1_nxt7 -= c1_nxt6 * b55;
1143
1144     c0_nxt7 *= b63;
1145     c1_nxt7 *= b63;
1146
1147     *(a + 0) = c0;
1148     *(a + 1) = c1;
1149     *(a + 2) = c0_nxt1;
1150     *(a + 3) = c1_nxt1;
1151     *(a + 4) = c0_nxt2;
1152     *(a + 5) = c1_nxt2;
1153     *(a + 6) = c0_nxt3;
1154     *(a + 7) = c1_nxt3;
1155     *(a + 8) = c0_nxt4;
1156     *(a + 9) = c1_nxt4;
1157     *(a + 10) = c0_nxt5;
1158     *(a + 11) = c1_nxt5;
1159     *(a + 12) = c0_nxt6;
1160     *(a + 13) = c1_nxt6;
1161     *(a + 14) = c0_nxt7;
1162     *(a + 15) = c1_nxt7;
1163
1164     *(c + 0) = c0;
1165     *(c + 1) = c1;
1166     *(c + 0 + 1 * ldc) = c0_nxt1;
1167     *(c + 1 + 1 * ldc) = c1_nxt1;
1168     *(c + 0 + 2 * ldc) = c0_nxt2;
1169     *(c + 1 + 2 * ldc) = c1_nxt2;
1170     *(c + 0 + 3 * ldc) = c0_nxt3;
1171     *(c + 1 + 3 * ldc) = c1_nxt3;
1172     *(c + 0 + 4 * ldc) = c0_nxt4;
1173     *(c + 1 + 4 * ldc) = c1_nxt4;
1174     *(c + 0 + 5 * ldc) = c0_nxt5;
1175     *(c + 1 + 5 * ldc) = c1_nxt5;
1176     *(c + 0 + 6 * ldc) = c0_nxt6;
1177     *(c + 1 + 6 * ldc) = c1_nxt6;
1178     *(c + 0 + 7 * ldc) = c0_nxt7;
1179     *(c + 1 + 7 * ldc) = c1_nxt7;
1180 }
1181
1182 static void ssolve_2x4_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
1183 {
1184     BLASLONG k;
1185     FLOAT b0, b1, b2, b3, b5, b6, b7, b10, b11, b15, c0, c1;
1186     FLOAT c0_nxt1, c0_nxt2, c0_nxt3, c1_nxt1, c1_nxt2, c1_nxt3;
1187
1188     c0 = *(c + 0);
1189     c1 = *(c + 1);
1190     c0_nxt1 = *(c + 0 + 1 * ldc);
1191     c1_nxt1 = *(c + 1 + 1 * ldc);
1192     c0_nxt2 = *(c + 0 + 2 * ldc);
1193     c1_nxt2 = *(c + 1 + 2 * ldc);
1194     c0_nxt3 = *(c + 0 + 3 * ldc);
1195     c1_nxt3 = *(c + 1 + 3 * ldc);
1196
1197     for (k = 0; k < bk; k++)
1198     {
1199         c0 -= a[0] * b[0];
1200         c1 -= a[1] * b[0];
1201         c0_nxt1 -= a[0] * b[1];
1202         c1_nxt1 -= a[1] * b[1];
1203         c0_nxt2 -= a[0] * b[2];
1204         c1_nxt2 -= a[1] * b[2];
1205         c0_nxt3 -= a[0] * b[3];
1206         c1_nxt3 -= a[1] * b[3];
1207
1208         a += 2;
1209         b += 4;
1210     }
1211
1212     b0 = *(b + 0);
1213     b1 = *(b + 1);
1214     b2 = *(b + 2);
1215     b3 = *(b + 3);
1216     b5 = *(b + 5);
1217     b6 = *(b + 6);
1218     b7 = *(b + 7);
1219     b10 = *(b + 10);
1220     b11 = *(b + 11);
1221     b15 = *(b + 15);
1222
1223     c0 *= b0;
1224     c1 *= b0;
1225
1226     c0_nxt1 -= c0 * b1;
1227     c1_nxt1 -= c1 * b1;
1228     c0_nxt1 *= b5;
1229     c1_nxt1 *= b5;
1230
1231     c0_nxt2 -= c0 * b2;
1232     c1_nxt2 -= c1 * b2;
1233     c0_nxt2 -= c0_nxt1 * b6;
1234     c1_nxt2 -= c1_nxt1 * b6;
1235     c0_nxt2 *= b10;
1236     c1_nxt2 *= b10;
1237
1238     c0_nxt3 -= c0 * b3;
1239     c1_nxt3 -= c1 * b3;
1240     c0_nxt3 -= c0_nxt1 * b7;
1241     c1_nxt3 -= c1_nxt1 * b7;
1242     c0_nxt3 -= c0_nxt2 * b11;
1243     c1_nxt3 -= c1_nxt2 * b11;
1244     c0_nxt3 *= b15;
1245     c1_nxt3 *= b15;
1246
1247     *(a + 0) = c0;
1248     *(a + 1) = c1;
1249     *(a + 2) = c0_nxt1;
1250     *(a + 3) = c1_nxt1;
1251     *(a + 4) = c0_nxt2;
1252     *(a + 5) = c1_nxt2;
1253     *(a + 6) = c0_nxt3;
1254     *(a + 7) = c1_nxt3;
1255
1256     *(c + 0) = c0;
1257     *(c + 1) = c1;
1258     *(c + 1 * ldc) = c0_nxt1;
1259     *(c + 1 + 1 * ldc) = c1_nxt1;
1260     *(c + 2 * ldc) = c0_nxt2;
1261     *(c + 1 + 2 * ldc) = c1_nxt2;
1262     *(c + 3 * ldc) = c0_nxt3;
1263     *(c + 1 + 3 * ldc) = c1_nxt3;
1264 }
1265
1266 static void ssolve_2x2_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
1267 {
1268     BLASLONG k;
1269     FLOAT b0, b1, b3, c0, c0_nxt, c1, c1_nxt;
1270
1271     c0 = *(c + 0);
1272     c1 = *(c + 1);
1273     c0_nxt = *(c + 0 + ldc);
1274     c1_nxt = *(c + 1 + ldc);
1275
1276     for (k = 0; k < bk; k++)
1277     {
1278         c0 -= a[0] * b[0];
1279         c1 -= a[1] * b[0];
1280         c0_nxt -= a[0] * b[1];
1281         c1_nxt -= a[1] * b[1];
1282
1283         a += 2;
1284         b += 2;
1285     }
1286
1287     b0 = *(b + 0);
1288     b1 = *(b + 1);
1289     b3 = *(b + 3);
1290
1291     c0 *= b0;
1292     c1 *= b0;
1293
1294     c0_nxt -= c0 * b1;
1295     c1_nxt -= c1 * b1;
1296
1297     c0_nxt *= b3;
1298     c1_nxt *= b3;
1299
1300     *(a + 0) = c0;
1301     *(a + 1) = c1;
1302     *(a + 2) = c0_nxt;
1303     *(a + 3) = c1_nxt;
1304
1305     *(c + 0) = c0;
1306     *(c + 1) = c1;
1307     *(c + ldc) = c0_nxt;
1308     *(c + 1 + ldc) = c1_nxt;
1309 }
1310
1311 static void ssolve_2x1_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
1312 {
1313     BLASLONG k;
1314     FLOAT b0, c0, c1;
1315
1316     c0 = *(c + 0);
1317     c1 = *(c + 1);
1318
1319     for (k = 0; k < bk; k++)
1320     {
1321         c0 -= a[0] * b[0];
1322         c1 -= a[1] * b[0];
1323
1324         a += 2;
1325         b += 1;
1326     }
1327
1328     b0 = *(b + 0);
1329
1330     c0 *= b0;
1331     c1 *= b0;
1332
1333     *(a + 0) = c0;
1334     *(a + 1) = c1;
1335
1336     *(c + 0) = c0;
1337     *(c + 1) = c1;
1338 }
1339
1340 static void ssolve_1x8_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
1341 {
1342     BLASLONG k;
1343     FLOAT b0, b1, b2, b3, b4, b5, b6, b7, b9, b10, b11, b12, b13, b14, b15;
1344     FLOAT b18, b19, b20, b21, b22, b23, b27, b28, b29, b30, b31, b36, b37, b38;
1345     FLOAT b39, b45, b46, b47, b54, b55, b63, c0, c1, c2, c3, c4, c5, c6, c7;
1346
1347     c0 = *(c + 0);
1348     c1 = *(c + 1 * ldc);
1349     c2 = *(c + 2 * ldc);
1350     c3 = *(c + 3 * ldc);
1351     c4 = *(c + 4 * ldc);
1352     c5 = *(c + 5 * ldc);
1353     c6 = *(c + 6 * ldc);
1354     c7 = *(c + 7 * ldc);
1355
1356     for (k = 0; k < bk; k++)
1357     {
1358         c0 -= a[0] * b[0];
1359         c1 -= a[0] * b[1];
1360         c2 -= a[0] * b[2];
1361         c3 -= a[0] * b[3];
1362         c4 -= a[0] * b[4];
1363         c5 -= a[0] * b[5];
1364         c6 -= a[0] * b[6];
1365         c7 -= a[0] * b[7];
1366
1367         a += 1;
1368         b += 8;
1369     }
1370
1371     b0 = *(b + 0);
1372     b1 = *(b + 1);
1373     b2 = *(b + 2);
1374     b3 = *(b + 3);
1375     b4 = *(b + 4);
1376     b5 = *(b + 5);
1377     b6 = *(b + 6);
1378     b7 = *(b + 7);
1379     b9 = *(b + 9);
1380     b10 = *(b + 10);
1381     b11 = *(b + 11);
1382     b12 = *(b + 12);
1383     b13 = *(b + 13);
1384     b14 = *(b + 14);
1385     b15 = *(b + 15);
1386     b18 = *(b + 18);
1387     b19 = *(b + 19);
1388     b20 = *(b + 20);
1389     b21 = *(b + 21);
1390     b22 = *(b + 22);
1391     b23 = *(b + 23);
1392     b27 = *(b + 27);
1393     b28 = *(b + 28);
1394     b29 = *(b + 29);
1395     b30 = *(b + 30);
1396     b31 = *(b + 31);
1397     b36 = *(b + 36);
1398     b37 = *(b + 37);
1399     b38 = *(b + 38);
1400     b39 = *(b + 39);
1401     b45 = *(b + 45);
1402     b46 = *(b + 46);
1403     b47 = *(b + 47);
1404     b54 = *(b + 54);
1405     b55 = *(b + 55);
1406     b63 = *(b + 63);
1407
1408     c0 *= b0;
1409
1410     c1 -= c0 * b1;
1411     c1 *= b9;
1412
1413     c2 -= c0 * b2;
1414     c2 -= c1 * b10;
1415     c2 *= b18;
1416
1417     c3 -= c0 * b3;
1418     c3 -= c1 * b11;
1419     c3 -= c2 * b19;
1420     c3 *= b27;
1421
1422     c4 -= c0 * b4;
1423     c4 -= c1 * b12;
1424     c4 -= c2 * b20;
1425     c4 -= c3 * b28;
1426     c4 *= b36;
1427
1428     c5 -= c0 * b5;
1429     c5 -= c1 * b13;
1430     c5 -= c2 * b21;
1431     c5 -= c3 * b29;
1432     c5 -= c4 * b37;
1433     c5 *= b45;
1434
1435     c6 -= c0 * b6;
1436     c6 -= c1 * b14;
1437     c6 -= c2 * b22;
1438     c6 -= c3 * b30;
1439     c6 -= c4 * b38;
1440     c6 -= c5 * b46;
1441     c6 *= b54;
1442
1443     c7 -= c0 * b7;
1444     c7 -= c1 * b15;
1445     c7 -= c2 * b23;
1446     c7 -= c3 * b31;
1447     c7 -= c4 * b39;
1448     c7 -= c5 * b47;
1449     c7 -= c6 * b55;
1450     c7 *= b63;
1451
1452     *(a + 0) = c0;
1453     *(a + 1) = c1;
1454     *(a + 2) = c2;
1455     *(a + 3) = c3;
1456     *(a + 4) = c4;
1457     *(a + 5) = c5;
1458     *(a + 6) = c6;
1459     *(a + 7) = c7;
1460
1461     *(c + 0) = c0;
1462     *(c + 1 * ldc) = c1;
1463     *(c + 2 * ldc) = c2;
1464     *(c + 3 * ldc) = c3;
1465     *(c + 4 * ldc) = c4;
1466     *(c + 5 * ldc) = c5;
1467     *(c + 6 * ldc) = c6;
1468     *(c + 7 * ldc) = c7;
1469 }
1470
1471 static void ssolve_1x4_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
1472 {
1473     BLASLONG k;
1474     FLOAT b0, b1, b2, b3, b5, b6, b7, b10, b11, b15, c0, c1, c2, c3;
1475
1476     c0 = *(c + 0);
1477     c1 = *(c + 1 * ldc);
1478     c2 = *(c + 2 * ldc);
1479     c3 = *(c + 3 * ldc);
1480
1481     for (k = 0; k < bk; k++)
1482     {
1483         c0 -= a[0] * b[0];
1484         c1 -= a[0] * b[1];
1485         c2 -= a[0] * b[2];
1486         c3 -= a[0] * b[3];
1487
1488         a += 1;
1489         b += 4;
1490     }
1491
1492     b0 = *(b + 0);
1493     b1 = *(b + 1);
1494     b2 = *(b + 2);
1495     b3 = *(b + 3);
1496     b5 = *(b + 5);
1497     b6 = *(b + 6);
1498     b7 = *(b + 7);
1499     b10 = *(b + 10);
1500     b11 = *(b + 11);
1501     b15 = *(b + 15);
1502
1503     c0 *= b0;
1504
1505     c1 -= c0 * b1;
1506     c1 *= b5;
1507
1508     c2 -= c0 * b2;
1509     c2 -= c1 * b6;
1510     c2 *= b10;
1511
1512     c3 -= c0 * b3;
1513     c3 -= c1 * b7;
1514     c3 -= c2 * b11;
1515     c3 *= b15;
1516
1517     *(a + 0) = c0;
1518     *(a + 1) = c1;
1519     *(a + 2) = c2;
1520     *(a + 3) = c3;
1521
1522     *(c + 0) = c0;
1523     *(c + 1 * ldc) = c1;
1524     *(c + 2 * ldc) = c2;
1525     *(c + 3 * ldc) = c3;
1526 }
1527
1528 static void ssolve_1x2_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG ldc, BLASLONG bk)
1529 {
1530     BLASLONG k;
1531     FLOAT b0, b1, b3, c0, c1;
1532
1533     c0 = *c;
1534     c1 = *(c + ldc);
1535
1536     for (k = 0; k < bk; k++)
1537     {
1538         c0 -= a[0] * b[0];
1539         c1 -= a[0] * b[1];
1540
1541         a += 1;
1542         b += 2;
1543     }
1544
1545     b0 = *(b + 0);
1546     b1 = *(b + 1);
1547     b3 = *(b + 3);
1548
1549     c0 *= b0;
1550
1551     c1 -= c0 * b1;
1552     c1 *= b3;
1553
1554     *(a + 0) = c0;
1555     *(a + 1) = c1;
1556
1557     *(c + 0) = c0;
1558     *(c + ldc) = c1;
1559 }
1560
1561 static void ssolve_1x1_rn_msa(FLOAT *a, FLOAT *b, FLOAT *c, BLASLONG bk)
1562 {
1563     BLASLONG k;
1564
1565     for (k = 0; k < bk; k++)
1566     {
1567         *c -= a[0] * b[0];
1568
1569         a++;
1570         b++;
1571     }
1572
1573     *c *= *b;
1574     *a = *c;
1575 }
1576
1577 int CNAME(BLASLONG m, BLASLONG n, BLASLONG k, FLOAT dummy1, FLOAT *a, FLOAT *b,
1578           FLOAT *c, BLASLONG ldc, BLASLONG offset)
1579 {
1580     FLOAT *aa, *cc;
1581     BLASLONG i, j, kk;
1582
1583     kk = -offset;
1584
1585     for (j = (n >> 3); j--;)
1586     {
1587         aa = a;
1588         cc = c;
1589
1590         for (i = (m >> 3); i--;)
1591         {
1592             ssolve_8x8_rn_msa(aa, b, cc, ldc, kk);
1593
1594             aa += 8 * k;
1595             cc += 8;
1596         }
1597
1598         if (m & 7)
1599         {
1600             if (m & 4)
1601             {
1602                 ssolve_4x8_rn_msa(aa, b, cc, ldc, kk);
1603
1604                 aa += 4 * k;
1605                 cc += 4;
1606             }
1607
1608             if (m & 2)
1609             {
1610                 ssolve_2x8_rn_msa(aa, b, cc, ldc, kk);
1611
1612                 aa += 2 * k;
1613                 cc += 2;
1614             }
1615
1616             if (m & 1)
1617             {
1618                 ssolve_1x8_rn_msa(aa, b, cc, ldc, kk);
1619
1620                 aa += k;
1621                 cc += 1;
1622             }
1623         }
1624
1625         kk += 8;
1626         b += 8 * k;
1627         c += 8 * ldc;
1628     }
1629
1630     if (n & 7)
1631     {
1632         if (n & 4)
1633         {
1634             aa = a;
1635             cc = c;
1636
1637             for (i = (m >> 3); i--;)
1638             {
1639                 ssolve_8x4_rn_msa(aa, b, cc, ldc, kk);
1640
1641                 aa += 8 * k;
1642                 cc += 8;
1643             }
1644
1645             if (m & 7)
1646             {
1647                 if (m & 4)
1648                 {
1649                     ssolve_4x4_rn_msa(aa, b, cc, ldc, kk);
1650
1651                     aa += 4 * k;
1652                     cc += 4;
1653                 }
1654
1655                 if (m & 2)
1656                 {
1657                     ssolve_2x4_rn_msa(aa, b, cc, ldc, kk);
1658
1659                     aa += 2 * k;
1660                     cc += 2;
1661                 }
1662
1663                 if (m & 1)
1664                 {
1665                     ssolve_1x4_rn_msa(aa, b, cc, ldc, kk);
1666
1667                     aa += k;
1668                     cc += 1;
1669                 }
1670             }
1671
1672             b += 4 * k;
1673             c += 4 * ldc;
1674             kk += 4;
1675         }
1676
1677         if (n & 2)
1678         {
1679             aa = a;
1680             cc = c;
1681
1682             for (i = (m >> 3); i--;)
1683             {
1684                 ssolve_8x2_rn_msa(aa, b, cc, ldc, kk);
1685
1686                 aa += 8 * k;
1687                 cc += 8;
1688             }
1689
1690             if (m & 7)
1691             {
1692                 if (m & 4)
1693                 {
1694                     ssolve_4x2_rn_msa(aa, b, cc, ldc, kk);
1695
1696                     aa += 4 * k;
1697                     cc += 4;
1698                 }
1699
1700                 if (m & 2)
1701                 {
1702                     ssolve_2x2_rn_msa(aa, b, cc, ldc, kk);
1703
1704                     aa += 2 * k;
1705                     cc += 2;
1706                 }
1707
1708                 if (m & 1)
1709                 {
1710                     ssolve_1x2_rn_msa(aa, b, cc, ldc, kk);
1711
1712                     aa += k;
1713                     cc += 1;
1714                 }
1715             }
1716
1717             b += 2 * k;
1718             c += 2 * ldc;
1719             kk += 2;
1720         }
1721
1722         if (n & 1)
1723         {
1724             aa = a;
1725             cc = c;
1726
1727             for (i = (m >> 3); i--;)
1728             {
1729                 ssolve_8x1_rn_msa(aa, b, cc, ldc, kk);
1730
1731                 aa += 8 * k;
1732                 cc += 8;
1733             }
1734
1735             if (m & 7)
1736             {
1737                 if (m & 4)
1738                 {
1739                     ssolve_4x1_rn_msa(aa, b, cc, ldc, kk);
1740
1741                     aa += 4 * k;
1742                     cc += 4;
1743                 }
1744
1745                 if (m & 2)
1746                 {
1747                     ssolve_2x1_rn_msa(aa, b, cc, ldc, kk);
1748
1749                     aa += 2 * k;
1750                     cc += 2;
1751                 }
1752
1753                 if (m & 1)
1754                 {
1755                     ssolve_1x1_rn_msa(aa, b, cc, kk);
1756
1757                     aa += k;
1758                     cc += 1;
1759                 }
1760             }
1761
1762             b += k;
1763             c += ldc;
1764             kk += 1;
1765         }
1766     }
1767
1768     return 0;
1769 }