首页/指令库/字算术右移
SRAW

RISC-V SRAW 指令详解

指令手册R-type

将rs1低32位算术右移rs2[4:0]位,结果符号扩展至64位写入rd

指令语法

sraw rd, rs1, rs2
操作数说明
rd:x0–x31;与源重叠时先读取旧源值,写入 x0 被丢弃。
rs2:仅使用低 5 位作为移位量。
仅 RV64I;rs1 高 32 位忽略,算术右移复制原 bit31,再符号扩展 32 位结果。
RV64I算术运算32位移位

指令行为说明

SRAW指令采用R型格式(opcode=0111011, funct7=0100000, funct3=101)。对rs1的低32位进行算术右移(高位用原bit31填充),移位量由rs2的低5位指定,结果符号扩展至64位后写入rd。

SRAW 指令解析与执行动画

RV64I; XLEN=64; 32-bit result → sign extension

sraw rd, rs1, rs2

执行环境

假设取指成功、无异步中断及额外扩展检查;同名寄存器共用一份初值。

本例固定 IALIGN=32、指令长 32 位;PC 必须为 4 字节对齐。

32-位编码0x40C5D53B
funct7 [31..25]
0100000
rs2 [24..20]
01100 → x12
rs1 [19..15]
01011 → x11
funct3 [14..12]
101
rd [11..7]
01010 → x10
opcode [6..0]
0111011
x11=0xFFFFFFFFFFFFFFF0; x12=0x0000000000000002
尚未计算

读取指令

解析当前指令字段并读取写回前源值;还没有提交结果。

x10=0x0000000000000007; PC=0x0000000000002000
当前架构状态(提交前)

这是架构效果的教学步骤,不代表处理器流水线或周期。

快速理解与检索要点

SRAW 仅适用于 RV64I:忽略 rs1 高 32 位,按rs2[4:0]算术右移低 32 位,再符号扩展到 64 位。

opcode=0111011、funct3=101;funct7=0100000。
移位量为 0 仍执行 32 位截断和符号扩展;不是复制完整 64 位源值。

常见使用场景

位操作与掩码

结合 «sraw x10, x11, x12 # RV64I: x11=0x1234567880000000, x12=33 -> x10=0xffffffffc0000000» 等实际代码理解该场景。

使用前检查清单

语法检查
  • rd、rs1 和可选 rs2 均为 x0–x31 或 ABI 名称;没有 rs3。
  • 移位量使用 rs2 的低 5 位。
语义检查
  • 将rs1低32位算术右移rs2[4:0]位,结果符号扩展至64位写入rd
  • 重叠寄存器读取写回前源值;rd=x0 为 HINT,仅推进 PC 和适用性能计数器,实现可忽略。

容易混淆 / 常见误区

算术右移保留符号位,结果扩展后正确反映有符号语义
W 后缀指令只产生 32 位结果,并把 bit[31] 符号扩展到 XLEN;不要把它当作普通 64 位运算。
这些 W 后缀形式属于 RV64I,RV32 中没有对应形式。
rd=x0 是面向未来标准用途的 HINT;除推进 PC 和适用的性能计数器外,不改变架构可见状态,且实现可忽略它。

常见问题

移位量为 0 时会怎样?

保留 rs1[31:0],再把 bit31 符号扩展到 64 位。例如 rs1=0x1234567880000000、rd≠x0 时结果为 0xffffffff80000000。

移位量取哪些位?

SRAW 只使用 rs2[4:0],例如 rs2=33 时右移 1 位。