3966dfa1c87f2efd7f79cc1ad1d8adad0413fc86
[platform/upstream/openblas.git] / kernel / zarch / izamax.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
29 #include "common.h"
30 #include <math.h>
31  
32 #define ABS fabs 
33 #define CABS1(x,i)    ABS(x[i])+ABS(x[i+1])
34
35  
36
37 static BLASLONG __attribute__((noinline)) ziamax_kernel_8_TUNED(BLASLONG n, FLOAT *x, FLOAT *maxf) { 
38
39     __asm__(
40             "pfd 1, 0(%1) \n\t" 
41             "VLEIG  %%v16,0,0  \n\t"
42             "VLEIG  %%v16,1,1  \n\t"
43             "VLEIG  %%v17,2,0  \n\t"
44             "VLEIG  %%v17,3,1  \n\t"
45             "VLEIG  %%v18,4,0  \n\t"
46             "VLEIG  %%v18,5,1  \n\t"
47             "VLEIG  %%v19,6,0  \n\t"
48             "VLEIG  %%v19,7,1  \n\t" 
49             "VLEIG  %%v20,8,0  \n\t"
50             "VLEIG  %%v20,9,1  \n\t"
51             "VLEIG  %%v21,10,0 \n\t"
52             "VLEIG  %%v21,11,1 \n\t"
53             "VLEIG  %%v22,12,0 \n\t"
54             "VLEIG  %%v22,13,1 \n\t"
55             "VLEIG  %%v23,14,0 \n\t"
56             "VLEIG  %%v23,15,1 \n\t" 
57     
58     
59             "sllg %%r0,%0,4 \n\t"
60             "agr %%r0,%1    \n\t" 
61             "vzero %%v6     \n\t"
62             "vzero %%v7     \n\t"
63             "VREPIG %%v4,16 \n\t"
64             "vzero %%v5     \n\t"
65             ".align 16 \n\t"
66             "1: \n\t"
67             "pfd 1, 256(%1 ) \n\t"
68         
69             "vleg %%v24 ,  0( %1),0 \n\t" 
70             "vleg %%v25 ,  8( %1),0 \n\t"
71             "vleg %%v24 , 16( %1),1 \n\t" 
72             "vleg %%v25 , 24( %1),1 \n\t"
73             "vleg %%v26 , 32( %1),0 \n\t"  
74             "vleg %%v27 , 40( %1),0 \n\t"
75             "vleg %%v26 , 48( %1),1 \n\t" 
76             "vleg %%v27 , 56( %1),1 \n\t" 
77             "vleg %%v28 , 64( %1),0 \n\t" 
78             "vleg %%v29 , 72( %1),0 \n\t" 
79             "vleg %%v28 , 80( %1),1 \n\t"
80             "vleg %%v29 , 88( %1),1 \n\t" 
81             "vleg %%v30 , 96( %1),0 \n\t"  
82             "vleg %%v31 ,104( %1),0 \n\t"
83             "vleg %%v30 ,112( %1),1 \n\t"
84             "vleg %%v31 ,120( %1),1 \n\t"  
85             "vflpdb  %%v24, %%v24   \n\t" 
86             "vflpdb  %%v25, %%v25   \n\t" 
87             "vflpdb  %%v26, %%v26   \n\t" 
88             "vflpdb  %%v27, %%v27   \n\t" 
89             "vflpdb  %%v28, %%v28   \n\t" 
90             "vflpdb  %%v29, %%v29   \n\t"
91             "vflpdb  %%v30, %%v30   \n\t" 
92             "vflpdb  %%v31, %%v31   \n\t"    
93      
94             "vfadb %%v0,%%v24,%%v25 \n\t"
95             "vfadb %%v1,%%v26,%%v27 \n\t"
96             "vfadb %%v2,%%v28,%%v29 \n\t"
97             "vfadb %%v3,%%v30,%%v31 \n\t"
98      
99     
100             "vleg %%v24 , 128( %1),0  \n\t" 
101             "vleg %%v25 , 136( %1),0  \n\t"
102             "vleg %%v24 , 144( %1),1  \n\t" 
103             "vleg %%v25 , 152( %1),1  \n\t"
104             "vleg %%v26 , 160( %1),0  \n\t"  
105             "vleg %%v27 , 168( %1),0  \n\t"
106             "vleg %%v26 , 176( %1),1  \n\t" 
107             "vleg %%v27 , 184( %1),1  \n\t" 
108             "vleg %%v28 , 192( %1),0  \n\t" 
109             "vleg %%v29 , 200( %1),0  \n\t" 
110             "vleg %%v28 , 208( %1),1  \n\t"
111             "vleg %%v29 , 216( %1),1  \n\t" 
112             "vleg %%v30 , 224( %1),0  \n\t"  
113             "vleg %%v31 , 232( %1),0  \n\t"
114             "vleg %%v30 , 240( %1),1  \n\t"
115             "vleg %%v31 , 248( %1),1  \n\t"  
116             "vflpdb  %%v24, %%v24 \n\t" 
117             "vflpdb  %%v25, %%v25 \n\t" 
118             "vflpdb  %%v26, %%v26 \n\t" 
119             "vflpdb  %%v27, %%v27 \n\t" 
120             "vflpdb  %%v28, %%v28 \n\t" 
121             "vflpdb  %%v29, %%v29 \n\t"
122             "vflpdb  %%v30, %%v30 \n\t" 
123             "vflpdb  %%v31, %%v31 \n\t"    
124      
125             "vfadb %%v24,%%v24,%%v25  \n\t"
126             "vfadb %%v26,%%v26,%%v27  \n\t"
127             "vfadb %%v28,%%v28,%%v29  \n\t"
128             "vfadb %%v30,%%v30,%%v31  \n\t"
129     
130             "vfchdb  %%v25,%%v1,%%v0  \n\t" 
131             "vsel  %%v29,%%v17,%%v16,%%v25 \n\t"
132             "vsel  %%v31,%%v1,%%v0,%%v25   \n\t"  
133     
134             "vfchdb  %%v27,%%v3,%%v2 \n\t "   
135             "vsel  %%v0,%%v19,%%v18,%%v27 \n\t"
136             "vsel  %%v1,%%v3,%%v2,%%v27   \n\t"  
137     
138             "vfchdb  %%v25,%%v26,%%v24  \n\t " 
139             "vsel  %%v2,%%v21,%%v20,%%v25 \n\t"
140             "vsel  %%v3,%%v26,%%v24,%%v25 \n\t" 
141     
142             "vfchdb  %%v27,%%v30,%%v28 \n\t "   
143             "vsel  %%v25,%%v23,%%v22,%%v27 \n\t"
144             "vsel  %%v27,%%v30,%%v28,%%v27 \n\t"  
145     
146             "vfchdb %%v24, %%v1,%%v31      \n\t" 
147             "vsel  %%v26,%%v0,%%v29,%%v24  \n\t" 
148             "vsel  %%v28,%%v1,%%v31,%%v24  \n\t"
149     
150             "vfchdb %%v30, %%v27,%%v3      \n\t" 
151             "vsel  %%v29,%%v25,%%v2,%%v30  \n\t" 
152             "vsel  %%v31,%%v27,%%v3 ,%%v30 \n\t" 
153     
154             "la %1,256(%1)      \n\t"  
155            
156             "vfchdb %%v0, %%v31,%%v28     \n\t" 
157             "vsel  %%v25,%%v29,%%v26,%%v0 \n\t" 
158             "vsel  %%v27,%%v31,%%v28,%%v0 \n\t"
159     
160             "VAG %%v25,%%v25,%%v5 \n\t"
161     
162              //cmp with previous
163             "vfchdb %%v30, %%v27,%%v6    \n\t"
164             "vsel  %%v7,%%v25,%%v7,%%v30 \n\t" 
165             "vsel  %%v6,%%v27,%%v6,%%v30 \n\t"
166     
167             "VAG %%v5,%%v5,%%v4 \n\t" 
168     
169             "clgrjl %1,%%r0,1b \n\t"
170
171             //xtract index
172             "vrepg %%v26,%%v6,1      \n\t"
173             "vrepg %%v5,%%v7,1       \n\t"
174             "wfcdb  %%v26,%%v6       \n\t"
175             "jne 2f  \n\t"
176             "VSTEG   %%v6,0(%2),0  \n\t"
177             "VMNLG  %%v1,%%v5,%%v7 \n\t"
178             "VLGVG  %%r2,%%v1,0  \n\t"
179             "br %%r14  \n\t"
180             "2: \n\t"
181             "wfchdb  %%v16,%%v26,%%v6      \n\t"
182             "vsel    %%v1,%%v5,%%v7,%%v16  \n\t"
183             "vsel    %%v0,%%v26,%%v6,%%v16 \n\t"
184             "VLGVG  %%r2,%%v1,0  \n\t"
185             "std %%f0,0(%2)    \n\t"
186
187             :
188             : "r"(n), "a"(x), "a"(maxf)
189             : "cc", "memory","r0","r1","r2","f0","v0","v1","v2","v3","v4","v5","v6","v7","v16",
190             "v17","v18","v19","v20","v21","v22","v23","v24","v25","v26","v27","v28","v29","v30","v31"
191
192             );
193
194 }
195
196
197   
198
199  
200  
201
202 BLASLONG CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x)
203 {
204     BLASLONG i = 0;
205     BLASLONG ix = 0;
206     FLOAT maxf = 0;
207     BLASLONG max = 0;
208     BLASLONG inc_x2;
209
210     if (n <= 0 || inc_x <= 0) return(max);
211      
212     if (inc_x == 1) {
213
214       BLASLONG n1 = n & -8;
215       if (n1 > 0) {
216
217             max = ziamax_kernel_8_TUNED(n1, x, &maxf);
218
219             i = n1;
220       }
221
222       while(i < n)
223     {
224         if( CABS1(x,ix) > maxf )
225         {
226             max = i;
227             maxf = CABS1(x,ix);
228         }
229         ix += 2;
230         i++;
231     }
232         return (max + 1);
233
234     } else {
235  
236       inc_x2 = 2 * inc_x;
237
238     maxf = CABS1(x,0);
239     ix += inc_x2;
240     i++;
241
242     while(i < n)
243     {
244         if( CABS1(x,ix) > maxf )
245         {
246             max = i;
247             maxf = CABS1(x,ix);
248         }
249         ix += inc_x2;
250         i++;
251     }
252         return (max + 1);
253     }
254  
255 }
256
257