- 追加された行はこの色です。
- 削除された行はこの色です。
*参照元 [#lb6f0e91]
#backlinks
*説明 [#ff8c41b0]
-パス: [[linux-2.6.33/arch/x86/include/asm/bitops.h]]
-指定されたビット位置の値をテストする。
--ビット位置が可変(変数など)の場合に使用する。
**引数 [#fb4980d7]
-
--
**返り値 [#lcee7600]
-
--
**参考 [#hf705d6a]
*実装 [#m69a8723]
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 アーキテクチャだと遅いようですので、
分岐命令を排除するために流行ったハックとなっています。
--[[http://download.intel.com/jp/developer/jpdoc/ia32.pdf]]
return oldbit;
}
*コメント [#z5166ed3]