PowerPC assembler question

Erik de Castro Lopo mle+cl at mega-nerd.com
Mon Jun 10 21:14:39 EST 2013


Benjamin Herrenschmidt wrote:

> No, this loads a 32-bit value (16-bit would be lhz).

My understanding so far (which may be wrong) is that it loads a
32 bit value but it loads it from a memory location that needs
to be within +/- 32k of the instriction doing the load.

The reason I think this is because when this generated code is
compiled I get the error:

    /tmp/ghc2806_0/ghc2806_1.s:51766:0:
       Error: operand out of range (0x000000000000adf8 is not between
       0xffffffffffff8000 and 0x0000000000007fff)

which suggests a 16 bit offset.
 
Btw, this is code generated by the Glasgow Haskell Compiler (GHC). The
GHC bug is here:

    http://hackage.haskell.org/trac/ghc/ticket/7830


> Note: It's more readable if you use the register names, ie:
> 
> 	lwz	%r30, .label - (1b)(%r31)
> 
> The form of lwz is
> 
> 	lwz	dest_reg, offset(address_reg)
> 
> So it will load a 32-bit value from memory at the address contained in
> r31 offset by ".label - 1b" which is itself the difference between
> two labels, "label", and the first "1:" label before the instruction
> 
> (gcc supports numeric labels that can be referenced with the suffix "b"
> for backward and "f" for forward which are handy for small
> displacements)

Ahh, that would be +/- 32k!

> So for example if 1: was the base of the structure and .label a field
> in the structure, it would load the 32-bit value of that field for the
> structure instance starting at %r31.
> 
> In this case, this looks more like some kind of position-independent
> code though.

That would definitely make sense.

Is there something I could replace this above lwz instruction with
that would work for PIC with offsets greater than +/- 32k?

Cheers,
Erik
-- 
----------------------------------------------------------------------
Erik de Castro Lopo
http://www.mega-nerd.com/


More information about the Linuxppc-dev mailing list