aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm/Support
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-08-02 20:21:33 +0000
committerChris Lattner <sabre@nondot.org>2005-08-02 20:21:33 +0000
commite6ec587059eb142467cc8a5915946a3b308cb9b7 (patch)
tree19589c2830ac8f1e86e48b1f0bdba42a2b3aaa64 /include/llvm/Support
parent591083a5c7deeb79e988182285c45bf68b9c68a7 (diff)
downloadexternal_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.h64
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 {