Скачиваний:
72
Добавлен:
16.04.2013
Размер:
149 Кб
Скачать

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

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

3.4.3.1. Бит NaT

Бит NaT (Not A Thing – не вещественное) является дополнительным битом для каждого общего регистра. Бит 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 (User NaT Collection – набор NaT пользователя).

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

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