| 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[((128 + (8 * 8 * 1u) - 1) / (8 * 8 * 1u))]; |
| } 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 void __attribute__((noinline)) |
| 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 / (((128 + (8 * 8 * 1u) - 1) / (8 * 8 * 1u)) * (8 * 8 * 1u))) |
| break; |
| bi->elt1 = bi->elt1->next; |
| } |
| |
| if (bi->elt1->indx != start_bit / (((128 + (8 * 8 * 1u) - 1) / (8 * 8 * 1u)) * (8 * 8 * 1u))) |
| start_bit = bi->elt1->indx * (((128 + (8 * 8 * 1u) - 1) / (8 * 8 * 1u)) * (8 * 8 * 1u)); |
| |
| bi->word_no = start_bit / (8 * 8 * 1u) % ((128 + (8 * 8 * 1u) - 1) / (8 * 8 * 1u)); |
| bi->bits = bi->elt1->bits[bi->word_no]; |
| bi->bits >>= start_bit % (8 * 8 * 1u); |
| |
| start_bit += !bi->bits; |
| |
| *bit_no = start_bit; |
| } |
| |
| static void __attribute__((noinline)) |
| bmp_iter_next (bitmap_iterator *bi, unsigned *bit_no) |
| { |
| bi->bits >>= 1; |
| *bit_no += 1; |
| } |
| |
| static unsigned char __attribute__((noinline)) |
| bmp_iter_set_tail (bitmap_iterator *bi, unsigned *bit_no) |
| { |
| while (!(bi->bits & 1)) |
| { |
| bi->bits >>= 1; |
| *bit_no += 1; |
| } |
| return 1; |
| } |
| |
| static __inline__ unsigned char |
| bmp_iter_set (bitmap_iterator *bi, unsigned *bit_no) |
| { |
| unsigned bno = *bit_no; |
| BITMAP_WORD bits = bi->bits; |
| bitmap_element *elt1; |
| |
| if (bits) |
| { |
| while (!(bits & 1)) |
| { |
| bits >>= 1; |
| bno += 1; |
| } |
| *bit_no = bno; |
| return 1; |
| } |
| |
| *bit_no = ((bno + 64 - 1) / 64 * 64); |
| bi->word_no++; |
| |
| elt1 = bi->elt1; |
| while (1) |
| { |
| while (bi->word_no != 2) |
| { |
| bi->bits = elt1->bits[bi->word_no]; |
| if (bi->bits) |
| { |
| bi->elt1 = elt1; |
| return bmp_iter_set_tail (bi, bit_no); |
| } |
| *bit_no += 64; |
| bi->word_no++; |
| } |
| |
| elt1 = elt1->next; |
| if (!elt1) |
| { |
| bi->elt1 = elt1; |
| return 0; |
| } |
| *bit_no = elt1->indx * (2 * 64); |
| bi->word_no = 0; |
| } |
| } |
| |
| extern void abort (void); |
| |
| static void __attribute__((noinline)) catchme(int i) |
| { |
| if (i != 0 && i != 64) |
| abort (); |
| } |
| static void __attribute__((noinline)) foobar (bitmap_head *chain) |
| { |
| bitmap_iterator rsi; |
| unsigned int regno; |
| for (bmp_iter_set_init (&(rsi), (chain), (0), &(regno)); |
| bmp_iter_set (&(rsi), &(regno)); |
| bmp_iter_next (&(rsi), &(regno))) |
| catchme(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; |
| } |
| |