C.SRAI

RISC-V C.SRAI 指令详解

指令手册C-type

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

指令语法

c.srai rd', uimm
操作数说明
RV32/RV64 C/Zca;16位CB格式,三位rd'/rs1'选择同一x8–x15读写寄存器。
shamt[5:0]={inst[12],inst[6:2]};普通移位量RV32为1–31、RV64为1–63。
算术右移将原符号位填入高位;结果写回原寄存器。
shamt=0是指定给custom use的HINT;RV32的shamt[5]=1指定给custom extensions,不按标准移位执行。
C压缩指令

扩展条件:RV32/RV64 的 C/Zca;普通移位量RV32为1–31、RV64为1–63。零移位编码是HINT。

指令行为说明

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

RV32/RV64 C/Zca

x10=0xFFFFFF80 >> 3 → 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'=010 映射到 x10;shamt[5:0]=3。
shamt={inst[12],inst[6:2]}=000011=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。

常见使用场景

有符号整数缩放

RV32 C/Zca,x8=0xffffff80(-128):c.srai x8, 2 写x8=0xffffffe0(-32),高位复制原符号位。

使用前检查清单

语法检查
  • RV32/RV64 C/Zca;16位CB格式,三位rd'/rs1'选择同一x8–x15读写寄存器。
  • shamt[5:0]={inst[12],inst[6:2]};普通移位量RV32为1–31、RV64为1–63。
语义检查
  • 算术右移将原符号位填入高位;结果写回原寄存器。
  • shamt=0是指定给custom use的HINT;RV32的shamt[5]=1指定给custom extensions,不按标准移位执行。

容易混淆 / 常见误区

rd'仅限x8-x15(CB格式,3位寄存器字段)
RV32普通移位量为1–31;shamt[5]=1的编码指定给custom extensions,不是标准C.SRAI。
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 字段。