[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]

B 64ビット・アドレッシングのための MACRO-32マクロ

ここでは64ビット・アドレスの操作,64ビット値の下位 32ビットの符合拡張のチェック,および 64ビット形式のディスクリプタをチェックする MACRO-32マクロについて説明します。

これらのマクロはディレクトリALPHA$LIBRARY:STARLET.MLB (たいていは SYS$LIBRARY:STARLET.MLBと同じ)にあり, アプリケーション・コードとシステム・コードの両方で使用できます。 ページ・マクロも64ビット・アドレス用に強化されています。 このサポートは新しいパラメータQUAD=NO/YESによって提供されます。

この付録で説明されているマクロに対して特定の引数を使用することで, レジスタ・セットを指定できることに注意してください。レジスタ・セットを表すには, レジスタをカンマで区切ってリストし,これを不等号で囲みます。次に例を示します。

     <R1,R2,R3>
レジスタ・セット内のレジスタが1つだけの場合は,これを囲む不等号を省略します。


B.1 64ビット・アドレスを操作するマクロ

この節では, 64ビット・アドレスの操作を目的として設計されている次のマクロについて説明します。


$SETUP_CALL64

呼び出しシーケンスを初期化します。

フォーマット

     $SETUP_CALL64   arg_count, inline=trueまたはfalse

パラメータ

arg_count

呼び出し内の引数の個数。

inline

TRUEが設定されている場合,JSBルーチンを作成せずインライン展開を実行します。 引数が6個以下の場合,省略時の設定はINLINE=FALSEです。

説明

このマクロは,64ビットCALLの状態を初期化します。$PUSH_ARG64および $CALL64を使用する前に,これを使用しなければなりません。

引数の個数が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   引数

パラメータ

引数

プッシュされる引数。

説明

このマクロは,64ビット呼び出しの64ビット引数をプッシュします。なお, $PUSH_ARG64を使用する前にマクロ$SETUP_CALL64を使用しなければなりません。

引数はアラインされたクォドワードとして読み込まれます。つまり,$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

ターゲット・ルーチンを起動します。

フォーマット

     $CALL64   call_target

パラメータ

call_target

起動するルーチン。

説明

このマクロは,$SETUP_CALL64で引数の個数を指定し,$PUSH_ARG64 でクォドワード引数をプッシュしたものとして,指定されたルーチンを呼び出します。 このマクロは, プッシュの回数がセットアップ呼び出しの中で指定された回数に一致するかチェックします。

call_targetオペランドがAPベースまたはSPベースであってはなりません。


B.2 符合拡張とディスクリプタ形式をチェックするマクロ

ここで説明するマクロは,特定の値を含んでいるかチェックし, そのチェックの結果に基づきプログラム・フローを決めます。


$IS_32BITS

64ビット値の下位32ビットの符号拡張をチェックし,チェックの結果に基づいて, プログラム・フローを指示します。

フォーマット

     $IS_32BITS   quad_arg, leq_32bits, gtr_32bits, temp_reg=22

パラメータ

quad_arg

レジスタまたはアラインされたクォドワード・メモリ位置のいずれかにある 64ビット値。

leq_32bits

quad_argが32ビット符号拡張値の場合の分岐先のラベル。

gtr_32bits

quad_argが32ビットを越える場合の分岐先のラベル。

temp_reg=22

ソース値の下位ロングワードを保持する一時レジスタとして使用するレジスタ。 省略時の設定の値はR22です。

説明

$IS_32BITSは64ビット値の下位32ビットの符号拡張をチェックし, チェックの結果に基づいて,プログラム・フローを指示します。

使用例

  1. $is_32bits  R9, 10$
    
    この例では,省略時の設定の一時レジスタR22を使用して,R9の64ビット値の下位 32ビットの符号拡張をチェックします。分岐の種類およびチェックの結果によって, プログラムは分岐,またはインラインを継続します。

  2. $is_32bits  4(R8), 20$, 30$, R28
    
    この例では,一時レジスタR28を使用して,4(R8)の64ビット値の下位 32ビットの符号拡張をチェックし,その結果によって,20$または30$に分岐します。


$IS_DESC64

指定されたディスクリプタをチェックし,これが 64ビット形式のディスクリプタかどうかを判断し, チェックの結果に基づいてプログラム・フローを指示します。

フォーマット

     $IS_DESC   desc_addr, target, size=long or quad

パラメータ

desc_addr

チェックするディスクリプタのアドレス。

target

ディスクリプタが64ビット形式の場合の分岐先のラベル。

size=long

ディスクリプタを示しているアドレスのサイズ。"long" (省略時の設定) および"quad"が有効。

説明

$IS_DESC64は,64ビット・ディスクリプタと 32ビット・ディスクリプタを区別するフィールドをチェックします。これが 64ビット形式の場合,指定されたターゲットに分岐が行われます。 SIZE=QUAD が指定されていない限り,チェックするアドレスはロングワードとして読み込まれます。

使用例

  1. $is_desc64 r9, 10$
    
    この例では,R9によって示されるディスクリプタがチェックされ,これが 64ビット形式の場合は10$への分岐が行われます。

  2. $is_desc64 8(r0), 20$, size=quad
    
    この例では,8(R0)のクォドワードが読み込まれ, これが示すディスクリプタがチェックされます。これが64ビット形式の場合は 20$への分岐が行われます。


[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]