URL данного справочника
НавигаторИнструкции базового набора RV32I:
|
Условные переходы в 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 Кб. Если потребуется больше, можно применить следующий прием. Например, вместо
здесь JAL - это абсолютный безусловный переход (его диапазон значительно шире и составляет ±1 Мб) |