xref: /aosp_15_r20/external/cblas/testing/c_xerbla.c (revision 1858f9982ea1ad57fb52080c08594e4d1cce4fa1)
1*1858f998SYi Kong #include <stdio.h>
2*1858f998SYi Kong #include <ctype.h>
3*1858f998SYi Kong #include <stdarg.h>
4*1858f998SYi Kong #include <string.h>
5*1858f998SYi Kong #include "cblas.h"
6*1858f998SYi Kong #include "cblas_test.h"
7*1858f998SYi Kong 
cblas_xerbla(int info,const char * rout,const char * form,...)8*1858f998SYi Kong void cblas_xerbla(int info, const char *rout, const char *form, ...)
9*1858f998SYi Kong {
10*1858f998SYi Kong    extern int cblas_lerr, cblas_info, cblas_ok;
11*1858f998SYi Kong    extern int link_xerbla;
12*1858f998SYi Kong    extern int RowMajorStrg;
13*1858f998SYi Kong    extern char *cblas_rout;
14*1858f998SYi Kong 
15*1858f998SYi Kong    /* Initially, c__3chke will call this routine with
16*1858f998SYi Kong     * global variable link_xerbla=1, and F77_xerbla will set link_xerbla=0.
17*1858f998SYi Kong     * This is done to fool the linker into loading these subroutines first
18*1858f998SYi Kong     * instead of ones in the CBLAS or the legacy BLAS library.
19*1858f998SYi Kong     */
20*1858f998SYi Kong    if (link_xerbla) return;
21*1858f998SYi Kong 
22*1858f998SYi Kong    if (cblas_rout != NULL && strcmp(cblas_rout, rout) != 0){
23*1858f998SYi Kong       printf("***** XERBLA WAS CALLED WITH SRNAME = <%s> INSTEAD OF <%s> *******\n", rout, cblas_rout);
24*1858f998SYi Kong       cblas_ok = FALSE;
25*1858f998SYi Kong    }
26*1858f998SYi Kong 
27*1858f998SYi Kong    if (RowMajorStrg)
28*1858f998SYi Kong    {
29*1858f998SYi Kong       /* To properly check leading dimension problems in cblas__gemm, we
30*1858f998SYi Kong        * need to do the following trick. When cblas__gemm is called with
31*1858f998SYi Kong        * CblasRowMajor, the arguments A and B switch places in the call to
32*1858f998SYi Kong        * f77__gemm. Thus when we test for bad leading dimension problems
33*1858f998SYi Kong        * for A and B, lda is in position 11 instead of 9, and ldb is in
34*1858f998SYi Kong        * position 9 instead of 11.
35*1858f998SYi Kong        */
36*1858f998SYi Kong       if (strstr(rout,"gemm") != 0)
37*1858f998SYi Kong       {
38*1858f998SYi Kong          if      (info == 5 ) info =  4;
39*1858f998SYi Kong          else if (info == 4 ) info =  5;
40*1858f998SYi Kong          else if (info == 11) info =  9;
41*1858f998SYi Kong          else if (info == 9 ) info = 11;
42*1858f998SYi Kong       }
43*1858f998SYi Kong       else if (strstr(rout,"symm") != 0 || strstr(rout,"hemm") != 0)
44*1858f998SYi Kong       {
45*1858f998SYi Kong          if      (info == 5 ) info =  4;
46*1858f998SYi Kong          else if (info == 4 ) info =  5;
47*1858f998SYi Kong       }
48*1858f998SYi Kong       else if (strstr(rout,"trmm") != 0 || strstr(rout,"trsm") != 0)
49*1858f998SYi Kong       {
50*1858f998SYi Kong          if      (info == 7 ) info =  6;
51*1858f998SYi Kong          else if (info == 6 ) info =  7;
52*1858f998SYi Kong       }
53*1858f998SYi Kong       else if (strstr(rout,"gemv") != 0)
54*1858f998SYi Kong       {
55*1858f998SYi Kong          if      (info == 4)  info = 3;
56*1858f998SYi Kong          else if (info == 3)  info = 4;
57*1858f998SYi Kong       }
58*1858f998SYi Kong       else if (strstr(rout,"gbmv") != 0)
59*1858f998SYi Kong       {
60*1858f998SYi Kong          if      (info == 4)  info = 3;
61*1858f998SYi Kong          else if (info == 3)  info = 4;
62*1858f998SYi Kong          else if (info == 6)  info = 5;
63*1858f998SYi Kong          else if (info == 5)  info = 6;
64*1858f998SYi Kong       }
65*1858f998SYi Kong       else if (strstr(rout,"ger") != 0)
66*1858f998SYi Kong       {
67*1858f998SYi Kong          if      (info == 3) info = 2;
68*1858f998SYi Kong          else if (info == 2) info = 3;
69*1858f998SYi Kong          else if (info == 8) info = 6;
70*1858f998SYi Kong          else if (info == 6) info = 8;
71*1858f998SYi Kong       }
72*1858f998SYi Kong       else if ( ( strstr(rout,"her2") != 0 || strstr(rout,"hpr2") != 0 )
73*1858f998SYi Kong                && strstr(rout,"her2k") == 0 )
74*1858f998SYi Kong       {
75*1858f998SYi Kong          if      (info == 8) info = 6;
76*1858f998SYi Kong          else if (info == 6) info = 8;
77*1858f998SYi Kong       }
78*1858f998SYi Kong    }
79*1858f998SYi Kong 
80*1858f998SYi Kong    if (info != cblas_info){
81*1858f998SYi Kong       printf("***** XERBLA WAS CALLED WITH INFO = %d INSTEAD OF %d in %s *******\n",info, cblas_info, rout);
82*1858f998SYi Kong       cblas_lerr = PASSED;
83*1858f998SYi Kong       cblas_ok = FALSE;
84*1858f998SYi Kong    } else cblas_lerr = FAILED;
85*1858f998SYi Kong }
86*1858f998SYi Kong 
87*1858f998SYi Kong #ifdef F77_Char
F77_xerbla(F77_Char F77_srname,void * vinfo)88*1858f998SYi Kong void F77_xerbla(F77_Char F77_srname, void *vinfo)
89*1858f998SYi Kong #else
90*1858f998SYi Kong void F77_xerbla(char *srname, void *vinfo)
91*1858f998SYi Kong #endif
92*1858f998SYi Kong {
93*1858f998SYi Kong #ifdef F77_Char
94*1858f998SYi Kong    char *srname;
95*1858f998SYi Kong #endif
96*1858f998SYi Kong 
97*1858f998SYi Kong    char rout[] = {'c','b','l','a','s','_','\0','\0','\0','\0','\0','\0','\0'};
98*1858f998SYi Kong 
99*1858f998SYi Kong #ifdef F77_Integer
100*1858f998SYi Kong    F77_Integer *info=vinfo;
101*1858f998SYi Kong    F77_Integer i;
102*1858f998SYi Kong    extern F77_Integer link_xerbla;
103*1858f998SYi Kong #else
104*1858f998SYi Kong    int *info=vinfo;
105*1858f998SYi Kong    int i;
106*1858f998SYi Kong    extern int link_xerbla;
107*1858f998SYi Kong #endif
108*1858f998SYi Kong #ifdef F77_Char
109*1858f998SYi Kong    srname = F2C_STR(F77_srname, XerblaStrLen);
110*1858f998SYi Kong #endif
111*1858f998SYi Kong 
112*1858f998SYi Kong    /* See the comment in cblas_xerbla() above */
113*1858f998SYi Kong    if (link_xerbla)
114*1858f998SYi Kong    {
115*1858f998SYi Kong       link_xerbla = 0;
116*1858f998SYi Kong       return;
117*1858f998SYi Kong    }
118*1858f998SYi Kong    for(i=0;  i  < 6; i++) rout[i+6] = tolower(srname[i]);
119*1858f998SYi Kong    for(i=11; i >= 9; i--) if (rout[i] == ' ') rout[i] = '\0';
120*1858f998SYi Kong 
121*1858f998SYi Kong    /* We increment *info by 1 since the CBLAS interface adds one more
122*1858f998SYi Kong     * argument to all level 2 and 3 routines.
123*1858f998SYi Kong     */
124*1858f998SYi Kong    cblas_xerbla(*info+1,rout,"");
125*1858f998SYi Kong }
126