【发布时间】:2012-12-15 18:22:21
【问题描述】:
所以,我会引用我的教科书(计算机组织与设计),然后我会问我的问题:
将 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 在下面定义),代码会更有效,因此我们使用分支 if 寄存器不等于指令(bne):
bne $s3, $s4, Else # 如果 i ≠ j 则转到 Else
我已经搜索了一段时间,但我找不到为什么 bne 会比 beq 更有效。 (但我确实发现有时推荐使用 bne,因为它使代码更易于理解,因为条件成立时要执行的语句就在 bne 语句的正下方。)
因此,如果总体上它不会更有效,那么在这个特定的练习中它仍然可以更有效。我已经考虑过这一点,并且我假设跳转指令会花费时间,因此我们希望最大限度地减少所需的跳转量。这意味着,当我们期望条件成立时,我们应该使用 bne,而当我们期望条件不成立时,我们应该使用 beq。
现在,如果我们测试 $s3 是否等于 $s4,当我们没有关于这些寄存器内容的任何信息时,假设它们可能相等是不合理的;相反,更有可能它们不相等,这应该导致使用 beq 而不是 bne。
所以,总结一下:教科书说 bne 比 beq 更有效,无论是在一般情况下还是在这个例子中都不清楚,但无论哪种情况我都不明白为什么。
【问题讨论】:
-
我没有看到任何问题,但这是很多假设,没有太多支持......
-
我认为很少有任何条件分支比另一个更“有效”(至少对于通用寄存器和标志 - 一些系统/控制/专用寄存器/标志可能有相关的性能损失)。可能
bne被视为“更有效”的原因可能是一种心理原因,编码人员倾向于编写if (most_likely_condition) something(); else something_else();形式的代码。再加上无分支代码对缓存更友好,可能会使“相反条件”“更有效”。 -
说清楚(我会在一分钟内编辑我的帖子):教科书字面上说 bne 会更有效,我的问题是为什么。我不假设任何东西来证明它们是错误的,我只是提出了一些理论,为什么 bne 和 beq 可能具有不同的效率,但是应用于此示例的这些理论中的每一个都导致 bne 效率不高。
-
我最近也在看这本教材。它真的帮助我了解计算机体系结构的想法。
我有一个假设,效率的差异来自bne和beq的机器代码的直接比较。
考虑两条指令正在比较两个寄存器。beq的操作必须经过每一位给出答案并将其存储到目标寄存器中。另一方面,bne可能会抵消前几个的差异。
我没有任何确凿的证据支持这个假设。如果有人可以支持或操作,我真的很高兴
标签: assembly branch conditional mips