C.SRAI

RISC-V C.SRAI 指令详解

指令手册C-type

CB 格式:对 rd' 做算术右移并写回 rd'。

指令语法

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

指令行为说明

C.SRAI 使用 CB 格式,rd' 仅表示 x8-x15;它将 rd' 算术右移 shamt 位并写回,展开为 srai rd', rd', shamt。RV32C 中 shamt[5] 必须为 0;shamt=0 的八个编码是指定给 custom use 的 HINT,而不是普通 C.SRAI。

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

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

c.srai,
执行环境
x10 <- 0xFFFFFFF0
16 位编码字段
15..13
funct3
100
12
shamt[5]
0
11..10
funct2
01
9..7
rd'/rs1'
010
6..2
shamt[4:0]
00011
1..0
op
01
执行数据路径
CB 字段:rd'/rs1' 映射到 x10;shamt[5:0]=3。
signed(0xFFFFFF80) >> 3 = 0xFFFFFFF0
x10 <- 0xFFFFFFF0
尚未提交架构状态。

快速理解与检索要点

C.SRAI 将 rd' 作为同一读写寄存器;算术右移用原始符号位填充空出的高位。

CB 的三位 rd'/rs1' 字段映射为 x8-x15;移位量由 shamt[5:0] 编码。
RV32C 的 shamt[5]=1 指定给 custom extensions;所有 shamt=0 C.SRAI 编码都是指定给 custom use 的 HINT。

常见使用场景

有符号整数缩放

结合 «c.srai x8, 2 # x8 >>= 2 (arithmetic)» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

rd'仅限x8-x15(CB格式,3位寄存器字段)
RV32C中shamt[5]=0必须,移位范围0-31
shamt=0 的八个编码是指定给 custom use 的 HINT;不要将其当作普通 C.SRAI。

常见问题

shamt=0 时发生什么?

这八个 C.SRAI 编码是指定给 custom use 的 HINT,不是普通的算术右移;HINT 除推进 PC 和适用性能计数器外不修改架构状态。

RV32C 与 RV64C 的移位量有什么区别?

RV32C 要求 shamt[5]=0,shamt[5]=1 的编码指定给 custom extensions;RV64C 使用完整的 6 位 shamt 字段。