Включение прерываний с плавающей запятой в Mac OS X Intel - PullRequest
18 голосов
/ 29 октября 2008

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

24 голосов
/ 04 декабря 2008

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

#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);
7 голосов
/ 31 октября 2008

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

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

...