参照元†
返り値†
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;
}
コメント†