首页/指令库/字左移
SLLW

RISC-V SLLW 指令详解

指令手册R-type

将rs1低32位逻辑左移rs2[4:0]位,结果符号扩展至64位写入rd

指令语法

sllw rd, rs1, rs2
操作数说明
rd:选择 x0–x31;写入 x0 被丢弃。rs1:提供写回前的源值。
rs2:只用低 5 位提供移位量,不是立即数。
仅 RV64I;忽略源高 32 位,保留左移结果低 32 位,再符号扩展到 64 位。
RV64I算术运算32位移位

指令行为说明

SLLW指令采用R型格式(opcode=0111011, funct7=0000000, funct3=001)。对rs1的低32位进行逻辑左移,移位量由rs2的低5位指定,低位补零,结果符号扩展至64位后写入rd。

SLLW 指令解析与执行动画

从机器码字段解析开始,依次展示操作数读取、该指令专属语义计算和 ISA 可见状态更新。

rd
rs1
rs2
sllw
,
,
执行环境

本例使用固定寄存器初值和初始 PC=0x2000;取指成功,没有异步中断或额外扩展检查。异常分支只显示普通提交停止,陷入后的 PC 和处理程序状态由 EEI 决定。

t1(x6)
0x0000000000000014
sp(x2)
0x0000000000000002
31..25
24..20
19..15
14..12
11..7
6..0
0000000
funct7
00010
rs2
00110
rs1
001
funct3
00101
rd
0111011
opcode
执行数据路径
instruction
0x002312BB
opcode
0111011 -> OP-32
funct3
001 -> SLLW
funct7
0000000 -> base ALU op
rd / rs1 / rs2
t0(x5) / t1(x6) / sp(x2)
shamt
rs2[4:0]=00010 -> 2
32-bit logical shift
尚未计算
x5
t0(x5) = 0x0000000000003001; pc = 0x0000000000002000
当前步骤

概念步骤:拿到 32-bit 指令编码

机器码按当前指令格式切成字段,动画从 encoding/decode 开始。

encoding: 0x002312BB
syntax : sllw t0(x5), t1(x6), sp(x2)
待提交结果: 尚未计算
当前架构状态
t0(x5) = 0x0000000000003001; pc = 0x0000000000002000

该动画展示 ISA 可见的解码和状态变化,不表示任何特定 CPU 的流水线、缓存、预测或时序实现。

快速理解与检索要点

将rs1低32位逻辑左移rs2[4:0]位,结果符号扩展至64位写入rd

仅 RV64I;32 位左移结果按 bit31 符号扩展到 64 位。
移位量为 0–31:来自 rs2[4:0];其余源高位不参与移位量。

常见使用场景

32 位逻辑左移

RV64I,x11=0x40000000、x12=33:sllw x10, x11, x12 的有效移位量为 1,结果为 0xffffffff80000000。

使用前检查清单

语法检查
  • 寄存器操作数选择 x0–x31 或其 ABI 名称;源使用写回前的值。
  • SLLW 仅 RV64I;rd、rs1、rs2 均为寄存器字段,没有立即数操作数。
语义检查
  • 将rs1低32位逻辑左移rs2[4:0]位,结果符号扩展至64位写入rd
  • x0 始终为零,写入丢弃;整数计算不引发算术异常。

容易混淆 / 常见误区

SLLW 只使用 rs2[4:0];rs2 的其余位不参与移位量。
W 后缀指令只产生 32 位结果,并把 bit[31] 符号扩展到 XLEN;不要把它当作普通 64 位运算。
这些 W 后缀形式属于 RV64I 或 RV64 扩展指令,RV32 中没有对应形式。

常见问题

逻辑左移为什么会得到高 32 位全 1?

左移本身在低 32 位补零;随后 W 形式把结果 bit31 符号扩展到 64 位。bit31 为 1 时,高 32 位全为 1。