1 #ifndef OSL_MISC_BITOP_H 
    2 #define OSL_MISC_BITOP_H 
   13   template <
class Integer> 
struct Bsf;
 
   16   struct Bsf<unsigned int>
 
   18     static int bsf(
unsigned int mask)
 
   23       __asm__(
"bsfl %1,%0" : 
"=r"(ret) : 
"r"(mask));
 
   28       __asm__(
"bsfl %1,%0" : 
"=r"(ret) : 
"r"(mask));
 
   30 #  elif defined __GNUC__ 
   31       return __builtin_ctzl(mask);
 
   33       for (
int i=0;i<32;i++)
 
   43   struct Bsf<unsigned short>
 
   45     static unsigned short bsf(
unsigned short mask)
 
   50       __asm__(
"bsfw %1,%0" : 
"=r"(ret) : 
"r"(mask));
 
   55       __asm__(
"bsfw %1,%0" : 
"=r"(ret) : 
"r"(mask));
 
   58       return __builtin_ctzl(mask);
 
   65   struct Bsf<unsigned long long>
 
   67     static int bsf(
unsigned long long mask)
 
   72       __asm__(
"bsfq %1,%0" : 
"=r"(ret) : 
"r"(mask));
 
   73       return static_cast<int>(ret);
 
   75       unsigned int mask32 = 
static_cast<unsigned int>(mask);
 
   78       mask32 = 
static_cast<unsigned int>(mask >> 32);
 
   84   template <
class Integer> 
struct Bsr;
 
   87   struct Bsr<unsigned int>
 
   89     static int bsr(
unsigned int mask)
 
   94       __asm__(
"bsrl %1,%0" : 
"=r"(ret) : 
"r"(mask));
 
   99       __asm__(
"bsrl %1,%0" : 
"=r"(ret) : 
"r"(mask));
 
  102       return __builtin_clzl(mask);
 
  104       for (
int i=31; i>=0; --i)
 
  115   struct Bsr<unsigned long long>
 
  117     static int bsr(
unsigned long long mask)
 
  122       __asm__(
"bsrq %1,%0" : 
"=r"(ret) : 
"r"(mask));
 
  123       return static_cast<int>(ret);
 
  125       unsigned int mask32 = 
static_cast<unsigned int>(mask >> 32);
 
  128       mask32 = 
static_cast<unsigned int>(mask);
 
  136     template <
class Integer>
 
  137     static int bsf(Integer mask)
 
  141     template <
class Integer>
 
  142     static int bsr(Integer mask)
 
  146     template <
class Integer>
 
  149       const int num=
bsf(mask);
 
  154     template <
class Integer>
 
  169     template <
class Integer>
 
  172       return (mask & (mask-1));
 
  177     template <
class Integer>
 
  180       return static_cast<Integer
>(mask & (-mask));
 
  198   inline int countBitDense(
unsigned int mask)
 
  200     mask = ((mask>>1)&0x55555555)+(mask&0x55555555);
 
  201     mask = ((mask>>2)&0x33333333)+(mask&0x33333333);
 
  202     mask = ((mask>>4)+mask)&0xf0f0f0f;
 
  203     mask = (mask>>8)+mask;
 
  204     return ((mask>>16)+mask)&0x3f;