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)。

Table 4.6. 状态字位修改

掩码位 标记位 效果
0 0 保持不变
0 1 切换
1 0 设置为 0
1 1 设置为 1

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

要清除“下溢”粘性标记,应执行以下命令:


__ieee_status(FE_IEEE_UNDERFLOW, 0);

Copyright © 2007 ARM Limited. All rights reserved. ARM DUI 0349AC
Non-Confidential