Включение прерываний с плавающей запятой в 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.

2 ответов


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

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

на Mac OS X это умеренно сложно. OS X использует блок SSE для всей математики FP по умолчанию, а не блок x87 FP. Блок SSE не соблюдает параметры прерывания, поэтому это означает, что в дополнение к включению прерываний вам необходимо убедиться, что весь ваш код не использует SSE math.

вы можете отключить математику, добавив "-mno-sse-mno-sse2-mno-sse3" к вашим CFLAGS. После этого вы можете использовать некоторую встроенную сборку для настройки исключений FP, в основном те же флаги, что и Linux.

short fpflags = 0x1332 // Default FP flags, change this however you want. 
asm("fnclex");
asm("fldcw _fpflags");

один улов, который вы можете найти, заключается в том, что, поскольку OS X полностью построена с использованием sse, могут быть необнаруженные ошибки. Я знаю, что раньше был большой с обработчиком сигналов, не передающим правильные коды, но это было несколько лет назад, надеюсь, теперь это исправлено.