1       SUBROUTINE DLASQ5( I0, N0, Z, PP, TAU, DMIN, DMIN1, DMIN2, DN,
  2      $                   DNM1, DNM2, IEEE )
  3 *
  4 *  -- LAPACK routine (version 3.2)                                    --
  5 *
  6 *  -- Contributed by Osni Marques of the Lawrence Berkeley National   --
  7 *  -- Laboratory and Beresford Parlett of the Univ. of California at  --
  8 *  -- Berkeley                                                        --
  9 *  -- November 2008                                                   --
 10 *
 11 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
 12 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
 13 *
 14 *     .. Scalar Arguments ..
 15       LOGICAL            IEEE
 16       INTEGER            I0, N0, PP
 17       DOUBLE PRECISION   DMIN, DMIN1, DMIN2, DN, DNM1, DNM2, TAU
 18 *     ..
 19 *     .. Array Arguments ..
 20       DOUBLE PRECISION   Z( * )
 21 *     ..
 22 *
 23 *  Purpose
 24 *  =======
 25 *
 26 *  DLASQ5 computes one dqds transform in ping-pong form, one
 27 *  version for IEEE machines another for non IEEE machines.
 28 *
 29 *  Arguments
 30 *  =========
 31 *
 32 *  I0    (input) INTEGER
 33 *        First index.
 34 *
 35 *  N0    (input) INTEGER
 36 *        Last index.
 37 *
 38 *  Z     (input) DOUBLE PRECISION array, dimension ( 4*N )
 39 *        Z holds the qd array. EMIN is stored in Z(4*N0) to avoid
 40 *        an extra argument.
 41 *
 42 *  PP    (input) INTEGER
 43 *        PP=0 for ping, PP=1 for pong.
 44 *
 45 *  TAU   (input) DOUBLE PRECISION
 46 *        This is the shift.
 47 *
 48 *  DMIN  (output) DOUBLE PRECISION
 49 *        Minimum value of d.
 50 *
 51 *  DMIN1 (output) DOUBLE PRECISION
 52 *        Minimum value of d, excluding D( N0 ).
 53 *
 54 *  DMIN2 (output) DOUBLE PRECISION
 55 *        Minimum value of d, excluding D( N0 ) and D( N0-1 ).
 56 *
 57 *  DN    (output) DOUBLE PRECISION
 58 *        d(N0), the last value of d.
 59 *
 60 *  DNM1  (output) DOUBLE PRECISION
 61 *        d(N0-1).
 62 *
 63 *  DNM2  (output) DOUBLE PRECISION
 64 *        d(N0-2).
 65 *
 66 *  IEEE  (input) LOGICAL
 67 *        Flag for IEEE or non IEEE arithmetic.
 68 *
 69 *  =====================================================================
 70 *
 71 *     .. Parameter ..
 72       DOUBLE PRECISION   ZERO
 73       PARAMETER          ( ZERO = 0.0D0 )
 74 *     ..
 75 *     .. Local Scalars ..
 76       INTEGER            J4, J4P2
 77       DOUBLE PRECISION   D, EMIN, TEMP
 78 *     ..
 79 *     .. Intrinsic Functions ..
 80       INTRINSIC          MIN
 81 *     ..
 82 *     .. Executable Statements ..
 83 *
 84       IF( ( N0-I0-1 ).LE.0 )
 85      $   RETURN
 86 *
 87       J4 = 4*I0 + PP - 3
 88       EMIN = Z( J4+4 ) 
 89       D = Z( J4 ) - TAU
 90       DMIN = D
 91       DMIN1 = -Z( J4 )
 92 *
 93       IF( IEEE ) THEN
 94 *
 95 *        Code for IEEE arithmetic.
 96 *
 97          IF( PP.EQ.0 ) THEN
 98             DO 10 J4 = 4*I0, 4*( N0-3 ), 4
 99                Z( J4-2 ) = D + Z( J4-1 ) 
100                TEMP = Z( J4+1 ) / Z( J4-2 )
101                D = D*TEMP - TAU
102                DMIN = MIN( DMIN, D )
103                Z( J4 ) = Z( J4-1 )*TEMP
104                EMIN = MIN( Z( J4 ), EMIN )
105    10       CONTINUE
106          ELSE
107             DO 20 J4 = 4*I0, 4*( N0-3 ), 4
108                Z( J4-3 ) = D + Z( J4 ) 
109                TEMP = Z( J4+2 ) / Z( J4-3 )
110                D = D*TEMP - TAU
111                DMIN = MIN( DMIN, D )
112                Z( J4-1 ) = Z( J4 )*TEMP
113                EMIN = MIN( Z( J4-1 ), EMIN )
114    20       CONTINUE
115          END IF
116 *
117 *        Unroll last two steps. 
118 *
119          DNM2 = D
120          DMIN2 = DMIN
121          J4 = 4*( N0-2 ) - PP
122          J4P2 = J4 + 2*PP - 1
123          Z( J4-2 ) = DNM2 + Z( J4P2 )
124          Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
125          DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
126          DMIN = MIN( DMIN, DNM1 )
127 *
128          DMIN1 = DMIN
129          J4 = J4 + 4
130          J4P2 = J4 + 2*PP - 1
131          Z( J4-2 ) = DNM1 + Z( J4P2 )
132          Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
133          DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
134          DMIN = MIN( DMIN, DN )
135 *
136       ELSE
137 *
138 *        Code for non IEEE arithmetic.
139 *
140          IF( PP.EQ.0 ) THEN
141             DO 30 J4 = 4*I0, 4*( N0-3 ), 4
142                Z( J4-2 ) = D + Z( J4-1 ) 
143                IF( D.LT.ZERO ) THEN
144                   RETURN
145                ELSE 
146                   Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) )
147                   D = Z( J4+1 )*( D / Z( J4-2 ) ) - TAU
148                END IF
149                DMIN = MIN( DMIN, D )
150                EMIN = MIN( EMIN, Z( J4 ) )
151    30       CONTINUE
152          ELSE
153             DO 40 J4 = 4*I0, 4*( N0-3 ), 4
154                Z( J4-3 ) = D + Z( J4 ) 
155                IF( D.LT.ZERO ) THEN
156                   RETURN
157                ELSE 
158                   Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) )
159                   D = Z( J4+2 )*( D / Z( J4-3 ) ) - TAU
160                END IF
161                DMIN = MIN( DMIN, D )
162                EMIN = MIN( EMIN, Z( J4-1 ) )
163    40       CONTINUE
164          END IF
165 *
166 *        Unroll last two steps. 
167 *
168          DNM2 = D
169          DMIN2 = DMIN
170          J4 = 4*( N0-2 ) - PP
171          J4P2 = J4 + 2*PP - 1
172          Z( J4-2 ) = DNM2 + Z( J4P2 )
173          IF( DNM2.LT.ZERO ) THEN
174             RETURN
175          ELSE
176             Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
177             DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
178          END IF
179          DMIN = MIN( DMIN, DNM1 )
180 *
181          DMIN1 = DMIN
182          J4 = J4 + 4
183          J4P2 = J4 + 2*PP - 1
184          Z( J4-2 ) = DNM1 + Z( J4P2 )
185          IF( DNM1.LT.ZERO ) THEN
186             RETURN
187          ELSE
188             Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
189             DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
190          END IF
191          DMIN = MIN( DMIN, DN )
192 *
193       END IF
194 *
195       Z( J4+2 ) = DN
196       Z( 4*N0-PP ) = EMIN
197       RETURN
198 *
199 *     End of DLASQ5
200 *
201       END