remu

remu

RISC-V 汇编 参考

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

描述

remu 计算无符号余数,即无符号除法后剩下的值。它与 divu 的关系,正如 rem 与 div 的关系。u 表示这些位被视为非负数,从 0 一直到大约 40 亿。divu 页面介绍了同一组位的带符号与无符号解读有何不同。

remu 的结果始终落在 0 与除数减 1 之间,因此它永远不会为负,也没有符号规则。这使它适合将位置在环形缓冲区上回绕、把哈希值分布到固定数量的槽位中,以及循环遍历重复序列。

除以零的余数返回原数。

根据 RISC-V 手册,无符号除法不会发生溢出,因此 remu 没有溢出情形。除以零的余数等于被除数。手册建议在同时需要商和余数时,对相同的操作数运行 divu 和 remu,这样处理器可以将它们融合为一次除法。

对于为 2 的幂的除数,按位 AND(andi)能以更低开销得到相同结果。下面这行计算除以 8 后的余数,因为除以 2 的幂的余数就是该值的最低若干位。

andi t0, t0, 7

此捷径仅适用于 2 的幂。

示例

li t0, -1
li t1, 10
remu t2, t0, t1   # t2 = 5 (t0 read as unsigned)