首页/指令库/字减法
SUBW

RISC-V SUBW 指令详解

指令手册R-type

将rs1低32位减去rs2低32位,结果截断为32位符号扩展至64位写入rd

指令语法

subw rd, rs1, rs2
操作数说明
rd:接收符号扩展到 64 位的 32 位结果;x0 写入丢弃。
rs1:被减数;rs2:减数。保留差的低 32 位,忽略溢出。
仅 RV64I;无立即数操作数;寄存器重叠时使用写回前源值。
RV64I算术运算32位运算

指令行为说明

SUBW指令采用R型格式(opcode=0111011, funct7=0100000, funct3=000)。将寄存器rs1的低32位减去rs2的低32位,忽略溢出,取低32位结果并符号扩展至64位后写入rd。与 RV64 中的 SUB(64位全宽运算)不同,SUBW只操作低32位。

SUBW 指令解析与执行动画

RV64I; XLEN=64; 32-bit result → sign extension

subw rd, rs1, rs2

执行环境

假设取指成功、无异步中断及额外扩展检查;同名寄存器共用一份初值。

32-位编码0x40C5853B
funct7 [31..25]
0100000
rs2 [24..20]
01100 → x12
rs1 [19..15]
01011 → x11
funct3 [14..12]
000
rd [11..7]
01010 → x10
opcode [6..0]
0111011
x11=0x0000000000000014; x12=0x0000000000000009
尚未计算

读取指令

解析当前指令字段并读取写回前源值;还没有提交结果。

x10=0x0000000000000007; PC=0x0000000000002000
当前架构状态(提交前)

这是架构效果的教学步骤,不代表处理器流水线或周期。

快速理解与检索要点

SUBW 是 RV64I 的 W 后缀整数指令,只从源操作数取低 32 位,产生 32 位结果后把 bit 31 符号扩展到 64 位。

W 后缀不是普通 64 位运算;结果始终按 32 位结果符号扩展。
SUBW 溢出被忽略,写回低 32 位差值的符号扩展。
rd、rs1、rs2 使用完整 5 位整数寄存器字段;x0 读为 0,写入被丢弃。rd=x0 的编码属于面向未来标准用途的 HINT。

常见使用场景

基础算术

RV64I,x11=0x80000000、x12=1:subw x10, x11, x12 得到 0x000000007fffffff;忽略溢出,符号扩展差值低 32 位。

使用前检查清单

语法检查
  • 仅 RV64I;rd、rs1、rs2 是完整 5 位 GPR 字段,没有 rs3 或立即数。
语义检查
  • rs1-rs2 保留差的低 32 位,再将 bit31 符号扩展到 64 位;忽略溢出。
  • 重叠源读取写回前值;rd=x0 属于面向未来标准用途的 HINT,寄存器和内存不变。

容易混淆 / 常见误区

溢出被忽略
注意rs1和rs2的操作数顺序
W 后缀指令只产生 32 位结果,并把 bit[31] 符号扩展到 XLEN;不要把它当作普通 64 位运算。
SUBW 是 RV64I 指令;RV32I 中没有这条 W 形式。

常见问题

它在 RV32 中可用吗?

不可用。SRLIW、SRLW、SUBW 属于 RV64I 的 32 位 word 运算形式。

SUBW 溢出时会怎样?

SUBW 忽略溢出:先保留差值的低 32 位,再将该 32 位结果符号扩展到 64 位。