slli
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 型格式的一种特化,I 型格式是标准指令布局之一。rs1 保存要移位的操作数,立即数字段的低 5 位保存移位量。slli 执行逻辑左移,低位补零。
当你在编写代码时就知道移位距离时,使用 slli。当移位量在程序运行时计算时,使用 sll。示例将 5 左移 3 位,得到 5 乘以 8,即 40。
示例
li t0, 5 slli t1, t0, 3 # t1 = 5 << 3 = 40 (5 * 8)
