表 2-1 OpenVMS の呼び出し規則の変更点
データ・モデル
|
OpenVMS Alpha は,使用されているデータ・モデルに関して意図的にあいまいになっています。多くのプログラムは ILP32 モデルであるかのようにコンパイルされますが,システムの大部分は P64 または LP64 モデルを使用しているかのように動作します。整数の符号拡張規則は,このデータ・モデルの透過性を向上または低下させるのに重要な役割を果たします。 Itanium アーキテクチャの規則では純粋な LP64 データ・モデルが定義されていますが, OpenVMS I64 では上記の属性を維持しています。
|
データを表す用語
|
OpenVMS I64 のこの規則では,
ワードは 2 バイト,
クォドワードは 8 バイトを表します。一方, Itanium の用語では,
ワードは 4 バイト,
クォドワードは 16 バイトを表します。
|
汎用レジスタの使用
|
汎用レジスタは,整数演算,VAX 浮動小数点エミュレーションの一部,およびその他の汎用演算に使用されます。 OpenVMS は,これらのレジスタをこれまでと同じように使用しますが (デフォルト),以下の例外があります。
- R8 と R9 に戻り値が格納されます。
- R10 と R11 はスクラッチ・レジスタとして使用され,値を返すためには使用されません。
- R25 は AI (引数情報) レジスタとして使用されます。
|
浮動小数点レジスタの使用
|
浮動小数点レジスタは,浮動小数点演算, VAX 浮動小数点エミュレーションの一部,特定の整数演算で使用されます。 OpenVMS は,これらのレジスタに対して同じ規則を使用しますが (デフォルトの動作),以下の例外があります。
- F8 と F9 に戻り値が格納されます。
- F10 〜 F15 はスクラッチ・レジスタとして使用され,値を返すためには使用されません。
|
引数の受け渡し
|
OpenVMS の引数の受け渡しは, Itanium の規則とほぼ同じです。ただし,OpenVMS 規則での以下の相違点に注意してください。
- OpenVMS 規則には,AI (引数情報) レジスタが追加されています (引数の数およびデータ・タイプに関する情報用)。
- 引数は汎用レジスタにも浮動小数点レジスタにもコピーされません。
- レジスタを介して受け渡される引数の場合,最初の引数は最初の汎用レジスタ・スロット (R32) または最初の浮動小数点レジスタ・スロット (F16) に渡され, 2 番目の引数は 2 番目の汎用レジスタ・スロット (R33) または 2 番目の浮動小数点レジスタ・スロット (F17) に渡されます。以下も同様です。浮動小数点引数が使用可能な浮動小数点レジスタにパックされることはなく,引数は最大 8 つまで,レジスタを介して受け渡されます。
- 汎用レジスタを介して受け渡される引数の場合, 32 ビット値は,ビット 31 をコピーすることで,完全な 64 ビットのパラメータ・スロットに符号拡張されます (符号なしデータ・タイプの場合も同様)。
- 64 ビットより大きな引数の場合,偶数スロット・アラインメントは行われません。
- 一般に,HFA (homogeneous floating-point aggregate) に対する特別な処理は行われません。
- OpenVMS では,__float128 の値渡しであっても,参照渡しとして実装されています。
- OpenVMS では,リトル・エンディアン表現だけがサポートされます。
- OpenVMS では,下位互換性を維持するために, F_floating (32 ビット),D_floating (64 ビット),および G_floating (64 ビット) の 3 つの VAX 浮動小数点データ・タイプが追加サポートされます。これらのデータ・タイプの値は,汎用レジスタを使用して渡されます。
|
戻り値
|
最大 16 バイトまでの戻り値は,レジスタを介して呼び出し元に返すことができます。それより大きな戻り値は,最初または 2 番目のパラメータ・スロットを使用して,
隠し引数方式で返されます。
|
表 2-2 OpenVMS 呼び出し規則の拡張
浮動小数点データ・タイプ
|
OpenVMS の呼び出し規則では, VAX および Alpha システムでサポートされていた VAX F_floating (32 ビット),D_floating (64 ビット), G_floating (64 ビット) データ・タイプがサポートされます。 Itanium アーキテクチャの 80 ビット倍精度拡張浮動小数点データ・タイプはサポートされません。
|
VAX 互換のレコード・レイアウト
|
OpenVMS の呼び出し規則では,ユーザ・オプションとして VAX 互換のレコード・レイアウトが追加されています。
|
リンケージ・オプション
|
OpenVMS では,汎用レジスタを入力や出力,グローバル・レジスタ,その他の目的で使用する際に,柔軟性とユーザの制御機能を向上することができます。
|
メモリ・スタック・オーバーフローのチェック
|
OpenVMS では,メモリ・スタック・オーバーフローのチェック方法が定義されています。
|
関数記述子
|
OpenVMS では,バインドされたプロシージャ値や変換されたイメージのサポートのために,関数記述子の拡張形式を定義して追加機能をサポートしています。
|
アンワインド情報
|
OpenVMS では,オペレーティング・システム固有のデータ領域が Itanium アーキテクチャのアンワインド情報ブロックに追加されています。オペレーティング・システム固有のデータ領域の存在は,アンワインド情報ヘッダのフラグによって示されます。
|
ハンドラの起動
|
OpenVMS では,制御がルーチンのプロローグ領域またはエピローグ領域にある間,ハンドラを起動しません。この動作の違いは,アンワインド情報ヘッダのフラグによって示されます。
|
変換されたイメージ
|
OpenVMS では, VAX または Alpha のネイティブ・イメージと変換されたイメージの間の呼び出しのサポート (シグネチャ情報と特殊な ABI) が追加されています。
|