C.ADDI

RISC-V C.ADDI 指令详解

指令手册CI format

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

指令语法

c.addi rd, imm
操作数说明
rd:完整 5 位目的/源字段,常规形式为 x1–x31。
imm:imm[5] 与 imm[4:0] 组成不缩放的 6 位有符号数,符号扩展到 XLEN;常规 C.ADDI 使用 -32 到 31 中的非零值。
rd 非零且 imm=0 是 HINT;rd=x0 属于 C.NOP 编码,其中非零立即数是 HINT。
C压缩指令

扩展条件:RV32I/RV64I 的 C 扩展(或 Zca);16 位编码,IALIGN=16。动画按取指成功且无异步中断的条件展示架构效果。

指令行为说明

常规 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 执行动画

RV32I/RV64I + C(或 Zca),16 位编码,IALIGN=16。

指令语法: c.addi rd, imm
执行环境
0x0000000C + (-5) (mod 2^32) = 0x00000007
x10 ← 0x00000007; PC ← 0x00002002
16 位编码0x156D = 0001010101101101
funct3 [15..13]
000
imm[5] [12]
1
rd [11..7]
01010 → x10
imm[4:0] [6..2]
11011
op [1..0]
01
imm[5]=1, imm[4:0]=11011
imm[5:0]=111011 → -5
符号扩展到 XLEN;不缩放
rd/rs1 → x10 = 0x0000000C
C.ADDI

还原压缩操作数

还原完整寄存器字段和立即数,并区分普通指令、HINT 与共享编码。

当前架构状态(提交前): x10=0x0000000C; PC=0x00002000

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

快速理解与检索要点

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

立即数范围为 -32 到 31,并在执行加法前符号扩展到 XLEN。
rd 非零、imm=0 是 HINT;rd=x0 的编码属于 C.NOP,其中 imm=0 是常规 C.NOP、imm≠0 是 HINT。它们不执行普通 C.ADDI 写回。
16 位 CI 编码:funct3[15:13]=000,imm[5] 位于 bit 12,完整 5 位 rd/rs1 位于 bits 11:7,imm[4:0] 位于 bits 6:2,op[1:0]=01。立即数不缩放,加法仅保留低 XLEN 位,算术溢出不触发异常。

常见使用场景

循环与迭代

RV32I/RV64I + C/Zca,旧 x10=12 时,c.addi x10, -5 得到 x10=7;立即数符号扩展,成功后 PC+2。

特定用途

RV32I/RV64I + C/Zca,旧 x10=12 时,c.addi x10, -5 得到 x10=7;立即数符号扩展,成功后 PC+2。

使用前检查清单

语法检查
  • 确认 RV32I/RV64I 的 C 或 Zca 可用;这些 16 位编码使用完整 5 位寄存器字段。
  • 立即数为不缩放的 6 位有符号数,范围 -32 到 31;常规形式要求 rd 非零,C.ADDI 还排除 imm=0。
语义检查
  • 区分普通写回、HINT 与共享编码,不把 HINT 当作普通算术结果。
  • 加法只写回低 XLEN 位;rd 与源重叠时读取同一旧值,成功后 PC+2。

容易混淆 / 常见误区

常规 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。