diff options
author | Lennart Poettering <lennart@poettering.net> | 2008-08-29 01:13:50 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2008-08-29 01:13:50 +0200 |
commit | 6723699ef88a570387f88d24b4096da32c39db3f (patch) | |
tree | f540d70a02a5aa9365d20182be53feedca0bb3d3 | |
parent | bb8263be6fbbb227989e8cb4f5dc7dc67216724d (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.h | 36 |
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]); |