diff --git a/src/hotspot/share/oops/accessBackend.inline.hpp b/src/hotspot/share/oops/accessBackend.inline.hpp index 51ad1b5..8305b89 100644 --- a/src/hotspot/share/oops/accessBackend.inline.hpp +++ b/src/hotspot/share/oops/accessBackend.inline.hpp @@ -247,14 +247,14 @@ RawAccessBarrier::atomic_cmpxchg_maybe_locked(T new_value, void* addr, T com } class RawAccessBarrierArrayCopy: public AllStatic { + template struct IsHeapWordSized: public IntegralConstant { }; public: template static inline typename EnableIf< - HasDecorator::value>::type + HasDecorator::value>::type arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) { - src_raw = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw); dst_raw = arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw); @@ -270,48 +270,68 @@ public: template static inline typename EnableIf< - !HasDecorator::value>::type - arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) { + !HasDecorator::value && + HasDecorator::value>::type + arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { + src_raw = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw); + dst_raw = arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw); + + AccessInternal::arraycopy_arrayof_conjoint(src_raw, dst_raw, length); + } + template + static inline typename EnableIf< + !HasDecorator::value && + HasDecorator::value && IsHeapWordSized::value>::type + arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { src_raw = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw); dst_raw = arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw); - if (HasDecorator::value) { - AccessInternal::arraycopy_arrayof_conjoint(const_cast(src_raw), dst_raw, length); - } else if (HasDecorator::value && sizeof(T) == HeapWordSize) { - // There is only a disjoint optimization for word granularity copying - if (HasDecorator::value) { - AccessInternal::arraycopy_disjoint_words_atomic(const_cast(src_raw), dst_raw, length); - } else { - AccessInternal::arraycopy_disjoint_words(const_cast(src_raw), dst_raw, length); - } + // There is only a disjoint optimization for word granularity copying + if (HasDecorator::value) { + AccessInternal::arraycopy_disjoint_words_atomic(src_raw, dst_raw, length); } else { - if (HasDecorator::value) { - AccessInternal::arraycopy_conjoint_atomic(const_cast(src_raw), dst_raw, length); - } else { - AccessInternal::arraycopy_conjoint(const_cast(src_raw), dst_raw, length); - } + AccessInternal::arraycopy_disjoint_words(src_raw, dst_raw, length); } } - template + template static inline typename EnableIf< - !HasDecorator::value>::type - arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const void* src_raw, - arrayOop dst_obj, size_t dst_offset_in_bytes, void* dst_raw, + !HasDecorator::value && + !(HasDecorator::value && IsHeapWordSized::value) && + !HasDecorator::value && + !HasDecorator::value>::type + arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, size_t length) { + src_raw = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw); + dst_raw = arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw); + AccessInternal::arraycopy_conjoint(src_raw, dst_raw, length); + } + + template + static inline typename EnableIf< + !HasDecorator::value && + !(HasDecorator::value && IsHeapWordSized::value) && + !HasDecorator::value && + HasDecorator::value>::type + arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, + arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, + size_t length) { src_raw = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw); dst_raw = arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw); - if (HasDecorator::value) { - AccessInternal::arraycopy_conjoint_atomic(const_cast(src_raw), dst_raw, length); - } else { - AccessInternal::arraycopy_conjoint(const_cast(src_raw), dst_raw, length); - } + AccessInternal::arraycopy_conjoint_atomic(src_raw, dst_raw, length); } }; +template<> struct RawAccessBarrierArrayCopy::IsHeapWordSized: public IntegralConstant { }; + template template inline bool RawAccessBarrier::arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw,