インラインアセンブラで浮動小数点演算!

というわけで、この前のをそのまんま貼り付けてみたり。

五月六日
 はてさて、今回は何となく勉強したアセンブラ周りを何となく。


====== インラインアセンブラ浮動小数点演算! ======
 いやま、いきなり何かというと、
高速化を図ろうとアセンブラをかまそうかと思ったわけなんですが、
これほとんどdoubleやないですかぁぁっ!?
…と(苦笑)


 で、普段ならそこで手を引く所なのですが、(←ダメな例)
今回調べてみたら、思ったより楽に出来そうな部分があるじゃないかと。
…そういうわけです。


 で、本題。
と、言っても、今回は「代入」するだけですが(汗)



/*=== アセンブラ浮動小数を代入する ===*/
[]double[] []abc[] = 1.0, []def[] = 2.3;

/* abcにdefを代入 */
_asm
{
  FLD qword ptr[ []def[] ]
  FSTP qword ptr[ []abc[] ]
}



…以上。
 …あいや、これだけだと何がしたいのかよくわからないので、
ちょいと解説っぽいものを。
 まず、
FLD qword ptr[ def ]
これは、
浮動小数演算用のスタックの最上段にオペランド部を格納する
…だそうです。
(元ページ失念…(汗)確か「fld fstp fpu」あたりで検索すれば出て来たはず…)
要するに、「次に浮動小数演算に使うのはコイツだよ〜」って所でしょうかね。


 で、次が
FSTP qword ptr[ abc ]
これは、
浮動小数演算用スタックの最上段の値をオペランド部に格納する
…だそうです。
はい、丁度さっきの正反対ですね。
値を一時保存しておく → すぐに取り出す
で代入が出来ると。至って自然な流れですね。


 …で、「これ何に使うのよ?」とか「FMOVとか無かったかい?」とか
あると思うんですが。
 これをちょっと組み込むだけで結構変わる場合があります。
現に、僕の場合はこれを3ヶ所ほど組み込んだだけなんですが、
気になっていた音飛びが無くなりました(!)。


…とは言っても、あくまでも変わる「場合がある」であって、
確実に速くなるわけではないですが。
(僕はコンパイル後のアセンブラの無駄を確認してから組み込みましたし)
それに、「速度優先の最適化」には若干負けるようです…(苦笑)
(行数でのみ確認(実行速度では確認していません)。)


 後、「FMOV」もあるようなのですが、
VCのアセンブラのコードでは上記の命令が使用されていたので、
今回はこちらを取り上げました。