C_LAPACK: Fixes to make it compile with MSVC (#3605)
[platform/upstream/openblas.git] / lapack-netlib / SRC / strsyl.c
1 #include <math.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <stdio.h>
5 #include <complex.h>
6 #ifdef complex
7 #undef complex
8 #endif
9 #ifdef I
10 #undef I
11 #endif
12
13 #if defined(_WIN64)
14 typedef long long BLASLONG;
15 typedef unsigned long long BLASULONG;
16 #else
17 typedef long BLASLONG;
18 typedef unsigned long BLASULONG;
19 #endif
20
21 #ifdef LAPACK_ILP64
22 typedef BLASLONG blasint;
23 #if defined(_WIN64)
24 #define blasabs(x) llabs(x)
25 #else
26 #define blasabs(x) labs(x)
27 #endif
28 #else
29 typedef int blasint;
30 #define blasabs(x) abs(x)
31 #endif
32
33 typedef blasint integer;
34
35 typedef unsigned int uinteger;
36 typedef char *address;
37 typedef short int shortint;
38 typedef float real;
39 typedef double doublereal;
40 typedef struct { real r, i; } complex;
41 typedef struct { doublereal r, i; } doublecomplex;
42 #ifdef _MSC_VER
43 static inline _Fcomplex Cf(complex *z) {_Fcomplex zz={z->r , z->i}; return zz;}
44 static inline _Dcomplex Cd(doublecomplex *z) {_Dcomplex zz={z->r , z->i};return zz;}
45 static inline _Fcomplex * _pCf(complex *z) {return (_Fcomplex*)z;}
46 static inline _Dcomplex * _pCd(doublecomplex *z) {return (_Dcomplex*)z;}
47 #else
48 static inline _Complex float Cf(complex *z) {return z->r + z->i*_Complex_I;}
49 static inline _Complex double Cd(doublecomplex *z) {return z->r + z->i*_Complex_I;}
50 static inline _Complex float * _pCf(complex *z) {return (_Complex float*)z;}
51 static inline _Complex double * _pCd(doublecomplex *z) {return (_Complex double*)z;}
52 #endif
53 #define pCf(z) (*_pCf(z))
54 #define pCd(z) (*_pCd(z))
55 typedef int logical;
56 typedef short int shortlogical;
57 typedef char logical1;
58 typedef char integer1;
59
60 #define TRUE_ (1)
61 #define FALSE_ (0)
62
63 /* Extern is for use with -E */
64 #ifndef Extern
65 #define Extern extern
66 #endif
67
68 /* I/O stuff */
69
70 typedef int flag;
71 typedef int ftnlen;
72 typedef int ftnint;
73
74 /*external read, write*/
75 typedef struct
76 {       flag cierr;
77         ftnint ciunit;
78         flag ciend;
79         char *cifmt;
80         ftnint cirec;
81 } cilist;
82
83 /*internal read, write*/
84 typedef struct
85 {       flag icierr;
86         char *iciunit;
87         flag iciend;
88         char *icifmt;
89         ftnint icirlen;
90         ftnint icirnum;
91 } icilist;
92
93 /*open*/
94 typedef struct
95 {       flag oerr;
96         ftnint ounit;
97         char *ofnm;
98         ftnlen ofnmlen;
99         char *osta;
100         char *oacc;
101         char *ofm;
102         ftnint orl;
103         char *oblnk;
104 } olist;
105
106 /*close*/
107 typedef struct
108 {       flag cerr;
109         ftnint cunit;
110         char *csta;
111 } cllist;
112
113 /*rewind, backspace, endfile*/
114 typedef struct
115 {       flag aerr;
116         ftnint aunit;
117 } alist;
118
119 /* inquire */
120 typedef struct
121 {       flag inerr;
122         ftnint inunit;
123         char *infile;
124         ftnlen infilen;
125         ftnint  *inex;  /*parameters in standard's order*/
126         ftnint  *inopen;
127         ftnint  *innum;
128         ftnint  *innamed;
129         char    *inname;
130         ftnlen  innamlen;
131         char    *inacc;
132         ftnlen  inacclen;
133         char    *inseq;
134         ftnlen  inseqlen;
135         char    *indir;
136         ftnlen  indirlen;
137         char    *infmt;
138         ftnlen  infmtlen;
139         char    *inform;
140         ftnint  informlen;
141         char    *inunf;
142         ftnlen  inunflen;
143         ftnint  *inrecl;
144         ftnint  *innrec;
145         char    *inblank;
146         ftnlen  inblanklen;
147 } inlist;
148
149 #define VOID void
150
151 union Multitype {       /* for multiple entry points */
152         integer1 g;
153         shortint h;
154         integer i;
155         /* longint j; */
156         real r;
157         doublereal d;
158         complex c;
159         doublecomplex z;
160         };
161
162 typedef union Multitype Multitype;
163
164 struct Vardesc {        /* for Namelist */
165         char *name;
166         char *addr;
167         ftnlen *dims;
168         int  type;
169         };
170 typedef struct Vardesc Vardesc;
171
172 struct Namelist {
173         char *name;
174         Vardesc **vars;
175         int nvars;
176         };
177 typedef struct Namelist Namelist;
178
179 #define abs(x) ((x) >= 0 ? (x) : -(x))
180 #define dabs(x) (fabs(x))
181 #define f2cmin(a,b) ((a) <= (b) ? (a) : (b))
182 #define f2cmax(a,b) ((a) >= (b) ? (a) : (b))
183 #define dmin(a,b) (f2cmin(a,b))
184 #define dmax(a,b) (f2cmax(a,b))
185 #define bit_test(a,b)   ((a) >> (b) & 1)
186 #define bit_clear(a,b)  ((a) & ~((uinteger)1 << (b)))
187 #define bit_set(a,b)    ((a) |  ((uinteger)1 << (b)))
188
189 #define abort_() { sig_die("Fortran abort routine called", 1); }
190 #define c_abs(z) (cabsf(Cf(z)))
191 #define c_cos(R,Z) { pCf(R)=ccos(Cf(Z)); }
192 #ifdef _MSC_VER
193 #define c_div(c, a, b) {Cf(c)._Val[0] = (Cf(a)._Val[0]/Cf(b)._Val[0]); Cf(c)._Val[1]=(Cf(a)._Val[1]/Cf(b)._Val[1]);}
194 #define z_div(c, a, b) {Cd(c)._Val[0] = (Cd(a)._Val[0]/Cd(b)._Val[0]); Cd(c)._Val[1]=(Cd(a)._Val[1]/df(b)._Val[1]);}
195 #else
196 #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);}
197 #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);}
198 #endif
199 #define c_exp(R, Z) {pCf(R) = cexpf(Cf(Z));}
200 #define c_log(R, Z) {pCf(R) = clogf(Cf(Z));}
201 #define c_sin(R, Z) {pCf(R) = csinf(Cf(Z));}
202 //#define c_sqrt(R, Z) {*(R) = csqrtf(Cf(Z));}
203 #define c_sqrt(R, Z) {pCf(R) = csqrtf(Cf(Z));}
204 #define d_abs(x) (fabs(*(x)))
205 #define d_acos(x) (acos(*(x)))
206 #define d_asin(x) (asin(*(x)))
207 #define d_atan(x) (atan(*(x)))
208 #define d_atn2(x, y) (atan2(*(x),*(y)))
209 #define d_cnjg(R, Z) { pCd(R) = conj(Cd(Z)); }
210 #define r_cnjg(R, Z) { pCf(R) = conjf(Cf(Z)); }
211 #define d_cos(x) (cos(*(x)))
212 #define d_cosh(x) (cosh(*(x)))
213 #define d_dim(__a, __b) ( *(__a) > *(__b) ? *(__a) - *(__b) : 0.0 )
214 #define d_exp(x) (exp(*(x)))
215 #define d_imag(z) (cimag(Cd(z)))
216 #define r_imag(z) (cimagf(Cf(z)))
217 #define d_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x)))
218 #define r_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x)))
219 #define d_lg10(x) ( 0.43429448190325182765 * log(*(x)) )
220 #define r_lg10(x) ( 0.43429448190325182765 * log(*(x)) )
221 #define d_log(x) (log(*(x)))
222 #define d_mod(x, y) (fmod(*(x), *(y)))
223 #define u_nint(__x) ((__x)>=0 ? floor((__x) + .5) : -floor(.5 - (__x)))
224 #define d_nint(x) u_nint(*(x))
225 #define u_sign(__a,__b) ((__b) >= 0 ? ((__a) >= 0 ? (__a) : -(__a)) : -((__a) >= 0 ? (__a) : -(__a)))
226 #define d_sign(a,b) u_sign(*(a),*(b))
227 #define r_sign(a,b) u_sign(*(a),*(b))
228 #define d_sin(x) (sin(*(x)))
229 #define d_sinh(x) (sinh(*(x)))
230 #define d_sqrt(x) (sqrt(*(x)))
231 #define d_tan(x) (tan(*(x)))
232 #define d_tanh(x) (tanh(*(x)))
233 #define i_abs(x) abs(*(x))
234 #define i_dnnt(x) ((integer)u_nint(*(x)))
235 #define i_len(s, n) (n)
236 #define i_nint(x) ((integer)u_nint(*(x)))
237 #define i_sign(a,b) ((integer)u_sign((integer)*(a),(integer)*(b)))
238 #define pow_dd(ap, bp) ( pow(*(ap), *(bp)))
239 #define pow_si(B,E) spow_ui(*(B),*(E))
240 #define pow_ri(B,E) spow_ui(*(B),*(E))
241 #define pow_di(B,E) dpow_ui(*(B),*(E))
242 #define pow_zi(p, a, b) {pCd(p) = zpow_ui(Cd(a), *(b));}
243 #define pow_ci(p, a, b) {pCf(p) = cpow_ui(Cf(a), *(b));}
244 #define pow_zz(R,A,B) {pCd(R) = cpow(Cd(A),*(B));}
245 #define s_cat(lpp, rpp, rnp, np, llp) {         ftnlen i, nc, ll; char *f__rp, *lp;     ll = (llp); lp = (lpp);         for(i=0; i < (int)*(np); ++i) {                 nc = ll;                if((rnp)[i] < nc) nc = (rnp)[i];                ll -= nc;               f__rp = (rpp)[i];               while(--nc >= 0) *lp++ = *(f__rp)++;         }  while(--ll >= 0) *lp++ = ' '; }
246 #define s_cmp(a,b,c,d) ((integer)strncmp((a),(b),f2cmin((c),(d))))
247 #define s_copy(A,B,C,D) { int __i,__m; for (__i=0, __m=f2cmin((C),(D)); __i<__m && (B)[__i] != 0; ++__i) (A)[__i] = (B)[__i]; }
248 #define sig_die(s, kill) { exit(1); }
249 #define s_stop(s, n) {exit(0);}
250 static char junk[] = "\n@(#)LIBF77 VERSION 19990503\n";
251 #define z_abs(z) (cabs(Cd(z)))
252 #define z_exp(R, Z) {pCd(R) = cexp(Cd(Z));}
253 #define z_sqrt(R, Z) {pCd(R) = csqrt(Cd(Z));}
254 #define myexit_() break;
255 #define mycycle() continue;
256 #define myceiling(w) {ceil(w)}
257 #define myhuge(w) {HUGE_VAL}
258 //#define mymaxloc_(w,s,e,n) {if (sizeof(*(w)) == sizeof(double)) dmaxloc_((w),*(s),*(e),n); else dmaxloc_((w),*(s),*(e),n);}
259 #define mymaxloc(w,s,e,n) {dmaxloc_(w,*(s),*(e),n)}
260
261 /* procedure parameter types for -A and -C++ */
262
263 #define F2C_proc_par_types 1
264 #ifdef __cplusplus
265 typedef logical (*L_fp)(...);
266 #else
267 typedef logical (*L_fp)();
268 #endif
269
270 static float spow_ui(float x, integer n) {
271         float pow=1.0; unsigned long int u;
272         if(n != 0) {
273                 if(n < 0) n = -n, x = 1/x;
274                 for(u = n; ; ) {
275                         if(u & 01) pow *= x;
276                         if(u >>= 1) x *= x;
277                         else break;
278                 }
279         }
280         return pow;
281 }
282 static double dpow_ui(double x, integer n) {
283         double pow=1.0; unsigned long int u;
284         if(n != 0) {
285                 if(n < 0) n = -n, x = 1/x;
286                 for(u = n; ; ) {
287                         if(u & 01) pow *= x;
288                         if(u >>= 1) x *= x;
289                         else break;
290                 }
291         }
292         return pow;
293 }
294 #ifdef _MSC_VER
295 static _Fcomplex cpow_ui(complex x, integer n) {
296         complex pow={1.0,0.0}; unsigned long int u;
297                 if(n != 0) {
298                 if(n < 0) n = -n, x.r = 1/x.r, x.i=1/x.i;
299                 for(u = n; ; ) {
300                         if(u & 01) pow.r *= x.r, pow.i *= x.i;
301                         if(u >>= 1) x.r *= x.r, x.i *= x.i;
302                         else break;
303                 }
304         }
305         _Fcomplex p={pow.r, pow.i};
306         return p;
307 }
308 #else
309 static _Complex float cpow_ui(_Complex float x, integer n) {
310         _Complex float pow=1.0; unsigned long int u;
311         if(n != 0) {
312                 if(n < 0) n = -n, x = 1/x;
313                 for(u = n; ; ) {
314                         if(u & 01) pow *= x;
315                         if(u >>= 1) x *= x;
316                         else break;
317                 }
318         }
319         return pow;
320 }
321 #endif
322 #ifdef _MSC_VER
323 static _Dcomplex zpow_ui(_Dcomplex x, integer n) {
324         _Dcomplex pow={1.0,0.0}; unsigned long int u;
325         if(n != 0) {
326                 if(n < 0) n = -n, x._Val[0] = 1/x._Val[0], x._Val[1] =1/x._Val[1];
327                 for(u = n; ; ) {
328                         if(u & 01) pow._Val[0] *= x._Val[0], pow._Val[1] *= x._Val[1];
329                         if(u >>= 1) x._Val[0] *= x._Val[0], x._Val[1] *= x._Val[1];
330                         else break;
331                 }
332         }
333         _Dcomplex p = {pow._Val[0], pow._Val[1]};
334         return p;
335 }
336 #else
337 static _Complex double zpow_ui(_Complex double x, integer n) {
338         _Complex double pow=1.0; unsigned long int u;
339         if(n != 0) {
340                 if(n < 0) n = -n, x = 1/x;
341                 for(u = n; ; ) {
342                         if(u & 01) pow *= x;
343                         if(u >>= 1) x *= x;
344                         else break;
345                 }
346         }
347         return pow;
348 }
349 #endif
350 static integer pow_ii(integer x, integer n) {
351         integer pow; unsigned long int u;
352         if (n <= 0) {
353                 if (n == 0 || x == 1) pow = 1;
354                 else if (x != -1) pow = x == 0 ? 1/x : 0;
355                 else n = -n;
356         }
357         if ((n > 0) || !(n == 0 || x == 1 || x != -1)) {
358                 u = n;
359                 for(pow = 1; ; ) {
360                         if(u & 01) pow *= x;
361                         if(u >>= 1) x *= x;
362                         else break;
363                 }
364         }
365         return pow;
366 }
367 static integer dmaxloc_(double *w, integer s, integer e, integer *n)
368 {
369         double m; integer i, mi;
370         for(m=w[s-1], mi=s, i=s+1; i<=e; i++)
371                 if (w[i-1]>m) mi=i ,m=w[i-1];
372         return mi-s+1;
373 }
374 static integer smaxloc_(float *w, integer s, integer e, integer *n)
375 {
376         float m; integer i, mi;
377         for(m=w[s-1], mi=s, i=s+1; i<=e; i++)
378                 if (w[i-1]>m) mi=i ,m=w[i-1];
379         return mi-s+1;
380 }
381 static inline void cdotc_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) {
382         integer n = *n_, incx = *incx_, incy = *incy_, i;
383 #ifdef _MSC_VER
384         _Fcomplex zdotc = {0.0, 0.0};
385         if (incx == 1 && incy == 1) {
386                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
387                         zdotc._Val[0] += conjf(Cf(&x[i]))._Val[0] * Cf(&y[i])._Val[0];
388                         zdotc._Val[1] += conjf(Cf(&x[i]))._Val[1] * Cf(&y[i])._Val[1];
389                 }
390         } else {
391                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
392                         zdotc._Val[0] += conjf(Cf(&x[i*incx]))._Val[0] * Cf(&y[i*incy])._Val[0];
393                         zdotc._Val[1] += conjf(Cf(&x[i*incx]))._Val[1] * Cf(&y[i*incy])._Val[1];
394                 }
395         }
396         pCf(z) = zdotc;
397 }
398 #else
399         _Complex float zdotc = 0.0;
400         if (incx == 1 && incy == 1) {
401                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
402                         zdotc += conjf(Cf(&x[i])) * Cf(&y[i]);
403                 }
404         } else {
405                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
406                         zdotc += conjf(Cf(&x[i*incx])) * Cf(&y[i*incy]);
407                 }
408         }
409         pCf(z) = zdotc;
410 }
411 #endif
412 static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) {
413         integer n = *n_, incx = *incx_, incy = *incy_, i;
414 #ifdef _MSC_VER
415         _Dcomplex zdotc = {0.0, 0.0};
416         if (incx == 1 && incy == 1) {
417                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
418                         zdotc._Val[0] += conj(Cd(&x[i]))._Val[0] * Cd(&y[i])._Val[0];
419                         zdotc._Val[1] += conj(Cd(&x[i]))._Val[1] * Cd(&y[i])._Val[1];
420                 }
421         } else {
422                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
423                         zdotc._Val[0] += conj(Cd(&x[i*incx]))._Val[0] * Cd(&y[i*incy])._Val[0];
424                         zdotc._Val[1] += conj(Cd(&x[i*incx]))._Val[1] * Cd(&y[i*incy])._Val[1];
425                 }
426         }
427         pCd(z) = zdotc;
428 }
429 #else
430         _Complex double zdotc = 0.0;
431         if (incx == 1 && incy == 1) {
432                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
433                         zdotc += conj(Cd(&x[i])) * Cd(&y[i]);
434                 }
435         } else {
436                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
437                         zdotc += conj(Cd(&x[i*incx])) * Cd(&y[i*incy]);
438                 }
439         }
440         pCd(z) = zdotc;
441 }
442 #endif  
443 static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) {
444         integer n = *n_, incx = *incx_, incy = *incy_, i;
445 #ifdef _MSC_VER
446         _Fcomplex zdotc = {0.0, 0.0};
447         if (incx == 1 && incy == 1) {
448                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
449                         zdotc._Val[0] += Cf(&x[i])._Val[0] * Cf(&y[i])._Val[0];
450                         zdotc._Val[1] += Cf(&x[i])._Val[1] * Cf(&y[i])._Val[1];
451                 }
452         } else {
453                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
454                         zdotc._Val[0] += Cf(&x[i*incx])._Val[0] * Cf(&y[i*incy])._Val[0];
455                         zdotc._Val[1] += Cf(&x[i*incx])._Val[1] * Cf(&y[i*incy])._Val[1];
456                 }
457         }
458         pCf(z) = zdotc;
459 }
460 #else
461         _Complex float zdotc = 0.0;
462         if (incx == 1 && incy == 1) {
463                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
464                         zdotc += Cf(&x[i]) * Cf(&y[i]);
465                 }
466         } else {
467                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
468                         zdotc += Cf(&x[i*incx]) * Cf(&y[i*incy]);
469                 }
470         }
471         pCf(z) = zdotc;
472 }
473 #endif
474 static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) {
475         integer n = *n_, incx = *incx_, incy = *incy_, i;
476 #ifdef _MSC_VER
477         _Dcomplex zdotc = {0.0, 0.0};
478         if (incx == 1 && incy == 1) {
479                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
480                         zdotc._Val[0] += Cd(&x[i])._Val[0] * Cd(&y[i])._Val[0];
481                         zdotc._Val[1] += Cd(&x[i])._Val[1] * Cd(&y[i])._Val[1];
482                 }
483         } else {
484                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
485                         zdotc._Val[0] += Cd(&x[i*incx])._Val[0] * Cd(&y[i*incy])._Val[0];
486                         zdotc._Val[1] += Cd(&x[i*incx])._Val[1] * Cd(&y[i*incy])._Val[1];
487                 }
488         }
489         pCd(z) = zdotc;
490 }
491 #else
492         _Complex double zdotc = 0.0;
493         if (incx == 1 && incy == 1) {
494                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
495                         zdotc += Cd(&x[i]) * Cd(&y[i]);
496                 }
497         } else {
498                 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
499                         zdotc += Cd(&x[i*incx]) * Cd(&y[i*incy]);
500                 }
501         }
502         pCd(z) = zdotc;
503 }
504 #endif
505 /*  -- translated by f2c (version 20000121).
506    You must link the resulting object file with the libraries:
507         -lf2c -lm   (in that order)
508 */
509
510
511
512 /* Table of constant values */
513
514 static integer c__1 = 1;
515 static logical c_false = FALSE_;
516 static integer c__2 = 2;
517 static real c_b26 = 1.f;
518 static real c_b30 = 0.f;
519 static logical c_true = TRUE_;
520
521 /* > \brief \b STRSYL */
522
523 /*  =========== DOCUMENTATION =========== */
524
525 /* Online html documentation available at */
526 /*            http://www.netlib.org/lapack/explore-html/ */
527
528 /* > \htmlonly */
529 /* > Download STRSYL + dependencies */
530 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/strsyl.
531 f"> */
532 /* > [TGZ]</a> */
533 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/strsyl.
534 f"> */
535 /* > [ZIP]</a> */
536 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/strsyl.
537 f"> */
538 /* > [TXT]</a> */
539 /* > \endhtmlonly */
540
541 /*  Definition: */
542 /*  =========== */
543
544 /*       SUBROUTINE STRSYL( TRANA, TRANB, ISGN, M, N, A, LDA, B, LDB, C, */
545 /*                          LDC, SCALE, INFO ) */
546
547 /*       CHARACTER          TRANA, TRANB */
548 /*       INTEGER            INFO, ISGN, LDA, LDB, LDC, M, N */
549 /*       REAL               SCALE */
550 /*       REAL               A( LDA, * ), B( LDB, * ), C( LDC, * ) */
551
552
553 /* > \par Purpose: */
554 /*  ============= */
555 /* > */
556 /* > \verbatim */
557 /* > */
558 /* > STRSYL solves the real Sylvester matrix equation: */
559 /* > */
560 /* >    op(A)*X + X*op(B) = scale*C or */
561 /* >    op(A)*X - X*op(B) = scale*C, */
562 /* > */
563 /* > where op(A) = A or A**T, and  A and B are both upper quasi- */
564 /* > triangular. A is M-by-M and B is N-by-N; the right hand side C and */
565 /* > the solution X are M-by-N; and scale is an output scale factor, set */
566 /* > <= 1 to avoid overflow in X. */
567 /* > */
568 /* > A and B must be in Schur canonical form (as returned by SHSEQR), that */
569 /* > is, block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; */
570 /* > each 2-by-2 diagonal block has its diagonal elements equal and its */
571 /* > off-diagonal elements of opposite sign. */
572 /* > \endverbatim */
573
574 /*  Arguments: */
575 /*  ========== */
576
577 /* > \param[in] TRANA */
578 /* > \verbatim */
579 /* >          TRANA is CHARACTER*1 */
580 /* >          Specifies the option op(A): */
581 /* >          = 'N': op(A) = A    (No transpose) */
582 /* >          = 'T': op(A) = A**T (Transpose) */
583 /* >          = 'C': op(A) = A**H (Conjugate transpose = Transpose) */
584 /* > \endverbatim */
585 /* > */
586 /* > \param[in] TRANB */
587 /* > \verbatim */
588 /* >          TRANB is CHARACTER*1 */
589 /* >          Specifies the option op(B): */
590 /* >          = 'N': op(B) = B    (No transpose) */
591 /* >          = 'T': op(B) = B**T (Transpose) */
592 /* >          = 'C': op(B) = B**H (Conjugate transpose = Transpose) */
593 /* > \endverbatim */
594 /* > */
595 /* > \param[in] ISGN */
596 /* > \verbatim */
597 /* >          ISGN is INTEGER */
598 /* >          Specifies the sign in the equation: */
599 /* >          = +1: solve op(A)*X + X*op(B) = scale*C */
600 /* >          = -1: solve op(A)*X - X*op(B) = scale*C */
601 /* > \endverbatim */
602 /* > */
603 /* > \param[in] M */
604 /* > \verbatim */
605 /* >          M is INTEGER */
606 /* >          The order of the matrix A, and the number of rows in the */
607 /* >          matrices X and C. M >= 0. */
608 /* > \endverbatim */
609 /* > */
610 /* > \param[in] N */
611 /* > \verbatim */
612 /* >          N is INTEGER */
613 /* >          The order of the matrix B, and the number of columns in the */
614 /* >          matrices X and C. N >= 0. */
615 /* > \endverbatim */
616 /* > */
617 /* > \param[in] A */
618 /* > \verbatim */
619 /* >          A is REAL array, dimension (LDA,M) */
620 /* >          The upper quasi-triangular matrix A, in Schur canonical form. */
621 /* > \endverbatim */
622 /* > */
623 /* > \param[in] LDA */
624 /* > \verbatim */
625 /* >          LDA is INTEGER */
626 /* >          The leading dimension of the array A. LDA >= f2cmax(1,M). */
627 /* > \endverbatim */
628 /* > */
629 /* > \param[in] B */
630 /* > \verbatim */
631 /* >          B is REAL array, dimension (LDB,N) */
632 /* >          The upper quasi-triangular matrix B, in Schur canonical form. */
633 /* > \endverbatim */
634 /* > */
635 /* > \param[in] LDB */
636 /* > \verbatim */
637 /* >          LDB is INTEGER */
638 /* >          The leading dimension of the array B. LDB >= f2cmax(1,N). */
639 /* > \endverbatim */
640 /* > */
641 /* > \param[in,out] C */
642 /* > \verbatim */
643 /* >          C is REAL array, dimension (LDC,N) */
644 /* >          On entry, the M-by-N right hand side matrix C. */
645 /* >          On exit, C is overwritten by the solution matrix X. */
646 /* > \endverbatim */
647 /* > */
648 /* > \param[in] LDC */
649 /* > \verbatim */
650 /* >          LDC is INTEGER */
651 /* >          The leading dimension of the array C. LDC >= f2cmax(1,M) */
652 /* > \endverbatim */
653 /* > */
654 /* > \param[out] SCALE */
655 /* > \verbatim */
656 /* >          SCALE is REAL */
657 /* >          The scale factor, scale, set <= 1 to avoid overflow in X. */
658 /* > \endverbatim */
659 /* > */
660 /* > \param[out] INFO */
661 /* > \verbatim */
662 /* >          INFO is INTEGER */
663 /* >          = 0: successful exit */
664 /* >          < 0: if INFO = -i, the i-th argument had an illegal value */
665 /* >          = 1: A and B have common or very close eigenvalues; perturbed */
666 /* >               values were used to solve the equation (but the matrices */
667 /* >               A and B are unchanged). */
668 /* > \endverbatim */
669
670 /*  Authors: */
671 /*  ======== */
672
673 /* > \author Univ. of Tennessee */
674 /* > \author Univ. of California Berkeley */
675 /* > \author Univ. of Colorado Denver */
676 /* > \author NAG Ltd. */
677
678 /* > \date December 2016 */
679
680 /* > \ingroup realSYcomputational */
681
682 /*  ===================================================================== */
683 /* Subroutine */ int strsyl_(char *trana, char *tranb, integer *isgn, integer 
684         *m, integer *n, real *a, integer *lda, real *b, integer *ldb, real *
685         c__, integer *ldc, real *scale, integer *info)
686 {
687     /* System generated locals */
688     integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, 
689             i__3, i__4;
690     real r__1, r__2;
691
692     /* Local variables */
693     integer ierr;
694     real smin;
695     extern real sdot_(integer *, real *, integer *, real *, integer *);
696     real suml, sumr;
697     integer j, k, l;
698     real x[4]   /* was [2][2] */;
699     extern logical lsame_(char *, char *);
700     extern /* Subroutine */ int sscal_(integer *, real *, real *, integer *);
701     integer knext, lnext, k1, k2, l1, l2;
702     real xnorm;
703     extern /* Subroutine */ int slaln2_(logical *, integer *, integer *, real 
704             *, real *, real *, integer *, real *, real *, real *, integer *, 
705             real *, real *, real *, integer *, real *, real *, integer *);
706     real a11, db;
707     extern /* Subroutine */ int slasy2_(logical *, logical *, integer *, 
708             integer *, integer *, real *, integer *, real *, integer *, real *
709             , integer *, real *, real *, integer *, real *, integer *), 
710             slabad_(real *, real *);
711     real scaloc;
712     extern real slamch_(char *), slange_(char *, integer *, integer *,
713              real *, integer *, real *);
714     extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen);
715     real bignum;
716     logical notrna, notrnb;
717     real smlnum, da11, vec[4]   /* was [2][2] */, dum[1], eps, sgn;
718
719
720 /*  -- LAPACK computational routine (version 3.7.0) -- */
721 /*  -- LAPACK is a software package provided by Univ. of Tennessee,    -- */
722 /*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */
723 /*     December 2016 */
724
725
726 /*  ===================================================================== */
727
728
729 /*     Decode and Test input parameters */
730
731     /* Parameter adjustments */
732     a_dim1 = *lda;
733     a_offset = 1 + a_dim1 * 1;
734     a -= a_offset;
735     b_dim1 = *ldb;
736     b_offset = 1 + b_dim1 * 1;
737     b -= b_offset;
738     c_dim1 = *ldc;
739     c_offset = 1 + c_dim1 * 1;
740     c__ -= c_offset;
741
742     /* Function Body */
743     notrna = lsame_(trana, "N");
744     notrnb = lsame_(tranb, "N");
745
746     *info = 0;
747     if (! notrna && ! lsame_(trana, "T") && ! lsame_(
748             trana, "C")) {
749         *info = -1;
750     } else if (! notrnb && ! lsame_(tranb, "T") && ! 
751             lsame_(tranb, "C")) {
752         *info = -2;
753     } else if (*isgn != 1 && *isgn != -1) {
754         *info = -3;
755     } else if (*m < 0) {
756         *info = -4;
757     } else if (*n < 0) {
758         *info = -5;
759     } else if (*lda < f2cmax(1,*m)) {
760         *info = -7;
761     } else if (*ldb < f2cmax(1,*n)) {
762         *info = -9;
763     } else if (*ldc < f2cmax(1,*m)) {
764         *info = -11;
765     }
766     if (*info != 0) {
767         i__1 = -(*info);
768         xerbla_("STRSYL", &i__1, (ftnlen)6);
769         return 0;
770     }
771
772 /*     Quick return if possible */
773
774     *scale = 1.f;
775     if (*m == 0 || *n == 0) {
776         return 0;
777     }
778
779 /*     Set constants to control overflow */
780
781     eps = slamch_("P");
782     smlnum = slamch_("S");
783     bignum = 1.f / smlnum;
784     slabad_(&smlnum, &bignum);
785     smlnum = smlnum * (real) (*m * *n) / eps;
786     bignum = 1.f / smlnum;
787
788 /* Computing MAX */
789     r__1 = smlnum, r__2 = eps * slange_("M", m, m, &a[a_offset], lda, dum), r__1 = f2cmax(r__1,r__2), r__2 = eps * slange_("M", n, n, 
790             &b[b_offset], ldb, dum);
791     smin = f2cmax(r__1,r__2);
792
793     sgn = (real) (*isgn);
794
795     if (notrna && notrnb) {
796
797 /*        Solve    A*X + ISGN*X*B = scale*C. */
798
799 /*        The (K,L)th block of X is determined starting from */
800 /*        bottom-left corner column by column by */
801
802 /*         A(K,K)*X(K,L) + ISGN*X(K,L)*B(L,L) = C(K,L) - R(K,L) */
803
804 /*        Where */
805 /*                  M                         L-1 */
806 /*        R(K,L) = SUM [A(K,I)*X(I,L)] + ISGN*SUM [X(K,J)*B(J,L)]. */
807 /*                I=K+1                       J=1 */
808
809 /*        Start column loop (index = L) */
810 /*        L1 (L2) : column index of the first (first) row of X(K,L). */
811
812         lnext = 1;
813         i__1 = *n;
814         for (l = 1; l <= i__1; ++l) {
815             if (l < lnext) {
816                 goto L70;
817             }
818             if (l == *n) {
819                 l1 = l;
820                 l2 = l;
821             } else {
822                 if (b[l + 1 + l * b_dim1] != 0.f) {
823                     l1 = l;
824                     l2 = l + 1;
825                     lnext = l + 2;
826                 } else {
827                     l1 = l;
828                     l2 = l;
829                     lnext = l + 1;
830                 }
831             }
832
833 /*           Start row loop (index = K) */
834 /*           K1 (K2): row index of the first (last) row of X(K,L). */
835
836             knext = *m;
837             for (k = *m; k >= 1; --k) {
838                 if (k > knext) {
839                     goto L60;
840                 }
841                 if (k == 1) {
842                     k1 = k;
843                     k2 = k;
844                 } else {
845                     if (a[k + (k - 1) * a_dim1] != 0.f) {
846                         k1 = k - 1;
847                         k2 = k;
848                         knext = k - 2;
849                     } else {
850                         k1 = k;
851                         k2 = k;
852                         knext = k - 1;
853                     }
854                 }
855
856                 if (l1 == l2 && k1 == k2) {
857                     i__2 = *m - k1;
858 /* Computing MIN */
859                     i__3 = k1 + 1;
860 /* Computing MIN */
861                     i__4 = k1 + 1;
862                     suml = sdot_(&i__2, &a[k1 + f2cmin(i__3,*m) * a_dim1], lda, &
863                             c__[f2cmin(i__4,*m) + l1 * c_dim1], &c__1);
864                     i__2 = l1 - 1;
865                     sumr = sdot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l1 * 
866                             b_dim1 + 1], &c__1);
867                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
868                     scaloc = 1.f;
869
870                     a11 = a[k1 + k1 * a_dim1] + sgn * b[l1 + l1 * b_dim1];
871                     da11 = abs(a11);
872                     if (da11 <= smin) {
873                         a11 = smin;
874                         da11 = smin;
875                         *info = 1;
876                     }
877                     db = abs(vec[0]);
878                     if (da11 < 1.f && db > 1.f) {
879                         if (db > bignum * da11) {
880                             scaloc = 1.f / db;
881                         }
882                     }
883                     x[0] = vec[0] * scaloc / a11;
884
885                     if (scaloc != 1.f) {
886                         i__2 = *n;
887                         for (j = 1; j <= i__2; ++j) {
888                             sscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
889 /* L10: */
890                         }
891                         *scale *= scaloc;
892                     }
893                     c__[k1 + l1 * c_dim1] = x[0];
894
895                 } else if (l1 == l2 && k1 != k2) {
896
897                     i__2 = *m - k2;
898 /* Computing MIN */
899                     i__3 = k2 + 1;
900 /* Computing MIN */
901                     i__4 = k2 + 1;
902                     suml = sdot_(&i__2, &a[k1 + f2cmin(i__3,*m) * a_dim1], lda, &
903                             c__[f2cmin(i__4,*m) + l1 * c_dim1], &c__1);
904                     i__2 = l1 - 1;
905                     sumr = sdot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l1 * 
906                             b_dim1 + 1], &c__1);
907                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
908
909                     i__2 = *m - k2;
910 /* Computing MIN */
911                     i__3 = k2 + 1;
912 /* Computing MIN */
913                     i__4 = k2 + 1;
914                     suml = sdot_(&i__2, &a[k2 + f2cmin(i__3,*m) * a_dim1], lda, &
915                             c__[f2cmin(i__4,*m) + l1 * c_dim1], &c__1);
916                     i__2 = l1 - 1;
917                     sumr = sdot_(&i__2, &c__[k2 + c_dim1], ldc, &b[l1 * 
918                             b_dim1 + 1], &c__1);
919                     vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr);
920
921                     r__1 = -sgn * b[l1 + l1 * b_dim1];
922                     slaln2_(&c_false, &c__2, &c__1, &smin, &c_b26, &a[k1 + k1 
923                             * a_dim1], lda, &c_b26, &c_b26, vec, &c__2, &r__1,
924                              &c_b30, x, &c__2, &scaloc, &xnorm, &ierr);
925                     if (ierr != 0) {
926                         *info = 1;
927                     }
928
929                     if (scaloc != 1.f) {
930                         i__2 = *n;
931                         for (j = 1; j <= i__2; ++j) {
932                             sscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
933 /* L20: */
934                         }
935                         *scale *= scaloc;
936                     }
937                     c__[k1 + l1 * c_dim1] = x[0];
938                     c__[k2 + l1 * c_dim1] = x[1];
939
940                 } else if (l1 != l2 && k1 == k2) {
941
942                     i__2 = *m - k1;
943 /* Computing MIN */
944                     i__3 = k1 + 1;
945 /* Computing MIN */
946                     i__4 = k1 + 1;
947                     suml = sdot_(&i__2, &a[k1 + f2cmin(i__3,*m) * a_dim1], lda, &
948                             c__[f2cmin(i__4,*m) + l1 * c_dim1], &c__1);
949                     i__2 = l1 - 1;
950                     sumr = sdot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l1 * 
951                             b_dim1 + 1], &c__1);
952                     vec[0] = sgn * (c__[k1 + l1 * c_dim1] - (suml + sgn * 
953                             sumr));
954
955                     i__2 = *m - k1;
956 /* Computing MIN */
957                     i__3 = k1 + 1;
958 /* Computing MIN */
959                     i__4 = k1 + 1;
960                     suml = sdot_(&i__2, &a[k1 + f2cmin(i__3,*m) * a_dim1], lda, &
961                             c__[f2cmin(i__4,*m) + l2 * c_dim1], &c__1);
962                     i__2 = l1 - 1;
963                     sumr = sdot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l2 * 
964                             b_dim1 + 1], &c__1);
965                     vec[1] = sgn * (c__[k1 + l2 * c_dim1] - (suml + sgn * 
966                             sumr));
967
968                     r__1 = -sgn * a[k1 + k1 * a_dim1];
969                     slaln2_(&c_true, &c__2, &c__1, &smin, &c_b26, &b[l1 + l1 *
970                              b_dim1], ldb, &c_b26, &c_b26, vec, &c__2, &r__1, 
971                             &c_b30, x, &c__2, &scaloc, &xnorm, &ierr);
972                     if (ierr != 0) {
973                         *info = 1;
974                     }
975
976                     if (scaloc != 1.f) {
977                         i__2 = *n;
978                         for (j = 1; j <= i__2; ++j) {
979                             sscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
980 /* L40: */
981                         }
982                         *scale *= scaloc;
983                     }
984                     c__[k1 + l1 * c_dim1] = x[0];
985                     c__[k1 + l2 * c_dim1] = x[1];
986
987                 } else if (l1 != l2 && k1 != k2) {
988
989                     i__2 = *m - k2;
990 /* Computing MIN */
991                     i__3 = k2 + 1;
992 /* Computing MIN */
993                     i__4 = k2 + 1;
994                     suml = sdot_(&i__2, &a[k1 + f2cmin(i__3,*m) * a_dim1], lda, &
995                             c__[f2cmin(i__4,*m) + l1 * c_dim1], &c__1);
996                     i__2 = l1 - 1;
997                     sumr = sdot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l1 * 
998                             b_dim1 + 1], &c__1);
999                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1000
1001                     i__2 = *m - k2;
1002 /* Computing MIN */
1003                     i__3 = k2 + 1;
1004 /* Computing MIN */
1005                     i__4 = k2 + 1;
1006                     suml = sdot_(&i__2, &a[k1 + f2cmin(i__3,*m) * a_dim1], lda, &
1007                             c__[f2cmin(i__4,*m) + l2 * c_dim1], &c__1);
1008                     i__2 = l1 - 1;
1009                     sumr = sdot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l2 * 
1010                             b_dim1 + 1], &c__1);
1011                     vec[2] = c__[k1 + l2 * c_dim1] - (suml + sgn * sumr);
1012
1013                     i__2 = *m - k2;
1014 /* Computing MIN */
1015                     i__3 = k2 + 1;
1016 /* Computing MIN */
1017                     i__4 = k2 + 1;
1018                     suml = sdot_(&i__2, &a[k2 + f2cmin(i__3,*m) * a_dim1], lda, &
1019                             c__[f2cmin(i__4,*m) + l1 * c_dim1], &c__1);
1020                     i__2 = l1 - 1;
1021                     sumr = sdot_(&i__2, &c__[k2 + c_dim1], ldc, &b[l1 * 
1022                             b_dim1 + 1], &c__1);
1023                     vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr);
1024
1025                     i__2 = *m - k2;
1026 /* Computing MIN */
1027                     i__3 = k2 + 1;
1028 /* Computing MIN */
1029                     i__4 = k2 + 1;
1030                     suml = sdot_(&i__2, &a[k2 + f2cmin(i__3,*m) * a_dim1], lda, &
1031                             c__[f2cmin(i__4,*m) + l2 * c_dim1], &c__1);
1032                     i__2 = l1 - 1;
1033                     sumr = sdot_(&i__2, &c__[k2 + c_dim1], ldc, &b[l2 * 
1034                             b_dim1 + 1], &c__1);
1035                     vec[3] = c__[k2 + l2 * c_dim1] - (suml + sgn * sumr);
1036
1037                     slasy2_(&c_false, &c_false, isgn, &c__2, &c__2, &a[k1 + 
1038                             k1 * a_dim1], lda, &b[l1 + l1 * b_dim1], ldb, vec,
1039                              &c__2, &scaloc, x, &c__2, &xnorm, &ierr);
1040                     if (ierr != 0) {
1041                         *info = 1;
1042                     }
1043
1044                     if (scaloc != 1.f) {
1045                         i__2 = *n;
1046                         for (j = 1; j <= i__2; ++j) {
1047                             sscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1048 /* L50: */
1049                         }
1050                         *scale *= scaloc;
1051                     }
1052                     c__[k1 + l1 * c_dim1] = x[0];
1053                     c__[k1 + l2 * c_dim1] = x[2];
1054                     c__[k2 + l1 * c_dim1] = x[1];
1055                     c__[k2 + l2 * c_dim1] = x[3];
1056                 }
1057
1058 L60:
1059                 ;
1060             }
1061
1062 L70:
1063             ;
1064         }
1065
1066     } else if (! notrna && notrnb) {
1067
1068 /*        Solve    A**T *X + ISGN*X*B = scale*C. */
1069
1070 /*        The (K,L)th block of X is determined starting from */
1071 /*        upper-left corner column by column by */
1072
1073 /*          A(K,K)**T*X(K,L) + ISGN*X(K,L)*B(L,L) = C(K,L) - R(K,L) */
1074
1075 /*        Where */
1076 /*                   K-1                          L-1 */
1077 /*          R(K,L) = SUM [A(I,K)**T*X(I,L)] +ISGN*SUM [X(K,J)*B(J,L)] */
1078 /*                   I=1                          J=1 */
1079
1080 /*        Start column loop (index = L) */
1081 /*        L1 (L2): column index of the first (last) row of X(K,L) */
1082
1083         lnext = 1;
1084         i__1 = *n;
1085         for (l = 1; l <= i__1; ++l) {
1086             if (l < lnext) {
1087                 goto L130;
1088             }
1089             if (l == *n) {
1090                 l1 = l;
1091                 l2 = l;
1092             } else {
1093                 if (b[l + 1 + l * b_dim1] != 0.f) {
1094                     l1 = l;
1095                     l2 = l + 1;
1096                     lnext = l + 2;
1097                 } else {
1098                     l1 = l;
1099                     l2 = l;
1100                     lnext = l + 1;
1101                 }
1102             }
1103
1104 /*           Start row loop (index = K) */
1105 /*           K1 (K2): row index of the first (last) row of X(K,L) */
1106
1107             knext = 1;
1108             i__2 = *m;
1109             for (k = 1; k <= i__2; ++k) {
1110                 if (k < knext) {
1111                     goto L120;
1112                 }
1113                 if (k == *m) {
1114                     k1 = k;
1115                     k2 = k;
1116                 } else {
1117                     if (a[k + 1 + k * a_dim1] != 0.f) {
1118                         k1 = k;
1119                         k2 = k + 1;
1120                         knext = k + 2;
1121                     } else {
1122                         k1 = k;
1123                         k2 = k;
1124                         knext = k + 1;
1125                     }
1126                 }
1127
1128                 if (l1 == l2 && k1 == k2) {
1129                     i__3 = k1 - 1;
1130                     suml = sdot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * 
1131                             c_dim1 + 1], &c__1);
1132                     i__3 = l1 - 1;
1133                     sumr = sdot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l1 * 
1134                             b_dim1 + 1], &c__1);
1135                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1136                     scaloc = 1.f;
1137
1138                     a11 = a[k1 + k1 * a_dim1] + sgn * b[l1 + l1 * b_dim1];
1139                     da11 = abs(a11);
1140                     if (da11 <= smin) {
1141                         a11 = smin;
1142                         da11 = smin;
1143                         *info = 1;
1144                     }
1145                     db = abs(vec[0]);
1146                     if (da11 < 1.f && db > 1.f) {
1147                         if (db > bignum * da11) {
1148                             scaloc = 1.f / db;
1149                         }
1150                     }
1151                     x[0] = vec[0] * scaloc / a11;
1152
1153                     if (scaloc != 1.f) {
1154                         i__3 = *n;
1155                         for (j = 1; j <= i__3; ++j) {
1156                             sscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1157 /* L80: */
1158                         }
1159                         *scale *= scaloc;
1160                     }
1161                     c__[k1 + l1 * c_dim1] = x[0];
1162
1163                 } else if (l1 == l2 && k1 != k2) {
1164
1165                     i__3 = k1 - 1;
1166                     suml = sdot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * 
1167                             c_dim1 + 1], &c__1);
1168                     i__3 = l1 - 1;
1169                     sumr = sdot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l1 * 
1170                             b_dim1 + 1], &c__1);
1171                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1172
1173                     i__3 = k1 - 1;
1174                     suml = sdot_(&i__3, &a[k2 * a_dim1 + 1], &c__1, &c__[l1 * 
1175                             c_dim1 + 1], &c__1);
1176                     i__3 = l1 - 1;
1177                     sumr = sdot_(&i__3, &c__[k2 + c_dim1], ldc, &b[l1 * 
1178                             b_dim1 + 1], &c__1);
1179                     vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr);
1180
1181                     r__1 = -sgn * b[l1 + l1 * b_dim1];
1182                     slaln2_(&c_true, &c__2, &c__1, &smin, &c_b26, &a[k1 + k1 *
1183                              a_dim1], lda, &c_b26, &c_b26, vec, &c__2, &r__1, 
1184                             &c_b30, x, &c__2, &scaloc, &xnorm, &ierr);
1185                     if (ierr != 0) {
1186                         *info = 1;
1187                     }
1188
1189                     if (scaloc != 1.f) {
1190                         i__3 = *n;
1191                         for (j = 1; j <= i__3; ++j) {
1192                             sscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1193 /* L90: */
1194                         }
1195                         *scale *= scaloc;
1196                     }
1197                     c__[k1 + l1 * c_dim1] = x[0];
1198                     c__[k2 + l1 * c_dim1] = x[1];
1199
1200                 } else if (l1 != l2 && k1 == k2) {
1201
1202                     i__3 = k1 - 1;
1203                     suml = sdot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * 
1204                             c_dim1 + 1], &c__1);
1205                     i__3 = l1 - 1;
1206                     sumr = sdot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l1 * 
1207                             b_dim1 + 1], &c__1);
1208                     vec[0] = sgn * (c__[k1 + l1 * c_dim1] - (suml + sgn * 
1209                             sumr));
1210
1211                     i__3 = k1 - 1;
1212                     suml = sdot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l2 * 
1213                             c_dim1 + 1], &c__1);
1214                     i__3 = l1 - 1;
1215                     sumr = sdot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l2 * 
1216                             b_dim1 + 1], &c__1);
1217                     vec[1] = sgn * (c__[k1 + l2 * c_dim1] - (suml + sgn * 
1218                             sumr));
1219
1220                     r__1 = -sgn * a[k1 + k1 * a_dim1];
1221                     slaln2_(&c_true, &c__2, &c__1, &smin, &c_b26, &b[l1 + l1 *
1222                              b_dim1], ldb, &c_b26, &c_b26, vec, &c__2, &r__1, 
1223                             &c_b30, x, &c__2, &scaloc, &xnorm, &ierr);
1224                     if (ierr != 0) {
1225                         *info = 1;
1226                     }
1227
1228                     if (scaloc != 1.f) {
1229                         i__3 = *n;
1230                         for (j = 1; j <= i__3; ++j) {
1231                             sscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1232 /* L100: */
1233                         }
1234                         *scale *= scaloc;
1235                     }
1236                     c__[k1 + l1 * c_dim1] = x[0];
1237                     c__[k1 + l2 * c_dim1] = x[1];
1238
1239                 } else if (l1 != l2 && k1 != k2) {
1240
1241                     i__3 = k1 - 1;
1242                     suml = sdot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * 
1243                             c_dim1 + 1], &c__1);
1244                     i__3 = l1 - 1;
1245                     sumr = sdot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l1 * 
1246                             b_dim1 + 1], &c__1);
1247                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1248
1249                     i__3 = k1 - 1;
1250                     suml = sdot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l2 * 
1251                             c_dim1 + 1], &c__1);
1252                     i__3 = l1 - 1;
1253                     sumr = sdot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l2 * 
1254                             b_dim1 + 1], &c__1);
1255                     vec[2] = c__[k1 + l2 * c_dim1] - (suml + sgn * sumr);
1256
1257                     i__3 = k1 - 1;
1258                     suml = sdot_(&i__3, &a[k2 * a_dim1 + 1], &c__1, &c__[l1 * 
1259                             c_dim1 + 1], &c__1);
1260                     i__3 = l1 - 1;
1261                     sumr = sdot_(&i__3, &c__[k2 + c_dim1], ldc, &b[l1 * 
1262                             b_dim1 + 1], &c__1);
1263                     vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr);
1264
1265                     i__3 = k1 - 1;
1266                     suml = sdot_(&i__3, &a[k2 * a_dim1 + 1], &c__1, &c__[l2 * 
1267                             c_dim1 + 1], &c__1);
1268                     i__3 = l1 - 1;
1269                     sumr = sdot_(&i__3, &c__[k2 + c_dim1], ldc, &b[l2 * 
1270                             b_dim1 + 1], &c__1);
1271                     vec[3] = c__[k2 + l2 * c_dim1] - (suml + sgn * sumr);
1272
1273                     slasy2_(&c_true, &c_false, isgn, &c__2, &c__2, &a[k1 + k1 
1274                             * a_dim1], lda, &b[l1 + l1 * b_dim1], ldb, vec, &
1275                             c__2, &scaloc, x, &c__2, &xnorm, &ierr);
1276                     if (ierr != 0) {
1277                         *info = 1;
1278                     }
1279
1280                     if (scaloc != 1.f) {
1281                         i__3 = *n;
1282                         for (j = 1; j <= i__3; ++j) {
1283                             sscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1284 /* L110: */
1285                         }
1286                         *scale *= scaloc;
1287                     }
1288                     c__[k1 + l1 * c_dim1] = x[0];
1289                     c__[k1 + l2 * c_dim1] = x[2];
1290                     c__[k2 + l1 * c_dim1] = x[1];
1291                     c__[k2 + l2 * c_dim1] = x[3];
1292                 }
1293
1294 L120:
1295                 ;
1296             }
1297 L130:
1298             ;
1299         }
1300
1301     } else if (! notrna && ! notrnb) {
1302
1303 /*        Solve    A**T*X + ISGN*X*B**T = scale*C. */
1304
1305 /*        The (K,L)th block of X is determined starting from */
1306 /*        top-right corner column by column by */
1307
1308 /*           A(K,K)**T*X(K,L) + ISGN*X(K,L)*B(L,L)**T = C(K,L) - R(K,L) */
1309
1310 /*        Where */
1311 /*                     K-1                            N */
1312 /*            R(K,L) = SUM [A(I,K)**T*X(I,L)] + ISGN*SUM [X(K,J)*B(L,J)**T]. */
1313 /*                     I=1                          J=L+1 */
1314
1315 /*        Start column loop (index = L) */
1316 /*        L1 (L2): column index of the first (last) row of X(K,L) */
1317
1318         lnext = *n;
1319         for (l = *n; l >= 1; --l) {
1320             if (l > lnext) {
1321                 goto L190;
1322             }
1323             if (l == 1) {
1324                 l1 = l;
1325                 l2 = l;
1326             } else {
1327                 if (b[l + (l - 1) * b_dim1] != 0.f) {
1328                     l1 = l - 1;
1329                     l2 = l;
1330                     lnext = l - 2;
1331                 } else {
1332                     l1 = l;
1333                     l2 = l;
1334                     lnext = l - 1;
1335                 }
1336             }
1337
1338 /*           Start row loop (index = K) */
1339 /*           K1 (K2): row index of the first (last) row of X(K,L) */
1340
1341             knext = 1;
1342             i__1 = *m;
1343             for (k = 1; k <= i__1; ++k) {
1344                 if (k < knext) {
1345                     goto L180;
1346                 }
1347                 if (k == *m) {
1348                     k1 = k;
1349                     k2 = k;
1350                 } else {
1351                     if (a[k + 1 + k * a_dim1] != 0.f) {
1352                         k1 = k;
1353                         k2 = k + 1;
1354                         knext = k + 2;
1355                     } else {
1356                         k1 = k;
1357                         k2 = k;
1358                         knext = k + 1;
1359                     }
1360                 }
1361
1362                 if (l1 == l2 && k1 == k2) {
1363                     i__2 = k1 - 1;
1364                     suml = sdot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * 
1365                             c_dim1 + 1], &c__1);
1366                     i__2 = *n - l1;
1367 /* Computing MIN */
1368                     i__3 = l1 + 1;
1369 /* Computing MIN */
1370                     i__4 = l1 + 1;
1371                     sumr = sdot_(&i__2, &c__[k1 + f2cmin(i__3,*n) * c_dim1], ldc,
1372                              &b[l1 + f2cmin(i__4,*n) * b_dim1], ldb);
1373                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1374                     scaloc = 1.f;
1375
1376                     a11 = a[k1 + k1 * a_dim1] + sgn * b[l1 + l1 * b_dim1];
1377                     da11 = abs(a11);
1378                     if (da11 <= smin) {
1379                         a11 = smin;
1380                         da11 = smin;
1381                         *info = 1;
1382                     }
1383                     db = abs(vec[0]);
1384                     if (da11 < 1.f && db > 1.f) {
1385                         if (db > bignum * da11) {
1386                             scaloc = 1.f / db;
1387                         }
1388                     }
1389                     x[0] = vec[0] * scaloc / a11;
1390
1391                     if (scaloc != 1.f) {
1392                         i__2 = *n;
1393                         for (j = 1; j <= i__2; ++j) {
1394                             sscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1395 /* L140: */
1396                         }
1397                         *scale *= scaloc;
1398                     }
1399                     c__[k1 + l1 * c_dim1] = x[0];
1400
1401                 } else if (l1 == l2 && k1 != k2) {
1402
1403                     i__2 = k1 - 1;
1404                     suml = sdot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * 
1405                             c_dim1 + 1], &c__1);
1406                     i__2 = *n - l2;
1407 /* Computing MIN */
1408                     i__3 = l2 + 1;
1409 /* Computing MIN */
1410                     i__4 = l2 + 1;
1411                     sumr = sdot_(&i__2, &c__[k1 + f2cmin(i__3,*n) * c_dim1], ldc,
1412                              &b[l1 + f2cmin(i__4,*n) * b_dim1], ldb);
1413                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1414
1415                     i__2 = k1 - 1;
1416                     suml = sdot_(&i__2, &a[k2 * a_dim1 + 1], &c__1, &c__[l1 * 
1417                             c_dim1 + 1], &c__1);
1418                     i__2 = *n - l2;
1419 /* Computing MIN */
1420                     i__3 = l2 + 1;
1421 /* Computing MIN */
1422                     i__4 = l2 + 1;
1423                     sumr = sdot_(&i__2, &c__[k2 + f2cmin(i__3,*n) * c_dim1], ldc,
1424                              &b[l1 + f2cmin(i__4,*n) * b_dim1], ldb);
1425                     vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr);
1426
1427                     r__1 = -sgn * b[l1 + l1 * b_dim1];
1428                     slaln2_(&c_true, &c__2, &c__1, &smin, &c_b26, &a[k1 + k1 *
1429                              a_dim1], lda, &c_b26, &c_b26, vec, &c__2, &r__1, 
1430                             &c_b30, x, &c__2, &scaloc, &xnorm, &ierr);
1431                     if (ierr != 0) {
1432                         *info = 1;
1433                     }
1434
1435                     if (scaloc != 1.f) {
1436                         i__2 = *n;
1437                         for (j = 1; j <= i__2; ++j) {
1438                             sscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1439 /* L150: */
1440                         }
1441                         *scale *= scaloc;
1442                     }
1443                     c__[k1 + l1 * c_dim1] = x[0];
1444                     c__[k2 + l1 * c_dim1] = x[1];
1445
1446                 } else if (l1 != l2 && k1 == k2) {
1447
1448                     i__2 = k1 - 1;
1449                     suml = sdot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * 
1450                             c_dim1 + 1], &c__1);
1451                     i__2 = *n - l2;
1452 /* Computing MIN */
1453                     i__3 = l2 + 1;
1454 /* Computing MIN */
1455                     i__4 = l2 + 1;
1456                     sumr = sdot_(&i__2, &c__[k1 + f2cmin(i__3,*n) * c_dim1], ldc,
1457                              &b[l1 + f2cmin(i__4,*n) * b_dim1], ldb);
1458                     vec[0] = sgn * (c__[k1 + l1 * c_dim1] - (suml + sgn * 
1459                             sumr));
1460
1461                     i__2 = k1 - 1;
1462                     suml = sdot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l2 * 
1463                             c_dim1 + 1], &c__1);
1464                     i__2 = *n - l2;
1465 /* Computing MIN */
1466                     i__3 = l2 + 1;
1467 /* Computing MIN */
1468                     i__4 = l2 + 1;
1469                     sumr = sdot_(&i__2, &c__[k1 + f2cmin(i__3,*n) * c_dim1], ldc,
1470                              &b[l2 + f2cmin(i__4,*n) * b_dim1], ldb);
1471                     vec[1] = sgn * (c__[k1 + l2 * c_dim1] - (suml + sgn * 
1472                             sumr));
1473
1474                     r__1 = -sgn * a[k1 + k1 * a_dim1];
1475                     slaln2_(&c_false, &c__2, &c__1, &smin, &c_b26, &b[l1 + l1 
1476                             * b_dim1], ldb, &c_b26, &c_b26, vec, &c__2, &r__1,
1477                              &c_b30, x, &c__2, &scaloc, &xnorm, &ierr);
1478                     if (ierr != 0) {
1479                         *info = 1;
1480                     }
1481
1482                     if (scaloc != 1.f) {
1483                         i__2 = *n;
1484                         for (j = 1; j <= i__2; ++j) {
1485                             sscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1486 /* L160: */
1487                         }
1488                         *scale *= scaloc;
1489                     }
1490                     c__[k1 + l1 * c_dim1] = x[0];
1491                     c__[k1 + l2 * c_dim1] = x[1];
1492
1493                 } else if (l1 != l2 && k1 != k2) {
1494
1495                     i__2 = k1 - 1;
1496                     suml = sdot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * 
1497                             c_dim1 + 1], &c__1);
1498                     i__2 = *n - l2;
1499 /* Computing MIN */
1500                     i__3 = l2 + 1;
1501 /* Computing MIN */
1502                     i__4 = l2 + 1;
1503                     sumr = sdot_(&i__2, &c__[k1 + f2cmin(i__3,*n) * c_dim1], ldc,
1504                              &b[l1 + f2cmin(i__4,*n) * b_dim1], ldb);
1505                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1506
1507                     i__2 = k1 - 1;
1508                     suml = sdot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l2 * 
1509                             c_dim1 + 1], &c__1);
1510                     i__2 = *n - l2;
1511 /* Computing MIN */
1512                     i__3 = l2 + 1;
1513 /* Computing MIN */
1514                     i__4 = l2 + 1;
1515                     sumr = sdot_(&i__2, &c__[k1 + f2cmin(i__3,*n) * c_dim1], ldc,
1516                              &b[l2 + f2cmin(i__4,*n) * b_dim1], ldb);
1517                     vec[2] = c__[k1 + l2 * c_dim1] - (suml + sgn * sumr);
1518
1519                     i__2 = k1 - 1;
1520                     suml = sdot_(&i__2, &a[k2 * a_dim1 + 1], &c__1, &c__[l1 * 
1521                             c_dim1 + 1], &c__1);
1522                     i__2 = *n - l2;
1523 /* Computing MIN */
1524                     i__3 = l2 + 1;
1525 /* Computing MIN */
1526                     i__4 = l2 + 1;
1527                     sumr = sdot_(&i__2, &c__[k2 + f2cmin(i__3,*n) * c_dim1], ldc,
1528                              &b[l1 + f2cmin(i__4,*n) * b_dim1], ldb);
1529                     vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr);
1530
1531                     i__2 = k1 - 1;
1532                     suml = sdot_(&i__2, &a[k2 * a_dim1 + 1], &c__1, &c__[l2 * 
1533                             c_dim1 + 1], &c__1);
1534                     i__2 = *n - l2;
1535 /* Computing MIN */
1536                     i__3 = l2 + 1;
1537 /* Computing MIN */
1538                     i__4 = l2 + 1;
1539                     sumr = sdot_(&i__2, &c__[k2 + f2cmin(i__3,*n) * c_dim1], ldc,
1540                              &b[l2 + f2cmin(i__4,*n) * b_dim1], ldb);
1541                     vec[3] = c__[k2 + l2 * c_dim1] - (suml + sgn * sumr);
1542
1543                     slasy2_(&c_true, &c_true, isgn, &c__2, &c__2, &a[k1 + k1 *
1544                              a_dim1], lda, &b[l1 + l1 * b_dim1], ldb, vec, &
1545                             c__2, &scaloc, x, &c__2, &xnorm, &ierr);
1546                     if (ierr != 0) {
1547                         *info = 1;
1548                     }
1549
1550                     if (scaloc != 1.f) {
1551                         i__2 = *n;
1552                         for (j = 1; j <= i__2; ++j) {
1553                             sscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1554 /* L170: */
1555                         }
1556                         *scale *= scaloc;
1557                     }
1558                     c__[k1 + l1 * c_dim1] = x[0];
1559                     c__[k1 + l2 * c_dim1] = x[2];
1560                     c__[k2 + l1 * c_dim1] = x[1];
1561                     c__[k2 + l2 * c_dim1] = x[3];
1562                 }
1563
1564 L180:
1565                 ;
1566             }
1567 L190:
1568             ;
1569         }
1570
1571     } else if (notrna && ! notrnb) {
1572
1573 /*        Solve    A*X + ISGN*X*B**T = scale*C. */
1574
1575 /*        The (K,L)th block of X is determined starting from */
1576 /*        bottom-right corner column by column by */
1577
1578 /*            A(K,K)*X(K,L) + ISGN*X(K,L)*B(L,L)**T = C(K,L) - R(K,L) */
1579
1580 /*        Where */
1581 /*                      M                          N */
1582 /*            R(K,L) = SUM [A(K,I)*X(I,L)] + ISGN*SUM [X(K,J)*B(L,J)**T]. */
1583 /*                    I=K+1                      J=L+1 */
1584
1585 /*        Start column loop (index = L) */
1586 /*        L1 (L2): column index of the first (last) row of X(K,L) */
1587
1588         lnext = *n;
1589         for (l = *n; l >= 1; --l) {
1590             if (l > lnext) {
1591                 goto L250;
1592             }
1593             if (l == 1) {
1594                 l1 = l;
1595                 l2 = l;
1596             } else {
1597                 if (b[l + (l - 1) * b_dim1] != 0.f) {
1598                     l1 = l - 1;
1599                     l2 = l;
1600                     lnext = l - 2;
1601                 } else {
1602                     l1 = l;
1603                     l2 = l;
1604                     lnext = l - 1;
1605                 }
1606             }
1607
1608 /*           Start row loop (index = K) */
1609 /*           K1 (K2): row index of the first (last) row of X(K,L) */
1610
1611             knext = *m;
1612             for (k = *m; k >= 1; --k) {
1613                 if (k > knext) {
1614                     goto L240;
1615                 }
1616                 if (k == 1) {
1617                     k1 = k;
1618                     k2 = k;
1619                 } else {
1620                     if (a[k + (k - 1) * a_dim1] != 0.f) {
1621                         k1 = k - 1;
1622                         k2 = k;
1623                         knext = k - 2;
1624                     } else {
1625                         k1 = k;
1626                         k2 = k;
1627                         knext = k - 1;
1628                     }
1629                 }
1630
1631                 if (l1 == l2 && k1 == k2) {
1632                     i__1 = *m - k1;
1633 /* Computing MIN */
1634                     i__2 = k1 + 1;
1635 /* Computing MIN */
1636                     i__3 = k1 + 1;
1637                     suml = sdot_(&i__1, &a[k1 + f2cmin(i__2,*m) * a_dim1], lda, &
1638                             c__[f2cmin(i__3,*m) + l1 * c_dim1], &c__1);
1639                     i__1 = *n - l1;
1640 /* Computing MIN */
1641                     i__2 = l1 + 1;
1642 /* Computing MIN */
1643                     i__3 = l1 + 1;
1644                     sumr = sdot_(&i__1, &c__[k1 + f2cmin(i__2,*n) * c_dim1], ldc,
1645                              &b[l1 + f2cmin(i__3,*n) * b_dim1], ldb);
1646                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1647                     scaloc = 1.f;
1648
1649                     a11 = a[k1 + k1 * a_dim1] + sgn * b[l1 + l1 * b_dim1];
1650                     da11 = abs(a11);
1651                     if (da11 <= smin) {
1652                         a11 = smin;
1653                         da11 = smin;
1654                         *info = 1;
1655                     }
1656                     db = abs(vec[0]);
1657                     if (da11 < 1.f && db > 1.f) {
1658                         if (db > bignum * da11) {
1659                             scaloc = 1.f / db;
1660                         }
1661                     }
1662                     x[0] = vec[0] * scaloc / a11;
1663
1664                     if (scaloc != 1.f) {
1665                         i__1 = *n;
1666                         for (j = 1; j <= i__1; ++j) {
1667                             sscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1668 /* L200: */
1669                         }
1670                         *scale *= scaloc;
1671                     }
1672                     c__[k1 + l1 * c_dim1] = x[0];
1673
1674                 } else if (l1 == l2 && k1 != k2) {
1675
1676                     i__1 = *m - k2;
1677 /* Computing MIN */
1678                     i__2 = k2 + 1;
1679 /* Computing MIN */
1680                     i__3 = k2 + 1;
1681                     suml = sdot_(&i__1, &a[k1 + f2cmin(i__2,*m) * a_dim1], lda, &
1682                             c__[f2cmin(i__3,*m) + l1 * c_dim1], &c__1);
1683                     i__1 = *n - l2;
1684 /* Computing MIN */
1685                     i__2 = l2 + 1;
1686 /* Computing MIN */
1687                     i__3 = l2 + 1;
1688                     sumr = sdot_(&i__1, &c__[k1 + f2cmin(i__2,*n) * c_dim1], ldc,
1689                              &b[l1 + f2cmin(i__3,*n) * b_dim1], ldb);
1690                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1691
1692                     i__1 = *m - k2;
1693 /* Computing MIN */
1694                     i__2 = k2 + 1;
1695 /* Computing MIN */
1696                     i__3 = k2 + 1;
1697                     suml = sdot_(&i__1, &a[k2 + f2cmin(i__2,*m) * a_dim1], lda, &
1698                             c__[f2cmin(i__3,*m) + l1 * c_dim1], &c__1);
1699                     i__1 = *n - l2;
1700 /* Computing MIN */
1701                     i__2 = l2 + 1;
1702 /* Computing MIN */
1703                     i__3 = l2 + 1;
1704                     sumr = sdot_(&i__1, &c__[k2 + f2cmin(i__2,*n) * c_dim1], ldc,
1705                              &b[l1 + f2cmin(i__3,*n) * b_dim1], ldb);
1706                     vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr);
1707
1708                     r__1 = -sgn * b[l1 + l1 * b_dim1];
1709                     slaln2_(&c_false, &c__2, &c__1, &smin, &c_b26, &a[k1 + k1 
1710                             * a_dim1], lda, &c_b26, &c_b26, vec, &c__2, &r__1,
1711                              &c_b30, x, &c__2, &scaloc, &xnorm, &ierr);
1712                     if (ierr != 0) {
1713                         *info = 1;
1714                     }
1715
1716                     if (scaloc != 1.f) {
1717                         i__1 = *n;
1718                         for (j = 1; j <= i__1; ++j) {
1719                             sscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1720 /* L210: */
1721                         }
1722                         *scale *= scaloc;
1723                     }
1724                     c__[k1 + l1 * c_dim1] = x[0];
1725                     c__[k2 + l1 * c_dim1] = x[1];
1726
1727                 } else if (l1 != l2 && k1 == k2) {
1728
1729                     i__1 = *m - k1;
1730 /* Computing MIN */
1731                     i__2 = k1 + 1;
1732 /* Computing MIN */
1733                     i__3 = k1 + 1;
1734                     suml = sdot_(&i__1, &a[k1 + f2cmin(i__2,*m) * a_dim1], lda, &
1735                             c__[f2cmin(i__3,*m) + l1 * c_dim1], &c__1);
1736                     i__1 = *n - l2;
1737 /* Computing MIN */
1738                     i__2 = l2 + 1;
1739 /* Computing MIN */
1740                     i__3 = l2 + 1;
1741                     sumr = sdot_(&i__1, &c__[k1 + f2cmin(i__2,*n) * c_dim1], ldc,
1742                              &b[l1 + f2cmin(i__3,*n) * b_dim1], ldb);
1743                     vec[0] = sgn * (c__[k1 + l1 * c_dim1] - (suml + sgn * 
1744                             sumr));
1745
1746                     i__1 = *m - k1;
1747 /* Computing MIN */
1748                     i__2 = k1 + 1;
1749 /* Computing MIN */
1750                     i__3 = k1 + 1;
1751                     suml = sdot_(&i__1, &a[k1 + f2cmin(i__2,*m) * a_dim1], lda, &
1752                             c__[f2cmin(i__3,*m) + l2 * c_dim1], &c__1);
1753                     i__1 = *n - l2;
1754 /* Computing MIN */
1755                     i__2 = l2 + 1;
1756 /* Computing MIN */
1757                     i__3 = l2 + 1;
1758                     sumr = sdot_(&i__1, &c__[k1 + f2cmin(i__2,*n) * c_dim1], ldc,
1759                              &b[l2 + f2cmin(i__3,*n) * b_dim1], ldb);
1760                     vec[1] = sgn * (c__[k1 + l2 * c_dim1] - (suml + sgn * 
1761                             sumr));
1762
1763                     r__1 = -sgn * a[k1 + k1 * a_dim1];
1764                     slaln2_(&c_false, &c__2, &c__1, &smin, &c_b26, &b[l1 + l1 
1765                             * b_dim1], ldb, &c_b26, &c_b26, vec, &c__2, &r__1,
1766                              &c_b30, x, &c__2, &scaloc, &xnorm, &ierr);
1767                     if (ierr != 0) {
1768                         *info = 1;
1769                     }
1770
1771                     if (scaloc != 1.f) {
1772                         i__1 = *n;
1773                         for (j = 1; j <= i__1; ++j) {
1774                             sscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1775 /* L220: */
1776                         }
1777                         *scale *= scaloc;
1778                     }
1779                     c__[k1 + l1 * c_dim1] = x[0];
1780                     c__[k1 + l2 * c_dim1] = x[1];
1781
1782                 } else if (l1 != l2 && k1 != k2) {
1783
1784                     i__1 = *m - k2;
1785 /* Computing MIN */
1786                     i__2 = k2 + 1;
1787 /* Computing MIN */
1788                     i__3 = k2 + 1;
1789                     suml = sdot_(&i__1, &a[k1 + f2cmin(i__2,*m) * a_dim1], lda, &
1790                             c__[f2cmin(i__3,*m) + l1 * c_dim1], &c__1);
1791                     i__1 = *n - l2;
1792 /* Computing MIN */
1793                     i__2 = l2 + 1;
1794 /* Computing MIN */
1795                     i__3 = l2 + 1;
1796                     sumr = sdot_(&i__1, &c__[k1 + f2cmin(i__2,*n) * c_dim1], ldc,
1797                              &b[l1 + f2cmin(i__3,*n) * b_dim1], ldb);
1798                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1799
1800                     i__1 = *m - k2;
1801 /* Computing MIN */
1802                     i__2 = k2 + 1;
1803 /* Computing MIN */
1804                     i__3 = k2 + 1;
1805                     suml = sdot_(&i__1, &a[k1 + f2cmin(i__2,*m) * a_dim1], lda, &
1806                             c__[f2cmin(i__3,*m) + l2 * c_dim1], &c__1);
1807                     i__1 = *n - l2;
1808 /* Computing MIN */
1809                     i__2 = l2 + 1;
1810 /* Computing MIN */
1811                     i__3 = l2 + 1;
1812                     sumr = sdot_(&i__1, &c__[k1 + f2cmin(i__2,*n) * c_dim1], ldc,
1813                              &b[l2 + f2cmin(i__3,*n) * b_dim1], ldb);
1814                     vec[2] = c__[k1 + l2 * c_dim1] - (suml + sgn * sumr);
1815
1816                     i__1 = *m - k2;
1817 /* Computing MIN */
1818                     i__2 = k2 + 1;
1819 /* Computing MIN */
1820                     i__3 = k2 + 1;
1821                     suml = sdot_(&i__1, &a[k2 + f2cmin(i__2,*m) * a_dim1], lda, &
1822                             c__[f2cmin(i__3,*m) + l1 * c_dim1], &c__1);
1823                     i__1 = *n - l2;
1824 /* Computing MIN */
1825                     i__2 = l2 + 1;
1826 /* Computing MIN */
1827                     i__3 = l2 + 1;
1828                     sumr = sdot_(&i__1, &c__[k2 + f2cmin(i__2,*n) * c_dim1], ldc,
1829                              &b[l1 + f2cmin(i__3,*n) * b_dim1], ldb);
1830                     vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr);
1831
1832                     i__1 = *m - k2;
1833 /* Computing MIN */
1834                     i__2 = k2 + 1;
1835 /* Computing MIN */
1836                     i__3 = k2 + 1;
1837                     suml = sdot_(&i__1, &a[k2 + f2cmin(i__2,*m) * a_dim1], lda, &
1838                             c__[f2cmin(i__3,*m) + l2 * c_dim1], &c__1);
1839                     i__1 = *n - l2;
1840 /* Computing MIN */
1841                     i__2 = l2 + 1;
1842 /* Computing MIN */
1843                     i__3 = l2 + 1;
1844                     sumr = sdot_(&i__1, &c__[k2 + f2cmin(i__2,*n) * c_dim1], ldc,
1845                              &b[l2 + f2cmin(i__3,*n) * b_dim1], ldb);
1846                     vec[3] = c__[k2 + l2 * c_dim1] - (suml + sgn * sumr);
1847
1848                     slasy2_(&c_false, &c_true, isgn, &c__2, &c__2, &a[k1 + k1 
1849                             * a_dim1], lda, &b[l1 + l1 * b_dim1], ldb, vec, &
1850                             c__2, &scaloc, x, &c__2, &xnorm, &ierr);
1851                     if (ierr != 0) {
1852                         *info = 1;
1853                     }
1854
1855                     if (scaloc != 1.f) {
1856                         i__1 = *n;
1857                         for (j = 1; j <= i__1; ++j) {
1858                             sscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1859 /* L230: */
1860                         }
1861                         *scale *= scaloc;
1862                     }
1863                     c__[k1 + l1 * c_dim1] = x[0];
1864                     c__[k1 + l2 * c_dim1] = x[2];
1865                     c__[k2 + l1 * c_dim1] = x[1];
1866                     c__[k2 + l2 * c_dim1] = x[3];
1867                 }
1868
1869 L240:
1870                 ;
1871             }
1872 L250:
1873             ;
1874         }
1875
1876     }
1877
1878     return 0;
1879
1880 /*     End of STRSYL */
1881
1882 } /* strsyl_ */
1883