_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

あぁ、エピローグ、プロローグのコードが追加されて無駄に長くなりやがった。