small fixes, some (i(dz)amin,i(dz)amax,(dz)dot,(dz)asum) mikrokernels can be inlined
[platform/upstream/openblas.git] / kernel / zarch / zdot.c
1 /***************************************************************************
2 Copyright (c) 2013-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
29 #include "common.h"
30 #if defined(Z13)
31
32 static void zdot_kernel_8(BLASLONG n, FLOAT *x, FLOAT *y, FLOAT *d) {
33
34     __asm__ volatile(
35             "pfd 1, 0(%2) \n\t"
36             "pfd 1, 0(%3) \n\t"
37             "vzero %%v24  \n\t"
38             "vzero %%v25  \n\t"
39             "vzero %%v26  \n\t"
40             "vzero %%v27  \n\t"
41             "srlg %1,%1,3      \n\t"
42             "xgr %%r1,%%r1       \n\t"
43             ".align 16 \n\t"
44             "1: \n\t"
45             "pfd 1, 256(%%r1,%2)     \n\t"
46             "pfd 1, 256(%%r1,%3)     \n\t"
47             "vl  %%v16,  0(%%r1,%2)  \n\t"
48             "vl  %%v17, 16(%%r1,%2)  \n\t"
49             "vl  %%v18, 32(%%r1,%2)  \n\t"
50             "vl  %%v19, 48(%%r1,%2)  \n\t"
51             "vl  %%v28,  0(%%r1,%3)  \n\t"
52             "vl  %%v29, 16(%%r1,%3)  \n\t"
53             "vl  %%v30, 32(%%r1,%3)  \n\t"
54             "vl  %%v31, 48(%%r1,%3)  \n\t"
55             "vpdi %%v20,%%v16,%%v16,4 \n\t"
56             "vpdi %%v21,%%v17,%%v17,4 \n\t"
57             "vpdi %%v22,%%v18,%%v18,4 \n\t"
58             "vpdi %%v23,%%v19,%%v19,4 \n\t"
59
60
61             "vfmadb    %%v24,%%v16,%%v28,%%v24  \n\t"
62             "vfmadb    %%v25,%%v20,%%v28,%%v25  \n\t"
63             "vfmadb    %%v26,%%v17,%%v29,%%v26  \n\t"
64             "vfmadb    %%v27,%%v21,%%v29,%%v27  \n\t"
65             "vfmadb    %%v24,%%v18,%%v30,%%v24  \n\t"
66             "vfmadb    %%v25,%%v22,%%v30,%%v25  \n\t"
67             "vfmadb    %%v26,%%v19,%%v31,%%v26  \n\t"
68             "vfmadb    %%v27,%%v23,%%v31,%%v27  \n\t"
69
70
71
72             "vl  %%v16, 64(%%r1,%2) \n\t"
73             "vl  %%v17, 80(%%r1,%2) \n\t"
74             "vl  %%v18, 96(%%r1,%2) \n\t"
75             "vl  %%v19,112(%%r1,%2) \n\t"
76             "vl  %%v28, 64(%%r1,%3) \n\t"
77             "vl  %%v29, 80(%%r1,%3) \n\t"
78             "vl  %%v30, 96(%%r1,%3) \n\t"
79             "vl  %%v31,112(%%r1,%3) \n\t"
80             "vpdi %%v20,%%v16,%%v16,4 \n\t"
81             "vpdi %%v21,%%v17,%%v17,4 \n\t"
82             "vpdi %%v22,%%v18,%%v18,4 \n\t"
83             "vpdi %%v23,%%v19,%%v19,4 \n\t"
84             "vfmadb    %%v24,%%v16,%%v28,%%v24  \n\t"
85             "vfmadb    %%v25,%%v20,%%v28,%%v25  \n\t"
86             "vfmadb    %%v26,%%v17,%%v29,%%v26  \n\t"
87             "vfmadb    %%v27,%%v21,%%v29,%%v27  \n\t"
88             "vfmadb    %%v24,%%v18,%%v30,%%v24  \n\t"
89             "vfmadb    %%v25,%%v22,%%v30,%%v25  \n\t"
90             "vfmadb    %%v26,%%v19,%%v31,%%v26  \n\t"
91             "vfmadb    %%v27,%%v23,%%v31,%%v27  \n\t"
92
93
94             "la %%r1,128(%%r1) \n\t"
95             "brctg %1,1b     \n\t"
96             "vfadb %%v24,%%v26,%%v24 \n\t"
97             "vfadb %%v25,%%v25,%%v27 \n\t"
98             "vsteg %%v24,0(%4),0     \n\t"
99             "vsteg %%v24,8(%4),1     \n\t"
100             "vsteg %%v25,16(%4),1    \n\t"
101             "vsteg %%v25,24(%4),0    \n\t"
102             : "=m"(*d) ,"+&r"(n) 
103             :  "a"(x), "a"(y), "a"(d)
104             : "cc", "r1","v16",
105             "v17","v18","v19","v20","v21","v22","v23","v24","v25","v26","v27","v28","v29","v30","v31" 
106             );
107
108 }
109
110 #else
111
112 static  void zdot_kernel_8(BLASLONG n, FLOAT *x, FLOAT *y, FLOAT *d) {
113     BLASLONG register i = 0;
114     FLOAT dot[4] = {0.0, 0.0, 0.0, 0.0};
115     BLASLONG j = 0;
116
117     while (i < n) {
118
119         dot[0] += x[j] * y[j];
120         dot[1] += x[j + 1] * y[j + 1];
121         dot[2] += x[j] * y[j + 1];
122         dot[3] += x[j + 1] * y[j];
123
124         dot[0] += x[j + 2] * y[j + 2];
125         dot[1] += x[j + 3] * y[j + 3];
126         dot[2] += x[j + 2] * y[j + 3];
127         dot[3] += x[j + 3] * y[j + 2];
128
129         dot[0] += x[j + 4] * y[j + 4];
130         dot[1] += x[j + 5] * y[j + 5];
131         dot[2] += x[j + 4] * y[j + 5];
132         dot[3] += x[j + 5] * y[j + 4];
133
134         dot[0] += x[j + 6] * y[j + 6];
135         dot[1] += x[j + 7] * y[j + 7];
136         dot[2] += x[j + 6] * y[j + 7];
137         dot[3] += x[j + 7] * y[j + 6];
138
139         j += 8;
140         i += 4;
141
142     }
143     d[0] = dot[0];
144     d[1] = dot[1];
145     d[2] = dot[2];
146     d[3] = dot[3];
147
148 }
149
150 #endif
151
152 OPENBLAS_COMPLEX_FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x, FLOAT *y, BLASLONG inc_y) {
153     BLASLONG i;
154     BLASLONG ix, iy;
155     OPENBLAS_COMPLEX_FLOAT result;
156     FLOAT dot[4] __attribute__ ((aligned(16))) = {0.0, 0.0, 0.0, 0.0};
157
158     if (n <= 0) {
159         CREAL(result) = 0.0;
160         CIMAG(result) = 0.0;
161         return (result);
162
163     }
164
165     if ((inc_x == 1) && (inc_y == 1)) {
166
167         BLASLONG n1 = n & -16;
168
169         if (n1)
170             zdot_kernel_8(n1, x, y, dot);
171
172         i = n1;
173         BLASLONG j = i * 2;
174
175         while (i < n) {
176
177             dot[0] += x[j] * y[j];
178             dot[1] += x[j + 1] * y[j + 1];
179             dot[2] += x[j] * y[j + 1];
180             dot[3] += x[j + 1] * y[j];
181
182             j += 2;
183             i++;
184
185         }
186
187
188     } else {
189         i = 0;
190         ix = 0;
191         iy = 0;
192         inc_x <<= 1;
193         inc_y <<= 1;
194         while (i < n) {
195
196             dot[0] += x[ix] * y[iy];
197             dot[1] += x[ix + 1] * y[iy + 1];
198             dot[2] += x[ix] * y[iy + 1];
199             dot[3] += x[ix + 1] * y[iy];
200
201             ix += inc_x;
202             iy += inc_y;
203             i++;
204
205         }
206     }
207
208 #if !defined(CONJ)
209     CREAL(result) = dot[0] - dot[1];
210     CIMAG(result) = dot[2] + dot[3];
211 #else
212     CREAL(result) = dot[0] + dot[1];
213     CIMAG(result) = dot[2] - dot[3];
214
215 #endif
216
217     return (result);
218
219 }
220
221