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