| struct obstack {}; |
| struct bitmap_head_def; |
| typedef struct bitmap_head_def *bitmap; |
| typedef const struct bitmap_head_def *const_bitmap; |
| typedef unsigned long BITMAP_WORD; |
| |
| typedef struct bitmap_obstack |
| { |
| struct bitmap_element_def *elements; |
| struct bitmap_head_def *heads; |
| struct obstack obstack; |
| } bitmap_obstack; |
| typedef struct bitmap_element_def |
| { |
| struct bitmap_element_def *next; |
| struct bitmap_element_def *prev; |
| unsigned int indx; |
| BITMAP_WORD bits[(2)]; |
| } bitmap_element; |
| |
| struct bitmap_descriptor; |
| |
| typedef struct bitmap_head_def { |
| bitmap_element *first; |
| bitmap_element *current; |
| unsigned int indx; |
| bitmap_obstack *obstack; |
| } bitmap_head; |
| |
| bitmap_element bitmap_zero_bits; |
| |
| typedef struct |
| { |
| bitmap_element *elt1; |
| bitmap_element *elt2; |
| unsigned word_no; |
| BITMAP_WORD bits; |
| } bitmap_iterator; |
| |
| static __attribute__((noinline)) void |
| bmp_iter_set_init (bitmap_iterator *bi, const_bitmap map, |
| unsigned start_bit, unsigned *bit_no) |
| { |
| bi->elt1 = map->first; |
| bi->elt2 = ((void *)0); |
| |
| while (1) |
| { |
| if (!bi->elt1) |
| { |
| bi->elt1 = &bitmap_zero_bits; |
| break; |
| } |
| |
| if (bi->elt1->indx >= start_bit / (128u)) |
| break; |
| bi->elt1 = bi->elt1->next; |
| } |
| |
| if (bi->elt1->indx != start_bit / (128u)) |
| start_bit = bi->elt1->indx * (128u); |
| |
| bi->word_no = start_bit / 64u % (2); |
| bi->bits = bi->elt1->bits[bi->word_no]; |
| bi->bits >>= start_bit % 64u; |
| |
| start_bit += !bi->bits; |
| |
| *bit_no = start_bit; |
| } |
| |
| static __inline__ __attribute__((always_inline)) void |
| bmp_iter_next (bitmap_iterator *bi, unsigned *bit_no) |
| { |
| bi->bits >>= 1; |
| *bit_no += 1; |
| } |
| |
| static __inline__ __attribute__((always_inline)) unsigned char |
| bmp_iter_set (bitmap_iterator *bi, unsigned *bit_no) |
| { |
| if (bi->bits) |
| { |
| while (!(bi->bits & 1)) |
| { |
| bi->bits >>= 1; |
| *bit_no += 1; |
| } |
| return 1; |
| } |
| |
| *bit_no = ((*bit_no + 64u - 1) / 64u * 64u); |
| bi->word_no++; |
| |
| while (1) |
| { |
| while (bi->word_no != (2)) |
| { |
| bi->bits = bi->elt1->bits[bi->word_no]; |
| if (bi->bits) |
| { |
| while (!(bi->bits & 1)) |
| { |
| bi->bits >>= 1; |
| *bit_no += 1; |
| } |
| return 1; |
| } |
| *bit_no += 64u; |
| bi->word_no++; |
| } |
| |
| bi->elt1 = bi->elt1->next; |
| if (!bi->elt1) |
| return 0; |
| *bit_no = bi->elt1->indx * (128u); |
| bi->word_no = 0; |
| } |
| } |
| |
| static void __attribute__((noinline)) |
| foobar (bitmap_head *live_throughout) |
| { |
| bitmap_iterator rsi; |
| unsigned int regno; |
| for (bmp_iter_set_init (&(rsi), (live_throughout), (0), &(regno)); |
| bmp_iter_set (&(rsi), &(regno)); |
| bmp_iter_next (&(rsi), &(regno))) |
| ; |
| } |
| int main() |
| { |
| bitmap_element elem = { (void *)0, (void *)0, 0, { 1, 1 } }; |
| bitmap_head live_throughout = { &elem, &elem, 0, (void *)0 }; |
| foobar (&live_throughout); |
| return 0; |
| } |
| |