remym@tekig5.UUCP (02/04/87)
I have noticed something strange regarding MS FORTRAN's (v2.2) handling
of REAL*8 FUNCTIONS. i.e. The compiler *seems* to generate bad code from
my examination of the assembly listings of the program.
I have included a sample pgm. to test the real*8 function call. I have
yet to make this call work w/ MS FORTRAN although I did verify the code
worked on another computer. (In fact, the original code that I was
working on was tested on two other computers and found to be right on both
of those. Only on the Mac did I have problems.)
If some kind soul could verify my results or, better, tell me what I did
wrong w.r.t. the MS compiler, I would appreciate an e-mail reply. If you
do verify this strange behaviour and would like to talk to MS, their
product support number is: (206)-882-8089.
Yours truly,
A. Remy Malan
ph: (503)-627-4184
----------------------------------------------------
Here is the code (assembly fragment follows source):
C
C TEST PROGRAM FOR STRANGE BEHAVIOUR IN
C MS FORTRAN V2.2
C WRITTEN BY A. REMY MALAN 2/4/87
C
PROGRAM TEST
REAL*8 SUM
C
C USE THE ASSEMBLY LISTING OPTION TO EXAMINE THE ASM
C CODE FOR THE NEXT FORTRAN LINE. I SAW A "JSR 140(A4)"
C WHICH IS CONVERT SINGLE TO DOUBLE! THAT
C MAKES IT SEEM THAT THE COMPILER THINKS THAT FOOB()
C IS A REAL*4 WHEN IN FACT IT IS DECLARED AS REAL*8!
C
SUM = FOOB()
C
C
PRINT *, 'TEST: SUM = ',SUM
PRINT *, 'HIT <CR> TO QUIT...'
PAUSE
STOP
END
REAL*8 FUNCTION FOOB()
REAL*8 P
P = 25.0D+00
PRINT *, 'FOOB: P = ',P
FOOB=P
RETURN
END
--------- end of FORTRAN ---------
Here is the assembler listing for the "sum=foob()" line:
Note the "jsr 140(a4)" line! This, according to the manual,
is an intrinsic function call, CVTFL.
; SUM = FOOB()
MOVE.L #.FOOB-L00003,D1
L00003: JSR L00003(PC,D1.L)
MOVEA.L A7,A3
JSR 140(A4) ;This is convert single to double! - ARM
MOVEM.L D0/D1,(A3)
--------- end of ASM fragment ---------