sra

sra

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

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

Описание

sra — это второй сдвиг вправо, рядом с srl. Название означает арифметический сдвиг вправо. Приведённая ниже форма сдвигает rs1 вправо на величину, хранящуюся в rs2.

sra rd, rs1, rs2

Как и любой сдвиг вправо, он перемещает биты к младшему концу и отбрасывает те, что выходят за границу. Его обработка пустых верхних позиций отличается от srl.

RISC-V использует знаковую схему, в которой старший бит обозначает знак, и 1 там означает, что число отрицательное. srl заполняет верх нулями, что стирает маркер знака и превращает отрицательное число в большое положительное. sra заполняет верх копиями существующего бита знака, поэтому заполнение состоит из 1 для отрицательного числа и из 0 для положительного. Число сохраняет свой знак.

sra делит знаковое число на степень двойки. Сдвиг на 1 уменьшает его вдвое, сдвиг на 3 делит его на 8, а отрицательные числа остаются отрицательными. Результат округляется вниз, в сторону более отрицательного значения, поэтому -7, сдвинутое вправо на 1, даёт -4, тогда как инструкция div даёт -3. Код графики и звука обычно допускает округление вниз.

Руководство RISC-V хранит величину сдвига в младших 5 битах регистра rs2. Пять битов покрывают от 0 до 31 позиции, поэтому остальные биты rs2 не влияют. Руководство описывает sra как арифметический сдвиг вправо, который копирует исходный бит знака в освободившиеся верхние биты.

Используйте sra для знаковых чисел, а srl — для необработанных битовых шаблонов или чисел, которые никогда не бывают отрицательными. Для фиксированной величины используйте константную форму srai.

Пример

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