fix build error
[platform/upstream/openblas.git] / kernel / mips / zswap_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 n, BLASLONG dummy0, BLASLONG dummy1, FLOAT dummy3,
32           FLOAT dummy4, FLOAT *srcx, BLASLONG inc_x, FLOAT *srcy,
33           BLASLONG inc_y, FLOAT *dummy, BLASLONG dummy2)
34 {
35     BLASLONG i, inc_x2, inc_y2, pref_offsetx, pref_offsety;
36     FLOAT *px, *py;
37     v2f64 x0, x1, x2, x3, x4, x5, x6, x7;
38     v2f64 y0, y1, y2, y3, y4, y5, y6, y7;
39
40     if (n < 0) return (0);
41
42     pref_offsetx = (BLASLONG)srcx & (L1_DATA_LINESIZE - 1);
43     if (pref_offsetx > 0)
44     {
45         pref_offsetx = L1_DATA_LINESIZE - pref_offsetx;
46         pref_offsetx = pref_offsetx / sizeof(FLOAT);
47     }
48
49     pref_offsety = (BLASLONG)srcy & (L1_DATA_LINESIZE - 1);
50     if (pref_offsety > 0)
51     {
52         pref_offsety = L1_DATA_LINESIZE - pref_offsety;
53         pref_offsety = pref_offsety / sizeof(FLOAT);
54     }
55
56     inc_x2 = 2 * inc_x;
57     inc_y2 = 2 * inc_y;
58
59     px = srcx;
60     py = srcy;
61
62     if ((1 == inc_x) && (1 == inc_y))
63     {
64         if (n >> 3)
65         {
66             LD_DP8_INC(px, 2, x0, x1, x2, x3, x4, x5, x6, x7);
67
68             for (i = (n >> 3) - 1; i--;)
69             {
70                 PREFETCH(px + pref_offsetx + 16);
71                 PREFETCH(px + pref_offsetx + 20);
72                 PREFETCH(px + pref_offsetx + 24);
73                 PREFETCH(px + pref_offsetx + 28);
74
75                 PREFETCH(py + pref_offsety + 16);
76                 PREFETCH(py + pref_offsety + 20);
77                 PREFETCH(py + pref_offsety + 24);
78                 PREFETCH(py + pref_offsety + 28);
79
80                 y0 = LD_DP(py); py += 2;
81                 ST_DP(x0, srcy); srcy += 2;
82                 y1 = LD_DP(py); py += 2;
83                 ST_DP(x1, srcy); srcy += 2;
84                 y2 = LD_DP(py); py += 2;
85                 ST_DP(x2, srcy); srcy += 2;
86                 y3 = LD_DP(py); py += 2;
87                 ST_DP(x3, srcy); srcy += 2;
88                 y4 = LD_DP(py); py += 2;
89                 ST_DP(x4, srcy); srcy += 2;
90                 y5 = LD_DP(py); py += 2;
91                 ST_DP(x5, srcy); srcy += 2;
92                 y6 = LD_DP(py); py += 2;
93                 ST_DP(x6, srcy); srcy += 2;
94                 y7 = LD_DP(py); py += 2;
95                 ST_DP(x7, srcy); srcy += 2;
96
97                 x0 = LD_DP(px); px += 2;
98                 ST_DP(y0, srcx); srcx += 2;
99                 x1 = LD_DP(px); px += 2;
100                 ST_DP(y1, srcx); srcx += 2;
101                 x2 = LD_DP(px); px += 2;
102                 ST_DP(y2, srcx); srcx += 2;
103                 x3 = LD_DP(px); px += 2;
104                 ST_DP(y3, srcx); srcx += 2;
105                 x4 = LD_DP(px); px += 2;
106                 ST_DP(y4, srcx); srcx += 2;
107                 x5 = LD_DP(px); px += 2;
108                 ST_DP(y5, srcx); srcx += 2;
109                 x6 = LD_DP(px); px += 2;
110                 ST_DP(y6, srcx); srcx += 2;
111                 x7 = LD_DP(px); px += 2;
112                 ST_DP(y7, srcx); srcx += 2;
113             }
114
115             LD_DP8_INC(py, 2, y0, y1, y2, y3, y4, y5, y6, y7);
116             ST_DP8_INC(x0, x1, x2, x3, x4, x5, x6, x7, srcy, 2);
117             ST_DP8_INC(y0, y1, y2, y3, y4, y5, y6, y7, srcx, 2);
118         }
119
120         if (n & 7)
121         {
122             if ((n & 4) && (n & 2) && (n & 1))
123             {
124                 LD_DP7_INC(px, 2, x0, x1, x2, x3, x4, x5, x6);
125                 LD_DP7_INC(py, 2, y0, y1, y2, y3, y4, y5, y6);
126                 ST_DP7_INC(x0, x1, x2, x3, x4, x5, x6, srcy, 2);
127                 ST_DP7_INC(y0, y1, y2, y3, y4, y5, y6, srcx, 2);
128             }
129             else if ((n & 4) && (n & 2))
130             {
131                 LD_DP6_INC(px, 2, x0, x1, x2, x3, x4, x5);
132                 LD_DP6_INC(py, 2, y0, y1, y2, y3, y4, y5);
133                 ST_DP6_INC(x0, x1, x2, x3, x4, x5, srcy, 2);
134                 ST_DP6_INC(y0, y1, y2, y3, y4, y5, srcx, 2);
135             }
136             else if ((n & 4) && (n & 1))
137             {
138                 LD_DP5_INC(px, 2, x0, x1, x2, x3, x4);
139                 LD_DP5_INC(py, 2, y0, y1, y2, y3, y4);
140                 ST_DP5_INC(x0, x1, x2, x3, x4, srcy, 2);
141                 ST_DP5_INC(y0, y1, y2, y3, y4, srcx, 2);
142             }
143             else if ((n & 2) && (n & 1))
144             {
145                 LD_DP3_INC(px, 2, x0, x1, x2);
146                 LD_DP3_INC(py, 2, y0, y1, y2);
147                 ST_DP3_INC(x0, x1, x2, srcy, 2);
148                 ST_DP3_INC(y0, y1, y2, srcx, 2);
149             }
150             else if (n & 4)
151             {
152                 LD_DP4_INC(px, 2, x0, x1, x2, x3);
153                 LD_DP4_INC(py, 2, y0, y1, y2, y3);
154                 ST_DP4_INC(x0, x1, x2, x3, srcy, 2);
155                 ST_DP4_INC(y0, y1, y2, y3, srcx, 2);
156             }
157             else if (n & 2)
158             {
159                 LD_DP2_INC(px, 2, x0, x1);
160                 LD_DP2_INC(py, 2, y0, y1);
161                 ST_DP2_INC(x0, x1, srcy, 2);
162                 ST_DP2_INC(y0, y1, srcx, 2);
163             }
164             else if (n & 1)
165             {
166                 x0 = LD_DP(px);
167                 y0 = LD_DP(py);
168                 ST_DP(y0, srcx);
169                 ST_DP(x0, srcy);
170             }
171         }
172     }
173     else
174     {
175         for (i = (n >> 3); i--;)
176         {
177             LD_DP8_INC(px, inc_x2, x0, x1, x2, x3, x4, x5, x6, x7);
178             LD_DP8_INC(py, inc_y2, y0, y1, y2, y3, y4, y5, y6, y7);
179             ST_DP8_INC(x0, x1, x2, x3, x4, x5, x6, x7, srcy, inc_y2);
180             ST_DP8_INC(y0, y1, y2, y3, y4, y5, y6, y7, srcx, inc_x2);
181         }
182
183         if (n & 7)
184         {
185             if ((n & 4) && (n & 2) && (n & 1))
186             {
187                 LD_DP7_INC(px, inc_x2, x0, x1, x2, x3, x4, x5, x6);
188                 LD_DP7_INC(py, inc_y2, y0, y1, y2, y3, y4, y5, y6);
189                 ST_DP7_INC(x0, x1, x2, x3, x4, x5, x6, srcy, inc_y2);
190                 ST_DP7_INC(y0, y1, y2, y3, y4, y5, y6, srcx, inc_x2);
191             }
192             else if ((n & 4) && (n & 2))
193             {
194                 LD_DP6_INC(px, inc_x2, x0, x1, x2, x3, x4, x5);
195                 LD_DP6_INC(py, inc_y2, y0, y1, y2, y3, y4, y5);
196                 ST_DP6_INC(x0, x1, x2, x3, x4, x5, srcy, inc_y2);
197                 ST_DP6_INC(y0, y1, y2, y3, y4, y5, srcx, inc_x2);
198             }
199             else if ((n & 4) && (n & 1))
200             {
201                 LD_DP5_INC(px, inc_x2, x0, x1, x2, x3, x4);
202                 LD_DP5_INC(py, inc_y2, y0, y1, y2, y3, y4);
203                 ST_DP5_INC(x0, x1, x2, x3, x4, srcy, inc_y2);
204                 ST_DP5_INC(y0, y1, y2, y3, y4, srcx, inc_x2);
205             }
206             else if ((n & 2) && (n & 1))
207             {
208                 LD_DP3_INC(px, inc_x2, x0, x1, x2);
209                 LD_DP3_INC(py, inc_y2, y0, y1, y2);
210                 ST_DP3_INC(x0, x1, x2, srcy, inc_y2);
211                 ST_DP3_INC(y0, y1, y2, srcx, inc_x2);
212             }
213             else if (n & 4)
214             {
215                 LD_DP4_INC(px, inc_x2, x0, x1, x2, x3);
216                 LD_DP4_INC(py, inc_y2, y0, y1, y2, y3);
217                 ST_DP4_INC(x0, x1, x2, x3, srcy, inc_y2);
218                 ST_DP4_INC(y0, y1, y2, y3, srcx, inc_x2);
219             }
220             else if (n & 2)
221             {
222                 LD_DP2_INC(px, inc_x2, x0, x1);
223                 LD_DP2_INC(py, inc_y2, y0, y1);
224                 ST_DP2_INC(x0, x1, srcy, inc_y2);
225                 ST_DP2_INC(y0, y1, srcx, inc_x2);
226             }
227             else if (n & 1)
228             {
229                 x0 = LD_DP(px);
230                 y0 = LD_DP(py);
231                 ST_DP(y0, srcx);
232                 ST_DP(x0, srcy);
233             }
234         }
235     }
236
237     return (0);
238 }