174      SUBROUTINE sgelsx( M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND,
 
  182      INTEGER            INFO, LDA, LDB, M, N, NRHS, RANK
 
  187      REAL               A( LDA, * ), B( LDB, * ), WORK( * )
 
  194      parameter( imax = 1, imin = 2 )
 
  195      REAL               ZERO, ONE, DONE, NTDONE
 
  196      parameter( zero = 0.0e0, one = 1.0e0, done = zero,
 
  200      INTEGER            I, IASCL, IBSCL, ISMAX, ISMIN, J, K, MN
 
  201      REAL               ANRM, BIGNUM, BNRM, C1, C2, S1, S2, SMAX,
 
  202     $                   smaxpr, smin, sminpr, smlnum, t1, t2
 
  206      EXTERNAL           slamch, slange
 
  213      INTRINSIC          abs, max, min
 
  226      ELSE IF( n.LT.0 ) 
THEN 
  228      ELSE IF( nrhs.LT.0 ) 
THEN 
  230      ELSE IF( lda.LT.max( 1, m ) ) 
THEN 
  232      ELSE IF( ldb.LT.max( 1, m, n ) ) 
THEN 
  237         CALL xerbla( 
'SGELSX', -info )
 
  243      IF( min( m, n, nrhs ).EQ.0 ) 
THEN 
  250      smlnum = slamch( 
'S' ) / slamch( 
'P' )
 
  251      bignum = one / smlnum
 
  255      anrm = slange( 
'M', m, n, a, lda, work )
 
  257      IF( anrm.GT.zero .AND. anrm.LT.smlnum ) 
THEN 
  261         CALL slascl( 
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
 
  263      ELSE IF( anrm.GT.bignum ) 
THEN 
  267         CALL slascl( 
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
 
  269      ELSE IF( anrm.EQ.zero ) 
THEN 
  273         CALL slaset( 
'F', max( m, n ), nrhs, zero, zero, b, ldb )
 
  278      bnrm = slange( 
'M', m, nrhs, b, ldb, work )
 
  280      IF( bnrm.GT.zero .AND. bnrm.LT.smlnum ) 
THEN 
  284         CALL slascl( 
'G', 0, 0, bnrm, smlnum, m, nrhs, b, ldb,
 
  287      ELSE IF( bnrm.GT.bignum ) 
THEN 
  291         CALL slascl( 
'G', 0, 0, bnrm, bignum, m, nrhs, b, ldb,
 
  299      CALL sgeqpf( m, n, a, lda, jpvt, work( 1 ), work( mn+1 ),
 
  309      smax = abs( a( 1, 1 ) )
 
  311      IF( abs( a( 1, 1 ) ).EQ.zero ) 
THEN 
  313         CALL slaset( 
'F', max( m, n ), nrhs, zero, zero, b, ldb )
 
  320      IF( rank.LT.mn ) 
THEN 
  322         CALL slaic1( imin, rank, work( ismin ), smin, a( 1, i ),
 
  323     $                a( i, i ), sminpr, s1, c1 )
 
  324         CALL slaic1( imax, rank, work( ismax ), smax, a( 1, i ),
 
  325     $                a( i, i ), smaxpr, s2, c2 )
 
  327         IF( smaxpr*rcond.LE.sminpr ) 
THEN 
  329               work( ismin+i-1 ) = s1*work( ismin+i-1 )
 
  330               work( ismax+i-1 ) = s2*work( ismax+i-1 )
 
  332            work( ismin+rank ) = c1
 
  333            work( ismax+rank ) = c2
 
  348     $   
CALL stzrqf( rank, n, a, lda, work( mn+1 ), info )
 
  354      CALL sorm2r( 
'Left', 
'Transpose', m, nrhs, mn, a, lda,
 
  355     $             work( 1 ), b, ldb, work( 2*mn+1 ), info )
 
  361      CALL strsm( 
'Left', 
'Upper', 
'No transpose', 
'Non-unit',
 
  362     $            rank, nrhs, one, a, lda, b, ldb )
 
  364      DO 40 i = rank + 1, n
 
  374            CALL slatzm( 
'Left', n-rank+1, nrhs, a( i, rank+1 ), lda,
 
  375     $                   work( mn+i ), b( i, 1 ), b( rank+1, 1 ), ldb,
 
  386            work( 2*mn+i ) = ntdone
 
  389            IF( work( 2*mn+i ).EQ.ntdone ) 
THEN 
  390               IF( jpvt( i ).NE.i ) 
THEN 
  393                  t2 = b( jpvt( k ), j )
 
  395                  b( jpvt( k ), j ) = t1
 
  396                  work( 2*mn+k ) = done
 
  399                  t2 = b( jpvt( k ), j )
 
  403                  work( 2*mn+k ) = done
 
  411      IF( iascl.EQ.1 ) 
THEN 
  412         CALL slascl( 
'G', 0, 0, anrm, smlnum, n, nrhs, b, ldb,
 
  414         CALL slascl( 
'U', 0, 0, smlnum, anrm, rank, rank, a, lda,
 
  416      ELSE IF( iascl.EQ.2 ) 
THEN 
  417         CALL slascl( 
'G', 0, 0, anrm, bignum, n, nrhs, b, ldb,
 
  419         CALL slascl( 
'U', 0, 0, bignum, anrm, rank, rank, a, lda,
 
  422      IF( ibscl.EQ.1 ) 
THEN 
  423         CALL slascl( 
'G', 0, 0, smlnum, bnrm, n, nrhs, b, ldb,
 
  425      ELSE IF( ibscl.EQ.2 ) 
THEN 
  426         CALL slascl( 
'G', 0, 0, bignum, bnrm, n, nrhs, b, ldb,