首页/指令库/字加法
ADDW

RISC-V ADDW 指令详解

指令手册R-type

将rs1和rs2的低32位相加,结果截断为32位符号扩展至64位写入rd

指令语法

addw rd, rs1, rs2
操作数说明
rd:接收低 32 位和符号扩展至 64 位的结果,x0 写入丢弃。
rs1、rs2:各提供低 32 位源值;重叠时读取同一旧值。
仅 RV64I;无立即数,不执行 64 位全宽加法。
RV64I算术运算32位运算

指令行为说明

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

ADDW 指令解析与执行动画

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

addw rd, rs1, rs2

执行环境

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

32-位编码0x00C5853B
funct7 [31..25]
0000000
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
当前架构状态(提交前)

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

快速理解与检索要点

将rs1和rs2的低32位相加,结果截断为32位符号扩展至64位写入rd

结果公式:rd=sext64((rs1[31:0]+rs2[31:0])[31:0])。
写入 x0 被丢弃;源寄存器使用写回前的值。

常见使用场景

RV64 的 32 位加法

RV64I,x11=0x7fffffff、x12=1:addw x10, x11, x12 得到 0xffffffff80000000。

32 位结果符号扩展

RV64I,x11=0x7fffffff、x12=1:addw x10, x11, x12 得到 0xffffffff80000000。

使用前检查清单

语法检查
  • 寄存器字段选择 x0–x31 或其 ABI 名称。
  • ADDW 仅 RV64I;两个源来自寄存器。
语义检查
  • 忽略源高 32 位,保留加法低 32 位,再将 bit 31 符号扩展到 64 位。
  • 算术溢出不触发异常;x0 写入丢弃,重叠寄存器先读取旧值再写回。

容易混淆 / 常见误区

仅 RV64I;RV32I 没有该指令。
忽略输入高 32 位,只保留和的低 32 位,将 bit 31 复制到 bits 63..32;不是 64 位全宽加法。
算术溢出不触发异常。

常见问题

结果是零扩展吗?

不是。低 32 位结果的 bit 31 总是复制到 bits 63..32,例如 0x80000000 得到 0xffffffff80000000。