Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MProc / M9 / Оптимизация часть 3..doc
Скачиваний:
17
Добавлен:
16.04.2013
Размер:
148.99 Кб
Скачать

3.4.3. Использование спекуляции по управлению в архитектуре IntelItanium

Проверка того, была ли спекуляция по управлению успешной, делается также как и при спекуляции по данным.

3.4.3.1. Бит NaT

Бит NaT(NotAThing– не вещественное) является дополнительным битом для каждого общего регистра. БитNaTрегистра указывает, является ли содержимое регистра легальным. Если битNaTустановлен в 1, то регистр содержит маркер отложенного исключения, которое появилось из-за предыдущей ошибки спекуляции. В регистре с плавающей точкой присутствует специальное значение называемоеNatVal, которое сигнализирует об отложенном исключении.

В течение спекулятивной по управлению загрузки, NaTбит принимающего регистра загрузки может быть установлен в случае, если произойдет исключение, и оно будет отложено. Точный набор событий и исключений, которые приводят к откладыванию исключения (вызывая тем самым, установку битаNaT), частично зависит от политики операционной системы. Если спекулятивная инструкция читает исходный регистр, в котором установленNaTбит, тоNaTбиты приемных регистров тоже устанавливаются. То естьNaTбиты распространяются через зависимые вычисления.

3.4.3.2. Пример спекуляции по управлению

Когда планируется загрузка спекулятивная по управлению, компилятор должен вставить проверку спекуляции (chk.s) на всех путях, где будут использованы результаты спекулятивной загрузки. Если регистр, у которого установленNaTбит, будет прочитан не спекулятивной инструкцией (другой, чемchk.s), то происходит ошибка УпотребленияNaT, и операционная система завершает программу.

Нижеследующая последовательность кода иллюстрирует основное использование спекуляции по управлению:

(p1) br.cond некая_метка // Такт 0

ld8 r1=[r5];; // Такт 1

add r2=r1,r3 // Такт 3

Этот код может быть переписан с использованием спекулятивной по управлению загрузки и проверки. Проверка может быть помещена в тот же самый блок, на место оригинальной загрузки:

ld8.s r1=[r5];; // Такт-2

// Другиеинструкции

(p1) br.cond некая_метка // Такт 0

chk.s r1,recovery // Такт0

add r2=r1,r3 // Такт 0

Пока проверка спекуляции не достигнута динамически, результаты спекулятивных по управлению инструкций не могут быть сохранены в памяти, в противном случае, при не спекулятивном обращении возможны ошибки. Если проверка спекуляции выполнена и NaTбит проверяемого регистра установлен, то процессор выполнит переход к коду восстановления, указанному инструкцией проверки.

Возможно, также проверить присутствие битов NaTи значенийNaTVal, используя инструкцию проверкиNaTбита (tnat) и инструкцию проверки класса с плавающей точкой (fclass).

Хотя каждое спекулятивное вычисление должно быть проверено, но это не подразумевает, что каждая спекулятивная загрузка требует собственной chk.s. Спекулятивные проверки могут быть оптимизированы, с помощью использования свойства распространенияNaTбитов по регистрам, как это описано в разделе 3.5.6.

3.4.3.3. Сливания, заливания и регистр unat

Сохранение и восстановление регистров, которые могут иметь установленные биты NaTдопускается с помощью инструкцийst8.spillиld8.fill, а также прикладного регистраUNAT(UserNaTCollection– наборNaTпользователя).

Инструкция сливания (spill) общего регистра иNaT(st8.spill), сохраняет в памяти восемь байт основного регистра и записывает битNaTв регистрUNAT. Биты 8:3 адреса памяти сохранения, задают, в какой бит регистраUNATбудет записано значениеNaTрегистра. Инструкция заливания (fill) общего регистра иNaT(ld8.fill), считывает восемь байт из памяти в основной регистр и устанавливаетNaTбит регистра в соответствии со значением, хранящимся вUNAT. Программа отвечает за сохранение и восстановление содержимогоUNATдля гарантии корректности сливания и заливания битовNaT.

Соответствующие инструкции с плавающей точкой – stf.spillиldf.fill, сохраняют и восстанавливают регистры с плавающей точкой в формате регистра с плавающей точкой, без вызова исключений из-за присутствия значенийNaTVal.