ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/gclib/gclib/GBase.h
(Generate patch)
# Line 185 | Line 185
185   rhs=tmp;
186   }
187  
188 /// bitCount_32 - this function counts the number of set bits in a value.
189 /// Ex. CountPopulation(0xF000F000) = 8
190 /// Returns 0 if the word is zero.
191 inline uint bitCount_32(uint32_t Value) {
192 #if __GNUC__ >= 4
193    return __builtin_popcount(Value);
194 #else
195    uint32_t v = Value - ((Value >> 1) & 0x55555555);
196    v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
197    return ((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;
198 #endif
199  }
200
201 /// bitCount_64 - this function counts the number of set bits in a value,
202 /// (64 bit edition.)
203 inline uint bitCount_64(uint64_t Value) {
204 #if __GNUC__ >= 4
205    return __builtin_popcountll(Value);
206 #else
207    uint64_t v = Value - ((Value >> 1) & 0x5555555555555555ULL);
208    v = (v & 0x3333333333333333ULL) + ((v >> 2) & 0x3333333333333333ULL);
209    v = (v + (v >> 4)) & 0x0F0F0F0F0F0F0F0FULL;
210    return uint((uint64_t)(v * 0x0101010101010101ULL) >> 56);
211 #endif
212  }
213
214 /// CountTrailingZeros_32 - this function performs the platform optimal form of
215 /// counting the number of zeros from the least significant bit to the first one
216 /// bit.  Ex. CountTrailingZeros_32(0xFF00FF00) == 8.
217 /// Returns 32 if the word is zero.
218 inline unsigned bitCountTrailingZeros_32(uint32_t Value) {
219 #if __GNUC__ >= 4
220  return Value ? __builtin_ctz(Value) : 32;
221 #else
222  static const unsigned Mod37BitPosition[] = {
223    32, 0, 1, 26, 2, 23, 27, 0, 3, 16, 24, 30, 28, 11, 0, 13,
224    4, 7, 17, 0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9,
225    5, 20, 8, 19, 18
226  };
227  return Mod37BitPosition[(-Value & Value) % 37];
228 #endif
229 }
230
231 // CountTrailingZeros_64 - This function performs the platform optimal form
232 /// of counting the number of zeros from the least significant bit to the first
233 /// one bit (64 bit edition.)
234 /// Returns 64 if the word is zero.
235 inline unsigned bitCountTrailingZeros_64(uint64_t Value) {
236 #if __GNUC__ >= 4
237  return Value ? __builtin_ctzll(Value) : 64;
238 #else
239  static const unsigned Mod67Position[] = {
240    64, 0, 1, 39, 2, 15, 40, 23, 3, 12, 16, 59, 41, 19, 24, 54,
241    4, 64, 13, 10, 17, 62, 60, 28, 42, 30, 20, 51, 25, 44, 55,
242    47, 5, 32, 65, 38, 14, 22, 11, 58, 18, 53, 63, 9, 61, 27,
243    29, 50, 43, 46, 31, 37, 21, 57, 52, 8, 26, 49, 45, 36, 56,
244    7, 48, 35, 6, 34, 33, 0
245  };
246  return Mod67Position[(-Value & Value) % 67];
247 #endif
248 }
188  
189   /**************** Memory management ***************************/
190  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines