• Maciej W. Rozycki's avatar
    MIPS: LD/SD o32 macro GAS fix update · 82b89152
    Maciej W. Rozycki authored
    I am about to commit:
    
    http://sourceware.org/ml/binutils/2010-10/msg00033.html
    
    that fixes a problem with the LD/SD macro currently implemented by GAS for
    the o32 ABI in an inconsistent way.  This is best illustrated with a
    simple program, which I'm copying here from the message above for easier
    reference:
    
    $ cat ld.s
    	ld	$5,32767($4)
    	ld	$5,32768($4)
    
    This gets assebled into the following output:
    
    $ mips-linux-as -32 -mips3 -o ld.o ld.s
    $ mips-linux-objdump -d ld.o
    
    ld.o:     file format elf32-tradbigmips
    
    Disassembly of section .text:
    
    00000000 <.text>:
       0:	dc857fff 	ld	a1,32767(a0)
       4:	3c010001 	lui	at,0x1
       8:	00810821 	addu	at,a0,at
       c:	8c258000 	lw	a1,-32768(at)
      10:	8c268004 	lw	a2,-32764(at)
    	...
    
    Oops!
    
     The GAS fix makes the macro behave in a consistent way and pairs of LW/SW
    instructions to be output as appropriate regardless of the size of the
    offset associated with the address used.  The machine instruction is still
    available, but to reach it macros have to be disabled first.  This has a
    side effect of requiring the use of a machine-addressable memory operand.
    
     As some platforms require 64-bit operations for accesses to some I/O
    registers LD/SD instructions are used in a couple of places in Linux
    regardless of the ABI selected.  Here's a fix for some pieces of code
    affected I've been able to track down.  The fix should be backwards
    compatible with all supported binutils releases in existence and can be
    used as a reference for any other places or off-tree code.  The use of the
    "R" constraint guarantees a machine-addressable operand.
    Signed-off-by: default avatarMaciej W. Rozycki <macro@linux-mips.org>
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/1680/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    82b89152
io.h 18.6 KB