處理器系列之PowerPC指令集
本文引用地址:http://m.butianyuan.cn/article/201801/374368.htm
加載和存儲指令
所有加載和存儲指令的執(zhí)行都使用 GPR 或者 GPR 和指令中的立即字段作為存儲器訪問的地址說明符。用指令生成的數(shù)據(jù)有效地址來更新基址寄存器(也就是 RA)是大部分加載和存儲指令的一個可選項(xiàng)。
有用于以下方面的指令:
字節(jié)、半字、字和雙字大小。
在 GPR 或 FPR 與存儲器之間移動數(shù)據(jù)。
在 GPR 或 FPR 與存儲器之間移動數(shù)據(jù)。
特殊的存儲器訪問指令包括:
多字加載/存儲
即 lmw 和 stmw ,可以操作最多 31 個 32 位字。
字符串指令
這些指令可以操作最長 128 字節(jié)的字符串。
內(nèi)存同步指令
這些用于實(shí)現(xiàn)內(nèi)存同步。CR 的第 2 位(EQ 位) 設(shè)置用來記錄存儲操作的成功完成。內(nèi)存同步指令包括:lwarx / ldarx 執(zhí)行加載并設(shè)置處理器內(nèi)部的預(yù)留位,編程模型不必明確了解這些行為。如果設(shè)置了預(yù)留位,相應(yīng)的存儲指令 stwcx. /stdcx. 執(zhí)行條件存儲,并清除預(yù)留位。
lwarx (加載字并預(yù)留變址)
ldarx (加載雙字并預(yù)留變址)
stwcx (存儲字條件變址)
stdcx (存儲雙字條件變址)
棧
PowerPC 體系結(jié)構(gòu)沒有關(guān)于本地存儲器的棧的概念。體系結(jié)構(gòu)沒有定義壓入或者彈出指令,也沒有定義專門的棧指針寄存器。不過,有一個軟件標(biāo)準(zhǔn)可用于 C/C++ 程序,這個標(biāo)準(zhǔn)叫做嵌入式應(yīng)用程序二進(jìn)制接口( Embedded Application Binary Interface,EABI),它定義了棧寄存器和內(nèi)存的約定。EABI 將 GPR1 預(yù)留為棧指針,GPR3 到 GPR7 用于函數(shù)參數(shù)傳遞,GPR3 用于函數(shù)返回值。
需要為 C/C++ 提供接口的匯編語言程序必須遵循同樣的標(biāo)準(zhǔn)來保持約定。
高速緩存管理指令
PowerPC 體系結(jié)構(gòu)包含了面向應(yīng)用級高速緩存訪問的高速緩存管理指令。高速緩存指令在表 9 中列出。
表 9. 高速緩存管理指令
當(dāng)將高速緩存處理代碼移植到不同的 PowerPC 實(shí)現(xiàn)時要當(dāng)心。雖然高速緩存指令可能是跨不同實(shí)現(xiàn)而通用的,高速緩存的組織和大小可能會有變化。例如,假定高速緩存大小以對其進(jìn)行刷新的代碼,在用于其他大小的高速緩存時可能需要進(jìn)行修改。而且,各實(shí)現(xiàn)的高速緩存初始化可能不同。有一些實(shí)現(xiàn)提供了自動清除高速緩存標(biāo)簽的硬件,而其他實(shí)現(xiàn)需要使用軟件循環(huán)來使高速緩存標(biāo)簽無效。
自修改代碼
雖然編寫自修改代碼不是一個工業(yè)標(biāo)準(zhǔn),但有些情況下它是必不可少的。下面的序列介紹了執(zhí)行代碼修改用到的指令:
存儲修改的指令。
執(zhí)行 dcbst 指令,強(qiáng)制包含有修改過的指令的高速緩存行進(jìn)行存儲。
執(zhí)行 sync 指令,確保 dcbst 完成。
執(zhí)行 icbi 指令,使將要存放修改后指令的指令高速緩存行無效。
執(zhí)行 isync 指令,清除所有指令的指令管道,那些指令在高速緩存行被設(shè)為無效之前可能早已被取走了。
現(xiàn)在可以運(yùn)行修改后的指令了。當(dāng)取這個指令時會發(fā)生指令高速緩存失敗,結(jié)果就會從存儲器中取得修改后的指令。
計(jì)時器
大部分實(shí)現(xiàn)都提供了一個 64 位時基,可以通過兩個 32 位寄存器讀取,或者通過一個 64 位寄存器讀取。各實(shí)現(xiàn)的計(jì)時器增量不同,SPR 數(shù)和訪問時基的指令也不同。所以,跨實(shí)現(xiàn)移植計(jì)時器代碼時要當(dāng)心。另外的計(jì)時器可能也不同,但大多數(shù)實(shí)現(xiàn)都提供了至少一種遞減的可編程計(jì)時器。
保持代碼的兼容性
需要在多個實(shí)現(xiàn)上進(jìn)行編程的 PowerPC 用戶通常會問及保持代碼兼容性的技巧。下面的建議將有助于盡量減少移植問題:
盡可能使用 C 代碼。
當(dāng)今的 C 編譯器在很多情況下可以生成與直接手寫的匯編代碼在性能上相當(dāng)?shù)拇a。作為 Book I 代碼,C 代碼將保證代碼的兼容性。
盡可能避免使用處理器相關(guān)的匯編指令。
盡量不要在 C 中嵌入處理器相關(guān)的匯編指令,因?yàn)樗鼈儗⒏y被發(fā)現(xiàn)。分離開那些已知會包含設(shè)備相關(guān)寄存器或指令的代碼。這些通常是啟動次序和設(shè)備驅(qū)動程序,不過也可能包括浮點(diǎn)代碼(包括 long long 類型)。保持假定和依賴全部歸檔。
使用處理器版本寄存器(PVR),但只在適當(dāng)?shù)臅r候用。
跨差別較小的實(shí)現(xiàn)的通用代碼還好,PVR 可以用于做出判斷。但是,在需要進(jìn)行較大修改的情況下(例如,PowerPC AS 相對于 Book E MMU 代碼),建議使用單獨(dú)的代碼庫(code base)。
結(jié)束語
PowerPC AS 和 PowerPC 都支持最初的 PowerPC 體系結(jié)構(gòu)中定義的應(yīng)用級基礎(chǔ)設(shè)施,同時為它們的具體目標(biāo)市場提供了最佳的優(yōu)化。
就其兩種操作模式之一而言,PowerPC AS 實(shí)質(zhì)上與最初的 PowerPC 相同,而 PowerPC Book E 在它的 Book III 級別的定義中,已經(jīng)走向了不同的方向,為低價格、低功率以及體系結(jié)構(gòu)靈活的嵌入式應(yīng)用進(jìn)行了最優(yōu)化。當(dāng)然,在 32 位的實(shí)現(xiàn)上還不能用雙字整數(shù)指令,在大部分嵌入式實(shí)現(xiàn)中浮點(diǎn)指令也只是通過軟件仿真提供支持。
不過,這對應(yīng)用程序二進(jìn)制在 PowerPC 體系結(jié)構(gòu)家族樹的分支中自由地遷移來說是一個非常有意義的機(jī)會。
評論