4.2.1. __ieee_status()

RVCT では、浮動小数点環境のステータスワードへのインタフェースがサポートされています。 この関数は __ieee_status と呼ばれ、一般的に VFP のステータスワードを変更するにはこの関数を使用するのが最も効率的です。__ieee_status は、fenv.h 内で定義されています。

__ieee_status のプロトタイプを以下に示します。

unsigned int __ieee_status(unsigned int mask,
                           unsigned int flags);

この関数は、パラメータに基づいてステータスワードの書き込み可能部分を修正し、そのワード全体の前の値を返します。

書き込み可能ビットを変更するには、それらの値を以下のように設定します。

new = (old & ~mask) ^ flags;

対応するマスクとフラグのビット(Table 4.6 を参照)に基づき、ステータスワードの各ビットに対しては 4 つの異なる演算を実行できます。

Table 4.6. ステータスワードビットの修正

マスクのビットフラグのビット効果
00変更なし
01切り替え
100 を設定
111 を設定

Figure 4.1 は、__ieee_status を使用したときのステータスワードのレイアウトを示しています。

Figure 4.1. IEEE のステータスワードのレイアウト

IEEE のステータスワードのレイアウト

Figure 4.1 は以下のフィールドを示しています。

__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);

アンダーフロー sticky フラグをクリアするには、以下のように記述します。

__ieee_status(FE_IEEE_UNDERFLOW, 0);
Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0349AJ
Non-Confidential