- •4. Модель прикладного программирования.
- •4.1. Стек регистров
- •4.1.1. Управление стеком регистров
- •4.1.2. Инструкции стека регистров
- •4.2. Инструкции целочисленного вычисления
- •4.2.1. Арифметические инструкции
- •4.2.2. Логические инструкции
- •4.2.4. Инструкции битовых полей и сдвигов
- •4.3. Инструкции сравнения и предикация
- •4.3.1. Предикация
- •4.3.2. Инструкции сравнения
- •4.2.5. Большие константы.
- •4.3.3. Типы сравнения
- •4.3.4. Передачи предикатных регистров
- •4.4. Инструкции доступа к памяти
- •4.4.1. Инструкции загрузки
- •4.4.2. Инструкции сохранения
- •4.4.3. Семафорные инструкции
- •4.4.4. Спекуляция по управлению
- •4.4.4.1. Концепции спекуляции по управлению
- •4.4.4.2. Спекуляция по управлению и инструкции
- •4.4.4.3. Спекулятивность по управлению и сравнения
- •4.4.4.4. Спекуляция по управлению без восстановления
- •4.4.4.5. Контроль операционной системы над откладыванием исключений
- •4.4.4.6. Сливание и заливание регистров
- •4.15. Инструкции, связанные со спекуляцией по управлению
- •4.4.5. Спекуляция по данным
- •4.4.5.1. Концепция спекуляции по данным
- •4.4.5.2. Спекуляция по данным и инструкции
- •4.4.5.3. Детализирование функциональности структуры alat и инструкции связанные с этим.
- •4.4.5.3.1. Выделение и проверка элементов alat
- •4.4.5.3.2. Аннулирование элементов alat.
- •4.4.5.4. Комбинирование спекуляций по управлению и по данным
- •4.4.5.5. Окончания инструкций для управления alat
- •4.4.6. Управление иерархией памяти и непротиворечивость
- •4.4.6.1 Иерархия памяти и подсказки
- •4.4.6.2. Согласованность памяти
- •4.4.7. Упорядочивание доступа к памяти
- •4.5. Инструкции переходов
- •4.5.1. Поддержка модульно планируемых циклов.
- •4.5.2. Подсказки предсказаний переходов.
- •4.5.3. Инструкции предсказания переходов
- •4.6. Инструкции мультимедиа.
- •4.6.1. Параллельная арифметика
- •4.6.2. Параллельные сдвиги
- •4.6.3. Преобразование данных
- •4.7. Пересылки регистрового файла
- •4.8. Символьные строки и подсчет совокупности
- •4.8.1. Символьные строки
- •4.8.2. Подсчет совокупности
- •4.9. Передача уровня привилегий
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 битов пользователя |
