*参照元 [#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]


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS