139 lines
2.7 KiB
C
139 lines
2.7 KiB
C
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;
|
|
}
|
|
|