diff options
author | Chris Lattner <sabre@nondot.org> | 2005-08-02 20:21:33 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-08-02 20:21:33 +0000 |
commit | e6ec587059eb142467cc8a5915946a3b308cb9b7 (patch) | |
tree | 19589c2830ac8f1e86e48b1f0bdba42a2b3aaa64 /include/llvm/Support | |
parent | 591083a5c7deeb79e988182285c45bf68b9c68a7 (diff) | |
download | external_llvm-e6ec587059eb142467cc8a5915946a3b308cb9b7.zip external_llvm-e6ec587059eb142467cc8a5915946a3b308cb9b7.tar.gz external_llvm-e6ec587059eb142467cc8a5915946a3b308cb9b7.tar.bz2 |
Fix the non-gcc 4.0 paths for countleadingzeros
Patch fixed by Jim Laskey
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22598 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Support')
-rw-r--r-- | include/llvm/Support/MathExtras.h | 64 |
1 files changed, 35 insertions, 29 deletions
diff --git a/include/llvm/Support/MathExtras.h b/include/llvm/Support/MathExtras.h index d8cdda8..6cd4468 100644 --- a/include/llvm/Support/MathExtras.h +++ b/include/llvm/Support/MathExtras.h @@ -72,36 +72,41 @@ inline bool isPowerOf2_32(unsigned Value) { return Value && !(Value & (Value - 1)); } -// isPowerOf2_64 - This function returns true if the argument is a power of two > 0 -// (64 bit edition.) +// isPowerOf2_64 - This function returns true if the argument is a power of two +// > 0 (64 bit edition.) inline bool isPowerOf2_64(uint64_t Value) { return Value && !(Value & (Value - 1LL)); } +// CountLeadingZeros_32 - this function performs the platform optimal form of +// counting the number of zeros from the most significant bit to the first one +// bit. Ex. CountLeadingZeros_32(0x00F000FF) == 8. +// Returns 32 if the word is zero. // CountLeadingZeros_32 - this function performs the platform optimal form -// of counting the number of zeros from the most significant bit to the first one bit. -// Ex. CountLeadingZeros_32(0x00F000FF) == 8. +// of counting the number of zeros from the most significant bit to the first +// one bit. Ex. CountLeadingZeros_32(0x00F000FF) == 8. // Returns 32 if the word is zero. inline unsigned CountLeadingZeros_32(unsigned Value) { unsigned Count; // result - #if __GNUC__ >= 4 - // PowerPC is defined for __builtin_clz(0) - #if !defined(__ppc__) && !defined(__ppc64__) - if (!Value) return 32; - #endif - Count = __builtin_clz(Value); - #else - if (!Value) return 32; - Count = 0; - // bisecton method for count leading zeros - for (unsigned Shift = 32 >> 1; Shift; Shift >>= 1) { - unsigned Tmp = Value >> Shift; - if (Tmp) { - Count |= Shift; - Value = Tmp; - } +#if __GNUC__ >= 4 + // PowerPC is defined for __builtin_clz(0) +#if !defined(__ppc__) && !defined(__ppc64__) + if (!Value) return 32; +#endif + Count = __builtin_clz(Value); +#else + if (!Value) return 32; + Count = 0; + // bisecton method for count leading zeros + for (unsigned Shift = 32 >> 1; Shift; Shift >>= 1) { + unsigned Tmp = Value >> Shift; + if (Tmp) { + Value = Tmp; + } else { + Count |= Shift; } - #endif + } +#endif return Count; } @@ -111,13 +116,13 @@ inline unsigned CountLeadingZeros_32(unsigned Value) { // Returns 64 if the word is zero. inline unsigned CountLeadingZeros_64(uint64_t Value) { unsigned Count; // result - #if __GNUC__ >= 4 - // PowerPC is defined for __builtin_clzll(0) - #if !defined(__ppc__) && !defined(__ppc64__) - if (!Value) return 64; - #endif - Count = __builtin_clzll(Value); - #else +#if __GNUC__ >= 4 + // PowerPC is defined for __builtin_clzll(0) +#if defined(__ppc__) || defined(__ppc64__) + if (!Value) return 64; +#endif + Count = __builtin_clzll(Value); +#else if (sizeof(long) == sizeof(int64_t)) { if (!Value) return 64; Count = 0; @@ -125,8 +130,9 @@ inline unsigned CountLeadingZeros_64(uint64_t Value) { for (uint64_t Shift = 64 >> 1; Shift; Shift >>= 1) { uint64_t Tmp = Value >> Shift; if (Tmp) { - Count |= Shift; Value = Tmp; + } else { + Count |= Shift; } } } else { |