Add CPUID identification of Intel Ice Lake
[platform/upstream/openblas.git] / interface / ztrsv.c
1 /*********************************************************************/
2 /* Copyright 2009, 2010 The University of Texas at Austin.           */
3 /* All rights reserved.                                              */
4 /*                                                                   */
5 /* Redistribution and use in source and binary forms, with or        */
6 /* without modification, are permitted provided that the following   */
7 /* conditions are met:                                               */
8 /*                                                                   */
9 /*   1. Redistributions of source code must retain the above         */
10 /*      copyright notice, this list of conditions and the following  */
11 /*      disclaimer.                                                  */
12 /*                                                                   */
13 /*   2. Redistributions in binary form must reproduce the above      */
14 /*      copyright notice, this list of conditions and the following  */
15 /*      disclaimer in the documentation and/or other materials       */
16 /*      provided with the distribution.                              */
17 /*                                                                   */
18 /*    THIS  SOFTWARE IS PROVIDED  BY THE  UNIVERSITY OF  TEXAS AT    */
19 /*    AUSTIN  ``AS IS''  AND ANY  EXPRESS OR  IMPLIED WARRANTIES,    */
20 /*    INCLUDING, BUT  NOT LIMITED  TO, THE IMPLIED  WARRANTIES OF    */
21 /*    MERCHANTABILITY  AND FITNESS FOR  A PARTICULAR  PURPOSE ARE    */
22 /*    DISCLAIMED.  IN  NO EVENT SHALL THE UNIVERSITY  OF TEXAS AT    */
23 /*    AUSTIN OR CONTRIBUTORS BE  LIABLE FOR ANY DIRECT, INDIRECT,    */
24 /*    INCIDENTAL,  SPECIAL, EXEMPLARY,  OR  CONSEQUENTIAL DAMAGES    */
25 /*    (INCLUDING, BUT  NOT LIMITED TO,  PROCUREMENT OF SUBSTITUTE    */
26 /*    GOODS  OR  SERVICES; LOSS  OF  USE,  DATA,  OR PROFITS;  OR    */
27 /*    BUSINESS INTERRUPTION) HOWEVER CAUSED  AND ON ANY THEORY OF    */
28 /*    LIABILITY, WHETHER  IN CONTRACT, STRICT  LIABILITY, OR TORT    */
29 /*    (INCLUDING NEGLIGENCE OR OTHERWISE)  ARISING IN ANY WAY OUT    */
30 /*    OF  THE  USE OF  THIS  SOFTWARE,  EVEN  IF ADVISED  OF  THE    */
31 /*    POSSIBILITY OF SUCH DAMAGE.                                    */
32 /*                                                                   */
33 /* The views and conclusions contained in the software and           */
34 /* documentation are those of the authors and should not be          */
35 /* interpreted as representing official policies, either expressed   */
36 /* or implied, of The University of Texas at Austin.                 */
37 /*********************************************************************/
38
39 #include <stdio.h>
40 #include <ctype.h>
41 #include "common.h"
42 #ifdef FUNCTION_PROFILE
43 #include "functable.h"
44 #endif
45
46 #ifdef XDOUBLE
47 #define ERROR_NAME "XTRSV "
48 #elif defined(DOUBLE)
49 #define ERROR_NAME "ZTRSV "
50 #else
51 #define ERROR_NAME "CTRSV "
52 #endif
53
54 static int (*trsv[])(BLASLONG, FLOAT *, BLASLONG, FLOAT *, BLASLONG, void *) = {
55 #ifdef XDOUBLE
56   xtrsv_NUU, xtrsv_NUN, xtrsv_NLU, xtrsv_NLN,
57   xtrsv_TUU, xtrsv_TUN, xtrsv_TLU, xtrsv_TLN,
58   xtrsv_RUU, xtrsv_RUN, xtrsv_RLU, xtrsv_RLN,
59   xtrsv_CUU, xtrsv_CUN, xtrsv_CLU, xtrsv_CLN,
60 #elif defined(DOUBLE)
61   ztrsv_NUU, ztrsv_NUN, ztrsv_NLU, ztrsv_NLN,
62   ztrsv_TUU, ztrsv_TUN, ztrsv_TLU, ztrsv_TLN,
63   ztrsv_RUU, ztrsv_RUN, ztrsv_RLU, ztrsv_RLN,
64   ztrsv_CUU, ztrsv_CUN, ztrsv_CLU, ztrsv_CLN,
65 #else
66   ctrsv_NUU, ctrsv_NUN, ctrsv_NLU, ctrsv_NLN,
67   ctrsv_TUU, ctrsv_TUN, ctrsv_TLU, ctrsv_TLN,
68   ctrsv_RUU, ctrsv_RUN, ctrsv_RLU, ctrsv_RLN,
69   ctrsv_CUU, ctrsv_CUN, ctrsv_CLU, ctrsv_CLN,
70 #endif
71 };
72
73 #ifndef CBLAS
74
75 void NAME(char *UPLO, char *TRANS, char *DIAG,
76            blasint *N, FLOAT *a, blasint *LDA, FLOAT *x, blasint *INCX){
77
78   char uplo_arg  = *UPLO;
79   char trans_arg = *TRANS;
80   char diag_arg  = *DIAG;
81
82   blasint n    = *N;
83   blasint lda  = *LDA;
84   blasint incx = *INCX;
85
86   blasint info;
87   int uplo;
88   int unit;
89   int trans;
90   FLOAT *buffer;
91
92   PRINT_DEBUG_NAME;
93
94   TOUPPER(uplo_arg);
95   TOUPPER(trans_arg);
96   TOUPPER(diag_arg);
97
98   trans = -1;
99   unit  = -1;
100   uplo  = -1;
101
102   if (trans_arg == 'N') trans = 0;
103   if (trans_arg == 'T') trans = 1;
104   if (trans_arg == 'R') trans = 2;
105   if (trans_arg == 'C') trans = 3;
106
107   if (diag_arg  == 'U') unit  = 0;
108   if (diag_arg  == 'N') unit  = 1;
109
110   if (uplo_arg  == 'U') uplo  = 0;
111   if (uplo_arg  == 'L') uplo  = 1;
112
113
114   info = 0;
115
116   if (incx == 0)          info =  8;
117   if (lda  < MAX(1, n))   info =  6;
118   if (n < 0)              info =  4;
119   if (unit  < 0)          info =  3;
120   if (trans < 0)          info =  2;
121   if (uplo  < 0)          info =  1;
122
123   if (info != 0) {
124     BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME));
125     return;
126   }
127
128
129 #else
130
131 void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo,
132            enum CBLAS_TRANSPOSE TransA, enum CBLAS_DIAG Diag,
133            blasint n, void  *va, blasint lda, void  *vx, blasint incx) {
134
135   FLOAT *a = (FLOAT*) va;
136   FLOAT *x = (FLOAT*) vx;
137   
138   int trans, uplo, unit;
139   blasint info;
140   FLOAT *buffer;
141
142   PRINT_DEBUG_CNAME;
143
144   unit  = -1;
145   uplo  = -1;
146   trans = -1;
147   info  =  0;
148
149   if (order == CblasColMajor) {
150     if (Uplo == CblasUpper)         uplo  = 0;
151     if (Uplo == CblasLower)         uplo  = 1;
152
153     if (TransA == CblasNoTrans)     trans = 0;
154     if (TransA == CblasTrans)       trans = 1;
155     if (TransA == CblasConjNoTrans) trans = 2;
156     if (TransA == CblasConjTrans)   trans = 3;
157
158     if (Diag == CblasUnit)          unit  = 0;
159     if (Diag == CblasNonUnit)       unit  = 1;
160
161     info = -1;
162
163     if (incx == 0)          info =  8;
164     if (lda  < MAX(1, n))   info =  6;
165     if (n < 0)              info =  4;
166     if (unit  < 0)          info =  3;
167     if (trans < 0)          info =  2;
168     if (uplo  < 0)          info =  1;
169   }
170
171   if (order == CblasRowMajor) {
172     if (Uplo == CblasUpper)         uplo  = 1;
173     if (Uplo == CblasLower)         uplo  = 0;
174
175     if (TransA == CblasNoTrans)     trans = 1;
176     if (TransA == CblasTrans)       trans = 0;
177     if (TransA == CblasConjNoTrans) trans = 3;
178     if (TransA == CblasConjTrans)   trans = 2;
179
180     if (Diag == CblasUnit)          unit  = 0;
181     if (Diag == CblasNonUnit)       unit  = 1;
182
183     info = -1;
184
185     if (incx == 0)          info =  8;
186     if (lda  < MAX(1, n))   info =  6;
187     if (n < 0)              info =  4;
188     if (unit  < 0)          info =  3;
189     if (trans < 0)          info =  2;
190     if (uplo  < 0)          info =  1;
191   }
192
193   if (info >= 0) {
194     BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME));
195     return;
196   }
197
198 #endif
199
200   if (n == 0) return;
201
202   IDEBUG_START;
203
204   FUNCTION_PROFILE_START();
205
206   if (incx < 0 ) x -= (n - 1) * incx * 2;
207
208   buffer = (FLOAT *)blas_memory_alloc(1);
209
210   (trsv[(trans<<2) | (uplo<<1) | unit])(n, a, lda, x, incx, buffer);
211
212   blas_memory_free(buffer);
213
214   FUNCTION_PROFILE_END(4, n * n / 2 + n,  n * n);
215
216   IDEBUG_END;
217
218   return;
219 }