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以前のコンパイラでは上記の組み込み関数をサポートしていません。メモリアクセスを伴うビット操作命令が出力されたかどうかは、コンパイラが出力するアセンブリ・ソースからご確認ください。