PSPであそぼう(9)

FPUを使う前に、gccのinline assemblerの書式について知っておく必要がある。
http://www.mars.sannet.ne.jp/sci10/on_gcc_asm.html


それでだ。てっとり早くFPUを実際に使ってsqrtを求める関数を書いてみせる。


float sqrt(float fValue){

register float fReg;
asm __volatile__(
"sqrt.s %0, %1\n"
// "f"は浮動小数レジスタの中からの動的な自動割り当てを意味する
// "="は書き込み専用を意味し、以前の値を消して、
// asm文のアセンブリ部分で書き込まれた値を持つようにする。
: "=f"(fReg)
: "f"(fValue)
);
return fReg;
}

こうなる。その他の命令はFPUのインストラクションセット(命令表)を見ればわかると思うが、FPUには四則演算+αぐらいしか用意されてないのだ。FPUの利点は、64bitレジスタ32本をパイプラインで(≒並列的に)動作させることにある。それをだ。計算をひとつだけしてその結果を普段使ってる32bitのレジスタに書き戻すだけだとFPUを使うウマミがほとんど無い。白菜ひとつ買いに行くのにセスナで飛び立つようなものだ。(つづく)