summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gfortran.dg/g77/980310-3.f
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/gfortran.dg/g77/980310-3.f
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository.
Diffstat (limited to 'gcc/testsuite/gfortran.dg/g77/980310-3.f')
-rw-r--r--gcc/testsuite/gfortran.dg/g77/980310-3.f260
1 files changed, 260 insertions, 0 deletions
diff --git a/gcc/testsuite/gfortran.dg/g77/980310-3.f b/gcc/testsuite/gfortran.dg/g77/980310-3.f
new file mode 100644
index 000000000..565602378
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/g77/980310-3.f
@@ -0,0 +1,260 @@
+c { dg-do compile }
+c
+c This demonstrates a problem with g77 and pic on x86 where
+c egcs 1.0.1 and earlier will generate bogus assembler output.
+c unfortunately, gas accepts the bogus acssembler output and
+c generates code that almost works.
+c
+
+
+C Date: Wed, 17 Dec 1997 23:20:29 +0000
+C From: Joao Cardoso <jcardoso@inescn.pt>
+C To: egcs-bugs@cygnus.com
+C Subject: egcs-1.0 f77 bug on OSR5
+C When trying to compile the Fortran file that I enclose bellow,
+C I got an assembler error:
+C
+C ./g77 -B./ -fpic -O -c scaleg.f
+C /usr/tmp/cca002D8.s:123:syntax error at (
+C
+C ./g77 -B./ -fpic -O0 -c scaleg.f
+C /usr/tmp/cca002EW.s:246:invalid operand combination: leal
+C
+C Compiling without the -fpic flag runs OK.
+
+ subroutine scaleg (n,ma,a,mb,b,low,igh,cscale,cperm,wk)
+c
+c *****parameters:
+ integer igh,low,ma,mb,n
+ double precision a(ma,n),b(mb,n),cperm(n),cscale(n),wk(n,6)
+c
+c *****local variables:
+ integer i,ir,it,j,jc,kount,nr,nrp2
+ double precision alpha,basl,beta,cmax,coef,coef2,coef5,cor,
+ * ew,ewc,fi,fj,gamma,pgamma,sum,t,ta,tb,tc
+c
+c *****fortran functions:
+ double precision dabs, dlog10, dsign
+c float
+c
+c *****subroutines called:
+c none
+c
+c ---------------------------------------------------------------
+c
+c *****purpose:
+c scales the matrices a and b in the generalized eigenvalue
+c problem a*x = (lambda)*b*x such that the magnitudes of the
+c elements of the submatrices of a and b (as specified by low
+c and igh) are close to unity in the least squares sense.
+c ref.: ward, r. c., balancing the generalized eigenvalue
+c problem, siam j. sci. stat. comput., vol. 2, no. 2, june 1981,
+c 141-152.
+c
+c *****parameter description:
+c
+c on input:
+c
+c ma,mb integer
+c row dimensions of the arrays containing matrices
+c a and b respectively, as declared in the main calling
+c program dimension statement;
+c
+c n integer
+c order of the matrices a and b;
+c
+c a real(ma,n)
+c contains the a matrix of the generalized eigenproblem
+c defined above;
+c
+c b real(mb,n)
+c contains the b matrix of the generalized eigenproblem
+c defined above;
+c
+c low integer
+c specifies the beginning -1 for the rows and
+c columns of a and b to be scaled;
+c
+c igh integer
+c specifies the ending -1 for the rows and columns
+c of a and b to be scaled;
+c
+c cperm real(n)
+c work array. only locations low through igh are
+c referenced and altered by this subroutine;
+c
+c wk real(n,6)
+c work array that must contain at least 6*n locations.
+c only locations low through igh, n+low through n+igh,
+c ..., 5*n+low through 5*n+igh are referenced and
+c altered by this subroutine.
+c
+c on output:
+c
+c a,b contain the scaled a and b matrices;
+c
+c cscale real(n)
+c contains in its low through igh locations the integer
+c exponents of 2 used for the column scaling factors.
+c the other locations are not referenced;
+c
+c wk contains in its low through igh locations the integer
+c exponents of 2 used for the row scaling factors.
+c
+c *****algorithm notes:
+c none.
+c
+c *****history:
+c written by r. c. ward.......
+c modified 8/86 by bobby bodenheimer so that if
+c sum = 0 (corresponding to the case where the matrix
+c doesn't need to be scaled) the routine returns.
+c
+c ---------------------------------------------------------------
+c
+ if (low .eq. igh) go to 410
+ do 210 i = low,igh
+ wk(i,1) = 0.0d0
+ wk(i,2) = 0.0d0
+ wk(i,3) = 0.0d0
+ wk(i,4) = 0.0d0
+ wk(i,5) = 0.0d0
+ wk(i,6) = 0.0d0
+ cscale(i) = 0.0d0
+ cperm(i) = 0.0d0
+ 210 continue
+c
+c compute right side vector in resulting linear equations
+c
+ basl = dlog10(2.0d0)
+ do 240 i = low,igh
+ do 240 j = low,igh
+ tb = b(i,j)
+ ta = a(i,j)
+ if (ta .eq. 0.0d0) go to 220
+ ta = dlog10(dabs(ta)) / basl
+ 220 continue
+ if (tb .eq. 0.0d0) go to 230
+ tb = dlog10(dabs(tb)) / basl
+ 230 continue
+ wk(i,5) = wk(i,5) - ta - tb
+ wk(j,6) = wk(j,6) - ta - tb
+ 240 continue
+ nr = igh-low+1
+ coef = 1.0d0/float(2*nr)
+ coef2 = coef*coef
+ coef5 = 0.5d0*coef2
+ nrp2 = nr+2
+ beta = 0.0d0
+ it = 1
+c
+c start generalized conjugate gradient iteration
+c
+ 250 continue
+ ew = 0.0d0
+ ewc = 0.0d0
+ gamma = 0.0d0
+ do 260 i = low,igh
+ gamma = gamma + wk(i,5)*wk(i,5) + wk(i,6)*wk(i,6)
+ ew = ew + wk(i,5)
+ ewc = ewc + wk(i,6)
+ 260 continue
+ gamma = coef*gamma - coef2*(ew**2 + ewc**2)
+ + - coef5*(ew - ewc)**2
+ if (it .ne. 1) beta = gamma / pgamma
+ t = coef5*(ewc - 3.0d0*ew)
+ tc = coef5*(ew - 3.0d0*ewc)
+ do 270 i = low,igh
+ wk(i,2) = beta*wk(i,2) + coef*wk(i,5) + t
+ cperm(i) = beta*cperm(i) + coef*wk(i,6) + tc
+ 270 continue
+c
+c apply matrix to vector
+c
+ do 300 i = low,igh
+ kount = 0
+ sum = 0.0d0
+ do 290 j = low,igh
+ if (a(i,j) .eq. 0.0d0) go to 280
+ kount = kount+1
+ sum = sum + cperm(j)
+ 280 continue
+ if (b(i,j) .eq. 0.0d0) go to 290
+ kount = kount+1
+ sum = sum + cperm(j)
+ 290 continue
+ wk(i,3) = float(kount)*wk(i,2) + sum
+ 300 continue
+ do 330 j = low,igh
+ kount = 0
+ sum = 0.0d0
+ do 320 i = low,igh
+ if (a(i,j) .eq. 0.0d0) go to 310
+ kount = kount+1
+ sum = sum + wk(i,2)
+ 310 continue
+ if (b(i,j) .eq. 0.0d0) go to 320
+ kount = kount+1
+ sum = sum + wk(i,2)
+ 320 continue
+ wk(j,4) = float(kount)*cperm(j) + sum
+ 330 continue
+ sum = 0.0d0
+ do 340 i = low,igh
+ sum = sum + wk(i,2)*wk(i,3) + cperm(i)*wk(i,4)
+ 340 continue
+ if(sum.eq.0.0d0) return
+ alpha = gamma / sum
+c
+c determine correction to current iterate
+c
+ cmax = 0.0d0
+ do 350 i = low,igh
+ cor = alpha * wk(i,2)
+ if (dabs(cor) .gt. cmax) cmax = dabs(cor)
+ wk(i,1) = wk(i,1) + cor
+ cor = alpha * cperm(i)
+ if (dabs(cor) .gt. cmax) cmax = dabs(cor)
+ cscale(i) = cscale(i) + cor
+ 350 continue
+ if (cmax .lt. 0.5d0) go to 370
+ do 360 i = low,igh
+ wk(i,5) = wk(i,5) - alpha*wk(i,3)
+ wk(i,6) = wk(i,6) - alpha*wk(i,4)
+ 360 continue
+ pgamma = gamma
+ it = it+1
+ if (it .le. nrp2) go to 250
+c
+c end generalized conjugate gradient iteration
+c
+ 370 continue
+ do 380 i = low,igh
+ ir = wk(i,1) + dsign(0.5d0,wk(i,1))
+ wk(i,1) = ir
+ jc = cscale(i) + dsign(0.5d0,cscale(i))
+ cscale(i) = jc
+ 380 continue
+c
+c scale a and b
+c
+ do 400 i = 1,igh
+ ir = wk(i,1)
+ fi = 2.0d0**ir
+ if (i .lt. low) fi = 1.0d0
+ do 400 j =low,n
+ jc = cscale(j)
+ fj = 2.0d0**jc
+ if (j .le. igh) go to 390
+ if (i .lt. low) go to 400
+ fj = 1.0d0
+ 390 continue
+ a(i,j) = a(i,j)*fi*fj
+ b(i,j) = b(i,j)*fi*fj
+ 400 continue
+ 410 continue
+ return
+c
+c last line of scaleg
+c
+ end