srai

srai

RISC-V 汇编 参考

lyszt.net 更详细地介绍了 srai 和其他 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

描述

srai 将比特右移固定量,并将符号位复制到空出的高位,从而使负数保持为负。它是 sra 的常量形式,这就是填充保留符号的原因。i 表示立即数(immediate),即编码在指令中的常量。

srai 的语法如下所示,amount 是 0 到 31 之间的常量。

srai rd, rs1, amount

右移一位会将数减半并保持符号不变,因此 srai 将有符号数除以 2 的幂。下一行将有符号值除以 8,对正数和负数输入都适用。

srai t0, t0, 3

srai 向下取整,朝更负的值方向舍入。将 -7 右移 1 位得到 -4,而除数为 2 的 div 得到 -3,因为它朝零舍入。两者在非负数以及没有余数的除法上一致。只有当负数产生余数时,它们才相差 1。图形、音频和信号代码通常需要向下舍入。

RISC-V 手册将常量移位编码为 I 型格式的一种特化,I 型格式是标准指令布局之一。移位量占据立即数字段的低 5 位,指令的第 30 位区分两种右移。srai 执行算术右移,原始符号位填充空出的高位。

在四种移位中,srai 处理有符号数的除法,srli 处理原始比特或永远不会变为负数的数。不带 i 的形式 sra 和 srl 接受在程序运行时计算的移位距离。

示例

li t0, -8
srai t1, t0, 1   # t1 = -4 (sign-filled)