SSEを用いたbsr/bsf命令の実現に向けて その2
まず下準備としまして、Bitboard構造体にメンバーを追加します。
struct BB { union { u64 p[2]; __m128i m; // integer型とみなすとき __m128 mf; // float型とみなすとき }; };
float型というのを見て、もうピンと来たかも知れませんね。例のアレですね。
そう言えば書き忘れていたのですが、SSE命令を使うとき、16バイト境界にalignしないといけないのですが、__m128iをメンバー変数として持つ構造体の場合、Visual C++は自動的にアライメントを調整してくれるようです。
「自動的に」ということは、この構造体サイズは「自動的に」16の倍数になります。
struct X { __m128i m; char c; }; printf("%d",sizeof X); // 32と表示されるはず。
ところで、スタック上に確保されるときも自動的に行われるのでしょうか?
関数を呼び出すときにスタックポインタを16の倍数になるようにしか動かさなければ可能です。
生成されるコードを調べたところ、どうもそうなっているように見えます。
しかし、関数を呼び出す時にespが16の倍数にして呼び出さなければならないというような呼び出し規約になっているわけではないでしょうから、dllとしてexportした関数はどうなるんだろうと思うのですが。まあ、Visual C++を使って生成したexeとdll間の呼び出しなら大丈夫なんでしょうね…。
つづく