|
@@ -190,7 +190,8 @@ static __inline__ void set_bits(unsigned long mask, unsigned long *addr)
|
|
|
* Return the zero-based bit position (LE, not IBM bit numbering) of
|
|
|
* the most significant 1-bit in a double word.
|
|
|
*/
|
|
|
-static __inline__ int __ilog2(unsigned long x)
|
|
|
+static __inline__ __attribute__((const))
|
|
|
+int __ilog2(unsigned long x)
|
|
|
{
|
|
|
int lz;
|
|
|
|
|
@@ -198,6 +199,24 @@ static __inline__ int __ilog2(unsigned long x)
|
|
|
return BITS_PER_LONG - 1 - lz;
|
|
|
}
|
|
|
|
|
|
+static inline __attribute__((const))
|
|
|
+int __ilog2_u32(u32 n)
|
|
|
+{
|
|
|
+ int bit;
|
|
|
+ asm ("cntlzw %0,%1" : "=r" (bit) : "r" (n));
|
|
|
+ return 31 - bit;
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef __powerpc64__
|
|
|
+static inline __attribute__((const))
|
|
|
+int __ilog2_u64(u32 n)
|
|
|
+{
|
|
|
+ int bit;
|
|
|
+ asm ("cntlzd %0,%1" : "=r" (bit) : "r" (n));
|
|
|
+ return 63 - bit;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
/*
|
|
|
* Determines the bit position of the least significant 0 bit in the
|
|
|
* specified double word. The returned bit position will be
|