2012-12-31 54 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通常假定不採用前向分支並且採用後向分支。這個假設爲簡單循環提供了更好的性能。