- Notifications
You must be signed in to change notification settings - Fork 1.6k
/
Copy pathcblas_cher2.c
152 lines (141 loc) · 3.32 KB
/
cblas_cher2.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*
* cblas_cher2.c
* The program is a C interface to cher2.
*
* Keita Teranishi 3/23/98
*
*/
#include<stdio.h>
#include<stdlib.h>
#include"cblas.h"
#include"cblas_f77.h"
voidcblas_cher2(constCBLAS_LAYOUTlayout, constCBLAS_UPLOUplo,
constintN, constvoid*alpha, constvoid*X, constintincX,
constvoid*Y, constintincY, void*A, constintlda)
{
charUL;
#ifdefF77_CHAR
F77_CHARF77_UL;
#else
#defineF77_UL &UL
#endif
#ifdefF77_INT
F77_INTF77_N=N, F77_lda=lda, F77_incX=incX, F77_incY=incY;
#else
#defineF77_N N
#defineF77_lda lda
#defineF77_incX incx
#defineF77_incY incy
#endif
intn, i, j, tincx, tincy, incx=incX, incy=incY;
float*x=(float*)X, *xx=(float*)X, *y=(float*)Y,
*yy=(float*)Y, *tx, *ty, *stx, *sty;
externintCBLAS_CallFromC;
externintRowMajorStrg;
RowMajorStrg=0;
CBLAS_CallFromC=1;
if (layout==CblasColMajor)
{
if (Uplo==CblasLower) UL='L';
elseif (Uplo==CblasUpper) UL='U';
else
{
cblas_xerbla(2, "cblas_cher2","Illegal Uplo setting, %d\n",Uplo );
CBLAS_CallFromC=0;
RowMajorStrg=0;
return;
}
#ifdefF77_CHAR
F77_UL=C2F_CHAR(&UL);
#endif
F77_cher2(F77_UL, &F77_N, alpha, X, &F77_incX,
Y, &F77_incY, A, &F77_lda);
} elseif (layout==CblasRowMajor)
{
RowMajorStrg=1;
if (Uplo==CblasUpper) UL='L';
elseif (Uplo==CblasLower) UL='U';
else
{
cblas_xerbla(2, "cblas_cher2","Illegal Uplo setting, %d\n", Uplo);
CBLAS_CallFromC=0;
RowMajorStrg=0;
return;
}
#ifdefF77_CHAR
F77_UL=C2F_CHAR(&UL);
#endif
if (N>0)
{
n=N << 1;
x=malloc(n*sizeof(float));
y=malloc(n*sizeof(float));
tx=x;
ty=y;
if( incX>0 ) {
i=incX << 1 ;
tincx=2;
stx=x+n;
} else {
i=incX*(-2);
tincx=-2;
stx=x-2;
x+=(n-2);
}
if( incY>0 ) {
j=incY << 1;
tincy=2;
sty=y+n;
} else {
j=incY*(-2);
tincy=-2;
sty=y-2;
y+=(n-2);
}
do
{
*x=*xx;
x[1] =-xx[1];
x+=tincx ;
xx+=i;
}
while (x!=stx);
do
{
*y=*yy;
y[1] =-yy[1];
y+=tincy ;
yy+=j;
}
while (y!=sty);
x=tx;
y=ty;
#ifdefF77_INT
F77_incX=1;
F77_incY=1;
#else
incx=1;
incy=1;
#endif
} else
{
x= (float*) X;
y= (float*) Y;
}
F77_cher2(F77_UL, &F77_N, alpha, y, &F77_incY, x,
&F77_incX, A, &F77_lda);
} else
{
cblas_xerbla(1, "cblas_cher2","Illegal layout setting, %d\n", layout);
CBLAS_CallFromC=0;
RowMajorStrg=0;
return;
}
if(X!=x)
free(x);
if(Y!=y)
free(y);
CBLAS_CallFromC=0;
RowMajorStrg=0;
return;
}