OpenVMS Alpha
オペレーティング・システム
OpenVMS VAX から OpenVMS Alpha へのアプリケーションの移行


前へ 次へ 目次 索引


8.4 例外条件の識別

アプリケーションの条件処理ルーチンは,シグナル・アレイに戻された条件コードを確認することにより,どの例外が通知されているかを識別します。次のプログラムの一文は 例 8-1 から抜粋したものであり,条件処理ルーチンがランタイム・ライブラリ・ルーチンLIB$MATCH_CONDを使用することにより,この作業をどのような方法で実現できるかを示しています。


status = LIB$MATCH_COND( sigs->chf$l_sig_name,  /* returned code */ 
                                  SS$_INTOVF);  /* test against  */ 

このメカニズムはAlphaシステムでも変更されていません。32ビットの条件コードの形式とシグナル・アレイ内での位置は,VAXシステムの場合と同じです。しかし,条件処理ルーチンがVAXシステムで受け取っていた条件コードはAlphaシステムでは意味がないでしょう。アーキテクチャが異なるため,VAXシステムで戻されていた一部の例外条件は,Alphaシステムではサポートされません。

ソフトウェア例外の場合には,AlphaシステムはVAXシステムの場合と同じ例外をサポートします。このことについては,オンライン・ヘルプ・メッセージ・ユーティリティまたは『OpenVMS system messages documentation』に示されています。しかし,ハードウェア例外はソフトウェア例外よりアーキテクチャに依存する部分が多く,特に算術演算例外はアーキテクチャに依存しています。VAXシステムでサポートされていたハードウェア例外の一部( 『OpenVMS Programming Concepts Manual』を参照)だけがAlphaシステムでもサポートされます。さらに,Alphaアーキテクチャでは,VAXアーキテクチャでサポートされないいくつかの追加された例外を定義しています。

表 8-1 は,AlphaシステムでサポートされないVAXハードウェア例外と,VAXシステムでサポートされないAlphaハードウェア例外を示しています。アプリケーションの例外処理ルーチンがこれらのVAX固有の例外をテストする場合には,対応するAlpha例外をテストするためのコードを追加する必要があります (Alphaシステムでの算術演算例外のテストについての詳しい説明は,第 8.4.1 項 を参照してください)。

注意

Alphaシステムで実行されるトランスレートされたVAXイメージは,これらのVAX例外を戻すことができます。

表 8-1 アーキテクチャ固有のハードウェア例外
例外条件コード コメント
Alphaシステム固有の例外
SS$_HPARITH --高性能算術演算例外 VAX算術演算例外はこの例外に変更された( 第 8.4.1 項 を参照)。
SS$_ALIGN --データ・アラインメント・トラップ VAXシステムには対応する例外はない
VAXシステム固有の例外
SS$_ARTRES --予備の算術演算トラップ Alphaシステムには対応する例外はない
SS$_COMPAT --互換性フォルト Alphaシステムには対応する例外はない
SS$_DECOVF --10進オーバーフロー1 SS$_HPARITHに変更された ( 第 8.4.1 項 を参照)
SS$_FLTDIV --0による浮動小数点除算(トラップ)1 SS$_HPARITHに変更された ( 第 8.4.1 項 を参照)
SS$_FLTDIV_F --0による浮動小数点除算(フォルト) SS$_HPARITHに変更された ( 第 8.4.1 項 を参照)
SS$_FLTOVF --浮動小数点オーバーフロー(トラップ)1 SS$_HPARITHに変更された ( 第 8.4.1 項 を参照)
SS$_FLTOVF_F --浮動小数点オーバーフロー(フォルト) SS$_HPARITHに変更された ( 第 8.4.1 項 を参照)
SS$_FLTUND --浮動小数点アンダーフロー(トラップ)1 SS$_HPARITHに変更された ( 第 8.4.1 項 を参照)
SS$_FLTUND_F --浮動小数点アンダーフロー(フォルト) SS$_HPARITHに変更された ( 第 8.4.1 項 を参照)
SS$_INTDIV --0による整数除算1 SS$_HPARITHに変更された ( 第 8.4.1 項 を参照)
SS$_INTOVF --整数オーバーフロー1 SS$_HPARITHに変更された ( 第 8.4.1 項 を参照)
SS$_TBIT --トレース・ペンディング Alphaシステムには対応する例外はない
SS$_OPCCUS --ユーザ用に確保されているオペコード Alphaシステムには対応する例外はない
SS$_RADMOD --予備のアドレッシング・モード Alphaシステムには対応する例外はない
SS$_SUBRNG --INDEX添字範囲チェック Alphaシステムには対応する例外はない


1Alphaシステムではソフトウェアによって生成される可能性があります。

8.4.1 Alphaシステムでの算術演算例外のテスト

VAXシステムでは,アーキテクチャは算術演算例外が同期的に報告されるようにします。つまり,例外(オーバーフローなど)の原因となったVAX算術演算命令は,ただちに例外処理ハンドラを開始し,後続の命令は実行されません。例外ハンドラに報告されるプログラム・カウンタ(PC)は,例外の原因となった算術演算命令のPCです。このため,アプリケーション・プログラムは,たとえば,メイン・シーケンスを再開し,例外の原因となった操作を同等の操作または別の操作によってエミュレートするか,置換することができます。

Alphaシステムでは,算術演算例外は非同期的に報告されます。つまり,アーキテクチャの実現方法により,例外の原因となった命令より後の多くの命令(分岐やジャンプも含む)を実行できます。これらの命令は,例外の原因となった命令が使用していたオペランドの上に重ね書きする可能性があるため,例外を解釈したり,修正するのに必要な情報が失われてしまいます。例外ハンドラに報告されるPCは,例外の原因となった命令のPCではなく,その後に実行された命令のPCです。例外がアプリケーションの例外ハンドラに報告される時点では,ハンドラは入力データを修正しており,命令を再起動することができない可能性があります。

このように,算術演算例外の報告方法が基本的に異なるため,Alphaシステムでは,SS$_HPARITHという1つの条件コードを定義し,これによってすべての算術演算例外を示します。たとえば,整数オーバーフロー例外が発生したときに処理を実行する条件処理ルーチンがアプリケーションに含まれている場合,VAXシステムでは,SS$_INTOVR条件コードが例外処理ルーチンに渡されます。Alphaシステムでは,この例外はSS$_HPARITHという条件コードによって示されます。このため,アプリケーションの条件処理ルーチンは,Alpha算術演算例外を対応するVAX例外と誤って解釈することがありません。処理を行うアプリケーションが,アーキテクチャ固有である可能性があるため,このことは重要です。

図 8-3 はSS$_HPARITH例外シグナル・アレイの形式を示しています。

図 8-3 SS$_HPARITH例外シグナル・アレイ


このシグナル・アレイには,SS$_HPARITH例外の固有の3つの引数が格納されます。それは 整数レジスタ・ライト・マスク浮動小数点レジスタ・ライト・マスク,および例外サマリです。整数および浮動小数点レジスタ・ライト・マスクは,例外サマリのビットをセットした命令のターゲットであったレジスタを示します。マスク内の各ビットはレジスタを表現します。例外サマリは最初の7ビットにフラグをセットすることにより,通知される例外のタイプ(1つ以上)を示します。表 8-2 はこれらの各ビットがセットされているときの意味を示しています。

表 8-2 例外サマリ引数のフィールド
ビット 意味
0 ソフトウェアは正常終了した。
1 浮動小数点演算,変換,または比較操作に誤りがある。
2 浮動小数点除算で0による除算を実行しようとした。0による整数除算は報告されないので注意しなければならない。
3 浮動小数点演算または変換操作で宛先の指数部がオーバーフローした。
4 浮動小数点演算または変換操作で宛先の指数部がアンダーフローした。
5 浮動小数点演算または変換操作で正確な算術演算結果と異なる結果が報告された。
6 浮動小数点数値から整数への変換操作または整数算術演算で宛先の精度がオーバーフローした。

対処方法

算術演算例外に応答して処理を実行する条件処理ルーチンを Alphaシステムで実行するために変更しなければならないかどうかを判断する場合には,次のガイドラインに従ってください。

8.4.2 データ・アラインメント・トラップのテスト

Alphaシステムでは,アラインされていないアドレスをオペランドとして受け付ける Alpha命令(LDQ_U)を使わずに,自然なアラインメントになっていないアドレスを使用して,レジスタとの間でロングワードまたはクォドワードをロード/ストアしようとする操作を実行すると,データ・アラインメント・トラップが発生します (データ・アラインメントについての詳しい説明は,第 7 章 を参照してください)。

Alphaシステムのコンパイラは通常,次の操作を実行することにより,アラインメント・フォルトの発生を防止します。

しかし,動的に定義されるデータをコンパイラがアラインすることはできません。したがってこのような場合は,アラインメント・フォルトが発生する可能性があります。

アラインメント例外は条件コードSS$_ALIGNによって示されます。図 8-4 は,SS$_ALIGN例外によって戻されるシグナル・アレイの要素を示しています。

図 8-4 SS$_ALIGN例外のシグナル・アレイ


このシグナル・アレイには,SS$_ALIGN例外固有の2つの引数が格納されます。それは 仮想アドレスレジスタ番号です。仮想アドレスには,アクセスしているアラインされていないデータのアドレスが格納されます。レジスタ番号は操作の対象となるレジスタを示します。

対処方法

8.5 条件処理に関連する他の作業の実行

いままでに述べてきた条件処理ルーチンの問題に加えて,条件処理を含むアプリケーションは,システムに対して条件処理ルーチンを設定するなどの他の操作を実行しなければなりません。ランタイム・ライブラリには,アプリケーションでこれらの操作を実行するためのルーチンが準備されています。たとえば,アプリケーションでランタイム・ライブラリ・ルーチン LIB$ESTABLISH を呼び出すことにより,例外が通知されるときに実行される条件処理ルーチンを識別 (または設定)できます。

VAXアーキテクチャとAlphaアーキテクチャには相違点があり,両方のアーキテクチャの呼び出し規則にも違いがあるため,これらの多くの操作の実現方法は同じではありません。表 8-3 はVAXシステムで提供されるランタイム・ライブラリ条件処理サポート・ルーチンと,Alphaシステムではどのルーチンがサポートされるかを示しています。

表 8-3 ランタイム・ライブラリ条件処理サポート・ルーチン
ルーチン Alphaシステムでのサポート
算術演算例外サポート・ルーチン
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 --シグナルを使用して実行を停止する サポートされる

対処方法

次のリストは,ランタイム・ライブラリ・ルーチンを使用するアプリケーションにおけるガイドラインを示しています。

たとえば,例 8-2 に示したプログラムはFORTRANで作成されており,条件コードSS$_INTOVFを指定することにより,整数オーバーフローをテストする条件処理ルーチンを指定するために,RTLルーチンLIB$ESTABLISHを使用しています。VAXシステムでは,整数オーバーフローの検出を可能にするために,プログラムをコンパイルするときに/CHECK=OVERFLOW修飾子を指定しなければなりません。


前へ 次へ 目次 索引