在 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 汇编。
在 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 汇编。
可以使用_MM_SET_EXCEPTION_MASK
from启用 sse 的例外xmmintrin.h
。例如,要启用无效 (nan) 异常,请执行
#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);
在 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 构建,因此可能存在未捕获的错误。我知道信号处理程序没有传回正确的代码曾经有一个大问题,但那是几年前的事了,希望现在已经修复了。