前へ | 次へ | 目次 | 索引 |
アプリケーションの条件処理ルーチンは,シグナル・アレイに戻された条件コードを確認することにより,どの例外が通知されているかを識別します。次のプログラムの一文は 例 5-1 から抜粋したものであり,条件処理ルーチンがランタイム・ライブラリ・ルーチンLIB$MATCH_CONDを使用することにより,この作業をどのような方法で実現できるかを示しています。
status = LIB$MATCH_COND(sigs->chf$l_sig_name, /* returned code */ SS$_INTOVF); /* test against */ |
このメカニズムはAXPシステムでも変更されていません。32ビットの条件コードの形式とシグナル・アレイ内での位置は,VAXシステムの場合と同じです。しかし,条件処理ルーチンがVAXシステムで受け取っていた条件コードはAXPシステムでは意味がないでしょう。アーキテクチャが異なるため,VAXシステムで戻されていた一部の例外条件は,AXPシステムではサポートされません。
ソフトウェア例外の場合には,AXPシステムはVAXシステムの場合と同じ例外をサポートします。このことについては,オンライン・ヘルプ・メッセージ・ユーティリティまたは『OpenVMS system messages documentation』に示されています。しかし,ハードウェア例外はソフトウェア例外よりアーキテクチャに依存する部分が多く,特に算術演算例外はアーキテクチャに依存しています。VAXシステムでサポートされていたハードウェア例外の一部(『OpenVMS Programming Concepts Manual』を参照)だけがAXPシステムでもサポートされます。さらに,Alpha AXPアーキテクチャでは,VAXアーキテクチャでサポートされないいくつかの追加された例外を定義しています。
表 5-3 は,AXPシステムでサポートされないVAXハードウェア例外と,VAXシステムでサポートされないAXPハードウェア例外を示しています。アプリケーションの例外処理ルーチンがこれらのVAX固有の例外をテストする場合には,対応するAXP例外をテストするためのコードを追加する必要があります(AXPシステムでの算術演算例外のテストについての詳しい説明は,第 5.3.1 項 を参照してください)。
AXPシステムで実行されるトランスレートされたVAXイメージは,これらのVAX例外を戻すことができます。 |
例外条件コード | コメント |
---|---|
AXPシステム固有の例外 | |
SS$_HPARITH --高性能算術演算例外 | VAX算術演算例外はこの例外に変更された(第 5.3.1 項 を参照)。 |
SS$_ALIGN --データ・アラインメント・トラップ | VAXシステムには対応する例外はない |
VAXシステム固有の例外 | |
SS$_ARTRES --予備の算術演算トラップ | AXPシステムには対応する例外はない |
SS$_COMPAT --互換性フォルト | AXPシステムには対応する例外はない |
1SS$_DECOVF --10進オーバーフロー | SS$_HPARITHに変更された(第 5.3.1 項 を参照) |
1SS$_FLTDIV --0による浮動小数点除算(トラップ) | SS$_HPARITHに変更された(第 5.3.1 項 を参照) |
SS$_FLTDIV_F --0による浮動小数点除算(フォルト) | SS$_HPARITHに変更された(第 5.3.1 項 を参照) |
1SS$_FLTOVF --浮動小数点オーバーフロー(トラップ) | SS$_HPARITHに変更された(第 5.3.1 項 を参照) |
SS$_FLTOVF_F --浮動小数点オーバーフロー(フォルト) | SS$_HPARITHに変更された(第 5.3.1 項 を参照) |
1SS$_FLTUND --浮動小数点アンダーフロー(トラップ) | SS$_HPARITHに変更された(第 5.3.1 項 を参照) |
SS$_FLTUND_F --浮動小数点アンダーフロー(フォルト) | SS$_HPARITHに変更された(第 5.3.1 項 を参照) |
1SS$_INTDIV --0による整数除算 | SS$_HPARITHに変更された(第 5.3.1 項 を参照) |
1SS$_INTOVF --整数オーバーフロー | SS$_HPARITHに変更された(第 5.3.1 項 を参照) |
SS$_TBIT --トレース・ペンディング | AXPシステムには対応する例外はない |
SS$_OPCCUS --ユーザ用に確保されているオペコード | AXPシステムには対応する例外はない |
SS$_RADMOD --予備のアドレッシング・モード | AXPシステムには対応する例外はない |
SS$_SUBRNG --INDEX添字範囲チェック | AXPシステムには対応する例外はない |
VAXシステムでは,アーキテクチャは算術演算例外が同期的に報告されるようにします。つまり,例外(オーバーフローなど)の原因となったVAX算術演算命令は,ただちに例外処理ハンドラを開始し,後続の命令は実行されません。例外ハンドラに報告されるプログラム・カウンタ(PC)は,例外の原因となった算術演算命令のPCです。このため,アプリケーション・プログラムは,たとえば,メイン・シーケンスを再開し,例外の原因となった操作を同等の操作または別の操作によってエミュレートするか,置換することができます。
AXPシステムでは,算術演算例外は非同期的に報告されます。つまり,アーキテクチャの実現方法により,例外の原因となった命令より後の多くの命令(分岐やジャンプも含む)を実行できます。これらの命令は,例外の原因となった命令が使用していたオペランドの上に重ね書きする可能性があるため,例外を解釈したり,修正するのに必要な情報が失われてしまいます。例外ハンドラに報告されるPCは,例外の原因となった命令のPCではなく,その後に実行された命令のPCです。例外がアプリケーションの例外ハンドラに報告される時点では,ハンドラは入力データを修正しており,命令を再起動することができない可能性があります。
このように,算術演算例外の報告方法が基本的に異なるため,AXPシステムでは,SS$_HPARITHという1つの条件コードを定義し,これによってすべての算術演算例外を示します。たとえば,整数オーバーフロー例外が発生したときに処理を実行する条件処理ルーチンがアプリケーションに含まれている場合,VAXシステムでは,SS$_INTOVR条件コードが例外処理ルーチンに渡されます。AXPシステムでは,この例外はSS$_HPARITHという条件コードによって示されます。このため,アプリケーションの条件処理ルーチンは,AXP算術演算例外を対応するVAX例外と誤って解釈することがありません。処理を行うアプリケーションが,アーキテクチャ固有である可能性があるため,このことは重要です。
図 5-3 はSS$_HPARITH例外シグナル・アレイの形式を示しています。
図 5-3 SS$_HPARITH例外シグナル・アレイ
このシグナル・アレイには,SS$_HPARITH例外の固有の3つの引数が格納されます。それは 整数レジスタ・ライト・マスク(integer register write mask),浮動小数点レジスタ・ライト・マスク(floating register write mask),および例外サマリです。整数および浮動小数点レジスタ・ライト・マスクは,例外サマリのビットをセットした命令のターゲットであったレジスタを示します。マスク内の各ビットはレジスタを表現します。例外サマリは最初の7ビットにフラグをセットすることにより,通知される例外のタイプ(1つ以上)を示します。表 5-4 はこれらの各ビットがセットされているときの意味を示しています。
ビット | 意味 |
---|---|
0 | ソフトウェアは正常終了した。 |
1 | 浮動小数点演算,変換,または比較操作に誤りがある。 |
2 | 浮動小数点除算で0による除算を実行しようとした。0による整数除算は報告されないので注意しなければならない。 |
3 | 浮動小数点演算または変換操作で宛先の指数部がオーバーフローした。 |
4 | 浮動小数点演算または変換操作で宛先の指数部がアンダーフローした。 |
5 | 浮動小数点演算または変換操作で正確な算術演算結果と異なる結果が報告された。 |
6 | 浮動小数点数値から整数への変換操作または整数算術演算で宛先の精度がオーバーフローした。 |
算術演算例外に応答して処理を実行する条件処理ルーチンを AXPシステムで実行するために変更しなければならないかどうかを判断する場合には,次のガイドラインに従ってください。
AXPシステムで実行されるトランスレートされたVAXイメージは,算術演算例外条件も含めて,VAX例外条件を戻します。 |
AXPシステムでは,アラインされていないアドレスをオペランドとして受け付ける Alpha AXP命令(LDQ_U)を使わずに,自然なアラインメントになっていないアドレスを使用して,レジスタとの間でロングワードまたはクォドワードをロード/ストアしようとする操作を実行すると,データ・アラインメント・トラップが発生します(データ・アラインメントについての詳しい説明は,第 4 章 を参照してください)。
AXPシステムのコンパイラは通常,次の操作を実行することにより,アラインメント・フォルトの発生を防止します。
しかし,動的に定義されるデータをコンパイラがアラインすることはできません。したがってこのような場合は,アラインメント・フォルトが発生する可能性があります。
アラインメント例外は条件コードSS$_ALIGNによって示されます。図 5-4 は,SS$_ALIGN例外によって戻されるシグナル・アレイの要素を示しています。
図 5-4 SS$_ALIGN例外のシグナル・アレイ
このシグナル・アレイには,SS$_ALIGN例外固有の2つの引数が格納されます。それは 仮想アドレスとレジスタ番号です。仮想アドレスには,アクセスしているアラインされていないデータのアドレスが格納されます。レジスタ番号は操作の対象となるレジスタを示します。
いままでに述べてきた条件処理ルーチンの問題に加えて,条件処理を含むアプリケーションは,システムに対して条件処理ルーチンを設定するなどの他の操作を実行しなければなりません。ランタイム・ライブラリには,アプリケーションでこれらの操作を実行するためのルーチンが準備されています。たとえば,アプリケーションでランタイム・ライブラリ・ルーチンLIB$ESTABLISHを呼び出すことにより,例外が通知されるときに実行される条件処理ルーチンを識別(または設定)できます。
VAXアーキテクチャとAlpha AXPアーキテクチャには相違点があり,両方のアーキテクチャの呼び出し規則(calling standard)にも違いがあるため,これらの多くの操作の実現方法は同じではありません。表 5-5 はVAXシステムで提供されるランタイム・ライブラリ条件処理サポート・ルーチンと,AXPシステムではどのルーチンがサポートされるかを示しています。
ルーチン | AXPシステムで使用できるかどうか |
---|---|
算術演算例外サポート・ルーチン | |
LIB$DEC_OVER --10進オーバーフローの通知を許可または禁止する | サポートされない |
LIB$FIXUP_FLT --予備の浮動小数点オペランドを指定された値に変更する | サポートされない |
LIB$FLT_UNDER --浮動小数点アンダーフローの通知を許可または禁止する | サポートされない |
LIB$INT_OVER --整数オーバーフローの通知を許可または禁止する | サポートされない |
一般的な条件処理サポート・ルーチン | |
LIB$DECODE_FAULT --フォルトに対して命令コンテキストを解析する | サポートされない |
LIB$ESTABLISH --条件ハンドラを設定する | RTLではサポートされないが,互換性を維持するためにコンパイラによってサポートされる |
LIB$MATCH_COND --条件値を照合する | サポートされる |
LIB$REVERT --条件ハンドラを削除する | RTLではサポートされないが,互換性を維持するためにコンパイラによってサポートされる |
LIB$SIG_TO_STOP --通知された条件を継続できない条件値に変換する | サポートされる |
LIB$SIG_TO_RET --シグナルをリターン・ステータスに変換する | サポートされる |
LIB$SIM_TRAP --浮動小数点トラップをシミュレートする | サポートされない |
LIB$SIGNAL --例外条件を通知する | サポートされる |
LIB$STOP --シグナルを使用して実行を停止する | サポートされる |
次のリストは,ランタイム・ライブラリ・ルーチンを使用するアプリケーションにおけるガイドラインを示しています。
たとえば,例 5-2 に示したプログラムはFORTRANで作成されており,条件コードSS$_INTOVFを指定することにより,整数オーバーフローをテストする条件処理ルーチンを指定するために,RTLルーチンLIB$ESTABLISHを使用しています。VAXシステムでは,整数オーバーフローの検出を可能にするために,プログラムをコンパイルするときに/CHECK=OVERFLOW修飾子を指定しなければなりません。
このプログラムをAXPシステムで実行するには,条件コードを SS$_INTOVFからSS$_HPARITHに変更しなければなりません(オーバーフローのタイプはシグナル・アレイ内の例外サマリ引数を調べることにより判断できます。詳しくはコンパイラに関する解説書を参照してください)。VAXシステムの場合と同様に,オーバーフロー検出を可能にするためにはコンパイル・コマンド・ラインに /CHECK=OVERFLOW修飾子を指定なければなりません。DEC Fortran はLIB$ESTABLISHルーチンを組み込み関数として受け付けるため,このルーチンの呼び出しを削除する必要はありません。
例 5-2 条件処理プログラムの例 |
---|
C This program types a maximum value of integers C Compile with /CHECK=OVERFLOW and the /EXTEND_SOURCE qualifiers INTEGER*4 int4 EXTERNAL HANDLER CALL LIB$ESTABLISH(HANDLER) (1) int4=2147483645 WRITE(6,*)' Beginning DO LOOP, adding 1 to ', int4 DO I=1,10 int4=int4+1 WRITE(6,*)' INT*4 NUMBER IS ', int4 END DO WRITE(6,*)' The end ...' END C This is the condition handling routine INTEGER*4 FUNCTION HANDLER(SIGARGS, MECHARGS) INTEGER*4 SIGARGS(*),MECHARGS(*) INCLUDE '($FORDEF)' INCLUDE '($SSDEF)' INTEGER INDEX INTEGER LIB$MATCH_COND INDEX = LIB$MATCH_COND(SIGARGS(2), SS$_INTOVF)(2) IF(INDEX .EQ. 0)THEN HANDLER = SS$_RESIGNAL ELSE IF(INDEX .GT. 0)THEN WRITE(6,*)'Arithmetic exception detected...' CALL LIB$STOP(SIGARGS(1)) END IF END |
次のリストの各項目は 例 5-2 に示されている番号に対応しています。
次の例は,例 5-2 に示したプログラム名をコンパイル,リンク,および実行する方法を示しています。
$ FORTRAN/EXTEND_SOURCE/CHECK=OVERFLOW HANDLER_EX.FOR $ LINK HANDLER_EX $ RUN HANDLER_EX Beginning DO LOOP, adding 1 to 2147483645 INT*4 NUMBER IS 2147483646 INT*4 NUMBER IS 2147483647 Arithmetic exception detected... %TRACE-F-TRACEBACK, symbolic stack dump follows Image Name Module Name Routine Name Line Number rel PC abs PC INT_OVR_HAND INT_OVR_HANDLER HANDLER 1637 00000238 00020238 DEC$FORRTL 0 000651E4 001991E4 -- --- above condition handler called with exception 00000504: %SYSTEM-F-HPARITH, high performance arithmetic trap, Imask=00000001, Fmask=00000 000, summary=40, PC=000200E0, PS=0000001B -SYSTEM-F-INTOVF, arithmetic trap, integer overflow at PC=000200E0, PS=0000001B -- --- end of exception message 0 84FE9FFC 84FE9FFC INT_OVR_HAND INT_OVR_HANDLER INT_OVR_HANDLER 15 000000E0 000200E0 0 84EFD918 84EFD918 0 7FF23EE0 7FF23EE0 |
前へ | 次へ | 目次 | 索引 |