Hexagon處理器的指令編碼

2021-07-05 09:27:12 字數 3131 閱讀 3347

本文將講解hexagon處理器指令以及指令包的二進位制編碼,它包含如下幾個部分

l  指令

l  子指令

l  duplex指令

l  指令類

l  指令包

l  迴圈包

l  立即運算元

l  擴充套件立即運算元

l  常數補充

l  新值運算元

l  指令對映

所有的hexagon處理器指令都是基於32位指令字來編碼的。指令字格式根據指令的型別各有不同。

指令字中包含了兩種位域的方式

l  通用域在每個處理器指令中都存在,並且在所有指令中都擁有相同的定義。

l  特定指令域只會在某些指令中出現,或者根據指令集的定義不同而各有差異。

指令的位域資訊如下圖所示:

表一 指令的位域資訊

為了減少編碼大小,hexagon處理器支援在單一的32位容器中進行指令對的編碼。這樣的指令編碼被稱作子指令。而容器被稱作duplexes

子指令用於如下幾種常用的指令:

l  算數以及邏輯操作

l  暫存器的分配與傳送

l  load與store指令

l  棧幀的分配與釋放

l  子路徑的返回操作

圖二列出了子指令與群識別符號

表二 子指令與群識別符號

表三 指令的位址資訊

複式結構通過將[15:14]位設定為00來編碼為32位指令。被用於構成duplex的子指令在duplex中被編碼為13位域。

下圖顯示了duplex的編碼細節

表四 乙個指令包可以包含乙個duplex以及超過兩個的非duplex指令。duplex只能包含在包的最後乙個字中。duplex指令中的執行流程總是從slot0-slot1

duplex擁有如下的群限制:

表四 duplex的群限制:

常數擴充套件使得指令的立即數操作擴充套件至32位。如下的子指令可以通過常數擴充套件來使用

rx = add(rx,#s7)

rd = #u6

如果duplex包含兩個相同子指令群的指令,那麼在duplex中,指令比如按照如下的方式來安排:如果子指令以13位的無符號數來操作,那麼相應的更小的數字應該被放置在duplex的slot1中。

子指令必須遵循任意slot的安排群規則,從而適應於單指令,即使duplex模式的存在違反了這些安排。對這些規則,有乙個特例:

jumpr r31必須出現在slot0的位置上。

表五 指令類的編碼值

指令包通過使用指令字中的兩個位[15:14]來進行編碼,它們對應著指令字中的parse域。這些域值有如下的定義

01或10:意味著該指令不是包中的最後乙個指令

00:意味該指令是乙個duplex指令

如果四個連續的指令序列都沒有包括11,那麼處理器將會丟擲乙個錯誤異常。下圖給出了指令字中parse域的定位:

圖一 parse域的定位

如下的案例顯示了parse用於編碼指令包的流程

01 11 // parse fields of instrs a,b

01 01 11 // parse fields of instrs a,b,c

01 01 01 11 // parse fields of instrs a,b,c,d

除了編碼包中的最後乙個指令外,指令字中的parse域還被用於編碼硬體迴圈中的最後乙個包。

hexagon處理器支援兩種硬體迴圈:標籤0與1.這些迴圈中的最後乙個包受如下的規則限制:

硬體迴圈0中的最後乙個包必須包含兩個或者更多的指令

硬體迴圈1中的最後乙個包必須包含三個或者更多的指令

如果迴圈中最後乙個包使用組合語言來表述,那麼彙編器將自動新增乙個或兩個nop指令從而擴充編碼包,無論該包是否是最後乙個迴圈。

下表顯示了用於編碼迴圈包的parse域:

表六 編碼迴圈包的parse域

如下的**案例顯示了parse域是如何用來編碼迴圈包的:

:endloop0

10 11 // parse fields of instrs a,b

:endloop0

10 01 11 // parse fields of instrs a,b,c

:endloop0

10 01 01 11 // parse fields of instrs a,b,c,d

:endloop1

01 10 11 // parse fields of instrs a,b,c

:endloop1

01 10 01 11 // parse fields of instrs a,b,c,d

:endloop0:endloop1

10 10 11 // parse fields of instrs a,b,c

:endloop0:endloop1

10 10 01 11 // parse fields of instrs a,b,

ARM指令協處理器處理指令

arm支援16個協處理器,在程式執行過程中,每個協處理器忽略屬於arm處理器和其他協處理器指令,當乙個協處理器硬體不能執行屬於她的協處理器指令時,就會產生乙個未定義的異常中斷,在異常中斷處理程式中,可以通過軟體模擬該硬體的操作,比如,如果系統不包含向量浮點運算器,則可以選擇浮點運算軟體模擬包來支援向...

ARM指令協處理器處理指令

arm支援16個協處理器,在程式執行過程中,每個協處理器忽略屬於arm處理器和其他協處理器指令,當乙個協處理器硬體不能執行屬於她的協處理器指令時,就會產生乙個未定義的異常中斷,在異常中斷處理程式中,可以通過軟體模擬該硬體的操作,比如,如果系統不包含向量浮點運算器,則可以選擇浮點運算軟體模擬包來支援向...

C 預處理器指令

c 預處理器指令是在編譯時呼叫的。預處理器指令 preprocessor directive 告訴c 編譯器要編譯哪些 並指出如何處理特定的錯誤和警告。c 預處理器指令還可以告訴c 編輯器有關 組織的資訊。1.定義符號和取消符號定義的預處理指令 define 和 undef 預處理指令都以 號開頭並...