]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: optimize nearest_power
authorJosef 'Jeff' Sipek <jeff.sipek@dovecot.fi>
Wed, 30 Aug 2017 10:51:20 +0000 (13:51 +0300)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Thu, 31 Aug 2017 07:39:25 +0000 (10:39 +0300)
Instead of looping over each bit of a size_t, we can use a closed form
expression.

src/lib/bits.c
src/lib/bits.h

index 7939e0adc2ef6552d971ff256e199b0d4fdd1f56..fda07c8c66eafd016c2355cc3ffdae95c1c711bd 100644 (file)
@@ -2,14 +2,24 @@
 
 #include "lib.h"
 
+/*
+ * We could use bits_required64() unconditionally, but that's unnecessary
+ * and way more heavy weight on 32-bit systems.
+ */
+#ifdef _LP64
+#define BITS_REQUIRED(x)       bits_required64(x)
+#else
+#define BITS_REQUIRED(x)       bits_required32(x)
+#endif
+
 size_t nearest_power(size_t num)
 {
-       size_t n = 1;
-
        i_assert(num <= ((size_t)1 << (CHAR_BIT*sizeof(size_t) - 1)));
 
-       while (n < num) n <<= 1;
-       return n;
+       if (num == 0)
+               return 1;
+
+       return 1UL << BITS_REQUIRED(num - 1);
 }
 
 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
index 5ad6d8cfd78e5bd4e9542d23caa5fa20e13ccf32..9bd5098fb6c23df88ad0a5b056547b7ddaec34d9 100644 (file)
@@ -6,6 +6,7 @@
 
 #define BIT(n) (1u << (n))
 
+/* Returns x, such that x is the smallest power of 2 >= num. */
 size_t nearest_power(size_t num) ATTR_CONST;
 
 /* Returns TRUE if 2^x=num, i.e. if num has only a single bit set to 1. */