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

RISC-V C.ADDI16SP 指令详解

指令手册C-type

将非零 nzimm[9:4] 符号扩展后加到栈指针 x2/sp;立即数是 16 字节倍数。CI 格式,与 C.LUI 共享编码空间。

指令语法

c.addi16sp nzimm
操作数说明
压缩指令仅 16 位,寄存器选择通常限制在 x8–x15。
立即数字段较窄,查看特定压缩指令的完整编码。
C压缩指令

指令行为说明

C.ADDI16SP 与 C.LUI 共享编码空间,但目标字段固定为 x2/sp。它把分散编码的非零 nzimm[9:4] 符号扩展后加到 x2/sp;该立即数表示 -512 到 496 的 16 字节倍数。它展开为 addi x2, x2, nzimm[9:4];nzimm=0 的编码保留。

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

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

指令语法
固定目的/源寄存器
x2 / sp
不是可编辑的汇编操作数
执行环境
16 位编码
0x713D = 0111000100111101
funct3 [15..13]
011
nzimm[9] [12]
1
rd [11..7]
00010 (x2/sp)
nzimm[4|6|8:7|5] [6..2]
01111
op [1..0]
01
操作数与计算
x2/sp = 0x00001000
nzimm[9:4] = 111110-32
0x00001000 + -32 (mod 2^32)
当前步骤

步骤 1:识别固定 x2/sp 的 C.ADDI16SP 编码

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

解码结果与架构状态
C.ADDI16SP

写回步骤之前,x2/sp 仍保持读取到的旧值;上方只展示待写回的计算。

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

快速理解与检索要点

C.ADDI16SP 是 16 位 C 扩展指令:固定读取并写回 x2/sp,将非零 nzimm[9:4] 符号扩展后相加。它只编码 -512 到 496 的 16 字节倍数。

funct3=011、op=01,rd 字段为 x2;nzimm 位按 [9]、[4|6|8:7|5] 分散编码。
nzimm=0 是保留编码,不应作为普通 C.ADDI16SP 计算或栈帧调整示例。

常见使用场景

函数调用与返回

使用 jal ra, label 或 jalr ra, rs, imm。

使用前检查清单

语法检查
  • 确认压缩指令 16 位编码只在支持 C 扩展的 CPU 上可用。
  • 确认 rd/rs1'/rs2' 字段映射到 x8–x15。
语义检查
  • 注意压缩指令的操作数空间有限。
  • 确认这条压缩指令有对应的 32 位展开形式。

容易混淆 / 常见误区

立即数必须是 -512 到 496 内的非零 16 字节倍数;nzimm=0 编码保留。
x2/sp 是编码固定的隐式源和目的寄存器,不是可选 rd。

常见问题

C.ADDI16SP 的立即数范围为何不是连续的每个整数?

该立即数按 16 字节缩放编码,因此只有 -512 到 496 之间的非零 16 字节倍数可编码。

nzimm=0 时会怎样?

C.ADDI16SP 仅在 nzimm 非零时有效;nzimm=0 的编码保留。