C.SDSP

RISC-V C.SDSP 指令详解

指令手册C-type

RV64C:从 rs2 压缩存储 64 位双字;RV32 Zclsd:从偶数 rs2/rs2+1 寄存器对存储 64 位值。

指令语法

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

指令行为说明

C.SDSP 使用 CSS 格式。RV64C 将 rs2 的 64 位值存到 x2/sp 加零扩展、按 8 缩放的偏移地址;RV32 Zclsd 则由偶数 rs2 与 rs2+1 组成 64 位源值。两种形式的有效地址均为 x2 加偏移。

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

只展示官方定义的 16 位字段、操作数、条件和架构状态;不模拟流水线、缓存或时序。

c.sdsp,(sp)
执行环境

自然对齐访问不得产生地址未对齐异常;任何地址仍可能因 EEI 定义的访问权限而产生访问错误。

mem[0x0000000000002010] <- 0x0123456789ABCDEF
16 位编码字段
15..13
funct3
111
12..10
uimm[5:3]
010
9..7
uimm[8:6]
000
6..2
rs2
01010
1..0
op
10
执行数据路径
CSS 字段:rs2=x10;sp 固定为 x2;uimm=16。
0x0000000000002000 + 16 = 0x0000000000002010; X(x10)[63:0] = 0x0123456789ABCDEF
mem[0x0000000000002010][63:0] <- 0x0123456789ABCDEF
尚未提交架构状态。

快速理解与检索要点

C.SDSP 的基址固定为 x2/sp;CSS 偏移由编码位重组并按 8 缩放。RV64C 与 RV32 Zclsd 的源寄存器模型不同。

RV64C 的 rs2 是完整 5 位寄存器字段;RV32 Zclsd 要求 rs2 为偶数,以编码 rs2/rs2+1 寄存器对。
有效地址是 x2 加零扩展、按 8 缩放的偏移;RV32 Zclsd 的 8 字节自然对齐地址不会触发地址未对齐异常。

常见使用场景

栈帧寄存器保存

结合 «c.sdsp x10, 16(sp) # *(sp+16) = x10» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

RV64C 从一个 rs2 读取 64 位;RV32 Zclsd 从偶数 rs2 和 rs2+1 读取低/高 32 位。
Zclsd 是 RV32-only,依赖 Zilsd 与 Zca,且与 Zcf 编码重叠而不兼容。
RV32 Zclsd 的奇数 rs2 编码保留;rs2=x0 时 64 位源值为零,x1 不读取。

常见问题

RV32 Zclsd 与 RV64C 的源寄存器有什么不同?

RV64C 从 rs2 取 64 位。RV32 Zclsd 要求 rs2 为偶数,并将 rs2 的低 32 位和 rs2+1 的高 32 位组成 64 位值。

RV32 Zclsd 的未对齐访问如何处理?

地址为 8 字节倍数时不得产生地址未对齐异常;地址为 4 字节但不是 8 字节倍数时每个字访问必须原子,但仍可能陷入未对齐异常;其它未对齐情况也可能陷入异常。