首页/指令库/C-ADDI4SPN
C.ADDI4SPN

RISC-V C.ADDI4SPN 指令详解

指令手册C-type

RV32/RV64:将 sp 加 4–1020 的非零四字节倍数偏移,写入 x8–x15 的目标寄存器;sp 不变。

指令语法

c.addi4spn rd', nzuimm
操作数说明
RV32/RV64,C 2.0 或 Zca;16 位 CIW 格式。
rd' 的三位字段选 x8–x15;源固定为 x2/sp,字节偏移为 4–1020 的非零 4 倍数。
零扩展偏移加旧 sp,结果取低 XLEN 位写 rd';sp 不变。零偏移保留。
C压缩指令

指令行为说明

C.ADDI4SPN(C 2.0 / Zca,CIW)固定读取 x2/sp,将4–1020的非零四字节倍数偏移加到旧sp,结果低XLEN位写rd'(x8–x15),sp不变。汇编偏移已是字节,不再乘4;编码为nzuimm[9:2],低两位为零。等价addi rd', x2, nzuimm;零偏移保留。

C.ADDI4SPN 压缩编码学习实验

从 16 位字段出发,连接压缩约束、基础指令语义与最终可见状态。

c.addi4spn,
输入
sp = 0x0000000000001000, offset = 16
结果
x8 = 0x0000000000001010

RV32C/RV64C / Zca; IALIGN=16

16 位编码与字段职责

15..13
000
funct3
12..11
01
nzuimm[5:4]
10..7
0000
nzuimm[9:6]
6 / 5
0 / 0
[2] / [3]
4..2
000
rd' -> x8
1..0
00
C0

可见计算过程

sp / x2
0x0000000000001000
+
nzuimm
16 (0x0000000000000010)
=
x8
0x0000000000001010

固定 x2 是输入基址,rd' 是唯一写回目标。

编码重组与地址生成

压缩寄存器映射
rd' -> x8 (x8-x15)
散布立即数
nzuimm[9:2] = 00000100; low bits = 00
基础语义对照
addi x8, x2, 16
提交
x8 <- 0x0000000000001010
尚未提交架构状态。

快速理解与检索要点

RV32/RV64:将 sp 加 4–1020 的非零四字节倍数偏移,写入 x8–x15 的目标寄存器;sp 不变。

CIW:funct3=000,op=00;立即数编码顺序为 [5:4|9:6|2|3],rd' 是三位字段。
RV32/RV64 均适用;rd' 限 x8–x15,偏移为 4–1020 的 4 倍数。

常见使用场景

栈分配对象的指针生成

RV32/RV64,sp=0x1000:c.addi4spn x8, 16 得到 x8=0x1010,sp 不变;16 已是字节偏移。

压缩代码中的地址计算

RV32/RV64,sp=0x1000:c.addi4spn x8, 16 得到 x8=0x1010,sp 不变;16 已是字节偏移。

使用前检查清单

语法检查
  • RV32/RV64,C 2.0 或 Zca;16 位 CIW 格式。
  • rd' 的三位字段选 x8–x15;源固定为 x2/sp,字节偏移为 4–1020 的非零 4 倍数。
语义检查
  • 零扩展偏移加旧 sp,结果取低 XLEN 位写 rd';sp 不变。零偏移保留。

容易混淆 / 常见误区

立即数必须非零且为 4 的倍数(4-1020)
目标寄存器仅x8-x15

常见问题

会修改 sp 吗?

不会。x2/sp 是固定源寄存器,结果仅写入 rd';例如 sp=0x1000、偏移16 时 x8=0x1010。

汇编中的 16 还要乘 4 吗?

不用。16 已是字节偏移;编码存放其 [9:2] 位,硬件还原低两位零。零偏移是保留编码。