bgeu

bgeu

RISC-V 汇编 参考

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

描述

bgeu 是 bge 的无符号版本,也是 bltu 的反面。名称含义是 branch if greater than or equal, unsigned(大于等于时分支,无符号)。当 rs1 至少为 rs2 时跳转到标签,两者都按非负数读取。比较方式参见 bge,无符号带来的变化参见 bltu。

有了 bgeu,这个家族共有六个分支。有三个问题:相等、小于和大于或等于,后两者各有有符号和无符号两种形式。beq 和 bne 测试相等性,blt 和 bge 比较有符号值,bltu 和 bgeu 比较无符号值。这六个分支,再加上为大于和小于或等于方向交换操作数,就覆盖了程序所需的所有比较。

bgeu 适合对不可能为负的数量设置上限。例如,当位置到达末尾时退出循环、拒绝已达到数组大小的索引,以及当长度达到容量时分支到处理程序。比较内存地址要使用 bltu 和 bgeu,因为地址是无符号的,有符号版本在那里会给出错误结果。

RISC-V 手册指出,有符号的数组边界可以用单个无符号分支来检查,因为任何负索引都会比任何非负边界更大。bgeu 和 bltu 就是这种检查的两种形式。

下面这一行用一条指令完成组合边界检查。

bgeu i, n, error

它能捕获过大或为负的索引,因为负索引会被读取为一个巨大的无符号值,从而无法通过测试。

示例

li t0, -1
li t1, 1
bgeu t0, t1, done   # t0 read as unsigned is huge, so jump to 'done'