- •4. Модель прикладного программирования.
- •4.1. Стек регистров
- •4.1.1. Управление стеком регистров
- •4.1.2. Инструкции стека регистров
- •4.2. Инструкции целочисленного вычисления
- •4.2.1. Арифметические инструкции
- •4.2.2. Логические инструкции
- •4.2.3. 32-Битные адреса и целые
- •4.2.4. Инструкции битовых полей и сдвигов
- •4.2.5. Большие константы.
- •4.3. Инструкции сравнения и предикация
- •4.3.1. Предикация
- •4.3.2. Инструкции сравнения
- •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.2. Спекуляция по управлению и инструкции
Инструкции делятся на две категории: спекулятивные (инструкции, которые могут быть использованы спекулятивно) и не спекулятивные (которые не могут). Не спекулятивные инструкции вызывают исключения (если они происходят) и поэтому опасны для планирования прежде, чем станет известно, что они должны быть выполнены. Спекулятивные инструкции откладывают исключения (они не вызывают их) и поэтому безопасны для планирования прежде, чем станет известно, что они должны быть выполнены.
Инструкции загрузки в основные регистры и регистры с плавающей точкой имеются в двух вариантах – не спекулятивном (ld, ldf, ldfp) и спекулятивном (ld.s, ldf.s, ldfp.s). Вообще-то, все вычислительные инструкции, записывающие свои результаты в основные регистры или регистры с плавающей точкой, являются спекулятивными. Любая инструкция, модифицирующая состояние чего-то другого (не основного регистра и не регистра с плавающей точкой) является не спекулятивной, поскольку не имеет возможностей для задержки исключения, (правда, есть несколько исключений).
Маркеры задержанных исключений распространяются по программе в манере потока данных. Спекулятивная инструкция, которая читает регистр, содержащий маркер задержанного исключения распространит маркер задержанного исключения на свой приемник. Таким образом, может быть выполнена спекулятивно цепочка инструкций, однако нужно проверить регистр результата на маркер отложенного исключения для того, чтобы определить произошли ли некие исключения.
В точке программы, где известно, что нужен результат спекулятивного вычисления, используется инструкция спекулятивной проверки (chk.s). Эта инструкция проверяет маркер отложенного исключения. Если ни один не найден, то спекулятивное вычисление было успешно, а выполнение продолжается как обычно. Если найден маркер отложенного исключения, то спекулятивное вычисление сделано не удачно, и нужно сделать откат (re-done). В этом случае, инструкцияchk.sпередает управление на новый адрес (задаваемый в инструкцииchk.sнепосредственным смещением). Программа может использовать этот механизм для того, чтобы вызвать код содержащий копию спекулятивного вычисления (но с не спекулятивными загрузками). Поскольку теперь известно, что вычислению требуются любые исключения, которые могут происходить и обрабатываться нормально.
Так как вычислительные инструкции в основном не вызывают исключений, то единственные инструкции, которые генерируют маркеры задержанных исключений – это спекулятивные загрузки. (Исключения с плавающей точкой типа IEEE, обрабатываются специальным образом, через набор альтернативных полей состояния; см. раздел 5.2 «Регистр состояния с плавающей точкой»). Другие спекулятивные инструкции распространяют маркеры задержанных исключений, но не генерируют их.
4.4.4.3. Спекулятивность по управлению и сравнения
Как уже говорилось, большинство инструкций, которые записывают в регистр не являющийся основным регистром и регистром с плавающей точкой, являются не спекулятивными. Специальными случаями являются инструкции: сравнения (cmp, cmp4, fcmp), тестирования бит (tbit), классификации с плавающей точкой (fclass) и аппроксимации с плавающей точкой (frcpa, frsqrta). Эти инструкции считывают основные регистры или регистры с плавающей точкой и записывают один или два предикатных регистра.
Для этих инструкций, если некоторый источник содержит маркер задержанного исключения, то все предикатные приемники либо очищаются, либо остаются неизменными, в зависимости от типа сравнения (см. табл.4.10). Программа может использовать это поведение для того, чтобы гарантировать, что никаких зависимых условных переходов не сделано и любые зависимые предикатные инструкции аннулированы. См. раздел 4.3.1 «Предикация».
Маркеры отложенных прерываний, также могут быть проверены с помощью инструкций сравнения. Инструкция (tnat) проверяетNaTбиты связанные с заданными основными регистрами и записывает два предикатных результата. Инструкция (fclass) может быть использована для проверки регистра с плавающей точкой и записи результата в два предикатных регистра (fclassне очищает оба предикатных приемника в присутствии исходногоNaTVal, еслиNaTValявляется одним из проверенных классов).