fix build error
[platform/upstream/openblas.git] / kernel / mips / cgemm_tcopy_8_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 int CNAME(BLASLONG m, BLASLONG n, FLOAT *src, BLASLONG lda, FLOAT *dst)
32 {
33     BLASLONG i, j;
34     FLOAT *psrc0, *psrc1, *psrc2, *pdst0;
35     FLOAT ctemp01, ctemp02, ctemp03, ctemp04;
36     v4f32 src0, src1, src2, src3, src4, src5, src6, src7;
37     v4f32 src8, src9, src10, src11, src12, src13, src14, src15;
38
39     psrc0 = src;
40     pdst0 = dst;
41     lda *= 2;
42
43     for (j = (n >> 3); j--;)
44     {
45         psrc1 = psrc0;
46         psrc2 = psrc0 + lda;
47         psrc0 += 16;
48
49         for (i = (m >> 2); i--;)
50         {
51             LD_SP4(psrc1, 4, src0, src1, src2, src3);
52             LD_SP4(psrc2, 4, src4, src5, src6, src7);
53             LD_SP4(psrc1 + 2 * lda, 4, src8, src9, src10, src11);
54             LD_SP4(psrc2 + 2 * lda, 4, src12, src13, src14, src15);
55             ST_SP8_INC(src0, src1, src2, src3, src4, src5, src6, src7, pdst0, 4);
56             ST_SP8_INC(src8, src9, src10, src11, src12, src13, src14, src15, pdst0, 4);
57             psrc1 += 4 * lda;
58             psrc2 += 4 * lda;
59         }
60
61         if (m & 2)
62         {
63             LD_SP4(psrc1, 4, src0, src1, src2, src3);
64             LD_SP4(psrc2, 4, src4, src5, src6, src7);
65             ST_SP8_INC(src0, src1, src2, src3, src4, src5, src6, src7, pdst0, 4);
66             psrc1 += 2 * lda;
67             psrc2 += 2 * lda;
68         }
69
70         if (m & 1)
71         {
72             LD_SP4(psrc1, 4, src0, src1, src2, src3);
73             ST_SP4_INC(src0, src1, src2, src3, pdst0, 4);
74         }
75     }
76
77     if (n & 4)
78     {
79         psrc1 = psrc0;
80         psrc2 = psrc0 + lda;
81         psrc0 += 8;
82
83         for (i = (m >> 2); i--;)
84         {
85             LD_SP2(psrc1, 4, src0, src1);
86             LD_SP2(psrc2, 4, src2, src3);
87             LD_SP2(psrc1 + 2 * lda, 4, src4, src5);
88             LD_SP2(psrc2 + 2 * lda, 4, src6, src7);
89
90             ST_SP4_INC(src0, src1, src2, src3, pdst0, 4);
91             ST_SP4_INC(src4, src5, src6, src7, pdst0, 4);
92             psrc1 += 4 * lda;
93             psrc2 += 4 * lda;
94         }
95
96         if (m & 2)
97         {
98             LD_SP2(psrc1, 4, src0, src1);
99             LD_SP2(psrc2, 4, src2, src3);
100             ST_SP4_INC(src0, src1, src2, src3, pdst0, 4);
101             psrc1 += 2 * lda;
102             psrc2 += 2 * lda;
103         }
104
105         if (m & 1)
106         {
107             LD_SP2(psrc1, 4, src0, src1);
108             ST_SP2_INC(src0, src1, pdst0, 4);
109         }
110     }
111
112     if (n & 2)
113     {
114         psrc1 = psrc0;
115         psrc2 = psrc0 + lda;
116         psrc0 += 4;
117
118         for (i = (m >> 2); i--;)
119         {
120             src0 = LD_SP(psrc1);
121             src1 = LD_SP(psrc2);
122             src2 = LD_SP(psrc1 + 2 * lda);
123             src3 = LD_SP(psrc2 + 2 * lda);
124             ST_SP4_INC(src0, src1, src2, src3, pdst0, 4);
125
126             psrc1 += 4 * lda;
127             psrc2 += 4 * lda;
128         }
129
130         if (m & 2)
131         {
132             src0 = LD_SP(psrc1);
133             src1 = LD_SP(psrc2);
134             ST_SP2_INC(src0, src1, pdst0, 4);
135
136             psrc1 += 2 * lda;
137             psrc2 += 2 * lda;
138         }
139
140         if (m & 1)
141         {
142             src0 = LD_SP(psrc1);
143             ST_SP(src0, pdst0);
144             pdst0 += 4;
145         }
146     }
147
148     if (n & 1)
149     {
150         psrc1 = psrc0;
151         psrc2 = psrc0 + lda;
152         psrc0 += 2;
153
154         for (i = (m >> 2); i--;)
155         {
156             ctemp01 = *(psrc1 + 0);
157             ctemp02 = *(psrc1 + 1);
158             ctemp03 = *(psrc2 + 0);
159             ctemp04 = *(psrc2 + 1);
160
161             *(pdst0 + 0) = ctemp01;
162             *(pdst0 + 1) = ctemp02;
163             *(pdst0 + 2) = ctemp03;
164             *(pdst0 + 3) = ctemp04;
165
166             psrc1 += 2 * lda;
167             psrc2 += 2 * lda;
168             pdst0 += 4;
169
170             ctemp01 = *(psrc1 + 0);
171             ctemp02 = *(psrc1 + 1);
172             ctemp03 = *(psrc2 + 0);
173             ctemp04 = *(psrc2 + 1);
174
175             *(pdst0 + 0) = ctemp01;
176             *(pdst0 + 1) = ctemp02;
177             *(pdst0 + 2) = ctemp03;
178             *(pdst0 + 3) = ctemp04;
179
180             psrc1 += 2 * lda;
181             psrc2 += 2 * lda;
182             pdst0 += 4;
183         }
184
185         if (m & 2)
186         {
187             ctemp01 = *(psrc1 + 0);
188             ctemp02 = *(psrc1 + 1);
189             ctemp03 = *(psrc2 + 0);
190             ctemp04 = *(psrc2 + 1);
191
192             *(pdst0 + 0) = ctemp01;
193             *(pdst0 + 1) = ctemp02;
194             *(pdst0 + 2) = ctemp03;
195             *(pdst0 + 3) = ctemp04;
196
197             psrc1 += 2 * lda;
198             psrc2 += 2 * lda;
199             pdst0 += 4;
200         }
201
202         if (m & 1)
203         {
204             ctemp01 = *(psrc1 + 0);
205             ctemp02 = *(psrc1 + 1);
206
207             *(pdst0 + 0) = ctemp01;
208             *(pdst0 + 1) = ctemp02;
209             pdst0 += 2;
210         }
211     }
212
213     return 0;
214 }