5.3 __fp_status()

ARM® コンパイラツールチェーンでは、浮動小数点環境のステータスワードへのインタフェースがサポートされています。旧バージョンの ARM ライブラリの中には、このインタフェースを提供する __fp_status() という名前の関数が実装されていたものがあります。

ARM コンパイラ ツールチェーンでは、AArch64 ターゲット用の浮動小数点の例外のトラップはサポートされません。
__fp_status() は、__ieee_status() と同じですが、旧式のステータスワードのレイアウトを使用します。下位互換性を維持するため、コンパイラでは現在でも __fp_status() 関数がサポートされています。__fp_status()stdlib.h で定義されています。
__fp_status() の関数プロトタイプは次のとおりです。
unsigned int __fp_status(unsigned int mask, unsigned int flags);

この関数には、例外をサポートする浮動小数点モデルが必要です。 ARM コンパイラ コンパイラ 6 では、これはデフォルトで有効になっています。-ffast-math などの armclang コマンドラインオプションによって無効になります。
__fp_status() を使用したときのステータスワードのレイアウトを以下に示します。
図 5-1 浮動小数点ステータスワードのレイアウト
この図を表示するには、ご使用のブラウザが SVG 形式をサポートしている必要があります。ネイティブでサポートしているブラウザをインストールするか、次のような適切なプラグインをインストールします。Adobe SVG Viewer。.

ステータスワードのフィールドを以下に示します。
  • ビット 0 ~ 4(それぞれ 0x10x10 の値)は、各例外のスティッキーフラグまたは累積フラグです。例外のスティッキーフラグには、その例外が発生し、トラップされなかった場合に 1 が設定されます。スティッキーフラグはシステムによってクリアされることはなく、ユーザによってのみクリアされます。例外はこれらのビットに以下のようにマップされます。
    • ビット 0(0x01)は無効演算例外です。
    • ビット 1(0x02)はゼロによる除算例外です。
    • ビット 2(0x04)はオーバーフロー例外です。
    • ビット 3(0x08)はアンダーフロー例外です。
    • ビット 4(0x10)は不正確結果例外です。
  • ビット 8 ~ 12(0x1000x1000 の値)は、浮動小数点アーキテクチャ(FPA)のさまざまな機能を制御します。FPA は廃止され、 ARM コンパイルツールではサポートされていません。これらのビットへの書き込みはすべて無視されます。
  • ビット 16 ~ 20(0x100000x100000 の値)は例外マスクです。これらのビットは例外がトラップされるかどうかを制御します。これらのビットのいずれかに 1 が設定されると、対応する例外がトラップされます。これらのビットのいずれかに 0 が設定されると、対応する例外によってそのスティッキーフラグが設定され、正しそうな結果が返されます。
  • ビット 24 ~ 31 に保持されるシステム ID は変更できません。ソフトウェア浮動小数点の場合は 0x40 が設定され、ハードウェア浮動小数点の場合は 0x80 以上の値が設定され、ハードウェア浮動小数点環境がエミュレータによってシミュレートされる場合は 0 または 1 が設定されます。
  • R でマークされているビットは予約ビットです。__fp_status() 呼び出しによってこれらのビットに書き込むことはできません。これらのビットに何らかの値が保持されていても無視する必要があります。
丸めモードを __fp_status() 呼び出しで変更することはできません。
__fp_status() 呼び出しの定義に加え、stdlib.h ではその引数に使用される次の定数も定義されています。
#define __fpsr_IXE  0x100000 #define __fpsr_UFE  0x80000 #define __fpsr_OFE  0x40000 #define __fpsr_DZE  0x20000 #define __fpsr_IOE  0x10000 #define __fpsr_IXC  0x10 #define __fpsr_UFC  0x8 #define __fpsr_OFC  0x4 #define __fpsr_DZC  0x2 #define __fpsr_IOC  0x1
例えば、無効演算例外をトラップして、他のすべての例外のトラップを無効にするには、次の入力パラメータを使用して __fp_status() を呼び出します。
__fp_status(_fpsr_IXE | _fpsr_UFE | _fpsr_OFE |             _fpsr_DZE | _fpsr_IOE, _fpsr_IOE);
不正確結果例外のトラップを無効にするには、以下のように記述します。
__fp_status(_fpsr_IXE, 0);
アンダーフロースティッキーフラグをクリアするには、以下のように記述します。
__fp_status(_fpsr_UFC, 0);
関連する概念
3.2 ARM 浮動小数点環境の制御
関連する参考文書
5.5 __ieee_status()
非機密扱いPDF file icon PDF 版ARM DUI0808CJ
Copyright © 2014, 2015 ARM.All rights reserved.