Subject: m68k gas optimisation
To: None <tech-toolchain@netbsd.org>
From: Gregory McGarry <g.mcgarry@ieee.org>
List: tech-toolchain
Date: 02/06/2002 11:27:48
Sometime between about 2001/12/15 and 2002/01/15 a flag
was enabled in binutils to permit gas to optimise memory
access into pc-relative addressing on m68k.  This
breaks on the NetBSD/hp300 kernel when it is running
without the MMU on and we are manually relocating
addresses.

Obviously we don't have to manually relocate addresses
if they are pc-relative.  I don't want to change the code
to assume pc-relative addressing, since it will break with
older binutils.  So is there an assembler directive
to tell gas I don't want it to do this?

MMU trampoline loading from sys/arch/hp300/hp300/locore.s:

#define _RELOC(var, ar)         \
        lea     var,ar;         \
        addl    %a5,ar
#define ASRELOC(var, ar)        _RELOC(_ASM_LABEL(var), ar)

Lstploaddone:
        lea     MAXADDR,%a2             | PA of last RAM page
        ASRELOC(Lhighcode, %a1)         | addr of high code
        ASRELOC(Lehighcode, %a3)        | end addr
Lcodecopy:
        movw    %a1@+,%a2@+             | copy a word
        cmpl    %a3,%a1                 | done yet?
        jcs     Lcodecopy               | no, keep going
        jmp     MAXADDR                 | go for it!

        /*
         * BEGIN MMU TRAMPOLINE.  This section of code is not
         * executed in-place.  It's copied to the last page
         * of RAM (mapped va == pa) and executed there.
         */

Lhighcode:


Used to generate (about mid December):

0000176e <Lstploaddone>:
    176e:       45f8 f000       lea fffff000 <_end+0xfff245b8>,%a2
    1772:       43f9 0000 178c  lea 178c <Lhighcode>,%a1
    1778:       d3cd            addal %a5,%a1
    177a:       47f9 0000 1826  lea 1826 <Lehighcode>,%a3
    1780:       d7cd            addal %a5,%a3

00001782 <Lcodecopy>:
    1782:       34d9            movew %a1@+,%a2@+
    1784:       b3cb            cmpal %a3,%a1
    1786:       65fa            bcss 1782 <Lcodecopy>
    1788:       4ef8 f000       jmp fffff000 <_end+0xfff245b8>


Now generates: 

0000176e <Lstploaddone>:
    176e:       45f8 f000       lea fffff000 <_end+0xfff24568>,%a2
    1772:       43fa 0014       lea %pc@(1788 <Lhighcode>),%a1
    1776:       d3cd            addal %a5,%a1
    1778:       47fa 00a2       lea %pc@(181c <Lehighcode>),%a3
    177c:       d7cd            addal %a5,%a3

0000177e <Lcodecopy>:
    177e:       34d9            movew %a1@+,%a2@+
    1780:       b3cb            cmpal %a3,%a1
    1782:       65fa            bcss 177e <Lcodecopy>
    1784:       4ef8 f000       jmp fffff000 <_end+0xfff24568>

	-- Gregory McGarry <g.mcgarry@ieee.org>