前へ | 次へ | 目次 | 索引 |
VAX スカラ命令を格納する方法は,ベクタ命令を格納する方法にも適用されます ( 第 4.3.2 項 を参照)。たとえば,次のコマンドは現在の PC アドレスのマスクされた VVMULF ベクタ命令を格納します。
DBG> DEPOSIT/INSTRUCTION .%PC = "VVMULF/0 V2,V3,V7" |
ベクタ命令を格納する場合,次のことにも注意してください。命令コードについての詳しい説明は『VAX MACRO and Instruction Set Reference Manual』を参照してください。
16.5 ベクタ・レジスタまたはベクタ命令を検査するときのマスクの使用方法
演算がベクタ・マスク・レジスタ (VMR) によってマスクされているかどうかにより,EXAMINE/OPERANDS .%PC コマンドがベクタ命令オペランドを表示する方法がどう変わるかは, 第 16.4.1 項 を参照してください。
本節では,任意のマスクを指定して,VMR の効果をシミュレートまたは上書きしたり,次の結果を得る方法を説明します。
EXAMINE コマンドで /TMASK 修飾子または /FMASK 修飾子のどちらかを使用してマスクを指定します。
次に,ベクタ・レジスタを検査するときの /TMASK 修飾子と /FMASK 修飾子の使い方を説明します。他に指定しないかぎり,メモリ配列を検査する場合のこれらの修飾子の使用方法も同じです。 |
/TMASK 修飾子を指定すると,EXAMINE コマンドは,セットされたマスク・ビット ( ビットの値は 1 ) に対応したチェック済みレジスタの要素だけに適用されます。これに対し,/FMASK 修飾子を指定すると, EXAMINE コマンドはクリアされたマスク・ビット ( ビットの値は 0 ) に対応した要素だけに適用されます。
VLR の現在の値は,検査できるベクタ・レジスタの最上位の要素を制限します。ただし,VLR の値はメモリ内の配列の検査には影響しません。
/TMASK 修飾子と /FMASK 修飾子を使用すれば,マスクはマスク・アドレス式の形式で指定できますが省略することもできます。詳しい説明は,次の項を参照してください。
省略時の設定では,EXAMINE/TMASK コマンドまたは EXAMINE/FMASK コマンドでマスクを指定しないと,VMR がマスクとして使用されます。すなわち,EXAMINE コマンドはセットされた VMR ビット ( /TMASK の場合 ) またはクリアされた VMR ビット ( /FMASK の場合 ) に対応したベクタ・レジスタの要素だけに適用されます。
次の例では,VLR の値は 6 であり,VMR(0:VLR--1) の値は次のとおりです。
DBG> EXAMINE %VMR(0:%VLR-1) 0\%VMR (0): 1 (1): 0 (2): 1 (3): 0 (4): 1 (5): 0 DBG> |
次のコマンドは,V3 の値をマスクを使用しないで示します。 V3 の 0 から VLR--1 までのすべての要素が表示されます。
DBG> EXAMINE %V3 0\%V3 (0): 17 (1): 138 (2): 3 (3): 9 (4): 51 (5): 252 DBG> |
次のコマンドは,VMR(i) の値が 1 である V3 の要素 (0 から VLR--1) を表示します。
DBG> EXAMINE/TMASK %V3 0\%V3 (0): 17 (2): 3 (4): 51 DBG> |
次のコマンドは,VMR(i) の値が 0 である V3 の要素 (0 から VLR--1 まで) を表示します。
DBG> EXAMINE/FMASK %V3 0\%V3 (1): 138 (3): 9 (5): 252 DBG> |
次の例では,命令とそのベクタ・レジスタ・オペランドを検査するときに /FMASK 修飾子が使用されています。EXAMINE/OPERANDS/FMASK コマンドは, VMR(i) の値が 0 であるレジスタ・オペランド要素 (0 から VLR--1 まで) を表示します。
DBG> EXAMINE/OPERANDS/FMASK .%PC PROG$MAIN\%LINE 341+16: VVEQLL V0,V1 V0 contains: 0\%V0(1): 0 0\%V0(3): 0 0\%V0(5): 0 V1 contains: 0\%V1(1): 0 0\%V1(3): 0 0\%V1(5): 0 DBG> |
EXAMINE/TMASK コマンドまたは EXAMINE/FMASK コマンドで VMR の断面を指定すると,次の規則に従って出力が表示されます。
DBG> EXAMINE %VLR 0\%VLR: 12 DBG> EXAMINE %VMR(3:5) 0\%VMR (3): 1 (4): 1 (5): 1 DBG> EXAMINE/TMASK=(%VMR(3:5)) %V0(3:10) 0\%V0 (3): 9 (4): 51 (5): 252 DBG> |
/TMASK 修飾子でマスクを指定するときは括弧を使用する。
DBG> EXAMINE %VLR 0\%VLR: 12 DBG> EXAMINE %VMR(4:7) 0\%VMR (4): 1 (5): 0 (6): 1 (7): 1 DBG> EXAMINE/TMASK=(%VMR(4:7)) %V0(3:10) %DEBUG-I-MASKMISMATCH, mask/target subscripts do not match, displaying mask 0\%V0 %VMR(4): 1 %V0(3): 9 %VMR(6): 1 %V0(5): 252 %VMR(7): 1 %V0(6): 56 DBG> |
EXAMINE/TMASK コマンドまたは EXAMINE/FMASK コマンドで VMR 以外のマスク・アドレス式を指定すると,次の規則に従い,そのアドレスの値がマスクとして使用されます。
DBG> EXAMINE %VLR 0\%VLR: 6 DBG> EXAMINE BOOL_ARR PROG$MAIN\BOOL_ARR (0): 0 (1): 0 (2): 1 (3): 0 DBG> EXAMINE/FMASK=(BOOL_ARR) %V0 %DEBUG-I-MASKNOTVMR, mask used is not %VMR, displaying specified mask 0\%V0 BOOL_ARR(0): 0 %V0(0): 17 BOOL_ARR(1): 0 %V0(1): 138 BOOL_ARR(3): 0 %V0(3): 9 DBG> |
この例に示すように,VMR 以外のマスクを使用すると,デバッガは演算を行うマスク要素とレジスタ要素の両方を表示して,メッセージを発行する。
DBG> EXAMINE BOOL_VAR PROG$MAIN\BOOL_VAR: 1 DBG> EXAMINE/TMASK=(BOOL_VAR) %V0 %DEBUG-I-MASKNOTVMR, mask used is not %VMR, displaying specified mask 0\%V0 BOOL_VAR: 1 %V0(0): 17 DBG> |
EXAMINE コマンドを使用すると,各種の形式の複合アドレス式 ( あるアドレスからのバイト・オフセットを含むアドレス式 ) を指定できます。たとえば,X が整変数であると,次の EXAMINE コマンドは,X のアドレスから 6 バイト先の記憶位置に現在格納されている値を表示します。
DBG> EXAMINE X + 6 MOD3\X+6: 274903 DBG> |
本節で使用する例は,ベクタ化されたプログラムに適した形式の複合アドレス式を指定する方法を示しています。
次の例は,VSCATL 命令の効果をチェックできる方法を示しています。ここに示す命令は,Fortran プログラムからデコードされたものです。
DBG> EXAMINE %VLR 0\%VLR: 5 DBG> EXAMINE/OPERANDS .%PC (1) PROG1$MAIN\%LINE 9+32: VSCATL V7,W^-804(R11),V9 V7 contains: 0\%V7(0): 11 (2) 0\%V7(1): 13 0\%V7(2): 15 0\%V7(3): 17 0\%V7(4): 19 W^-804(R11)PROG1$MAIN\ARRX(1) (address 1820) contains 0 (3) V9 contains: 0\%V9(0): 0 (4) 0\%V9(1): 8 0\%V9(2): 16 0\%V9(3): 24 0\%V9(4): 32 DBG> SHOW SYMBOL/TYPE ARRX (5) data PROG1$MAIN\ARRX array descriptor type, 1 dimension, bounds: [1:200], size: 800 bytes cell type: atomic type, longword integer, size: 4 bytes DBG> EXAMINE ARRX(1) + .%V9(0:%VLR-1) (6) PROG1$MAIN\ARRX(1): 0 PROG1$MAIN\ARRX(3): 0 PROG1$MAIN\ARRX(5): 0 PROG1$MAIN\ARRX(7): 0 PROG1$MAIN\ARRX(9): 0 DBG> STEP/INSTRUCTION (7) stepped to PROG1$MAIN\%LINE 9+40: MOVZBL I^#64,AP DBG> EXAMINE ARRX(1) + .%V9(0:%VLR-1) (8) PROG1$MAIN\ARRX(1): 11 PROG1$MAIN\ARRX(3): 13 PROG1$MAIN\ARRX(5): 15 PROG1$MAIN\ARRX(7): 17 PROG1$MAIN\ARRX(9): 19 DBG> |
次の番号は,上記の例の番号に対応しています。
次の例は,EXAMINE コマンドでもう少し複雑なベクタ・アドレス式を指定する方法を示しています。
配列 ARRZ が連続したクォドワード整数 ( 8 バイト ) 要素を持っているものとします。例の 4 つめの EXAMINE コマンドは,メモリ内の要素 ARRZ(1) で始まるベクタ要素の値を表示します。先の例の場合と同様に,デバッガはベクタ要素の記憶位置を配列要素でシンボル化します。一連のベクタ要素の,ARRZ(1) に対する相対記憶位置は,レジスタ V1 とレジスタ V3 に入っている値を加えて求め,特定の要素に対する結合オフセットを指定します。ベクタ要素が表示される順番は,最初に指定されたレジスタ (V1) の各値に関して,最後に指定したレジスタ ( V3(0:2) ) のすべての値を振り当てる形になります。この例では,すべてのベクタ要素の値が 0 です。
DBG> EXAMINE %VLR 0\%VLR: 4 DBG> EXAMINE %V1 0\%V1 (0): 0 (1): 4 (2): 8 (3): 12 DBG> EXAMINE %V3 0\%V1 (0): 0 (1): 8 (2): 16 (3): 24 DBG> EXAMINE ARRZ(1) + .%V1(0:3) + .%V3(0:2) PROG4$MAIN\ARRZ(1): 0 ! ARRZ(1)+0+0 PROG4$MAIN\ARRZ(2): 0 ! ARRZ(1)+0+8 PROG4$MAIN\ARRZ(3): 0 ! ARRZ(1)+0+16 PROG4$MAIN\ARRZ(1)+4: 0 ! ARRZ(1)+4+0 PROG4$MAIN\ARRZ(2)+4: 0 ! ARRZ(1)+4+8 PROG4$MAIN\ARRZ(3)+4: 0 ! ARRZ(1)+4+16 PROG4$MAIN\ARRZ(2): 0 ! ARRZ(1)+8+0 PROG4$MAIN\ARRZ(3): 0 ! ARRZ(1)+8+8 PROG4$MAIN\ARRZ(4): 0 ! ARRZ(1)+8+16 PROG4$MAIN\ARRZ(2)+4: 0 ! ARRZ(1)+12+0 PROG4$MAIN\ARRZ(3)+4: 0 ! ARRZ(1)+12+8 PROG4$MAIN\ARRZ(4)+4: 0 ! ARRZ(1)+12+16 DBG> |
ベクタ命令がベクタ要素内で浮動小数点例外を生成すると,例外結果がデスティネーション・レジスタの対応する要素にエンコードされます。
このような場合,EXAMINE/FLOAT コマンドを使用すると,関連したレジスタ要素にデコードした例外メッセージが表示されます。この方法を使用すると, 第 16.8 節 に示すとおりに実行要求をまだ保留している浮動小数点例外を識別できます。次の例は,ベクタ命令がレジスタ V5 の要素 2 の浮動小数点ゼロ除算例外を生成したことを示しています。
DBG> EXAMINE/FLOAT %V5 0\%V5 (0): 297.2800 (1): 87.41499 (2): Reserved operand, encoded as floating divide by zero (3): 173.8650 DBG> |
プログラムがベクタ・レジスタの値をメモリにコピーすれば,ベクタ・レジスタの場合と同様に,デコードされた情報を表示するために EXAMINE/FLOAT コマンドをそのメモリ記憶位置に適用できます。
次の表にベクタ浮動小数点例外ごとにデコードされたデバッガ・メッセージを示します。
例外 | デバッガ・メッセージ |
---|---|
浮動小数点アンダフロー | 予約オペランド。浮動小数点アンダフローとしてエンコードされる。 |
浮動小数点ゼロ除算 | 予約オペランド。浮動小数点ゼロ除算としてエンコードされる。 |
浮動小数点予約オペランド | 予約オペランド。浮動小数点予約オペランドとしてエンコードされる。 |
浮動小数点オーバフロー | 予約オペランド。浮動小数点オーバフローとしてエンコードされる。 |
高い性能を達成するため,VAX のスカラ型プロセッサとベクタ型プロセッサはできるだけ並行して稼働します。スカラ型プロセッサは,すべてのベクタ命令をベクタ型プロセッサに渡し,スカラ命令の実行を続けます。その間にベクタ型プロセッサはベクタ命令を実行しています。
場合によっては,2 つのプロセッサの動作の同期をとらなければならないことがあります。正しいプログラムの実行結果を得るには,SYNC,MSYNC,および VSYNC などの同期化命令を使用することにより,プログラムが特定の動作を完了させてからでないと,他の動作を開始しないようにします。これらの命令とスカラとベクタの同期化についての詳しい説明は『VAX MACRO and Instruction Set Reference Manual』を参照してください。
プログラムがコンパイラ ( たとえば,Compaq Fortran コンパイラ ) によってベクタ化されると,必要な同期化命令が自動的に生成されます。ただし,MACRO のプログラマは同期化命令を明示的に作成しなければなりません。
省略時の設定では,デバッガはプログラム ( 内部目的で実行しているものを除く ) の実行中は,スカラとベクタの同期化を行いません。プログラムはデバッガの制御を受けていないかのように実行し,同期化はプログラムによって完全に制御されています。この省略時の動作モードは, SET VECTOR_MODE NOSYNCHRONIZED コマンドによって設定されます。
デバッガを省略時の非同期化モードで使用すると,プログラムの実行がブレークポイント,ウォッチポイント,または STEP コマンドの完了時に中断されたときに,特定のベクタ動作が割り込みをかけられた状態になることがあります。次に例を示します。
このような場合に混乱しないようにするには,SYNCHRONIZE VECTOR_MODE コマンドを入力します。このコマンドは,スカラ型プロセッサとベクタ型プロセッサをただちに同期化します。このコマンドを入力するのは,実行が一時停止しているプログラム内の記憶位置で SYNC 命令と MSYNC 命令を入力するのと同じことです。これは,次のような効果があります。
次の MACRO 例は,SYNCHRONIZE VECTOR_MODE コマンドの機能を示しています。
DBG> STEP (1) stepped to .MAIN.\SUB\%LINE 99 99: VVDIVD V1,V0,V2 DBG> STEP (2) stepped to .MAIN.\SUB\%LINE 100 100: CLRL R0 DBG> EXAMINE/FLOAT %V2 (3) 0\%V2 [0]: 13.53400 [1]: Reserved operand, encoded as floating divide by zero [2]: 247.2450 . . . DBG> SYNCHRONIZE VECTOR_MODE (4) %SYSTEM-F-VARITH, vector arithmetic fault, summary=00000002, mask=00000004, PC=000002E1, PSL=03C00010 break on unhandled exception preceding .MAIN.\SUB\%LINE 100 100: CLRL R0 DBG> |
前へ | 次へ | 目次 | 索引 |