fix build error
[platform/upstream/openblas.git] / kernel / mips / sscal_msa.c
1 /*******************************************************************************
2 Copyright (c) 2017, 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 n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da, FLOAT *x,
32           BLASLONG inc_x, FLOAT *y, BLASLONG inc_y, FLOAT *dummy,
33           BLASLONG dummy2)
34 {
35     BLASLONG i;
36     FLOAT *px;
37     FLOAT f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15;
38     v4f32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15;
39     v4f32 da_vec;
40
41     px = x;
42
43     if (1 == inc_x)
44     {
45         if (0.0 == da)
46         {
47             v4f32 zero_v = __msa_cast_to_vector_float(0);
48             zero_v = (v4f32) __msa_insert_w((v4i32) zero_v, 0, 0.0);
49             zero_v = (v4f32) __msa_insert_w((v4i32) zero_v, 1, 0.0);
50             zero_v = (v4f32) __msa_insert_w((v4i32) zero_v, 2, 0.0);
51             zero_v = (v4f32) __msa_insert_w((v4i32) zero_v, 3, 0.0);
52
53             for (i = (n >> 6); i--;)
54             {
55                 ST_SP8_INC(zero_v, zero_v, zero_v, zero_v, zero_v, zero_v,
56                            zero_v, zero_v, x, 4);
57                 ST_SP8_INC(zero_v, zero_v, zero_v, zero_v, zero_v, zero_v,
58                            zero_v, zero_v, x, 4);
59             }
60
61             if (n & 63)
62             {
63                 if (n & 32)
64                 {
65                     ST_SP8_INC(zero_v, zero_v, zero_v, zero_v, zero_v, zero_v,
66                                zero_v, zero_v, x, 4);
67                 }
68
69                 if (n & 16)
70                 {
71                     ST_SP4_INC(zero_v, zero_v, zero_v, zero_v, x, 4);
72                 }
73
74                 if (n & 8)
75                 {
76                     ST_SP2_INC(zero_v, zero_v, x, 4);
77                 }
78
79                 if (n & 4)
80                 {
81                     *x = 0; x += 1;
82                     *x = 0; x += 1;
83                     *x = 0; x += 1;
84                     *x = 0; x += 1;
85                 }
86
87                 if (n & 2)
88                 {
89                     *x = 0; x += 1;
90                     *x = 0; x += 1;
91                 }
92
93                 if (n & 1)
94                 {
95                     *x = 0;
96                 }
97             }
98         }
99         else
100         {
101             da_vec = COPY_FLOAT_TO_VECTOR(da);
102
103             if (n > 63)
104             {
105                 FLOAT *x_pref;
106                 BLASLONG pref_offset;
107
108                 pref_offset = (BLASLONG)x & (L1_DATA_LINESIZE - 1);
109                 if (pref_offset > 0)
110                 {
111                     pref_offset = L1_DATA_LINESIZE - pref_offset;
112                     pref_offset = pref_offset / sizeof(FLOAT);
113                 }
114                 x_pref = x + pref_offset + 64 + 32;
115
116                 LD_SP8_INC(px, 4, x0, x1, x2, x3, x4, x5, x6, x7);
117                 for (i = 0; i < (n >> 6) - 1; i++)
118                 {
119                     PREF_OFFSET(x_pref, 0);
120                     PREF_OFFSET(x_pref, 32);
121                     PREF_OFFSET(x_pref, 64);
122                     PREF_OFFSET(x_pref, 96);
123                     PREF_OFFSET(x_pref, 128);
124                     PREF_OFFSET(x_pref, 160);
125                     PREF_OFFSET(x_pref, 192);
126                     PREF_OFFSET(x_pref, 224);
127                     x_pref += 64;
128
129                     x8 = LD_SP(px); px += 4;
130                     x0 *= da_vec;
131                     x9 = LD_SP(px); px += 4;
132                     x1 *= da_vec;
133                     x10 = LD_SP(px); px += 4;
134                     x2 *= da_vec;
135                     x11 = LD_SP(px); px += 4;
136                     x3 *= da_vec;
137                     x12 = LD_SP(px); px += 4;
138                     x4 *= da_vec;
139                     x13 = LD_SP(px); px += 4;
140                     x5 *= da_vec;
141                     x14 = LD_SP(px); px += 4;
142                     x6 *= da_vec;
143                     x15 = LD_SP(px); px += 4;
144                     x7 *= da_vec;
145                     x8 *= da_vec;
146                     ST_SP(x0, x); x += 4;
147                     x9 *= da_vec;
148                     ST_SP(x1, x); x += 4;
149                     x10 *= da_vec;
150                     ST_SP(x2, x); x += 4;
151                     x11 *= da_vec;
152                     ST_SP(x3, x); x += 4;
153                     x12 *= da_vec;
154                     ST_SP(x4, x); x += 4;
155                     x13 *= da_vec;
156                     ST_SP(x5, x); x += 4;
157                     x14 *= da_vec;
158                     ST_SP(x6, x); x += 4;
159                     x15 *= da_vec;
160                     ST_SP(x7, x); x += 4;
161                     ST_SP(x8, x); x += 4;
162                     x0 = LD_SP(px); px += 4;
163                     ST_SP(x9, x); x += 4;
164                     x1 = LD_SP(px); px += 4;
165                     ST_SP(x10, x); x += 4;
166                     x2 = LD_SP(px); px += 4;
167                     ST_SP(x11, x); x += 4;
168                     x3 = LD_SP(px); px += 4;
169                     ST_SP(x12, x); x += 4;
170                     x4 = LD_SP(px); px += 4;
171                     ST_SP(x13, x); x += 4;
172                     x5 = LD_SP(px); px += 4;
173                     ST_SP(x14, x); x += 4;
174                     x6 = LD_SP(px); px += 4;
175                     ST_SP(x15, x); x += 4;
176                     x7 = LD_SP(px); px += 4;
177                 }
178
179                 x8 = LD_SP(px); px += 4;
180                 x0 *= da_vec;
181                 x9 = LD_SP(px); px += 4;
182                 x1 *= da_vec;
183                 x10 = LD_SP(px); px += 4;
184                 x2 *= da_vec;
185                 x11 = LD_SP(px); px += 4;
186                 x3 *= da_vec;
187                 x12 = LD_SP(px); px += 4;
188                 x4 *= da_vec;
189                 x13 = LD_SP(px); px += 4;
190                 x5 *= da_vec;
191                 x14 = LD_SP(px); px += 4;
192                 x6 *= da_vec;
193                 x15 = LD_SP(px); px += 4;
194                 x7 *= da_vec;
195                 x8 *= da_vec;
196                 ST_SP(x0, x); x += 4;
197                 x9 *= da_vec;
198                 ST_SP(x1, x); x += 4;
199                 x10 *= da_vec;
200                 ST_SP(x2, x); x += 4;
201                 x11 *= da_vec;
202                 ST_SP(x3, x); x += 4;
203                 x12 *= da_vec;
204                 ST_SP(x4, x); x += 4;
205                 x13 *= da_vec;
206                 ST_SP(x5, x); x += 4;
207                 x15 *= da_vec;
208                 ST_SP(x6, x); x += 4;
209                 x14 *= da_vec;
210                 ST_SP(x7, x); x += 4;
211
212                 ST_SP8_INC(x8, x9, x10, x11, x12, x13, x14, x15, x, 4);
213             }
214
215             if (n & 63)
216             {
217                 if (n & 32)
218                 {
219                     LD_SP8_INC(px, 4, x0, x1, x2, x3, x4, x5, x6, x7);
220                     MUL4(x0, da_vec, x1, da_vec, x2, da_vec, x3, da_vec, x0, x1, x2, x3);
221                     MUL4(x4, da_vec, x5, da_vec, x6, da_vec, x7, da_vec, x4, x5, x6, x7);
222                     ST_SP8_INC(x0, x1, x2, x3, x4, x5, x6, x7, x, 4);
223                 }
224
225                 if (n & 16)
226                 {
227                     LD_SP4_INC(px, 4, x0, x1, x2, x3);
228                     MUL4(x0, da_vec, x1, da_vec, x2, da_vec, x3, da_vec, x0, x1, x2, x3);
229                     ST_SP4_INC(x0, x1, x2, x3, x, 4);
230                 }
231
232                 if (n & 8)
233                 {
234                     LD_SP2_INC(px, 4, x0, x1);
235                     MUL2(x0, da_vec, x1, da_vec, x0, x1);
236                     ST_SP2_INC(x0, x1, x, 4);
237                 }
238
239                 if (n & 4)
240                 {
241                     LD_GP4_INC(px, 1, f0, f1, f2, f3);
242                     MUL4(f0, da, f1, da, f2, da, f3, da, f0, f1, f2, f3);
243                     ST_GP4_INC(f0, f1, f2, f3, x, 1);
244                 }
245
246                 if (n & 2)
247                 {
248                     LD_GP2_INC(px, 1, f0, f1);
249                     MUL2(f0, da, f1, da, f0, f1);
250                     ST_GP2_INC(f0, f1, x, 1);
251                 }
252
253                 if (n & 1)
254                 {
255                     *x *= da;
256                 }
257             }
258         }
259     }
260     else
261     {
262         if (0.0 == da)
263         {
264             for (i = n; i--;)
265             {
266                 *x = 0;
267                 x += inc_x;
268             }
269         }
270         else
271         {
272             if (n > 15)
273             {
274                 LD_GP8_INC(px, inc_x, f0, f1, f2, f3, f4, f5, f6, f7);
275
276                 for (i = 0; i < (n >> 4) - 1; i++)
277                 {
278                     LD_GP8_INC(px, inc_x, f8, f9, f10, f11, f12, f13, f14, f15);
279                     MUL4(f0, da, f1, da, f2, da, f3, da, f0, f1, f2, f3);
280
281                     f4 *= da;
282                     f5 *= da;
283                     *x = f0; x += inc_x;
284                     f6 *= da;
285                     *x = f1; x += inc_x;
286                     f7 *= da;
287                     *x = f2; x += inc_x;
288                     f8 *= da;
289                     *x = f3; x += inc_x;
290                     f9 *= da;
291                     *x = f4; x += inc_x;
292                     f10 *= da;
293                     *x = f5; x += inc_x;
294                     f11 *= da;
295                     *x = f6; x += inc_x;
296                     f12 *= da;
297                     *x = f7; x += inc_x;
298                     f13 *= da;
299                     *x = f8; x += inc_x;
300                     f14 *= da;
301                     *x = f9; x += inc_x;
302                     f15 *= da;
303                     *x = f10; x += inc_x;
304                     *x = f11; x += inc_x;
305                     f0 = *px; px += inc_x;
306                     *x = f12; x += inc_x;
307                     f1 = *px; px += inc_x;
308                     *x = f13; x += inc_x;
309                     f2 = *px; px += inc_x;
310                     *x = f14; x += inc_x;
311                     f3 = *px; px += inc_x;
312                     *x = f15; x += inc_x;
313                     f4 = *px; px += inc_x;
314                     f5 = *px; px += inc_x;
315                     f6 = *px; px += inc_x;
316                     f7 = *px; px += inc_x;
317                 }
318
319                 LD_GP8_INC(px, inc_x, f8, f9, f10, f11, f12, f13, f14, f15);
320                 MUL4(f0, da, f1, da, f2, da, f3, da, f0, f1, f2, f3);
321
322                 f4 *= da;
323                 f5 *= da;
324                 *x = f0; x += inc_x;
325                 f6 *= da;
326                 *x = f1; x += inc_x;
327                 f7 *= da;
328                 *x = f2; x += inc_x;
329                 f8 *= da;
330                 *x = f3; x += inc_x;
331                 f9 *= da;
332                 *x = f4; x += inc_x;
333                 f10 *= da;
334                 *x = f5; x += inc_x;
335                 f11 *= da;
336                 *x = f6; x += inc_x;
337                 f12 *= da;
338                 *x = f7; x += inc_x;
339                 f13 *= da;
340                 *x = f8; x += inc_x;
341                 f14 *= da;
342                 *x = f9; x += inc_x;
343                 f15 *= da;
344                 *x = f10; x += inc_x;
345                 *x = f11; x += inc_x;
346                 *x = f12; x += inc_x;
347                 *x = f13; x += inc_x;
348                 *x = f14; x += inc_x;
349                 *x = f15; x += inc_x;
350             }
351
352             if (n & 15)
353             {
354                 if (n & 8)
355                 {
356                     LD_GP8_INC(px, inc_x, f0, f1, f2, f3, f4, f5, f6, f7);
357                     MUL4(f0, da, f1, da, f2, da, f3, da, f0, f1, f2, f3);
358                     MUL4(f4, da, f5, da, f6, da, f7, da, f4, f5, f6, f7);
359                     ST_GP8_INC(f0, f1, f2, f3, f4, f5, f6, f7, x, inc_x);
360                 }
361
362                 if (n & 4)
363                 {
364                     LD_GP4_INC(px, inc_x, f0, f1, f2, f3);
365                     MUL4(f0, da, f1, da, f2, da, f3, da, f0, f1, f2, f3);
366                     ST_GP4_INC(f0, f1, f2, f3, x, inc_x);
367                 }
368
369                 if (n & 2)
370                 {
371                     LD_GP2_INC(px, inc_x, f0, f1);
372                     MUL2(f0, da, f1, da, f0, f1);
373                     ST_GP2_INC(f0, f1, x, inc_x);
374                 }
375
376                 if (n & 1)
377                 {
378                     *x *= da;
379                 }
380             }
381         }
382     }
383
384     return 0;
385 }