1 #ifndef RS_COMPATIBILITY_LIB
2 #include "cblas.h"
3 #else
4 #include <dlfcn.h>
5 /*
6  * The following enums are based on cblas.h
7  */
8 enum CBLAS_ORDER {CblasRowMajor=101, CblasColMajor=102};
9 enum CBLAS_TRANSPOSE {CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113};
10 enum CBLAS_UPLO {CblasUpper=121, CblasLower=122};
11 enum CBLAS_DIAG {CblasNonUnit=131, CblasUnit=132};
12 enum CBLAS_SIDE {CblasLeft=141, CblasRight=142};
13 #endif
14 
15 /*
16  * ===========================================================================
17  * Prototypes for level 2 BLAS
18  * ===========================================================================
19  */
20 
21 /*
22  * Routines with standard 4 prefixes (S, D, C, Z)
23  */
24 typedef void (*FnPtr_cblas_sgemv)(const enum CBLAS_ORDER order,
25                                   const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
26                                   const float alpha, const float *A, const int lda,
27                                   const float *X, const int incX, const float beta,
28                                   float *Y, const int incY);
29 typedef void (*FnPtr_cblas_sgbmv)(const enum CBLAS_ORDER order,
30                                   const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
31                                   const int KL, const int KU, const float alpha,
32                                   const float *A, const int lda, const float *X,
33                                   const int incX, const float beta, float *Y, const int incY);
34 typedef void (*FnPtr_cblas_strmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
35                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
36                                   const int N, const float *A, const int lda,
37                                   float *X, const int incX);
38 typedef void (*FnPtr_cblas_stbmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
39                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
40                                   const int N, const int K, const float *A, const int lda,
41                                   float *X, const int incX);
42 typedef void (*FnPtr_cblas_stpmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
43                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
44                                   const int N, const float *Ap, float *X, const int incX);
45 typedef void (*FnPtr_cblas_strsv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
46                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
47                                   const int N, const float *A, const int lda, float *X,
48                                   const int incX);
49 typedef void (*FnPtr_cblas_stbsv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
50                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
51                                   const int N, const int K, const float *A, const int lda,
52                                   float *X, const int incX);
53 typedef void (*FnPtr_cblas_stpsv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
54                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
55                                   const int N, const float *Ap, float *X, const int incX);
56 
57 typedef void (*FnPtr_cblas_dgemv)(const enum CBLAS_ORDER order,
58                                   const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
59                                   const double alpha, const double *A, const int lda,
60                                   const double *X, const int incX, const double beta,
61                                   double *Y, const int incY);
62 typedef void (*FnPtr_cblas_dgbmv)(const enum CBLAS_ORDER order,
63                                   const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
64                                   const int KL, const int KU, const double alpha,
65                                   const double *A, const int lda, const double *X,
66                                   const int incX, const double beta, double *Y, const int incY);
67 typedef void (*FnPtr_cblas_dtrmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
68                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
69                                   const int N, const double *A, const int lda,
70                                   double *X, const int incX);
71 typedef void (*FnPtr_cblas_dtbmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
72                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
73                                   const int N, const int K, const double *A, const int lda,
74                                   double *X, const int incX);
75 typedef void (*FnPtr_cblas_dtpmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
76                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
77                                   const int N, const double *Ap, double *X, const int incX);
78 typedef void (*FnPtr_cblas_dtrsv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
79                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
80                                   const int N, const double *A, const int lda, double *X,
81                                   const int incX);
82 typedef void (*FnPtr_cblas_dtbsv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
83                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
84                                   const int N, const int K, const double *A, const int lda,
85                                   double *X, const int incX);
86 typedef void (*FnPtr_cblas_dtpsv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
87                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
88                                   const int N, const double *Ap, double *X, const int incX);
89 
90 typedef void (*FnPtr_cblas_cgemv)(const enum CBLAS_ORDER order,
91                                   const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
92                                   const void *alpha, const void *A, const int lda,
93                                   const void *X, const int incX, const void *beta,
94                                   void *Y, const int incY);
95 typedef void (*FnPtr_cblas_cgbmv)(const enum CBLAS_ORDER order,
96                                   const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
97                                   const int KL, const int KU, const void *alpha,
98                                   const void *A, const int lda, const void *X,
99                                   const int incX, const void *beta, void *Y, const int incY);
100 typedef void (*FnPtr_cblas_ctrmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
101                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
102                                   const int N, const void *A, const int lda,
103                                   void *X, const int incX);
104 typedef void (*FnPtr_cblas_ctbmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
105                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
106                                   const int N, const int K, const void *A, const int lda,
107                                   void *X, const int incX);
108 typedef void (*FnPtr_cblas_ctpmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
109                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
110                                   const int N, const void *Ap, void *X, const int incX);
111 typedef void (*FnPtr_cblas_ctrsv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
112                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
113                                   const int N, const void *A, const int lda, void *X,
114                                   const int incX);
115 typedef void (*FnPtr_cblas_ctbsv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
116                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
117                                   const int N, const int K, const void *A, const int lda,
118                                   void *X, const int incX);
119 typedef void (*FnPtr_cblas_ctpsv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
120                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
121                                   const int N, const void *Ap, void *X, const int incX);
122 
123 typedef void (*FnPtr_cblas_zgemv)(const enum CBLAS_ORDER order,
124                                   const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
125                                   const void *alpha, const void *A, const int lda,
126                                   const void *X, const int incX, const void *beta,
127                                   void *Y, const int incY);
128 typedef void (*FnPtr_cblas_zgbmv)(const enum CBLAS_ORDER order,
129                                   const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
130                                   const int KL, const int KU, const void *alpha,
131                                   const void *A, const int lda, const void *X,
132                                   const int incX, const void *beta, void *Y, const int incY);
133 typedef void (*FnPtr_cblas_ztrmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
134                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
135                                   const int N, const void *A, const int lda,
136                                   void *X, const int incX);
137 typedef void (*FnPtr_cblas_ztbmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
138                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
139                                   const int N, const int K, const void *A, const int lda,
140                                   void *X, const int incX);
141 typedef void (*FnPtr_cblas_ztpmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
142                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
143                                   const int N, const void *Ap, void *X, const int incX);
144 typedef void (*FnPtr_cblas_ztrsv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
145                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
146                                   const int N, const void *A, const int lda, void *X,
147                                   const int incX);
148 typedef void (*FnPtr_cblas_ztbsv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
149                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
150                                   const int N, const int K, const void *A, const int lda,
151                                   void *X, const int incX);
152 typedef void (*FnPtr_cblas_ztpsv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
153                                   const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
154                                   const int N, const void *Ap, void *X, const int incX);
155 
156 
157 /*
158  * Routines with S and D prefixes only
159  */
160 typedef void (*FnPtr_cblas_ssymv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
161                                   const int N, const float alpha, const float *A,
162                                   const int lda, const float *X, const int incX,
163                                   const float beta, float *Y, const int incY);
164 typedef void (*FnPtr_cblas_ssbmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
165                                   const int N, const int K, const float alpha, const float *A,
166                                   const int lda, const float *X, const int incX,
167                                   const float beta, float *Y, const int incY);
168 typedef void (*FnPtr_cblas_sspmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
169                                   const int N, const float alpha, const float *Ap,
170                                   const float *X, const int incX,
171                                   const float beta, float *Y, const int incY);
172 typedef void (*FnPtr_cblas_sger)(const enum CBLAS_ORDER order, const int M, const int N,
173                                  const float alpha, const float *X, const int incX,
174                                  const float *Y, const int incY, float *A, const int lda);
175 typedef void (*FnPtr_cblas_ssyr)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
176                                  const int N, const float alpha, const float *X,
177                                  const int incX, float *A, const int lda);
178 typedef void (*FnPtr_cblas_sspr)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
179                                  const int N, const float alpha, const float *X,
180                                  const int incX, float *Ap);
181 typedef void (*FnPtr_cblas_ssyr2)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
182                                   const int N, const float alpha, const float *X,
183                                   const int incX, const float *Y, const int incY, float *A,
184                                   const int lda);
185 typedef void (*FnPtr_cblas_sspr2)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
186                                   const int N, const float alpha, const float *X,
187                                   const int incX, const float *Y, const int incY, float *A);
188 
189 typedef void (*FnPtr_cblas_dsymv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
190                                   const int N, const double alpha, const double *A,
191                                   const int lda, const double *X, const int incX,
192                                   const double beta, double *Y, const int incY);
193 typedef void (*FnPtr_cblas_dsbmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
194                                   const int N, const int K, const double alpha, const double *A,
195                                   const int lda, const double *X, const int incX,
196                                   const double beta, double *Y, const int incY);
197 typedef void (*FnPtr_cblas_dspmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
198                                   const int N, const double alpha, const double *Ap,
199                                   const double *X, const int incX,
200                                   const double beta, double *Y, const int incY);
201 typedef void (*FnPtr_cblas_dger)(const enum CBLAS_ORDER order, const int M, const int N,
202                                  const double alpha, const double *X, const int incX,
203                                  const double *Y, const int incY, double *A, const int lda);
204 typedef void (*FnPtr_cblas_dsyr)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
205                                  const int N, const double alpha, const double *X,
206                                  const int incX, double *A, const int lda);
207 typedef void (*FnPtr_cblas_dspr)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
208                                  const int N, const double alpha, const double *X,
209                                  const int incX, double *Ap);
210 typedef void (*FnPtr_cblas_dsyr2)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
211                                   const int N, const double alpha, const double *X,
212                                   const int incX, const double *Y, const int incY, double *A,
213                                   const int lda);
214 typedef void (*FnPtr_cblas_dspr2)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
215                                   const int N, const double alpha, const double *X,
216                                   const int incX, const double *Y, const int incY, double *A);
217 
218 
219 /*
220  * Routines with C and Z prefixes only
221  */
222 typedef void (*FnPtr_cblas_chemv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
223                                   const int N, const void *alpha, const void *A,
224                                   const int lda, const void *X, const int incX,
225                                   const void *beta, void *Y, const int incY);
226 typedef void (*FnPtr_cblas_chbmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
227                                   const int N, const int K, const void *alpha, const void *A,
228                                   const int lda, const void *X, const int incX,
229                                   const void *beta, void *Y, const int incY);
230 typedef void (*FnPtr_cblas_chpmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
231                                   const int N, const void *alpha, const void *Ap,
232                                   const void *X, const int incX,
233                                   const void *beta, void *Y, const int incY);
234 typedef void (*FnPtr_cblas_cgeru)(const enum CBLAS_ORDER order, const int M, const int N,
235                                   const void *alpha, const void *X, const int incX,
236                                   const void *Y, const int incY, void *A, const int lda);
237 typedef void (*FnPtr_cblas_cgerc)(const enum CBLAS_ORDER order, const int M, const int N,
238                                   const void *alpha, const void *X, const int incX,
239                                   const void *Y, const int incY, void *A, const int lda);
240 typedef void (*FnPtr_cblas_cher)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
241                                  const int N, const float alpha, const void *X, const int incX,
242                                  void *A, const int lda);
243 typedef void (*FnPtr_cblas_chpr)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
244                                  const int N, const float alpha, const void *X,
245                                  const int incX, void *A);
246 typedef void (*FnPtr_cblas_cher2)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo, const int N,
247                                   const void *alpha, const void *X, const int incX,
248                                   const void *Y, const int incY, void *A, const int lda);
249 typedef void (*FnPtr_cblas_chpr2)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo, const int N,
250                                   const void *alpha, const void *X, const int incX,
251                                   const void *Y, const int incY, void *Ap);
252 
253 typedef void (*FnPtr_cblas_zhemv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
254                                   const int N, const void *alpha, const void *A,
255                                   const int lda, const void *X, const int incX,
256                                   const void *beta, void *Y, const int incY);
257 typedef void (*FnPtr_cblas_zhbmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
258                                   const int N, const int K, const void *alpha, const void *A,
259                                   const int lda, const void *X, const int incX,
260                                   const void *beta, void *Y, const int incY);
261 typedef void (*FnPtr_cblas_zhpmv)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
262                                   const int N, const void *alpha, const void *Ap,
263                                   const void *X, const int incX,
264                                   const void *beta, void *Y, const int incY);
265 typedef void (*FnPtr_cblas_zgeru)(const enum CBLAS_ORDER order, const int M, const int N,
266                                   const void *alpha, const void *X, const int incX,
267                                   const void *Y, const int incY, void *A, const int lda);
268 typedef void (*FnPtr_cblas_zgerc)(const enum CBLAS_ORDER order, const int M, const int N,
269                                   const void *alpha, const void *X, const int incX,
270                                   const void *Y, const int incY, void *A, const int lda);
271 typedef void (*FnPtr_cblas_zher)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
272                                  const int N, const double alpha, const void *X, const int incX,
273                                  void *A, const int lda);
274 typedef void (*FnPtr_cblas_zhpr)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo,
275                                  const int N, const double alpha, const void *X,
276                                  const int incX, void *A);
277 typedef void (*FnPtr_cblas_zher2)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo, const int N,
278                                   const void *alpha, const void *X, const int incX,
279                                   const void *Y, const int incY, void *A, const int lda);
280 typedef void (*FnPtr_cblas_zhpr2)(const enum CBLAS_ORDER order, const enum CBLAS_UPLO Uplo, const int N,
281                                   const void *alpha, const void *X, const int incX,
282                                   const void *Y, const int incY, void *Ap);
283 
284 /*
285  * ===========================================================================
286  * Prototypes for level 3 BLAS
287  * ===========================================================================
288  */
289 
290 /*
291  * Routines with standard 4 prefixes (S, D, C, Z)
292  */
293 typedef void (*FnPtr_cblas_sgemm)(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
294                                   const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
295                                   const int K, const float alpha, const float *A,
296                                   const int lda, const float *B, const int ldb,
297                                   const float beta, float *C, const int ldc);
298 typedef void (*FnPtr_cblas_ssymm)(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
299                                   const enum CBLAS_UPLO Uplo, const int M, const int N,
300                                   const float alpha, const float *A, const int lda,
301                                   const float *B, const int ldb, const float beta,
302                                   float *C, const int ldc);
303 typedef void (*FnPtr_cblas_ssyrk)(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
304                                   const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
305                                   const float alpha, const float *A, const int lda,
306                                   const float beta, float *C, const int ldc);
307 typedef void (*FnPtr_cblas_ssyr2k)(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
308                                    const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
309                                    const float alpha, const float *A, const int lda,
310                                    const float *B, const int ldb, const float beta,
311                                    float *C, const int ldc);
312 typedef void (*FnPtr_cblas_strmm)(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
313                                   const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
314                                   const enum CBLAS_DIAG Diag, const int M, const int N,
315                                   const float alpha, const float *A, const int lda,
316                                   float *B, const int ldb);
317 typedef void (*FnPtr_cblas_strsm)(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
318                                   const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
319                                   const enum CBLAS_DIAG Diag, const int M, const int N,
320                                   const float alpha, const float *A, const int lda,
321                                   float *B, const int ldb);
322 
323 typedef void (*FnPtr_cblas_dgemm)(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
324                                   const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
325                                   const int K, const double alpha, const double *A,
326                                   const int lda, const double *B, const int ldb,
327                                   const double beta, double *C, const int ldc);
328 typedef void (*FnPtr_cblas_dsymm)(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
329                                   const enum CBLAS_UPLO Uplo, const int M, const int N,
330                                   const double alpha, const double *A, const int lda,
331                                   const double *B, const int ldb, const double beta,
332                                   double *C, const int ldc);
333 typedef void (*FnPtr_cblas_dsyrk)(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
334                                   const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
335                                   const double alpha, const double *A, const int lda,
336                                   const double beta, double *C, const int ldc);
337 typedef void (*FnPtr_cblas_dsyr2k)(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
338                                    const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
339                                    const double alpha, const double *A, const int lda,
340                                    const double *B, const int ldb, const double beta,
341                                    double *C, const int ldc);
342 typedef void (*FnPtr_cblas_dtrmm)(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
343                                   const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
344                                   const enum CBLAS_DIAG Diag, const int M, const int N,
345                                   const double alpha, const double *A, const int lda,
346                                   double *B, const int ldb);
347 typedef void (*FnPtr_cblas_dtrsm)(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
348                                   const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
349                                   const enum CBLAS_DIAG Diag, const int M, const int N,
350                                   const double alpha, const double *A, const int lda,
351                                   double *B, const int ldb);
352 
353 typedef void (*FnPtr_cblas_cgemm)(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
354                                   const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
355                                   const int K, const void *alpha, const void *A,
356                                   const int lda, const void *B, const int ldb,
357                                   const void *beta, void *C, const int ldc);
358 typedef void (*FnPtr_cblas_csymm)(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
359                                   const enum CBLAS_UPLO Uplo, const int M, const int N,
360                                   const void *alpha, const void *A, const int lda,
361                                   const void *B, const int ldb, const void *beta,
362                                   void *C, const int ldc);
363 typedef void (*FnPtr_cblas_csyrk)(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
364                                   const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
365                                   const void *alpha, const void *A, const int lda,
366                                   const void *beta, void *C, const int ldc);
367 typedef void (*FnPtr_cblas_csyr2k)(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
368                                    const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
369                                    const void *alpha, const void *A, const int lda,
370                                    const void *B, const int ldb, const void *beta,
371                                    void *C, const int ldc);
372 typedef void (*FnPtr_cblas_ctrmm)(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
373                                   const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
374                                   const enum CBLAS_DIAG Diag, const int M, const int N,
375                                   const void *alpha, const void *A, const int lda,
376                                   void *B, const int ldb);
377 typedef void (*FnPtr_cblas_ctrsm)(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
378                                   const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
379                                   const enum CBLAS_DIAG Diag, const int M, const int N,
380                                   const void *alpha, const void *A, const int lda,
381                                   void *B, const int ldb);
382 
383 typedef void (*FnPtr_cblas_zgemm)(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
384                                   const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
385                                   const int K, const void *alpha, const void *A,
386                                   const int lda, const void *B, const int ldb,
387                                   const void *beta, void *C, const int ldc);
388 typedef void (*FnPtr_cblas_zsymm)(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
389                                   const enum CBLAS_UPLO Uplo, const int M, const int N,
390                                   const void *alpha, const void *A, const int lda,
391                                   const void *B, const int ldb, const void *beta,
392                                   void *C, const int ldc);
393 typedef void (*FnPtr_cblas_zsyrk)(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
394                                   const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
395                                   const void *alpha, const void *A, const int lda,
396                                   const void *beta, void *C, const int ldc);
397 typedef void (*FnPtr_cblas_zsyr2k)(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
398                                    const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
399                                    const void *alpha, const void *A, const int lda,
400                                    const void *B, const int ldb, const void *beta,
401                                    void *C, const int ldc);
402 typedef void (*FnPtr_cblas_ztrmm)(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
403                                   const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
404                                   const enum CBLAS_DIAG Diag, const int M, const int N,
405                                   const void *alpha, const void *A, const int lda,
406                                   void *B, const int ldb);
407 typedef void (*FnPtr_cblas_ztrsm)(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
408                                   const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
409                                   const enum CBLAS_DIAG Diag, const int M, const int N,
410                                   const void *alpha, const void *A, const int lda,
411                                   void *B, const int ldb);
412 
413 
414 /*
415  * Routines with prefixes C and Z only
416  */
417 typedef void (*FnPtr_cblas_chemm)(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
418                                   const enum CBLAS_UPLO Uplo, const int M, const int N,
419                                   const void *alpha, const void *A, const int lda,
420                                   const void *B, const int ldb, const void *beta,
421                                   void *C, const int ldc);
422 typedef void (*FnPtr_cblas_cherk)(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
423                                   const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
424                                   const float alpha, const void *A, const int lda,
425                                   const float beta, void *C, const int ldc);
426 typedef void (*FnPtr_cblas_cher2k)(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
427                                    const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
428                                    const void *alpha, const void *A, const int lda,
429                                    const void *B, const int ldb, const float beta,
430                                    void *C, const int ldc);
431 
432 typedef void (*FnPtr_cblas_zhemm)(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
433                                   const enum CBLAS_UPLO Uplo, const int M, const int N,
434                                   const void *alpha, const void *A, const int lda,
435                                   const void *B, const int ldb, const void *beta,
436                                   void *C, const int ldc);
437 typedef void (*FnPtr_cblas_zherk)(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
438                                   const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
439                                   const double alpha, const void *A, const int lda,
440                                   const double beta, void *C, const int ldc);
441 typedef void (*FnPtr_cblas_zher2k)(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
442                                    const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
443                                    const void *alpha, const void *A, const int lda,
444                                    const void *B, const int ldb, const double beta,
445                                    void *C, const int ldc);
446 
447 
448 #ifdef RS_COMPATIBILITY_LIB
449 // Macros to help declare our function pointers for the dispatch table.
450 #define RS_APPLY_MACRO_TO(x) \
451     FnPtr_##x x;
452 #include "rsCpuBLAS.inc"
453 
loadBLASLib()454 bool loadBLASLib() {
455     void* handle = NULL;
456     handle = dlopen("libblasV8.so", RTLD_LAZY | RTLD_LOCAL);
457 
458     if (handle == NULL) {
459         return false;
460     }
461 
462 // Macros to help load the function pointers.
463 #define RS_APPLY_MACRO_TO(x) \
464     x = (FnPtr_##x)dlsym(handle, #x); \
465     if ((x) == nullptr) { \
466         ALOGE("Failed to load " #x " for RS BLAS implementation."); \
467         return false; \
468     }
469 #include "rsCpuBLAS.inc"
470     return true;
471 }
472 #endif
473