C.ADDI

RISC-V C.ADDI 指令详解

指令手册CI format

常规 C.ADDI 将非零有符号 6 位立即数加到非零 rd:rd += imm。CI 格式。

指令语法

c.addi rd, imm
操作数说明
本指令为 CI format 格式,请根据汇编语法确认各操作数位置。
C压缩指令

指令行为说明

常规 C.ADDI 使用 CI 格式,将非零的 6 位符号扩展立即数加到非零 rd 并写回 rd;它展开为 addi rd, rd, imm。rd 非零而 imm=0 的编码是 HINT。rd=x0、imm=0 是 C.NOP;C.NOP 的 imm 非零编码也是 HINT。

C.ADDI 指令解析与执行动画

按实际 CR 或 CI 16 位编码解码,并分清普通指令、HINT 与共享编码。

当前步骤

步骤 1:识别 C.ADDI

动画直接展示 C 扩展的 16 位字段,而不是把它伪装成 32 位标量指令。

C.ADDI 执行主线
读取旧 x10 = 0x0000000C6 位 imm 符号扩展到 XLEN = -5写回 x10 = 0x00000007

这与 addi rd, rd, imm 的计算过程相同;差别只在于 C.ADDI 使用 16 位 CI 编码和 6 位立即数。

16 位编码
0x156D = 0001010101101101
funct3 [15..13]
000
imm[5] [12]
1
rd [11..7]
01010
imm[4:0] [6..2]
11011
op [1..0]
01
操作数与计算
x10 = 0x0000000C
sext(imm[5:0]) = -5
0x0000000C + -5 (mod 2^32)
解码结果与架构状态
C.ADDI

x10 = 0x00000007

动画只展示官方定义的解码、寄存器读取、算术和架构状态,不表示实现的流水线、缓存、预测或时序。

快速理解与检索要点

C.ADDI 用 16 位 CI 编码实现 rd 自身加一个 6 位有符号立即数;常规指令形式排除 rd=x0 和 imm=0。

立即数范围为 -32 到 31,并在执行加法前符号扩展到 XLEN。
rd 非零、imm=0 是 HINT;rd=x0、imm=0 是 C.NOP,不能把这些编码显示为普通 C.ADDI 运算。

常见使用场景

循环与迭代

结合 «c.addi x10, 5 # x10 += 5» 等实际代码理解该场景。

特定用途

结合 «c.addi x10, 5 # x10 += 5» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

常规 C.ADDI 的 rd 必须非零且 imm 必须非零;不要把 imm=0 的 HINT 当作加法。
rd=x0、imm=0 是 C.NOP,不是常规 C.ADDI。

常见问题

C.ADDI 的立即数范围是多少?

CI 格式把 imm[5] 和 imm[4:0] 组成 6 位有符号立即数,因此可表示 -32 到 31;常规 C.ADDI 不使用 0。