srl

srl

RISC-V 汇编 参考

lyszt.net 更详细地介绍了 srl 和其他 RISC-V 指令。

编码格式

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

描述

srl 将位向右移动,与 sll 所做的相反。这些字母代表 shift right logical(逻辑右移)。此形式取 rs1 的位,将其向右移动 rs2 中的计数,并将结果存储在 rd 中。

srl rd, rs1, rs2

任何被推过右端的位都会丢失,空出的左侧位置由 0 填充。

这种零填充解释了 logical 一词的含义。右移将值减半,因此移位 1 相当于除以 2,移位 3 相当于除以 8。余数被丢弃,与整数除法一致。srl 可以快速地将无符号数除以 2 的幂。

存在两条右移指令,区别在于空出的高位中放入什么。srl 在那里放入 0。其对应指令 sra 将符号位复制到这些位置,从而保留负数的符号。对于原始位模式或不可能为负的值,请选择 srl。对于可能为负的有符号值,srl 会产生一个大的正数,在这种情况下 sra 才是正确的指令。

根据 RISC-V 手册,移位计数占用寄存器 rs2 的低 5 位。这 5 位涵盖 0 到 31 位,因此 rs2 的其余位被忽略。手册称 srl 为逻辑右移,它在高位插入零。

当移位计数为常量时,使用立即数形式 srli。

示例

li t0, -8
li t1, 1
srl t2, t0, t1   # t2 = 2147483644 (zero-filled)