Мы знаем, что jal
определяет 21-битное смещение. Однако он кодирует не 21-битное смещение, а 20-битное. Причина в том, что младший бит адреса всегда равен нулю, потому что минимально возможная инструкция RISC-V составляет 2 байта, поэтому этот бит не кодируется в инструкции.
Кодируя смещение таким образом, можно получить диапазон скачка ± 1 МБ. Если jal
кодирует LSB, диапазон скачка составляет всего ± 512 КБ.
Однако инструкция jalr
, которая определяет 12-битное смещение, кодирует LSB. Это уменьшает диапазон прыжка до ± 2киБ (вместо ± 4киБ). Я знаю, что jalr
использует формат I-типа, который совпадает с addi
, и для этого вида инструкций необходимо кодировать младший бит непосредственного значения. Однако я не вижу причин, по которым младший бит должен быть закодирован для jalr
.