参照元†
- int nr
- volatile const unsigned long *addr
- 評価対象の unsigned long 値のポインタ
返り値†
- int
- ビットがセットされている場合 -1、ビットがセットされていない場合 0
static inline int variable_test_bit(int nr, volatile const unsigned long *addr)
{
int oldbit;
asm volatile("bt %2,%1\n\t"
"sbb %0,%0"
: "=r" (oldbit)
: "m" (*(unsigned long *)addr), "Ir" (nr));
- 1行目: bt にて addr の nr ビット目の値が CF にストアされる。
- 2行目: sbb にて %0(oldbit) = %0 - %0 - CF が計算される。
%0 - %0 は当然 0 なので、計算結果は CF のみで決まる。
なぜ sbb 命令かというと、CF フラグを見るための分岐命令を排除するため。
- CF = 1(ビットが 1 だったとき): %0(oldbit) = -1
- CF = 0(ビットが 0 だったとき): %0(oldbit) = 0
- 最近の IA32 アーキテクチャだと sbb 命令は遅いようです。
return oldbit;
}
コメント†