divu
lyszt.net 更详细地介绍了 divu 和其他 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
描述
divu 执行无符号除法。寄存器的 32 位可以用两种方式解释。在有符号解读下,最高位表示负数,因此这些位表示大约从 -20 亿到 +20 亿的值。在无符号解读下,不存在负数,这些位从 0 计数到大约 40 亿。位本身不变。变的只是解释方式。
div 将其输入视为有符号,而 divu 将其视为无符号。在范围的上限附近,两者会产生不同的结果。一个所有位都设为 1 的寄存器,对 div 来说是 -1,对 divu 来说是 4,294,967,295。
divu 适合那些不可能为负的值:数组位置、字节大小、循环次数、像素坐标。一旦这些值超过大约 20 亿,有符号的 div 就会返回错误结果。最高位被置位,而有符号解读使该值变为负数。
RISC-V 手册将无符号除法除以零的商定义为所有位都置位,余数定义为等于被除数。根据手册,无符号除法不会发生溢出。所有位都置位是最大的无符号数,而简单的无符号除法电路会自行产生它。这就是手册选择它的原因。
除以零返回最大的无符号值,即所有位都置位。如果除数是 2 的幂,逻辑右移(srli)可以更快地除法。右移 3 位可将无符号数除以 8。
示例
li t0, -2 li t1, 2 divu t2, t0, t1 # t2 = 2147483647 (t0 read as unsigned)
