首页/指令库/立即数字加法
ADDIW

RISC-V ADDIW 指令详解

指令手册I-type

将12位有符号立即数与rs1相加,取低32位结果并符号扩展至64位写入rd

指令语法

addiw rd, rs1, imm
操作数说明
rd:接收低 32 位和符号扩展至 64 位的结果,x0 写入丢弃。
rs1:源寄存器,高 32 位不影响结果。
imm:-2048 到 2047 的有符号 12 位立即数;该指令仅 RV64I。
RV64I算术运算32位运算

指令行为说明

ADDIW指令采用I型格式(opcode=0011011, funct3=000)。将12位立即数符号扩展后与rs1相加,忽略溢出,取结果低32位并符号扩展至64位写入rd。当立即数为0时等价于SEXT.W伪指令。ADDIW仅存在于RV64I中,RV32无此指令。

ADDIW 指令解析与执行动画

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

addiw rd, rs1, imm

执行环境

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

32-位编码0xFFF5851B
imm[11:0] [31..20]
111111111111
rs1 [19..15]
01011 → x11
funct3 [14..12]
000
rd [11..7]
01010 → x10
opcode [6..0]
0011011
x11=0x0000000000000014; imm=-1
尚未计算

读取指令

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

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

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

快速理解与检索要点

将12位有符号立即数与rs1相加,取低32位结果并符号扩展至64位写入rd

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

常见使用场景

RV64 的 32 位加法

RV64I,x11=0x7fffffff:addiw x10, x11, 1 得到 0xffffffff80000000;不是 64 位加法。

32 位结果符号扩展

RV64I,x11=0x7fffffff:addiw x10, x11, 1 得到 0xffffffff80000000;不是 64 位加法。

使用前检查清单

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

容易混淆 / 常见误区

仅 RV64I;RV32I 没有该指令。
忽略输入高 32 位,只保留和的低 32 位,将 bit 31 复制到 bits 63..32;不是 64 位全宽加法。
算术溢出不触发异常。
立即数恰为 -2048 到 2047,不是对称的 ±2 KB。

常见问题

结果是零扩展吗?

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

ADDIW 的立即数为 0 时做什么?

将 rs1 的低 32 位符号扩展到 64 位,等效于 sext.w rd, rs1;它不保证保留 rs1 的原始高 32 位。