所以,我会引用我的书(计算机组织与设计),然后我会问我的问题: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更有效,无论是在普通或只是在这个例子中是不明确的,但在任何情况下,我不明白为什么。
我没有在那里看到一个问题,但这是很多假设没有太多支持他们... – JasonD
我认为这是罕见的任何条件分支比其他更有效率(至少为通用寄存器和标志 - 某些系统/控制/特殊用途寄存器/标志可能会有相关的性能损失)。 'bne'可能被认为是“更高效”的原因可能是编程人员倾向于编写“if(most_likely_condition)something()”形式的代码的心理学原因。 else something_else();'。随着分支代码更容易缓存,可能会使“相反的条件”更“高效”。 – twalberg
要说清楚(我会在一分钟内编辑我的文章):教科书字面上说,这个方法会更有效率,我的问题是为什么。我不假设任何事情来证明他们错了,我只是想出了一些理论,为什么bne和beq可以有不同的效率,但是这些理论中的每一个都适用于这个例子,结果导致效率不高。 – jvanheesch