これらのマクロはディレクトリALPHA$LIBRARY:STARLET.MLB (たいていは SYS$LIBRARY:STARLET.MLBと同じ)にあり, アプリケーション・コードとシステム・コードの両方で使用できます。 ページ・マクロも64ビット・アドレス用に強化されています。 このサポートは新しいパラメータQUAD=NO/YESによって提供されます。
この付録で説明されているマクロに対して特定の引数を使用することで, レジスタ・セットを指定できることに注意してください。レジスタ・セットを表すには, レジスタをカンマで区切ってリストし,これを不等号で囲みます。次に例を示します。
<R1,R2,R3>レジスタ・セット内のレジスタが1つだけの場合は,これを囲む不等号を省略します。
$SETUP_CALL64 arg_count, inline=trueまたはfalse
呼び出し内の引数の個数。
TRUEが設定されている場合,JSBルーチンを作成せずインライン展開を実行します。 引数が6個以下の場合,省略時の設定はINLINE=FALSEです。
引数の個数が6個以下の場合,コードは常にインラインです。
省略時の設定では,引数の個数が6個を越える場合,JSBルーチンが作成され, このルーチンを起動して実際の呼び出しを実行します。しかし, INLINE=TRUEでインライン・オプションが指定されると, コードはインラインで生成されます。このオプションは, オプションの対象となるコードのスタックの深さが固定の場合に限って有効です。 RUNTIMSTKまたはVARSIZSTKメッセージが表示されない場合, スタックの深さが固定であると仮定できます。それ以外の場合, スタック・アライメントが少なくともクォドワードでないと,呼び出されたルーチン, および呼び出されたルーチンが呼び出すものの中で, アライメント異常が発生する可能性があります。省略時の設定の動作 (INLINE=FALSE)ではこの問題は発生しません。
引数の個数が6個を越える場合,$SETUP_CALL64と対応する$CALL64との間で, APまたはSPへの参照は行われません。これは,$CALL64が別の JSBルーチンにある場合があるからです。また,一時的なレジスタ(R16以上)は $SETUP_CALL64以降,有効ではありません。ただし,R16〜R21 がすでに設定されている引数レジスタと関係する場合を除いて, これらを範囲の中で使用することはできます。このような場合, 上位の一時レジスタを代わりに使用します。
- 注意
- $SETUP_CALL64,$PUSH_ARG64,および$CALL64マクロは, インライン・シーケンスの中で使用することを目的としています。つまり, $SETUP_CALL64/$PUSH_ARG64/$CALL64シーケンスの中央に分岐したり, $PUSH_ARG64マクロの回りで分岐することはできず,シーケンスを出て $CALL64を避けることもできません。
$PUSH_ARG64 引数
プッシュされる引数。
引数はアラインされたクォドワードとして読み込まれます。つまり,$PUSH_ARG64 4(R0) という指定は,4(R0)でクォドワードを読み込み,クォドワードをプッシュします。 インデックス操作はクォドワード・モードで行われます。
メモリのロングワード値をクォドワード値としてプッシュする場合,まずこれを, ロングワード命令でレジスタに移動し,レジスタ上で$PUSH_ARG64を使用します。 同様に,アラインされていないクォドワード値をプッシュするには, まずこれを一時レジスタに移動し$PUSH_ARG64を使用します。
呼び出しの引数の個数が6個を越える場合,このマクロは引数内のSP参照または AP参照をチェックします。呼び出しの引数の個数が6個を越える場合, SP参照は認められず,また, AP参照はインライン・オプションが使用されている場合に限って認められます。
マクロは,現在の$CALL64に対してすでに設定されている, 引数レジスタへの参照についてもチェックします。このような参照が検出されると, 引数レジスタが$PUSH_ARG64内でのソースとして使用される前に, これを上書きすることがないよう,注意を促す警告メッセージが表示されます。
引数の個数が6個以下の場合にも,AP参照について同じチェックが行われます。 これは認められますが,コンパイラではその使用前に上書きすることを禁止できません。 このため,このような参照が検出されると,情報メッセージが表示されます。
オペランドが,R16〜R21のいずれかの文字列をその名前に含むシンボルを,
レジスタ参照以外で使用する場合,このマクロは,
間違ったエラーを報告することがあります。たとえば,R21が設定された後で
$PUSH_ARG64 SAVED_R21
を起動すると,このマクロは,
(必要でないのに)引数レジスタの上書きに関する情報メッセージを表示します。
$PUSH_ARG64は条件付きコードの中で使用できないことにも注意してください。 $PUSH_ARG64は,引数の個数などを追跡するシンボルを更新します。 $SETUP_CALL64/$CALL64シーケンスの中央で,$PUSH_ARG64 の回りに分岐するコードを作成しようとしても,正しく動作しません。
$CALL64 call_target
起動するルーチン。
call_targetオペランドがAPベースまたはSPベースであってはなりません。
$IS_32BITS quad_arg, leq_32bits, gtr_32bits, temp_reg=22
レジスタまたはアラインされたクォドワード・メモリ位置のいずれかにある 64ビット値。
quad_argが32ビット符号拡張値の場合の分岐先のラベル。
quad_argが32ビットを越える場合の分岐先のラベル。
ソース値の下位ロングワードを保持する一時レジスタとして使用するレジスタ。 省略時の設定の値はR22です。
$is_32bits R9, 10$この例では,省略時の設定の一時レジスタR22を使用して,R9の64ビット値の下位 32ビットの符号拡張をチェックします。分岐の種類およびチェックの結果によって, プログラムは分岐,またはインラインを継続します。
$is_32bits 4(R8), 20$, 30$, R28この例では,一時レジスタR28を使用して,4(R8)の64ビット値の下位 32ビットの符号拡張をチェックし,その結果によって,20$または30$に分岐します。
$IS_DESC desc_addr, target, size=long or quad
チェックするディスクリプタのアドレス。
ディスクリプタが64ビット形式の場合の分岐先のラベル。
ディスクリプタを示しているアドレスのサイズ。"long" (省略時の設定) および"quad"が有効。
$is_desc64 r9, 10$この例では,R9によって示されるディスクリプタがチェックされ,これが 64ビット形式の場合は10$への分岐が行われます。
$is_desc64 8(r0), 20$, size=quadこの例では,8(R0)のクォドワードが読み込まれ, これが示すディスクリプタがチェックされます。これが64ビット形式の場合は 20$への分岐が行われます。