Включение прерываний с плавающей запятой в Mac OS X Intel
-
05-07-2019 - |
Вопрос
В 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.
Решение
Исключения для 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, могут быть не обнаруженные ошибки.Я знаю, что раньше была проблема, когда обработчик сигналов не передавал обратно нужные коды, но это было несколько лет назад, надеюсь, сейчас это исправлено.