xref: /aosp_15_r20/external/eigen/blas/level2_cplx_impl.h (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1*bf2c3715SXin Li // This file is part of Eigen, a lightweight C++ template library
2*bf2c3715SXin Li // for linear algebra.
3*bf2c3715SXin Li //
4*bf2c3715SXin Li // Copyright (C) 2009-2010 Gael Guennebaud <[email protected]>
5*bf2c3715SXin Li //
6*bf2c3715SXin Li // This Source Code Form is subject to the terms of the Mozilla
7*bf2c3715SXin Li // Public License v. 2.0. If a copy of the MPL was not distributed
8*bf2c3715SXin Li // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9*bf2c3715SXin Li 
10*bf2c3715SXin Li #include "common.h"
11*bf2c3715SXin Li 
12*bf2c3715SXin Li /**  ZHEMV  performs the matrix-vector  operation
13*bf2c3715SXin Li   *
14*bf2c3715SXin Li   *     y := alpha*A*x + beta*y,
15*bf2c3715SXin Li   *
16*bf2c3715SXin Li   *  where alpha and beta are scalars, x and y are n element vectors and
17*bf2c3715SXin Li   *  A is an n by n hermitian matrix.
18*bf2c3715SXin Li   */
EIGEN_BLAS_FUNC(hemv)19*bf2c3715SXin Li int EIGEN_BLAS_FUNC(hemv)(const char *uplo, const int *n, const RealScalar *palpha, const RealScalar *pa, const int *lda,
20*bf2c3715SXin Li                           const RealScalar *px, const int *incx, const RealScalar *pbeta, RealScalar *py, const int *incy)
21*bf2c3715SXin Li {
22*bf2c3715SXin Li   typedef void (*functype)(int, const Scalar*, int, const Scalar*, Scalar*, Scalar);
23*bf2c3715SXin Li   static const functype func[2] = {
24*bf2c3715SXin Li     // array index: UP
25*bf2c3715SXin Li     (internal::selfadjoint_matrix_vector_product<Scalar,int,ColMajor,Upper,false,false>::run),
26*bf2c3715SXin Li     // array index: LO
27*bf2c3715SXin Li     (internal::selfadjoint_matrix_vector_product<Scalar,int,ColMajor,Lower,false,false>::run),
28*bf2c3715SXin Li   };
29*bf2c3715SXin Li 
30*bf2c3715SXin Li   const Scalar* a = reinterpret_cast<const Scalar*>(pa);
31*bf2c3715SXin Li   const Scalar* x = reinterpret_cast<const Scalar*>(px);
32*bf2c3715SXin Li   Scalar* y = reinterpret_cast<Scalar*>(py);
33*bf2c3715SXin Li   Scalar alpha  = *reinterpret_cast<const Scalar*>(palpha);
34*bf2c3715SXin Li   Scalar beta   = *reinterpret_cast<const Scalar*>(pbeta);
35*bf2c3715SXin Li 
36*bf2c3715SXin Li   // check arguments
37*bf2c3715SXin Li   int info = 0;
38*bf2c3715SXin Li   if(UPLO(*uplo)==INVALID)        info = 1;
39*bf2c3715SXin Li   else if(*n<0)                   info = 2;
40*bf2c3715SXin Li   else if(*lda<std::max(1,*n))    info = 5;
41*bf2c3715SXin Li   else if(*incx==0)               info = 7;
42*bf2c3715SXin Li   else if(*incy==0)               info = 10;
43*bf2c3715SXin Li   if(info)
44*bf2c3715SXin Li     return xerbla_(SCALAR_SUFFIX_UP"HEMV ",&info,6);
45*bf2c3715SXin Li 
46*bf2c3715SXin Li   if(*n==0)
47*bf2c3715SXin Li     return 1;
48*bf2c3715SXin Li 
49*bf2c3715SXin Li   const Scalar* actual_x = get_compact_vector(x,*n,*incx);
50*bf2c3715SXin Li   Scalar* actual_y = get_compact_vector(y,*n,*incy);
51*bf2c3715SXin Li 
52*bf2c3715SXin Li   if(beta!=Scalar(1))
53*bf2c3715SXin Li   {
54*bf2c3715SXin Li     if(beta==Scalar(0)) make_vector(actual_y, *n).setZero();
55*bf2c3715SXin Li     else                make_vector(actual_y, *n) *= beta;
56*bf2c3715SXin Li   }
57*bf2c3715SXin Li 
58*bf2c3715SXin Li   if(alpha!=Scalar(0))
59*bf2c3715SXin Li   {
60*bf2c3715SXin Li     int code = UPLO(*uplo);
61*bf2c3715SXin Li     if(code>=2 || func[code]==0)
62*bf2c3715SXin Li       return 0;
63*bf2c3715SXin Li 
64*bf2c3715SXin Li     func[code](*n, a, *lda, actual_x, actual_y, alpha);
65*bf2c3715SXin Li   }
66*bf2c3715SXin Li 
67*bf2c3715SXin Li   if(actual_x!=x) delete[] actual_x;
68*bf2c3715SXin Li   if(actual_y!=y) delete[] copy_back(actual_y,y,*n,*incy);
69*bf2c3715SXin Li 
70*bf2c3715SXin Li   return 1;
71*bf2c3715SXin Li }
72*bf2c3715SXin Li 
73*bf2c3715SXin Li /**  ZHBMV  performs the matrix-vector  operation
74*bf2c3715SXin Li   *
75*bf2c3715SXin Li   *     y := alpha*A*x + beta*y,
76*bf2c3715SXin Li   *
77*bf2c3715SXin Li   *  where alpha and beta are scalars, x and y are n element vectors and
78*bf2c3715SXin Li   *  A is an n by n hermitian band matrix, with k super-diagonals.
79*bf2c3715SXin Li   */
80*bf2c3715SXin Li // int EIGEN_BLAS_FUNC(hbmv)(char *uplo, int *n, int *k, RealScalar *alpha, RealScalar *a, int *lda,
81*bf2c3715SXin Li //                           RealScalar *x, int *incx, RealScalar *beta, RealScalar *y, int *incy)
82*bf2c3715SXin Li // {
83*bf2c3715SXin Li //   return 1;
84*bf2c3715SXin Li // }
85*bf2c3715SXin Li 
86*bf2c3715SXin Li /**  ZHPMV  performs the matrix-vector operation
87*bf2c3715SXin Li   *
88*bf2c3715SXin Li   *     y := alpha*A*x + beta*y,
89*bf2c3715SXin Li   *
90*bf2c3715SXin Li   *  where alpha and beta are scalars, x and y are n element vectors and
91*bf2c3715SXin Li   *  A is an n by n hermitian matrix, supplied in packed form.
92*bf2c3715SXin Li   */
93*bf2c3715SXin Li // int EIGEN_BLAS_FUNC(hpmv)(char *uplo, int *n, RealScalar *alpha, RealScalar *ap, RealScalar *x, int *incx, RealScalar *beta, RealScalar *y, int *incy)
94*bf2c3715SXin Li // {
95*bf2c3715SXin Li //   return 1;
96*bf2c3715SXin Li // }
97*bf2c3715SXin Li 
98*bf2c3715SXin Li /**  ZHPR    performs the hermitian rank 1 operation
99*bf2c3715SXin Li   *
100*bf2c3715SXin Li   *     A := alpha*x*conjg( x' ) + A,
101*bf2c3715SXin Li   *
102*bf2c3715SXin Li   *  where alpha is a real scalar, x is an n element vector and A is an
103*bf2c3715SXin Li   *  n by n hermitian matrix, supplied in packed form.
104*bf2c3715SXin Li   */
EIGEN_BLAS_FUNC(hpr)105*bf2c3715SXin Li int EIGEN_BLAS_FUNC(hpr)(char *uplo, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *pap)
106*bf2c3715SXin Li {
107*bf2c3715SXin Li   typedef void (*functype)(int, Scalar*, const Scalar*, RealScalar);
108*bf2c3715SXin Li   static const functype func[2] = {
109*bf2c3715SXin Li     // array index: UP
110*bf2c3715SXin Li     (internal::selfadjoint_packed_rank1_update<Scalar,int,ColMajor,Upper,false,Conj>::run),
111*bf2c3715SXin Li     // array index: LO
112*bf2c3715SXin Li     (internal::selfadjoint_packed_rank1_update<Scalar,int,ColMajor,Lower,false,Conj>::run),
113*bf2c3715SXin Li   };
114*bf2c3715SXin Li 
115*bf2c3715SXin Li   Scalar* x = reinterpret_cast<Scalar*>(px);
116*bf2c3715SXin Li   Scalar* ap = reinterpret_cast<Scalar*>(pap);
117*bf2c3715SXin Li   RealScalar alpha = *palpha;
118*bf2c3715SXin Li 
119*bf2c3715SXin Li   int info = 0;
120*bf2c3715SXin Li   if(UPLO(*uplo)==INVALID)                                            info = 1;
121*bf2c3715SXin Li   else if(*n<0)                                                       info = 2;
122*bf2c3715SXin Li   else if(*incx==0)                                                   info = 5;
123*bf2c3715SXin Li   if(info)
124*bf2c3715SXin Li     return xerbla_(SCALAR_SUFFIX_UP"HPR  ",&info,6);
125*bf2c3715SXin Li 
126*bf2c3715SXin Li   if(alpha==Scalar(0))
127*bf2c3715SXin Li     return 1;
128*bf2c3715SXin Li 
129*bf2c3715SXin Li   Scalar* x_cpy = get_compact_vector(x, *n, *incx);
130*bf2c3715SXin Li 
131*bf2c3715SXin Li   int code = UPLO(*uplo);
132*bf2c3715SXin Li   if(code>=2 || func[code]==0)
133*bf2c3715SXin Li     return 0;
134*bf2c3715SXin Li 
135*bf2c3715SXin Li   func[code](*n, ap, x_cpy, alpha);
136*bf2c3715SXin Li 
137*bf2c3715SXin Li   if(x_cpy!=x)  delete[] x_cpy;
138*bf2c3715SXin Li 
139*bf2c3715SXin Li   return 1;
140*bf2c3715SXin Li }
141*bf2c3715SXin Li 
142*bf2c3715SXin Li /**  ZHPR2  performs the hermitian rank 2 operation
143*bf2c3715SXin Li   *
144*bf2c3715SXin Li   *     A := alpha*x*conjg( y' ) + conjg( alpha )*y*conjg( x' ) + A,
145*bf2c3715SXin Li   *
146*bf2c3715SXin Li   *  where alpha is a scalar, x and y are n element vectors and A is an
147*bf2c3715SXin Li   *  n by n hermitian matrix, supplied in packed form.
148*bf2c3715SXin Li   */
EIGEN_BLAS_FUNC(hpr2)149*bf2c3715SXin Li int EIGEN_BLAS_FUNC(hpr2)(char *uplo, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pap)
150*bf2c3715SXin Li {
151*bf2c3715SXin Li   typedef void (*functype)(int, Scalar*, const Scalar*, const Scalar*, Scalar);
152*bf2c3715SXin Li   static const functype func[2] = {
153*bf2c3715SXin Li     // array index: UP
154*bf2c3715SXin Li     (internal::packed_rank2_update_selector<Scalar,int,Upper>::run),
155*bf2c3715SXin Li     // array index: LO
156*bf2c3715SXin Li     (internal::packed_rank2_update_selector<Scalar,int,Lower>::run),
157*bf2c3715SXin Li   };
158*bf2c3715SXin Li 
159*bf2c3715SXin Li   Scalar* x = reinterpret_cast<Scalar*>(px);
160*bf2c3715SXin Li   Scalar* y = reinterpret_cast<Scalar*>(py);
161*bf2c3715SXin Li   Scalar* ap = reinterpret_cast<Scalar*>(pap);
162*bf2c3715SXin Li   Scalar alpha = *reinterpret_cast<Scalar*>(palpha);
163*bf2c3715SXin Li 
164*bf2c3715SXin Li   int info = 0;
165*bf2c3715SXin Li   if(UPLO(*uplo)==INVALID)                                            info = 1;
166*bf2c3715SXin Li   else if(*n<0)                                                       info = 2;
167*bf2c3715SXin Li   else if(*incx==0)                                                   info = 5;
168*bf2c3715SXin Li   else if(*incy==0)                                                   info = 7;
169*bf2c3715SXin Li   if(info)
170*bf2c3715SXin Li     return xerbla_(SCALAR_SUFFIX_UP"HPR2 ",&info,6);
171*bf2c3715SXin Li 
172*bf2c3715SXin Li   if(alpha==Scalar(0))
173*bf2c3715SXin Li     return 1;
174*bf2c3715SXin Li 
175*bf2c3715SXin Li   Scalar* x_cpy = get_compact_vector(x, *n, *incx);
176*bf2c3715SXin Li   Scalar* y_cpy = get_compact_vector(y, *n, *incy);
177*bf2c3715SXin Li 
178*bf2c3715SXin Li   int code = UPLO(*uplo);
179*bf2c3715SXin Li   if(code>=2 || func[code]==0)
180*bf2c3715SXin Li     return 0;
181*bf2c3715SXin Li 
182*bf2c3715SXin Li   func[code](*n, ap, x_cpy, y_cpy, alpha);
183*bf2c3715SXin Li 
184*bf2c3715SXin Li   if(x_cpy!=x)  delete[] x_cpy;
185*bf2c3715SXin Li   if(y_cpy!=y)  delete[] y_cpy;
186*bf2c3715SXin Li 
187*bf2c3715SXin Li   return 1;
188*bf2c3715SXin Li }
189*bf2c3715SXin Li 
190*bf2c3715SXin Li /**  ZHER   performs the hermitian rank 1 operation
191*bf2c3715SXin Li   *
192*bf2c3715SXin Li   *     A := alpha*x*conjg( x' ) + A,
193*bf2c3715SXin Li   *
194*bf2c3715SXin Li   *  where alpha is a real scalar, x is an n element vector and A is an
195*bf2c3715SXin Li   *  n by n hermitian matrix.
196*bf2c3715SXin Li   */
EIGEN_BLAS_FUNC(her)197*bf2c3715SXin Li int EIGEN_BLAS_FUNC(her)(char *uplo, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *pa, int *lda)
198*bf2c3715SXin Li {
199*bf2c3715SXin Li   typedef void (*functype)(int, Scalar*, int, const Scalar*, const Scalar*, const Scalar&);
200*bf2c3715SXin Li   static const functype func[2] = {
201*bf2c3715SXin Li     // array index: UP
202*bf2c3715SXin Li     (selfadjoint_rank1_update<Scalar,int,ColMajor,Upper,false,Conj>::run),
203*bf2c3715SXin Li     // array index: LO
204*bf2c3715SXin Li     (selfadjoint_rank1_update<Scalar,int,ColMajor,Lower,false,Conj>::run),
205*bf2c3715SXin Li   };
206*bf2c3715SXin Li 
207*bf2c3715SXin Li   Scalar* x = reinterpret_cast<Scalar*>(px);
208*bf2c3715SXin Li   Scalar* a = reinterpret_cast<Scalar*>(pa);
209*bf2c3715SXin Li   RealScalar alpha = *reinterpret_cast<RealScalar*>(palpha);
210*bf2c3715SXin Li 
211*bf2c3715SXin Li   int info = 0;
212*bf2c3715SXin Li   if(UPLO(*uplo)==INVALID)                                            info = 1;
213*bf2c3715SXin Li   else if(*n<0)                                                       info = 2;
214*bf2c3715SXin Li   else if(*incx==0)                                                   info = 5;
215*bf2c3715SXin Li   else if(*lda<std::max(1,*n))                                        info = 7;
216*bf2c3715SXin Li   if(info)
217*bf2c3715SXin Li     return xerbla_(SCALAR_SUFFIX_UP"HER  ",&info,6);
218*bf2c3715SXin Li 
219*bf2c3715SXin Li   if(alpha==RealScalar(0))
220*bf2c3715SXin Li     return 1;
221*bf2c3715SXin Li 
222*bf2c3715SXin Li   Scalar* x_cpy = get_compact_vector(x, *n, *incx);
223*bf2c3715SXin Li 
224*bf2c3715SXin Li   int code = UPLO(*uplo);
225*bf2c3715SXin Li   if(code>=2 || func[code]==0)
226*bf2c3715SXin Li     return 0;
227*bf2c3715SXin Li 
228*bf2c3715SXin Li   func[code](*n, a, *lda, x_cpy, x_cpy, alpha);
229*bf2c3715SXin Li 
230*bf2c3715SXin Li   matrix(a,*n,*n,*lda).diagonal().imag().setZero();
231*bf2c3715SXin Li 
232*bf2c3715SXin Li   if(x_cpy!=x)  delete[] x_cpy;
233*bf2c3715SXin Li 
234*bf2c3715SXin Li   return 1;
235*bf2c3715SXin Li }
236*bf2c3715SXin Li 
237*bf2c3715SXin Li /**  ZHER2  performs the hermitian rank 2 operation
238*bf2c3715SXin Li   *
239*bf2c3715SXin Li   *     A := alpha*x*conjg( y' ) + conjg( alpha )*y*conjg( x' ) + A,
240*bf2c3715SXin Li   *
241*bf2c3715SXin Li   *  where alpha is a scalar, x and y are n element vectors and A is an n
242*bf2c3715SXin Li   *  by n hermitian matrix.
243*bf2c3715SXin Li   */
EIGEN_BLAS_FUNC(her2)244*bf2c3715SXin Li int EIGEN_BLAS_FUNC(her2)(char *uplo, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pa, int *lda)
245*bf2c3715SXin Li {
246*bf2c3715SXin Li   typedef void (*functype)(int, Scalar*, int, const Scalar*, const Scalar*, Scalar);
247*bf2c3715SXin Li   static const functype func[2] = {
248*bf2c3715SXin Li     // array index: UP
249*bf2c3715SXin Li     (internal::rank2_update_selector<Scalar,int,Upper>::run),
250*bf2c3715SXin Li     // array index: LO
251*bf2c3715SXin Li     (internal::rank2_update_selector<Scalar,int,Lower>::run),
252*bf2c3715SXin Li   };
253*bf2c3715SXin Li 
254*bf2c3715SXin Li   Scalar* x = reinterpret_cast<Scalar*>(px);
255*bf2c3715SXin Li   Scalar* y = reinterpret_cast<Scalar*>(py);
256*bf2c3715SXin Li   Scalar* a = reinterpret_cast<Scalar*>(pa);
257*bf2c3715SXin Li   Scalar alpha = *reinterpret_cast<Scalar*>(palpha);
258*bf2c3715SXin Li 
259*bf2c3715SXin Li   int info = 0;
260*bf2c3715SXin Li   if(UPLO(*uplo)==INVALID)                                            info = 1;
261*bf2c3715SXin Li   else if(*n<0)                                                       info = 2;
262*bf2c3715SXin Li   else if(*incx==0)                                                   info = 5;
263*bf2c3715SXin Li   else if(*incy==0)                                                   info = 7;
264*bf2c3715SXin Li   else if(*lda<std::max(1,*n))                                        info = 9;
265*bf2c3715SXin Li   if(info)
266*bf2c3715SXin Li     return xerbla_(SCALAR_SUFFIX_UP"HER2 ",&info,6);
267*bf2c3715SXin Li 
268*bf2c3715SXin Li   if(alpha==Scalar(0))
269*bf2c3715SXin Li     return 1;
270*bf2c3715SXin Li 
271*bf2c3715SXin Li   Scalar* x_cpy = get_compact_vector(x, *n, *incx);
272*bf2c3715SXin Li   Scalar* y_cpy = get_compact_vector(y, *n, *incy);
273*bf2c3715SXin Li 
274*bf2c3715SXin Li   int code = UPLO(*uplo);
275*bf2c3715SXin Li   if(code>=2 || func[code]==0)
276*bf2c3715SXin Li     return 0;
277*bf2c3715SXin Li 
278*bf2c3715SXin Li   func[code](*n, a, *lda, x_cpy, y_cpy, alpha);
279*bf2c3715SXin Li 
280*bf2c3715SXin Li   matrix(a,*n,*n,*lda).diagonal().imag().setZero();
281*bf2c3715SXin Li 
282*bf2c3715SXin Li   if(x_cpy!=x)  delete[] x_cpy;
283*bf2c3715SXin Li   if(y_cpy!=y)  delete[] y_cpy;
284*bf2c3715SXin Li 
285*bf2c3715SXin Li   return 1;
286*bf2c3715SXin Li }
287*bf2c3715SXin Li 
288*bf2c3715SXin Li /**  ZGERU  performs the rank 1 operation
289*bf2c3715SXin Li   *
290*bf2c3715SXin Li   *     A := alpha*x*y' + A,
291*bf2c3715SXin Li   *
292*bf2c3715SXin Li   *  where alpha is a scalar, x is an m element vector, y is an n element
293*bf2c3715SXin Li   *  vector and A is an m by n matrix.
294*bf2c3715SXin Li   */
EIGEN_BLAS_FUNC(geru)295*bf2c3715SXin Li int EIGEN_BLAS_FUNC(geru)(int *m, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pa, int *lda)
296*bf2c3715SXin Li {
297*bf2c3715SXin Li   Scalar* x = reinterpret_cast<Scalar*>(px);
298*bf2c3715SXin Li   Scalar* y = reinterpret_cast<Scalar*>(py);
299*bf2c3715SXin Li   Scalar* a = reinterpret_cast<Scalar*>(pa);
300*bf2c3715SXin Li   Scalar alpha = *reinterpret_cast<Scalar*>(palpha);
301*bf2c3715SXin Li 
302*bf2c3715SXin Li   int info = 0;
303*bf2c3715SXin Li        if(*m<0)                                                       info = 1;
304*bf2c3715SXin Li   else if(*n<0)                                                       info = 2;
305*bf2c3715SXin Li   else if(*incx==0)                                                   info = 5;
306*bf2c3715SXin Li   else if(*incy==0)                                                   info = 7;
307*bf2c3715SXin Li   else if(*lda<std::max(1,*m))                                        info = 9;
308*bf2c3715SXin Li   if(info)
309*bf2c3715SXin Li     return xerbla_(SCALAR_SUFFIX_UP"GERU ",&info,6);
310*bf2c3715SXin Li 
311*bf2c3715SXin Li   if(alpha==Scalar(0))
312*bf2c3715SXin Li     return 1;
313*bf2c3715SXin Li 
314*bf2c3715SXin Li   Scalar* x_cpy = get_compact_vector(x,*m,*incx);
315*bf2c3715SXin Li   Scalar* y_cpy = get_compact_vector(y,*n,*incy);
316*bf2c3715SXin Li 
317*bf2c3715SXin Li   internal::general_rank1_update<Scalar,int,ColMajor,false,false>::run(*m, *n, a, *lda, x_cpy, y_cpy, alpha);
318*bf2c3715SXin Li 
319*bf2c3715SXin Li   if(x_cpy!=x)  delete[] x_cpy;
320*bf2c3715SXin Li   if(y_cpy!=y)  delete[] y_cpy;
321*bf2c3715SXin Li 
322*bf2c3715SXin Li   return 1;
323*bf2c3715SXin Li }
324*bf2c3715SXin Li 
325*bf2c3715SXin Li /**  ZGERC  performs the rank 1 operation
326*bf2c3715SXin Li   *
327*bf2c3715SXin Li   *     A := alpha*x*conjg( y' ) + A,
328*bf2c3715SXin Li   *
329*bf2c3715SXin Li   *  where alpha is a scalar, x is an m element vector, y is an n element
330*bf2c3715SXin Li   *  vector and A is an m by n matrix.
331*bf2c3715SXin Li   */
EIGEN_BLAS_FUNC(gerc)332*bf2c3715SXin Li int EIGEN_BLAS_FUNC(gerc)(int *m, int *n, RealScalar *palpha, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pa, int *lda)
333*bf2c3715SXin Li {
334*bf2c3715SXin Li   Scalar* x = reinterpret_cast<Scalar*>(px);
335*bf2c3715SXin Li   Scalar* y = reinterpret_cast<Scalar*>(py);
336*bf2c3715SXin Li   Scalar* a = reinterpret_cast<Scalar*>(pa);
337*bf2c3715SXin Li   Scalar alpha = *reinterpret_cast<Scalar*>(palpha);
338*bf2c3715SXin Li 
339*bf2c3715SXin Li   int info = 0;
340*bf2c3715SXin Li        if(*m<0)                                                       info = 1;
341*bf2c3715SXin Li   else if(*n<0)                                                       info = 2;
342*bf2c3715SXin Li   else if(*incx==0)                                                   info = 5;
343*bf2c3715SXin Li   else if(*incy==0)                                                   info = 7;
344*bf2c3715SXin Li   else if(*lda<std::max(1,*m))                                        info = 9;
345*bf2c3715SXin Li   if(info)
346*bf2c3715SXin Li     return xerbla_(SCALAR_SUFFIX_UP"GERC ",&info,6);
347*bf2c3715SXin Li 
348*bf2c3715SXin Li   if(alpha==Scalar(0))
349*bf2c3715SXin Li     return 1;
350*bf2c3715SXin Li 
351*bf2c3715SXin Li   Scalar* x_cpy = get_compact_vector(x,*m,*incx);
352*bf2c3715SXin Li   Scalar* y_cpy = get_compact_vector(y,*n,*incy);
353*bf2c3715SXin Li 
354*bf2c3715SXin Li   internal::general_rank1_update<Scalar,int,ColMajor,false,Conj>::run(*m, *n, a, *lda, x_cpy, y_cpy, alpha);
355*bf2c3715SXin Li 
356*bf2c3715SXin Li   if(x_cpy!=x)  delete[] x_cpy;
357*bf2c3715SXin Li   if(y_cpy!=y)  delete[] y_cpy;
358*bf2c3715SXin Li 
359*bf2c3715SXin Li   return 1;
360*bf2c3715SXin Li }
361