Skip to contentSkip to conversation

rounddown_pow_of_2 inclusion into log2.h

KJ vignesh babu 1 participant 1 message Aug 14, 2007 Kernel janitors

lore
Share & tools
lore
#0 lore raw

rday,

Any plans on including what Andrew Morton suggested in the near
future?
Think you have had enough time to convince yourself ;)

(Sorry, had put kj in bcc in prev mail by mistake)

Vignesh

Quoted 13 lines · Andrew Morton

Review

Quoted 8 lines · On Thu, 25 Jan 2007 04:32:12 -0500 (EST) "Robert P. J. Day"…
(quoted diff) +8 -0
+/*
+ * round down to nearest power of two
+ */
+static inline __attribute__((const))
+unsigned long __rounddown_pow_of_two(unsigned long n)
+{
+   return 1UL << (fls_long(n) - 1);
+}

So __rounddown_pow_of_two(16) returns 8?

it does? but if that was true, so would 17, and 18, and 19 ... i didn't actually test this since it seemed so straightforward. doesn't fls_long() return the most significant bit? oh, wait ... reading further ...

Quoted 5 lines

Review unsigned long __roundup_pow_of_two(unsigned

Quoted 5 lines

/**
* ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value
* @n - parameter

(quoted diff) +0 -0
@@ -154,4 +174,20 @@ unsigned long __roundup_pow_of_two(unsigned

long n)

Quoted 5 lines

Review unsigned long __roundup_pow_of_two(unsigned · line 178

Quoted 5 lines
(quoted diff) +2 -0
    __roundup_pow_of_two(n)                 \
  )
 
+/**
+ * rounddown_pow_of_two - round the given value down to nearest

power of two

Quoted 5 lines

Review unsigned long __roundup_pow_of_two(unsigned · line 183

Quoted 5 lines
(quoted diff) +5 -0
+ * @n - parameter
+ *
+ * round the given value down to the nearest power of two
+ * - the result is undefined when n = 0
+ * - this can be used to initialise global variables from constant

data

Quoted 12 lines

Review unsigned long __roundup_pow_of_two(unsigned · line 191

Quoted 8 lines
(quoted diff) +8 -0
+ */
+#define rounddown_pow_of_two(n)                    \
+(                                          \
+   __builtin_constant_p(n) ? (             \
+           (n = 1) ? 0 :                  \
+           (1UL << ilog2(n)) :             \
+   __rounddown_pow_of_two(n)               \
+ )

But (1UL << ilog2(16)) returns 16?

Quoted 1 line

And, afiact, your __rounddown_pow_of_two() is basically equivalent to

(1UL

Quoted 1 line

<< ilog2(n)) anyway. So a suitable (and less buggy) implementation

might be

Quoted 5 lines

static inline unsigned long rounddown_pow_of_two(unsigned long n)

{
      return (n = 1) ? 0 : (1UL << ilog2(n));
}

i think you're right. it's been a long day so give me a few minutes to convince myself.

rday

Signature · 17 lines
====================================
Robert P. J. Day
Linux Consulting, Training and Annoying Kernel Pedantry
Waterloo, Ontario, CANADA
-- 
Vignesh Babu BM 
_____________________________________________________________ 
"Why is it that every time I'm with you, makes me believe in magic?"

_______________________________________________
REMINDER: this mailing list moved to vger.kernel.org and current one will be discontinued soon.
To resubscribe, send email to [email protected] with
&quot;subscribe kernel-janitors&quot; in message body and follow instructions.

Kernel-janitors mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/kernel-janitors