summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2008-08-29 01:13:50 +0200
committerLennart Poettering <lennart@poettering.net>2008-08-29 01:13:50 +0200
commit6723699ef88a570387f88d24b4096da32c39db3f (patch)
treef540d70a02a5aa9365d20182be53feedca0bb3d3
parentbb8263be6fbbb227989e8cb4f5dc7dc67216724d (diff)
rework pa_ulog2 and base it on __builtin_clz if available, make pa_make_power_of_two based on it
-rw-r--r--src/pulsecore/core-util.h36
1 files changed, 21 insertions, 15 deletions
diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h
index 7167972b..c9e307f5 100644
--- a/src/pulsecore/core-util.h
+++ b/src/pulsecore/core-util.h
@@ -142,29 +142,35 @@ static inline int pa_is_power_of_two(unsigned n) {
return !(n & (n - 1));
}
-static inline unsigned pa_make_power_of_two(unsigned n) {
- unsigned j = n;
+static inline unsigned pa_ulog2(unsigned n) {
- if (pa_is_power_of_two(n))
- return n;
+ if (n <= 1)
+ return 0;
- while (j) {
- j = j >> 1;
- n = n | j;
- }
+#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+ return 8U * (unsigned) sizeof(unsigned) - (unsigned) __builtin_clz(n) - 1;
+#else
+{
+ unsigned r = 0;
- return n + 1;
-}
+ for (;;) {
+ n = n >> 1;
-static inline unsigned pa_ulog2(unsigned n) {
- unsigned r = 0;
+ if (!n)
+ return r;
- while (n) {
r++;
- n = n >> 1;
}
+}
+#endif
+}
+
+static inline unsigned pa_make_power_of_two(unsigned n) {
+
+ if (pa_is_power_of_two(n))
+ return n;
- return r;
+ return 1U << (pa_ulog2(n) + 1);
}
void pa_close_pipe(int fds[2]);