2009-03-02 39 views
3

對於SPARC大會,特別是廢除分行與正規分行有何區別?廢止分支與常規分支有什麼不同?

我一直認爲當我需要填充分支指令的nop延遲槽時需要取消分支指令。然而,我不認爲我在這一部分是正確的,因爲你可以在不撤銷分支的情況下填充nop。

回答

6

無效分支指令會導致延遲槽中的指令 - 分支後的指令 - 如果不採用分支,則會被忽略。

爲什麼這會很重要?因爲通常情況下,分支之後的指令被執行,即使分支被採用。這是因爲有兩個程序計數器PC和NPC。指示正在執行的指令的PC在NPC正被更新爲分支指令的目標的同時被更新爲NPC,即PC + 4。所以由於這些事件的時間安排,下一條指令必須被加載。如果可以的話,不要只是拋棄這個週期,而是使用這個週期更有利可圖。然後,我們只需將該指令作爲循環的一部分。

loop: someOp     
     someOtherOp 
     branch  loop  ; 
     delayslotOp   ; will actually be executed, before someOp, after branch 

如果我們不能使用分支之後的指令槽,然後我們堅持一個NOP在那裏,做這個週期什麼。

那麼,爲什麼然後有不同的指示與廢除和非廢除分支選項?讓我們選擇退出循環時會發生什麼。如果我們已經完成了循環活動的延遲槽部分,那麼我們可能不希望在從循環中退出時執行該操作。因此,我們會在分支指令的末尾添加「,a」。

This page has some nice examples.

2

按照SPARC Architecture Manual (v9)

3.2.3控制傳輸

[...]

大多數控制轉移指令被延遲的;即在 控制傳輸到目標地址完成之前調度邏輯序列中的緊接在 控制傳輸指令之後的指令。

[...]

一個延遲的控制轉移指令之後的指令被稱爲 一個延遲指令。如果未採用分支,延遲控制傳輸指令 (年消息位)中的某位可能會導致延遲指令被廢止(即 無效)。

6.3.4控制,傳輸指令(的CTI)

[...]

編程注意:本進銷存位的可能性增加一個 編譯器可以找到一個有用的指令在 分支之後填充延遲槽,從而減少由 程序執行的指令的數量。例如,年齡位可以用於從循環內移動指令 以填充關閉該循環的分支的延遲槽。同樣,可以使用廢除位來將指令 從「ifthen-else」程序塊的「else」或「then」分支移動到在它們之間選擇的分支的延遲槽。由於 提供了一組完整的條件,編譯器可以安排代碼 (可能顛倒條件的含義),以便從「其他」分支或「然後」分支中的指令 可以移動到 延遲插槽。

下面的代碼示出了兩個分支,在第一個延遲指令總是執行,在第二個如果分支不採取延遲指令被撤銷:

cmp %i3, %i0 
ble %icc, -0x5c 
ld [%l0 - 0x4], %i5 ; executed whether the branch is taken or not 

... 

cmp %l1, 0x80 
bl,a %icc, +0x40 
ld [%fp + 0x7c7], %g2 ; annulled if the branch is not taken, executed otherwise