float -> int キャスト

Visual C++では一般的に、

int main(int argc, char* argv[])
{
  float f = atof(argv[1]);
  return (int)f;
}

といった類の命令は遅いとされているが、実は、VC8では、この処理が高速化されたらしい。
ということで、VC8で、/Oxでビルドしてみた結果のコードが以下の通り。

  mov    eax, DWORD PTR _argv$[esp-4]
  mov    ecx, DWORD PTR [eax+4]
  push   ecx
  call   _atof
  fstp   DWORD PTR tv128[esp]
  fld    DWORD PTR tv128[esp]
  add    esp, 4
  jmp    __ftol2_sse

えぇぇぇ、なんで、fstpとか、fldがあるんだろう?とか思ったので、floatではなく、doubleにしてみると、

  mov    eax, DWORD PTR _argv$[esp-4]
  mov    ecx, DWORD PTR [eax+4]
  push   ecx
  call   _atof
  add    esp, 4
  jmp    __ftol2_sse

という具合にマトモなコードになりました。
しかしながら、結局、__ftol2_sseという関数が呼ばれていることが非常に気になる。
もはや、SSEの存在は前提になっているという事実は置いておいて、中の実装はおおむね予想が付くのだけれども、もっと速くなるだろう。このコードは。

いずれにしても、float -> intをやりたいわけだ。本当のところ。