Related articles |
---|
LDD/STD Optimizations pardo@cs.washington.edu (1992-03-03) |
Re: LDD and STD on RISC rcg@lpi.liant.com (1992-03-09) |
Newsgroups: | comp.compilers |
From: | rcg@lpi.liant.com (Rick Gorton) |
Keywords: | optimize, sparc |
Organization: | Compilers Central |
References: | 92-03-018 |
Date: | Mon, 9 Mar 1992 20:30:35 GMT |
Preston Briggs (preston@dawn.cs.rice.edu) writes:
>[LDD & STD a mistake for RISC machines: compilers can't generate 'em.]
David Keppel (pardo@cs.washington.edu) write:
>I expect if you have lots of fp values and ldd and std are used for
>floating-point values then you don't need any more justification for
>having ldd and std. Of course most RISC machines load and store fp regs
>using different load and store instructions.
>...
>The compiler can also use `ldd' and `std' to advantage when doing spills
>and restores for both calle-save and caller-save registers (in general for
>any spills and restores). Easiest is to do register allocation the normal
>way, then do trivial register renaming to get the registers in adjacent
>pairs. The stack spill slots need to be renamed and possibly realigned;
>that ``should'' be straightforward. DECstation (MIPS) compilers already
>do such an optimization some of the time. Putting spills and restores in
>adjacent memory locations also improves caching.
And in fact, there are some other tricks which can be done:
On some RISC machines, (I'll stick to SPARC, since that was the originally
cited architecture) LDD and STD require that the memory locations being
accessed are 0 mod 8 (quadword) aligned, and that the first register of
the pair is an even numbered register. Combine this with the fact that
%fp and %sp are ALWAYS 0 mod 8 valued, one can transform the following
LD/ST sequences:
(Presuming that offset1 is 0 mod 8 valued, and <n> even).
LD [%fp+offset1], %R(n) LD [%fp+0x8], %l0
LD [%fp+offset1+4], %R(n+1) LD [%fp+0xC], %l1
ST %R(n), [%fp+offset1] ST %g2, [%fp+0x8]
ST %R(n+1), [%fp+offset1] ST %g3, [%fp+0xC]
become
LDD [%fp+offset1], %R(n) LDD [%fp+0x8], %l0
STD [%fp+offset1], %R(n) STD [%fp+0x8], %g2
Thus, even if %fp+0x8 and %fp+0xC contain different variables, LD/LD can
be replaced by LDD. This actually happens only rarely, unless an
optimization like the MIPS one described above is happening, or there is
some inherent datatype in the compiler which uses pairs of integer
registers, like INTEGER*8 in FORTRAN, or PIC 9(18) (I think this is the
syntax) in COBOL.
Richard Gorton rcg@lpi.liant.com (508) 626-0006
Liant Software Corp. Framingham, MA 01760 USA
Project leader: LPI-BASIC, LPI-FORTRAN, LPI-Pascal, LPI-PL/I
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.