C_LAPACK: Fixes to make it compile with MSVC (#3605)
[platform/upstream/openblas.git] / lapack-netlib / SRC / dtrsyl.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
513 /* Table of constant values */
514
515 static integer c__1 = 1;
516 static logical c_false = FALSE_;
517 static integer c__2 = 2;
518 static doublereal c_b26 = 1.;
519 static doublereal c_b30 = 0.;
520 static logical c_true = TRUE_;
521
522 /* > \brief \b DTRSYL */
523
524 /*  =========== DOCUMENTATION =========== */
525
526 /* Online html documentation available at */
527 /*            http://www.netlib.org/lapack/explore-html/ */
528
529 /* > \htmlonly */
530 /* > Download DTRSYL + dependencies */
531 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dtrsyl.
532 f"> */
533 /* > [TGZ]</a> */
534 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dtrsyl.
535 f"> */
536 /* > [ZIP]</a> */
537 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dtrsyl.
538 f"> */
539 /* > [TXT]</a> */
540 /* > \endhtmlonly */
541
542 /*  Definition: */
543 /*  =========== */
544
545 /*       SUBROUTINE DTRSYL( TRANA, TRANB, ISGN, M, N, A, LDA, B, LDB, C, */
546 /*                          LDC, SCALE, INFO ) */
547
548 /*       CHARACTER          TRANA, TRANB */
549 /*       INTEGER            INFO, ISGN, LDA, LDB, LDC, M, N */
550 /*       DOUBLE PRECISION   SCALE */
551 /*       DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), C( LDC, * ) */
552
553
554 /* > \par Purpose: */
555 /*  ============= */
556 /* > */
557 /* > \verbatim */
558 /* > */
559 /* > DTRSYL solves the real Sylvester matrix equation: */
560 /* > */
561 /* >    op(A)*X + X*op(B) = scale*C or */
562 /* >    op(A)*X - X*op(B) = scale*C, */
563 /* > */
564 /* > where op(A) = A or A**T, and  A and B are both upper quasi- */
565 /* > triangular. A is M-by-M and B is N-by-N; the right hand side C and */
566 /* > the solution X are M-by-N; and scale is an output scale factor, set */
567 /* > <= 1 to avoid overflow in X. */
568 /* > */
569 /* > A and B must be in Schur canonical form (as returned by DHSEQR), that */
570 /* > is, block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; */
571 /* > each 2-by-2 diagonal block has its diagonal elements equal and its */
572 /* > off-diagonal elements of opposite sign. */
573 /* > \endverbatim */
574
575 /*  Arguments: */
576 /*  ========== */
577
578 /* > \param[in] TRANA */
579 /* > \verbatim */
580 /* >          TRANA is CHARACTER*1 */
581 /* >          Specifies the option op(A): */
582 /* >          = 'N': op(A) = A    (No transpose) */
583 /* >          = 'T': op(A) = A**T (Transpose) */
584 /* >          = 'C': op(A) = A**H (Conjugate transpose = Transpose) */
585 /* > \endverbatim */
586 /* > */
587 /* > \param[in] TRANB */
588 /* > \verbatim */
589 /* >          TRANB is CHARACTER*1 */
590 /* >          Specifies the option op(B): */
591 /* >          = 'N': op(B) = B    (No transpose) */
592 /* >          = 'T': op(B) = B**T (Transpose) */
593 /* >          = 'C': op(B) = B**H (Conjugate transpose = Transpose) */
594 /* > \endverbatim */
595 /* > */
596 /* > \param[in] ISGN */
597 /* > \verbatim */
598 /* >          ISGN is INTEGER */
599 /* >          Specifies the sign in the equation: */
600 /* >          = +1: solve op(A)*X + X*op(B) = scale*C */
601 /* >          = -1: solve op(A)*X - X*op(B) = scale*C */
602 /* > \endverbatim */
603 /* > */
604 /* > \param[in] M */
605 /* > \verbatim */
606 /* >          M is INTEGER */
607 /* >          The order of the matrix A, and the number of rows in the */
608 /* >          matrices X and C. M >= 0. */
609 /* > \endverbatim */
610 /* > */
611 /* > \param[in] N */
612 /* > \verbatim */
613 /* >          N is INTEGER */
614 /* >          The order of the matrix B, and the number of columns in the */
615 /* >          matrices X and C. N >= 0. */
616 /* > \endverbatim */
617 /* > */
618 /* > \param[in] A */
619 /* > \verbatim */
620 /* >          A is DOUBLE PRECISION array, dimension (LDA,M) */
621 /* >          The upper quasi-triangular matrix A, in Schur canonical form. */
622 /* > \endverbatim */
623 /* > */
624 /* > \param[in] LDA */
625 /* > \verbatim */
626 /* >          LDA is INTEGER */
627 /* >          The leading dimension of the array A. LDA >= f2cmax(1,M). */
628 /* > \endverbatim */
629 /* > */
630 /* > \param[in] B */
631 /* > \verbatim */
632 /* >          B is DOUBLE PRECISION array, dimension (LDB,N) */
633 /* >          The upper quasi-triangular matrix B, in Schur canonical form. */
634 /* > \endverbatim */
635 /* > */
636 /* > \param[in] LDB */
637 /* > \verbatim */
638 /* >          LDB is INTEGER */
639 /* >          The leading dimension of the array B. LDB >= f2cmax(1,N). */
640 /* > \endverbatim */
641 /* > */
642 /* > \param[in,out] C */
643 /* > \verbatim */
644 /* >          C is DOUBLE PRECISION array, dimension (LDC,N) */
645 /* >          On entry, the M-by-N right hand side matrix C. */
646 /* >          On exit, C is overwritten by the solution matrix X. */
647 /* > \endverbatim */
648 /* > */
649 /* > \param[in] LDC */
650 /* > \verbatim */
651 /* >          LDC is INTEGER */
652 /* >          The leading dimension of the array C. LDC >= f2cmax(1,M) */
653 /* > \endverbatim */
654 /* > */
655 /* > \param[out] SCALE */
656 /* > \verbatim */
657 /* >          SCALE is DOUBLE PRECISION */
658 /* >          The scale factor, scale, set <= 1 to avoid overflow in X. */
659 /* > \endverbatim */
660 /* > */
661 /* > \param[out] INFO */
662 /* > \verbatim */
663 /* >          INFO is INTEGER */
664 /* >          = 0: successful exit */
665 /* >          < 0: if INFO = -i, the i-th argument had an illegal value */
666 /* >          = 1: A and B have common or very close eigenvalues; perturbed */
667 /* >               values were used to solve the equation (but the matrices */
668 /* >               A and B are unchanged). */
669 /* > \endverbatim */
670
671 /*  Authors: */
672 /*  ======== */
673
674 /* > \author Univ. of Tennessee */
675 /* > \author Univ. of California Berkeley */
676 /* > \author Univ. of Colorado Denver */
677 /* > \author NAG Ltd. */
678
679 /* > \date December 2016 */
680
681 /* > \ingroup doubleSYcomputational */
682
683 /*  ===================================================================== */
684 /* Subroutine */ int dtrsyl_(char *trana, char *tranb, integer *isgn, integer 
685         *m, integer *n, doublereal *a, integer *lda, doublereal *b, integer *
686         ldb, doublereal *c__, integer *ldc, doublereal *scale, integer *info)
687 {
688     /* System generated locals */
689     integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, i__1, i__2, 
690             i__3, i__4;
691     doublereal d__1, d__2;
692
693     /* Local variables */
694     extern doublereal ddot_(integer *, doublereal *, integer *, doublereal *, 
695             integer *);
696     integer ierr;
697     doublereal smin, suml, sumr;
698     integer j, k, l;
699     extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, 
700             integer *);
701     doublereal x[4]     /* was [2][2] */;
702     extern logical lsame_(char *, char *);
703     integer knext, lnext, k1, k2, l1, l2;
704     doublereal xnorm;
705     extern /* Subroutine */ int dlaln2_(logical *, integer *, integer *, 
706             doublereal *, doublereal *, doublereal *, integer *, doublereal *,
707              doublereal *, doublereal *, integer *, doublereal *, doublereal *
708             , doublereal *, integer *, doublereal *, doublereal *, integer *),
709              dlasy2_(logical *, logical *, integer *, integer *, integer *, 
710             doublereal *, integer *, doublereal *, integer *, doublereal *, 
711             integer *, doublereal *, doublereal *, integer *, doublereal *, 
712             integer *);
713     doublereal a11, db;
714     extern /* Subroutine */ int dlabad_(doublereal *, doublereal *);
715     extern doublereal dlamch_(char *), dlange_(char *, integer *, 
716             integer *, doublereal *, integer *, doublereal *);
717     doublereal scaloc;
718     extern /* Subroutine */ int xerbla_(char *, integer *, ftnlen);
719     doublereal bignum;
720     logical notrna, notrnb;
721     doublereal smlnum, da11, vec[4]     /* was [2][2] */, dum[1], eps, sgn;
722
723
724 /*  -- LAPACK computational routine (version 3.7.0) -- */
725 /*  -- LAPACK is a software package provided by Univ. of Tennessee,    -- */
726 /*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */
727 /*     December 2016 */
728
729
730 /*  ===================================================================== */
731
732
733 /*     Decode and Test input parameters */
734
735     /* Parameter adjustments */
736     a_dim1 = *lda;
737     a_offset = 1 + a_dim1 * 1;
738     a -= a_offset;
739     b_dim1 = *ldb;
740     b_offset = 1 + b_dim1 * 1;
741     b -= b_offset;
742     c_dim1 = *ldc;
743     c_offset = 1 + c_dim1 * 1;
744     c__ -= c_offset;
745
746     /* Function Body */
747     notrna = lsame_(trana, "N");
748     notrnb = lsame_(tranb, "N");
749
750     *info = 0;
751     if (! notrna && ! lsame_(trana, "T") && ! lsame_(
752             trana, "C")) {
753         *info = -1;
754     } else if (! notrnb && ! lsame_(tranb, "T") && ! 
755             lsame_(tranb, "C")) {
756         *info = -2;
757     } else if (*isgn != 1 && *isgn != -1) {
758         *info = -3;
759     } else if (*m < 0) {
760         *info = -4;
761     } else if (*n < 0) {
762         *info = -5;
763     } else if (*lda < f2cmax(1,*m)) {
764         *info = -7;
765     } else if (*ldb < f2cmax(1,*n)) {
766         *info = -9;
767     } else if (*ldc < f2cmax(1,*m)) {
768         *info = -11;
769     }
770     if (*info != 0) {
771         i__1 = -(*info);
772         xerbla_("DTRSYL", &i__1, (ftnlen)6);
773         return 0;
774     }
775
776 /*     Quick return if possible */
777
778     *scale = 1.;
779     if (*m == 0 || *n == 0) {
780         return 0;
781     }
782
783 /*     Set constants to control overflow */
784
785     eps = dlamch_("P");
786     smlnum = dlamch_("S");
787     bignum = 1. / smlnum;
788     dlabad_(&smlnum, &bignum);
789     smlnum = smlnum * (doublereal) (*m * *n) / eps;
790     bignum = 1. / smlnum;
791
792 /* Computing MAX */
793     d__1 = smlnum, d__2 = eps * dlange_("M", m, m, &a[a_offset], lda, dum), d__1 = f2cmax(d__1,d__2), d__2 = eps * dlange_("M", n, n, 
794             &b[b_offset], ldb, dum);
795     smin = f2cmax(d__1,d__2);
796
797     sgn = (doublereal) (*isgn);
798
799     if (notrna && notrnb) {
800
801 /*        Solve    A*X + ISGN*X*B = scale*C. */
802
803 /*        The (K,L)th block of X is determined starting from */
804 /*        bottom-left corner column by column by */
805
806 /*         A(K,K)*X(K,L) + ISGN*X(K,L)*B(L,L) = C(K,L) - R(K,L) */
807
808 /*        Where */
809 /*                  M                         L-1 */
810 /*        R(K,L) = SUM [A(K,I)*X(I,L)] + ISGN*SUM [X(K,J)*B(J,L)]. */
811 /*                I=K+1                       J=1 */
812
813 /*        Start column loop (index = L) */
814 /*        L1 (L2) : column index of the first (first) row of X(K,L). */
815
816         lnext = 1;
817         i__1 = *n;
818         for (l = 1; l <= i__1; ++l) {
819             if (l < lnext) {
820                 goto L60;
821             }
822             if (l == *n) {
823                 l1 = l;
824                 l2 = l;
825             } else {
826                 if (b[l + 1 + l * b_dim1] != 0.) {
827                     l1 = l;
828                     l2 = l + 1;
829                     lnext = l + 2;
830                 } else {
831                     l1 = l;
832                     l2 = l;
833                     lnext = l + 1;
834                 }
835             }
836
837 /*           Start row loop (index = K) */
838 /*           K1 (K2): row index of the first (last) row of X(K,L). */
839
840             knext = *m;
841             for (k = *m; k >= 1; --k) {
842                 if (k > knext) {
843                     goto L50;
844                 }
845                 if (k == 1) {
846                     k1 = k;
847                     k2 = k;
848                 } else {
849                     if (a[k + (k - 1) * a_dim1] != 0.) {
850                         k1 = k - 1;
851                         k2 = k;
852                         knext = k - 2;
853                     } else {
854                         k1 = k;
855                         k2 = k;
856                         knext = k - 1;
857                     }
858                 }
859
860                 if (l1 == l2 && k1 == k2) {
861                     i__2 = *m - k1;
862 /* Computing MIN */
863                     i__3 = k1 + 1;
864 /* Computing MIN */
865                     i__4 = k1 + 1;
866                     suml = ddot_(&i__2, &a[k1 + f2cmin(i__3,*m) * a_dim1], lda, &
867                             c__[f2cmin(i__4,*m) + l1 * c_dim1], &c__1);
868                     i__2 = l1 - 1;
869                     sumr = ddot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l1 * 
870                             b_dim1 + 1], &c__1);
871                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
872                     scaloc = 1.;
873
874                     a11 = a[k1 + k1 * a_dim1] + sgn * b[l1 + l1 * b_dim1];
875                     da11 = abs(a11);
876                     if (da11 <= smin) {
877                         a11 = smin;
878                         da11 = smin;
879                         *info = 1;
880                     }
881                     db = abs(vec[0]);
882                     if (da11 < 1. && db > 1.) {
883                         if (db > bignum * da11) {
884                             scaloc = 1. / db;
885                         }
886                     }
887                     x[0] = vec[0] * scaloc / a11;
888
889                     if (scaloc != 1.) {
890                         i__2 = *n;
891                         for (j = 1; j <= i__2; ++j) {
892                             dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
893 /* L10: */
894                         }
895                         *scale *= scaloc;
896                     }
897                     c__[k1 + l1 * c_dim1] = x[0];
898
899                 } else if (l1 == l2 && k1 != k2) {
900
901                     i__2 = *m - k2;
902 /* Computing MIN */
903                     i__3 = k2 + 1;
904 /* Computing MIN */
905                     i__4 = k2 + 1;
906                     suml = ddot_(&i__2, &a[k1 + f2cmin(i__3,*m) * a_dim1], lda, &
907                             c__[f2cmin(i__4,*m) + l1 * c_dim1], &c__1);
908                     i__2 = l1 - 1;
909                     sumr = ddot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l1 * 
910                             b_dim1 + 1], &c__1);
911                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
912
913                     i__2 = *m - k2;
914 /* Computing MIN */
915                     i__3 = k2 + 1;
916 /* Computing MIN */
917                     i__4 = k2 + 1;
918                     suml = ddot_(&i__2, &a[k2 + f2cmin(i__3,*m) * a_dim1], lda, &
919                             c__[f2cmin(i__4,*m) + l1 * c_dim1], &c__1);
920                     i__2 = l1 - 1;
921                     sumr = ddot_(&i__2, &c__[k2 + c_dim1], ldc, &b[l1 * 
922                             b_dim1 + 1], &c__1);
923                     vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr);
924
925                     d__1 = -sgn * b[l1 + l1 * b_dim1];
926                     dlaln2_(&c_false, &c__2, &c__1, &smin, &c_b26, &a[k1 + k1 
927                             * a_dim1], lda, &c_b26, &c_b26, vec, &c__2, &d__1,
928                              &c_b30, x, &c__2, &scaloc, &xnorm, &ierr);
929                     if (ierr != 0) {
930                         *info = 1;
931                     }
932
933                     if (scaloc != 1.) {
934                         i__2 = *n;
935                         for (j = 1; j <= i__2; ++j) {
936                             dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
937 /* L20: */
938                         }
939                         *scale *= scaloc;
940                     }
941                     c__[k1 + l1 * c_dim1] = x[0];
942                     c__[k2 + l1 * c_dim1] = x[1];
943
944                 } else if (l1 != l2 && k1 == k2) {
945
946                     i__2 = *m - k1;
947 /* Computing MIN */
948                     i__3 = k1 + 1;
949 /* Computing MIN */
950                     i__4 = k1 + 1;
951                     suml = ddot_(&i__2, &a[k1 + f2cmin(i__3,*m) * a_dim1], lda, &
952                             c__[f2cmin(i__4,*m) + l1 * c_dim1], &c__1);
953                     i__2 = l1 - 1;
954                     sumr = ddot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l1 * 
955                             b_dim1 + 1], &c__1);
956                     vec[0] = sgn * (c__[k1 + l1 * c_dim1] - (suml + sgn * 
957                             sumr));
958
959                     i__2 = *m - k1;
960 /* Computing MIN */
961                     i__3 = k1 + 1;
962 /* Computing MIN */
963                     i__4 = k1 + 1;
964                     suml = ddot_(&i__2, &a[k1 + f2cmin(i__3,*m) * a_dim1], lda, &
965                             c__[f2cmin(i__4,*m) + l2 * c_dim1], &c__1);
966                     i__2 = l1 - 1;
967                     sumr = ddot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l2 * 
968                             b_dim1 + 1], &c__1);
969                     vec[1] = sgn * (c__[k1 + l2 * c_dim1] - (suml + sgn * 
970                             sumr));
971
972                     d__1 = -sgn * a[k1 + k1 * a_dim1];
973                     dlaln2_(&c_true, &c__2, &c__1, &smin, &c_b26, &b[l1 + l1 *
974                              b_dim1], ldb, &c_b26, &c_b26, vec, &c__2, &d__1, 
975                             &c_b30, x, &c__2, &scaloc, &xnorm, &ierr);
976                     if (ierr != 0) {
977                         *info = 1;
978                     }
979
980                     if (scaloc != 1.) {
981                         i__2 = *n;
982                         for (j = 1; j <= i__2; ++j) {
983                             dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
984 /* L30: */
985                         }
986                         *scale *= scaloc;
987                     }
988                     c__[k1 + l1 * c_dim1] = x[0];
989                     c__[k1 + l2 * c_dim1] = x[1];
990
991                 } else if (l1 != l2 && k1 != k2) {
992
993                     i__2 = *m - k2;
994 /* Computing MIN */
995                     i__3 = k2 + 1;
996 /* Computing MIN */
997                     i__4 = k2 + 1;
998                     suml = ddot_(&i__2, &a[k1 + f2cmin(i__3,*m) * a_dim1], lda, &
999                             c__[f2cmin(i__4,*m) + l1 * c_dim1], &c__1);
1000                     i__2 = l1 - 1;
1001                     sumr = ddot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l1 * 
1002                             b_dim1 + 1], &c__1);
1003                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1004
1005                     i__2 = *m - k2;
1006 /* Computing MIN */
1007                     i__3 = k2 + 1;
1008 /* Computing MIN */
1009                     i__4 = k2 + 1;
1010                     suml = ddot_(&i__2, &a[k1 + f2cmin(i__3,*m) * a_dim1], lda, &
1011                             c__[f2cmin(i__4,*m) + l2 * c_dim1], &c__1);
1012                     i__2 = l1 - 1;
1013                     sumr = ddot_(&i__2, &c__[k1 + c_dim1], ldc, &b[l2 * 
1014                             b_dim1 + 1], &c__1);
1015                     vec[2] = c__[k1 + l2 * c_dim1] - (suml + sgn * sumr);
1016
1017                     i__2 = *m - k2;
1018 /* Computing MIN */
1019                     i__3 = k2 + 1;
1020 /* Computing MIN */
1021                     i__4 = k2 + 1;
1022                     suml = ddot_(&i__2, &a[k2 + f2cmin(i__3,*m) * a_dim1], lda, &
1023                             c__[f2cmin(i__4,*m) + l1 * c_dim1], &c__1);
1024                     i__2 = l1 - 1;
1025                     sumr = ddot_(&i__2, &c__[k2 + c_dim1], ldc, &b[l1 * 
1026                             b_dim1 + 1], &c__1);
1027                     vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr);
1028
1029                     i__2 = *m - k2;
1030 /* Computing MIN */
1031                     i__3 = k2 + 1;
1032 /* Computing MIN */
1033                     i__4 = k2 + 1;
1034                     suml = ddot_(&i__2, &a[k2 + f2cmin(i__3,*m) * a_dim1], lda, &
1035                             c__[f2cmin(i__4,*m) + l2 * c_dim1], &c__1);
1036                     i__2 = l1 - 1;
1037                     sumr = ddot_(&i__2, &c__[k2 + c_dim1], ldc, &b[l2 * 
1038                             b_dim1 + 1], &c__1);
1039                     vec[3] = c__[k2 + l2 * c_dim1] - (suml + sgn * sumr);
1040
1041                     dlasy2_(&c_false, &c_false, isgn, &c__2, &c__2, &a[k1 + 
1042                             k1 * a_dim1], lda, &b[l1 + l1 * b_dim1], ldb, vec,
1043                              &c__2, &scaloc, x, &c__2, &xnorm, &ierr);
1044                     if (ierr != 0) {
1045                         *info = 1;
1046                     }
1047
1048                     if (scaloc != 1.) {
1049                         i__2 = *n;
1050                         for (j = 1; j <= i__2; ++j) {
1051                             dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1052 /* L40: */
1053                         }
1054                         *scale *= scaloc;
1055                     }
1056                     c__[k1 + l1 * c_dim1] = x[0];
1057                     c__[k1 + l2 * c_dim1] = x[2];
1058                     c__[k2 + l1 * c_dim1] = x[1];
1059                     c__[k2 + l2 * c_dim1] = x[3];
1060                 }
1061
1062 L50:
1063                 ;
1064             }
1065
1066 L60:
1067             ;
1068         }
1069
1070     } else if (! notrna && notrnb) {
1071
1072 /*        Solve    A**T *X + ISGN*X*B = scale*C. */
1073
1074 /*        The (K,L)th block of X is determined starting from */
1075 /*        upper-left corner column by column by */
1076
1077 /*          A(K,K)**T*X(K,L) + ISGN*X(K,L)*B(L,L) = C(K,L) - R(K,L) */
1078
1079 /*        Where */
1080 /*                   K-1        T                    L-1 */
1081 /*          R(K,L) = SUM [A(I,K)**T*X(I,L)] +ISGN*SUM [X(K,J)*B(J,L)] */
1082 /*                   I=1                          J=1 */
1083
1084 /*        Start column loop (index = L) */
1085 /*        L1 (L2): column index of the first (last) row of X(K,L) */
1086
1087         lnext = 1;
1088         i__1 = *n;
1089         for (l = 1; l <= i__1; ++l) {
1090             if (l < lnext) {
1091                 goto L120;
1092             }
1093             if (l == *n) {
1094                 l1 = l;
1095                 l2 = l;
1096             } else {
1097                 if (b[l + 1 + l * b_dim1] != 0.) {
1098                     l1 = l;
1099                     l2 = l + 1;
1100                     lnext = l + 2;
1101                 } else {
1102                     l1 = l;
1103                     l2 = l;
1104                     lnext = l + 1;
1105                 }
1106             }
1107
1108 /*           Start row loop (index = K) */
1109 /*           K1 (K2): row index of the first (last) row of X(K,L) */
1110
1111             knext = 1;
1112             i__2 = *m;
1113             for (k = 1; k <= i__2; ++k) {
1114                 if (k < knext) {
1115                     goto L110;
1116                 }
1117                 if (k == *m) {
1118                     k1 = k;
1119                     k2 = k;
1120                 } else {
1121                     if (a[k + 1 + k * a_dim1] != 0.) {
1122                         k1 = k;
1123                         k2 = k + 1;
1124                         knext = k + 2;
1125                     } else {
1126                         k1 = k;
1127                         k2 = k;
1128                         knext = k + 1;
1129                     }
1130                 }
1131
1132                 if (l1 == l2 && k1 == k2) {
1133                     i__3 = k1 - 1;
1134                     suml = ddot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * 
1135                             c_dim1 + 1], &c__1);
1136                     i__3 = l1 - 1;
1137                     sumr = ddot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l1 * 
1138                             b_dim1 + 1], &c__1);
1139                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1140                     scaloc = 1.;
1141
1142                     a11 = a[k1 + k1 * a_dim1] + sgn * b[l1 + l1 * b_dim1];
1143                     da11 = abs(a11);
1144                     if (da11 <= smin) {
1145                         a11 = smin;
1146                         da11 = smin;
1147                         *info = 1;
1148                     }
1149                     db = abs(vec[0]);
1150                     if (da11 < 1. && db > 1.) {
1151                         if (db > bignum * da11) {
1152                             scaloc = 1. / db;
1153                         }
1154                     }
1155                     x[0] = vec[0] * scaloc / a11;
1156
1157                     if (scaloc != 1.) {
1158                         i__3 = *n;
1159                         for (j = 1; j <= i__3; ++j) {
1160                             dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1161 /* L70: */
1162                         }
1163                         *scale *= scaloc;
1164                     }
1165                     c__[k1 + l1 * c_dim1] = x[0];
1166
1167                 } else if (l1 == l2 && k1 != k2) {
1168
1169                     i__3 = k1 - 1;
1170                     suml = ddot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * 
1171                             c_dim1 + 1], &c__1);
1172                     i__3 = l1 - 1;
1173                     sumr = ddot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l1 * 
1174                             b_dim1 + 1], &c__1);
1175                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1176
1177                     i__3 = k1 - 1;
1178                     suml = ddot_(&i__3, &a[k2 * a_dim1 + 1], &c__1, &c__[l1 * 
1179                             c_dim1 + 1], &c__1);
1180                     i__3 = l1 - 1;
1181                     sumr = ddot_(&i__3, &c__[k2 + c_dim1], ldc, &b[l1 * 
1182                             b_dim1 + 1], &c__1);
1183                     vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr);
1184
1185                     d__1 = -sgn * b[l1 + l1 * b_dim1];
1186                     dlaln2_(&c_true, &c__2, &c__1, &smin, &c_b26, &a[k1 + k1 *
1187                              a_dim1], lda, &c_b26, &c_b26, vec, &c__2, &d__1, 
1188                             &c_b30, x, &c__2, &scaloc, &xnorm, &ierr);
1189                     if (ierr != 0) {
1190                         *info = 1;
1191                     }
1192
1193                     if (scaloc != 1.) {
1194                         i__3 = *n;
1195                         for (j = 1; j <= i__3; ++j) {
1196                             dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1197 /* L80: */
1198                         }
1199                         *scale *= scaloc;
1200                     }
1201                     c__[k1 + l1 * c_dim1] = x[0];
1202                     c__[k2 + l1 * c_dim1] = x[1];
1203
1204                 } else if (l1 != l2 && k1 == k2) {
1205
1206                     i__3 = k1 - 1;
1207                     suml = ddot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * 
1208                             c_dim1 + 1], &c__1);
1209                     i__3 = l1 - 1;
1210                     sumr = ddot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l1 * 
1211                             b_dim1 + 1], &c__1);
1212                     vec[0] = sgn * (c__[k1 + l1 * c_dim1] - (suml + sgn * 
1213                             sumr));
1214
1215                     i__3 = k1 - 1;
1216                     suml = ddot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l2 * 
1217                             c_dim1 + 1], &c__1);
1218                     i__3 = l1 - 1;
1219                     sumr = ddot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l2 * 
1220                             b_dim1 + 1], &c__1);
1221                     vec[1] = sgn * (c__[k1 + l2 * c_dim1] - (suml + sgn * 
1222                             sumr));
1223
1224                     d__1 = -sgn * a[k1 + k1 * a_dim1];
1225                     dlaln2_(&c_true, &c__2, &c__1, &smin, &c_b26, &b[l1 + l1 *
1226                              b_dim1], ldb, &c_b26, &c_b26, vec, &c__2, &d__1, 
1227                             &c_b30, x, &c__2, &scaloc, &xnorm, &ierr);
1228                     if (ierr != 0) {
1229                         *info = 1;
1230                     }
1231
1232                     if (scaloc != 1.) {
1233                         i__3 = *n;
1234                         for (j = 1; j <= i__3; ++j) {
1235                             dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1236 /* L90: */
1237                         }
1238                         *scale *= scaloc;
1239                     }
1240                     c__[k1 + l1 * c_dim1] = x[0];
1241                     c__[k1 + l2 * c_dim1] = x[1];
1242
1243                 } else if (l1 != l2 && k1 != k2) {
1244
1245                     i__3 = k1 - 1;
1246                     suml = ddot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * 
1247                             c_dim1 + 1], &c__1);
1248                     i__3 = l1 - 1;
1249                     sumr = ddot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l1 * 
1250                             b_dim1 + 1], &c__1);
1251                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1252
1253                     i__3 = k1 - 1;
1254                     suml = ddot_(&i__3, &a[k1 * a_dim1 + 1], &c__1, &c__[l2 * 
1255                             c_dim1 + 1], &c__1);
1256                     i__3 = l1 - 1;
1257                     sumr = ddot_(&i__3, &c__[k1 + c_dim1], ldc, &b[l2 * 
1258                             b_dim1 + 1], &c__1);
1259                     vec[2] = c__[k1 + l2 * c_dim1] - (suml + sgn * sumr);
1260
1261                     i__3 = k1 - 1;
1262                     suml = ddot_(&i__3, &a[k2 * a_dim1 + 1], &c__1, &c__[l1 * 
1263                             c_dim1 + 1], &c__1);
1264                     i__3 = l1 - 1;
1265                     sumr = ddot_(&i__3, &c__[k2 + c_dim1], ldc, &b[l1 * 
1266                             b_dim1 + 1], &c__1);
1267                     vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr);
1268
1269                     i__3 = k1 - 1;
1270                     suml = ddot_(&i__3, &a[k2 * a_dim1 + 1], &c__1, &c__[l2 * 
1271                             c_dim1 + 1], &c__1);
1272                     i__3 = l1 - 1;
1273                     sumr = ddot_(&i__3, &c__[k2 + c_dim1], ldc, &b[l2 * 
1274                             b_dim1 + 1], &c__1);
1275                     vec[3] = c__[k2 + l2 * c_dim1] - (suml + sgn * sumr);
1276
1277                     dlasy2_(&c_true, &c_false, isgn, &c__2, &c__2, &a[k1 + k1 
1278                             * a_dim1], lda, &b[l1 + l1 * b_dim1], ldb, vec, &
1279                             c__2, &scaloc, x, &c__2, &xnorm, &ierr);
1280                     if (ierr != 0) {
1281                         *info = 1;
1282                     }
1283
1284                     if (scaloc != 1.) {
1285                         i__3 = *n;
1286                         for (j = 1; j <= i__3; ++j) {
1287                             dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1288 /* L100: */
1289                         }
1290                         *scale *= scaloc;
1291                     }
1292                     c__[k1 + l1 * c_dim1] = x[0];
1293                     c__[k1 + l2 * c_dim1] = x[2];
1294                     c__[k2 + l1 * c_dim1] = x[1];
1295                     c__[k2 + l2 * c_dim1] = x[3];
1296                 }
1297
1298 L110:
1299                 ;
1300             }
1301 L120:
1302             ;
1303         }
1304
1305     } else if (! notrna && ! notrnb) {
1306
1307 /*        Solve    A**T*X + ISGN*X*B**T = scale*C. */
1308
1309 /*        The (K,L)th block of X is determined starting from */
1310 /*        top-right corner column by column by */
1311
1312 /*           A(K,K)**T*X(K,L) + ISGN*X(K,L)*B(L,L)**T = C(K,L) - R(K,L) */
1313
1314 /*        Where */
1315 /*                     K-1                            N */
1316 /*            R(K,L) = SUM [A(I,K)**T*X(I,L)] + ISGN*SUM [X(K,J)*B(L,J)**T]. */
1317 /*                     I=1                          J=L+1 */
1318
1319 /*        Start column loop (index = L) */
1320 /*        L1 (L2): column index of the first (last) row of X(K,L) */
1321
1322         lnext = *n;
1323         for (l = *n; l >= 1; --l) {
1324             if (l > lnext) {
1325                 goto L180;
1326             }
1327             if (l == 1) {
1328                 l1 = l;
1329                 l2 = l;
1330             } else {
1331                 if (b[l + (l - 1) * b_dim1] != 0.) {
1332                     l1 = l - 1;
1333                     l2 = l;
1334                     lnext = l - 2;
1335                 } else {
1336                     l1 = l;
1337                     l2 = l;
1338                     lnext = l - 1;
1339                 }
1340             }
1341
1342 /*           Start row loop (index = K) */
1343 /*           K1 (K2): row index of the first (last) row of X(K,L) */
1344
1345             knext = 1;
1346             i__1 = *m;
1347             for (k = 1; k <= i__1; ++k) {
1348                 if (k < knext) {
1349                     goto L170;
1350                 }
1351                 if (k == *m) {
1352                     k1 = k;
1353                     k2 = k;
1354                 } else {
1355                     if (a[k + 1 + k * a_dim1] != 0.) {
1356                         k1 = k;
1357                         k2 = k + 1;
1358                         knext = k + 2;
1359                     } else {
1360                         k1 = k;
1361                         k2 = k;
1362                         knext = k + 1;
1363                     }
1364                 }
1365
1366                 if (l1 == l2 && k1 == k2) {
1367                     i__2 = k1 - 1;
1368                     suml = ddot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * 
1369                             c_dim1 + 1], &c__1);
1370                     i__2 = *n - l1;
1371 /* Computing MIN */
1372                     i__3 = l1 + 1;
1373 /* Computing MIN */
1374                     i__4 = l1 + 1;
1375                     sumr = ddot_(&i__2, &c__[k1 + f2cmin(i__3,*n) * c_dim1], ldc,
1376                              &b[l1 + f2cmin(i__4,*n) * b_dim1], ldb);
1377                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1378                     scaloc = 1.;
1379
1380                     a11 = a[k1 + k1 * a_dim1] + sgn * b[l1 + l1 * b_dim1];
1381                     da11 = abs(a11);
1382                     if (da11 <= smin) {
1383                         a11 = smin;
1384                         da11 = smin;
1385                         *info = 1;
1386                     }
1387                     db = abs(vec[0]);
1388                     if (da11 < 1. && db > 1.) {
1389                         if (db > bignum * da11) {
1390                             scaloc = 1. / db;
1391                         }
1392                     }
1393                     x[0] = vec[0] * scaloc / a11;
1394
1395                     if (scaloc != 1.) {
1396                         i__2 = *n;
1397                         for (j = 1; j <= i__2; ++j) {
1398                             dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1399 /* L130: */
1400                         }
1401                         *scale *= scaloc;
1402                     }
1403                     c__[k1 + l1 * c_dim1] = x[0];
1404
1405                 } else if (l1 == l2 && k1 != k2) {
1406
1407                     i__2 = k1 - 1;
1408                     suml = ddot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * 
1409                             c_dim1 + 1], &c__1);
1410                     i__2 = *n - l2;
1411 /* Computing MIN */
1412                     i__3 = l2 + 1;
1413 /* Computing MIN */
1414                     i__4 = l2 + 1;
1415                     sumr = ddot_(&i__2, &c__[k1 + f2cmin(i__3,*n) * c_dim1], ldc,
1416                              &b[l1 + f2cmin(i__4,*n) * b_dim1], ldb);
1417                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1418
1419                     i__2 = k1 - 1;
1420                     suml = ddot_(&i__2, &a[k2 * a_dim1 + 1], &c__1, &c__[l1 * 
1421                             c_dim1 + 1], &c__1);
1422                     i__2 = *n - l2;
1423 /* Computing MIN */
1424                     i__3 = l2 + 1;
1425 /* Computing MIN */
1426                     i__4 = l2 + 1;
1427                     sumr = ddot_(&i__2, &c__[k2 + f2cmin(i__3,*n) * c_dim1], ldc,
1428                              &b[l1 + f2cmin(i__4,*n) * b_dim1], ldb);
1429                     vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr);
1430
1431                     d__1 = -sgn * b[l1 + l1 * b_dim1];
1432                     dlaln2_(&c_true, &c__2, &c__1, &smin, &c_b26, &a[k1 + k1 *
1433                              a_dim1], lda, &c_b26, &c_b26, vec, &c__2, &d__1, 
1434                             &c_b30, x, &c__2, &scaloc, &xnorm, &ierr);
1435                     if (ierr != 0) {
1436                         *info = 1;
1437                     }
1438
1439                     if (scaloc != 1.) {
1440                         i__2 = *n;
1441                         for (j = 1; j <= i__2; ++j) {
1442                             dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1443 /* L140: */
1444                         }
1445                         *scale *= scaloc;
1446                     }
1447                     c__[k1 + l1 * c_dim1] = x[0];
1448                     c__[k2 + l1 * c_dim1] = x[1];
1449
1450                 } else if (l1 != l2 && k1 == k2) {
1451
1452                     i__2 = k1 - 1;
1453                     suml = ddot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * 
1454                             c_dim1 + 1], &c__1);
1455                     i__2 = *n - l2;
1456 /* Computing MIN */
1457                     i__3 = l2 + 1;
1458 /* Computing MIN */
1459                     i__4 = l2 + 1;
1460                     sumr = ddot_(&i__2, &c__[k1 + f2cmin(i__3,*n) * c_dim1], ldc,
1461                              &b[l1 + f2cmin(i__4,*n) * b_dim1], ldb);
1462                     vec[0] = sgn * (c__[k1 + l1 * c_dim1] - (suml + sgn * 
1463                             sumr));
1464
1465                     i__2 = k1 - 1;
1466                     suml = ddot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l2 * 
1467                             c_dim1 + 1], &c__1);
1468                     i__2 = *n - l2;
1469 /* Computing MIN */
1470                     i__3 = l2 + 1;
1471 /* Computing MIN */
1472                     i__4 = l2 + 1;
1473                     sumr = ddot_(&i__2, &c__[k1 + f2cmin(i__3,*n) * c_dim1], ldc,
1474                              &b[l2 + f2cmin(i__4,*n) * b_dim1], ldb);
1475                     vec[1] = sgn * (c__[k1 + l2 * c_dim1] - (suml + sgn * 
1476                             sumr));
1477
1478                     d__1 = -sgn * a[k1 + k1 * a_dim1];
1479                     dlaln2_(&c_false, &c__2, &c__1, &smin, &c_b26, &b[l1 + l1 
1480                             * b_dim1], ldb, &c_b26, &c_b26, vec, &c__2, &d__1,
1481                              &c_b30, x, &c__2, &scaloc, &xnorm, &ierr);
1482                     if (ierr != 0) {
1483                         *info = 1;
1484                     }
1485
1486                     if (scaloc != 1.) {
1487                         i__2 = *n;
1488                         for (j = 1; j <= i__2; ++j) {
1489                             dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1490 /* L150: */
1491                         }
1492                         *scale *= scaloc;
1493                     }
1494                     c__[k1 + l1 * c_dim1] = x[0];
1495                     c__[k1 + l2 * c_dim1] = x[1];
1496
1497                 } else if (l1 != l2 && k1 != k2) {
1498
1499                     i__2 = k1 - 1;
1500                     suml = ddot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l1 * 
1501                             c_dim1 + 1], &c__1);
1502                     i__2 = *n - l2;
1503 /* Computing MIN */
1504                     i__3 = l2 + 1;
1505 /* Computing MIN */
1506                     i__4 = l2 + 1;
1507                     sumr = ddot_(&i__2, &c__[k1 + f2cmin(i__3,*n) * c_dim1], ldc,
1508                              &b[l1 + f2cmin(i__4,*n) * b_dim1], ldb);
1509                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1510
1511                     i__2 = k1 - 1;
1512                     suml = ddot_(&i__2, &a[k1 * a_dim1 + 1], &c__1, &c__[l2 * 
1513                             c_dim1 + 1], &c__1);
1514                     i__2 = *n - l2;
1515 /* Computing MIN */
1516                     i__3 = l2 + 1;
1517 /* Computing MIN */
1518                     i__4 = l2 + 1;
1519                     sumr = ddot_(&i__2, &c__[k1 + f2cmin(i__3,*n) * c_dim1], ldc,
1520                              &b[l2 + f2cmin(i__4,*n) * b_dim1], ldb);
1521                     vec[2] = c__[k1 + l2 * c_dim1] - (suml + sgn * sumr);
1522
1523                     i__2 = k1 - 1;
1524                     suml = ddot_(&i__2, &a[k2 * a_dim1 + 1], &c__1, &c__[l1 * 
1525                             c_dim1 + 1], &c__1);
1526                     i__2 = *n - l2;
1527 /* Computing MIN */
1528                     i__3 = l2 + 1;
1529 /* Computing MIN */
1530                     i__4 = l2 + 1;
1531                     sumr = ddot_(&i__2, &c__[k2 + f2cmin(i__3,*n) * c_dim1], ldc,
1532                              &b[l1 + f2cmin(i__4,*n) * b_dim1], ldb);
1533                     vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr);
1534
1535                     i__2 = k1 - 1;
1536                     suml = ddot_(&i__2, &a[k2 * a_dim1 + 1], &c__1, &c__[l2 * 
1537                             c_dim1 + 1], &c__1);
1538                     i__2 = *n - l2;
1539 /* Computing MIN */
1540                     i__3 = l2 + 1;
1541 /* Computing MIN */
1542                     i__4 = l2 + 1;
1543                     sumr = ddot_(&i__2, &c__[k2 + f2cmin(i__3,*n) * c_dim1], ldc,
1544                              &b[l2 + f2cmin(i__4,*n) * b_dim1], ldb);
1545                     vec[3] = c__[k2 + l2 * c_dim1] - (suml + sgn * sumr);
1546
1547                     dlasy2_(&c_true, &c_true, isgn, &c__2, &c__2, &a[k1 + k1 *
1548                              a_dim1], lda, &b[l1 + l1 * b_dim1], ldb, vec, &
1549                             c__2, &scaloc, x, &c__2, &xnorm, &ierr);
1550                     if (ierr != 0) {
1551                         *info = 1;
1552                     }
1553
1554                     if (scaloc != 1.) {
1555                         i__2 = *n;
1556                         for (j = 1; j <= i__2; ++j) {
1557                             dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1558 /* L160: */
1559                         }
1560                         *scale *= scaloc;
1561                     }
1562                     c__[k1 + l1 * c_dim1] = x[0];
1563                     c__[k1 + l2 * c_dim1] = x[2];
1564                     c__[k2 + l1 * c_dim1] = x[1];
1565                     c__[k2 + l2 * c_dim1] = x[3];
1566                 }
1567
1568 L170:
1569                 ;
1570             }
1571 L180:
1572             ;
1573         }
1574
1575     } else if (notrna && ! notrnb) {
1576
1577 /*        Solve    A*X + ISGN*X*B**T = scale*C. */
1578
1579 /*        The (K,L)th block of X is determined starting from */
1580 /*        bottom-right corner column by column by */
1581
1582 /*            A(K,K)*X(K,L) + ISGN*X(K,L)*B(L,L)**T = C(K,L) - R(K,L) */
1583
1584 /*        Where */
1585 /*                      M                          N */
1586 /*            R(K,L) = SUM [A(K,I)*X(I,L)] + ISGN*SUM [X(K,J)*B(L,J)**T]. */
1587 /*                    I=K+1                      J=L+1 */
1588
1589 /*        Start column loop (index = L) */
1590 /*        L1 (L2): column index of the first (last) row of X(K,L) */
1591
1592         lnext = *n;
1593         for (l = *n; l >= 1; --l) {
1594             if (l > lnext) {
1595                 goto L240;
1596             }
1597             if (l == 1) {
1598                 l1 = l;
1599                 l2 = l;
1600             } else {
1601                 if (b[l + (l - 1) * b_dim1] != 0.) {
1602                     l1 = l - 1;
1603                     l2 = l;
1604                     lnext = l - 2;
1605                 } else {
1606                     l1 = l;
1607                     l2 = l;
1608                     lnext = l - 1;
1609                 }
1610             }
1611
1612 /*           Start row loop (index = K) */
1613 /*           K1 (K2): row index of the first (last) row of X(K,L) */
1614
1615             knext = *m;
1616             for (k = *m; k >= 1; --k) {
1617                 if (k > knext) {
1618                     goto L230;
1619                 }
1620                 if (k == 1) {
1621                     k1 = k;
1622                     k2 = k;
1623                 } else {
1624                     if (a[k + (k - 1) * a_dim1] != 0.) {
1625                         k1 = k - 1;
1626                         k2 = k;
1627                         knext = k - 2;
1628                     } else {
1629                         k1 = k;
1630                         k2 = k;
1631                         knext = k - 1;
1632                     }
1633                 }
1634
1635                 if (l1 == l2 && k1 == k2) {
1636                     i__1 = *m - k1;
1637 /* Computing MIN */
1638                     i__2 = k1 + 1;
1639 /* Computing MIN */
1640                     i__3 = k1 + 1;
1641                     suml = ddot_(&i__1, &a[k1 + f2cmin(i__2,*m) * a_dim1], lda, &
1642                             c__[f2cmin(i__3,*m) + l1 * c_dim1], &c__1);
1643                     i__1 = *n - l1;
1644 /* Computing MIN */
1645                     i__2 = l1 + 1;
1646 /* Computing MIN */
1647                     i__3 = l1 + 1;
1648                     sumr = ddot_(&i__1, &c__[k1 + f2cmin(i__2,*n) * c_dim1], ldc,
1649                              &b[l1 + f2cmin(i__3,*n) * b_dim1], ldb);
1650                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1651                     scaloc = 1.;
1652
1653                     a11 = a[k1 + k1 * a_dim1] + sgn * b[l1 + l1 * b_dim1];
1654                     da11 = abs(a11);
1655                     if (da11 <= smin) {
1656                         a11 = smin;
1657                         da11 = smin;
1658                         *info = 1;
1659                     }
1660                     db = abs(vec[0]);
1661                     if (da11 < 1. && db > 1.) {
1662                         if (db > bignum * da11) {
1663                             scaloc = 1. / db;
1664                         }
1665                     }
1666                     x[0] = vec[0] * scaloc / a11;
1667
1668                     if (scaloc != 1.) {
1669                         i__1 = *n;
1670                         for (j = 1; j <= i__1; ++j) {
1671                             dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1672 /* L190: */
1673                         }
1674                         *scale *= scaloc;
1675                     }
1676                     c__[k1 + l1 * c_dim1] = x[0];
1677
1678                 } else if (l1 == l2 && k1 != k2) {
1679
1680                     i__1 = *m - k2;
1681 /* Computing MIN */
1682                     i__2 = k2 + 1;
1683 /* Computing MIN */
1684                     i__3 = k2 + 1;
1685                     suml = ddot_(&i__1, &a[k1 + f2cmin(i__2,*m) * a_dim1], lda, &
1686                             c__[f2cmin(i__3,*m) + l1 * c_dim1], &c__1);
1687                     i__1 = *n - l2;
1688 /* Computing MIN */
1689                     i__2 = l2 + 1;
1690 /* Computing MIN */
1691                     i__3 = l2 + 1;
1692                     sumr = ddot_(&i__1, &c__[k1 + f2cmin(i__2,*n) * c_dim1], ldc,
1693                              &b[l1 + f2cmin(i__3,*n) * b_dim1], ldb);
1694                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1695
1696                     i__1 = *m - k2;
1697 /* Computing MIN */
1698                     i__2 = k2 + 1;
1699 /* Computing MIN */
1700                     i__3 = k2 + 1;
1701                     suml = ddot_(&i__1, &a[k2 + f2cmin(i__2,*m) * a_dim1], lda, &
1702                             c__[f2cmin(i__3,*m) + l1 * c_dim1], &c__1);
1703                     i__1 = *n - l2;
1704 /* Computing MIN */
1705                     i__2 = l2 + 1;
1706 /* Computing MIN */
1707                     i__3 = l2 + 1;
1708                     sumr = ddot_(&i__1, &c__[k2 + f2cmin(i__2,*n) * c_dim1], ldc,
1709                              &b[l1 + f2cmin(i__3,*n) * b_dim1], ldb);
1710                     vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr);
1711
1712                     d__1 = -sgn * b[l1 + l1 * b_dim1];
1713                     dlaln2_(&c_false, &c__2, &c__1, &smin, &c_b26, &a[k1 + k1 
1714                             * a_dim1], lda, &c_b26, &c_b26, vec, &c__2, &d__1,
1715                              &c_b30, x, &c__2, &scaloc, &xnorm, &ierr);
1716                     if (ierr != 0) {
1717                         *info = 1;
1718                     }
1719
1720                     if (scaloc != 1.) {
1721                         i__1 = *n;
1722                         for (j = 1; j <= i__1; ++j) {
1723                             dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1724 /* L200: */
1725                         }
1726                         *scale *= scaloc;
1727                     }
1728                     c__[k1 + l1 * c_dim1] = x[0];
1729                     c__[k2 + l1 * c_dim1] = x[1];
1730
1731                 } else if (l1 != l2 && k1 == k2) {
1732
1733                     i__1 = *m - k1;
1734 /* Computing MIN */
1735                     i__2 = k1 + 1;
1736 /* Computing MIN */
1737                     i__3 = k1 + 1;
1738                     suml = ddot_(&i__1, &a[k1 + f2cmin(i__2,*m) * a_dim1], lda, &
1739                             c__[f2cmin(i__3,*m) + l1 * c_dim1], &c__1);
1740                     i__1 = *n - l2;
1741 /* Computing MIN */
1742                     i__2 = l2 + 1;
1743 /* Computing MIN */
1744                     i__3 = l2 + 1;
1745                     sumr = ddot_(&i__1, &c__[k1 + f2cmin(i__2,*n) * c_dim1], ldc,
1746                              &b[l1 + f2cmin(i__3,*n) * b_dim1], ldb);
1747                     vec[0] = sgn * (c__[k1 + l1 * c_dim1] - (suml + sgn * 
1748                             sumr));
1749
1750                     i__1 = *m - k1;
1751 /* Computing MIN */
1752                     i__2 = k1 + 1;
1753 /* Computing MIN */
1754                     i__3 = k1 + 1;
1755                     suml = ddot_(&i__1, &a[k1 + f2cmin(i__2,*m) * a_dim1], lda, &
1756                             c__[f2cmin(i__3,*m) + l2 * c_dim1], &c__1);
1757                     i__1 = *n - l2;
1758 /* Computing MIN */
1759                     i__2 = l2 + 1;
1760 /* Computing MIN */
1761                     i__3 = l2 + 1;
1762                     sumr = ddot_(&i__1, &c__[k1 + f2cmin(i__2,*n) * c_dim1], ldc,
1763                              &b[l2 + f2cmin(i__3,*n) * b_dim1], ldb);
1764                     vec[1] = sgn * (c__[k1 + l2 * c_dim1] - (suml + sgn * 
1765                             sumr));
1766
1767                     d__1 = -sgn * a[k1 + k1 * a_dim1];
1768                     dlaln2_(&c_false, &c__2, &c__1, &smin, &c_b26, &b[l1 + l1 
1769                             * b_dim1], ldb, &c_b26, &c_b26, vec, &c__2, &d__1,
1770                              &c_b30, x, &c__2, &scaloc, &xnorm, &ierr);
1771                     if (ierr != 0) {
1772                         *info = 1;
1773                     }
1774
1775                     if (scaloc != 1.) {
1776                         i__1 = *n;
1777                         for (j = 1; j <= i__1; ++j) {
1778                             dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1779 /* L210: */
1780                         }
1781                         *scale *= scaloc;
1782                     }
1783                     c__[k1 + l1 * c_dim1] = x[0];
1784                     c__[k1 + l2 * c_dim1] = x[1];
1785
1786                 } else if (l1 != l2 && k1 != k2) {
1787
1788                     i__1 = *m - k2;
1789 /* Computing MIN */
1790                     i__2 = k2 + 1;
1791 /* Computing MIN */
1792                     i__3 = k2 + 1;
1793                     suml = ddot_(&i__1, &a[k1 + f2cmin(i__2,*m) * a_dim1], lda, &
1794                             c__[f2cmin(i__3,*m) + l1 * c_dim1], &c__1);
1795                     i__1 = *n - l2;
1796 /* Computing MIN */
1797                     i__2 = l2 + 1;
1798 /* Computing MIN */
1799                     i__3 = l2 + 1;
1800                     sumr = ddot_(&i__1, &c__[k1 + f2cmin(i__2,*n) * c_dim1], ldc,
1801                              &b[l1 + f2cmin(i__3,*n) * b_dim1], ldb);
1802                     vec[0] = c__[k1 + l1 * c_dim1] - (suml + sgn * sumr);
1803
1804                     i__1 = *m - k2;
1805 /* Computing MIN */
1806                     i__2 = k2 + 1;
1807 /* Computing MIN */
1808                     i__3 = k2 + 1;
1809                     suml = ddot_(&i__1, &a[k1 + f2cmin(i__2,*m) * a_dim1], lda, &
1810                             c__[f2cmin(i__3,*m) + l2 * c_dim1], &c__1);
1811                     i__1 = *n - l2;
1812 /* Computing MIN */
1813                     i__2 = l2 + 1;
1814 /* Computing MIN */
1815                     i__3 = l2 + 1;
1816                     sumr = ddot_(&i__1, &c__[k1 + f2cmin(i__2,*n) * c_dim1], ldc,
1817                              &b[l2 + f2cmin(i__3,*n) * b_dim1], ldb);
1818                     vec[2] = c__[k1 + l2 * c_dim1] - (suml + sgn * sumr);
1819
1820                     i__1 = *m - k2;
1821 /* Computing MIN */
1822                     i__2 = k2 + 1;
1823 /* Computing MIN */
1824                     i__3 = k2 + 1;
1825                     suml = ddot_(&i__1, &a[k2 + f2cmin(i__2,*m) * a_dim1], lda, &
1826                             c__[f2cmin(i__3,*m) + l1 * c_dim1], &c__1);
1827                     i__1 = *n - l2;
1828 /* Computing MIN */
1829                     i__2 = l2 + 1;
1830 /* Computing MIN */
1831                     i__3 = l2 + 1;
1832                     sumr = ddot_(&i__1, &c__[k2 + f2cmin(i__2,*n) * c_dim1], ldc,
1833                              &b[l1 + f2cmin(i__3,*n) * b_dim1], ldb);
1834                     vec[1] = c__[k2 + l1 * c_dim1] - (suml + sgn * sumr);
1835
1836                     i__1 = *m - k2;
1837 /* Computing MIN */
1838                     i__2 = k2 + 1;
1839 /* Computing MIN */
1840                     i__3 = k2 + 1;
1841                     suml = ddot_(&i__1, &a[k2 + f2cmin(i__2,*m) * a_dim1], lda, &
1842                             c__[f2cmin(i__3,*m) + l2 * c_dim1], &c__1);
1843                     i__1 = *n - l2;
1844 /* Computing MIN */
1845                     i__2 = l2 + 1;
1846 /* Computing MIN */
1847                     i__3 = l2 + 1;
1848                     sumr = ddot_(&i__1, &c__[k2 + f2cmin(i__2,*n) * c_dim1], ldc,
1849                              &b[l2 + f2cmin(i__3,*n) * b_dim1], ldb);
1850                     vec[3] = c__[k2 + l2 * c_dim1] - (suml + sgn * sumr);
1851
1852                     dlasy2_(&c_false, &c_true, isgn, &c__2, &c__2, &a[k1 + k1 
1853                             * a_dim1], lda, &b[l1 + l1 * b_dim1], ldb, vec, &
1854                             c__2, &scaloc, x, &c__2, &xnorm, &ierr);
1855                     if (ierr != 0) {
1856                         *info = 1;
1857                     }
1858
1859                     if (scaloc != 1.) {
1860                         i__1 = *n;
1861                         for (j = 1; j <= i__1; ++j) {
1862                             dscal_(m, &scaloc, &c__[j * c_dim1 + 1], &c__1);
1863 /* L220: */
1864                         }
1865                         *scale *= scaloc;
1866                     }
1867                     c__[k1 + l1 * c_dim1] = x[0];
1868                     c__[k1 + l2 * c_dim1] = x[2];
1869                     c__[k2 + l1 * c_dim1] = x[1];
1870                     c__[k2 + l2 * c_dim1] = x[3];
1871                 }
1872
1873 L230:
1874                 ;
1875             }
1876 L240:
1877             ;
1878         }
1879
1880     }
1881
1882     return 0;
1883
1884 /*     End of DTRSYL */
1885
1886 } /* dtrsyl_ */
1887