C.SD

RISC-V C.SD 指令详解

指令手册C-type

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

指令语法

c.sd rs2', offset(rs1')
操作数说明
RV64 C/Zca 或 RV32 Zclsd;16位 CS 格式。Zclsd 需 Zilsd、Zca,与 Zcf 不兼容。
rs1'/rs2' 的3位字段选择 x8–x15;RV32 源限偶数寄存器。字节偏移0–248、步长8。
uimm[7:0]={inst[6:5],inst[12:10],000};零扩展后加基址,不再把字节偏移乘8。
成功存储64位值;RV32 低/高32位取自 rs2'/rs2'+1。8字节自然对齐不产生未对齐异常;故障可能已有部分写入。
CZclsd压缩指令

指令行为说明

C.SD 使用 CS 格式,基址和源字段限 x8–x15,字节偏移 0–248、步长 8。RV64 C/Zca 存储一个 64 位寄存器;RV32 Zclsd 存储偶数 rs2' 的低 32 位和 rs2'+1 的高 32 位。Zclsd 依赖 Zilsd、Zca,与 Zcf 不兼容。

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

仅显示 ISA 可见的 16 位编码、操作数和状态,不表示流水线、缓存或时序。

c.sd,()
执行环境

本动画展示 RV64C 形式;静态说明保留 RV32 Zclsd 的寄存器对条件。偏移已是字节数。8 字节自然对齐不产生地址未对齐异常;未对齐结果由 EEI 决定。mem64 表示完整值,不指定字节序。

0x0000000000002000 + 24 (mod 2^64) -> 0x0000000000002018; mem64 <- 0x0123456789ABCDEF
16 位编码字段
15..13
funct3
111
12..10
uimm[5:3]
011
9..7
rs1'
010
6..5
uimm[7:6]
00
4..2
rs2'
001
1..0
op
00
执行数据路径
压缩操作数映射
rs1'=010 -> x(8+2)=x10, rs2'=001 -> x(8+1)=x9; uimm[7:0]={inst[6:5],inst[12:10],000}=00011000 (3 * 8) -> 零扩展字节偏移 24
具体计算
在“计算”阶段显示当前输入的等式。
架构可见结果

继续到“提交结果”以显示架构状态。

快速理解与检索要点

RV64 C/Zca 的 C.SD 使用两个 x8–x15 字段和零扩展字节偏移(0–248、步长 8);RV32 Zclsd 使用偶/奇寄存器对。

rs1' 与 rs2' 映射至 x8–x15;uimm[7:0]={inst[6:5],inst[12:10],000},汇编偏移已是字节数。
RV32 Zclsd 仅在 Zilsd 和 Zca 同时存在且未实现 Zcf 时可用;rs2' 必须表示偶/奇寄存器对,奇数编码保留。

常见使用场景

数据存储

RV64 C/Zca,x10=0x2000、x8=0x0123456789abcdef:c.sd x8, 0(x10) 成功时写 mem64[0x2000]。RV32 Zclsd 同值需 x8=0x89abcdef、x9=0x01234567。

使用前检查清单

语法检查
  • RV64 C/Zca 或 RV32 Zclsd;16位 CS 格式。Zclsd 需 Zilsd、Zca,与 Zcf 不兼容。
  • rs1'/rs2' 的3位字段选择 x8–x15;RV32 源限偶数寄存器。字节偏移0–248、步长8。
语义检查
  • uimm[7:0]={inst[6:5],inst[12:10],000};零扩展后加基址,不再把字节偏移乘8。
  • 成功存储64位值;RV32 低/高32位取自 rs2'/rs2'+1。8字节自然对齐不产生未对齐异常;故障可能已有部分写入。

容易混淆 / 常见误区

RV64C 中是普通 64 位寄存器存储;RV32 Zclsd 中是寄存器对存储。
Zclsd 依赖 Zilsd 和 Zca,且只适用于 RV32。
Zclsd 源寄存器必须是可表示的偶/奇寄存器对;奇数源寄存器编码为保留。

常见问题

C.SD 能用于 RV32 吗?

需 Zclsd;源只能为 x8/x10/x12/x14 的偶奇对,奇数源编码保留。

偏移对齐保证访问成功吗?

不保证。基址仍可能未对齐;EEI 决定结果。异常不保证未写任何字节,RV32 寄存器对也不保证整体原子。