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

17

В Linux, feenableexcept и fedisableexcept могут использоваться для управления генерацией прерываний SIGFPE при исключениях с плавающей запятой. Как это сделать в Mac OS X Intel?

Встроенная сборка для включения прерываний с плавающей запятой представлена ​​в ссылке , стр. 7 -15, но только для сборки PowerPC.

    
задан Geoffrey Irving 29.10.2008 в 15:41
источник

2 ответа

23

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

#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);
    
ответ дан Geoffrey Irving 04.12.2008 в 15:06
6

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

    
ответ дан Louis Gerbarg 31.10.2008 в 05:23
  • Возможно, это было не так важно в 2008 году, но стоит отметить, что 64-разрядный код использует блок SSE, а не блок x87 FP на всех платформах (а не только для OS X). –  Spock 09.05.2014 в 11:59