6

aarch64 アーキテクチャには、複数のストアとロードの命令がありません。つまり、armv7 arch の stm と ldm に相当するものはありません。代わりに、レジスタのペアをストアおよびロードするために stp および ldp 命令を使用する必要があります。

ARMリファレンスマニュアルによると:

http://www.element14.com/community/servlet/JiveServlet/previewBody/41836-102-1-229511/ARM.Reference_Manual.pdf

複数レジスタの LDM、STM、PUSH、および POP 命令はありませんが、レジスタの非連続ペアのロードストアが利用可能です。

私の質問は、不連続とは何を意味するか、ここで言及しているのかということです。私の即時の反応は、これらのコマンドで連続番号のレジスタを使用できないことを意味するということでした。

stp x0, x1, [sp, #-16]!

違法です。しかし、私はこれが事実だとは思いません。私はこれを正確に行うサンプルコードを見てきました.さらに、(Appleの)Clangで同様のコードを生成することができました.

stp x1, x0, [fp, #-16]!

私は一生、連続が何を意味するのか考えることができません。重複するレジスタを使用することと関係があると思いました。

stp x0, x0, [sp, #-16]!
stp w0, x0, [sp, #-12]!

ただし、このようなことを行うサンプル コードも見てきました (コードが正しかったとは言いません!)。また、これが事実である場合、隣接するのではなく重複する用語を明示的に使用したでしょう。

何か案は?

4

1 に答える 1

15

LDRDこれは主に、A32 (ARM) /STRD命令*との対比を際立たせています。これは、レジスタの連続したペアのみをロードでき、その最下位レジスタは偶数番号でなければなりません。つまり、次のようになります。

LDRD r0, r1, [sp]   @ OK
LDRD r0, r7, [sp]   @ <Rt> and <Rt2> are non-contiguous: invalid
LDRD r3, r4, [sp]   @ Contiguous but <Rt> odd-numbered: invalid

[これは、命令内の 1 つのターゲット レジスタをエンコードするスペースしかないため、アーキテクチャには 2 番目のターゲット レジスタを推論する定義済みの方法が必要です。]

対照的に、A64 LDP/STPエンコーディングには 2 つのターゲット レジスタをエンコードする余地があります。つまり、任意の 2 つのレジスタを任意の順序で指定できます。つまり、連続していなくてもかまいません。これは制限ではなく許可です

その特定のドキュメントは、完全なARMv8 ARMのリリース以来廃止されていることに注意してください。これには、あいまいさが少し少なくなるはずの適切な詳細な命令ページがあります。

* T32 (Thumb) エンコーディングにはこの制限がありません。これは、条件述語がないということは、A64 と同様に、2 番目のターゲット レジスタをエンコードするスペースがあることを意味するためです。

于 2014-08-08T09:07:03.330 に答える