从右边找到第一个零位(LSB)

时间:2012-08-31 11:27:31

标签: memory-management bitmap heap bit-manipulation

我正在为我的程序编写一个小的slab分配器,但不是使用带锁定机制的列表,在阅读了IBM关于无锁堆的文章之后,我决定实现类似的东西。然而,哪个GCC内在(ffs / ffz / ctz等...)将是最有效的,为什么?

我最可能的目标是具有CLZ硬件指令的ARMv7和ARMv6处理器。

我想出了像

这样的东西
uint32_t tmp;
uint32_t new_bits;
uint32_t old_bits;

do {
    old_bits = slab->bitmap;
    tmp = <function>(old_bitmap);
    new_bits = old_bits | (1 << tmp);
} while(cpu_atomic_cmpxchg(&slab->bitmap, old_bits, new_bits) != OS_OKAY);

return ((void *) slab->start + (tmp * slab->blksize))

1 个答案:

答案 0 :(得分:2)

如果您有CTZ,则只需反转该值并计算尾随零:

if (x == -1ULL)
    return /* failure? */;
int index = __builtin_ctz(~x);

E.g。

                                      v
 x = 0000 1111 0000 1111 0000 1111 0000 1111
~x = 1111 0000 1111 0000 1111 0000 1111 0000
index = __builtin_ctz(~x) = 4