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 */
8enum CBLAS_ORDER {CblasRowMajor=101, CblasColMajor=102};
9enum CBLAS_TRANSPOSE {CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113};
10enum CBLAS_UPLO {CblasUpper=121, CblasLower=122};
11enum CBLAS_DIAG {CblasNonUnit=131, CblasUnit=132};
12enum 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 */
24typedef 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);
29typedef 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);
34typedef 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);
38typedef 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);
42typedef 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);
45typedef 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);
49typedef 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);
53typedef 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
57typedef 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);
62typedef 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);
67typedef 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);
71typedef 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);
75typedef 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);
78typedef 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);
82typedef 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);
86typedef 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
90typedef 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);
95typedef 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);
100typedef 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);
104typedef 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);
108typedef 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);
111typedef 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);
115typedef 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);
119typedef 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
123typedef 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);
128typedef 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);
133typedef 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);
137typedef 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);
141typedef 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);
144typedef 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);
148typedef 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);
152typedef 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 */
160typedef 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);
164typedef 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);
168typedef 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);
172typedef 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);
175typedef 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);
178typedef 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);
181typedef 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);
185typedef 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
189typedef 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);
193typedef 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);
197typedef 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);
201typedef 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);
204typedef 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);
207typedef 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);
210typedef 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);
214typedef 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 */
222typedef 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);
226typedef 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);
230typedef 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);
234typedef 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);
237typedef 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);
240typedef 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);
243typedef 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);
246typedef 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);
249typedef 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
253typedef 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);
257typedef 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);
261typedef 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);
265typedef 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);
268typedef 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);
271typedef 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);
274typedef 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);
277typedef 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);
280typedef 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 */
293typedef 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);
298typedef 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);
303typedef 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);
307typedef 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);
312typedef 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);
317typedef 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
323typedef 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);
328typedef 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);
333typedef 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);
337typedef 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);
342typedef 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);
347typedef 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
353typedef 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);
358typedef 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);
363typedef 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);
367typedef 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);
372typedef 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);
377typedef 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
383typedef 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);
388typedef 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);
393typedef 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);
397typedef 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);
402typedef 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);
407typedef 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 */
417typedef 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);
422typedef 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);
426typedef 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
432typedef 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);
437typedef 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);
441typedef 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
454bool 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