• 沒有找到結果。

第二章 相關研究

2.4 BURS 理論

2.4.1 建立 BURS tree automaton

2.4.1.2 建立 tree automaton

在這個指令文法的6 個規則中,零維的terminal只有LOCAL32,而其 tree automaton 表格就會是個零維的表格,也就是一個常數而已。因為狀態 1 的完全比對規則是「reg32: LOCAL32」,因此,LOCAL32 的 Tree Automaton Table 就是狀態 1。這是表示當以 BURS 為基礎所產生的目的碼產生器,例 如:前面章節所提到即時編譯器中的目的碼產生器,去剖析樹狀的

Intermediate Representation 時,若碰到 LOCAL32 這個節點則會直接指定狀 態1 給該節點。

零維的terminal處理完,就來處理一維的terminal,也就是INEG32,

其tree automaton table 會是個一維的表格。Figure 2.15 顯示 INEG32 的轉移 表,左邊欄位代表其子節點的狀態,右邊欄位則代表父節點相對應的狀 態。現在舉其中的兩個項目來說明此表格建立的過程。

當子節點的狀態是3 時,從 Figure 2.11 中狀態 3 的內容可以發現其完 全比對規則(full-match rule)是「reg32: IADD32 reg32 reg32」,這就是子節 點會執行的規則,而當子節點執行完此規則時,父節點INEG32 該執行什 麼規則可從狀態3 的包覆運算結果來看。因為父節點是 INEG32,所以在 包覆運算結果中只有「reg32: INEG32 reg32」這個規則符合,亦即,父節 點該執行這條規則,而此規則相對應的狀態是2。因此,當子節點的狀態 是3 時,父節點的狀態應該是 2。

當子節點的狀態是 5,父節點的狀態卻是-1,這是因為從狀態 5 的內 容來看,當子節點在執行其完全比對規「statement:ASSIGN LOCAL32 reg32」時,由於狀態 5 的包覆運算結果是空的,也就是父節點 INEG32 無 法執行什麼規則,因此父節點的狀態被設定為-1。這其實從 Figure 2.8 所 示的指令文法中就可以看出INEG32 的子節點所會執行的規則必須是左半 部的non-terminal(left-hand-side non-terminal)為 reg32,而非 statement。

Figure 2.15 INEG32 的 tree automaton 表格

Figure 2.16 IADD32 的 tree automaton 表格

當左子節點的狀態是3,右子節點的狀態是 2 時,從 Figure 2.11 中狀 態3 的內容和 Figure 2.10 中狀態 2 的內容可以發現,兩者各自的完全比對 規則(full-match rule)是「reg32: IADD32 reg32 reg32」和「reg32: INEG32

1

reg32」,亦即,這是兩個子節點各自會執行的規則,而當兩個子節點執行 完各自的規則時,父節點IADD32 該執行什麼規則可從狀態 3 和狀態 2 的 包覆運算結果來看。因為父節點是IADD32,所以在包覆運算結果可發現 有兩個選擇符合所需,也就是「reg32: IADD32 reg32 reg32」和「reg32:

IADD32 reg32 INEG32 reg32」,如果父節點選擇執行前者的話,則總共執 行的規則就是Figure 2.17 中的 Option 1 的三條規則,所以所花成本是 1+1+1=3;選擇執行前者的話,則總共執行的規則就是 Figure 2.17 中的 Option 2 的兩條規則,所以所花成本是 1+1=2。因此相比之下,這時候父 節點就該執行後者的規則,所以父節點的狀態就是6。

Option 1:Total Cost = 3 reg32:IADD32 reg32 reg32 reg32:INEG32 reg32

reg32:IADD32 reg32 reg32

Option 2:Total Cost = 2 reg32:IADD32 reg32 reg32

reg32:IADD32 reg32 INEG32 reg32 Figure 2.17 兩組互比大小的規則

這兩組規則在經過大小比較後,Option 2 的成本較小所以被保留。

當左子節點的狀態是3,右子節點的狀態也是 3 時,從 Figure 2.11 中狀態 3 的內容可以發現,兩者的完全比對規則(full-match rule)都是「reg32: IADD32 reg32 reg32」,亦即,這是兩個子節點各自會執行的規則,而當兩個子節點執行完相同 的規則時,父節點IADD32 該執行什麼規則可從狀態 3 的包覆運算結果來看。因 為父節點是IADD32,所以在包覆運算結果中只有「reg32: IADD32 reg32 reg32」

這個規則符合,亦即,父節點該執行這條規則,而此規則相對應的狀態是3。因 此,父節點的狀態就是3。

至於ASSIGN 和 ISUB32 的 tree automaton 轉移表的建立過程如同 IADD32 一般,就不再贅述。Figure 2.18 和 Figure 2.19 顯示兩個轉移表的內容。

Figure 2.18 ASSIGN 的 tree automaton 表格

Figure 2.19 ISUB32 的 tree automaton 表格

從以上的說明可以發現,BURS 演算法花了大量的時間在建立 tree automaton 轉移表,而表格在建立時就有使用成本觀念來找出最佳的指令序列,因此當 BURS 所產生的剖析器,或稱作目的碼產生器,在執行時就只需要查詢這些表格 以找出所剖析的對象最佳的指令序列。

相關文件