2008-10-29 19 views

回答

23

sse的例外情况可以使用_MM_SET_EXCEPTION_MASKxmmintrin.h启用。例如,为了使无效(NAN)异常,做

#include <xmmintrin.h> 
... 
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID); 
6

在Mac OS X上,这是相当复杂的。 OS X默认使用SSE单位进行所有FP数学运算,而不是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 X完全使用sse构建,因此可能存在未捕获的错误。我知道信号处理程序过去并没有传回正确的代码,但那是几年前的事情,希望现在已经修复了。

+2

这也许不是2008年那么重要,但值得注意的是,64位代码使用SSE单元,而不是的x87 FP单元在所有平台上(不仅OS X)。 – Spock 2014-05-09 09:59:12