[Ocfs2-tools-commits] manish commits r860 - trunk/libocfs2
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Thu Apr 28 16:51:44 CDT 2005
Author: manish
Date: 2005-04-28 16:51:43 -0500 (Thu, 28 Apr 2005)
New Revision: 860
Modified:
trunk/libocfs2/bitops.c
Log:
Implement bitops ugliness for s390 as well
Modified: trunk/libocfs2/bitops.c
===================================================================
--- trunk/libocfs2/bitops.c 2005-04-28 21:02:16 UTC (rev 859)
+++ trunk/libocfs2/bitops.c 2005-04-28 21:51:43 UTC (rev 860)
@@ -31,6 +31,12 @@
#include "bitops.h"
+/*
+ * XXX: We're not endian safe at all, and have just hacked in big endian
+ * bitops for the arches we want to test on (ppc32 and s390x userland).
+ * Post-1.0, we have to revisit this.
+ */
+
#ifndef _OCFS2_HAVE_ASM_BITOPS_
/*
@@ -43,7 +49,7 @@
* systems, as well as non-32 bit systems.
*/
-#ifdef __powerpc__
+#if defined(__powerpc__)
int ocfs2_set_bit(int nr,void * addr)
{
unsigned long mask = 1 << (nr & 0x1f);
@@ -53,6 +59,16 @@
*p = old | mask;
return (old & mask) != 0;
}
+#elif defined(__s390x__)
+int ocfs2_set_bit(int nr,void * addr)
+{
+ unsigned long mask = 1UL << (nr & 0x3f);
+ unsigned long *p = ((unsigned long *)addr) + (nr >> 6);
+ unsigned long old = *p;
+
+ *p = old | mask;
+ return (old & mask) != 0;
+}
#else
int ocfs2_set_bit(int nr,void * addr)
{
@@ -67,7 +83,7 @@
}
#endif
-#ifdef __powerpc__
+#if defined(__powerpc__)
int ocfs2_clear_bit(int nr, void * addr)
{
unsigned long mask = 1 << (nr & 0x1f);
@@ -77,6 +93,16 @@
*p = old & ~mask;
return (old & mask) != 0;
}
+#elif defined(__s390x__)
+int ocfs2_clear_bit(int nr, void * addr)
+{
+ unsigned long mask = 1UL << (nr & 0x3f);
+ unsigned long *p = ((unsigned long *)addr) + (nr >> 6);
+ unsigned long old = *p;
+
+ *p = old & ~mask;
+ return (old & mask) != 0;
+}
#else
int ocfs2_clear_bit(int nr, void * addr)
{
@@ -91,13 +117,20 @@
}
#endif
-#ifdef __powerpc__
+#if defined(__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;
}
+#elif defined(__s390x__)
+int ocfs2_test_bit(int nr, const void * addr)
+{
+ const unsigned long *p = (const unsigned long *) addr;
+
+ return ((p[nr >> 6] >> (nr & 0x3f)) & 1UL) != 0;
+}
#else
int ocfs2_test_bit(int nr, const void * addr)
{
@@ -115,7 +148,7 @@
#if !defined(_OCFS2_HAVE_ASM_FINDBIT_)
#include <strings.h>
-#ifdef __powerpc__
+#if defined(__powerpc__)
static inline int __ilog2(unsigned long x)
{
int lz;
@@ -123,20 +156,97 @@
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);
+ return __ilog2(x & -x);
}
-#endif /* __powerpc__ */
+#elif defined(__s390x__)
+static const char const _zb_findmap[] = {
+ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
+ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,
+ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
+ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,
+ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
+ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,
+ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
+ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,
+ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
+ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,
+ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
+ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,
+ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
+ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,
+ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
+ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,8
+};
+
+static const char const _sb_findmap[] = {
+ 8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+ 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+ 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+ 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+ 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+ 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+ 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+ 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+ 7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+ 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+ 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+ 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+ 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+ 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+ 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+ 4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
+};
+
+static inline int ffz(unsigned long word)
+{
+ int bit = 0;
+
+ if ((word & 0xffffffff) == 0xffffffff) {
+ word >>= 32;
+ bit += 32;
+ }
+ if ((word & 0xffff) == 0xffff) {
+ word >>= 16;
+ bit += 16;
+ }
+ if ((word & 0xff) == 0xff) {
+ word >>= 8;
+ bit += 8;
+ }
+ return bit + _zb_findmap[word & 0xff];
+}
+
+static inline int __ffs(unsigned long word)
+{
+ int bit = 0;
+
+ if ((word & 0xffffffff) == 0) {
+ word >>= 32;
+ bit += 32;
+ }
+ if ((word & 0xffff) == 0) {
+ word >>= 16;
+ bit += 16;
+ }
+ if ((word & 0xff) == 0) {
+ word >>= 8;
+ bit += 8;
+ }
+ return bit + _sb_findmap[word & 0xff];
+}
+#endif
+
int ocfs2_find_first_bit_set(void *addr, int size)
{
return ocfs2_find_next_bit_set(addr, size, 0);
@@ -147,7 +257,7 @@
return ocfs2_find_next_bit_clear(addr, size, 0);
}
-#ifdef __powerpc__
+#if defined(__powerpc__)
int ocfs2_find_next_bit_set(void *addr, int size, int offset)
{
unsigned int *p = ((unsigned int *) addr) + (offset >> 5);
@@ -185,6 +295,44 @@
found_middle:
return result + __ffs(tmp);
}
+#elif defined(__s390x__)
+int ocfs2_find_next_bit_set(void *addr, int size, int offset)
+{
+ unsigned long *p = ((unsigned long *) addr) + (offset >> 6);
+ unsigned long result = offset & ~63UL;
+ unsigned long tmp;
+
+ if (offset >= size)
+ return size;
+ size -= result;
+ offset &= 63UL;
+ if (offset) {
+ tmp = *p++;
+ tmp &= ~0UL << offset;
+ if (size < 64)
+ goto found_first;
+ if (tmp)
+ goto found_middle;
+ size -= 64;
+ result += 64;
+ }
+ while (size & ~63UL) {
+ if ((tmp = *p++) != 0)
+ goto found_middle;
+ result += 64;
+ size -= 64;
+ }
+ if (!size)
+ return result;
+ tmp = *p;
+
+found_first:
+ tmp &= ~0UL >> (64 - 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)
{
@@ -223,9 +371,9 @@
return (res + d0 - 1);
}
-#endif /* __powerpc__ */
+#endif
-#ifdef __powerpc__
+#if defined(__powerpc__)
int ocfs2_find_next_bit_clear(void *addr, int size, int offset)
{
unsigned int * p = ((unsigned int *) addr) + (offset >> 5);
@@ -262,6 +410,43 @@
found_middle:
return result + ffz(tmp);
}
+#elif defined(__s390x__)
+int ocfs2_find_next_bit_clear(void *addr, int size, int offset)
+{
+ unsigned long * p = ((unsigned long *) addr) + (offset >> 6);
+ unsigned long result = offset & ~63UL;
+ unsigned long tmp;
+
+ if (offset >= size)
+ return size;
+ size -= result;
+ offset &= 63UL;
+ if (offset) {
+ tmp = *p++;
+ tmp |= ~0UL >> (64-offset);
+ if (size < 64)
+ goto found_first;
+ if (~tmp)
+ goto found_middle;
+ size -= 64;
+ result += 64;
+ }
+ while (size & ~63UL) {
+ if (~(tmp = *p++))
+ goto found_middle;
+ result += 64;
+ size -= 64;
+ }
+ 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)
{
@@ -299,7 +484,7 @@
return (res + d0 - 1);
}
-#endif /* __powerpc__ */
+#endif
#endif
More information about the Ocfs2-tools-commits
mailing list