MIPS - 与bne的分支约定

时间:2016-01-21 02:48:01

标签: assembly branch mips branch-prediction risc

在讲座中,我们的教授说,在分支中使用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程序集中的约定,以否定方式实现条件分支。我最好的选择是,这是为了保持常见的情况简单 - 因此很快 - 因为直觉上如果我们检查相等性,那么我们会期望它更有可能变得平等,因此当它不相等。我认为我只是努力使其合理,但我仍然无法区分在beqbne中实施它的核心差异。如果有人解释原因我真的很感激。

1 个答案:

答案 0 :(得分:3)

如果 使用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那么。