* [PATCH][v850] Add find_next_bit for v850
@ 2004-06-25 6:29 Miles Bader
2004-06-25 7:06 ` Nick Piggin
0 siblings, 1 reply; 2+ messages in thread
From: Miles Bader @ 2004-06-25 6:29 UTC (permalink / raw)
To: Linus Torvalds; +Cc: linux-kernel
[Since many archs use the same implementation of find_next_bit, it might
be nice to have `generic_find_next_bit' or something.]
Signed-off-by: Miles Bader <miles@gnu.org>
include/asm-v850/bitops.h | 76 ++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 76 insertions(+)
diff -ruN -X../cludes linux-2.6.7-uc0/include/asm-v850/bitops.h linux-2.6.7-uc0-v850-20040625/include/asm-v850/bitops.h
--- linux-2.6.7-uc0/include/asm-v850/bitops.h 2004-05-11 13:20:53.000000000 +0900
+++ linux-2.6.7-uc0-v850-20040625/include/asm-v850/bitops.h 2004-06-25 14:24:08.000000000 +0900
@@ -193,10 +193,86 @@
return result + ffz (tmp);
}
+
+/* This is the same as generic_ffs, but we can't use that because it's
+ inline and the #include order mucks things up. */
+static inline int generic_ffs_for_find_next_bit(int x)
+{
+ int r = 1;
+
+ if (!x)
+ return 0;
+ if (!(x & 0xffff)) {
+ x >>= 16;
+ r += 16;
+ }
+ if (!(x & 0xff)) {
+ x >>= 8;
+ r += 8;
+ }
+ if (!(x & 0xf)) {
+ x >>= 4;
+ r += 4;
+ }
+ if (!(x & 3)) {
+ x >>= 2;
+ r += 2;
+ }
+ if (!(x & 1)) {
+ x >>= 1;
+ r += 1;
+ }
+ return r;
+}
+
+/*
+ * Find next one bit in a bitmap reasonably efficiently.
+ */
+static __inline__ unsigned long find_next_bit(const unsigned long *addr,
+ unsigned long size, unsigned long 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 + generic_ffs_for_find_next_bit(tmp);
+}
+
+
#define ffs(x) generic_ffs (x)
#define fls(x) generic_fls (x)
#define __ffs(x) ffs(x)
+
/*
* This is just `generic_ffs' from <linux/bitops.h>, except that it assumes
* that at least one bit is set, and returns the real index of the bit
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH][v850] Add find_next_bit for v850
2004-06-25 6:29 [PATCH][v850] Add find_next_bit for v850 Miles Bader
@ 2004-06-25 7:06 ` Nick Piggin
0 siblings, 0 replies; 2+ messages in thread
From: Nick Piggin @ 2004-06-25 7:06 UTC (permalink / raw)
To: Miles Bader; +Cc: Linus Torvalds, linux-kernel
Miles Bader wrote:
> [Since many archs use the same implementation of find_next_bit, it might
> be nice to have `generic_find_next_bit' or something.]
>
> Signed-off-by: Miles Bader <miles@gnu.org>
>
> include/asm-v850/bitops.h | 76 ++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 76 insertions(+)
>
> diff -ruN -X../cludes linux-2.6.7-uc0/include/asm-v850/bitops.h linux-2.6.7-uc0-v850-20040625/include/asm-v850/bitops.h
> --- linux-2.6.7-uc0/include/asm-v850/bitops.h 2004-05-11 13:20:53.000000000 +0900
> +++ linux-2.6.7-uc0-v850-20040625/include/asm-v850/bitops.h 2004-06-25 14:24:08.000000000 +0900
> @@ -193,10 +193,86 @@
> return result + ffz (tmp);
> }
>
> +
> +/* This is the same as generic_ffs, but we can't use that because it's
> + inline and the #include order mucks things up. */
> +static inline int generic_ffs_for_find_next_bit(int x)
> +{
> + int r = 1;
> +
> + if (!x)
> + return 0;
> + if (!(x & 0xffff)) {
> + x >>= 16;
> + r += 16;
> + }
> + if (!(x & 0xff)) {
> + x >>= 8;
> + r += 8;
> + }
> + if (!(x & 0xf)) {
> + x >>= 4;
> + r += 4;
> + }
> + if (!(x & 3)) {
> + x >>= 2;
> + r += 2;
> + }
> + if (!(x & 1)) {
> + x >>= 1;
> + r += 1;
> + }
> + return r;
> +}
> +
> +/*
> + * Find next one bit in a bitmap reasonably efficiently.
> + */
> +static __inline__ unsigned long find_next_bit(const unsigned long *addr,
This probably shouldn't be inline.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2004-06-25 7:06 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-06-25 6:29 [PATCH][v850] Add find_next_bit for v850 Miles Bader
2004-06-25 7:06 ` Nick Piggin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox