slli

slli

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

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

Описание

slli сдвигает биты влево на фиксированную величину. Операция соответствует sll: биты сдвигаются влево, нули заполняют правую сторону, биты, выходящие за левый край, теряются, и каждый сдвинутый разряд удваивает значение (страница sll описывает механику). Инструкция хранит величину сдвига как константу, поэтому никакой регистр её не задаёт. Буква i означает immediate (непосредственный), что является термином для константы, записанной в инструкции.

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

slli rd, rs1, amount

Следующая строка сдвигает t0 влево на 3 разряда, что умножает его на 8.

slli t1, t0, 3

Массивы делают эту инструкцию распространённой. 32-битное значение в массиве занимает 4 байта, поэтому элемент номер i находится на расстоянии i умножить на 4 байта от начала, а сдвиг влево на 2 умножает на 4. Обычный шаблон сдвигает индекс, чтобы получить смещение в байтах, добавляет начальный адрес массива, а затем загружает значение. Распознавание этой последовательности сдвига, сложения и загрузки помогает при чтении ассемблера, написанного другими.

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

Используйте slli, когда величина сдвига известна при написании кода. Используйте sll, когда величина вычисляется во время выполнения программы. Пример сдвигает 5 влево на 3, что даёт 5 умножить на 8, или 40.

Пример

li t0, 5
slli t1, t0, 3   # t1 = 5 << 3 = 40  (5 * 8)