C.LDSP

RISC-V C.LDSP 指令详解

指令手册C-type

RV64 C/Zca:从sp/x2加偏移加载64位双字;RV32 Zclsd:加载到偶/奇寄存器对。

指令语法

c.ldsp rd, offset(sp)
操作数说明
RV64 C/Zca 或 RV32 Zclsd;16位 CI 格式。Zclsd 依赖 Zilsd、Zca,与 Zcf 不兼容。
完整5位 rd 选择 x1–x31,x0 保留;基址固定 x2/sp。字节偏移0–504、步长8。
偏移零扩展后加写回前的基址;RV64 写一个64位寄存器,RV32 写偶数 rd 及 rd+1 的低/高32位。
8字节地址自然对齐;RV32 寄存器对访问仍不保证整体原子。陷阱时基址保持原值,但其它目的寄存器可能已更新。
CZcaZclsd压缩指令

指令行为说明

C.LDSP 使用 CI 格式,基址为 sp/x2。字节偏移为 0–504 的 8 倍数,已包含缩放,零扩展后加旧基址。在 RV64 C/Zca 中,成功访问把64位值写入 rd;在 RV32 Zclsd 中,偶数目的寄存器及下一奇数寄存器分别接收低/高32位。rd 是完整5位字段,x0 保留。

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

只展示官方定义的 16 位字段、地址/立即数计算和架构状态;不模拟流水线、缓存、端序实现或时序。

c.ldsp, (sp)
执行环境

RV64 C / Zca

有效地址为 8 的倍数时自然对齐,地址未对齐选项不适用;访问错误仍可发生。未对齐访问能否完成由 EEI 定义。内存值已按 EEI 端序解释。

x[sp/x2] + 16 -> 0x0000000000002010; mem[0x0000000000002010][63:0] = 0x0123456789ABCDEF
16 位编码字段
15..13
funct3
011
12
uimm[5]
0
11..7
rd
00001
6..5
uimm[4:3]
10
4..2
uimm[8:6]
000
1..0
op
10
执行数据路径
x2/sp 固定为基址;rd 字段 00001 -> x1;散布 uimm 重组成 16。 inst[12|6:5|4:2] -> uimm[5|4:3|8:6]; low[2:0]=000 -> 16 bytes (EXTZ)
(0x0000000000002000 + 16) mod 2^64 = 0x0000000000002010
mem[0x0000000000002010][63:0] = 0x0123456789ABCDEF
尚未提交架构状态。

快速理解与检索要点

RV64 C/Zca:从sp/x2加偏移加载64位双字;RV32 Zclsd:加载到偶/奇寄存器对。

16位 CI 编码;rd 选择 x1–x31,基址固定 sp/x2。
立即数重组得到 0–504 字节偏移,低3位固定零。
自然对齐只排除地址未对齐异常;权限或内存区域仍可产生访问错误。

常见使用场景

栈相对双字加载

RV64 C/Zca,旧 sp=0x2000、mem64[0x2010] = 0x0123456789abcdef 且访问成功:c.ldsp x10, 16(sp) 写 x10。RV32 Zclsd 写 x10=0x89abcdef、x11=0x01234567;sp 不变。

使用前检查清单

语法检查
  • RV64 C/Zca 或 RV32 Zclsd;16位 CI 格式。Zclsd 依赖 Zilsd、Zca,与 Zcf 不兼容。
  • 完整5位 rd 选择 x1–x31,x0 保留;基址固定 x2/sp。字节偏移0–504、步长8。
语义检查
  • 偏移零扩展后加写回前的基址;RV64 写一个64位寄存器,RV32 写偶数 rd 及 rd+1 的低/高32位。
  • 8字节地址自然对齐;RV32 寄存器对访问仍不保证整体原子。陷阱时基址保持原值,但其它目的寄存器可能已更新。

容易混淆 / 常见误区

偏移为字节数 0–504,步长8;不要再次乘8。
RV32 Zclsd 依赖 Zilsd、Zca,与 Zcf 不兼容;目的寄存器必须为偶数。
8字节地址自然对齐但不保证整个64位寄存器对访问原子;4字节对齐保证各字访问原子,仍可能未对齐陷阱。
RV32 寄存器对加载陷阱时,基址必须保留原值,其它目的寄存器可能已部分更新;不能假定全部回滚。

常见问题

RV32 与 RV64 的结果有什么不同?

RV64 C/Zca 写一个64位寄存器。RV32 必须有 Zclsd,写偶/奇寄存器对;低编号寄存器接收低32位,端序不改变此映射。

加载陷阱时目的寄存器一定不变吗?

RV32 Zclsd 不能作此保证:基址必须保持原值,但其它目的寄存器可以已更新。成功加载才交付完整的寄存器对结果。