19

在 Linux 上,feenableexcept 和 fedisableexcept 可用于控制浮点异常时 SIGFPE 中断的生成。如何在 Mac OS X Intel 上执行此操作?

http://developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf , pp. 7-15中提供了用于启用浮点中断的内联汇编,但仅适用于 PowerPC 汇编。

4

2 回答 2

25

可以使用_MM_SET_EXCEPTION_MASKfrom启用 sse 的例外xmmintrin.h。例如,要启用无效 (nan) 异常,请执行

#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);
于 2008-12-04T14:06:35.710 回答
7

在 Mac OS X 上,这有点复杂。默认情况下,OS X 对所有 FP 数学使用 SSE 单元,而不是 x87 FP 单元。SSE 单元不支持中断选项,这意味着除了启用中断之外,您还需要确保编译所有代码以不使用 SSE 数学。

您可以通过将“-mno-sse -mno-sse2 -mno-sse3”添加到您的 CFLAGS 来禁用数学。一旦你这样做了,你就可以使用一些内联汇编来配置你的 FP 异常,其标志与 Linux 基本相同。

short fpflags = 0x1332 // Default FP flags, change this however you want. 
asm("fnclex");
asm("fldcw _fpflags");

您可能会发现一个问题是,由于 OS X 完全使用 sse 构建,因此可能存在未捕获的错误。我知道信号处理程序没有传回正确的代码曾经有一个大问题,但那是几年前的事了,希望现在已经修复了。

于 2008-10-31T04:23:30.837 回答