MIPS bne beq计算机组织与设计

时间:2012-12-31 17:04:06

标签: assembly branch conditional mips

所以,我会引用我的教科书(计算机组织和设计),然后我会问我的问题:

  

将if-then-else编译为条件分支

     

在以下代码段中,f,g,j,i和j是变量。如果五个变量f到j对应于五个寄存器$ s0到$ s4,那么这个C if语句的编译MIPS代码是什么?

     

if(i == j)f = g + h;否则f = g - h;

     

图2.9是MIPS代码应该做的事情的流程图。第一个表达式比较相等,所以如果寄存器是等于指令(beq),我们似乎想要分支。 一般情况下,如果我们测试相反条件来分支执行if的后续部分if(下面定义标签Else),那么代码会更有效,所以我们使用分支,如果寄存器是不平等的指示(bne):

     

$ s3,$ s4,否则如果i≠j,则转到其他地方

我已经搜索了一段时间,但我找不到为什么bne会比beq更有效率。 (但我确实发现有时会推荐使用bne,因为它使代码更容易理解,因为当条件成立时要执行的语句正好在bne语句之下。)

因此,如果它一般不会更有效,那么在这个特定的练习中它仍然可以更有效率。我已经考虑过了,我认为跳转指令需要花费时间,因此我们希望尽量减少所需的跳转量。这意味着,当我们期望条件成立时,我们应该使用bne,当我们期望条件失败时,我们应该使用beq。

现在,如果我们测试$ s3是否等于$ s4,当我们没有关于这些寄存器内容的任何信息时,假设它们可能是平等的是不合理的;相反,它们更可能不相等,这应该导致使用beq而不是bne。

所以,总结一下:教科书说bne比beq更有效,无论是一般还是只是在这个例子中都不清楚,但在任何一种情况下我都不明白为什么。

2 个答案:

答案 0 :(得分:1)

效率不是直接比较bne与beq的机器代码。该文本描述了通过编码来优化所有性能,以缩短最常见的代码路径。

如果你认为这些值更可能是不相等的,那么在使用bne时只需要处理一条指令,如果使用beq,你必须在失败时执行额外的跳转。

最短路径是通过比较,失败而不跳跃。

来自http://www.cs.gmu.edu/~setia/cs365-S02/class3.pdf

分支的不常见案例

beq $ 18,$ 19,L1

  • 其他处理

  • JMP

替换为

$ 18,$ 19,L2

  • 成功处理

L2:

快速通用案例 - 大多数分支机构的一条指令

重新阅读你的问题,我认为关键是这个假设:

  

“现在,如果我们测试$ s3是否等于$ s4,那么我们没有任何信息   关于这些登记册的内容,这是不合理的   假设他们可能是平等的;相反,它更多   可能他们不相等,这应该导致使用beq   而不是bne。“

这似乎是混乱,我们需要找到一些证据或理由来确定哪种可能性更有可能,寄存器相等或不相等。

在这种情况下,我们正在检查if-then-else。我断言我们期望if-test能够通过,这是twalberg所描述的心理学。寄存器不太可能包含随机值,因为它们包含程序员期望的数据 - 以前操作的结果。

答案 1 :(得分:0)

另一个原因是简单的branch predictors通常假设不采用前向分支并且采用向后分支。这个假设为简单循环提供了更好的性能。