2008-10-29 3 views
17

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

Встроенная сборка для включения прерываний с плавающей запятой представлена ​​в http://developer.apple.com/documentation/Performance/Conceptual/Mac_OSX_Numerics/Mac_OSX_Numerics.pdf, стр. 7-15, но только для сборки PowerPC.

ответ

23

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

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

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

+2

Это может быть не столь актуальны в 2008 году, но стоит отметить, что 64 битный код используется блок SSE, а не блок x87 FP на все платформы (не только OS X). – Spock

Смежные вопросы