1.機能概要
1.1浮動小数点処理(VFP)例外
本書はVFP例外の
² 種類と発生原因(ARMスペックより)、
² 処理流れ設計(IEEE標準より)、
のみを説明する。
VFPアーキテクチャーについて、外の概念はIEEE標準を参照する。例えば、「NaN」とか、「丸めモード」とか、「正規化数」とか、またVFPコアプロセッサの主なレジスト定義は本書の範囲以外となる。
IEEE754 標準では、5種類の浮動小数点例外が指定されている。
² 無効演算例外
² 0による除算例外
² オーバフロー例外
² アンダーフロー例外
² 不正確例外
各種類の処理流れはIEEE754標準に従って、実装する。
上記の例外は、非トラップとトラップの両方の形式でサポートされています。(形式の選択方法はARMスペックを参照する)
1.1.2例外の非トラップ処理(ハードウェアー処理)
例外を生成した命令の結果レジスタはハードウェアーより、IEEE標準により指定されている結果の値に設定される。その後で、例外を生成した命令を含むプログラムの実行が継続される。
1.1.3例外のトラップ処理(ソフトウェアー処理)
例外が発生すると、トラップハンドラソフトウェアルーチン(所謂VFP例外処理或いはトラップ浮動小数点例外)が呼び出されます。具体の処理はIEEEスペックに従う。これは、アプリケーションソフトウェアにオーバフロー/ アンダーフローなどの条件や、NaN と非正規の取り扱いに関する特別な必要条件がある場合に有用である。
トラップハンドラソフトウェアルーチン(VFP例外処理)
トラップ浮動小数点例外が存在するため、VFP アーキテクチャの完全な実装には、サポートコードと呼ばれるソフトウェアコンポーネント(VFP例外処理)が含まれている必要がある。VFP ハードウェアがVFP 命令に応答しない場合、通常はARM 未定義命令(undefined instruction)ベクタ経由でサポートコードが実行される。サポートコードは、トラップ例外をキャッチし、トラップハンドラコールに変換する作業を行う。サポートコードは、トラップハンドラコール以外の、実装により定義されているタスクも実行できる。この機能は、ハードウェアで実装が困難なまれな状況や操作に対処するために使用できる。これにより、ハードウェアサポートの度合が異なっても、同じ機能が実現できる。VFP の実装において、作業をハードウェアとソフトウェアのコンポーネントでどのように分割するかは実装定義である。サポートコードとハードウェアの間のインターフェースの詳細はサブアーキテクチャ定義である。
2.処理詳細
2.1種類と発生原因
2.1.1無効演算例外
この例外は、浮動小数点演算の結果として、数値もしくは無限大で表すには適当でない各種のケースと浮動小数点演算のオペランドがシグナルNaN の場合に発生する。
2.1.2「0」による除算例外
この例外は、正規化数または非正規化数が0 により除算されたときに発生します。
2.1.3オーバフロー例外
この例外は、二つの浮動小数点数値に対する数値演算の結果の絶対値が大きすぎるため、デスティネーションの形式では、使用されている丸めモードでの大きな丸め誤差なしには表現不能である場合に発生する。
より正確には、浮動小数点演算の理想的な丸め結果は、仮にデスティネーションの形式で非バイアス指数の範囲に制限がなかったならば、その丸めモードの結果として生成されるであろう数値として定義されている。理想的な丸め結果の非バイアス指数が、デスティネーションの形式には大きすぎる場合(つまり、単精度では>127、倍精度では>1023 の場合)、実際の丸め結果とは異なることになり、オーバフロー例外が発生する。
2.1.4アンダーフロー例外
この例外が発生する条件は、Flush-to-Zero モードが使用されているかどうかと、アンダーフロー例外有効(UFE)ビット(FPSCR のビット[11])の値によって変化します。Flash-to-Zero モードが使用されておらず、UFE ビットが0 の場合、アンダーフローは浮動小数点演算の丸め前の結果が0 < 結果の絶対値< MinNorm の条件を満たし、最終結果が不正確(つまり、丸め前の結果とは異なる値)な場合に発生する。ここで、MinNorm は単精度の場合2-126、倍精度の場合2-1022 である。
Flush-to-Zero モードが使用されておらず、UFE ビットが1 の場合、アンダーフローは浮動小数点演算の丸め前の結果が0 < 結果の絶対値< MinNorm の条件を満たす場合に発生します。この場合、最終結果が不正確かそうでないかは関係ありません。Flush-to-Zero モードで発生するアンダーフロー例外は、UFE ビットの実際の値にかかわらず、常に非トラップとして扱われます。この詳細と、Flush-to-Zero モードの他の要素については、P. C2-14「Flush-to-Zero モード」を参照して下さい。
2.1.5.不正確例外
二つの浮動小数点数値に対して、行われる数値演算の結果には、デスティネーションレジスタに保持できるより多い有意味なビットが含まれていることがある。この場合、結果はデスティネーションレジスタに保持できる値に丸められ、この結果は不正確と呼ばれる。不正確例外は、次の条件が起きた場合に常に発生する。
• 結果が、丸め前の計算結果と等しくない。
• 非トラップオーバフロー例外が発生した。
• Flush-to-Zero モードでないとき、非トラップアンダーフロー例外が発生した。
2.2処理流れ
VFPコアプロセッサの実行状態は二つとなる:
² 正常モード
² 例外モード
初期化後、VFPコアプロセッサは「正常モード」の状態で、MPCOREからVFP命令を受け入れ、実行する。
「例外モード」に入るには(ハードウェアー実装)
VFPコアプロセッサがMPCOREから受け入れるVFP命令を監視している。該当VFP命令は「上記VFP例外を起こすVFP命令」の容疑がある場合、VFPコアプロセッサが「例外モード」印をセットし、「例外モード」に入る(例えば、0除算命令)。そのVFP命令は「エラー容疑命令」と呼ぶ。しかし、この時点には、VFPコアプロセッサの「例外モード」がMPCOREに通知されていない。ということは、VFPコアプロセッサが「例外モード」になったとたん、MPCOREの例外を起こさない。MPCORE例外を起こすため、VFPコアプロセッサがMPCOREに通知しなければならない。
MPCOREの例外の起こし(ハードウェアー実装)
VFPコアプロセッサが「例外モード」に入って以降、リセットまでに、別のVFP命令に対して実行拒否状態となって、実行拒否シグナルより、MPCOREにARMのundefined instruction 例外を起こす。ということは、「エラー容疑命令」直後のVFP命令はVFPコアプロセッサに実行拒否され、MPCOREのundefined instruction例外を起こす。これは「trigger命令」と呼ぶ。MPCOREはundefined instructionの例外ハンドラにVFPの状態をチェックし、ソフトウェアーより、「エラー容疑命令」を探し、処理する(「エラー容疑命令」の具体処理は次に説明する)。
Monitor the vfp instruction |
Find suspicious vfp instruction |
Set the VFP coprocessor into exeption mode |
next VFP instruction comes |
Denie the VFP instruction Trigger mpcore undefined instruction exception |
Enter VFP exception handler,Scan the VFP register,if there is an exception |
VFP trap enable |
VFP coprocessor |
MPCORE arm |
Enter undefined instruction exception mode |
will the previos VFP instruction cause error,indeed? |
Take remedial actions,follow IEEE 754 standard |
無効演算例外 remedial actions |
0による除算例外remedial actions |
オーバフロー例外remedial actions |
アンダーフロー例外remedial actions |
不正確例外remedial actions |
|
部分はremedial actionで、IEEE標準を参照する |
founded |
not founded |
yes |
no |
return |
「エラー容疑命令」処理
MPCOREの例外が「trigger命令」より起こされる。また、時間的に「trigger命令」は「エラー容疑命令」の後に実行される。なので、MPCOREの例外が起こされる時点、「エラー容疑命令」の実行が済ましたのである。ソフトウェアーが実行された命令の中に、「エラー容疑命令」を探し出さなければならない。
「エラー容疑命令」を確定してから、「エラー容疑命令」を解凍する(bin code->assemble programに変更)。処理変数を洗い出す。それから、該当VFP命令には本当に間違いがあるかどうかをIEEE標準にしたがって、チェックする。このチェックプログラムは「VFP例外処理」と呼ぶ。「VFP例外処理」には該当VFP命令に間違いがあれば、失敗値を戻る。
該当VFP命令には本当に間違いがない場合(ミス判断)、VFPコアプロセッサを正常モードに戻させる。該当VFP命令には本当に間違いがある場合、IEEE標準により、正しい結果を計算し、メモリに出力する。必要あれば、別のtrapを起こす(システムにエラー通知のため)。最後に、VFPをリセットし、「trigger命令」を再び実行させる。(「trigger命令」再実行の理由はARMスペックのVFPセクションを参照する。)
3用語一覧
単精度数値 | 32 ビット値で、メモリ上でワード境界にアラインしている必要があります。この値はIEEE 754-1985 標準に準拠した基本単精度浮動小数点数値として解釈されます。 |
NaN | NaN(Not a Number、非数)は、コンピュータにおいて主に浮動小数点演算の結果として、不正なオペランドを与えられたために生じた結果を表す値またはシンボルである。 たとえば、負の数値の平方根を求めることができないため、演算結果が不正であることを示す値としてNaNが生成される。 |
丸め | 浮動小数点演算は本質的に精度が制限されています。数値演算の正確な結果には、デスティネーションに定義された形式で表現できる値よりも高い精度の値が多くの場合含まれているためです。この問題を解決するために、結果はデスティネーションの形式に合わせて丸められ、その形式において正確な演算結果を近似する数値が選択される。 |
正規化数 | 最小の正の正規化数は、2 −126、または約1.175 × 10 −38 です。最大の正の正規化数は、(2 −2 −23)× 2127、または約3.403 × 1038 です。 |
VFPコアプロセッサ | 浮動少数処理単位 |
無限大 |
|
オペランド | 命令の操作変数 |
デスティネーション | 命令処理結果のアウトプットターゲット |