首页/指令库/立即数逻辑左移
SLLI

RISC-V SLLI 指令详解

指令手册I-type

将rs1逻辑左移shamt位(低位补零),结果写入rd

指令语法

slli rd, rs1, shamt
操作数说明
目标寄存器 rd:存放运算结果的通用寄存器。
源寄存器 rs1:第一个操作数所在的寄存器。
立即数 imm:12 位有符号立即数,符号扩展后与 rs1 进行运算。
RV32I算术运算移位

指令编码

31..20
imm[11:0]
19..15
rs1
14..12
funct3
11..7
rd
6..0
opcode

SLLI 使用 opcode 0010011(0x13)、funct3 001、funct7 0000000。rs1 字段选择源寄存器,12 位立即数提供第二操作数,rd 选择目标寄存器。

格式: I-type
opcode: 0010011 (0x13)
funct3: 001 (0x1)
funct7: 0000000 (0x00)

指令行为说明

SLLI指令属于I型格式的特化子类(opcode=0010011, funct3=001, funct7=0000000)。操作数rs1按移位量shamt(位于立即数字段的低5位,即inst[24:20])进行逻辑左移,左侧移出的位丢弃,低位补零,结果写入rd。对于RV32I,移位量范围为0~31。funct7的高6位必须为全零(0000000),bit30=0。

快速理解与检索要点

SLLI 执行立即数逻辑左移,低位补 0,结果写入 rd。移位量来自 shamt 立即数字段。

RV32I 立即数移位的移位量编码在 5 位 shamt 中。
逻辑右移补 0;算术右移复制符号位,二者用于不同的有符号/无符号场景。

常见使用场景

乘法与除法

结合 «slli x5, x6, 2 # x5 = x6 << 2 (multiply by 4)» 等实际代码理解该场景。

地址与指针

结合 «slli x5, x6, 2 # x5 = x6 << 2 (multiply by 4)» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认当前指令格式为 I-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

funct7必须为全零(0000000),否则为非法指令
RV32I 的 shamt 只有 5 位,可编码 0~31;更大的常数不是同一条 SLLI 的有效编码

常见问题

SLLI 的移位量来自哪里?

立即数版本的移位量来自 shamt 字段;RV32I 中是 5 位。

逻辑右移和算术右移有什么区别?

逻辑右移高位补 0;算术右移高位复制原符号位,通常用于保持有符号数的符号。