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