< 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 >