Loading an address in MIPS64

This is probably a simple, obvious thing I'm just not seeing, but how do I load an address in a MIPS64 processor? In a MIPS32 processor the following assembler pseudo-instruction:

la $at, LabelAddr

Expands into:

lui $at, LabelAddr[31:16]
ori $at,$at, LabelAddr[15:0]

Looking at the MIPS64 instruction set, I see that lui still loads a 16-bit immediate into the upper half of a 32-bit word. There doesn't appear to be any kind of expanded instruction that loads an immediate anywhere into the upper area of a 64-bit word. This seems, then, that to do the equivalent of an la pseudo-instruction I'd need to expand into code something like:

lui $at, LabelAddr[63:48]
ori $at, $at, LabelAddr[47:32]
sll $at, 16
ori $at, $at, LabelAddr[31:16]
sll $at, 16
ori $at, $at, LabelAddr[15:0]

This strikes me as a bit ... convoluted for something as basic as loading an address so it leaves me convinced that I've overlooked something.

What is it I've overlooked (if anything)?


I think if you need to load a lot of constants, you should put it in a constant pool (AKA "literal pool") and then load it by a ld instructions.

For example: $s0 contains the pool's base address, and the constant you want to load is add offset 48, you can load it to $t1 by the instruction ld $t1, 48($s0)

This technique is very common in ARM, where the instructions can only load a 12 bit immediate. And it is used in Java too.

I just know basic MIPS32 so may be the instruction syntax is not very correct, but that's the idea.


edit: there's an example here


address so it leaves me convinced that I've overlooked something. What is it I've overlooked (if anything)?

What you are missing is that even in Mips64 the instruction size stays 32bit (4bytes) . In this 32bit machine code encoding system, The 'la' translated to 'lui' + 'ori' combination can handle a max of 32 bit value (address). There are not enough bits in the 4byte machine instruction to easily encode a 64bit address. To deal with 64bit address, more iterations of the same (lui+ori) is used along with shifts (dsll).

Paxym

链接地址: http://www.djcxy.com/p/3194.html

上一篇: 字母O被认为有害?

下一篇: 在MIPS64中加载地址