В risc-v инструкция beq имеет 12 бит imm[12:1]
.
И адресация относительно ПК Target address = PC + immediate x 2
В нем говорится, что причиной умножения на 2
является инструкция из полуслова.
Итак, я думаю, что непосредственное значение может представлять диапазон [-2^12 ~ 2^12-2]
,
из-за скрытого бита в imm[0] == 0
.
А умножение на 2 дает диапазон как [-2^13 ~ 2^13-2]
.
Таким образом, когда мы думаем об инструкции с шагом 2 байта, ветвь может достигать диапазона
-2^12 ~ 2^12-2
и в 4-байтовой инструкции приращения ветвь может достигать диапазона
-2^11 ~ 2^11-2
.
Но на странице risc-v org 29 https://riscv.org/wp-content/uploads/2017/05/riscv-spec-v2.2.pdf,
он говорит, что условный диапазон ветвей равен -4KiB ~ 4KiB
,
что означает -2^10 ~ 2^10
в 32-битных инструкциях.
Q1. В относительной адресации ПК правильно ли мы используем 13-битный результат (со скрытым 0-битным) в расчетах?
Q2. Если это правильно, как я могу рассчитать диапазон инструкции ветвления?
Q1. В относительной адресации ПК правильно ли мы используем 13-битный результат (со скрытым 0-битным) в расчетах?
Да, как вы заметили, формула, которую использует процессор,
Target address = PC of the branch instruction + immediate x 2
x2 повторно вводит тот 13-й бит, который, как известно, равен нулю и, следовательно, удаляется во время кодирования.
Q2. Если это правильно, как я могу рассчитать диапазон инструкции ветвления?
У вас есть правильная идея.
Закодированное непосредственное значение имеет ширину 12 бит, поэтому значение, добавляемое к ПК, имеет ширину 13 бит (немедленное x 2). Непосредственное является подписанным полем.
Максимальный непосредственный положительный результат и представляет собой 0 бит, за которым следуют 11 битов из 1, что равно 2047 (также известное как 0x7FF или 2 ^ 11-1), а минимальный непосредственный отрицательный и представляет собой 1 бит (знак), за которым следуют 11 биты 0, что составляет -2048 (он же 0x800 или -2 ^ 11).
Таким образом, максимальный прямой диапазон равен 0 битам, за которыми следуют 11 битов 1, за которыми следует 1 бит 0, что составляет 4094 (он же 0xFFE или 2^12-2).
В то время как максимальный обратный диапазон составляет 1 бит, за которым следуют 12 битов 0, что составляет -4096 (он же 0x1000 (в 13 битах) или -2 ^ 12).
Отметим, что на машинах с байтовой адресацией принято говорить о диапазоне в терминах байтов. Адреса инструкций являются байтовыми адресами (даже, например, если все инструкции имеют одинаковый 32-битный размер). поэтому диапазон (байт) составляет -4096 .. +4094 — это адреса инструкций, до которых можно добраться.
Однако, если вы хотите посчитать, сколько 16-битных инструкций можно выполнить, мы разделим этот диапазон байтов пополам, то есть -2048 .. +2047, а если учесть, сколько 32-битных инструкций можно выполнить, мы разделим этот диапазон байтов составляет четверть, поэтому -1024 .. 1023,5 .
Если imm
относится к немедленно закодированной инструкции (например, imm[12:1]), то это не то imm[0] == 0
, а то (imm x 2) [0] == 0
. Этот нулевой бит удаляется при кодировании и восстанавливается позже при выполнении.
11 битов со знаком могут находиться в диапазоне от -2048 до 2047. Если вы хотите интерпретировать этот диапазон с точки зрения 8-байтовых элементов, разделите диапазон на 8, так что верхний и нижний каждый на 8, поэтому -256 .. 255,875 .
(Некоторые наборы инструкций умножают непосредственное сохранение/загрузку на размер элемента, поэтому могут достигать большего размера элемента (загрузки/сохранения); это означает, что могут быть достигнуты только выровненные адреса. Однако RISC V не делает этого умножения.)
Спасибо за ваш ответ, но меня что-то смутило, что диапазон (байт) составляет -4096 ~ 4094. Я понимаю, что при расчете
immdidate
составляет 12 бит, а умножение на 2 дает 13 бит, что указывает на то, что LSB равен 0 (Imm[ 0] == 0). Это правильный путь?