From: Steve Lord Date: Thu, 30 May 2002 09:28:58 +0000 (+0000) Subject: Undoes mod: xfs-cmds:slinx:120166a X-Git-Tag: v2.1.0~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=23d9897628bb30e956f672607fb3f3a73145fbb2;p=thirdparty%2Fxfsprogs-dev.git Undoes mod: xfs-cmds:slinx:120166a --- diff --git a/include/xfs_bit.h b/include/xfs_bit.h index bf5732492..80eccc5e5 100644 --- a/include/xfs_bit.h +++ b/include/xfs_bit.h @@ -64,6 +64,21 @@ __uint64_t xfs_mask64lo(int n); #define XFS_MASK64LO(n) (((__uint64_t)1 << (n)) - 1) #endif +/* + * Index of low bit number in byte, -1 for none set, 0..7 otherwise. + */ +extern const char xfs_lowbit[256]; + +/* + * Index of high bit number in byte, -1 for none set, 0..7 otherwise. + */ +extern const char xfs_highbit[256]; + +/* + * Count of bits set in byte, 0..8. + */ +extern const char xfs_countbit[256]; + /* * xfs_lowbit32: get low bit set out of 32-bit argument, -1 if none set. */ @@ -84,13 +99,4 @@ extern int xfs_lowbit64(__uint64_t v); */ extern int xfs_highbit64(__uint64_t); -/* Count set bits in map starting with start_bit */ -int xfs_count_bits(uint *map, uint size, uint start_bit); - -/* Count continuous one bits in map starting with start_bit */ -int xfs_contig_bits(uint *map, uint size, uint start_bit); - -/* Find next set bit in map */ -int xfs_next_bit(uint *map, uint size, uint start_bit); - #endif /* __XFS_BIT_H__ */ diff --git a/libxfs/xfs_bit.c b/libxfs/xfs_bit.c index d09ad27de..39dea3b69 100644 --- a/libxfs/xfs_bit.c +++ b/libxfs/xfs_bit.c @@ -36,8 +36,44 @@ #include +/* + * Index of low bit number in byte, -1 for none set, 0..7 otherwise. + */ +const char xfs_lowbit[256] = { + -1, 0, 1, 0, 2, 0, 1, 0, /* 00 .. 07 */ + 3, 0, 1, 0, 2, 0, 1, 0, /* 08 .. 0f */ + 4, 0, 1, 0, 2, 0, 1, 0, /* 10 .. 17 */ + 3, 0, 1, 0, 2, 0, 1, 0, /* 18 .. 1f */ + 5, 0, 1, 0, 2, 0, 1, 0, /* 20 .. 27 */ + 3, 0, 1, 0, 2, 0, 1, 0, /* 28 .. 2f */ + 4, 0, 1, 0, 2, 0, 1, 0, /* 30 .. 37 */ + 3, 0, 1, 0, 2, 0, 1, 0, /* 38 .. 3f */ + 6, 0, 1, 0, 2, 0, 1, 0, /* 40 .. 47 */ + 3, 0, 1, 0, 2, 0, 1, 0, /* 48 .. 4f */ + 4, 0, 1, 0, 2, 0, 1, 0, /* 50 .. 57 */ + 3, 0, 1, 0, 2, 0, 1, 0, /* 58 .. 5f */ + 5, 0, 1, 0, 2, 0, 1, 0, /* 60 .. 67 */ + 3, 0, 1, 0, 2, 0, 1, 0, /* 68 .. 6f */ + 4, 0, 1, 0, 2, 0, 1, 0, /* 70 .. 77 */ + 3, 0, 1, 0, 2, 0, 1, 0, /* 78 .. 7f */ + 7, 0, 1, 0, 2, 0, 1, 0, /* 80 .. 87 */ + 3, 0, 1, 0, 2, 0, 1, 0, /* 88 .. 8f */ + 4, 0, 1, 0, 2, 0, 1, 0, /* 90 .. 97 */ + 3, 0, 1, 0, 2, 0, 1, 0, /* 98 .. 9f */ + 5, 0, 1, 0, 2, 0, 1, 0, /* a0 .. a7 */ + 3, 0, 1, 0, 2, 0, 1, 0, /* a8 .. af */ + 4, 0, 1, 0, 2, 0, 1, 0, /* b0 .. b7 */ + 3, 0, 1, 0, 2, 0, 1, 0, /* b8 .. bf */ + 6, 0, 1, 0, 2, 0, 1, 0, /* c0 .. c7 */ + 3, 0, 1, 0, 2, 0, 1, 0, /* c8 .. cf */ + 4, 0, 1, 0, 2, 0, 1, 0, /* d0 .. d7 */ + 3, 0, 1, 0, 2, 0, 1, 0, /* d8 .. df */ + 5, 0, 1, 0, 2, 0, 1, 0, /* e0 .. e7 */ + 3, 0, 1, 0, 2, 0, 1, 0, /* e8 .. ef */ + 4, 0, 1, 0, 2, 0, 1, 0, /* f0 .. f7 */ + 3, 0, 1, 0, 2, 0, 1, 0, /* f8 .. ff */ +}; -#ifndef HAVE_ARCH_HIGHBIT /* * Index of high bit number in byte, -1 for none set, 0..7 otherwise. */ @@ -75,7 +111,44 @@ const char xfs_highbit[256] = { 7, 7, 7, 7, 7, 7, 7, 7, /* f0 .. f7 */ 7, 7, 7, 7, 7, 7, 7, 7, /* f8 .. ff */ }; -#endif + +/* + * Count of bits set in byte, 0..8. + */ +const char xfs_countbit[256] = { + 0, 1, 1, 2, 1, 2, 2, 3, /* 00 .. 07 */ + 1, 2, 2, 3, 2, 3, 3, 4, /* 08 .. 0f */ + 1, 2, 2, 3, 2, 3, 3, 4, /* 10 .. 17 */ + 2, 3, 3, 4, 3, 4, 4, 5, /* 18 .. 1f */ + 1, 2, 2, 3, 2, 3, 3, 4, /* 20 .. 27 */ + 2, 3, 3, 4, 3, 4, 4, 5, /* 28 .. 2f */ + 2, 3, 3, 4, 3, 4, 4, 5, /* 30 .. 37 */ + 3, 4, 4, 5, 4, 5, 5, 6, /* 38 .. 3f */ + 1, 2, 2, 3, 2, 3, 3, 4, /* 40 .. 47 */ + 2, 3, 3, 4, 3, 4, 4, 5, /* 48 .. 4f */ + 2, 3, 3, 4, 3, 4, 4, 5, /* 50 .. 57 */ + 3, 4, 4, 5, 4, 5, 5, 6, /* 58 .. 5f */ + 2, 3, 3, 4, 3, 4, 4, 5, /* 60 .. 67 */ + 3, 4, 4, 5, 4, 5, 5, 6, /* 68 .. 6f */ + 3, 4, 4, 5, 4, 5, 5, 6, /* 70 .. 77 */ + 4, 5, 5, 6, 5, 6, 6, 7, /* 78 .. 7f */ + 1, 2, 2, 3, 2, 3, 3, 4, /* 80 .. 87 */ + 2, 3, 3, 4, 3, 4, 4, 5, /* 88 .. 8f */ + 2, 3, 3, 4, 3, 4, 4, 5, /* 90 .. 97 */ + 3, 4, 4, 5, 4, 5, 5, 6, /* 98 .. 9f */ + 2, 3, 3, 4, 3, 4, 4, 5, /* a0 .. a7 */ + 3, 4, 4, 5, 4, 5, 5, 6, /* a8 .. af */ + 3, 4, 4, 5, 4, 5, 5, 6, /* b0 .. b7 */ + 4, 5, 5, 6, 5, 6, 6, 7, /* b8 .. bf */ + 2, 3, 3, 4, 3, 4, 4, 5, /* c0 .. c7 */ + 3, 4, 4, 5, 4, 5, 5, 6, /* c8 .. cf */ + 3, 4, 4, 5, 4, 5, 5, 6, /* d0 .. d7 */ + 4, 5, 5, 6, 5, 6, 6, 7, /* d8 .. df */ + 3, 4, 4, 5, 4, 5, 5, 6, /* e0 .. e7 */ + 4, 5, 5, 6, 5, 6, 6, 7, /* e8 .. ef */ + 4, 5, 5, 6, 5, 6, 6, 7, /* f0 .. f7 */ + 5, 6, 6, 7, 6, 7, 7, 8, /* f8 .. ff */ +}; /* * xfs_highbit32: get high bit set out of 32-bit argument, -1 if none set. @@ -84,9 +157,6 @@ int xfs_highbit32( __uint32_t v) { -#ifdef HAVE_ARCH_HIGHBIT - return highbit32(v); -#else int i; if (v & 0xffff0000) @@ -102,7 +172,6 @@ xfs_highbit32( else return -1; return i + xfs_highbit[(v >> i) & 0xff]; -#endif } /* @@ -112,14 +181,63 @@ int xfs_lowbit64( __uint64_t v) { - int n; - n = ffs((unsigned)v); - if (n == 0) { - n = ffs(v >> 32); - if (n >= 0) - n+=32; - } - return n-1; + int i; +#if XFS_64 + if (v & 0x00000000ffffffff) + if (v & 0x000000000000ffff) + if (v & 0x00000000000000ff) + i = 0; + else + i = 8; + else + if (v & 0x0000000000ff0000) + i = 16; + else + i = 24; + else if (v & 0xffffffff00000000) + if (v & 0x0000ffff00000000) + if (v & 0x000000ff00000000) + i = 32; + else + i = 40; + else + if (v & 0x00ff000000000000) + i = 48; + else + i = 56; + else + return -1; + return i + xfs_lowbit[(v >> i) & 0xff]; +#else + __uint32_t vw; + + if ((vw = v)) { + if (vw & 0x0000ffff) + if (vw & 0x000000ff) + i = 0; + else + i = 8; + else + if (vw & 0x00ff0000) + i = 16; + else + i = 24; + return i + xfs_lowbit[(vw >> i) & 0xff]; + } else if ((vw = v >> 32)) { + if (vw & 0x0000ffff) + if (vw & 0x000000ff) + i = 32; + else + i = 40; + else + if (vw & 0x00ff0000) + i = 48; + else + i = 56; + return i + xfs_lowbit[(vw >> (i - 32)) & 0xff]; + } else + return -1; +#endif } /* @@ -129,8 +247,61 @@ int xfs_highbit64( __uint64_t v) { - __uint32_t h = v >> 32; - if (h) - return xfs_highbit32(h) + 32; - return xfs_highbit32((__u32)v); + int i; +#if XFS_64 + if (v & 0xffffffff00000000) + if (v & 0xffff000000000000) + if (v & 0xff00000000000000) + i = 56; + else + i = 48; + else + if (v & 0x0000ff0000000000) + i = 40; + else + i = 32; + else if (v & 0x00000000ffffffff) + if (v & 0x00000000ffff0000) + if (v & 0x00000000ff000000) + i = 24; + else + i = 16; + else + if (v & 0x000000000000ff00) + i = 8; + else + i = 0; + else + return -1; + return i + xfs_highbit[(v >> i) & 0xff]; +#else + __uint32_t vw; + + if ((vw = v >> 32)) { + if (vw & 0xffff0000) + if (vw & 0xff000000) + i = 56; + else + i = 48; + else + if (vw & 0x0000ff00) + i = 40; + else + i = 32; + return i + xfs_highbit[(vw >> (i - 32)) & 0xff]; + } else if ((vw = v)) { + if (vw & 0xffff0000) + if (vw & 0xff000000) + i = 24; + else + i = 16; + else + if (vw & 0x0000ff00) + i = 8; + else + i = 0; + return i + xfs_highbit[(vw >> i) & 0xff]; + } else + return -1; +#endif } diff --git a/libxfs/xfs_rtbit.c b/libxfs/xfs_rtbit.c index 1b6c77931..c51cba34c 100644 --- a/libxfs/xfs_rtbit.c +++ b/libxfs/xfs_rtbit.c @@ -43,5 +43,19 @@ int xfs_lowbit32( __uint32_t v) { - return ffs(v)-1; + int i; + + if (v & 0x0000ffff) + if (v & 0x000000ff) + i = 0; + else + i = 8; + else if (v & 0xffff0000) + if (v & 0x00ff0000) + i = 16; + else + i = 24; + else + return -1; + return i + xfs_lowbit[(v >> i) & 0xff]; }