首页/指令库/字逻辑右移
SRLW

RISC-V SRLW 指令详解

指令手册R-type

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

指令语法

srlw rd, rs1, rs2
操作数说明
rd:接收符号扩展到 64 位的 32 位结果;x0 写入丢弃。
rs1:使用低 32 位逻辑右移;rs2:仅使用低 5 位给出 0–31 的移位量。
仅 RV64I;无立即数操作数;寄存器重叠时使用写回前源值。
RV64I算术运算32位移位

指令行为说明

SRLW指令采用R型格式(opcode=0111011, funct7=0000000, funct3=101)。对rs1的低32位进行逻辑右移(高位补零),移位量由rs2的低5位指定,结果符号扩展至64位后写入rd。

SRLW 指令解析与执行动画

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

srlw rd, rs1, rs2

执行环境

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

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

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

读取指令

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

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

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

快速理解与检索要点

SRLW 仅用于 RV64I:rs1[31:0] 按 rs2[4:0] 逻辑右移,再将 32 位结果的 bit 31 符号扩展到 64 位。

W 后缀不是普通 64 位运算;结果始终按 32 位结果符号扩展。
SRLW 的移位量来自 rs2[4:0],高位不参与移位量。
rd、rs1、rs2 使用完整 5 位整数寄存器字段;x0 读为 0,写入被丢弃。rd=x0 的编码属于面向未来标准用途的 HINT。

常见使用场景

位运算与掩码

RV64I,x11=0x1234567880000000、x12=32:srlw x10, x11, x12 的有效移位量为 0,结果为 0xffffffff80000000;rs1 高 32 位忽略。

使用前检查清单

语法检查
  • 仅 RV64I;rd、rs1、rs2 是完整 5 位 GPR 字段,没有 rs3 或立即数。
语义检查
  • rs1 低 32 位按 rs2[4:0] 逻辑右移,再将 bit31 符号扩展到 64 位。
  • 重叠源读取写回前值;rd=x0 属于面向未来标准用途的 HINT,寄存器和内存不变。

容易混淆 / 常见误区

逻辑右移不保留符号位,注意与SRAW的区别
W 后缀指令只产生 32 位结果,并把 bit[31] 符号扩展到 XLEN;不要把它当作普通 64 位运算。
SRLW 是 RV64I 指令;RV32I 中没有这条 W 形式。

常见问题

它在 RV32 中可用吗?

不可用。SRLIW、SRLW、SUBW 属于 RV64I 的 32 位 word 运算形式。

为什么逻辑右移后还会符号扩展?

W 指令的统一规则是先得到 32 位结果,再把 bit 31 符号扩展到 64 位。