bgt伪

bgt

伪
RISC-V 汇编 参考

lyszt.net 更详细地介绍了 bgt 和其他 RISC-V 指令。

描述

bgt 是一个在一个值大于另一个值时触发的分支。它的名字代表 branch if greater than。下面的指令在 rs1 严格大于 rs2 时跳转到标签,并将它们作为有符号值进行比较。

bgt rs1, rs2, label

RISC-V 的六个核心分支中没有一个测试 greater-than。a 是否大于 b 与交换操作数后 b 是否小于 a 是同一个问题。bgt 是一条伪指令,汇编器会将其重写为操作数顺序相反的 blt。硬件保持更简单,而比较仍然可以按读起来自然的方向书写。底层的 less-than 分支在 blt 下描述。

当条件按该方向读起来自然时,就使用 bgt,例如当一个值超过最大值时跳转离开、当一个长度大于为它预留的空间时跳转离开,或在两条路径中选择较大者时。

The RISC-V manual states that bgt, bgtu, ble and bleu can be synthesized by reversing the operands to blt, bltu, bge and bgeu.

Strictly 是关键所在。bgt 在两个值相等时不分支。若也要把相等的值算进去,请使用 bge,它在 greater than or equal 时分支。循环和检查中的 off-by-one 错误通常来自这一区别。该比较是有符号的。对于无符号数据,同样的交换适用于 bltu。

展开为

blt rs2, rs1, label

汇编器会将此伪指令替换为上面列出的真实指令或指令。

示例

li t0, 5
li t1, 2
bgt t0, t1, done   # 5 > 2, so jump to 'done'