C.SDSP

RISC-V C.SDSP 指令详解

指令手册C-type

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

指令语法

c.sdsp rs2, offset(sp)
操作数说明
RV64 C/Zca 或 RV32 Zclsd;16位CSS格式,基址固定x2/sp。Zclsd需Zilsd、Zca,与Zcf不兼容。
rs2是完整5位字段;RV32限偶数寄存器对,rs2=x0时整个64位源为零且不读取x1。
uimm[8:0]={inst[9:7],inst[12:10],000};字节偏移0–504、步长8,零扩展加x2,不再乘8。
成功存储64位;8字节对齐不产生未对齐异常,故障可能已有部分写入;RV32即使对齐也不保证整体原子。
CZclsd压缩指令

扩展条件:RV64 的 C/Zca;或 RV32 的 Zclsd(依赖 Zilsd、Zca,与 Zcf 不兼容)。

指令行为说明

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

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

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

c.sdsp,(sp)
执行环境

RV64 C/Zca

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

0x0000000000002000 + 16 → 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 字节。
uimm[8:0]={inst[9:7],inst[12:10],000}=000010000=16; EXTZ(uimm)
0x0000000000002000 + 16 = 0x0000000000002010; X(x10)[63:0] = 0x0123456789ABCDEF
mem[0x0000000000002010][63:0] <- 0x0123456789ABCDEF
尚未提交架构状态。

快速理解与检索要点

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

CSS:inst[12:10]=uimm[5:3],inst[9:7]=uimm[8:6],低3位补零;字节偏移为0–504、步长8,加到x2前不再乘8。
RV64 的完整5位 rs2 选择 x0–x31;RV32 Zclsd 要求偶数 rs2,低/高32位分别取自 rs2/rs2+1,rs2=x0时整个64位源为零。
8字节自然对齐不得产生地址未对齐异常,但仍可能访问错误;RV32寄存器对访问即使自然对齐也不保证整体原子,异常前可能已有部分写入。

常见使用场景

栈帧寄存器保存

RV64 C/Zca,sp=0x2000、x10=0x0123456789abcdef:c.sdsp x10, 16(sp) 成功时写mem64[0x2010]。RV32 Zclsd同值取x10=0x89abcdef、x11=0x01234567。

使用前检查清单

语法检查
  • RV64 C/Zca 或 RV32 Zclsd;16位CSS格式,基址固定x2/sp。Zclsd需Zilsd、Zca,与Zcf不兼容。
  • rs2是完整5位字段;RV32限偶数寄存器对,rs2=x0时整个64位源为零且不读取x1。
语义检查
  • uimm[8:0]={inst[9:7],inst[12:10],000};字节偏移0–504、步长8,零扩展加x2,不再乘8。
  • 成功存储64位;8字节对齐不产生未对齐异常,故障可能已有部分写入;RV32即使对齐也不保证整体原子。

容易混淆 / 常见误区

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位;rs2=x0时整个源为零且不读取x1。

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

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