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=c89を指定した場合を除きます。

 

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