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)