2006-11 << 2006-12 >> 2007-01

2006-12-03 (日)

*Visual C++ 2005

Express Editionでも一応,最適化は有効なので,どんなものか試してみる.

それにしても,アレですね.色々やっていると一から真っ当なコンパイラを書いてみたくなる(真っ当でないコンパイラなら何度か書きましたが…).プログラマなら,コンパイラとエディタは一度は書いてみたいものですね.

a = (a<<16) | (a>>16);

VC++2005はちゃんとrol命令を使ってくれます.

VC++6.0
	mov         ecx,eax
	shr         ecx,10h
	shl         eax,10h
	or          ecx,eax

VC++2005
	rol         ecx,10h

以前に,何でrol命令使ってくれないんだよ,と思いながらインラインアセンブラで書いた経験があったけど,もう大丈夫.

b = fact(4);

factは同じソース中にある階乗を計算する関数.(pushしてるのは,値が捨てられないように別の関数に渡すため)

VC++6.0
	push        4
	call        00401000
	push        eax

VC++2005
	push        18h

再帰でも非再帰でもfact(10)くらいまでは展開してくれます.ついでに再帰関数をfact(100)とかしても,非再帰のコードが出力されてます.

どうも,非再帰だとfact(10)までで,再帰を使うとfact(11)まで展開してくれる.再帰関数を非再帰関数に変換した時点で,ループの回数が一回少なくなっているようなので,それが原因っぽい.場合によっては再帰関数の方が速いコードが出来上がるのか.

c = sqrt(4.0);

まだ検証中.浮動小数点数の計算は定数に置き換えてくれない?

VC++6.0/VC++2005
fld         qword ptr ds:[4090D0h]
fsqrt

VC++2005(?)
fld         qword ptr [__real@4010000000000000 (402148h)]
call        _CIsqrt (401AF0h)

あれ?fsqrt命令使わない場合がある?何でだろうか.常に使わないわけではなくて,場合によって使わないことがあるみたいです.

2006-11 << 2006-12 >> 2007-01