Есть ли простой способ или макрос для загрузки 64-битного адреса в mips64 GPR?

Я хочу загрузить 64-битный адрес в регистр общего назначения MIPS64 (GPR). я могу сделать это по

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]

Но есть ли другой способ сделать это?

Я получил некоторую информацию из этого.

Но я хочу знать, что такое «постоянный пул», как его создать и как получить к нему доступ?


person Chinna    schedule 24.06.2013    source источник


Ответы (1)


"Простой" способ - позволить ассемблеру обрабатывать его с помощью псевдоинструкции dla. Он будет расширяться до чего-то вроде вашего кода:

lui $dst, LabelAddr[63:48]
lui $at, LabelAddr[31:16]
daddiu $dst, $dst, LabelAddr[47:32]
daddiu $at, $at, LabelAddr[15:0]
dsll32 $dst, $dst, 0
daddu $dst, $dst, $at

Пул констант — это область памяти, в которой вы храните свои константы, к которым можно эффективно обращаться. Некоторые ассемблеры и архитектуры имеют специальную поддержку для этого, в других приходится делать что-то вручную. Как указано в ответе на вопрос, который вы связали, вы можете настроить указатель на свой постоянный пул (используя описанный выше метод) и использовать более эффективный доступ для последующих операций.

# load pool base address
    dla $s0, pool
foo:
# just some placeholder
    addu $t0, $t0, $t1
bar:
# load from pool
    ld $a0, pool_foo($s0)
    ld $a1, pool_bar($s0)

.section pool
# macro helper to define a pool entry
.macro ENTRY label
pool_entry_\label\(): .quad \label
.equ pool_\label\(), pool_entry_\label - pool
.endm
ENTRY foo
ENTRY bar
person Jester    schedule 24.06.2013