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