インライン・アセンブラ

インライン・アセンブラはOSの移植性に大きな影響を与えかねない部分です。幸い、visualDSP++のコンパイラのインライン・アセンブラgccがモデルなので、大まかな部分は一緒です。違いはキーワードとconstraintです。

VisualDSP++

まずキーワードはasm。パラメータを渡す場合のconstraintは流石にメーカー製だけあって細かい指定ができます。たとえば次のようにハーフワードのレジスタを指定できます。

asm( "%0 = signbits %1;" 
     : "=l"(num) : "d"(map) );

"l"が下位レジスタハーフを指定するconstraintです。命令によってはレジスタ・ハーフしかオペランドとして受け付けないものがありますのでこれは重宝します。

gcc

一方、gccはキーワードが__asm__です。これはマクロで変換すれば済むのでたいした問題ではありません。TOPPERS/JSPならばCPU依存部のtool_defs.hで変換マクロを宣言します。
少し困るのはハーフワードのレジスタをconstraintとして与えられないことです。仕方がないので次のようにします。

__asm__( "r0.L = signbits %1;"
         "%0 = r0.L;"
         : "=d"(num) : "d"(map) : "R0" );

命令を一つ追加し、R0.Lから%0への符号拡張を行っています。R0.Lを決めうちで使うため、Clobberリストに"R0"を追加します。"R0"は、"r0"と指定するとコンパイラがエラーを吐きます( gcc 3.4.1 )。