_mm_cvttss_si32
かといって、過度に_asmしちゃうと、他の部分の最適化を妨害するわけで、それはやりたくない。と思って、いろいろ眺めていると、xmmintrin.hの組み込み関数の中に、_mm_cvttss_si32という奴がいることに気づいた。こいつは、SSEのcvttss2siの組み込み関数版で、float -> intの変換そのものだ。組み込み関数はほとんどインラインアセンブラなんだが、コンパイラの最適化を妨害しないという意味では心強い。
ということで、試しに、
int main(int argc, char* argv[]) { float f = atof(argv[1]); return _mm_cvttss_si32(_mm_set_ss(f)); }
というコードを書いてみる。
push ebp mov ebp, esp and esp, -16 sub esp, 16 mov eax, DWORD PTR _argv$[ebp] mov eax, DWORD PTR [eax+4] push eax call _atof fstp DWORD PTR _f$[esp+20] movss xmm1, DWORD PTR _f$[esp+20] xorps xmm0, xmm0 movss xmm0, xmm1 add esp, 4 cvttss2si eax, xmm0 mov esp, ebp pop ebp ret 0
あぁ、エピローグ、プロローグのコードが追加されて無駄に長くなりやがった。