330 _BitScanReverse(&count, value);
332#elif defined(__GNUC__)
342 return __builtin_clz(value) ^ 31;
346 static unsigned char TOMMY_DE_BRUIJN_INDEX_ILOG2[32] = {
347 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
348 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
355 value |= value >> 16;
357 return TOMMY_DE_BRUIJN_INDEX_ILOG2[(
tommy_uint32_t)(value * 0x07C4ACDDU) >> 27];
373 _BitScanForward(&count, value);
375#elif defined(__GNUC__)
376 return __builtin_ctz(value);
380 static const unsigned char TOMMY_DE_BRUIJN_INDEX_CTZ[32] = {
381 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
382 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
385 return TOMMY_DE_BRUIJN_INDEX_CTZ[(
tommy_uint32_t)(((value & - value) * 0x077CB531U)) >> 27];