diff options
author | Jan Hubicka <jh@suse.cz> | 2010-06-11 23:56:08 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2010-06-11 21:56:08 +0000 |
commit | d5568f03cda87e0e877d957f9613990e75bec269 (patch) | |
tree | 6edcae1a220065b5aa70ffb364fc27ec8739365d | |
parent | 5914a70f0b669ed041d200b8b6e67a6e601e2c66 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/bitmap.h | 39 |
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; } |