MIPS bne beq 计算机组织与设计

jva*_*sch 6 assembly if-statement mips micro-optimization conditional-statements

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

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

在下面的代码段中,f, g, j, ij是变量。如果五个变量fthroughj对应于五个寄存器$s0through $s4,则此 C if 语句的编译 MIPS 代码是什么?

\n
if (i == j) f = g + h; else f = g - h;\n
Run Code Online (Sandbox Code Playgroud)\n

图 2.9 是 MIPS 代码应执行的操作的流程图。第一个表达式比较是否相等,因此如果寄存器是相等指令(beq),我们似乎需要分支。一般来说,如果我们测试相反的条件来分支执行 if 的后续 then 部分的代码(标签 Else 定义如下),那么代码会更高效,因此我们使用 if 寄存器不相等指令进行分支(bne):

\n
bne $s3, $s4, Else # go to Else if i \xe2\x89\xa0 j\n
Run Code Online (Sandbox Code Playgroud)\n
\n

我已经搜索了一段时间,但我找不到为什么bnebeq.
\n(不过,我确实发现有时建议使用 bne,因为它使代码更容易理解,因为条件成立时要执行的语句就在 bne 语句的正下方。)

\n

因此,即使它在一般情况下不会更有效,但在这个特定的练习中它仍然可能会更有效。我已经考虑过这一点,并且我假设如果采用分支指令,则会花费更多时间,因此我们希望最大限度地减少所需的跳转(采用分支)的数量。这意味着,当我们期望条件成立时,我们应该使用bne,而当我们期望条件失败时,我们应该使用beq

\n

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

\n

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

\n

Pax*_*xic 2

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

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

最短的路径是放弃比较,失败而不跳转。

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

分支机构的罕见情况

价格 18 美元、19 美元、L1

  • 其他处理

  • 跳跃

取而代之

bne $18, $19, L2

  • 成功处理

  • 结尾

L2:

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

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

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

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

在本例中,我们正在检查 if-then-else。我断言我们期望如果测试能够通过,这就是特瓦尔伯格所描述的心理学。寄存器不太可能包含随机值,因为它们包含程序员期望的数据 - 先前操作的结果。