Any decent Fortrans under Unix ? Which machine ?
Chris Torek
chris at umcp-cs.UUCP
Fri Mar 14 08:29:34 AEST 1986
[I have removed net.lang.f77 from the newsgroups list since this
is no longer directly related to Fortran.]
In article <208 at goanna.OZ> rcodi at goanna.UUCP writes:
>It would be nice if {ccom, f77pass1, pc0} all skipped the phases of
>generating assembly language text, and just produced a load-file
>straight from the source.
In terms of speed, at any rate, it would be nice. But I am one of
those strange people who on occasion likes to inspect the output
of the compiler, both before and after peephole optimisation.
>Poor pc users are stuck with the following [sequence]: cpp, pc0,
>pc1 (f1), pc2, c2, pc3, as, ld.
The Pascal compiler does not use the C preprocessor. The rest of the
chain is accurate.
>Even nicer if cpp was built into the input parser of ... the
>compilers (but still have it as a separate package too).
And therein lies a problem. This kind of thing can get to be
a maintenance nightmare. (It *can* be done, and it is quite
arguably worthwhile for something as heavily used as a compiler
on a development system. But *I* do not want to do it.)
>I tend to disagree with the philosophy of just using registers R0 and
>R1 for calculations, and assigning the rest for register variables.
*That* sounds like VMS. The Vax Unix compilers uses r0-r5 as
scratch (for the perhaps peculiar reason that certain Vax instructions
clobber these registers).
>ALL intermediate results in calculations should be cached in
>registers.
If you want a good optimising compiler, any expressions that
are reused should be so cached. But saving all intermediate
results is not always optimal.
>I have looked at a lot of assembly code produced by various ports
>of UNIX C compilers and noted that there is little or no attempt
>to "carry over" intermediate results from C statement to C statement.
>The same goes for f77 and pc.
In C, this is often not a problem. In the other languages, it is;
this is why the 4.3 f77 has a huge front end optimiser.
>What does YOUR compiler generate for the following C code?
> a = z[i,j,k];
> b = z[i,j,k];
Given the following declarations:
int z[N];
f() { register int i, j, k, a, b; ...
it gives
movl _z[r9],r8
movl _z[r9],r7
Now, while the second statement might be a bit faster if it used
`movl r8,r7', it probably makes no noticeable difference. But I
suspect you meant
a = z[i][j][k];
b = z[i][j][k];
which of course requires much more work. But as an `experienced'
C programmer, I would write
a = b = z[i][j][k];
which (given `int z[2][3][4]') generates
mull3 $48,r11,r0
addl2 $_z,r0
ashl $4,r10,r1
addl2 r1,r0
ashl $2,r9,r1
addl2 r1,r0
movl (r0),r7
movl r7,r8
which is not after all too awful. (Better might be
# not sure if this 3 ins seq is faster than mull3
ashl $4,r11,r0 # r0 = x16
ashl $1,r0,r1 # r1 = x32
addl2 r1,r0 # r0 = x48
# this here is all the same as before
addl2 $_z,r0
ashl $4,r10,r1
addl2 r1,r0
# this next one is the real `win', use fancy addr
# modes to get *(r0 + 4*r9)
movl r0[r9],r7
movl r7,r8
A true Vax assembly hacker may well know of even better tricks.)
Anyway, the point of all this is that C often does not require
an optimising compiler. Not that I have anything against them;
indeed, I like optimising compilers, but I can make do without
them.
--
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 1415)
UUCP: seismo!umcp-cs!chris
CSNet: chris at umcp-cs ARPA: chris at mimsy.umd.edu
More information about the Comp.unix.wizards
mailing list