Everything
11.5.4 V2.06以降【V2.05以前からの変更点】

(1)

メモリアクセスを伴うビット操作命令の出力を制御する方法の導入

V2.05以前のコンパイラでは、組み込み関数を除いて、ユーザがコンパイラに必ずメモリアクセスを伴うビット操作命令を出力させる方法はありませんでした。

V2.06では、組み込み関数を使用しなくてもユーザがメモリアクセスを伴うビット操作命令を出力する/しないを制御できるように、コンパイラを改修しました。

 

組み込み関数を使用せずに、コンパイラにメモリアクセスを伴うビット操作命令を必ず出力させる場合は、次の条件をすべて満たすソース・プログラムを記述してください。

(a) 定数値を代入する

(b) 代入先を1バイト型で1ビット幅のビットフィールドにする

(c) 代入先をvolatile 修飾する

 

また、コンパイラにメモリアクセスを伴うビット操作命令を出力させない場合は、上記の(c)を満たしたうえで、(a)の代入値を定数値以外にするか、または(b)の型を1バイト型以外の型にしてください。

 

上記のいずれにも該当しない場合、メモリアクセスを伴うビット操作命令を出力するかどうかは、最適化レベルやソース・プログラムの記述内容によってコンパイラが判断します。

 

注意

1バイト型は、(char/unsigned char/signed char/_Bool/bool)を指します。ただし、_Bool/boolは-lang=cを指定した場合を除きます。

 

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