5.5 __ieee_status()

ARM コンパイラツールチェーンでは、浮動小数点環境のステータスワードへのインタフェースがサポートされています。このインタフェースは、関数 __ieee_status() によって提供されます。一般的に VFP のステータスワードを変更するにはこの関数を使用するのが最も効率的です。

__ieee_status()fenv.h で定義されています。
__ieee_status() の関数プロトタイプは次のとおりです。
unsigned int __ieee_status(unsigned int mask, unsigned int flags);

この関数では、例外をサポートする浮動小数点モデルを選択する必要があります。例えば、--fpmode=ieee_full--fpmode=ieee_fixed です。
__ieee_status() は、パラメータに基づいてステータスワードの書き込み可能部分を修正し、そのワード全体の前の値を返します。
書き込み可能ビットを変更するには、それらの値を以下のように設定します。
new = (old & ~mask) ^ flags;
対応するマスクとフラグのビットに基づき、ステータスワードの各ビットに対しては 4 つの異なる演算を実行できます。

表 5-2 ステータスワードビットの修正

マスクのビット フラグのビット 効果
0 0 変更なし
0 1 切り替え
1 0 0 を設定
1 1 1 を設定
__ieee_status() を使用したときのステータスワードのレイアウトを以下に示します。
図 5-2 IEEE のステータスワードのレイアウト
この図を表示するには、ご使用のブラウザが SVG 形式をサポートしている必要があります。ネイティブでサポートしているブラウザをインストールするか、次のような適切なプラグインをインストールします。Adobe SVG Viewer。.

ステータスワードのフィールドを以下に示します。
  • ビット 0 ~ 4(それぞれ 0x10x10 の値)は、各例外のスティッキーフラグまたは累積フラグです。例外のスティッキーフラグには、その例外が発生し、トラップされなかった場合に 1 が設定されます。スティッキーフラグはシステムによってクリアされることはなく、ユーザによってのみクリアされます。例外はこれらのビットに以下のようにマップされます。
    • ビット 0(0x01)は無効演算例外です。
    • ビット 1(0x02)はゼロによる除算例外です。
    • ビット 2(0x04)はオーバーフロー例外です。
    • ビット 3(0x08)はアンダーフロー例外です。
    • ビット 4(0x10)は不正確結果例外です。
  • ビット 8 ~ 12(0x1000x1000 の値)は例外マスクです。これらのビットは例外がトラップされるかどうかを制御します。これらのビットのいずれかに 1 が設定されると、対応する例外がトラップされます。これらのビットのいずれかに 0 が設定されると、対応する例外によってそのスティッキーフラグが設定され、正しそうな結果が返されます。
  • ビット 16 ~ 18 とビット 20 ~ 21 は、VFP ベクタ機能を制御するために VFP ハードウェアによって使用されます。__ieee_status() の呼び出しによってこれらのビットを変更することはできません。
  • ビット 22 とビット 23 は、丸めモードを制御します。以下の表を参照して下さい。

    表 5-3 丸めモードの制御

    ビット 丸めモード
    00 近似値への丸め
    01 切り上げ
    10 切り下げ
    11 ゼロへの丸め

    fz* fj* および f* ライブラリバリアントでは、近似値への丸めの丸めモードのみがサポートされています。他の丸めモードのサポートが必要な場合は、完全に IEEE に準拠した g* ライブラリを使用する必要があります(関連するコンパイラオプションは、--fpmode=std--fpmode=ieee_no_fenv および --fpmode=ieee_fixed です)。
  • ビット 24 を設定すると、FZ(ゼロクリア)モードが有効にされます。非正規数の処理は複雑で浮動小数点システムの処理速度が低下するため、FZ モードでは処理速度を上げるために非正規数はすべてゼロに強制設定されます。このビットを設定することで精度は落ちますが、処理速度は上がります。

    • IEEE ステータスワードの FZ ビットは、fplib バリアントのいずれでもサポートされていません。つまり、ゼロクリアとゼロクリア以外との間の切り替えを、実行時に fplib のバリアントのいずれかで実行することはできません。ただし、ゼロクリアまたはゼロクリア以外の設定は、ビルド用に選択するライブラリにより、結果的にコンパイル時に設定できます。
    • 一部の関数は、ハードウェアで提供されていません。これらは、ソフトウェア浮動小数点ライブラリにのみ存在します。このため、これらの関数では、ハードウェア VFP アーキテクチャ用にコンパイルする場合であっても、FZ モードがサポートされません。したがって、FZ モードを動的に変更した場合、浮動小数点ライブラリの動作が関数によって異なります。
  • ビット 27 は、整数のアドバンスト SIMD サチュレート演算でサチュレーションが発生したことを示します。このビットには、__ieee_status() 呼び出しによってアクセスできます。
  • R でマークされているビットは予約ビットです。__ieee_status() 呼び出しによってこれらのビットに書き込むことはできません。これらのビットに何らかの値が保持されていても無視する必要があります。
__ieee_status() 呼び出しの定義に加え、fenv.h ではその引数に使用される次の定数も定義されています。
#define FE_IEEE_FLUSHZERO          (0x01000000) #define FE_IEEE_ROUND_TONEAREST    (0x00000000) #define FE_IEEE_ROUND_UPWARD       (0x00400000) #define FE_IEEE_ROUND_DOWNWARD     (0x00800000) #define FE_IEEE_ROUND_TOWARDZERO   (0x00C00000) #define FE_IEEE_ROUND_MASK         (0x00C00000) #define FE_IEEE_MASK_INVALID       (0x00000100) #define FE_IEEE_MASK_DIVBYZERO     (0x00000200) #define FE_IEEE_MASK_OVERFLOW      (0x00000400) #define FE_IEEE_MASK_UNDERFLOW     (0x00000800) #define FE_IEEE_MASK_INEXACT       (0x00001000) #define FE_IEEE_MASK_ALL_EXCEPT    (0x00001F00) #define FE_IEEE_INVALID            (0x00000001) #define FE_IEEE_DIVBYZERO          (0x00000002) #define FE_IEEE_OVERFLOW           (0x00000004) #define FE_IEEE_UNDERFLOW          (0x00000008) #define FE_IEEE_INEXACT            (0x00000010) #define FE_IEEE_ALL_EXCEPT         (0x0000001F)
例えば、丸めモードを切り下げに設定するには、以下の呼び出しを行います。
__ieee_status(FE_IEEE_ROUND_MASK, FE_IEEE_ROUND_DOWNWARD);
無効演算例外のトラップを有効にし、他のすべての例外のトラップを無効にするには、以下のように記述します。
__ieee_status(FE_IEEE_MASK_ALL_EXCEPT, FE_IEEE_MASK_INVALID);
不正確結果例外のトラップを無効にするには、以下のように記述します。
__ieee_status(FE_IEEE_MASK_INEXACT, 0);
アンダーフロースティッキーフラグをクリアするには、以下のように記述します。
__ieee_status(FE_IEEE_UNDERFLOW, 0);
関連する概念
3.8 ARM 浮動小数点環境の制御
3.29 IEEE 754 浮動小数点演算で発生する例外
関連する参考文書
3.16 C99 インタフェースの ARM 浮動小数点コンパイラ拡張
5.3 __fp_status()
1.88 C および C++ ライブラリの命名規則
非機密扱いPDF file icon PDF 版ARM DUI0475KJ
Copyright © 2010-2014 ARM.All rights reserved.