参照元†
返り値†
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 のみで決まる。
- CF = 1(ビットが 1 だったとき): %0(oldbit) = -1
- CF = 0(ビットが 0 だったとき): %0(oldbit) = 0
 
- sbb 命令は最近の IA アーキテクチャだと遅いようですので、
分岐命令を排除するために流行ったハックとなっています。
	return oldbit;
}
コメント†