V2.05以前のコンパイラでは、組み込み関数を除いて、ユーザがコンパイラに必ずビット操作命令を出力させる方法はありませんでした。
V2.06では、組み込み関数を使用しなくてもユーザがビット操作命令を出力する/しないを制御できるように、コンパイラを改修しました。
組み込み関数を使用せずに、コンパイラにビット操作命令を必ず出力させる場合は、次の条件をすべて満たすソース・プログラムを記述してください。
(b) 代入先を1バイト型で1ビット幅のビットフィールドにする
また、コンパイラにビット操作命令を出力させない場合は、上記の(c)を満たしたうえで、(a)の代入値を定数値以外にするか、または(b)の型を1バイト型以外の型にしてください。
上記のいずれにも該当しない場合、ビット操作命令を出力するかどうかは、最適化レベルやソース・プログラムの記述内容によってコンパイラが判断します。
volatile struct { unsigned char bit0:1; unsigned int bit1:1; } data; void func(void) { data.bit0 = 1; /* ビット操作命令を出力する */ data.bit1 = 1; /* ビット操作命令を出力しない */ } |
なお、V2.05でビット操作命令を必ず出力させる場合は、組み込み関数__bclr()/__bset()/__bnot()を使用してください。組み込み関数を使用しない場合、ビット操作命令を出力するかどうかは、最適化レベルやソース・プログラムの記述内容によってコンパイラが判断します。
また、V2.04以前のコンパイラでは上記の組み込み関数をサポートしていません。ビット操作命令が出力されたかどうかは、コンパイラが出力するアセンブリ・ソースからご確認ください。