aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2010-06-11 23:56:08 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2010-06-11 21:56:08 +0000
commitd5568f03cda87e0e877d957f9613990e75bec269 (patch)
tree6edcae1a220065b5aa70ffb364fc27ec8739365d
parent5914a70f0b669ed041d200b8b6e67a6e601e2c66 (diff)
downloadgcc-d5568f03cda87e0e877d957f9613990e75bec269.zip
gcc-d5568f03cda87e0e877d957f9613990e75bec269.tar.gz
gcc-d5568f03cda87e0e877d957f9613990e75bec269.tar.bz2
bitmap.h (+bmp_iter_next_bit): New.
* bitmap.h (+bmp_iter_next_bit): New. (bmp_iter_set, bmp_iter_and, bmp_iter_and_compl): Use it. From-SVN: r160637
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/bitmap.h39
2 files changed, 30 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b8ec704..fa404da 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-06-11 Jan Hubicka <jh@suse.cz>
+
+ * bitmap.h (+bmp_iter_next_bit): New.
+ (bmp_iter_set, bmp_iter_and, bmp_iter_and_compl):
+ Use it.
+
2010-06-11 Sandra Loosemore <sandra@codesourcery.com>
Eric Botcazou <ebotcazou@adacore.com>
diff --git a/gcc/bitmap.h b/gcc/bitmap.h
index 1163b2f..68a46204 100644
--- a/gcc/bitmap.h
+++ b/gcc/bitmap.h
@@ -385,6 +385,27 @@ bmp_iter_next (bitmap_iterator *bi, unsigned *bit_no)
*bit_no += 1;
}
+/* Advance to first set bit in BI. */
+
+static inline void
+bmp_iter_next_bit (bitmap_iterator * bi, unsigned *bit_no)
+{
+#if (GCC_VERSION >= 3004)
+ {
+ unsigned int n = __builtin_ctzl (bi->bits);
+ gcc_assert (sizeof (unsigned long) == sizeof (BITMAP_WORD));
+ bi->bits >>= n;
+ *bit_no += n;
+ }
+#else
+ while (!(bi->bits & 1))
+ {
+ bi->bits >>= 1;
+ *bit_no += 1;
+ }
+#endif
+}
+
/* Advance to the next nonzero bit of a single bitmap, we will have
already advanced past the just iterated bit. Return true if there
is a bit to iterate. */
@@ -396,11 +417,7 @@ bmp_iter_set (bitmap_iterator *bi, unsigned *bit_no)
if (bi->bits)
{
next_bit:
- while (!(bi->bits & 1))
- {
- bi->bits >>= 1;
- *bit_no += 1;
- }
+ bmp_iter_next_bit (bi, bit_no);
return true;
}
@@ -443,11 +460,7 @@ bmp_iter_and (bitmap_iterator *bi, unsigned *bit_no)
if (bi->bits)
{
next_bit:
- while (!(bi->bits & 1))
- {
- bi->bits >>= 1;
- *bit_no += 1;
- }
+ bmp_iter_next_bit (bi, bit_no);
return true;
}
@@ -510,11 +523,7 @@ bmp_iter_and_compl (bitmap_iterator *bi, unsigned *bit_no)
if (bi->bits)
{
next_bit:
- while (!(bi->bits & 1))
- {
- bi->bits >>= 1;
- *bit_no += 1;
- }
+ bmp_iter_next_bit (bi, bit_no);
return true;
}