Use GCC builtins for bsr/bsf where available.

This commit is contained in:
Asher Baker 2014-11-09 04:15:49 +00:00
parent 7609d19e32
commit 686cf9c5ba

View File

@ -179,7 +179,7 @@ Log2(size_t number)
{ {
assert(number != 0); assert(number != 0);
#ifdef _MSC_VER #if defined _MSC_VER
unsigned long rval; unsigned long rval;
# ifdef _M_IX86 # ifdef _M_IX86
_BitScanReverse(&rval, number); _BitScanReverse(&rval, number);
@ -187,6 +187,8 @@ Log2(size_t number)
_BitScanReverse64(&rval, number); _BitScanReverse64(&rval, number);
# endif # endif
return rval; return rval;
#elif defined __GNUC__
return 31 - __builtin_clz(number);
#else #else
size_t bit; size_t bit;
asm("bsr %1, %0\n" asm("bsr %1, %0\n"
@ -201,7 +203,7 @@ FindRightmostBit(size_t number)
{ {
assert(number != 0); assert(number != 0);
#ifdef _MSC_VER #if defined _MSC_VER
unsigned long rval; unsigned long rval;
# ifdef _M_IX86 # ifdef _M_IX86
_BitScanForward(&rval, number); _BitScanForward(&rval, number);
@ -209,6 +211,8 @@ FindRightmostBit(size_t number)
_BitScanForward64(&rval, number); _BitScanForward64(&rval, number);
# endif # endif
return rval; return rval;
#elif defined __GNUC__
return __builtin_ctz(number);
#else #else
size_t bit; size_t bit;
asm("bsf %1, %0\n" asm("bsf %1, %0\n"