3 /* Subroutine */ int dlasq5_(integer *i0, integer *n0, doublereal *z__,
4 integer *pp, doublereal *tau, doublereal *dmin__, doublereal *dmin1,
5 doublereal *dmin2, doublereal *dn, doublereal *dnm1, doublereal *dnm2,
8 /* System generated locals */
10 doublereal d__1, d__2;
15 doublereal emin, temp;
18 /* -- LAPACK auxiliary routine (version 3.1) -- */
19 /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
22 /* .. Scalar Arguments .. */
24 /* .. Array Arguments .. */
30 /* DLASQ5 computes one dqds transform in ping-pong form, one */
31 /* version for IEEE machines another for non IEEE machines. */
36 /* I0 (input) INTEGER */
39 /* N0 (input) INTEGER */
42 /* Z (input) DOUBLE PRECISION array, dimension ( 4*N ) */
43 /* Z holds the qd array. EMIN is stored in Z(4*N0) to avoid */
44 /* an extra argument. */
46 /* PP (input) INTEGER */
47 /* PP=0 for ping, PP=1 for pong. */
49 /* TAU (input) DOUBLE PRECISION */
50 /* This is the shift. */
52 /* DMIN (output) DOUBLE PRECISION */
53 /* Minimum value of d. */
55 /* DMIN1 (output) DOUBLE PRECISION */
56 /* Minimum value of d, excluding D( N0 ). */
58 /* DMIN2 (output) DOUBLE PRECISION */
59 /* Minimum value of d, excluding D( N0 ) and D( N0-1 ). */
61 /* DN (output) DOUBLE PRECISION */
62 /* d(N0), the last value of d. */
64 /* DNM1 (output) DOUBLE PRECISION */
67 /* DNM2 (output) DOUBLE PRECISION */
70 /* IEEE (input) LOGICAL */
71 /* Flag for IEEE or non IEEE arithmetic. */
73 /* ===================================================================== */
77 /* .. Local Scalars .. */
79 /* .. Intrinsic Functions .. */
81 /* .. Executable Statements .. */
83 /* Parameter adjustments */
87 if (*n0 - *i0 - 1 <= 0) {
91 j4 = (*i0 << 2) + *pp - 3;
99 /* Code for IEEE arithmetic. */
103 for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) {
104 z__[j4 - 2] = d__ + z__[j4 - 1];
105 temp = z__[j4 + 1] / z__[j4 - 2];
106 d__ = d__ * temp - *tau;
107 *dmin__ = min(*dmin__,d__);
108 z__[j4] = z__[j4 - 1] * temp;
111 emin = min(d__1,emin);
116 for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) {
117 z__[j4 - 3] = d__ + z__[j4];
118 temp = z__[j4 + 2] / z__[j4 - 3];
119 d__ = d__ * temp - *tau;
120 *dmin__ = min(*dmin__,d__);
121 z__[j4 - 1] = z__[j4] * temp;
124 emin = min(d__1,emin);
129 /* Unroll last two steps. */
133 j4 = (*n0 - 2 << 2) - *pp;
134 j4p2 = j4 + (*pp << 1) - 1;
135 z__[j4 - 2] = *dnm2 + z__[j4p2];
136 z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]);
137 *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau;
138 *dmin__ = min(*dmin__,*dnm1);
142 j4p2 = j4 + (*pp << 1) - 1;
143 z__[j4 - 2] = *dnm1 + z__[j4p2];
144 z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]);
145 *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau;
146 *dmin__ = min(*dmin__,*dn);
150 /* Code for non IEEE arithmetic. */
154 for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) {
155 z__[j4 - 2] = d__ + z__[j4 - 1];
159 z__[j4] = z__[j4 + 1] * (z__[j4 - 1] / z__[j4 - 2]);
160 d__ = z__[j4 + 1] * (d__ / z__[j4 - 2]) - *tau;
162 *dmin__ = min(*dmin__,d__);
164 d__1 = emin, d__2 = z__[j4];
165 emin = min(d__1,d__2);
170 for (j4 = *i0 << 2; j4 <= i__1; j4 += 4) {
171 z__[j4 - 3] = d__ + z__[j4];
175 z__[j4 - 1] = z__[j4 + 2] * (z__[j4] / z__[j4 - 3]);
176 d__ = z__[j4 + 2] * (d__ / z__[j4 - 3]) - *tau;
178 *dmin__ = min(*dmin__,d__);
180 d__1 = emin, d__2 = z__[j4 - 1];
181 emin = min(d__1,d__2);
186 /* Unroll last two steps. */
190 j4 = (*n0 - 2 << 2) - *pp;
191 j4p2 = j4 + (*pp << 1) - 1;
192 z__[j4 - 2] = *dnm2 + z__[j4p2];
196 z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]);
197 *dnm1 = z__[j4p2 + 2] * (*dnm2 / z__[j4 - 2]) - *tau;
199 *dmin__ = min(*dmin__,*dnm1);
203 j4p2 = j4 + (*pp << 1) - 1;
204 z__[j4 - 2] = *dnm1 + z__[j4p2];
208 z__[j4] = z__[j4p2 + 2] * (z__[j4p2] / z__[j4 - 2]);
209 *dn = z__[j4p2 + 2] * (*dnm1 / z__[j4 - 2]) - *tau;
211 *dmin__ = min(*dmin__,*dn);
216 z__[(*n0 << 2) - *pp] = emin;