srai

srai

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

lyszt.net охватывает srai и другие инструкции 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

Описание

srai сдвигает биты вправо на фиксированную величину и копирует знаковый бит в освободившиеся верхние позиции, что сохраняет отрицательные числа отрицательными. Это форма sra с постоянной величиной, поэтому заполнение сохраняет знак. Буква i означает immediate (непосредственный) — константу, закодированную в инструкции.

Синтаксис srai приведён ниже, где amount — константа от 0 до 31.

srai rd, rs1, amount

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

srai t0, t0, 3

srai округляет вниз, в сторону более отрицательного значения. Сдвиг -7 вправо на 1 даёт -4, тогда как div с делителем 2 даёт -3, потому что округляет в сторону нуля. Оба совпадают для неотрицательных чисел и для деления без остатка. Они различаются на единицу только тогда, когда отрицательное число даёт остаток. Код графики, аудио и обработки сигналов обычно требует округления вниз.

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

Из четырёх сдвигов srai обрабатывает числа со знаком, которые делятся, а srli обрабатывает необработанные биты или числа, которые никогда не становятся отрицательными. Формы без i, sra и srl, принимают расстояние сдвига, вычисляемое во время выполнения программы.

Пример

li t0, -8
srai t1, t0, 1   # t1 = -4 (sign-filled)