7

これはおそらく私が見ているのではない単純で明白なことですが、MIPS64プロセッサにアドレスをロードするにはどうすればよいですか?MIPS32プロセッサでは、次のアセンブラ疑似命令:

la $at, LabelAddr

に展開:

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

MIPS64命令セットを見るとlui、32ビットワードの上半分に16ビットのイミディエートがロードされていることがわかります。64ビットワードの上部領域にすぐにロードするような拡張命令はないようです。したがって、これは、la疑似命令と同等のことを行うために、次のようなコードに拡張する必要があるようです。

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]

これは私を少し驚かせます...アドレスをロードするのと同じくらい基本的な何かのために複雑なので、私は何かを見落としていると確信します。

私が見落としているのは何ですか(もしあれば)?

4

2 に答える 2

3

多くの定数をロードする必要がある場合は、現在のコードの近くの定数プール(別名「リテラル プール」 ) に入れてから、命令でロードする必要があると思いますld

例:プールのベースアドレスが含まれており、ロードする定数がオフセット 48 にある場合、次の命令$s0でロードできます。$t1ld $t1, 48($s0)

この手法は、命令が 12 ビットの即値のみをロードできるARMで非常に一般的です (ARM の新しいバージョンのみが、いくつかの制限付きで 16 ビットの即値をロードできます)。そしてJavaでも使われています。

ただし、どういうわけか、MIPS コンパイラは常に複数の命令を生成して 64 ビットの immediate をロードします。たとえば、MIPS gcc で 0xfedcba0987654321 をロードするには

    li      $2,-9568256       # 0xffffffffff6e0000
    daddiu  $2,$2,23813
    dsll    $2,$2,17
    daddiu  $2,$2,-30875
    dsll    $2,$2,16
    daddiu  $2,$2,17185

他の多くの RISC アーキテクチャには、イミディエイトをロードするためのより効率的な方法があるため、必要な命令は少なくて済みますが、それでも少なくとも 4 つの命令が必要です。これらの場合、命令キャッシュのコストがデータ キャッシュのコストよりも低いか、誰かがそのアイデアを好まないだけかもしれません。

これは、MIPS の手書きの定数プールの例です。

# 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

MIPS コンパイラにリテラル プールを発行するよう説得することはできませんでしたが、ARM でコンパイラが生成した例を次に示します。

于 2011-06-28T14:10:25.807 に答える
0

住所なので、何かを見落としていると確信できます。私が見落としているのは何ですか(もしあれば)?

あなたが見逃しているのは、Mips64 でも命令サイズが 32 ビット (4 バイト)のままであることです。この 32 ビット マシン コード エンコーディング システムでは、「la」を「lui」+「ori」の組み合わせに変換すると、最大 32 ビットの値 (アドレス) を処理できます。4 バイトの機械語命令には、64 ビット アドレスを簡単にエンコードするのに十分なビットがありません。64 ビット アドレスを処理するために、同じ (lui+ori) の反復をシフト (dsll) と共に使用します。

パキシム

于 2016-07-22T02:30:01.513 に答える