slli
lyszt.net охватывает slli и другие инструкции RISC-V более подробно.
Формат кодирования
Описание
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)
