50 HeapWord* aligned_end = align_up (end, HeapWordSize); 51 // If compressed oops were not being used, these should already be aligned 52 assert(UseCompressedOops || (aligned_start == start && aligned_end == end), 53 "Expected heap word alignment of start and end"); 54 write_ref_array_work(MemRegion(aligned_start, aligned_end)); 55 } 56 57 template <DecoratorSet decorators, typename BarrierSetT> 58 template <typename T> 59 inline void ModRefBarrierSet::AccessBarrier<decorators, BarrierSetT>:: 60 oop_store_in_heap(T* addr, oop value) { 61 BarrierSetT *bs = barrier_set_cast<BarrierSetT>(barrier_set()); 62 bs->template write_ref_field_pre<decorators>(addr); 63 Raw::oop_store(addr, value); 64 bs->template write_ref_field_post<decorators>(addr, value); 65 } 66 67 template <DecoratorSet decorators, typename BarrierSetT> 68 template <typename T> 69 inline oop ModRefBarrierSet::AccessBarrier<decorators, BarrierSetT>:: 70 oop_atomic_cmpxchg_in_heap(oop new_value, T* addr, oop compare_value) { 71 BarrierSetT *bs = barrier_set_cast<BarrierSetT>(barrier_set()); 72 bs->template write_ref_field_pre<decorators>(addr); 73 oop result = Raw::oop_atomic_cmpxchg(new_value, addr, compare_value); 74 if (result == compare_value) { 75 bs->template write_ref_field_post<decorators>(addr, new_value); 76 } 77 return result; 78 } 79 80 template <DecoratorSet decorators, typename BarrierSetT> 81 template <typename T> 82 inline oop ModRefBarrierSet::AccessBarrier<decorators, BarrierSetT>:: 83 oop_atomic_xchg_in_heap(oop new_value, T* addr) { 84 BarrierSetT *bs = barrier_set_cast<BarrierSetT>(barrier_set()); 85 bs->template write_ref_field_pre<decorators>(addr); 86 oop result = Raw::oop_atomic_xchg(new_value, addr); 87 bs->template write_ref_field_post<decorators>(addr, new_value); 88 return result; 89 } 90 91 template <DecoratorSet decorators, typename BarrierSetT> 92 template <typename T> 93 inline bool ModRefBarrierSet::AccessBarrier<decorators, BarrierSetT>:: 94 oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, 95 arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, 96 size_t length) { 97 BarrierSetT *bs = barrier_set_cast<BarrierSetT>(barrier_set()); 98 99 src_raw = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw); 100 dst_raw = arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw); 101 102 if (!HasDecorator<decorators, ARRAYCOPY_CHECKCAST>::value) { 103 // Optimized covariant case 104 bs->write_ref_array_pre(dst_raw, length, 105 HasDecorator<decorators, IS_DEST_UNINITIALIZED>::value); 106 Raw::oop_arraycopy(NULL, 0, src_raw, NULL, 0, dst_raw, length); | 50 HeapWord* aligned_end = align_up (end, HeapWordSize); 51 // If compressed oops were not being used, these should already be aligned 52 assert(UseCompressedOops || (aligned_start == start && aligned_end == end), 53 "Expected heap word alignment of start and end"); 54 write_ref_array_work(MemRegion(aligned_start, aligned_end)); 55 } 56 57 template <DecoratorSet decorators, typename BarrierSetT> 58 template <typename T> 59 inline void ModRefBarrierSet::AccessBarrier<decorators, BarrierSetT>:: 60 oop_store_in_heap(T* addr, oop value) { 61 BarrierSetT *bs = barrier_set_cast<BarrierSetT>(barrier_set()); 62 bs->template write_ref_field_pre<decorators>(addr); 63 Raw::oop_store(addr, value); 64 bs->template write_ref_field_post<decorators>(addr, value); 65 } 66 67 template <DecoratorSet decorators, typename BarrierSetT> 68 template <typename T> 69 inline oop ModRefBarrierSet::AccessBarrier<decorators, BarrierSetT>:: 70 oop_atomic_cmpxchg_in_heap(T* addr, oop compare_value, oop new_value) { 71 BarrierSetT *bs = barrier_set_cast<BarrierSetT>(barrier_set()); 72 bs->template write_ref_field_pre<decorators>(addr); 73 oop result = Raw::oop_atomic_cmpxchg(addr, compare_value, new_value); 74 if (result == compare_value) { 75 bs->template write_ref_field_post<decorators>(addr, new_value); 76 } 77 return result; 78 } 79 80 template <DecoratorSet decorators, typename BarrierSetT> 81 template <typename T> 82 inline oop ModRefBarrierSet::AccessBarrier<decorators, BarrierSetT>:: 83 oop_atomic_xchg_in_heap(T* addr, oop new_value) { 84 BarrierSetT *bs = barrier_set_cast<BarrierSetT>(barrier_set()); 85 bs->template write_ref_field_pre<decorators>(addr); 86 oop result = Raw::oop_atomic_xchg(addr, new_value); 87 bs->template write_ref_field_post<decorators>(addr, new_value); 88 return result; 89 } 90 91 template <DecoratorSet decorators, typename BarrierSetT> 92 template <typename T> 93 inline bool ModRefBarrierSet::AccessBarrier<decorators, BarrierSetT>:: 94 oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, 95 arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, 96 size_t length) { 97 BarrierSetT *bs = barrier_set_cast<BarrierSetT>(barrier_set()); 98 99 src_raw = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw); 100 dst_raw = arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw); 101 102 if (!HasDecorator<decorators, ARRAYCOPY_CHECKCAST>::value) { 103 // Optimized covariant case 104 bs->write_ref_array_pre(dst_raw, length, 105 HasDecorator<decorators, IS_DEST_UNINITIALIZED>::value); 106 Raw::oop_arraycopy(NULL, 0, src_raw, NULL, 0, dst_raw, length); |