C.SH

RISC-V C.SH 指令详解

指令手册C-type

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

指令语法

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

指令行为说明

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,()
执行环境

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

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'=x10,rs2'=x9,均由三位字段映射到 x8-x15;uimm=2。
0x00002000 + 2 = 0x00002002; X(x9)[15:0] = 0xABCD
mem[0x00002002][15:0] <- 0xABCD
尚未提交架构状态。

快速理解与检索要点

C.SH 将紧凑 rs1'/rs2' 映射到 x8-x15,重组 0 或 2 的 uimm,并只提交 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')。

常见使用场景

紧凑半字存储

结合 «c.sh x9, 2(x10) # store halfword» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

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

常见问题

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

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

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

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