C.LD

RISC-V C.LD 指令详解

指令手册C-type

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

指令语法

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

指令行为说明

C.LD 使用 CL 格式,基址为 rs1'。字节偏移为 0–248 的 8 倍数,已包含缩放,零扩展后加旧基址。在 RV64 C/Zca 中,成功访问把64位值写入 rd';在 RV32 Zclsd 中,偶数目的寄存器及下一奇数寄存器分别接收低/高32位。rd'、rs1' 的3位字段均选择 x8–x15。

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

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

c.ld, ()
执行环境

RV64 C / Zca

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

x[rs1'] + 16 -> 0x0000000000002010; mem[0x0000000000002010][63:0] = 0x0123456789ABCDEF
16 位编码字段
15..13
funct3
011
12..10
uimm[5:3]
010
9..7
rs1'
010
6..5
uimm[7:6]
00
4..2
rd'
000
1..0
op
00
执行数据路径
压缩字段:rd'=000 -> x8,rs1'=010 -> x10,uimm=16。 inst[12:10|6:5] -> uimm[5:3|7:6]; low[2:0]=000 -> 16 bytes (EXTZ)
(0x0000000000002000 + 16) mod 2^64 = 0x0000000000002010
mem[0x0000000000002010][63:0] = 0x0123456789ABCDEF
尚未提交架构状态。

快速理解与检索要点

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

16位 CL 编码;rd' 和 rs1' 选择 x8–x15。
立即数重组得到 0–248 字节偏移,低3位固定零。
自然对齐只排除地址未对齐异常;权限或内存区域仍可产生访问错误。

常见使用场景

双字数据加载

RV64 C/Zca,x10=0x2000、mem64[0x2010] = 0x0123456789abcdef 且访问成功:c.ld x8, 16(x10) 将该64位值写 x8。RV32 Zclsd 下相同成功访问写 x8=0x89abcdef、x9=0x01234567。

使用前检查清单

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

容易混淆 / 常见误区

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

常见问题

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

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

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

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