C++で整数を100で割ったコードを最適化コンパイルしたら、
タイトルの定数が現れた。
一瞬なにをやってるか分からなかったのだが、
div系の命令を使うと重いので、mulとshiftで整数の割り算をやってしまう時に、
最適化で使う定数らしい。
T / 100 という式があったときに、これは以下のように式変形できる
T * (0.32 / 32) * (pow(2 , 32) / pow(2 , 32))
するとこうできるので
T * (0.32 * pow(2 , 32)) / (32 * pow(2 , 32))
分子の項(0.32 * pow(2 , 32))を定数に置き換えると
T * CONST / 32 * pow( 2 , 32)
分母の32は5回の右シフトに変換し、pow(2 , 32)の除算は、
演算するのではなく、乗算時の結果レジスタの上位レジスタだけ見るようにすればいい
すると以下のようなアセンブラがでてくる
mul T 51EB851F
sar edx 5