LoginSignup
37
32

More than 5 years have passed since last update.

51EB851F

Posted at

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

37
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
32