sll

sll

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

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

Описание

sll сдвигает биты числа влево. Регистр содержит 32 бита в ряд, а сдвиг перемещает весь ряд влево или вправо на некоторое число позиций. Название означает shift left logical (логический сдвиг влево). В приведённой ниже форме значение в rs1 сдвигается влево на число позиций, указанное в rs2, а результат записывается в rd.

sll rd, rs1, rs2

По мере того как биты сдвигаются влево, нули заполняют пустые позиции справа, а биты, выдвинутые за левый край, отбрасываются.

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

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

В этой форме величина сдвига берётся из регистра, что подходит для величины, вычисляемой во время выполнения программы. Используйте slli для фиксированной величины. В примере число 3 сдвигается влево на 2 позиции, умножаясь на 4, что даёт 12.

Пример

li t0, 3
li t1, 2
sll t2, t0, t1   # t2 = 12