2017-06-12 2 views
-3

私が保守しているコードは、多くの場所で以下のタイプの行を持っています。gcc定数を使ったビット演算を伴うコードの最適化

x = x | ((0x1 & 0x3ff) << 16); 
x |= (0x7 << 28); 
y = y | (0x3 << 8); 

コードを-O3フラグでコンパイルします。 最適化中のコンパイラ(gcc)は定数を含むビット操作を簡略化して最適化しますか?

1行目では、それはそれは

y = y | 0x300;

の代わりに、実際のビットシフトを行うための命令の追加を行う必要があります

x = x | 0x3ff0000;

または3行目に行う必要があります。

+1

はい、これらの定数式は、プリコンパイラの段階で展開されます。しかし '((0x1&0x3ff)<< 16)'は '0x3ff0000'ではなく' 0x10000'です。 –

+0

... '-O3'や' -O'fwiwがなくてもそうなります。 – spectras

+0

アセンブリコードを見てみませんか? – Olaf

答えて

2

あなたの表現で&と< <演算子のすべてのオペランドが整数定数であるので、それらのサブ式は整数定数式ですと、コンパイル時に評価されます。

半二重コンパイラは、最適化レベルに関係なく、これらの式をマシンコードのハードコード定数で置き換えます。

関連する問題