4.2.4. Microsoft 兼容性函数

为了与 Microsoft 产品保持兼容,编译器实现了以下函数,以便于将浮点代码移植到 ARM 体系结构中。 这些函数是在 float.h 中定义的。

_controlfp()

可以使用 _controlfp 函数来控制异常捕获和舍入模式:

unsigned int _controlfp(unsigned int new, unsigned int mask);

此函数还通过使用掩码隔离要修改的位来修改控制字。 对于每个为零的 mask 位,相应控制字位保持不变。 对于每个非零的 mask 位,相应控制字位被设置为对应 new 位的值。 返回值是以前的控制字状态。

Note

这与 __ieee_status(或 __fp_status的行为并不完全相同;对于后者,可通过在掩码字中设置 0 并在标记字中设置 1 对位进行切换。

Table 4.8 介绍了可用于构成 _controlfp 参数的宏。

Table 4.8. _controlfp 自变量宏

说明
_MCW_EM 包含所有异常位的掩码
_EM_INVALID 描述“无效运算”异常的位
_EM_ZERODIVIDE 描述“除以零”异常的位
_EM_OVERFLOW 描述“溢出”异常的位
_EM_UNDERFLOW 描述“下溢”异常的位
_EM_INEXACT 描述“不精确结果”异常的位
_MCW_RC 舍入模式字段的掩码
_RC_CHOP 描述“向零舍入”的舍入模式值
_RC_UP 描述“向上舍入”的舍入模式值
_RC_DOWN 描述“向下舍入”的舍入模式值
_RC_NEAR 描述“舍入到最接近的数”的舍入模式值

Note

无法保证这些宏的值在将来版本的 ARM 产品中保持不变。 要确保这些值在将来版本中发生变化时代码仍然有效,请使用宏而不是使用其值。

例如,要将舍入模式设置为向下舍入,应执行以下命令:


_controlfp(_RC_DOWN, _MCW_RC);

要捕获“无效运算”异常而不捕获所有其他异常,应执行以下命令:


_controlfp(_EM_INVALID, _MCW_EM);

要不捕获“不精确结果”异常,应执行以下命令:


_controlfp(0, _EM_INEXACT);

_clearfp()

_clearfp 函数清除所有 5 个异常粘性标记并返回其先前的值。 Table 4.8 中给出的宏(如 _EM_INVALID_EM_ZERODIVIDE)可用于测试返回结果的位。

_clearfp 具有以下原型:

unsigned _clearfp(void);

_statusfp 函数

_statusfp 函数返回当前的异常粘性标记值。 可以使用Table 4.8 中显示的宏来测试返回结果的位,例如,_EM_INVALID_EM_ZERODIVIDE

_statusfp 具有以下原型:

unsigned _statusfp(void);

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