srli

srli

RISC-V Ассемблер Ссылка

lyszt.net охватывает srli и другие инструкции RISC-V более подробно.

Формат кодирования

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Описание

srli сдвигает биты вправо на фиксированную величину и помещает 0 в освободившиеся верхние позиции. Это форма с константной величиной для srl, которая описывает механику и заполнение нулями. Буква i означает immediate — константу, закодированную в инструкции.

Форма srli показана ниже, где amount — фиксированное число от 0 до 31.

srli rd, rs1, amount

Сдвиг вправо уменьшает число вдвое за каждую сдвинутую позицию, а заполнение нулями трактует значение как никогда не отрицательное, поэтому srli делит беззнаковое число на степень двойки без остатка. Следующая строка делит t0 на четыре.

srli t0, t0, 2

В сочетании с маскирующим AND, srli извлекает одно поле из упакованного значения. Сдвиньте поле вниз к младшим битам, затем примените andi, чтобы оставить только его биты. Для чтения второго байта слова требуется сдвиг вправо на 8 и AND с 0xff.

Руководство RISC-V кодирует сдвиги с константой как специализацию формата I-типа, одного из стандартных форматов инструкций. Величина сдвига занимает младшие 5 бит поля immediate, а бит 30 инструкции различает два сдвига вправо. srli выполняет логический сдвиг вправо, и в старшие биты входят 0.

srli всегда заполняет нулями. Это подходит для необработанных битовых шаблонов и чисел, которые никогда не бывают отрицательными. Для знакового значения, которое может быть отрицательным, нули перезаписывают маркер знака. Знаковое деление на степень двойки использует srai. Выбор между ними отражает то, как вы читаете биты регистра.

Пример

li t0, -8
srli t1, t0, 1   # t1 = 2147483644 (zero-filled)