この節では、
IA-32
アーキテクチャの浮動小数点例外とその処理の概要について説明 する。x87 FPU
、SSE
、SSE2
、SSE3
に固有の内容については、以下の各節を参照のこと。・ 8.4.
節「x87 FPU
浮動小数点例外処理」・ 11.5.
節「SSE、SSE2、SSE3の例外」IA-32
アーキテクチャは、浮動小数点オペランドを操作するとき、以下の6
クラスの例外条件を認識し、検出する。
・
無効操作(#I
)・
ゼロ除算(#Z)・
デノーマル・オペランド(#D)・
数値オーバーフロー(#O
)・
数値アンダーフロー(#U)・
不正確結果(精度)(#P
)本書では、
"#"
記号に続く大文字1
文字または2
文字の表記(例えば、#P
)を使用して、例外条件を表す。これは単なる省略形であり、アセンブラのニーモニックとは無関係 である。
注記
上記のすべての例外は、デノーマル・オペランド例外(#D)を除いて、IEEE規格 754に定義されている。
IA-32 インテル® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ
4-26
無効操作例外、ゼロ除算例外、デノーマル・オペランド例外は、計算前型の例外(す なわち、算術演算が実行される前に検出される例外)である。数値アンダーフロー例 外、数値オーバーフロー例外、精度例外は、計算後型の例外である。
6
つの例外クラスのそれぞれに、対応するフラグビット(IE
、ZE
、OE
、UE
、DE
、ま たはPE
)とマスクビット(IM
、ZM
、OM
、UM
、DM
、またはPM
)がある。1
つ以上 の浮動小数点例外条件が検出されると、プロセッサは、該当するフラグビットをセッ トし、それに対応するマスクビットの設定に基づいて、次のいずれかの処置をとる。・
マスクビットがセットされている場合。例外を自動的に処理して、あらかじめ定 義された(通常はそのまま使用可能な)結果を返し、プログラムの実行を続ける。・
マスクビットがクリアされている場合。ソフトウェア例外ハンドラを起動して、例 外を処理する。例外に対するマスク応答(デフォルト)は、各例外条件に対して妥当な結果が得られ るように選択されており、ほとんどの浮動小数点アプリケーションでは、一般に満足 のいく結果が得られる。プログラマは、それぞれの浮動小数点例外をマスクしたり、
マスクを解除することで、ほとんどの例外の処理をプロセッサに任せて、最も重大な 例外条件だけをソフトウェア例外ハンドラで処理できる。
例外フラグは「スティッキー・フラグ」であるため、前回クリアされた後に発生した 例外を累積的に記録している。プログラマは、すべての例外をマスクしておき、計算 を実行した後で例外フラグを調べて、計算中に例外が検出されたかどうかを確認でき る。
IA-32
アーキテクチャでは、浮動小数点例外フラグビットとマスクビットは、次の2
つの異なる位置に実装されている。
・ x87 FPU
ステータス・ワードおよび制御ワード。フラグビットは、x87 FPUステータス・ワードのビット
0
~5
にある。マスクビットは、x87 FPU制御ワードのビッ ト0
~5
にある(図8-6
と図8-4
を参照)。・ MXCSR
レジスタ。フラグビットは、MXCSR
レジスタのビット0
~5
にある。マ スクビットは、MXCSR
レジスタのビット7
~12
にある(図10-3.
を参照)。 これらの2
組のフラグビットとマスクビットは、同じ機能を持っているが、プロセッ サ内の異なる実行環境の例外の報告と制御に使用される。x87 FPU
ステータス・ワー ドおよび制御ワード内のフラグビットとマスクビットは、x87 FPU
命令によって実行 される計算で発生した例外の報告とマスクを制御する。MXCSR
レジスタ内のそれに 対応するビットは、SSE
とSSE2
によって実行されるSIMD
浮動小数点計算で発生した 例外の報告とマスクを制御する。ただし、例外がマスクされている場合、プロセッサはマスク応答の実行後も命令の実 行を続けるため、
1
つの命令で複数の例外が検出されることがある。例えば、プロセッデータ型
4
サは、デノーマル・オペランドを検出し、この例外に対するマスク応答を実行した後、
数値アンダーフローを検出することがある。
1
つの命令に対して複数の浮動小数点例外条件が検出された場合の例外の優先規則に ついては、4.9.2.
項「浮動小数点例外の優先順位」を参照のこと。4.9.1.
浮動小数点例外条件以下の各項では、
SIMD
浮動小数点数値例外を発生させる各種の条件と、これらの条 件の検出時のプロセッサのマスク応答について説明する。各浮動小数点命令について 通知される浮動小数点例外の一覧は、『IA-32
インテル®アーキテクチャ・ソフトウェ ア・デベロッパーズ・マニュアル、中巻A
』の第3
章「命令セット・リファレンスA-M
」と『IA-32
インテル®アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル、中巻
B
』の第4
章「命令セット・リファレンスN-Z
」に記載されている。4.9.1.1. 無効操作例外(#I)
無効操作例外は、
1
つ以上の無効な算術演算オペランドに対して報告される。無効操 作例外がマスクされている場合は、プロセッサはIE
フラグをセットし、不定値またはQNaN
を返す。この値は、命令によって指定されたデスティネーション・レジスタを 上書きする。無効操作例外がマスクされていない場合は、IE
フラグがセットされ、ソ フトウェア例外ハンドラが起動され、オペランドは変更されない。SNaN
によって無効操作例外が発生した場合に返される結果については、4.8.3.6.項「ア
プリケーションでのSNANと QNAN
の使用」を参照のこと。プロセッサは、プログラム内にコーディングされる、各種の無効な算術演算を検出す ることができる。これらの演算は、一般的に、∞を∞で割るなどのプログラミング・
エラーを示す。x87 FPU命令、または
SSE、SSE2、SSE3
の実行中に検出される無効操 作例外については、以下の各項を参照のこと。・ x87 FPU
:8.5.1.
項「無効操作例外」・ SIMD
浮動小数点例外:11.5.2.1.
項「無効操作例外(#I
)」4.9.1.2. デノーマル・オペランド例外(#D)
算術命令がデノーマル・オペランドを操作しようとすると、プロセッサはデノーマル・
オペランド例外を通知する(4.8.3.2.項「ノーマル型有限数とデノーマル型有限数」を 参照)。デノーマル・オペランド例外がマスクされている場合は、プロセッサは
DE
フ ラグをセットし、命令の実行を続ける。デノーマル数をそのまま処理した場合は、デ ノーマル数をゼロにフラッシュした場合と比べて、少なくとも同程度に正確な結果IA-32 インテル® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ
4-28
(多くの場合はより正確な結果)が得られる。プログラマは、この例外をマスクして おいて計算を続行し、最終結果が得られた段階で、精度の低下を分析できる。
デノーマル・オペランド例外がマスクされていない場合は、
DE
ビットがセットされ、ソフトウェア例外ハンドラが起動され、オペランドは変更されない。下位ビットが失 われたためにデノーマル・オペランドの有意性が低下した場合は、デノーマル・オペ ランドに対して演算を行わない方がよい。マスクされていないデノーマル・オペラン ド例外に応答する例外ハンドラを使用すれば、デノーマル・オペランドをあらかじめ 計算から除外できる。
x87 FPU
命令、またはSSE、SSE2、SSE3
の実行中に検出されるデノーマル・オペラン ド例外については、以下の各項を参照のこと。・ x87 FPU:8.5.2.
項「デノーマル・オペランド例外(#D)」・ SIMD
浮動小数点例外:11.5.2.2.
項「デノーマル・オペランド例外(#D
)」4.9.1.3. ゼロ除算例外(#Z)
ゼロでない有限のオペランドを
0
で割ろうとすると、浮動小数点ゼロ除算例外が報告 される。ゼロ除算例外に対するマスク応答は、ZE
フラグをセットし、各オペランドの 符号の排他的論理和(XOR
)演算によって符号が付けられた無限大を返す。ゼロ除算 例外がマスクされていない場合は、ZE
フラグがセットされ、ソフトウェア例外ハンド ラが起動され、オペランドは変更されない。x87 FPU
命令、またはSSE、SSE2
の実行中に検出されるゼロ除算例外については、以下の各項を参照のこと。
・ x87 FPU:8.5.3.
項「ゼロ除算例外(#Z)」・ SIMD
浮動小数点例外:11.5.2.3.
項「ゼロ除算例外(#Z
)」データ型
4
4.9.1.4. 数値オーバーフロー例外(#O)
命令の丸められた結果が、デスティネーション・オペランドの有効範囲内で最も大き い有限値を超えた場合は、プロセッサは浮動小数点数値オーバーフロー例外を報告す る。表
4-9.
は、各浮動小数点フォーマットについて、数値オーバーフローのスレッショ ルド範囲を示している。丸められた結果がこのスレッショルド範囲から外れるか、範 囲の両端の値と一致した場合に、オーバーフローが発生する。数値オーバーフロー例外が発生したときに例外がマスクされていると、プロセッサは
OE
フラグをセットし、現在の丸めモードにしたがって、表4-10.
に示す値のうち1
つ を返す。4.8.4.項「丸め」を参照のこと。.
数値オーバーフローが発生し、数値オーバーフロー例外がマスクされていない場合 は、
OE
フラグがセットされ、ソフトウェア例外ハンドラが起動される。オーバーフ ロー例外がSSE
、SSE2
、またはSSE3
浮動小数点演算で発生した場合は、ソース・オ ペランドとデスティネーション・オペランドはどちらも変更されない。オーバーフ ロー例外がx87 FPU
演算で発生した場合は、バイアスされた結果がデスティネーショ ン・オペランドに格納される。x87 FPU
命令、またはSSE
、SSE2
、SSE3
の実行中に検出される数値オーバーフロー例 外については、以下の各項を参照のこと。・ x87 FPU:8.5.4.
項「数値オーバーフロー例外(#O)」・ SIMD
浮動小数点例外:11.5.2.4.項「数値オーバーフロー例外(#O)」表4-9. 数値オーバーフローのスレッショルド
浮動小数点フォーマット オーバーフロー・スレッショルド
単精度 | x | ≥ 1.0 * 2128
倍精度 | x | ≥ 1.0 * 21024
拡張倍精度 | x | ≥ 1.0 * 216384
表4-10. 数値オーバーフローに対するマスク応答
丸めモード 真の結果の符号 結果
最近値 + +∞
– –∞
–∞方向 + 正の最大有限数。
– –∞
+∞方向 + +∞
– 負の最大有限数。
ゼロ方向 + 正の最大有限数。
– 負の最大有限数。