< prev index next >
src/hotspot/share/utilities/bitMap.cpp
Print this page
rev 54933 : [mq]: stefank_review
*** 71,81 ****
}
};
template <class Allocator>
BitMap::bm_word_t* BitMap::reallocate(const Allocator& allocator, bm_word_t* old_map, idx_t old_size_in_bits, idx_t new_size_in_bits, bool clear) {
- verify_max_size_limited(new_size_in_bits);
size_t old_size_in_words = calc_size_in_words(old_size_in_bits);
size_t new_size_in_words = calc_size_in_words(new_size_in_bits);
bm_word_t* map = NULL;
--- 71,80 ----
*** 173,184 ****
void CHeapBitMap::reinitialize(idx_t size_in_bits, bool clear) {
BitMap::reinitialize(CHeapBitMapAllocator(_flags), size_in_bits, clear);
}
#ifdef ASSERT
! void BitMap::verify_max_size_limited(idx_t bit) {
! assert(bit <= max_size_in_bits(), "out of bounds: " SIZE_FORMAT, bit);
}
void BitMap::verify_index(idx_t index) const {
assert(index < _size, "BitMap index out of bounds");
}
--- 172,184 ----
void CHeapBitMap::reinitialize(idx_t size_in_bits, bool clear) {
BitMap::reinitialize(CHeapBitMapAllocator(_flags), size_in_bits, clear);
}
#ifdef ASSERT
! void BitMap::verify_valid_size(idx_t size_in_bits) {
! assert(size_in_bits <= max_size_in_bits(),
! "out of bounds: " SIZE_FORMAT, size_in_bits);
}
void BitMap::verify_index(idx_t index) const {
assert(index < _size, "BitMap index out of bounds");
}
*** 231,315 ****
}
void BitMap::set_range(idx_t beg, idx_t end) {
verify_range(beg, end);
! idx_t beg_full_word = word_index_round_up(beg);
! idx_t end_full_word = word_index(end);
! if (beg_full_word < end_full_word) {
// The range includes at least one full word.
! set_range_within_word(beg, bit_index(beg_full_word));
! set_range_of_words(beg_full_word, end_full_word);
! set_range_within_word(bit_index(end_full_word), end);
} else {
// The range spans at most 2 partial words.
! idx_t boundary = MIN2(bit_index(beg_full_word), end);
set_range_within_word(beg, boundary);
set_range_within_word(boundary, end);
}
}
void BitMap::clear_range(idx_t beg, idx_t end) {
verify_range(beg, end);
! idx_t beg_full_word = word_index_round_up(beg);
! idx_t end_full_word = word_index(end);
! if (beg_full_word < end_full_word) {
// The range includes at least one full word.
! clear_range_within_word(beg, bit_index(beg_full_word));
! clear_range_of_words(beg_full_word, end_full_word);
! clear_range_within_word(bit_index(end_full_word), end);
} else {
// The range spans at most 2 partial words.
! idx_t boundary = MIN2(bit_index(beg_full_word), end);
clear_range_within_word(beg, boundary);
clear_range_within_word(boundary, end);
}
}
! bool BitMap::is_small_range_of_words(idx_t beg_full_word, idx_t end_full_word) {
// There is little point to call large version on small ranges.
! // Need to check carefully, keeping potential idx_t underflow in mind.
// The threshold should be at least one word.
STATIC_ASSERT(small_range_words >= 1);
! return (beg_full_word + small_range_words >= end_full_word);
}
void BitMap::set_large_range(idx_t beg, idx_t end) {
verify_range(beg, end);
! idx_t beg_full_word = word_index_round_up(beg);
! idx_t end_full_word = word_index(end);
! if (is_small_range_of_words(beg_full_word, end_full_word)) {
set_range(beg, end);
return;
}
// The range includes at least one full word.
! set_range_within_word(beg, bit_index(beg_full_word));
! set_large_range_of_words(beg_full_word, end_full_word);
! set_range_within_word(bit_index(end_full_word), end);
}
void BitMap::clear_large_range(idx_t beg, idx_t end) {
verify_range(beg, end);
! idx_t beg_full_word = word_index_round_up(beg);
! idx_t end_full_word = word_index(end);
! if (is_small_range_of_words(beg_full_word, end_full_word)) {
clear_range(beg, end);
return;
}
// The range includes at least one full word.
! clear_range_within_word(beg, bit_index(beg_full_word));
! clear_large_range_of_words(beg_full_word, end_full_word);
! clear_range_within_word(bit_index(end_full_word), end);
}
void BitMap::at_put(idx_t offset, bool value) {
if (value) {
set_bit(offset);
--- 231,317 ----
}
void BitMap::set_range(idx_t beg, idx_t end) {
verify_range(beg, end);
! idx_t beg_aligned = range_begin_align_up(beg);
! idx_t end_aligned = range_end_align_down(end);
! if (beg_aligned < end_aligned) {
// The range includes at least one full word.
! set_range_within_word(beg, beg_aligned);
! set_range_of_words(word_index(beg_aligned), word_index(end_aligned));
! set_range_within_word(end_aligned, end);
} else {
// The range spans at most 2 partial words.
! idx_t boundary = MIN2(beg_aligned, end);
set_range_within_word(beg, boundary);
set_range_within_word(boundary, end);
}
}
void BitMap::clear_range(idx_t beg, idx_t end) {
verify_range(beg, end);
! idx_t beg_aligned = range_begin_align_up(beg);
! idx_t end_aligned = range_end_align_down(end);
! if (beg_aligned < end_aligned) {
// The range includes at least one full word.
! clear_range_within_word(beg, beg_aligned);
! clear_range_of_words(word_index(beg_aligned), word_index(end_aligned));
! clear_range_within_word(end_aligned, end);
} else {
// The range spans at most 2 partial words.
! idx_t boundary = MIN2(beg_aligned, end);
clear_range_within_word(beg, boundary);
clear_range_within_word(boundary, end);
}
}
! bool BitMap::is_small_aligned_range(idx_t beg_aligned, idx_t end_aligned) {
// There is little point to call large version on small ranges.
! // Need to check carefully, keeping potential idx_t over/underflow in mind,
! // because beg_aligned > end_aligned can occur when beg and end are in the
! // same word.
// The threshold should be at least one word.
STATIC_ASSERT(small_range_words >= 1);
! return word_index(beg_aligned) + small_range_words >= word_index(end_aligned);
}
void BitMap::set_large_range(idx_t beg, idx_t end) {
verify_range(beg, end);
! idx_t beg_aligned = range_begin_align_up(beg);
! idx_t end_aligned = range_end_align_down(end);
! if (is_small_aligned_range(beg_aligned, end_aligned)) {
set_range(beg, end);
return;
}
// The range includes at least one full word.
! set_range_within_word(beg, beg_aligned);
! set_large_range_of_words(word_index(beg_aligned), word_index(end_aligned));
! set_range_within_word(end_aligned, end);
}
void BitMap::clear_large_range(idx_t beg, idx_t end) {
verify_range(beg, end);
! idx_t beg_aligned = range_begin_align_up(beg);
! idx_t end_aligned = range_end_align_down(end);
! if (is_small_aligned_range(beg_aligned, end_aligned)) {
clear_range(beg, end);
return;
}
// The range includes at least one full word.
! clear_range_within_word(beg, beg_aligned);
! clear_large_range_of_words(word_index(beg_aligned), word_index(end_aligned));
! clear_range_within_word(end_aligned, end);
}
void BitMap::at_put(idx_t offset, bool value) {
if (value) {
set_bit(offset);
*** 346,370 ****
}
void BitMap::par_at_put_range(idx_t beg, idx_t end, bool value) {
verify_range(beg, end);
! idx_t beg_full_word = word_index_round_up(beg);
! idx_t end_full_word = word_index(end);
! if (beg_full_word < end_full_word) {
// The range includes at least one full word.
! par_put_range_within_word(beg, bit_index(beg_full_word), value);
if (value) {
set_range_of_words(beg_full_word, end_full_word);
} else {
clear_range_of_words(beg_full_word, end_full_word);
}
! par_put_range_within_word(bit_index(end_full_word), end, value);
} else {
// The range spans at most 2 partial words.
! idx_t boundary = MIN2(bit_index(beg_full_word), end);
par_put_range_within_word(beg, boundary, value);
par_put_range_within_word(boundary, end, value);
}
}
--- 348,374 ----
}
void BitMap::par_at_put_range(idx_t beg, idx_t end, bool value) {
verify_range(beg, end);
! idx_t beg_aligned = range_begin_align_up(beg);
! idx_t end_aligned = range_end_align_down(end);
! if (beg_aligned < end_aligned) {
// The range includes at least one full word.
! par_put_range_within_word(beg, beg_aligned, value);
! idx_t beg_full_word = word_index(beg_aligned);
! idx_t end_full_word = word_index(end_aligned);
if (value) {
set_range_of_words(beg_full_word, end_full_word);
} else {
clear_range_of_words(beg_full_word, end_full_word);
}
! par_put_range_within_word(end_aligned, end, value);
} else {
// The range spans at most 2 partial words.
! idx_t boundary = MIN2(beg_aligned, end);
par_put_range_within_word(beg, boundary, value);
par_put_range_within_word(boundary, end, value);
}
}
*** 378,403 ****
}
void BitMap::par_at_put_large_range(idx_t beg, idx_t end, bool value) {
verify_range(beg, end);
! idx_t beg_full_word = word_index_round_up(beg);
! idx_t end_full_word = word_index(end);
! if (is_small_range_of_words(beg_full_word, end_full_word)) {
par_at_put_range(beg, end, value);
return;
}
// The range includes at least one full word.
! par_put_range_within_word(beg, bit_index(beg_full_word), value);
if (value) {
set_large_range_of_words(beg_full_word, end_full_word);
} else {
clear_large_range_of_words(beg_full_word, end_full_word);
}
! par_put_range_within_word(bit_index(end_full_word), end, value);
}
inline bm_word_t tail_mask(idx_t tail_bits) {
assert(tail_bits != 0, "precondition"); // Works, but shouldn't be called.
assert(tail_bits < (idx_t)BitsPerWord, "precondition");
--- 382,409 ----
}
void BitMap::par_at_put_large_range(idx_t beg, idx_t end, bool value) {
verify_range(beg, end);
! idx_t beg_aligned = range_begin_align_up(beg);
! idx_t end_aligned = range_end_align_down(end);
! if (is_small_aligned_range(beg_aligned, end_aligned)) {
par_at_put_range(beg, end, value);
return;
}
// The range includes at least one full word.
! par_put_range_within_word(beg, beg_aligned, value);
! idx_t beg_full_word = word_index(beg_aligned);
! idx_t end_full_word = word_index(end_aligned);
if (value) {
set_large_range_of_words(beg_full_word, end_full_word);
} else {
clear_large_range_of_words(beg_full_word, end_full_word);
}
! par_put_range_within_word(end_aligned, end, value);
}
inline bm_word_t tail_mask(idx_t tail_bits) {
assert(tail_bits != 0, "precondition"); // Works, but shouldn't be called.
assert(tail_bits < (idx_t)BitsPerWord, "precondition");
< prev index next >