| 项目 | 内容 |
|---|---|
| 扩展名 | C(Compressed Instructions) |
| 全名 | RV32C:RISC-V 32 位压缩指令扩展 |
| 主要目标 | 减小程序体积,提高指令存储效率 |
| 特点 | 把常用的 32 位指令压缩为 16 位编码 |
| 兼容性 | 与 RV32I 完全兼容(解码后等价于 32 位指令) |
💡 也就是说:RV32C 并不是新的指令,只是常见 RV32I 指令的压缩编码形式。 CPU 解码后执行的仍是相同的操作。
| 问题 | RV32C 的作用 |
|---|---|
| 程序代码太大 | 减小代码体积(通常减少 25%~40%) |
| 存储器成本高 | 节省 Flash / ROM 空间 |
| 指令缓存性能受限 | 增加指令密度,减少缓存 miss |
| 低功耗需求 | 减少取指带宽,提高能效 |
| 类别 | 指令示例 | 对应的 32 位等价指令 | 说明 |
|---|---|---|---|
| 寄存器操作 | c.mv rd, rs |
add rd, x0, rs |
复制寄存器 |
| 立即数操作 | c.addi rd, imm |
addi rd, rd, imm |
加立即数 |
| 加载指令 | c.lw rd, offset(rs1) |
lw rd, offset(rs1) |
从内存加载字 |
| 存储指令 | c.sw rs2, offset(rs1) |
sw rs2, offset(rs1) |
存储到内存 |
| 跳转/分支 | c.j offset |
jal x0, offset |
无条件跳转 |
c.beqz rs1, offset |
beq rs1, x0, offset |
条件跳转(等于 0) | |
| 返回/函数调用 | c.jr ra |
jalr x0, ra, 0 |
函数返回 |
c.jalr ra |
jalr ra, 0(ra) |
带返回地址跳转 | |
| 堆栈操作 | c.addi16sp imm |
addi sp, sp, imm |
调整栈指针 |
c.lwsp rd, offset(sp) |
lw rd, offset(sp) |
从栈加载 | |
c.swsp rs2, offset(sp) |
sw rs2, offset(sp) |
存储到栈 |
RV32C 为常用寄存器设定了紧凑编码的别名(通常是 x8–x15):
| 压缩编码 | 对应寄存器 | ABI 名称 |
|---|---|---|
| 000 | x8 | s0/fp |
| 001 | x9 | s1 |
| 010 | x10 | a0 |
| 011 | x11 | a1 |
| 100 | x12 | a2 |
| 101 | x13 | a3 |
| 110 | x14 | a4 |
| 111 | x15 | a5 |
💡 因此,压缩指令通常只在这 8 个寄存器间操作,以便缩短编码长度。
addi a0, a0, 4
lw a1, 0(a0)
sw a1, 4(sp)
jal ra, foo
c.addi a0, 4
c.lw a1, 0(a0)
c.swsp a1, 4(sp)
c.jal foo
在 GCC 或汇编中使用压缩指令集:
riscv64-unknown-elf-gcc -march=rv32imac -mabi=ilp32 ...
其中:
C 表示启用压缩指令;I 是基础指令集;M 是乘除法扩展;A 是原子指令扩展;rv32imac 就是一个常见的嵌入式配置。| 项目 | RV32C 特性 |
|---|---|
| 指令长度 | 16 位(压缩)+ 32 位(标准)混用 |
| 性能影响 | 执行速度相同,仅取指更高效 |
| 存储节省 | 约 25–40% |
| 解码复杂度 | 略高,但现代核完全支持 |
| 常见组合 | RV32IMC / RV64IMAC / RV32GC(含 F/D/C) |
RV32C = 同样的功能 + 一半的代码长度。
它是 RISC-V 在嵌入式和 IoT 领域最具实际价值的扩展之一。