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

Поскольку C / C ++ не проверяет границы.

Массивы внутренне указывают на местоположение в памяти. Когда вы вызываете arr[index], что он делает, это:

type value = *(arr + index);

Результаты - это большие числа (не обязательно), потому что они являются значениями мусора. Также как неинициализированная переменная.

18
задан Geoffrey Irving 29 October 2008 в 14:41
поделиться

2 ответа

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

#include <xmmintrin.h>
...
_MM_SET_EXCEPTION_MASK(_MM_GET_EXCEPTION_MASK() & ~_MM_MASK_INVALID);
24
ответ дан 30 November 2019 в 07:56
поделиться

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

7
ответ дан 30 November 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: