因此,我引用我的教科书(计算机组织和设计),然后问我一个问题:

将if-then-else编译为条件分支
在以下代码段中,f,g,j,i和j是变量。如果五个变量f至j对应于五个寄存器$ s0至$ s4,则此C if语句的已编译MIPS代码是什么?
如果(i == j)f = g + h;否则f = g-h;
图2.9是MIPS代码应执行的流程图。第一个表达式比较是否相等,因此,如果寄存器是相等指令(beq),则似乎需要分支。通常,如果我们测试相反的条件以分支执行if的后续then部分(下面定义了标签Else)的代码,则代码将更有效率,因此,如果寄存器不等于指令,则使用分支(bne):
bne $ s3,$ s4,Else#如果i≠j,则转到Else

我搜索了一段时间,但找不到为什么bne比beq更有效。
(但是,我确实发现有时建议使用bne,因为它使代码更易于理解,因为条件成立时要执行的语句就在bne语句的正下方。)
因此,如果总体上效率不高,那么在此特定练习中它仍然可能更高效。我已经考虑过这一点,并认为跳转指令会花费时间,因此我们希望将所需的跳转量减至最少。这意味着,当我们期望条件成立时,我们应该使用bne;当我们期望条件失败时,我们应该使用beq。
现在,如果我们测试$ s3是否等于$ s4,那么当我们没有任何有关那些寄存器内容的信息时,就不合理地假设它们可能相等。相反,它们不相等的可能性更大,这应该导致使用beq而不是bne。
因此,总而言之:教科书说bne比beq更有效,无论是一般还是仅在此示例中尚不清楚,但无论哪种情况,我都不明白为什么。

最佳答案

效率并非来自对bne与beq的机器代码的直接比较。文本描述了通过编码以缩短最常见的代码路径来优化总体性能。

如果您认为这些值更可能不相等,那么在使用bne时仅需要处理一条指令,如果使用beq,则必须在失败时执行另一次跳转。

最短的路径是删除比较,使比较失败而不跳转。

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

分行不常见的情况

beq $ 18,$ 19,L1


其他处理



取而代之

bne $ 18,$ 19,L2


成功处理
结束


L2:

快速处理常见情况-
大多数分支的一条指令

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


“现在,如果我们在没有信息的情况下测试$ s3是否等于$ s4,
这些寄存器的内容是什么,都是不合理的
假设他们可能相等;相反,更多
可能它们不相等,这应该导致使用beq
而不是出生。”


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

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

08-07 13:11