Включение прерываний с плавающей запятой в Mac OS X Intel

В 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.

Ответ 1

Исключения для sse можно включить, используя _MM_SET_EXCEPTION_MASK от xmmintrin.h. Например, чтобы включить недопустимые (nan) исключения, выполните

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

Ответ 2

В 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, могут быть обнаружены ошибки. Я знаю, что когда-то был большой с обработчиком сигнала, который не передавал правильные коды, но это было несколько лет назад, надеюсь, теперь оно исправлено.