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をやりたいわけだ。本当のところ。