jr
псевдоlyszt.net охватывает jr и другие инструкции RISC-V более подробно.
Описание
jr выполняет переход по адресу, хранящемуся в регистре. Название означает jump register (переход по регистру). j выполняет переход на фиксированную метку, записанную в коде. jr выполняет переход по любому адресу, который хранит регистр и который программа вычисляет во время выполнения. Он не сохраняет адрес возврата.
jr — это псевдоинструкция для строки ниже, регистрового перехода, который отбрасывает адрес возврата (см. jalr).
jalr zero, rs, 0
Таблица переходов — это массив в памяти, который хранит адреса нескольких процедур, и jr используется вместе с ней. Чтобы выбрать процедуру номер i, программа вычисляет её ячейку в таблице, загружает хранящийся там адрес в регистр и использует jr для перехода по нему. Один поиск и один переход заменяют длинную серию сравнений (это случай 0, случай 1, случай 2 и так далее), независимо от числа случаев. Плотные операторы switch и внутренний цикл интерпретатора выполняют диспетчеризацию именно так.
Руководство RISC-V кодирует обычные безусловные косвенные переходы как jalr с rd, установленным в x0. Оно отмечает, что jalr не рассматривает свой непосредственный операнд как кратное 2 байтам, в отличие от условных переходов, и что в большинстве случаев использования jalr непосредственный операнд равен нулю или следует после lui либо auipc.
Возврат из функции — это переход по адресу в ra, поэтому ret — это jr ra под другим именем. Группа инструкций перехода различается тем, откуда берётся адрес и сохраняется ли адрес возврата.
Разворачивается в
jalr zero, rs, 0
Ассемблер заменяет эту псевдоинструкцию реальной инструкцией или инструкциями, перечисленными выше.
Пример
la t0, target jr t0 # jump to the address held in t0
