{
#define a1_ref(a_1,a_2) ( a1+(a_2)*(*lda) + (a_1))
#define a2_ref(a_1,a_2) ( a2+(a_2)*(*lda) + (a_1))
#define t_ref(a_1) (dwork+(a_1))
#define d_ref(a_1) (dwork+(lddwork+(a_1))*nb)
#define dd_ref(a_1) (dwork+(2*lddwork+(a_1))*nb)
#define work_a1 ( work )
#define work_a2 ( work + nb )
#define hwork ( work + (nb)*(*m))
int i, k, ldwork, lddwork, old_i, old_ib, rows, cols;
int nbmin, ib, ldda;
*info = 0;
int lwkopt = (*n+*m) * nb;
work[0] = (cuDoubleComplex) lwkopt;
long int lquery = *lwork == -1;
if (*m < 0) {
*info = -1;
} else if (*n < 0) {
*info = -2;
}
else if (*lda <
max(1,*m)) {
*info = -4;
}
else if (*lwork <
max(1,*n) && ! lquery) {
*info = -7;
}
if (*info != 0) {
return *info;
}
else if (lquery)
return *info;
if (k == 0) {
return *info;
}
int lhwork = *lwork - (*m)*nb;
static cudaStream_t stream[2];
ldda = *m;
nbmin = 2;
ldwork = *m;
lddwork= k;
for (i = 0; i < k; i += nb) {
rows = *m -i;
rows = *m;
work_a2, ldwork, stream[1] );
work_a1, ldwork, stream[1] );
if (i>0) {
cols = *n-old_i-2*old_ib;
magma_zssrfb(*m, cols, &old_ib,
a1_ref(old_i, old_i+2*old_ib), lda,
a2_ref( 0, old_i+2*old_ib), lda,
}
work_a1, ib,
d_ref(i), ib, stream[0] );
if (i + ib < *n) {
if (i+nb < k){
magma_zssrfb(*m, ib, &ib,
}
else {
cols = *n-i-ib;
magma_zssrfb(*m, cols, &ib,
}
old_i = i;
old_ib = ib;
}
}
return *info;
}