在Linux上,feenableexcept和fedisableexcept可用于控制浮点异常时SIGFPE中断的生成。如何在Mac OS X Intel上执行此操作?
用于启用浮点中断的内联汇编在http://developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf中提供,第7-15页,但仅用于PowerPC汇编。
发布于 2008-12-04 14:06:36
可以从xmmintrin.h
使用_MM_SET_EXCEPTION_MASK
启用sse的例外。例如,要启用无效(nan)异常,请执行以下操作
#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);
发布于 2008-10-31 04:23:31
在Mac上,这是中等复杂的。默认情况下,OS对所有FP数学都使用SSE单位,而不是x87 FP单位。SSE单元不支持中断选项,因此这意味着除了启用中断之外,您还需要确保编译所有代码以避免使用SSE数学运算。
您可以通过向您的CFLAGS添加"-mno-sse -mno-sse2 -mno-sse3“来禁用数学运算。一旦你这样做了,你就可以使用一些内联汇编来配置你的FP异常,基本上和Linux一样的标志。
short fpflags = 0x1332 // Default FP flags, change this however you want.
asm("fnclex");
asm("fldcw _fpflags");
您可能会发现,由于OS完全是使用sse构建的,因此可能存在未捕获的bug。我知道曾经有一个大问题,信号处理程序没有传回正确的代码,但那是几年前的事了,希望现在已经解决了。
https://stackoverflow.com/questions/247053
复制相似问题