Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在Mac OS X Intel上启用浮点中断_Macos_Intel_Interrupt_Floating Point Exceptions - Fatal编程技术网

Macos 在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

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


用于启用浮点中断的内联汇编在第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上的@Spock
long double
需要x87 FPU。类似地,在Win64上使用MinGW-W64。