Under construction!

URL данного справочника
emc.orgfree.com/RISC-V/hb


Навигатор

Инструкции базового набора RV32I:

handbook

арифметические

логические

сдвиги

сравнения

безусловные
переходы

системные

  • FENCE
  • ECALL
  • EBREAK

условные
переходы

загрузки

сохранения


Evgeny Eremin

См. также

  • набор RV64I
  • набор RV128I

Условные переходы в RISC-V

(Инструкции BEQ, BNE, BGE, BGEU, BLT, BLTU)

Логика переходов

Все инструкции сравнивают значения в регистрах rs1 и rs2 и в случае выполнения условия, которое определяется конкретной инструкцией (например, "равно", "строго меньше" и т.д.), выполняют переход. Переход относительный, т.е. к адресу инструкции перехода прибавляется смещение offset.

Примечание. Обычно принято прибавлять смещение к адресу следующей за переходом инструкции. В RISC-V смещение добавляется к "начальному" значению счетчика, т.е. именно к адресу самой инструкции перехода.

Описанная выше логика реализации условных переходов позволяет обойтись без традиционного регистра флагов (обычно условный переход анализирует один из битов в регистре флагов, который устанавливается предыдущей инструкцией!) Как следствие, упрощается организация прерываний, поскольку теперь не надо заботиться о сохранении значений флагов.

Кодирование смещения

Смещение в коде инструкции разбито на две части: старшая - offset1, лежит в поле func7 инструкции, а младшая – в поле rd вместо номера регистра результата (offset2). В этом состоит сходство формата перехода B с форматом S (см., например, инструкцию SW).

Смещение в инструкции кодируется достаточно хитро. Поскольку оно всегда четное, его младший бит (с номером 0) обязан равняться 0; в коде инструкции его вообще нет. Возникает возможность добавить в смещение еще один бит, и вместо четных значений от –2048 до 2046 теперь можно иметь допустимый диапазон переходов от –4096 до 4094.

Биты 12-1 смещения располагаются в коде инструкции так. Знаковый 12-й бит ставится старшим (11-м) для упрощения анализа. А вот исходный 11-й бит числа переносится в самый младший бит offset2. В итоге в 7 битах offset1 лежат 12-й и 10-5 биты, а в 5 битах offset2 – 4-1 и 11-й. И что же такой перенос дает? Биты 10-1 обычным для формата S способом копируются сразу на свои места! По старшему биту в 11-й позиции стандартно расширяется знак во все биты 12-31, причем 12-й бит смещения автоматически оказывается и «на своем родном» 12-м месте тоже. Затем младший бит смещения копируется на «свое законное» 11-место, а освобождающийся при этом младший бит обнуляется. Утверждается, что для аппаратной реализации так проще.

Если вам захочется разобраться в этой перестановке битов подробнее, советую посмотреть хорощий материал здесь.

Диапазон переходов

Как мы видели, доступный диапазон переходов составляет ±4 Кб. Если потребуется больше, можно применить следующий прием. Например, вместо
BEQ x10, x0, L1
можно написать (обратите внимание, что переход заменен на противоположный!)

      BNE x10, x0, L2
      JAL x0, L1
L2:

здесь JAL - это абсолютный безусловный переход (его диапазон значительно шире и составляет ±1 Мб)


Автор справочника - Евгений Александрович Еремин (Пермский государственный гуманитарно-педагогический университет). e_eremin@yahoo.com


Free Web Hosting