2012-03-12 7 views
0

私はOpenRISCのためのCコードを最適化していると私は手動でレジスタ内のいくつかの計算値をprereserveしたい、擬似コードは以下のようになります。私はOpenRISC私のためにGCC ABI見使用するレジスタは

external loop 
    compute eight values (heavy calculations) 
    internal loop 
     use values computed above 

2つのレジスタグループ、つまり呼び出し先保存済みと一時的なレジスタがあります。これらの8つの値を格納するために使用するレジスタはどれですか?私はインラインasmでclobbered listに置くことができるレジスタはどれですか?

私たちはカスタムOpenRISCで実行ファイルを実行するので、ハードコーディングを行う必要があります。

答えて

1

答えはあなたの好きなものです。

callee-saveレジスタを使用すると、コンパイラはそれらを保存します(を実行すると、がclobberedとしてマークされます)。

一時レジスタ(a.k.a. caller-save)を使用すると、関数呼び出しを行うと、コンパイラはそれらを保存するよう強制されます。コンパイラはこれらを他の変数にも使用することを忘れないように注意してください。呼び出し元を使用する場合は、callee-saveを他のものに使用する必要があります。

重い計算をしている場合は、開始する前にいくつかのレジスタをスタックに保存しておくことは大したことにはなりません。

上書きしてはいけない重要な値(スタックポインタなど)を含むレジスタがいくつかあります。 GOTテーブルポインタのような他のものはそれほど重要ではなく、コンパイル時に値を復元します(処理中に必要でないことを確認してください)。

実際には、自分自身でそれを動作するように:コンパイラはあなたのためのレジスタを選択することができます。

int a, b, c; 

asm volatile ("whatever" : "=&w" (a), "=&w" (b), "=&w" (c)); 

変数が必要とされていませんが、レジスタが割り当てられている必要がありますので、彼らは効果的にあなたが望むものは何でもするレジスタを予約&を示しています。 「早期クローバー」は、入力レジスタと同じレジスタを共有できないことを意味します(私の例では示していません)。

関連する問題