Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MProc / M9 / Архитектура часть 4..doc
Скачиваний:
42
Добавлен:
16.04.2013
Размер:
430 Кб
Скачать

4.4.4.4. Спекуляция по управлению без восстановления

Не спекулятивные инструкции, которые читают регистры, содержащие маркер отложенного исключения, вызовут ошибку «Употребление регистрового NaT». Такие инструкции можно считать выполняющими не восстанавливаемые операции проверки спекуляции. В некоторых средах компиляции может быть истинно, что задержанные исключения являются только фатальными ошибками. В такой программе, если результат спекулятивного вычисления проверен и найден маркер отложенного исключения, то выполнение программы прекращается. Для такой программы, результаты спекулятивных вычислений могут быть проверены просто путем использования не спекулятивных инструкций.

4.4.4.5. Контроль операционной системы над откладыванием исключений

Существует дополнительный механизм, который позволяет операционной системе управлять поведением спекулятивных загрузок. Операционная система имеет опцию для выбора: какие исключения будут отложены автоматически аппаратными средствами, а какие исключения будут обработаны (и возможно отложены) программно. См. раздел 5.5.5 «Откладывание ошибок спекулятивной загрузки» во втором томе.

4.4.4.6. Сливание и заливание регистров

Имеются специальные инструкции сохранения и загрузки для сливания (spill) регистра в память с запоминанием маркера отложенного исключения и для восстановления (заливания - fill) слитого регистра.

Инструкции st8.spill и ld8.fill предназначены для сохранения и восстановления основного регистра вместе с соответствующим NaT битом.

Инструкция st8.spill записывает NaT бит в прикладной регистр UNAT, а если NaT бит равен 0, то записывает 64-битовый блок данных в память. Если NaT бит равен 1, то UNAT обновляется, а обновление памяти происходит специфически и должно следовать одному из трех видов поведения:

  • st8.spill может не обновлять память 64-битовыми блоками данных из регистра, либо

  • st8.spill может записать нули в указанное место памяти, либо

  • st8.spill может записать в память 64-битовый блок данных из регистра, но только если это выполнение возвращает ноль в приемный регистр всех спекулятивных загрузок NaT, и если выполнение также гарантирует, что все инструкции распространения NaT выполняют все вычисления так, как определено страницами инструкций.

Биты 8:3 адреса памяти задают, какой бит будет записан в регистр UNAT.

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

Инструкции stf.spill и ld.fill предназначены для сохранения и восстановления регистра с плавающей точкой (хранимого как 16-байтовое) без вызова исключения, даже если FR содержит NaTVal (эти инструкции не затрагивают регистр UNAT).

Инструкции сливания и восстановления регистров позволяют сливать и восстанавливать регистры, которые являются приемниками спекулятивных инструкций и поэтому могут содержать маркер отложенного исключения. Заметим также, что передачи между основными регистрами и регистрами с плавающей точкой вызовут преобразование между двумя форматами маркера отложенного исключения.

В таблице 4.14 перечислены состояния связанные со спекуляцией по управлению. В табл.4.15 собраны инструкции связанные со спекуляцией по управлению.

Табл.4.14. Состояния, связанные со спекуляцией по управлению

Регистр

Описание

NaT биты

65-бит для каждого основного регистра, признак задержанного исключения

NaTVal

Псевдонулевой код для FR, является признаком задержанного исключения

UNAT

Прикладной регистр с набором NaT битов пользователя