首页/指令库/立即数字逻辑右移
SRLIW

RISC-V SRLIW 指令详解

指令手册I-type

将rs1低32位逻辑右移立即数指定位数,结果符号扩展至64位写入rd

指令语法

srliw rd, rs1, shamt
操作数说明
rd:x0–x31;与源重叠时先读取旧源值,写入 x0 被丢弃。
shamt:0–31;imm[5]=1 的编码保留,不是 12 位有符号立即数。
仅 RV64I;rs1 高 32 位忽略,逻辑右移高位补零,再符号扩展 32 位结果。
RV64I算术运算32位移位

指令行为说明

SRLIW 指令采用 I 型格式(opcode=0011011、funct3=101、固定 imm[11:5]=0000000)。对 rs1 的低 32 位进行逻辑右移(高位补 0),移位量为 imm[4:0],结果符号扩展至 64 位后写入 rd。imm[5] 不为 0 的编码是保留编码。

SRLIW 指令解析与执行动画

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

srliw rd, rs1, shamt

执行环境

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

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

32-位编码0x0025D51B
fixed imm[11:5] [31..25]
0000000
shamt[4:0] [24..20]
00010
rs1 [19..15]
01011 → x11
funct3 [14..12]
101
rd [11..7]
01010 → x10
opcode [6..0]
0011011
x11=0x0000000000000014; shamt=2
尚未计算

读取指令

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

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

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

快速理解与检索要点

SRLIW 仅适用于 RV64I:忽略 rs1 高 32 位,按0–31 的 shamt逻辑右移低 32 位,再符号扩展到 64 位。

opcode=0011011、funct3=101;imm[11:5]=0000000,imm[5]=1 的编码保留。
移位量为 0 仍执行 32 位截断和符号扩展;不是复制完整 64 位源值。

常见使用场景

位操作与掩码

结合 «srliw x10, x11, 1 # RV64I: x11=0x1234567880000000 -> x10=0x0000000040000000» 等实际代码理解该场景。

使用前检查清单

语法检查
  • rd、rs1 和可选 rs2 均为 x0–x31 或 ABI 名称;没有 rs3。
  • shamt 为 0–31;imm[5]=1 的编码保留,不是有符号 12 位操作数。
语义检查
  • 将rs1低32位逻辑右移立即数指定位数,结果符号扩展至64位写入rd
  • 重叠寄存器读取写回前源值;rd=x0 为 HINT,仅推进 PC 和适用性能计数器,实现可忽略。

容易混淆 / 常见误区

shamt 为 0–31;imm[5]=1 的编码保留,不能据此保证某一种异常。
先逻辑右移低 32 位,再符号扩展结果 bit31;shamt=0 且原 bit31=1 时高 32 位为全 1,shamt>0 时为全 0。
W 后缀指令只产生 32 位结果,并把 bit[31] 符号扩展到 XLEN;不要把它当作普通 64 位运算。
这些 W 后缀形式属于 RV64I,RV32 中没有对应形式。
rd=x0 是自定义 HINT;除推进 PC 和适用的性能计数器外,不改变架构可见状态,且实现可忽略它。

常见问题

移位量为 0 时会怎样?

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

移位量取哪些位?

SRLIW 使用 imm[4:0],范围 0–31;imm[5]=1 的编码保留,不能把任意越界输入按低 5 位当作合法指令。