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;