MIPS - 使用 bne 的分支约定

MIPS - Branching convention with bne

在讲座中,我们的教授说在分支中使用 bne 而不是使用 beq 是有原因的(让我们自己去弄明白),如下例所示。

if ( i == j )
    i++ ;
j-- ;

编译为

bne  $r1, $r2, L1        # branch if ! ( i == j ) 
addi $r1, $r1, 1         # i++ 
L1: addi $r2, $r2, -1    # j-- 

此外,in this link,也暗示它是 MIPS 汇编中的约定,以在否定[=26]中实现条件分支=] 方式。我最好的选择是,这是为了保持常见情况的简单 - 因此快速 -,因为从直觉上来说,如果我们检查是否相等,那么我们会期望它更有可能变得相等,因此 PC 在 相等。我想我只是努力让它变得合理,但我仍然无法区分在 beqbne 中实现它的核心区别。如果有人解释原因,我将不胜感激。

考虑一下如果您 使用 beq,代码会是什么样子。你可能会得到这样的结果:

beq $r1, $r2, L1
L2: addi $r2, $r2, -1 # j--
...
...
L1: addi $r1, $r1, 1 #i++
j L2

或者这样:

beq $r1, $r2, L1
addi $r2, $r2, -1 # j--
j L2
L1: addi $r1, $r1, 1 #i++
addi $r2, $r2, -1 # j--
L2:

在任何一种情况下,与您在开始时使用 bne 相比,在其中一个执行路径中都会有一个额外的分支。