64 ビット ARM、A64の場合(ARM 64 ビット アーキテクチャのプロシージャ コール標準より)
A64 命令セットから見える 31 個の 64 ビット汎用 (整数) レジスタがあります。これらはr0-r30とラベル付けされています。64 ビットのコンテキストでは、これらのレジスタは通常x0-x30という名前を使用して参照されます。32 ビットのコンテキストでは、レジスタはw0-w30を使用して指定されます。さらに、スタック ポインター レジスターSPは、限られた数の命令で使用できます。
- SPスタックポインタ
- r30 LR リンク レジスタ
- r29 FP フレーム ポインタ
- r19…r28呼び出し先保存レジスタ
- r18必要に応じて、プラットフォーム レジスタ。それ以外の場合は、一時レジスター。
- r17 IP1 2 番目のプロシージャー呼び出し内一時レジスター (呼び出しベニアおよび PLT コードで使用できます)。それ以外の場合は、一時レジスターとして使用できます。
- r16 IP0 最初のイントラプロシージャ コール スクラッチ レジスタ (コール ベニアおよび PLT コードで使用できます)。それ以外の場合は、一時レジスターとして使用できます。
- r9…r15一時レジスタ
- r8間接結果格納レジスタ
- r0…r7パラメータ/結果レジスタ
最初の 8 つのレジスタr0 ~ r7は、引数値をサブルーチンに渡し、関数から結果値を返すために使用されます。また、ルーチン内で中間値を保持するために使用することもできます (ただし、一般的には、サブルーチン呼び出し間のみ)。
レジスタr16 (IP0)とr17 (IP1)は、リンカによって、ルーチンとそれが呼び出すサブルーチンの間のスクラッチ レジスタとして使用できます。また、サブルーチン呼び出し間の中間値を保持するために、ルーチン内で使用することもできます。
レジスタr18の役割はプラットフォーム固有です。プラットフォーム ABI で、プロシージャ間の状態 (スレッド コンテキストなど) を運ぶ専用の汎用レジスタが必要な場合は、その目的のためにこのレジスタを使用する必要があります。プラットフォーム ABI にそのような要件がない場合は、追加の一時レジスタとして r18 を使用する必要があります。プラットフォーム ABI 仕様は、このレジスターの使用法を文書化する必要があります。
SIMD
ARM 64 ビット アーキテクチャには、さらに 32 個のレジスタv0-v31があり、SIMD および浮動小数点演算で使用できます。レジスタの正確な名前は、アクセスのサイズを示すように変更されます。
注: AArch32 とは異なり、AArch64 では、SIMD および浮動小数点レジスタの 128 ビットおよび 64 ビット ビューは、より狭いビューで複数のレジスタをオーバーラップしないため、q1、d1、および s1 はすべてレジスタ内の同じエントリを参照します。銀行。
最初の 8 つのレジスタv0-v7は、引数値をサブルーチンに渡し、関数から結果値を返すために使用されます。また、ルーチン内で中間値を保持するために使用することもできます (ただし、一般的には、サブルーチン呼び出し間のみ)。
レジスタv8 ~ v15は、サブルーチン呼び出し間で呼び出し先によって保持される必要があります。残りのレジスター ( v0-v7、v16-v31 ) は保持する必要はありません (または呼び出し元が保持する必要があります)。さらに、 v8 ~ v15に格納されている各値の下位 64 ビットのみを保持する必要があります。より大きな値を保持するのは呼び出し元の責任です。