cvttss2si

仕方がないので、アセンブラにご登場いただくことに。

int f2i(float f)
{
  _asm {cvttss2si eax, f}
}

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

そうすると、意外にもコンパクトなコードが生成されました。

  mov    eax, DWORD PTR _argv$[esp-4]
  mov    ecx, DWORD PTR [eax+4]
  push   ecx
  call   _atof
  fstp   DWORD PTR _f$[esp]
  add    esp, 4
  cvttss2si eax, DWORD PTR _f$[esp-4]
  ret    0

実は、この間に、declspec(naked)版も作成したんですが、そうすると、VC8は余計なcallを追加してくれたのでそれは却下。