C.SH

RISC-V C.SH 指令详解

指令手册C-type

16位编码的sh指令,存储低16位

指令语法

c.sh rs2', uimm(rs1')
操作数说明
RV32/RV64 Zcb,依赖Zca;16位CSH格式,没有额外Zbb前提。
三位rs1'/rs2'分别选择x8–x15的基址和存储源,重叠时读取同一寄存器值。
uimm[1:0]={inst[5],0},零扩展字节偏移只能为0或2;加基址前不再缩放。
成功时仅存储源低16位;非自然对齐结果由EEI决定,故障可能已有部分写入。
Zcb压缩指令

扩展条件:RV32/RV64 的 Zcb,依赖 Zca;不额外要求 Zbb。

指令行为说明

C.SH 使用 Zcb 的 CSH 格式,将 rs2' 的低 16 位存到 rs1' 加零扩展 uimm 的地址。rs1' 和 rs2' 都表示 x8-x15;uimm[1] 来自编码 bit 5,uimm[0] 固定为 0,因此偏移只能为 0 或 2。

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

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

c.sh,()
执行环境

RV32/RV64 Zcb + Zca

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

0x00002000 + 2 → mem[0x00002002] <- 0xABCD
16 位编码字段
15..10
funct6
100011
9..7
rs1'
010
6
0
0
5
uimm[1]
1
4..2
rs2'
001
1..0
op
00
执行数据路径
CSH 字段:rs1'=010→x10,rs2'=001→x9,均由三位字段映射到 x8-x15;uimm=2。
uimm={inst[5],0}=10=2; EXTZ(uimm)
0x00002000 + 2 = 0x00002002; X(x9)[15:0] = 0xABCD
mem[0x00002002][15:0] <- 0xABCD
尚未提交架构状态。

快速理解与检索要点

C.SH 将紧凑 rs1′/rs2′ 映射到 x8–x15,重组0或2字节的偏移;访问成功时存储 rs2′ 的低16位。

CSH 的 rs1' 与 rs2' 都是三位字段,分别映射为 x8-x15 的基址和存储源。
uimm[31:2] 为零、uimm[1] 取自 encoding[5]、uimm[0] 为零;操作是 mem[X(rs1')+EXTZ(uimm)][15:0] = X(rs2')。
自然对齐地址不得引发地址未对齐异常;非自然对齐访问由EEI决定完成或异常,故障可能已有部分写入。

常见使用场景

紧凑半字存储

RV32/RV64 Zcb+Zca,x10=0x2000、x9=0x1234abcd:c.sh x9, 2(x10) 成功时写mem16[0x2002]=0xabcd。

使用前检查清单

语法检查
  • RV32/RV64 Zcb,依赖Zca;16位CSH格式,没有额外Zbb前提。
  • 三位rs1'/rs2'分别选择x8–x15的基址和存储源,重叠时读取同一寄存器值。
语义检查
  • uimm[1:0]={inst[5],0},零扩展字节偏移只能为0或2;加基址前不再缩放。
  • 成功时仅存储源低16位;非自然对齐结果由EEI决定,故障可能已有部分写入。

容易混淆 / 常见误区

rs1'和rs2'仅限x8-x15
uimm 只能是 0 或 2 字节;有效地址是否未对齐仍取决于 rs1' 的值与 EEI。

常见问题

C.SH 存储源寄存器的哪些位?

它将 rs2' 的最低 16 位写到内存;rs2' 的高位不参与存储值。

C.SH 可以编码哪些偏移?

uimm[1] 来自编码 bit 5 且 uimm[0] 固定为零,因此零扩展偏移只能是 0 或 2 字节。