システム・リンケージ規約は、使用可能な多数のレジスターを利用します。
リンケージ規約では、引き数を GPR と FPR の両方に入れて渡します。
2 つの固定リスト R3-R10 および FP1-FP13 は、引き数の引き渡しに使用可能な GPR および FPR を指定します。
使用可能な引き数 GPR および FPR よりも多くの引き数ワードがある場合は、残りのワードはスタックの
ストレージに入れて渡されます。
ストレージ内の値は、レジスター内の場合と同一です。
64 ビット環境では、
パラメーター域のサイズは、スタック・フレームに関連付けられている
プロシージャーからの呼び出しステートメントで渡されるすべての引き数を入れられるだけの大きさがあります。
特定の呼び出しのための引き数がすべてストレージに実際に現れるわけではありませんが、各引き数が 1 つ以上の
ワードを占有し、この区域内にリストを作成すると考えるとわかりやすくなります。
参照による呼び出し (Fortran ではデフォルトの場合のように) では、引き数のアドレスはレジスターに入れて
渡されます。
以下の情報は、%VAL が使用される時の C または Fortran の場合と同じように、値による呼び出しのことを
述べています。
リスト内に現れるようにするために、引き数は浮動小数点値または非浮動小数点値として分類されます。
|
---|
32 ビット環境の場合
- 個々の INTEGER(8) および LOGICAL(8) 引き数には、2 つのワードが必要です。
- 組み込み型のその他の非浮動小数点スカラー引き数または
プロシージャー/関数ポインターは、1 ワードを必要とし、GPR に現れるのとまったく同じように
そのワードに現れます。
これは、言語のセマンティクスが指定されている場合、符号付きまたは符号なしで拡張され、ワード境界に合わせられます。
- 個々の単精度 (REAL(4)) 値は 1 ワードを占有します。
個々の倍精度 (REAL(8)) 値はリスト内で 2 つの連続ワードを占有します。
個々の倍精度 (REAL(16)) 値はリスト内で 2 つの連続ワードを占有します。
- COMPLEX 値は、同じ kind 型付きパラメーターを持つ REAL 値の 2 倍のワードを占有します。
- Fortran および C では、構造体値は「参照による値」で渡されます。
つまり、コンパイラーは構造体のコピーのアドレスを実際に渡します。
|
64 ビット環境の場合 |
---|
- すべての非浮動小数点の値には、ダブルワード境界の合わせられた 1 つのダブルワードが必要です。
- 個々の単精度 (REAL(4)) 値と個々の倍精度 (REAL(8)) 値はリスト内で 1 つの
ダブルワードを占有します。
個々の拡張精度 (REAL(16)) 値はリスト内で 2 つの連続ダブルワードを占有します。
- COMPLEX 値は、同じ kind 型付きパラメーターを持つ REAL 値の 2 倍のダブルワードを
占有します。
- Fortran および C では、構造体はストレージ内にあるとおりに連続ワードに現れて (ストレージ内のどこに
あっても) すべての適切な境界合わせの要件を満たします。
構造体はダブルワードに境界を合わせられ、(sizeof(struct X)+7)/8 ダブルワードを占有します
(終わりに埋め込みされます)。
1 ダブルワードよりも小さい構造体は、そのダブルワードまたはレジスター内で左寄せされます。
1 ワードよりも大きい構造体は複数のレジスターを占有することができ、一部はストレージに一部はレジスターに
入れられて渡される場合があります。
- Pascal レコードなどにあるその他の集合値は、「参照による値」で渡されます。
つまり、コンパイラーは実際にそれらのアドレスを渡して、呼び出されたプログラム内にコピーが作成されるようにします。
- プロシージャーまたは関数ポインターは、ルーチンの関数記述子を指し示すポインターとして渡されます。
その最初のワードには、入り口ポインターのアドレスが含まれています。
(詳細は、関数を指し示すポインターを参照)
|
以下の図から、次のような規則を理解できます。
- 32 ビット環境では、呼び出される関数の引き数は GPR および FPR で渡されます。
8 つまでのワードは GPR3-GPR10 で渡され、8 つまでの浮動小数点引き数は FPR1-FPR8 で渡されます。
それより少ない引き数が渡される場合、不要なレジスターはロードされません。
渡された引き数がレジスターに入らない場合、レジスターに入らなかった引き数を保持するためのスペースのみが
スタック・フレーム内で割り振られます。
- 64 ビット環境では、
呼び出されたプロシージャーがストレージの連続部分として
パラメーター・リストを扱う場合 (たとえば、パラメーターのアドレスが C で使用される場合)、
パラメーター・レジスターは、パラメーター・レジスター用に予約されている、スタック内のスペースに保管されます。
- レジスター・イメージは、スタック上に保管されます。
- 64 ビット環境では、引き数域
(P1...Pn) には、最大のパラメーター・リストを
保持できるだけの十分な大きさが必要です。
関数への呼び出しの例を次に挙げます。
f(%val(l1), %val(l2), %val(l3), %val(l4), %val(l5), %val(l6), %val(l7),
%val(d1), %val(f1), %val(c1), %val(d2), %val(s1), %val(cx2))
上記の意味は次のとおりです。
- l integer(4) (フルワードの整数) を示します。
- d real(8) (倍精度) を示します。
- f real(4) (実数) を示します。
- s integer(2) (ハーフワード整数) を示します。
- c character (1 文字) を示します。
- cx complex(8) (倍精度複素数) を示します。
図 4. 32 ビット環境でのスタック上のパラメーター域のストレージのマッピング

図 5. 64 ビット環境でのスタック上のパラメーター域のストレージのマッピング

引き数リストは以下の順序で作成します。
同一の中黒内の項目は、呼び出しで引き数キーワードが使用されてもされなくても、
プロシージャー宣言の場合と同じ順序で現れます。
- 実引き数4 のすべてのアドレスまたは値 (もしくはその両方)
- 値によって渡されるオプションの引き数の「現在の」標識
- ストリング用の引き数の長さ4
脚注:
- 4
-
Fortran-Fortran 呼び出しの間、このリストに別の項目がある場合もありますが、
このセクションの呼び出し規則に従っている Fortran 以外のプロシージャーには
見えません。
