2010-07-13 76 views
3

我正在編寫一個程序集宏到一個C程序,並且對於這個我已經陷入了一些新問題。 我正在嘗試編寫一個用於將數據從通用寄存器移動到特殊用途寄存器的宏。PowerPC移動到變量SPR

我的問題是,我發現將數據從一個GPR到SPR移動語法如下恆定SPR價值的同時,我想用一個變量一個存儲在另一個寄存器中。

# SPR is constant, rA is the value to be written 
mtspr SPR, rA 

我的東西后,我看起來像這樣:

# rA contains the number of the SPR, and rB the value to be moved. 
AWESOMEmtspr rA, rB 

是否有一個原因是沒有這樣的宏觀可用,我會怎麼做我自己?

非常感謝提前。

---- 編輯: ---- 現在看起來我在我的C代碼中有一個巨大的開關盒跳到正確的mtspr節。我有20個部分用於讀寫指定SPR:s,每個部分看起來完全一樣,但由於常數不同而不同。

回答

4

不能這樣做的原因是指令架構不接受寄存器間接作爲寄存器參數的尋址模式。老實說,我從來沒有見過機器體系結構,因爲寄存器的數量通常很小,所以寄存器被編碼爲指令本身的一部分。如果你真的不喜歡你所擁有的解決方案,你可以嘗試自己綜合指令(取基本操作碼,查看寄存器指定符的位置以及OR的值),然後執行它。根據你的操作系統和編譯器,這可能是不可能的(自修改代碼通常是禁忌)。

如果您在程序集中編寫跳轉表,它會使代碼更清潔嗎?也許通過在SPR說明符(假設這是一個從零開始的整數,或可被強制轉換爲一個),移位它留下來獲得偏移量跳轉表,然後跳轉到表中,這將是

的序列
MTPSR PSRx, val 
RET 
MTPSR PSRx+1, val 
RET 

我不知道什麼是對你更「清潔」的,只是認爲我會拋出。請注意,您可能需要使用NOP來填充所有內容,我沒有PowerPC手冊,因此我不知道指令大小或對齊要求是什麼。

+0

我想應該有你不完全適應的代碼。我想盡可能地在C語言中保留儘可能多的代碼,但是我想我會解決我的問題。不管怎麼說,還是要謝謝你。 – Nubsis 2010-07-13 14:44:15

+0

動態生成的代碼沒有問題,但我認爲您必須標記頁面可執行文件並刷新相關地址的指令緩存(icbf?)。雖然緩存刷新開銷可能不值得。 – 2011-04-06 23:54:13

0

這似乎是一件奇怪的事情,但如果您確信由於某種原因需要這樣做,那麼您需要實現一個跳轉表或條件序列,從而測試rA並跳轉到適當的位置硬編碼mtspr指令。您需要考慮如何處理無效的SPR號碼。

+0

目前我正是這麼做的。我有一個巨大的開關案例,它基於我的C代碼中的枚舉,跳轉到正確的指令。現在看起來我有很多隻有常量不同的mtspr指令。如果我能擺脫所有的代碼,我會是一個更快樂的程序員。 – Nubsis 2010-07-13 13:51:44

1

我發現了一個相當優雅的解決此使用stringizer宏:

的#define字符串化(多個)的ToString(S)

#定義的ToString(S)#秒

#限定mfspr(RN)({unsigned int的RVAL; \ ASM易失性( 「mfspr%0,」 字符串(RN)\ : 「= R」(rval中)); RVAL;})

的#define mtspr( vn)asm volatil E( 「mtspr」 字符串(RN)」,%0" : 「R」(V))

這是從對PowerPC U-Boot的代碼。

+0

請記住,這隻適用於'rn'是編譯時常量。您不能使用其他GPR,例如。 – 2016-10-16 20:26:31

相關問題