C.LI

RISC-V C.LI 指令详解

指令手册CI format

将有符号 6 位立即数加载到非零 rd:rd = imm。CI 格式。

指令语法

c.li rd, imm
操作数说明
rd:完整 5 位目的字段,常规形式为 x1–x31;旧 rd 不是源操作数。
imm:imm[5] 与 imm[4:0] 组成不缩放的 6 位有符号数,符号扩展到 XLEN,可取 -32 到 31(含 0)。
rd=x0 的编码是 HINT,不改变零寄存器。
C压缩指令

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

指令行为说明

C.LI 使用 CI 格式,将 6 位符号扩展立即数写入非零 rd,并展开为 addi rd, x0, imm。rd 是完整 5 位字段;rd=x0 的编码是 HINT,而不是普通 C.LI 写回。

C.LI 执行动画

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

指令语法: c.li rd, imm
执行环境
sext_32(111011) = -5 = 0xFFFFFFFB
x10 ← 0xFFFFFFFB; PC ← 0x00002002
16 位编码0x556D = 0101010101101101
funct3 [15..13]
010
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;不缩放
固定源: x0=0
C.LI

还原压缩操作数

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

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

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

快速理解与检索要点

C.LI 是把一个 6 位有符号立即数写入 rd 的 16 位 CI 编码;常规形式要求 rd 非零。

C.LI 展开为 addi rd, x0, imm,立即数符号扩展到 XLEN。
rd 是完整 5 位字段,但 rd=x0 的编码是 HINT;它不是会改变 x0 的 C.LI。
16 位 CI 编码:funct3[15:13]=010,imm[5] 位于 bit 12,完整 5 位 rd 位于 bits 11:7,imm[4:0] 位于 bits 6:2,op[1:0]=01。立即数不缩放;C.LI 不读取旧 rd,也不进行数据内存访问。

常见使用场景

常数生成

RV32I/RV64I + C/Zca,c.li x10, 5 把 x10 写为 5;不读取旧 x10,不进行数据内存访问,成功后 PC+2。

使用前检查清单

语法检查
  • 确认 RV32I/RV64I 的 C 或 Zca 可用;这些 16 位编码使用完整 5 位寄存器字段。
  • 立即数为不缩放的 6 位有符号数,范围 -32 到 31;常规形式要求 rd 非零,C.ADDI 还排除 imm=0。
语义检查
  • 区分普通写回、HINT 与共享编码,不把 HINT 当作普通算术结果。
  • C.LI 符号扩展立即数到 XLEN;旧 rd 不参与计算,也不进行数据内存访问。

容易混淆 / 常见误区

常规 C.LI 的 rd 必须非零;rd=x0 的编码是 HINT,不写入普通 C.LI 结果。
立即数是有符号 6 位值,范围为 -32 到 31。

常见问题

C.LI 能加载哪些立即数?

C.LI 的 CI 立即数字段是 6 位有符号数,因此可加载 -32 到 31。