最近在看eCos,对如下一段代码不是很明白
- cyg_uint32 hal_lsbit_index(cyg_uint32 mask)
- {
- cyg_uint32 n = mask;
- static const signed char tab[64] =
- { -1, 0, 1, 12, 2, 6, 0, 13, 3, 0, 7, 0, 0, 0, 0, 14, 10,
- 4, 0, 0, 8, 0, 0, 25, 0, 0, 0, 0, 0, 21, 27 , 15, 31, 11,
- 5, 0, 0, 0, 0, 0, 9, 0, 0, 24, 0, 0 , 20, 26, 30, 0, 0, 0,
- 0, 23, 0, 19, 29, 0, 22, 18, 28, 17, 16, 0
- };
- n &= ~(n-1UL);
- n = (n<<16)-n;
- n = (n<<6)+n;
- n = (n<<4)+n;
- return tab[n>>26];
- }
复制代码
代码位置:hal/mips/arch/hal_misc.c
功能:应该是通过查询mask中最右边的1来得到一个index值,继而通过index来查询run_queue
就是不明白怎么实现的,呵呵,看i386中就一个bsf指令就搞定,这个怎么这么麻烦 |