2011-01-28 5 views
2

ハードウェアに組み込んだカスタム命令を実行するインラインアセンブリコードを記述する必要があります。
実際のチップ上でどのハードウェアを見つけるかによって、命令の動作が異なります。インラインアセンブリコードの置換

asm volatile (
    " instr_generic %1, %2, %0   \n\t" 
    : "=r" (c)    
    : "r" (a), "r" (b)  
    : "%g0"             
    ); 

このinstr_genericは現在のハードウェア上にあるものに応じて、例えば加算または減算のいずれかを実行することができ、次のように私のアセンブリが見えます。

instr_genericの代わりに、cust_addまたはcust_subと書く必要があります。これをinstr_genericに置き換えてください。言い換えれば、それはここでは、このよう

#define cust_add instr_generic 

    ... 

    asm volatile (
    " cust_add %1, %2, %0   \n\t" 
    : "=r" (c)    
    : "r" (a), "r" (b)  
    : "%g0"             
    ); 

になります。しかし、私は、インラインassemlyを置き換えるために、この文脈でプリプロセッサを使用することはできません推測するという権利でありますか?それを簡単に行う別の方法はありますか?

+2

実行時にハードウェア機能を決定するまでに、アセンブリ言語はコンパイル時*にコンパイルされます*。 – Lazarus

答えて

5
... 
#define cust(arg) \ 
asm volatile (
" " #arg " %1, %2, %0   \n\t" \ 
: "=r" (c) \   
: "r" (a), "r" (b) \  
: "%g0" \             
) 

... 
cust(cust_add); 
0

私はプロセッサの実行時の検出に基づいて、異なるソリューションをされたif-then-elseを行うだろうか、少しスピードを絞るために、検出された場合は、別のソリューションを含む関数に関数ポインタを使用しますfunptr = a_solution、そうでない場合はb = funptr = b_solutionなどです。プログラムの実行中にfunptrを使用してください。

としては、すでにカスタム命令が実行時ではないコンパイル時にコンパイルする必要があります言及しました。実行時に適切な命令を挿入する自己修正コードを実行する3番目のオプションである命令ランタイムを変更する場合は、

+0

SMCを行う良い方法は、命令フィックスアップのテーブルを出すことです(Linux/x86がextablesのために行うことに似ています)。プログラムinitで正しい命令を書いてください。 – ninjalj

0

文字列連結を使用できませんか?それとも、そうすることができない何らかの理由がありますか?

#define cust_add "instr_generic" 

... 

asm volatile (
cust_add " %1, %2, %0   \n\t" 
: "=r" (c)    
: "r" (a), "r" (b)  
: "%g0"             
); 
+0

'#define cust_add" instr_generic "' - いいえ、動作しません。 (その理由、私がここにいる理由はまさに私がやろうとしていることですが、アセンブラの腸のコンパイルに失敗してしまいます。 – jww