Macos 在Mac OS X Intel上启用浮点中断
在Linux上,feenableexcept和fedisableexcept可用于控制浮点异常上SIGFPE中断的生成。如何在Mac OS X Intel上执行此操作Macos 在Mac OS X Intel上启用浮点中断,macos,intel,interrupt,floating-point-exceptions,Macos,Intel,Interrupt,Floating Point Exceptions,在Linux上,feenableexcept和fedisableexcept可用于控制浮点异常上SIGFPE中断的生成。如何在Mac OS X Intel上执行此操作 用于启用浮点中断的内联汇编在第7-15页中提供,但仅适用于PowerPC汇编。在Mac OS X上,这相当复杂。默认情况下,OSX对所有FP数学使用SSE单位,而不是x87 FP单位。SSE单元不支持中断选项,因此这意味着除了启用中断外,还需要确保编译所有代码时不使用SSE数学 您可以通过在CFLAGS中添加“-mno-sse-m
用于启用浮点中断的内联汇编在第7-15页中提供,但仅适用于PowerPC汇编。在Mac OS X上,这相当复杂。默认情况下,OSX对所有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");
您可能会发现,由于OSX完全使用sse构建,因此可能存在未捕获的bug。我知道过去有一个很大的问题,信号处理程序没有传回正确的代码,但那是几年前的事了,希望现在可以解决。sse的异常可以使用
\u MM\u SET\u EXCEPTION\u MASK
从xmmintrin.h
启用。例如,要启用无效(nan)异常,请执行以下操作
#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);
#包括
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK()&~ _MM_MASK_INVALID);
这在2008年可能不太相关,但值得注意的是,64位代码在所有平台(不仅仅是OS X)上都使用SSE单元而不是x87 FP单元。Linux上的@Spocklong double
需要x87 FPU。类似地,在Win64上使用MinGW-W64。