cblas_sys/
lib.rs

1//! Bindings to [CBLAS] \(C).
2//!
3//! ## [Architecture]
4//!
5//! [architecture]: https://blas-lapack-rs.github.io/architecture
6//! [cblas]: https://en.wikipedia.org/wiki/BLAS
7
8#![allow(non_camel_case_types)]
9#![no_std]
10
11use libc::{c_char, c_double, c_float, c_int};
12
13/// A complex number with 64-bit parts.
14#[allow(bad_style)]
15pub type c_double_complex = [libc::c_double; 2];
16
17/// A complex number with 32-bit parts.
18#[allow(bad_style)]
19pub type c_float_complex = [libc::c_float; 2];
20
21pub type CBLAS_INDEX = c_int;
22
23#[repr(C)]
24#[derive(Clone, Copy, Debug)]
25pub enum CBLAS_LAYOUT {
26    CblasRowMajor = 101,
27    CblasColMajor = 102,
28}
29pub use self::CBLAS_LAYOUT::*;
30
31#[repr(C)]
32#[derive(Clone, Copy, Debug)]
33pub enum CBLAS_TRANSPOSE {
34    CblasNoTrans = 111,
35    CblasTrans = 112,
36    CblasConjTrans = 113,
37}
38pub use self::CBLAS_TRANSPOSE::*;
39
40#[repr(C)]
41#[derive(Clone, Copy, Debug)]
42pub enum CBLAS_UPLO {
43    CblasUpper = 121,
44    CblasLower = 122,
45}
46pub use self::CBLAS_UPLO::*;
47
48#[repr(C)]
49#[derive(Clone, Copy, Debug)]
50pub enum CBLAS_DIAG {
51    CblasNonUnit = 131,
52    CblasUnit = 132,
53}
54pub use self::CBLAS_DIAG::*;
55
56#[repr(C)]
57#[derive(Clone, Copy, Debug)]
58pub enum CBLAS_SIDE {
59    CblasLeft = 141,
60    CblasRight = 142,
61}
62pub use self::CBLAS_SIDE::*;
63
64pub type CBLAS_ORDER = CBLAS_LAYOUT;
65
66// Level 1 (functions except for complex)
67extern "C" {
68    pub fn cblas_dcabs1(z: *const c_double_complex) -> c_double;
69    pub fn cblas_scabs1(c: *const c_float_complex) -> c_float;
70
71    pub fn cblas_sdsdot(
72        n: c_int,
73        alpha: c_float,
74        x: *const c_float,
75        incx: c_int,
76        y: *const c_float,
77        incy: c_int,
78    ) -> c_float;
79    pub fn cblas_dsdot(
80        n: c_int,
81        x: *const c_float,
82        incx: c_int,
83        y: *const c_float,
84        incy: c_int,
85    ) -> c_double;
86    pub fn cblas_sdot(
87        n: c_int,
88        x: *const c_float,
89        incx: c_int,
90        y: *const c_float,
91        incy: c_int,
92    ) -> c_float;
93    pub fn cblas_ddot(
94        n: c_int,
95        x: *const c_double,
96        incx: c_int,
97        y: *const c_double,
98        incy: c_int,
99    ) -> c_double;
100
101    // Prefixes Z and C only
102    pub fn cblas_cdotu_sub(
103        n: c_int,
104        x: *const c_float_complex,
105        incx: c_int,
106        y: *const c_float_complex,
107        incy: c_int,
108        dotu: *mut c_float_complex,
109    );
110    pub fn cblas_cdotc_sub(
111        n: c_int,
112        x: *const c_float_complex,
113        incx: c_int,
114        y: *const c_float_complex,
115        incy: c_int,
116        dotc: *mut c_float_complex,
117    );
118
119    pub fn cblas_zdotu_sub(
120        n: c_int,
121        x: *const c_double_complex,
122        incx: c_int,
123        y: *const c_double_complex,
124        incy: c_int,
125        dotu: *mut c_double_complex,
126    );
127    pub fn cblas_zdotc_sub(
128        n: c_int,
129        x: *const c_double_complex,
130        incx: c_int,
131        y: *const c_double_complex,
132        incy: c_int,
133        dotc: *mut c_double_complex,
134    );
135
136    // Prefixes S, D, SC, and DZ
137    pub fn cblas_snrm2(n: c_int, x: *const c_float, incx: c_int) -> c_float;
138    pub fn cblas_sasum(n: c_int, x: *const c_float, incx: c_int) -> c_float;
139
140    pub fn cblas_dnrm2(n: c_int, x: *const c_double, incx: c_int) -> c_double;
141    pub fn cblas_dasum(n: c_int, x: *const c_double, incx: c_int) -> c_double;
142
143    pub fn cblas_scnrm2(n: c_int, x: *const c_float_complex, incx: c_int) -> c_float;
144    pub fn cblas_scasum(n: c_int, x: *const c_float_complex, incx: c_int) -> c_float;
145
146    pub fn cblas_dznrm2(n: c_int, x: *const c_double_complex, incx: c_int) -> c_double;
147    pub fn cblas_dzasum(n: c_int, x: *const c_double_complex, incx: c_int) -> c_double;
148
149    // Standard prefixes (S, D, C, and Z)
150    pub fn cblas_isamax(n: c_int, x: *const c_float, incx: c_int) -> CBLAS_INDEX;
151    pub fn cblas_idamax(n: c_int, x: *const c_double, incx: c_int) -> CBLAS_INDEX;
152    pub fn cblas_icamax(n: c_int, x: *const c_float_complex, incx: c_int) -> CBLAS_INDEX;
153    pub fn cblas_izamax(n: c_int, x: *const c_double_complex, incx: c_int) -> CBLAS_INDEX;
154}
155
156// Level 1 (routines)
157extern "C" {
158    // Standard prefixes (S, D, C, and Z)
159    pub fn cblas_sswap(n: c_int, x: *mut c_float, incx: c_int, y: *mut c_float, incy: c_int);
160    pub fn cblas_scopy(n: c_int, x: *const c_float, incx: c_int, y: *mut c_float, incy: c_int);
161    pub fn cblas_saxpy(
162        n: c_int,
163        alpha: c_float,
164        x: *const c_float,
165        incx: c_int,
166        y: *mut c_float,
167        incy: c_int,
168    );
169
170    pub fn cblas_dswap(n: c_int, x: *mut c_double, incx: c_int, y: *mut c_double, incy: c_int);
171    pub fn cblas_dcopy(n: c_int, x: *const c_double, incx: c_int, y: *mut c_double, incy: c_int);
172    pub fn cblas_daxpy(
173        n: c_int,
174        alpha: c_double,
175        x: *const c_double,
176        incx: c_int,
177        y: *mut c_double,
178        incy: c_int,
179    );
180
181    pub fn cblas_cswap(
182        n: c_int,
183        x: *mut c_float_complex,
184        incx: c_int,
185        y: *mut c_float_complex,
186        incy: c_int,
187    );
188    pub fn cblas_ccopy(
189        n: c_int,
190        x: *const c_float_complex,
191        incx: c_int,
192        y: *mut c_float_complex,
193        incy: c_int,
194    );
195    pub fn cblas_caxpy(
196        n: c_int,
197        alpha: *const c_float_complex,
198        x: *const c_float_complex,
199        incx: c_int,
200        y: *mut c_float_complex,
201        incy: c_int,
202    );
203
204    pub fn cblas_zswap(
205        n: c_int,
206        x: *mut c_double_complex,
207        incx: c_int,
208        y: *mut c_double_complex,
209        incy: c_int,
210    );
211    pub fn cblas_zcopy(
212        n: c_int,
213        x: *const c_double_complex,
214        incx: c_int,
215        y: *mut c_double_complex,
216        incy: c_int,
217    );
218    pub fn cblas_zaxpy(
219        n: c_int,
220        alpha: *const c_double_complex,
221        x: *const c_double_complex,
222        incx: c_int,
223        y: *mut c_double_complex,
224        incy: c_int,
225    );
226
227    // Prefixes S and D only
228    pub fn cblas_srotg(a: *mut c_float, b: *mut c_float, c: *mut c_float, s: *mut c_float);
229    pub fn cblas_srotmg(
230        d1: *mut c_float,
231        d2: *mut c_float,
232        b1: *mut c_float,
233        b2: c_float,
234        p: *mut c_float,
235    );
236    pub fn cblas_srot(
237        n: c_int,
238        x: *mut c_float,
239        incx: c_int,
240        y: *mut c_float,
241        incy: c_int,
242        c: c_float,
243        s: c_float,
244    );
245    pub fn cblas_srotm(
246        n: c_int,
247        x: *mut c_float,
248        incx: c_int,
249        y: *mut c_float,
250        incy: c_int,
251        p: *const c_float,
252    );
253
254    pub fn cblas_drotg(a: *mut c_double, b: *mut c_double, c: *mut c_double, s: *mut c_double);
255    pub fn cblas_drotmg(
256        d1: *mut c_double,
257        d2: *mut c_double,
258        b1: *mut c_double,
259        b2: c_double,
260        p: *mut c_double,
261    );
262    pub fn cblas_drot(
263        n: c_int,
264        x: *mut c_double,
265        incx: c_int,
266        y: *mut c_double,
267        incy: c_int,
268        c: c_double,
269        s: c_double,
270    );
271    pub fn cblas_drotm(
272        n: c_int,
273        x: *mut c_double,
274        incx: c_int,
275        y: *mut c_double,
276        incy: c_int,
277        p: *const c_double,
278    );
279
280    // Prefixes S, D, C, Z, CS, and ZD
281    pub fn cblas_sscal(n: c_int, alpha: c_float, x: *mut c_float, incx: c_int);
282    pub fn cblas_dscal(n: c_int, alpha: c_double, x: *mut c_double, incx: c_int);
283    pub fn cblas_cscal(
284        n: c_int,
285        alpha: *const c_float_complex,
286        x: *mut c_float_complex,
287        incx: c_int,
288    );
289    pub fn cblas_zscal(
290        n: c_int,
291        alpha: *const c_double_complex,
292        x: *mut c_double_complex,
293        incx: c_int,
294    );
295    pub fn cblas_csscal(n: c_int, alpha: c_float, x: *mut c_float_complex, incx: c_int);
296    pub fn cblas_zdscal(n: c_int, alpha: c_double, x: *mut c_double_complex, incx: c_int);
297}
298
299// Level 2
300extern "C" {
301    // Standard prefixes (S, D, C, and Z)
302    pub fn cblas_sgemv(
303        layout: CBLAS_LAYOUT,
304        transa: CBLAS_TRANSPOSE,
305        m: c_int,
306        n: c_int,
307        alpha: c_float,
308        a: *const c_float,
309        lda: c_int,
310        x: *const c_float,
311        incx: c_int,
312        beta: c_float,
313        y: *mut c_float,
314        incy: c_int,
315    );
316    pub fn cblas_sgbmv(
317        layout: CBLAS_LAYOUT,
318        transa: CBLAS_TRANSPOSE,
319        m: c_int,
320        n: c_int,
321        kl: c_int,
322        ku: c_int,
323        alpha: c_float,
324        a: *const c_float,
325        lda: c_int,
326        x: *const c_float,
327        incx: c_int,
328        beta: c_float,
329        y: *mut c_float,
330        incy: c_int,
331    );
332    pub fn cblas_strmv(
333        layout: CBLAS_LAYOUT,
334        uplo: CBLAS_UPLO,
335        transa: CBLAS_TRANSPOSE,
336        diag: CBLAS_DIAG,
337        n: c_int,
338        a: *const c_float,
339        lda: c_int,
340        x: *mut c_float,
341        incx: c_int,
342    );
343    pub fn cblas_stbmv(
344        layout: CBLAS_LAYOUT,
345        uplo: CBLAS_UPLO,
346        transa: CBLAS_TRANSPOSE,
347        diag: CBLAS_DIAG,
348        n: c_int,
349        k: c_int,
350        a: *const c_float,
351        lda: c_int,
352        x: *mut c_float,
353        incx: c_int,
354    );
355    pub fn cblas_stpmv(
356        layout: CBLAS_LAYOUT,
357        uplo: CBLAS_UPLO,
358        transa: CBLAS_TRANSPOSE,
359        diag: CBLAS_DIAG,
360        n: c_int,
361        ap: *const c_float,
362        x: *mut c_float,
363        incx: c_int,
364    );
365    pub fn cblas_strsv(
366        layout: CBLAS_LAYOUT,
367        uplo: CBLAS_UPLO,
368        transa: CBLAS_TRANSPOSE,
369        diag: CBLAS_DIAG,
370        n: c_int,
371        a: *const c_float,
372        lda: c_int,
373        x: *mut c_float,
374        incx: c_int,
375    );
376    pub fn cblas_stbsv(
377        layout: CBLAS_LAYOUT,
378        uplo: CBLAS_UPLO,
379        transa: CBLAS_TRANSPOSE,
380        diag: CBLAS_DIAG,
381        n: c_int,
382        k: c_int,
383        a: *const c_float,
384        lda: c_int,
385        x: *mut c_float,
386        incx: c_int,
387    );
388    pub fn cblas_stpsv(
389        layout: CBLAS_LAYOUT,
390        uplo: CBLAS_UPLO,
391        transa: CBLAS_TRANSPOSE,
392        diag: CBLAS_DIAG,
393        n: c_int,
394        ap: *const c_float,
395        x: *mut c_float,
396        incx: c_int,
397    );
398
399    pub fn cblas_dgemv(
400        layout: CBLAS_LAYOUT,
401        transa: CBLAS_TRANSPOSE,
402        m: c_int,
403        n: c_int,
404        alpha: c_double,
405        a: *const c_double,
406        lda: c_int,
407        x: *const c_double,
408        incx: c_int,
409        beta: c_double,
410        y: *mut c_double,
411        incy: c_int,
412    );
413    pub fn cblas_dgbmv(
414        layout: CBLAS_LAYOUT,
415        transa: CBLAS_TRANSPOSE,
416        m: c_int,
417        n: c_int,
418        kl: c_int,
419        ku: c_int,
420        alpha: c_double,
421        a: *const c_double,
422        lda: c_int,
423        x: *const c_double,
424        incx: c_int,
425        beta: c_double,
426        y: *mut c_double,
427        incy: c_int,
428    );
429    pub fn cblas_dtrmv(
430        layout: CBLAS_LAYOUT,
431        uplo: CBLAS_UPLO,
432        transa: CBLAS_TRANSPOSE,
433        diag: CBLAS_DIAG,
434        n: c_int,
435        a: *const c_double,
436        lda: c_int,
437        x: *mut c_double,
438        incx: c_int,
439    );
440    pub fn cblas_dtbmv(
441        layout: CBLAS_LAYOUT,
442        uplo: CBLAS_UPLO,
443        transa: CBLAS_TRANSPOSE,
444        diag: CBLAS_DIAG,
445        n: c_int,
446        k: c_int,
447        a: *const c_double,
448        lda: c_int,
449        x: *mut c_double,
450        incx: c_int,
451    );
452    pub fn cblas_dtpmv(
453        layout: CBLAS_LAYOUT,
454        uplo: CBLAS_UPLO,
455        transa: CBLAS_TRANSPOSE,
456        diag: CBLAS_DIAG,
457        n: c_int,
458        ap: *const c_double,
459        x: *mut c_double,
460        incx: c_int,
461    );
462    pub fn cblas_dtrsv(
463        layout: CBLAS_LAYOUT,
464        uplo: CBLAS_UPLO,
465        transa: CBLAS_TRANSPOSE,
466        diag: CBLAS_DIAG,
467        n: c_int,
468        a: *const c_double,
469        lda: c_int,
470        x: *mut c_double,
471        incx: c_int,
472    );
473    pub fn cblas_dtbsv(
474        layout: CBLAS_LAYOUT,
475        uplo: CBLAS_UPLO,
476        transa: CBLAS_TRANSPOSE,
477        diag: CBLAS_DIAG,
478        n: c_int,
479        k: c_int,
480        a: *const c_double,
481        lda: c_int,
482        x: *mut c_double,
483        incx: c_int,
484    );
485    pub fn cblas_dtpsv(
486        layout: CBLAS_LAYOUT,
487        uplo: CBLAS_UPLO,
488        transa: CBLAS_TRANSPOSE,
489        diag: CBLAS_DIAG,
490        n: c_int,
491        ap: *const c_double,
492        x: *mut c_double,
493        incx: c_int,
494    );
495
496    pub fn cblas_cgemv(
497        layout: CBLAS_LAYOUT,
498        transa: CBLAS_TRANSPOSE,
499        m: c_int,
500        n: c_int,
501        alpha: *const c_float_complex,
502        a: *const c_float_complex,
503        lda: c_int,
504        x: *const c_float_complex,
505        incx: c_int,
506        beta: *const c_float_complex,
507        y: *mut c_float_complex,
508        incy: c_int,
509    );
510    pub fn cblas_cgbmv(
511        layout: CBLAS_LAYOUT,
512        transa: CBLAS_TRANSPOSE,
513        m: c_int,
514        n: c_int,
515        kl: c_int,
516        ku: c_int,
517        alpha: *const c_float_complex,
518        a: *const c_float_complex,
519        lda: c_int,
520        x: *const c_float_complex,
521        incx: c_int,
522        beta: *const c_float_complex,
523        y: *mut c_float_complex,
524        incy: c_int,
525    );
526    pub fn cblas_ctrmv(
527        layout: CBLAS_LAYOUT,
528        uplo: CBLAS_UPLO,
529        transa: CBLAS_TRANSPOSE,
530        diag: CBLAS_DIAG,
531        n: c_int,
532        a: *const c_float_complex,
533        lda: c_int,
534        x: *mut c_float_complex,
535        incx: c_int,
536    );
537    pub fn cblas_ctbmv(
538        layout: CBLAS_LAYOUT,
539        uplo: CBLAS_UPLO,
540        transa: CBLAS_TRANSPOSE,
541        diag: CBLAS_DIAG,
542        n: c_int,
543        k: c_int,
544        a: *const c_float_complex,
545        lda: c_int,
546        x: *mut c_float_complex,
547        incx: c_int,
548    );
549    pub fn cblas_ctpmv(
550        layout: CBLAS_LAYOUT,
551        uplo: CBLAS_UPLO,
552        transa: CBLAS_TRANSPOSE,
553        diag: CBLAS_DIAG,
554        n: c_int,
555        ap: *const c_float_complex,
556        x: *mut c_float_complex,
557        incx: c_int,
558    );
559    pub fn cblas_ctrsv(
560        layout: CBLAS_LAYOUT,
561        uplo: CBLAS_UPLO,
562        transa: CBLAS_TRANSPOSE,
563        diag: CBLAS_DIAG,
564        n: c_int,
565        a: *const c_float_complex,
566        lda: c_int,
567        x: *mut c_float_complex,
568        incx: c_int,
569    );
570    pub fn cblas_ctbsv(
571        layout: CBLAS_LAYOUT,
572        uplo: CBLAS_UPLO,
573        transa: CBLAS_TRANSPOSE,
574        diag: CBLAS_DIAG,
575        n: c_int,
576        k: c_int,
577        a: *const c_float_complex,
578        lda: c_int,
579        x: *mut c_float_complex,
580        incx: c_int,
581    );
582    pub fn cblas_ctpsv(
583        layout: CBLAS_LAYOUT,
584        uplo: CBLAS_UPLO,
585        transa: CBLAS_TRANSPOSE,
586        diag: CBLAS_DIAG,
587        n: c_int,
588        ap: *const c_float_complex,
589        x: *mut c_float_complex,
590        incx: c_int,
591    );
592
593    pub fn cblas_zgemv(
594        layout: CBLAS_LAYOUT,
595        transa: CBLAS_TRANSPOSE,
596        m: c_int,
597        n: c_int,
598        alpha: *const c_double_complex,
599        a: *const c_double_complex,
600        lda: c_int,
601        x: *const c_double_complex,
602        incx: c_int,
603        beta: *const c_double_complex,
604        y: *mut c_double_complex,
605        incy: c_int,
606    );
607    pub fn cblas_zgbmv(
608        layout: CBLAS_LAYOUT,
609        transa: CBLAS_TRANSPOSE,
610        m: c_int,
611        n: c_int,
612        kl: c_int,
613        ku: c_int,
614        alpha: *const c_double_complex,
615        a: *const c_double_complex,
616        lda: c_int,
617        x: *const c_double_complex,
618        incx: c_int,
619        beta: *const c_double_complex,
620        y: *mut c_double_complex,
621        incy: c_int,
622    );
623    pub fn cblas_ztrmv(
624        layout: CBLAS_LAYOUT,
625        uplo: CBLAS_UPLO,
626        transa: CBLAS_TRANSPOSE,
627        diag: CBLAS_DIAG,
628        n: c_int,
629        a: *const c_double_complex,
630        lda: c_int,
631        x: *mut c_double_complex,
632        incx: c_int,
633    );
634    pub fn cblas_ztbmv(
635        layout: CBLAS_LAYOUT,
636        uplo: CBLAS_UPLO,
637        transa: CBLAS_TRANSPOSE,
638        diag: CBLAS_DIAG,
639        n: c_int,
640        k: c_int,
641        a: *const c_double_complex,
642        lda: c_int,
643        x: *mut c_double_complex,
644        incx: c_int,
645    );
646    pub fn cblas_ztpmv(
647        layout: CBLAS_LAYOUT,
648        uplo: CBLAS_UPLO,
649        transa: CBLAS_TRANSPOSE,
650        diag: CBLAS_DIAG,
651        n: c_int,
652        ap: *const c_double_complex,
653        x: *mut c_double_complex,
654        incx: c_int,
655    );
656    pub fn cblas_ztrsv(
657        layout: CBLAS_LAYOUT,
658        uplo: CBLAS_UPLO,
659        transa: CBLAS_TRANSPOSE,
660        diag: CBLAS_DIAG,
661        n: c_int,
662        a: *const c_double_complex,
663        lda: c_int,
664        x: *mut c_double_complex,
665        incx: c_int,
666    );
667    pub fn cblas_ztbsv(
668        layout: CBLAS_LAYOUT,
669        uplo: CBLAS_UPLO,
670        transa: CBLAS_TRANSPOSE,
671        diag: CBLAS_DIAG,
672        n: c_int,
673        k: c_int,
674        a: *const c_double_complex,
675        lda: c_int,
676        x: *mut c_double_complex,
677        incx: c_int,
678    );
679    pub fn cblas_ztpsv(
680        layout: CBLAS_LAYOUT,
681        uplo: CBLAS_UPLO,
682        transa: CBLAS_TRANSPOSE,
683        diag: CBLAS_DIAG,
684        n: c_int,
685        ap: *const c_double_complex,
686        x: *mut c_double_complex,
687        incx: c_int,
688    );
689
690    // Prefixes S and D only
691    pub fn cblas_ssymv(
692        layout: CBLAS_LAYOUT,
693        uplo: CBLAS_UPLO,
694        n: c_int,
695        alpha: c_float,
696        a: *const c_float,
697        lda: c_int,
698        x: *const c_float,
699        incx: c_int,
700        beta: c_float,
701        y: *mut c_float,
702        incy: c_int,
703    );
704    pub fn cblas_ssbmv(
705        layout: CBLAS_LAYOUT,
706        uplo: CBLAS_UPLO,
707        n: c_int,
708        k: c_int,
709        alpha: c_float,
710        a: *const c_float,
711        lda: c_int,
712        x: *const c_float,
713        incx: c_int,
714        beta: c_float,
715        y: *mut c_float,
716        incy: c_int,
717    );
718    pub fn cblas_sspmv(
719        layout: CBLAS_LAYOUT,
720        uplo: CBLAS_UPLO,
721        n: c_int,
722        alpha: c_float,
723        ap: *const c_float,
724        x: *const c_float,
725        incx: c_int,
726        beta: c_float,
727        y: *mut c_float,
728        incy: c_int,
729    );
730    pub fn cblas_sger(
731        layout: CBLAS_LAYOUT,
732        m: c_int,
733        n: c_int,
734        alpha: c_float,
735        x: *const c_float,
736        incx: c_int,
737        y: *const c_float,
738        incy: c_int,
739        a: *mut c_float,
740        lda: c_int,
741    );
742    pub fn cblas_ssyr(
743        layout: CBLAS_LAYOUT,
744        uplo: CBLAS_UPLO,
745        n: c_int,
746        alpha: c_float,
747        x: *const c_float,
748        incx: c_int,
749        a: *mut c_float,
750        lda: c_int,
751    );
752    pub fn cblas_sspr(
753        layout: CBLAS_LAYOUT,
754        uplo: CBLAS_UPLO,
755        n: c_int,
756        alpha: c_float,
757        x: *const c_float,
758        incx: c_int,
759        ap: *mut c_float,
760    );
761    pub fn cblas_ssyr2(
762        layout: CBLAS_LAYOUT,
763        uplo: CBLAS_UPLO,
764        n: c_int,
765        alpha: c_float,
766        x: *const c_float,
767        incx: c_int,
768        y: *const c_float,
769        incy: c_int,
770        a: *mut c_float,
771        lda: c_int,
772    );
773    pub fn cblas_sspr2(
774        layout: CBLAS_LAYOUT,
775        uplo: CBLAS_UPLO,
776        n: c_int,
777        alpha: c_float,
778        x: *const c_float,
779        incx: c_int,
780        y: *const c_float,
781        incy: c_int,
782        a: *mut c_float,
783    );
784
785    pub fn cblas_dsymv(
786        layout: CBLAS_LAYOUT,
787        uplo: CBLAS_UPLO,
788        n: c_int,
789        alpha: c_double,
790        a: *const c_double,
791        lda: c_int,
792        x: *const c_double,
793        incx: c_int,
794        beta: c_double,
795        y: *mut c_double,
796        incy: c_int,
797    );
798    pub fn cblas_dsbmv(
799        layout: CBLAS_LAYOUT,
800        uplo: CBLAS_UPLO,
801        n: c_int,
802        k: c_int,
803        alpha: c_double,
804        a: *const c_double,
805        lda: c_int,
806        x: *const c_double,
807        incx: c_int,
808        beta: c_double,
809        y: *mut c_double,
810        incy: c_int,
811    );
812    pub fn cblas_dspmv(
813        layout: CBLAS_LAYOUT,
814        uplo: CBLAS_UPLO,
815        n: c_int,
816        alpha: c_double,
817        ap: *const c_double,
818        x: *const c_double,
819        incx: c_int,
820        beta: c_double,
821        y: *mut c_double,
822        incy: c_int,
823    );
824    pub fn cblas_dger(
825        layout: CBLAS_LAYOUT,
826        m: c_int,
827        n: c_int,
828        alpha: c_double,
829        x: *const c_double,
830        incx: c_int,
831        y: *const c_double,
832        incy: c_int,
833        a: *mut c_double,
834        lda: c_int,
835    );
836    pub fn cblas_dsyr(
837        layout: CBLAS_LAYOUT,
838        uplo: CBLAS_UPLO,
839        n: c_int,
840        alpha: c_double,
841        x: *const c_double,
842        incx: c_int,
843        a: *mut c_double,
844        lda: c_int,
845    );
846    pub fn cblas_dspr(
847        layout: CBLAS_LAYOUT,
848        uplo: CBLAS_UPLO,
849        n: c_int,
850        alpha: c_double,
851        x: *const c_double,
852        incx: c_int,
853        ap: *mut c_double,
854    );
855    pub fn cblas_dsyr2(
856        layout: CBLAS_LAYOUT,
857        uplo: CBLAS_UPLO,
858        n: c_int,
859        alpha: c_double,
860        x: *const c_double,
861        incx: c_int,
862        y: *const c_double,
863        incy: c_int,
864        a: *mut c_double,
865        lda: c_int,
866    );
867    pub fn cblas_dspr2(
868        layout: CBLAS_LAYOUT,
869        uplo: CBLAS_UPLO,
870        n: c_int,
871        alpha: c_double,
872        x: *const c_double,
873        incx: c_int,
874        y: *const c_double,
875        incy: c_int,
876        a: *mut c_double,
877    );
878
879    // Prefixes C and Z only
880    pub fn cblas_chemv(
881        layout: CBLAS_LAYOUT,
882        uplo: CBLAS_UPLO,
883        n: c_int,
884        alpha: *const c_float_complex,
885        a: *const c_float_complex,
886        lda: c_int,
887        x: *const c_float_complex,
888        incx: c_int,
889        beta: *const c_float_complex,
890        y: *mut c_float_complex,
891        incy: c_int,
892    );
893    pub fn cblas_chbmv(
894        layout: CBLAS_LAYOUT,
895        uplo: CBLAS_UPLO,
896        n: c_int,
897        k: c_int,
898        alpha: *const c_float_complex,
899        a: *const c_float_complex,
900        lda: c_int,
901        x: *const c_float_complex,
902        incx: c_int,
903        beta: *const c_float_complex,
904        y: *mut c_float_complex,
905        incy: c_int,
906    );
907    pub fn cblas_chpmv(
908        layout: CBLAS_LAYOUT,
909        uplo: CBLAS_UPLO,
910        n: c_int,
911        alpha: *const c_float_complex,
912        ap: *const c_float_complex,
913        x: *const c_float_complex,
914        incx: c_int,
915        beta: *const c_float_complex,
916        y: *mut c_float_complex,
917        incy: c_int,
918    );
919    pub fn cblas_cgeru(
920        layout: CBLAS_LAYOUT,
921        m: c_int,
922        n: c_int,
923        alpha: *const c_float_complex,
924        x: *const c_float_complex,
925        incx: c_int,
926        y: *const c_float_complex,
927        incy: c_int,
928        a: *mut c_float_complex,
929        lda: c_int,
930    );
931    pub fn cblas_cgerc(
932        layout: CBLAS_LAYOUT,
933        m: c_int,
934        n: c_int,
935        alpha: *const c_float_complex,
936        x: *const c_float_complex,
937        incx: c_int,
938        y: *const c_float_complex,
939        incy: c_int,
940        a: *mut c_float_complex,
941        lda: c_int,
942    );
943    pub fn cblas_cher(
944        layout: CBLAS_LAYOUT,
945        uplo: CBLAS_UPLO,
946        n: c_int,
947        alpha: c_float,
948        x: *const c_float_complex,
949        incx: c_int,
950        a: *mut c_float_complex,
951        lda: c_int,
952    );
953    pub fn cblas_chpr(
954        layout: CBLAS_LAYOUT,
955        uplo: CBLAS_UPLO,
956        n: c_int,
957        alpha: c_float,
958        x: *const c_float_complex,
959        incx: c_int,
960        a: *mut c_float_complex,
961    );
962    pub fn cblas_cher2(
963        layout: CBLAS_LAYOUT,
964        uplo: CBLAS_UPLO,
965        n: c_int,
966        alpha: *const c_float_complex,
967        x: *const c_float_complex,
968        incx: c_int,
969        y: *const c_float_complex,
970        incy: c_int,
971        a: *mut c_float_complex,
972        lda: c_int,
973    );
974    pub fn cblas_chpr2(
975        layout: CBLAS_LAYOUT,
976        uplo: CBLAS_UPLO,
977        n: c_int,
978        alpha: *const c_float_complex,
979        x: *const c_float_complex,
980        incx: c_int,
981        y: *const c_float_complex,
982        incy: c_int,
983        ap: *mut c_float_complex,
984    );
985
986    pub fn cblas_zhemv(
987        layout: CBLAS_LAYOUT,
988        uplo: CBLAS_UPLO,
989        n: c_int,
990        alpha: *const c_double_complex,
991        a: *const c_double_complex,
992        lda: c_int,
993        x: *const c_double_complex,
994        incx: c_int,
995        beta: *const c_double_complex,
996        y: *mut c_double_complex,
997        incy: c_int,
998    );
999    pub fn cblas_zhbmv(
1000        layout: CBLAS_LAYOUT,
1001        uplo: CBLAS_UPLO,
1002        n: c_int,
1003        k: c_int,
1004        alpha: *const c_double_complex,
1005        a: *const c_double_complex,
1006        lda: c_int,
1007        x: *const c_double_complex,
1008        incx: c_int,
1009        beta: *const c_double_complex,
1010        y: *mut c_double_complex,
1011        incy: c_int,
1012    );
1013    pub fn cblas_zhpmv(
1014        layout: CBLAS_LAYOUT,
1015        uplo: CBLAS_UPLO,
1016        n: c_int,
1017        alpha: *const c_double_complex,
1018        ap: *const c_double_complex,
1019        x: *const c_double_complex,
1020        incx: c_int,
1021        beta: *const c_double_complex,
1022        y: *mut c_double_complex,
1023        incy: c_int,
1024    );
1025    pub fn cblas_zgeru(
1026        layout: CBLAS_LAYOUT,
1027        m: c_int,
1028        n: c_int,
1029        alpha: *const c_double_complex,
1030        x: *const c_double_complex,
1031        incx: c_int,
1032        y: *const c_double_complex,
1033        incy: c_int,
1034        a: *mut c_double_complex,
1035        lda: c_int,
1036    );
1037    pub fn cblas_zgerc(
1038        layout: CBLAS_LAYOUT,
1039        m: c_int,
1040        n: c_int,
1041        alpha: *const c_double_complex,
1042        x: *const c_double_complex,
1043        incx: c_int,
1044        y: *const c_double_complex,
1045        incy: c_int,
1046        a: *mut c_double_complex,
1047        lda: c_int,
1048    );
1049    pub fn cblas_zher(
1050        layout: CBLAS_LAYOUT,
1051        uplo: CBLAS_UPLO,
1052        n: c_int,
1053        alpha: c_double,
1054        x: *const c_double_complex,
1055        incx: c_int,
1056        a: *mut c_double_complex,
1057        lda: c_int,
1058    );
1059    pub fn cblas_zhpr(
1060        layout: CBLAS_LAYOUT,
1061        uplo: CBLAS_UPLO,
1062        n: c_int,
1063        alpha: c_double,
1064        x: *const c_double_complex,
1065        incx: c_int,
1066        a: *mut c_double_complex,
1067    );
1068    pub fn cblas_zher2(
1069        layout: CBLAS_LAYOUT,
1070        uplo: CBLAS_UPLO,
1071        n: c_int,
1072        alpha: *const c_double_complex,
1073        x: *const c_double_complex,
1074        incx: c_int,
1075        y: *const c_double_complex,
1076        incy: c_int,
1077        a: *mut c_double_complex,
1078        lda: c_int,
1079    );
1080    pub fn cblas_zhpr2(
1081        layout: CBLAS_LAYOUT,
1082        uplo: CBLAS_UPLO,
1083        n: c_int,
1084        alpha: *const c_double_complex,
1085        x: *const c_double_complex,
1086        incx: c_int,
1087        y: *const c_double_complex,
1088        incy: c_int,
1089        ap: *mut c_double_complex,
1090    );
1091}
1092
1093// Level 3
1094extern "C" {
1095    // Standard prefixes (S, D, C, and Z)
1096    pub fn cblas_sgemm(
1097        layout: CBLAS_LAYOUT,
1098        transa: CBLAS_TRANSPOSE,
1099        transb: CBLAS_TRANSPOSE,
1100        m: c_int,
1101        n: c_int,
1102        k: c_int,
1103        alpha: c_float,
1104        a: *const c_float,
1105        lda: c_int,
1106        b: *const c_float,
1107        ldb: c_int,
1108        beta: c_float,
1109        c: *mut c_float,
1110        ldc: c_int,
1111    );
1112    pub fn cblas_ssymm(
1113        layout: CBLAS_LAYOUT,
1114        side: CBLAS_SIDE,
1115        uplo: CBLAS_UPLO,
1116        m: c_int,
1117        n: c_int,
1118        alpha: c_float,
1119        a: *const c_float,
1120        lda: c_int,
1121        b: *const c_float,
1122        ldb: c_int,
1123        beta: c_float,
1124        c: *mut c_float,
1125        ldc: c_int,
1126    );
1127    pub fn cblas_ssyrk(
1128        layout: CBLAS_LAYOUT,
1129        uplo: CBLAS_UPLO,
1130        trans: CBLAS_TRANSPOSE,
1131        n: c_int,
1132        k: c_int,
1133        alpha: c_float,
1134        a: *const c_float,
1135        lda: c_int,
1136        beta: c_float,
1137        c: *mut c_float,
1138        ldc: c_int,
1139    );
1140    pub fn cblas_ssyr2k(
1141        layout: CBLAS_LAYOUT,
1142        uplo: CBLAS_UPLO,
1143        trans: CBLAS_TRANSPOSE,
1144        n: c_int,
1145        k: c_int,
1146        alpha: c_float,
1147        a: *const c_float,
1148        lda: c_int,
1149        b: *const c_float,
1150        ldb: c_int,
1151        beta: c_float,
1152        c: *mut c_float,
1153        ldc: c_int,
1154    );
1155    pub fn cblas_strmm(
1156        layout: CBLAS_LAYOUT,
1157        side: CBLAS_SIDE,
1158        uplo: CBLAS_UPLO,
1159        transa: CBLAS_TRANSPOSE,
1160        diag: CBLAS_DIAG,
1161        m: c_int,
1162        n: c_int,
1163        alpha: c_float,
1164        a: *const c_float,
1165        lda: c_int,
1166        b: *mut c_float,
1167        ldb: c_int,
1168    );
1169    pub fn cblas_strsm(
1170        layout: CBLAS_LAYOUT,
1171        side: CBLAS_SIDE,
1172        uplo: CBLAS_UPLO,
1173        transa: CBLAS_TRANSPOSE,
1174        diag: CBLAS_DIAG,
1175        m: c_int,
1176        n: c_int,
1177        alpha: c_float,
1178        a: *const c_float,
1179        lda: c_int,
1180        b: *mut c_float,
1181        ldb: c_int,
1182    );
1183
1184    pub fn cblas_dgemm(
1185        layout: CBLAS_LAYOUT,
1186        transa: CBLAS_TRANSPOSE,
1187        transb: CBLAS_TRANSPOSE,
1188        m: c_int,
1189        n: c_int,
1190        k: c_int,
1191        alpha: c_double,
1192        a: *const c_double,
1193        lda: c_int,
1194        b: *const c_double,
1195        ldb: c_int,
1196        beta: c_double,
1197        c: *mut c_double,
1198        ldc: c_int,
1199    );
1200    pub fn cblas_dsymm(
1201        layout: CBLAS_LAYOUT,
1202        side: CBLAS_SIDE,
1203        uplo: CBLAS_UPLO,
1204        m: c_int,
1205        n: c_int,
1206        alpha: c_double,
1207        a: *const c_double,
1208        lda: c_int,
1209        b: *const c_double,
1210        ldb: c_int,
1211        beta: c_double,
1212        c: *mut c_double,
1213        ldc: c_int,
1214    );
1215    pub fn cblas_dsyrk(
1216        layout: CBLAS_LAYOUT,
1217        uplo: CBLAS_UPLO,
1218        trans: CBLAS_TRANSPOSE,
1219        n: c_int,
1220        k: c_int,
1221        alpha: c_double,
1222        a: *const c_double,
1223        lda: c_int,
1224        beta: c_double,
1225        c: *mut c_double,
1226        ldc: c_int,
1227    );
1228    pub fn cblas_dsyr2k(
1229        layout: CBLAS_LAYOUT,
1230        uplo: CBLAS_UPLO,
1231        trans: CBLAS_TRANSPOSE,
1232        n: c_int,
1233        k: c_int,
1234        alpha: c_double,
1235        a: *const c_double,
1236        lda: c_int,
1237        b: *const c_double,
1238        ldb: c_int,
1239        beta: c_double,
1240        c: *mut c_double,
1241        ldc: c_int,
1242    );
1243    pub fn cblas_dtrmm(
1244        layout: CBLAS_LAYOUT,
1245        side: CBLAS_SIDE,
1246        uplo: CBLAS_UPLO,
1247        transa: CBLAS_TRANSPOSE,
1248        diag: CBLAS_DIAG,
1249        m: c_int,
1250        n: c_int,
1251        alpha: c_double,
1252        a: *const c_double,
1253        lda: c_int,
1254        b: *mut c_double,
1255        ldb: c_int,
1256    );
1257    pub fn cblas_dtrsm(
1258        layout: CBLAS_LAYOUT,
1259        side: CBLAS_SIDE,
1260        uplo: CBLAS_UPLO,
1261        transa: CBLAS_TRANSPOSE,
1262        diag: CBLAS_DIAG,
1263        m: c_int,
1264        n: c_int,
1265        alpha: c_double,
1266        a: *const c_double,
1267        lda: c_int,
1268        b: *mut c_double,
1269        ldb: c_int,
1270    );
1271
1272    pub fn cblas_cgemm(
1273        layout: CBLAS_LAYOUT,
1274        transa: CBLAS_TRANSPOSE,
1275        transb: CBLAS_TRANSPOSE,
1276        m: c_int,
1277        n: c_int,
1278        k: c_int,
1279        alpha: *const c_float_complex,
1280        a: *const c_float_complex,
1281        lda: c_int,
1282        b: *const c_float_complex,
1283        ldb: c_int,
1284        beta: *const c_float_complex,
1285        c: *mut c_float_complex,
1286        ldc: c_int,
1287    );
1288    pub fn cblas_csymm(
1289        layout: CBLAS_LAYOUT,
1290        side: CBLAS_SIDE,
1291        uplo: CBLAS_UPLO,
1292        m: c_int,
1293        n: c_int,
1294        alpha: *const c_float_complex,
1295        a: *const c_float_complex,
1296        lda: c_int,
1297        b: *const c_float_complex,
1298        ldb: c_int,
1299        beta: *const c_float_complex,
1300        c: *mut c_float_complex,
1301        ldc: c_int,
1302    );
1303    pub fn cblas_csyrk(
1304        layout: CBLAS_LAYOUT,
1305        uplo: CBLAS_UPLO,
1306        trans: CBLAS_TRANSPOSE,
1307        n: c_int,
1308        k: c_int,
1309        alpha: *const c_float_complex,
1310        a: *const c_float_complex,
1311        lda: c_int,
1312        beta: *const c_float_complex,
1313        c: *mut c_float_complex,
1314        ldc: c_int,
1315    );
1316    pub fn cblas_csyr2k(
1317        layout: CBLAS_LAYOUT,
1318        uplo: CBLAS_UPLO,
1319        trans: CBLAS_TRANSPOSE,
1320        n: c_int,
1321        k: c_int,
1322        alpha: *const c_float_complex,
1323        a: *const c_float_complex,
1324        lda: c_int,
1325        b: *const c_float_complex,
1326        ldb: c_int,
1327        beta: *const c_float_complex,
1328        c: *mut c_float_complex,
1329        ldc: c_int,
1330    );
1331    pub fn cblas_ctrmm(
1332        layout: CBLAS_LAYOUT,
1333        side: CBLAS_SIDE,
1334        uplo: CBLAS_UPLO,
1335        transa: CBLAS_TRANSPOSE,
1336        diag: CBLAS_DIAG,
1337        m: c_int,
1338        n: c_int,
1339        alpha: *const c_float_complex,
1340        a: *const c_float_complex,
1341        lda: c_int,
1342        b: *mut c_float_complex,
1343        ldb: c_int,
1344    );
1345    pub fn cblas_ctrsm(
1346        layout: CBLAS_LAYOUT,
1347        side: CBLAS_SIDE,
1348        uplo: CBLAS_UPLO,
1349        transa: CBLAS_TRANSPOSE,
1350        diag: CBLAS_DIAG,
1351        m: c_int,
1352        n: c_int,
1353        alpha: *const c_float_complex,
1354        a: *const c_float_complex,
1355        lda: c_int,
1356        b: *mut c_float_complex,
1357        ldb: c_int,
1358    );
1359
1360    pub fn cblas_zgemm(
1361        layout: CBLAS_LAYOUT,
1362        transa: CBLAS_TRANSPOSE,
1363        transb: CBLAS_TRANSPOSE,
1364        m: c_int,
1365        n: c_int,
1366        k: c_int,
1367        alpha: *const c_double_complex,
1368        a: *const c_double_complex,
1369        lda: c_int,
1370        b: *const c_double_complex,
1371        ldb: c_int,
1372        beta: *const c_double_complex,
1373        c: *mut c_double_complex,
1374        ldc: c_int,
1375    );
1376    pub fn cblas_zsymm(
1377        layout: CBLAS_LAYOUT,
1378        side: CBLAS_SIDE,
1379        uplo: CBLAS_UPLO,
1380        m: c_int,
1381        n: c_int,
1382        alpha: *const c_double_complex,
1383        a: *const c_double_complex,
1384        lda: c_int,
1385        b: *const c_double_complex,
1386        ldb: c_int,
1387        beta: *const c_double_complex,
1388        c: *mut c_double_complex,
1389        ldc: c_int,
1390    );
1391    pub fn cblas_zsyrk(
1392        layout: CBLAS_LAYOUT,
1393        uplo: CBLAS_UPLO,
1394        trans: CBLAS_TRANSPOSE,
1395        n: c_int,
1396        k: c_int,
1397        alpha: *const c_double_complex,
1398        a: *const c_double_complex,
1399        lda: c_int,
1400        beta: *const c_double_complex,
1401        c: *mut c_double_complex,
1402        ldc: c_int,
1403    );
1404    pub fn cblas_zsyr2k(
1405        layout: CBLAS_LAYOUT,
1406        uplo: CBLAS_UPLO,
1407        trans: CBLAS_TRANSPOSE,
1408        n: c_int,
1409        k: c_int,
1410        alpha: *const c_double_complex,
1411        a: *const c_double_complex,
1412        lda: c_int,
1413        b: *const c_double_complex,
1414        ldb: c_int,
1415        beta: *const c_double_complex,
1416        c: *mut c_double_complex,
1417        ldc: c_int,
1418    );
1419    pub fn cblas_ztrmm(
1420        layout: CBLAS_LAYOUT,
1421        side: CBLAS_SIDE,
1422        uplo: CBLAS_UPLO,
1423        transa: CBLAS_TRANSPOSE,
1424        diag: CBLAS_DIAG,
1425        m: c_int,
1426        n: c_int,
1427        alpha: *const c_double_complex,
1428        a: *const c_double_complex,
1429        lda: c_int,
1430        b: *mut c_double_complex,
1431        ldb: c_int,
1432    );
1433    pub fn cblas_ztrsm(
1434        layout: CBLAS_LAYOUT,
1435        side: CBLAS_SIDE,
1436        uplo: CBLAS_UPLO,
1437        transa: CBLAS_TRANSPOSE,
1438        diag: CBLAS_DIAG,
1439        m: c_int,
1440        n: c_int,
1441        alpha: *const c_double_complex,
1442        a: *const c_double_complex,
1443        lda: c_int,
1444        b: *mut c_double_complex,
1445        ldb: c_int,
1446    );
1447
1448    // Prefixes C and Z only
1449    pub fn cblas_chemm(
1450        layout: CBLAS_LAYOUT,
1451        side: CBLAS_SIDE,
1452        uplo: CBLAS_UPLO,
1453        m: c_int,
1454        n: c_int,
1455        alpha: *const c_float_complex,
1456        a: *const c_float_complex,
1457        lda: c_int,
1458        b: *const c_float_complex,
1459        ldb: c_int,
1460        beta: *const c_float_complex,
1461        c: *mut c_float_complex,
1462        ldc: c_int,
1463    );
1464    pub fn cblas_cherk(
1465        layout: CBLAS_LAYOUT,
1466        uplo: CBLAS_UPLO,
1467        trans: CBLAS_TRANSPOSE,
1468        n: c_int,
1469        k: c_int,
1470        alpha: c_float,
1471        a: *const c_float_complex,
1472        lda: c_int,
1473        beta: c_float,
1474        c: *mut c_float_complex,
1475        ldc: c_int,
1476    );
1477    pub fn cblas_cher2k(
1478        layout: CBLAS_LAYOUT,
1479        uplo: CBLAS_UPLO,
1480        trans: CBLAS_TRANSPOSE,
1481        n: c_int,
1482        k: c_int,
1483        alpha: *const c_float_complex,
1484        a: *const c_float_complex,
1485        lda: c_int,
1486        b: *const c_float_complex,
1487        ldb: c_int,
1488        beta: c_float,
1489        c: *mut c_float_complex,
1490        ldc: c_int,
1491    );
1492
1493    pub fn cblas_zhemm(
1494        layout: CBLAS_LAYOUT,
1495        side: CBLAS_SIDE,
1496        uplo: CBLAS_UPLO,
1497        m: c_int,
1498        n: c_int,
1499        alpha: *const c_double_complex,
1500        a: *const c_double_complex,
1501        lda: c_int,
1502        b: *const c_double_complex,
1503        ldb: c_int,
1504        beta: *const c_double_complex,
1505        c: *mut c_double_complex,
1506        ldc: c_int,
1507    );
1508    pub fn cblas_zherk(
1509        layout: CBLAS_LAYOUT,
1510        uplo: CBLAS_UPLO,
1511        trans: CBLAS_TRANSPOSE,
1512        n: c_int,
1513        k: c_int,
1514        alpha: c_double,
1515        a: *const c_double_complex,
1516        lda: c_int,
1517        beta: c_double,
1518        c: *mut c_double_complex,
1519        ldc: c_int,
1520    );
1521    pub fn cblas_zher2k(
1522        layout: CBLAS_LAYOUT,
1523        uplo: CBLAS_UPLO,
1524        trans: CBLAS_TRANSPOSE,
1525        n: c_int,
1526        k: c_int,
1527        alpha: *const c_double_complex,
1528        a: *const c_double_complex,
1529        lda: c_int,
1530        b: *const c_double_complex,
1531        ldb: c_int,
1532        beta: c_double,
1533        c: *mut c_double_complex,
1534        ldc: c_int,
1535    );
1536}
1537
1538extern "C" {
1539    pub fn cblas_xerbla(p: c_int, rout: *const c_char, form: *const c_char, ...);
1540}