Everything
11.1.8 ビット操作命令の出力制御 【V1.04以降】

組み込み関数を使用せずにビット操作命令を出力したい場合は,次の条件を全て満たしてください。

(a)

定数値を代入する。

(b)

代入先をnear領域のchar/unsigned char/signed char/_Bool型で1ビット幅のビットフィールドにする。

(c)

代入先をvolatile修飾する。

 

volatile修飾した変数は,上記の条件を満たさない限り,値の代入や読み出しにおいてビット操作命令を出力しません。volatile修飾していない変数は,コンパイラの最適化に従ってビット操作命令を出力します。

volatile struct {
  unsigned char bit0:1;
  unsigned int  bit1:1;
} data;
 
void func(void) {
  data.bit0 = 1; /* ビット操作命令を出力する */
  data.bit1 = 1; /* ビット操作命令を出力しない */
}