This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

modification of g77 for default 64-bit integers on x86-64


Hi,

I would like to announce a modification of the g77 compiler to generate
integers 8 byte (64 bit) long by default. The motivation for this work are the
AMD Opteron (x86-64) processors. For me it becomes essential to be able to use
large old Fortran application programs on this new architecture and have integer
variables (implicit ones as well as the ones declared as integer without length)
64-bit sized to exploit fully the new processor.
Furtherermore I wanted to avoid using commercial compilers (e.g. PGI) which
offer this feature (-i8 option), due to both financial reasons and free software principle.

Presently the modification is rather a quick and dirty hack - to be described below -, but it works.
I would like to ask the GCC developers to fix the bugs which appear to be a
consequence of this modification and possibly add this feature as an option.
My main interest is development of scientific application software, I really
do not intend to become a compiler expert.

Description of the modification:
Starting version of the compiler: gcc-3.3 from SuSe-8.2-Prof-x86-64-Beta9 distribution
List of modifications:
1.
file gcc-3.3/gcc/f/info.h, line 177-178: change from
#define FFEINFO_kindtypeINTEGERDEFAULT FFEINFO_kindtypeINTEGER1
#define FFEINFO_kindtypeLOGICALDEFAULT FFEINFO_kindtypeLOGICAL1
to
#define FFEINFO_kindtypeINTEGERDEFAULT FFEINFO_kindtypeINTEGER4
#define FFEINFO_kindtypeLOGICALDEFAULT FFEINFO_kindtypeLOGICAL4
(logicals are often equivalenced with integers in the old codes!)
2.
file gcc-3.3/gcc/f/equiv.c, line 742: change from
assert (ffeinfo_kindtype (ffebld_info (high)) == FFEINFO_kindtypeINTEGER1);
to
assert (ffeinfo_kindtype (ffebld_info (high)) == FFEINFO_kindtypeINTEGERDEFAULT);

That is all!!! 

However, there remain some bugs to be resolved:
1. 
Intrinsic functions like iabs(), min0(), max0() etc. report errors.
This can be easily avoided by using the generic ones abs(), min(), max()
2.
Exponentiation generates warning, but it seems to calculate correctly:
          write(6,*)10.0d0**i
                            ^
Unsupported operand for ** at (^) -- converting to default INTEGER
3.
Intrinsic I/O functions from the runtime library need logical*4, e.g. in
INQUIRE(FILE=FNAME(1:ILENGTH),EXIST=YESNO,OPENED=ISOPEN)
YESNO and ISOPEN must be logical*4, otherwise results are wrong
4.
I/O intrinsics with IOSTAT= specification like
READ(UNIT=IU,REC=IRECST,ERR=999,IOSTAT=IOS) generate an internal compiler
error, in the code generator, not in fortran parser.
5.
I have encountered a strange bug which I could not reproduce on a simple code
fragment. The following compiles correctly:
          IMPLICIT DOUBLE PRECISION (A-H,O-Z) 
          PARAMETER (NHT=7,KWD=(NHT+1)*(NHT+2)*(NHT+3)/6)
           dimension NXYZ(KWD,3)
          write(6,*)kwd
          end
But in the following original code the leading dimension KWD of the array NXYZ
calculated wrongly and it causes segmentation violation when NXYZ is accessed.
Changing to PARAMETER (NHT=7,KWD=120) generates correct code.
      SUBROUTINE ONEL(I1,NXYZ,SVEKT,POWAB,JJRS,SBUF,JBUF,SINT,
     &                LMN,PYA,MAKK,HLP1,TSFSTA,TSAV,NUC,NRC,PP,
     &                TF,MNO,IG,NHL)
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
      CHARACTER*8 TEXT(2)
C-----------------------------------------------------------------------
C     Parameters
C-----------------------------------------------------------------------
      PARAMETER (NHT=7,KWD=(NHT+1)*(NHT+2)*(NHT+3)/6)
      parameter (nh4=4*NHT-3)
      PARAMETER (MXCBF =500)
      PARAMETER (MXTNPR=400)
      PARAMETER (MXTNCC=800)
      PARAMETER (MXTNSH=100)
C-----------------------------------------------------------------------
      INTEGER AND,OR,EOR,XD(8),DSTRT
      LOGICAL HARMT
      COMMON /HARMON/ HARMT
      COMMON /XA/ XAND(3,8,nh4)
      COMMON /FLAGS/ IPRINT,IFLAGS(99)
      DIMENSION I1(50),NXYZ(KWD,3),SVEKT(ig),POWAB(15,3),JJRS(2),
     & SBUF(600),JBUF(600),SINT(ig),LMN(3),PYA(3),MAKK(3),HLP1(NHL),
     & TSFSTA(ig),TSAV(ig),NUC(2),NRC(2),PP(3),TF(14),MNO(3)
c      COMMON /W1/ I1(50),NXYZ(KWD,3),SVEKT(ig),POWAB(15,3),JJRS(2),
c     & SBUF(600),JBUF(600),SINT(ig),LMN(3),PYA(3),MAKK(3),HLP1(NHL),
c     & TSFSTA(ig),TSAV(ig),NUC(2),NRC(2),PP(3),TF(14),MNO(3)
      COMMON/NULL/FACT(nh4),RFACT(nh4),FACTM(nh4),RFACTM(nh4)
     & ,MAA,IFD1,IFD2,KCD,KBCD,NHCD,NHBCD,NNC,IFPL(3),
     & NN1,NN2,NHKTA,NHKTB,NHKTC,NHKTD,KHKTA,KHKTB,KHKTC,KHKTD,NNB
c      COMMON/NULL/FACT(nh4),RFACT(nh4),FACTM(nh4),RFACTM(nh4)
      COMMON /REP/ NEWIND(500) , MSTOLD(8)
      COMMON /INDX/ PC(512),DSTRT(8,MXCBF),NTAP,LU2,NRSS,NUCZ,ITAG,
     1 MAXLOP,MAXLOT,KMAX,NMAX,KHKT(7),MULT(8),ISYTYP(3),ITYPE(7,28),
     2 AND(8,8),OR(8,8),EOR(8,8),NPARSU(8),NPAR(8),MULNUC(100),
     3 NHKT(MXTNSH),MUL(MXTNSH),NUCO(MXTNSH),NRCO(MXTNSH),
     4 JSTRT(MXTNSH),NSTRT(MXTNSH),MST(MXTNSH),JRS(MXTNSH)
      COMMON /DAT/ALPHA(MXTNPR),CONT(MXTNCC),CENT(3,MXTNSH),
     1            CORD(100,3),CHARGE(100),FMULT(8),TLA, TLC
      DATA TEXT /'********','OVERLAP '/
C
CCDIR$ BOUNDS
C
      PI=2.0*DACOS(0.0D00)
      WRITE (NTAP) TEXT(1)
      WRITE (NTAP) TEXT(2)
      MINUS1=-1
      NUT=0
C NOVECTOR DIRECTIVE REQUIRED FOR FPS ONLY
CCDIR$ NOVECTOR
      DO 1713 J=1,3
      POWAB(1,J)=1.
      DO 1713 I=1,MAXLOP
      XAND(J,I,1)=1.
      DO 1713 K=2,nh4-1,2
      XAND(J,I,K+1)=1.
 1713 XAND(J,I,K)=PC(AND(ISYTYP(J),I))
CCDIR$ NOVECTOR
      FACT  (1)=1.0
      RFACT (1)=1.0
      FACTM (1)=1.0
      RFACTM(1)=1.0
      FF=1.0
      DO 7451 I=2,nh4
      FI=DFLOAT(I-1)
      FACT(I)=FACT(I-1)*FI
      FACTM(I)=-FACTM(I-1)*FI
      RFACT(I)=RFACT(I-1)/FI
      RFACTM(I)=RFACT(I)*FF
 7451 FF=FF*0.25
      DO 2203 I=1,MAXLOP
 2203 XD(I)=0
      DO 90 IA=1,KMAX
      NHKTA=NHKT(IA)
      KHKTA=KHKT(NHKTA)
      DO 91 NA=1,KHKTA
      IND=NSTRT(IA)+NA
      DO 92 LA=1,MAXLOP
      IF(AND(MUL(IA),EOR(LA,ITYPE(NHKTA,NA))) . NE . 1) GO TO 92
      XD(LA) = XD(LA) + NRCO(IA)
   92 CONTINUE
      DO 102 I=1,MAXLOP
  102 DSTRT(I,IND)=XD(I)
   91 CONTINUE
   90 CONTINUE
      ISAB=0
      IBSAB=0
      MIA=0
      DO 1 IA=1,KMAX
      NHKTA=NHKT(IA)
      NHKTAM=NHKTA-1
      NANA=(NHKTAM*NHKTA*(NHKTA+1))/6
      KHKTA=KHKT(NHKTA)
      MULA=MUL(IA)
      NUCA=NUCO(IA)
      NUC(1) = NUCA
      JSTA=JSTRT(IA)
      MIB=0
      DO 40 IB=1,IA
      MRAF = NRCO(IA) * NRCO(IB)
      NRC(1) = NRCO(IA)
      NRC(2) = NRCO(IB)
      NHKTB=NHKT(IB)
      NHKTBP=NHKTB+1
      NHKTBQ=NHKTB+2
      INCR=(NHKTA*NHKTBQ*(NHKTA+NHKTBQ))/2
      MAXALL=NHKTA+NHKTB
      NBNB=((NHKTB-1)*NHKTB*NHKTBP)/6
      KHKTB=KHKT(NHKTB)
      MULB=MUL(IB)
      NUCB=NUCO(IB)
      NUCAB=NUCA*NUCB
      NUC(2) = NUCB
      JJRS(1) = JRS(IA)
      JJRS(2) = JRS(IB)
      JSTB=JSTRT(IB)
      CALL EXCOEF(TSFSTA,NHKTA,NHKTB+2,NUCA,NUCB,JSTA,JSTB,FACTM)
      MAA=KHKTA*KHKTB
      MAB=OR(MULA,MULB)
      KAB=AND(MULA,MULB)
      CALL CLEAR (SINT,MAA*MRAF*MULT(KAB))
      HKAB=FMULT(KAB)
      DO 5 KB=1,MAXLOT
      IBSAB=IBSAB+1
      IF(AND(KB,MAB).NE.1) GO TO 5
      DISTAB=0.
      DO 50 I=1,3
      POWAB(2,I) = CENT(I,IA) - CENT(I,IB)*XAND(I,KB,2)
      DO 1510 J=2,MAXALL
 1510 POWAB(J+1,I) = POWAB(J,I)*POWAB(2,I)
   50 DISTAB = DISTAB+POWAB(3,I)
      INDX=1
      JAB= 0
      DO 8 JA=1,NUCA
      JJA=JA+JSTA
      A=ALPHA(JJA)
      DO 8 JB=1,NUCB
      JAB = JAB + 1
      JJB=JB+JSTB
      B=ALPHA(JJB)
      C=A+B
      CINV=1.0/C
      EPSJ=0.25*C
      DEL=0.5*CINV
      AT2=1.0
      TF(1)=1.0
      DO 121 N=2,MAXALL
      TF(N)=TF(N-1)*AT2*DEL
  121 AT2=AT2+2.0
      PIC=PI*CINV
      ROPIC=SQRT(PIC)
      BCI=B*CINV
      ABC=BCI*A*DISTAB
      SAAB= PIC*ROPIC*EXP(-ABC)
      JNDX=INDX
      DO 12 MM=0,NHKTAM
      DO 12 LL=0,NHKTBP
      LM=(LL+MM)/2
      DO 13 KK=0,LM
      TSAV(JNDX+LL+MM-KK-KK)=TSFSTA(JNDX+KK+KK)*RFACT(KK+1)*EPSJ**KK
   13 CONTINUE
   12 JNDX=JNDX+LL+MM+1
      NUM=0
      DO 100 NA=1,KHKTA
      NAN=NANA+NA
      DO 5512 I=1,3
 5512 LMN(I)=NXYZ(NAN,I)
      DO 100 NB=1,KHKTB
      NUM=NUM+1
      NAN=NBNB+NB
      DO 5511 I=1,3
      MNO(I)=NXYZ(NAN,I)
 5511 MAKK(I)=LMN(I)+MNO(I)+1
      SUM=1.0
      DO 140 IJK=1,3
      MM = NXYZ(NANA+NA,IJK)
      LL = NXYZ(NBNB+NB,IJK)
      MMM=(LL+MM)/2+1
      IML=INDX+(MM*NHKTBQ*(MM+NHKTBQ)+LL*(MM+MM+LL+1))/2
      ANS=0.
      DO 1101 KK=1,MMM
      ANS=ANS+TSAV(IML+LL+MM-KK-KK+2)
     ? *POWAB(3+LL+MM-2*KK,IJK)
 1101 CONTINUE
      SUM=SUM*ANS
  140 CONTINUE
      SVEKT(JAB+(NUM-1)*2*NUCAB) = SAAB*SUM
  100 CONTINUE
    8 INDX=INDX+INCR
      DO 150 I=1,MAA
      CALL TRANS (2,CONT,JJRS,SVEKT(1+(I-1)*2*NUCAB),NUC,NRC,ISTO)
      do 150 j=1,mraf
      svekt((i-1)*mraf+j) = svekt((i-1)*2*nucab+j)
  150 CONTINUE
      IF (HARMT)
     $ CALL HARM1(KHKTA,KHKTB,NHKTA,NHKTB,MAA,MRAF,SVEKT,HLP1)
C
C...  FORM SYMMETRY INTEGRALS ....
      ISYM=0
      DO 18 LA=1,MAXLOP
      NUM=0
      DO 19 NA=1,KHKTA
      IF(AND(MULA,EOR(LA,ITYPE(NHKTA,NA))).NE.1) GO TO 19
      DO 20 NB=1,KHKTB
      IF(AND(MULB,EOR(LA,ITYPE(NHKTB,NB))).NE.1) GO TO 20
      ISYM=ISYM+1
      NUN=NUM+NB
      SIGNE=PC(AND(KB,EOR(LA,ITYPE(NHKTB,NB))))
      DO 21 KK=1,MRAF
      SINT(KK+(ISYM-1)*MRAF)=SINT(KK+(ISYM-1)*MRAF)+
     + SIGNE*SVEKT(KK+ISTO+(NUN-1)*mraf)
  21  CONTINUE
C      IF (IA .EQ. 3 .OR. IB .EQ. 3) THEN
   20 CONTINUE
   19 NUM=NUM+KHKTB
   18 CONTINUE
    5 ISAB=ISAB+NUCA*NUCB
C
C...  ORDER SYMMETRY INTEGRALS AND ACCOUNT FOR MULTIPLICITY
      ISYM=0
      DO 27 LA=1,MAXLOP
      DO 37 NA=1,KHKTA
      IF(AND(MULA,EOR(LA,ITYPE(NHKTA,NA))) . NE .1) GO TO 37
      DO 38 NB=1,KHKTB
      IF(AND(MULB,EOR(LA,ITYPE(NHKTB,NB))) . NE . 1) GO TO 38
      ISYM=ISYM+1
      IF(IA.EQ.IB. AND .NA.LT.NB) GO TO 38
      KK=0
      DO 39 K1=1,NRC(1)
      DO 39 K2=1,NRC(2)
      KK=KK+1
      IF(IA.EQ.IB .AND. NA.EQ.NB .AND. K1.LT.K2) GO TO 39
      LBU = DSTRT(LA,NSTRT(IA)+NA) - NRC(1) + K1
      MBU = DSTRT(LA,NSTRT(IB)+NB) - NRC(2) + K2
      LBU = NEWIND(LBU + MSTOLD(LA))
      MBU = NEWIND(MBU + MSTOLD(LA))
      IF(LBU*MBU  .EQ.  0) GO TO 39
      LBU = LBU - MST(LA)
      MBU = MBU - MST(LA)
      NBU = MAX0(LBU,MBU)
      IBUF = NBU*(NBU-3)/2 + LBU + MBU + NPARSU(LA)
      NUT=NUT+1
      SBUF(NUT)=SINT(KK+(ISYM-1)*MRAF) *HKAB
      JBUF(NUT)=IBUF
      IF(IPRINT.GE.500)THEN
       WRITE(6,5000)IBUF,SBUF(NUT)
5000   FORMAT(T5,15X,I5,F20.12)
      ENDIF
      IF(NUT.LT.600) GO TO 39
      WRITE (NTAP) SBUF,JBUF,NUT
      NUT=0
  39  CONTINUE
   38 CONTINUE
   37 CONTINUE
   27 CONTINUE
   40 MIB=MIB+KHKTB
    1 MIA=MIA+KHKTA
      IF (NUT.NE.0) WRITE (NTAP) SBUF,JBUF,NUT
c     print 6655,(sbuf(k), k=1,nut)
 6655 format (10f7.4)
      WRITE (NTAP) SBUF,JBUF,MINUS1
      RETURN
      END

So, if you are application programmer and have the same need for long integers as me, modify
your g77 compiler and enjoy!
If you are compiler developer, please consider fixing the decribed bugs (as well as the ones I did not find yet)
and implementing this feature  in a more clean way as an option to g77.
I hope g95 will have this option, too.

With best regards,

Jiri Pittner
jiri.pittner@jh-inst.cas.cz


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]