所以,我會引用我的書(計算機組織與設計),然後我會問我的問題: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