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

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является одним из проверенных классов).

Соседние файлы в папке M9