public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [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