パラメーター渡し
最初の 4 個の整数引数は、レジスタに渡されます。整数値は RCX、RDX、R8、および R9 に (左から右の順序で) 渡されます。引数は、スタック上で 5 以上渡されます。すべての引数は、レジスタで右揃えされます。これにより、呼び出し先は必要に応じてレジスタの上位ビットを無視し、レジスタの必要な部分にのみアクセスできます。
浮動小数点引数および倍精度引数は、整数スロット (RCX、RDX、R8、および R9) と共に XMM0 ~ XMM3 (最大 4 個) に渡されます。通常、そのカーディナル スロットを無視して、代わりに整数スロットを使用したり (例を参照)、反対に、整数スロットの代わりにカーディナル スロットを使用したりします。
__m128 の型、配列、および文字列は、直接の値が渡されませんがなく、ポインターは、呼び出し元が割り当てたメモリに渡されます。同じサイズの整数のように、サイズ 8、16、32、または 64 bit および__m64 の構造体または共用体が渡されます。これらのサイズ以外の構造体または共用体は、呼び出し元が割り当てたメモリにポインターとして渡されます。ポインターとして渡されるこれらの集約型 (__m128 など) の場合、呼び出し元が割り当てた一時メモリは、16 バイトでアライメントされます。
スタック領域の割り当てや、他の関数の呼び出しを行わない組み込み関数は、コンパイラと組み込み関数の実装の間に強力なバインディングが存在するため、他の揮発性レジスタを使用して追加のレジスタ引数を渡すことができます。これによって、パフォーマンスが向上する場合があります。
呼び出し先は、必要に応じてレジスタ パラメーターをそのシャドウ領域にダンプする必要があります。
パラメーター渡しの方法の概要を次の表に示します。
パラメーターの型 |
パラメーター渡しの方法 |
---|---|
浮動小数点数 |
最初の 4 つのパラメーター – XMM0 ~ XMM3。それ以外のパラメーターはスタックに渡されます。 |
Integer (整数型) |
最初の 4 つのパラメーター – RCX、RDX、R8、R9。それ以外のパラメーターはスタックに渡されます。 |
集約 (8、16、32、または 64 ビット) および __m64 |
最初の 4 つのパラメーター – RCX、RDX、R8、R9。それ以外のパラメーターはスタックに渡されます。 |
集約 (その他) |
ポインターによって渡されます。最初の 4 つのパラメーターは RCX、RDX、R8、R9 にポインターとして渡されます。 |
__m128 |
ポインターによって渡されます。最初の 4 つのパラメーターは RCX、RDX、R8、R9 にポインターとして渡されます。 |
引数渡しの例 1 – すべて整数
func1(int a, int b, int c, int d, int e);
// a in RCX, b in RDX, c in R8, d in R9, e pushed on stack
引数渡しの例 2 – すべて浮動小数点数
func2(float a, double b, float c, double d, float e);
// a in XMM0, b in XMM1, c in XMM2, d in XMM3, e pushed on stack
引数渡しの例 3 – 整数値と浮動小数点値の混合
func3(int a, double b, int c, float d);
// a in RCX, b in XMM1, c in R8, d in XMM3
引数渡しの例 4 – __m64、__m128、および集約
func4(__m64 a, _m128 b, struct c, float d);
// a in RCX, ptr to b in RDX, ptr to c in R8, d in XMM3