簡體   English   中英

MIPS bne beq 計算機組織與設計

[英]MIPS bne beq Computer Organization and Design

所以,我會引用我的教科書(計算機組織與設計)然后我會問我的問題:

將 if-then-else 編譯成條件分支

在下面的代碼段中, f, g, j, ij是變量。 如果五個變量fj對應於五個寄存器$s0$s4 ,這個 C if 語句的編譯 MIPS 代碼是什么?

 if (i == j) f = g + h; else f = g - h;

圖 2.9 是 MIPS 代碼應該做什么的流程圖。 第一個表達式比較是否相等,因此如果寄存器是相等指令 (beq),我們似乎想要分支。 通常,如果我們測試相反的條件以分支執行 if 的后續 then 部分的代碼(下面定義了 label Else),代碼會更高效,因此我們使用 if registers are not equal 指令的分支(bne):

 bne $s3, $s4, Else # go to Else if i ≠ j

我搜索了一段時間,但找不到為什么bnebeq更有效。
(但是我確實發現有時推薦使用 bne,因為它使代碼更容易理解,因為條件成立時要執行的語句就在 bne 語句的正下方。)

所以,如果它在一般情況下不會更有效率,它在這個特定的練習中仍然可以更有效率。 我已經考慮過這一點,並且我假設如果采用分支指令會花費更多時間,因此我們希望最大限度地減少所需的跳轉次數(采用分支)。 這意味着,當我們期望條件成立時,我們應該使用bne ,而當我們期望條件失敗時,我們應該使用beq

現在如果我們測試$s3是否等於$s4 ,當我們沒有關於這些寄存器內容的任何信息時,假設它們可能相等是不合理的。 相反,它們更有可能不相等,這應該有利於使用beq而不是bne

因此,總結一下:教科書說bnebeq更有效,無論是在一般情況下還是在這個例子中都不清楚,但無論哪種情況我都不明白為什么。

效率不是直接比較bne與beq的機器代碼。 該文本描述了通過編碼來優化所有性能,以縮短最常見的代碼路徑。

如果您假設值更可能不相等,那么在使用bne時只需要處理一條指令,如果使用beq,則必須在失敗時執行額外的跳轉。

最短的路徑是通過比較,失敗而不跳躍。

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

分支的罕見案例

beq $ 18,$ 19,L1

  • 否則處理

  • JMP

取而代之

18美元,19美元,L2

  • 成功處理

  • 結束

L2:

快速通用案例 - 大多數分支機構的一條指令

重新閱讀你的問題,我認為關鍵是這個假設:

“現在如果我們測試$ s3是否等於$ s4,當我們沒有關於這些寄存器內容的任何信息時,假設它們可能是平等的是不合理的;相反,它們更可能是他們的不相等,這應該導致使用beq而不是bne。“

這似乎是混亂,我們需要找到一些證據或理由來確定哪種可能性更有可能,寄存器相等或不相等。

在這種情況下,我們正在檢查if-then-else。 我斷言我們期望if-test能夠通過,這是twalberg所描述的心理學。 寄存器不太可能包含隨機值,因為它們包含程序員期望的數據 - 以前操作的結果。

我相信這與簡化編譯器有關。 如果您有一個相等斷言,如果不滿足條件,您可能希望跳過要執行的代碼。 我會假設這個決定是在你有 else 條件而不是的情況下使用完全相同的過程。 這就是我的想法。 無論如何,如果我的推理是錯誤的,請告訴我::)

從 OP 給定的偽代碼開始:

if (i == j) {
  f = g + h;
}
else {
  f = g - h;
}

會翻譯成:

      bne  $s3, $s4, Else
      add  $s0, $s1, $s2
      j    Exit
Else: sub  $s0, $s1, $s2
Exit: ...

如果您將 C 代碼更改為僅在i == j時執行加法:

if (i == j) {
  f = g + h;
}

編譯器會想出這樣的東西:

      bne  $s3, $s4, Exit
      add  $s0, $s1, $s2
Exit: ...

現在,讓我們考慮一下如果我們使用beq來測試斷言,編譯后的代碼會是什么樣子。 我猜它看起來有點像這樣:

      beq  $s3, $s4, Equal
      j    Exit
Equal:
      add  $s0, $s1, $s2
Exit: ...

這似乎比使用bne進行測試效率低得多。

編輯 還有一個事實是,對於 CPU,檢查不平等比檢查平等更快。

如果您嘗試比較 2 個 32 位數是否相等,CPU 必須比較該 32 位數的每一位以確保它們相等。 如果測試不相等,如果 2 個數字的第一位不同,則 CPU 不必費心測試任何其他位來斷言不相等。

另一個原因是簡單的分支預測器通常假設不采用前向分支並且采用向后分支。 這個假設為簡單循環提供了更好的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM