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