rem
lyszt.net 更详细地介绍了 rem 和其他 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
描述
rem 给出除法的余数,也就是剩余的部分。17 除以 5 得到 3,余 2。div 返回 3,rem 返回 2。这个名字是 remainder(余数)的缩写。其形式如下所示,表示 rd = rs1 除以 rs2 的余数。
rem rd, rs1, rs2
它属于与 div 相同的可选 M 数学扩展。
这两条指令作用于同一对数字,共同给出商和剩余部分。rem 是高级语言中 %(取模)运算符的汇编形式。
对于负数,余数取被除数的符号。7 余 2 是 1,而 -7 余 2 是 -1。用于检测奇数的测试若检查除以 2 的余数是否等于 1,对负数会给出错误答案。检查余数是否为零则对任何符号都能判定奇偶。
RISC-V 手册说 rem 提供相应除法的余数,且非零结果具有被除数的符号。每个不溢出的除法都满足 被除数 = 除数 乘以 商 加 余数。除以零的余数等于被除数,而有符号溢出情形,即最负的数除以 -1,余数为零。要获得同一次除法的商和余数,手册建议对相同的操作数先执行 div 再执行 rem,处理器可以将其融合为一次除法。
余数用于将计数器回绕到缓冲区开头、从数字中取出各位数字,以及将项目分散到各个槽位。除以零的余数返回原数。该示例计算 17 余 5,并在 t2 中留下 2。
示例
li t0, 17 li t1, 5 rem t2, t0, t1 # t2 = 2
