2012-12-31 52 views
4

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

编译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(随后定义的标签Else)的后续部分的代码,则代码将更有效,因此如果寄存器不相等,则使用分支指令(BNE):

BNE $ S3,S4 $,否则#去不然,如果我≠j时

我搜索过一段时间,但我找不到为什么BNE会更高于beq。 (但是我确实发现BNE有时建议,因为它使代码更容易理解,因为当条件成立的正下方BNE语句执行的语句。)

所以,如果它不会是更总的来说效率很高,但在这个特定的练习中它仍然可能更有效率。我考虑过这个问题,并且我认为跳转指令会花费时间,因此我们希望尽量减少跳转次数。这意味着,当我们期望条件成立时,我们应该使用bne,当我们预期条件失败时,我们应该使用beq。

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

因此,要总结:教科书说BNE比BEQ更有效,无论是在普通或只是在这个例子中是不明确的,但在任何情况下,我不明白为什么。

+1

我没有在那里看到一个问题,但这是很多假设没有太多支持他们... – JasonD

+1

我认为这是罕见的任何条件分支比其他更有效率(至少为通用寄存器和标志 - 某些系统/控制/特殊用途寄存器/标志可能会有相关的性能损失)。 'bne'可能被认为是“更高效”的原因可能是编程人员倾向于编写“if(most_likely_condition)something()”形式的代码的心理学原因。 else something_else();'。随着分支代码更容易缓存,可能会使“相反的条件”更“高效”。 – twalberg

+0

要说清楚(我会在一分钟内编辑我的文章):教科书字面上说,这个方法会更有效率,我的问题是为什么。我不假设任何事情来证明他们错了,我只是想出了一些理论,为什么bne和beq可以有不同的效率,但是这些理论中的每一个都适用于这个例子,结果导致效率不高。 – jvanheesch

回答

1

效率不从机器代码用于对BNE BEQ的直接比较。该文本描述了通过编码优化整个性能以缩短最常见的代码路径。

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

的最短路径是通过比较砸,失败并不会跳。

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

非正常情况的分支机构

BEQ $ 18 $ 19 L1

  • 其他处理

  • JMP

换成

BNE $ 18 $ 19 L2

  • 成功处理

L2:

快速制作常见的情况 - 对于大多数分支 一个指令

重读你的问题,我觉得关键是这样的假设:

“现在,如果我们测试$ S3是否等于$ S4,当我们没有信息 任何关于这些寄存器的内容,假设它们可能是相等的,这是不合理的 ;相反,它更 可能,他们是不相等的,这将导致使用BEQ 代替BNE。”

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

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

+0

编辑:我不能与这件事情,不知道如何去一个新的线路。我相当肯定我遵循你的逻辑(因为快速的普通情况是我试图做的,只是忘了解释它),但我不知道我完全得到它。我会引用你: “如果你认为这些值更可能不相等,那么只有一条指令在使用时需要处理,如果你使用beq,你必须在失败时执行一次额外的跳转。”这完全是相反的吗? beq会在他们平等的情况下跳跃,所以如果你不指望他们是平等的,你应该使用我想的? – jvanheesch

+0

我不得不考虑一点,这个想法是,如果你期望值不相等,那么只用一条指令就可以使用bne。如果你期望它们相等,那么使用beq。当任何比较失败时,你都会有一个额外的指令 - 跳转。编写代码以便尽可能不频繁地使用“失败”跳转。 – Paxic

+0

不要让我迷惑你,或者我自己。与bne或beq进行比较的代价是相同的,效率将来自最小化代码路径 – Paxic

0

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