3

私はアセンブリ マクロを C プログラムに書き込んでいますが、これはまったく新しいので、何かに引っかかってしまいました。汎用レジスタから専用レジスタにデータを移動するためのマクロを作成しようとしています。

私の問題は、データを 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

そのようなマクロが利用できない理由はありますか?どうすれば自分でマクロを作成できますか?

よろしくお願いします。

----編集: ---- 現在のように、正しい mtspr セクションにジャンプする巨大なスイッチ ケースが C コードに含まれています。特定の SPR: を読み書きするための 20 のセクションがあり、それぞれがまったく同じように見えますが、一定の値だけ異なります。

4

3 に答える 3

4

それができない理由は、命令アーキテクチャがレジスタパラメータのアドレッシングモードとしてレジスタ間接を受け入れないためです。正直なところ、レジスタの数は通常かなり少ないため、レジスタが命令自体の一部としてエンコードされるため、このようなマシンアーキテクチャは見たことがありません。自分が持っているソリューションが本当に気に入らない場合は、自分で命令を合成して(ベースオペコードを取得し、レジスタ指定子がどこに行くかを確認し、適切な値でORを実行してください)、実行してみてください。OSとコンパイラによっては、これが不可能な場合があります(自己変更コードはタブーであることがよくあります)。

アセンブリでジャンプテーブルを作成すると、コードがよりクリーンになりますか?たぶん、SPR指定子を渡し(ゼロベースの整数であるか、強制的に1に変換できると仮定して)、左にシフトしてオフセットをジャンプテーブルに入れてから、テーブルにジャンプします。これは、次のシーケンスになります。

MTPSR PSRx, val
RET
MTPSR PSRx+1, val
RET

何があなたにとって「よりクリーン」であるかはわかりません。ただそれを捨てると思っただけです。すべてを整列させるためにNOPで埋める必要があるかもしれないことに注意してください。私は、PowerPCマニュアルを持っていないので、命令サイズまたは整列要件が何であるかわかりません。

于 2010-07-13T14:19:18.577 に答える
1

stringizer マクロを使用して、これに対するかなりエレガントな解決策を見つけました。

#define stringify(s) tostring(s)

#define tostring(s) #s

#define mfspr(rn) ({unsigned int rval; \ asm volatile("mfspr %0," stringify(rn) \ : "=r" (rval)); rval;})

#define mtspr(rn, v) asm volatile("mtspr " stringify(rn) ",%0" : : "r" (v))

これは、PowerPC の U-Boot コードからのものです。

于 2011-04-13T21:18:19.727 に答える
0

これは奇妙なことのように思えますが、何らかの理由でこれを行う必要があると確信している場合は、rA をテストして適切なハードコードされたmtspr命令にジャンプするジャンプ テーブルまたは一連の条件を実装する必要があります。 . 無効な SPR 番号の処理方法についても考える必要があります。

于 2010-07-13T13:40:04.977 に答える