Условное ветвление в архитектуре набора инструкций

Наборы инструкций используют стиль if-goto для условного ветвления. Я написал несколько статей о том, как логически преобразовать структурированные операторы, такие как циклы и операторы if-then-else, в стиль if-goto.

В этом посте я расскажу о переводе оператора if-condition-then-goto в наборы инструкций для нескольких разных архитектур машин.

Давайте взглянем на основной оператор if-goto:

if ( i >= n ) goto exitLoop;

Этот оператор имеет 4 операнда, которые аппаратное обеспечение должно учитывать:

ОперандПримерПрименение
источник 1iвероятно регистр, один из 16 или около того
условие>=один из 10 реляционных операторов при подсчете как подписанных, так и беззнаковых
источник 2jвероятно регистр, один из 16 или около того
целевая ветвьexitLoopметка в сборке (номер в машинном коде

Проблема здесь в том, что, вообще говоря, операндов слишком много, и они составили бы одну из самых больших инструкций в машине. Последний операнд, цель перехода, в частности, является довольно большим операндом, обычно 8 или более битов.

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

MIPS

MIPS выбирает предоставление и if-goto для == а также != операторы сразу в одной инструкции:
beq $r1, $r2, targetа также,
bne $r1, $r2, target.

Они позволяют сравнивать два регистра на равенство или неравенство и условно переходить к цели. Обратите внимание, что специальная константа 0 также может использоваться в одной из позиций регистра (ссылаясь на регистр MIPS-всегда нулевое значение $0), что обеспечивает удобный способ ветвления на нулевом или ненулевом значении одного регистра в одной инструкции.

Обратите внимание, что операторы проверки величины: <, <=, >, >= опущены, как и все сравнения, включающие константы, кроме нуля (например, if ( n >= 100 ) goto stop;).

Для выполнения других реляционных операторов есть четыре дополнительных инструкции, первые две для регистрации в регистре:
slt $r1, $r2, $r3 — выводит логическое значение в $r1 для $r2 < $r3, и,
sltu $r1, $r2, $r3 — выводит логическое значение в $r1 для $r2 < $r3 (без знака)
И следующие два для немедленной регистрации:
slti $r1, $r2, #imm — выводит логическое значение в $r1 для $r2 < #imm, и,
sltiu $r1, $r2, #imm — выводит логическое значение в $r1 для $r2 < #imm (без знака)

Если непосредственный объект для сравнения не может быть представлен, более крупный непосредственный объект загружается в временный регистр, и используется форма «регистр-к-регистру». (Это также подход для проверки равенства и неравенства с (ненулевыми) константами с использованием beq а также bne.)

Последовательность инструкций (slt, beq — или же — li, beq) выполнить if-goto; как и большинство кодовых последовательностей, эти инструкции в этих последовательностях связаны между собой через один или несколько стандартных регистров в наборе инструкций.

MIPS допускает 16-битное число для цели перехода, что дает ему более широкий диапазон.

РИСК V

RISC V использует comare и переход с целевой шириной перехода 12 бит, по сравнению с шириной MIPS 16 бит — это сокращение диапазона позволяет выразить все реляционные операторы в одной инструкции перехода. Как и MIPS, сравнение и переход RISC V поддерживают только регистрацию-регистр. RISC V также разделяет идею всегда нулевого регистра $0, а также требует, чтобы константы/непосредственные значения загружались в регистр, чтобы использовать инструкцию сравнения и перехода между регистрами.

Коды состояния

Альтернативный подход, используемый многими другими процессорами (например, x86, 6502, MC68000 и т. д.), заключается в использовании кодов состояния, которые представляют собой набор (обычно) 4-х 1-битных регистров, известных также как «флаги». Эти специальные регистры содержат состояние, которое связывает инструкции: обычно один для указания операндов для сравнения (установка флагов), а другой — для определения желаемого оператора сравнения (проверка флагов) и цели перехода. В качестве дополнительной эффективности по размеру кода многие инструкции также устанавливают коды условий, что означает, что иногда не требуется специальная операция сравнения. 4 бита охватывают понятия равенства, не равенства, а также отношения величины со знаком и без знака.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *