chiark / gitweb /
journal: u64log2 can be expressed just as __builtin_clzll(n) ^ 63U
authorCristian Rodríguez <crrodriguez@opensuse.org>
Thu, 4 Apr 2013 23:09:50 +0000 (20:09 -0300)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 5 Apr 2013 04:17:35 +0000 (00:17 -0400)
src/journal/journald-rate-limit.c
src/shared/util.h
src/test/test-util.c

index 8bd6847..da3aed6 100644 (file)
@@ -170,21 +170,6 @@ fail:
         return NULL;
 }
 
-static uint64_t u64log2(uint64_t n) {
-        unsigned r;
-
-        if (n <= 1)
-                return 0;
-
-        r = 0;
-        for (;;) {
-                n = n >> 1;
-                if (!n)
-                        return r;
-                r++;
-        }
-}
-
 static unsigned burst_modulate(unsigned burst, uint64_t available) {
         unsigned k;
 
index 69a4765..7c3da08 100644 (file)
@@ -635,3 +635,7 @@ static inline void _reset_umask_(struct umask_struct *s) {
         for (__attribute__((cleanup(_reset_umask_))) struct umask_struct _saved_umask_ = { umask(mask), false }; \
              !_saved_umask_.quit ;                                      \
              _saved_umask_.quit = true)
+
+static inline unsigned u64log2(uint64_t n) {
+        return (n > 1) ? __builtin_clzll(n) ^ 63U : 0;
+}
index 08310c8..eaf7e22 100644 (file)
@@ -338,6 +338,16 @@ static void test_hostname_is_valid(void) {
         assert(!hostname_is_valid("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"));
 }
 
+static void test_u64log2(void) {
+        assert(u64log2(0) == 0);
+        assert(u64log2(8) == 3);
+        assert(u64log2(9) == 3);
+        assert(u64log2(15) == 3);
+        assert(u64log2(16) == 4);
+        assert(u64log2(1024*1024) == 20);
+        assert(u64log2(1024*1024+5) == 20);
+}
+
 int main(int argc, char *argv[]) {
         test_streq_ptr();
         test_first_word();
@@ -363,6 +373,7 @@ int main(int argc, char *argv[]) {
         test_memdup_multiply();
         test_bus_path_escape();
         test_hostname_is_valid();
+        test_u64log2();
 
         return 0;
 }