[Ocfs2-tools-commits] mfasheh commits r630 - trunk/libocfs2
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Mon Feb 7 19:55:01 CST 2005
Author: mfasheh
Date: 2005-02-07 19:54:59 -0600 (Mon, 07 Feb 2005)
New Revision: 630
Modified:
trunk/libocfs2/bitops.c
Log:
* commit some ppc fixes by Sunil Mushran
Modified: trunk/libocfs2/bitops.c
===================================================================
--- trunk/libocfs2/bitops.c 2005-02-02 23:00:41 UTC (rev 629)
+++ trunk/libocfs2/bitops.c 2005-02-08 01:54:59 UTC (rev 630)
@@ -43,8 +43,19 @@
* systems, as well as non-32 bit systems.
*/
+#ifdef __powerpc__
int ocfs2_set_bit(int nr,void * addr)
{
+ unsigned long mask = 1 << (nr & 0x1f);
+ unsigned long *p = ((unsigned long *)addr) + (nr >> 5);
+ unsigned long old = *p;
+
+ *p = old | mask;
+ return (old & mask) != 0;
+}
+#else
+int ocfs2_set_bit(int nr,void * addr)
+{
int mask, retval;
unsigned char *ADDR = (unsigned char *) addr;
@@ -54,9 +65,21 @@
*ADDR |= mask;
return retval;
}
+#endif
+#ifdef __powerpc__
int ocfs2_clear_bit(int nr, void * addr)
{
+ unsigned long mask = 1 << (nr & 0x1f);
+ unsigned long *p = ((unsigned long *)addr) + (nr >> 5);
+ unsigned long old = *p;
+
+ *p = old & ~mask;
+ return (old & mask) != 0;
+}
+#else
+int ocfs2_clear_bit(int nr, void * addr)
+{
int mask, retval;
unsigned char *ADDR = (unsigned char *) addr;
@@ -66,9 +89,18 @@
*ADDR &= ~mask;
return retval;
}
+#endif
+#ifdef __powerpc__
int ocfs2_test_bit(int nr, const void * addr)
{
+ const unsigned int *p = (const unsigned int *) addr;
+
+ return ((p[nr >> 5] >> (nr & 0x1f)) & 1) != 0;
+}
+#else
+int ocfs2_test_bit(int nr, const void * addr)
+{
int mask;
const unsigned char *ADDR = (const unsigned char *) addr;
@@ -76,12 +108,35 @@
mask = 1 << (nr & 0x07);
return ((mask & *ADDR) != 0);
}
+#endif
#endif /* !_OCFS2_HAVE_ASM_BITOPS_ */
#if !defined(_OCFS2_HAVE_ASM_FINDBIT_)
#include <strings.h>
+#ifdef __powerpc__
+static inline int __ilog2(unsigned long x)
+{
+ int lz;
+
+ asm ("cntlzw %0,%1" : "=r" (lz) : "r" (x));
+ return 31 - lz;
+}
+
+static inline int ffz(unsigned int x)
+{
+ if ((x = ~x) == 0)
+ return 32;
+ return __ilog2(x & -x);
+}
+
+static inline int __ffs(unsigned long x)
+{
+ return __ilog2(x & -x);
+}
+#endif /* __powerpc__ */
+
int ocfs2_find_first_bit_set(void *addr, int size)
{
return ocfs2_find_next_bit_set(addr, size, 0);
@@ -92,8 +147,47 @@
return ocfs2_find_next_bit_clear(addr, size, 0);
}
+#ifdef __powerpc__
int ocfs2_find_next_bit_set(void *addr, int size, int offset)
{
+ unsigned int *p = ((unsigned int *) addr) + (offset >> 5);
+ unsigned int result = offset & ~31UL;
+ unsigned int tmp;
+
+ if (offset >= size)
+ return size;
+ size -= result;
+ offset &= 31UL;
+ if (offset) {
+ tmp = *p++;
+ tmp &= ~0UL << offset;
+ if (size < 32)
+ goto found_first;
+ if (tmp)
+ goto found_middle;
+ size -= 32;
+ result += 32;
+ }
+ while (size >= 32) {
+ if ((tmp = *p++) != 0)
+ goto found_middle;
+ result += 32;
+ size -= 32;
+ }
+ if (!size)
+ return result;
+ tmp = *p;
+
+found_first:
+ tmp &= ~0UL >> (32 - size);
+ if (tmp == 0UL) /* Are any bits set? */
+ return result + size; /* Nope. */
+found_middle:
+ return result + __ffs(tmp);
+}
+#else
+int ocfs2_find_next_bit_set(void *addr, int size, int offset)
+{
unsigned char * p;
int set = 0, d0;
unsigned int bit = offset & 7, res = 0;
@@ -129,9 +223,48 @@
return (res + d0 - 1);
}
+#endif /* __powerpc__ */
+#ifdef __powerpc__
int ocfs2_find_next_bit_clear(void *addr, int size, int offset)
{
+ unsigned int * p = ((unsigned int *) addr) + (offset >> 5);
+ unsigned int result = offset & ~31UL;
+ unsigned int tmp;
+
+ if (offset >= size)
+ return size;
+ size -= result;
+ offset &= 31UL;
+ if (offset) {
+ tmp = *p++;
+ tmp |= ~0UL >> (32-offset);
+ if (size < 32)
+ goto found_first;
+ if (tmp != ~0U)
+ goto found_middle;
+ size -= 32;
+ result += 32;
+ }
+ while (size >= 32) {
+ if ((tmp = *p++) != ~0U)
+ goto found_middle;
+ result += 32;
+ size -= 32;
+ }
+ if (!size)
+ return result;
+ tmp = *p;
+found_first:
+ tmp |= ~0UL << size;
+ if (tmp == ~0UL) /* Are any bits zero? */
+ return result + size; /* Nope. */
+found_middle:
+ return result + ffz(tmp);
+}
+#else
+int ocfs2_find_next_bit_clear(void *addr, int size, int offset)
+{
unsigned char * p;
int set = 0, d0;
unsigned int bit = offset & 7, res = 0;
@@ -166,6 +299,8 @@
return (res + d0 - 1);
}
+#endif /* __powerpc__ */
+
#endif
More information about the Ocfs2-tools-commits
mailing list