%d]\n", \ __FILE__, __LINE__, __FUNCTION__, _i, _min, _max); \ gcc_unreachable (); \ } \ ((R)[(unsigned) (_i - _min) / IRA_INT_BITS] \ & ((IRA_INT_TYPE) 1 << ((unsigned) (_i - _min) % IRA_INT_BITS))); })) #else #define SET_MINMAX_SET_BIT(R, I, MIN, MAX) \ ((R)[(unsigned) ((I) - (MIN)) / IRA_INT_BITS] \ |= ((IRA_INT_TYPE) 1 << ((unsigned) ((I) - (MIN)) % IRA_INT_BITS))) #define CLEAR_MINMAX_SET_BIT(R, I, MIN, MAX) \ ((R)[(unsigned) ((I) - (MIN)) / IRA_INT_BITS] \ &= ~((IRA_INT_TYPE) 1 << ((unsigned) ((I) - (MIN)) % IRA_INT_BITS))) #define TEST_MINMAX_SET_BIT(R, I, MIN, MAX) \ ((R)[(unsigned) ((I) - (MIN)) / IRA_INT_BITS] \ & ((IRA_INT_TYPE) 1 << ((unsigned) ((I) - (MIN)) % IRA_INT_BITS))) #endif /* The iterator for min/max sets. */ struct minmax_set_iterator { /* Array containing the bit vector. */ IRA_INT_TYPE *vec; /* The number of the current element in the vector. */ unsigned int word_num; /* The number of bits in the bit vector. */ unsigned int nel; /* The current bit index of the bit vector. */ unsigned int bit_num; /* Index corresponding to the 1st bit of the bit vector. */ int start_val; /* The word of the bit vector currently visited. */ unsigned IRA_INT_TYPE word; }; /* Initialize the iterator I for bit vector VEC containing minimal and maximal values MIN and MAX. */ static inline void minmax_set_iter_init (minmax_set_iterator *i, IRA_INT_TYPE *vec, int min, int max) { i->vec = vec; i->word_num = 0; i->nel = max < min ? 0 : max - min + 1; i->start_val = min; i->bit_num = 0; i->word = i->nel == 0 ? 0 : vec[0]; } /* Return TRUE if we have more allocnos to visit, in which case *N is set to the number of the element to be visited. Otherwise, return FALSE. */ static inline bool minmax_set_iter_cond (minmax_set_iterator *i, int *n) { /* Skip words that are zeros. */ for (; i->word == 0; i->word = i->vec[i->word_num]) { i->word_num++; i->bit_num = i->word_num * IRA_INT_BITS; /* If we have reached the end, break. */ if (i->bit_num >= i->nel) return false; } /* Skip bits that are zero. */ for (; (i->word & 1) == 0; i->word >>= 1) i->bit_num++; *n = (int) i->bit_num + i->start_val; return true; } /* Advance to the next element in the set. */ static inline void minmax_set_iter_next (minmax_set_iterator *i) { i->word >>= 1; i->bit_num++; } /* Loop over all elements of a min/max set given by bit vector VEC and their minimal and maximal values MIN and MAX. In each iteration, N is set to the number of next allocno. ITER is an instance of minmax_set_iterator used to iterate over the set. */ #define FOR_EACH_BIT_IN_MINMAX_SET(VEC, MIN, MAX, N, ITER) \ for (minmax_set_iter_init (&(ITER), (VEC), (MIN), (MAX)); \ minmax_set_iter_cond (&(ITER), &(N)); \ minmax_set_iter_next (&(ITER)))