fix build error
[platform/upstream/openblas.git] / kernel / mips / dgemm_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 * __restrict src, BLASLONG lda,
32           FLOAT * __restrict dst)
33 {
34     BLASLONG i, j;
35     FLOAT *psrc0, *psrc1, *psrc2, *psrc3, *psrc4;
36     FLOAT *psrc5, *psrc6, *psrc7, *psrc8;
37     FLOAT *pdst0, *pdst1, *pdst2, *pdst3, *pdst4;
38     v2f64 src0, src1, src2, src3, src4, src5, src6, src7;
39     v2f64 src8, src9, src10, src11, src12, src13, src14, src15;
40
41     psrc0 = src;
42     pdst0 = dst;
43
44     pdst2 = dst + m * (n & ~7);
45     pdst3 = dst + m * (n & ~3);
46     pdst4 = dst + m * (n & ~1);
47
48     for (j = (m >> 3); j--;)
49     {
50         psrc1 = psrc0;
51         psrc2 = psrc1 + lda;
52         psrc3 = psrc2 + lda;
53         psrc4 = psrc3 + lda;
54         psrc5 = psrc4 + lda;
55         psrc6 = psrc5 + lda;
56         psrc7 = psrc6 + lda;
57         psrc8 = psrc7 + lda;
58         psrc0 += 8 * lda;
59
60         pdst1 = pdst0;
61         pdst0 += 64;
62
63         for (i = (n >> 3); i--;)
64         {
65             LD_DP4_INC(psrc1, 2, src0, src1, src2, src3);
66             LD_DP4_INC(psrc2, 2, src4, src5, src6, src7);
67             LD_DP4_INC(psrc3, 2, src8, src9, src10, src11);
68             LD_DP4_INC(psrc4, 2, src12, src13, src14, src15);
69
70             ST_DP8(src0, src1, src2, src3, src4, src5, src6, src7, pdst1, 2);
71             ST_DP8(src8, src9, src10, src11, src12, src13, src14, src15,
72                    pdst1 + 16, 2);
73
74             LD_DP4_INC(psrc5, 2, src0, src1, src2, src3);
75             LD_DP4_INC(psrc6, 2, src4, src5, src6, src7);
76             LD_DP4_INC(psrc7, 2, src8, src9, src10, src11);
77             LD_DP4_INC(psrc8, 2, src12, src13, src14, src15);
78
79             ST_DP8(src0, src1, src2, src3, src4, src5, src6, src7, pdst1 + 32,
80                    2);
81             ST_DP8(src8, src9, src10, src11, src12, src13, src14, src15,
82                    pdst1 + 48, 2);
83             pdst1 += m * 8;
84         }
85
86         if (n & 4)
87         {
88             LD_DP2_INC(psrc1, 2, src0, src1);
89             LD_DP2_INC(psrc2, 2, src2, src3);
90             LD_DP2_INC(psrc3, 2, src4, src5);
91             LD_DP2_INC(psrc4, 2, src6, src7);
92             LD_DP2_INC(psrc5, 2, src8, src9);
93             LD_DP2_INC(psrc6, 2, src10, src11);
94             LD_DP2_INC(psrc7, 2, src12, src13);
95             LD_DP2_INC(psrc8, 2, src14, src15);
96
97             ST_DP8_INC(src0, src1, src2, src3, src4, src5, src6, src7, pdst2, 2);
98             ST_DP8_INC(src8, src9, src10, src11, src12, src13, src14, src15,
99                        pdst2, 2);
100         }
101
102         if (n & 2)
103         {
104             src0 = LD_DP(psrc1);
105             src1 = LD_DP(psrc2);
106             src2 = LD_DP(psrc3);
107             src3 = LD_DP(psrc4);
108             src4 = LD_DP(psrc5);
109             src5 = LD_DP(psrc6);
110             src6 = LD_DP(psrc7);
111             src7 = LD_DP(psrc8);
112             psrc1 += 2;
113             psrc2 += 2;
114             psrc3 += 2;
115             psrc4 += 2;
116             psrc5 += 2;
117             psrc6 += 2;
118             psrc7 += 2;
119             psrc8 += 2;
120
121             ST_DP8_INC(src0, src1, src2, src3, src4, src5, src6, src7, pdst3, 2);
122         }
123
124         if (n & 1)
125         {
126             *pdst4++ = *psrc1++;
127             *pdst4++ = *psrc2++;
128             *pdst4++ = *psrc3++;
129             *pdst4++ = *psrc4++;
130             *pdst4++ = *psrc5++;
131             *pdst4++ = *psrc6++;
132             *pdst4++ = *psrc7++;
133             *pdst4++ = *psrc8++;
134         }
135     }
136
137     if (m & 4)
138     {
139         psrc1 = psrc0;
140         psrc2 = psrc1 + lda;
141         psrc3 = psrc2 + lda;
142         psrc4 = psrc3 + lda;
143         psrc0 += 4 * lda;
144
145         pdst1 = pdst0;
146         pdst0 += 32;
147
148         for (i = (n >> 3); i--;)
149         {
150             LD_DP4_INC(psrc1, 2, src0, src1, src2, src3);
151             LD_DP4_INC(psrc2, 2, src4, src5, src6, src7);
152             LD_DP4_INC(psrc3, 2, src8, src9, src10, src11);
153             LD_DP4_INC(psrc4, 2, src12, src13, src14, src15);
154
155             ST_DP8(src0, src1, src2, src3, src4, src5, src6, src7, pdst1, 2);
156             ST_DP8(src8, src9, src10, src11, src12, src13, src14, src15,
157                    pdst1 + 16, 2);
158             pdst1 += 8 * m;
159         }
160
161         if (n & 4)
162         {
163             LD_DP2_INC(psrc1, 2, src0, src1);
164             LD_DP2_INC(psrc2, 2, src2, src3);
165             LD_DP2_INC(psrc3, 2, src4, src5);
166             LD_DP2_INC(psrc4, 2, src6, src7);
167
168             ST_DP8_INC(src0, src1, src2, src3, src4, src5, src6, src7, pdst2, 2);
169         }
170
171         if (n & 2)
172         {
173             src0 = LD_DP(psrc1);
174             src1 = LD_DP(psrc2);
175             src2 = LD_DP(psrc3);
176             src3 = LD_DP(psrc4);
177             psrc1 += 2;
178             psrc2 += 2;
179             psrc3 += 2;
180             psrc4 += 2;
181
182             ST_DP4_INC(src0, src1, src2, src3, pdst3, 2);
183         }
184
185         if (n & 1)
186         {
187             *pdst4++ = *psrc1++;
188             *pdst4++ = *psrc2++;
189             *pdst4++ = *psrc3++;
190             *pdst4++ = *psrc4++;
191         }
192     }
193
194     if (m & 2)
195     {
196         psrc1 = psrc0;
197         psrc2 = psrc1 + lda;
198         psrc0 += 2 * lda;
199
200         pdst1 = pdst0;
201         pdst0 += 16;
202
203         for (i = (n >> 3); i--;)
204         {
205             LD_DP4_INC(psrc1, 2, src0, src1, src2, src3);
206             LD_DP4_INC(psrc2, 2, src4, src5, src6, src7);
207
208             ST_DP8(src0, src1, src2, src3, src4, src5, src6, src7, pdst1, 2);
209             pdst1 += 8 * m;
210         }
211
212         if (n & 4)
213         {
214             LD_DP2_INC(psrc1, 2, src0, src1);
215             LD_DP2_INC(psrc2, 2, src2, src3);
216
217             ST_DP4_INC(src0, src1, src2, src3, pdst2, 2);
218         }
219
220         if (n & 2)
221         {
222             src0 = LD_DP(psrc1);
223             src1 = LD_DP(psrc2);
224             psrc1 += 2;
225             psrc2 += 2;
226
227             ST_DP2_INC(src0, src1, pdst3, 2);
228         }
229
230         if (n & 1)
231         {
232             *pdst4++ = *psrc1++;
233             *pdst4++ = *psrc2++;
234         }
235     }
236
237     if (m & 1)
238     {
239         psrc1 = psrc0;
240         psrc0 += lda;
241
242         pdst1 = pdst0;
243         pdst0 += 8;
244
245         for (i = (n >> 3); i--;)
246         {
247             LD_DP4_INC(psrc1, 2, src0, src1, src2, src3);
248
249             ST_DP4(src0, src1, src2, src3, pdst1, 2);
250             pdst1 += 8 * m;
251         }
252
253         if (n & 4)
254         {
255             LD_DP2_INC(psrc1, 2, src0, src1);
256
257             ST_DP2_INC(src0, src1, pdst2, 2);
258         }
259
260         if (n & 2)
261         {
262             src0 = LD_DP(psrc1);
263             psrc1 += 2;
264
265             ST_DP(src0, pdst3);
266             pdst3 += 2;
267         }
268
269         if (n & 1)
270         {
271             *pdst4++ = *psrc1++;
272         }
273     }
274
275     return 0;
276 }