src/hotspot/share/oops/accessBackend.inline.hpp
changeset 49383 bf2ff45e592f
parent 48628 69d65d9dcadb
child 49454 689ebcfe04fd
equal deleted inserted replaced
49382:3875d7b926a8 49383:bf2ff45e592f
   116 }
   116 }
   117 
   117 
   118 template <DecoratorSet decorators>
   118 template <DecoratorSet decorators>
   119 template <typename T>
   119 template <typename T>
   120 inline bool RawAccessBarrier<decorators>::oop_arraycopy(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) {
   120 inline bool RawAccessBarrier<decorators>::oop_arraycopy(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) {
   121   return arraycopy(src, dst, length);
   121   return arraycopy(src_obj, dst_obj, src, dst, length);
   122 }
   122 }
   123 
   123 
   124 template <DecoratorSet decorators>
   124 template <DecoratorSet decorators>
   125 inline bool RawAccessBarrier<decorators>::oop_arraycopy(arrayOop src_obj, arrayOop dst_obj, HeapWord* src, HeapWord* dst, size_t length) {
   125 inline bool RawAccessBarrier<decorators>::oop_arraycopy(arrayOop src_obj, arrayOop dst_obj, HeapWord* src, HeapWord* dst, size_t length) {
   126   bool needs_oop_compress = HasDecorator<decorators, INTERNAL_CONVERT_COMPRESSED_OOP>::value &&
   126   bool needs_oop_compress = HasDecorator<decorators, INTERNAL_CONVERT_COMPRESSED_OOP>::value &&
   255 class RawAccessBarrierArrayCopy: public AllStatic {
   255 class RawAccessBarrierArrayCopy: public AllStatic {
   256 public:
   256 public:
   257   template <DecoratorSet decorators, typename T>
   257   template <DecoratorSet decorators, typename T>
   258   static inline typename EnableIf<
   258   static inline typename EnableIf<
   259   HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value>::type
   259   HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value>::type
   260   arraycopy(T* src, T* dst, size_t length) {
   260   arraycopy(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) {
   261     // We do not check for ARRAYCOPY_ATOMIC for oops, because they are unconditionally always atomic.
   261     // We do not check for ARRAYCOPY_ATOMIC for oops, because they are unconditionally always atomic.
   262     if (HasDecorator<decorators, ARRAYCOPY_ARRAYOF>::value) {
   262     if (HasDecorator<decorators, ARRAYCOPY_ARRAYOF>::value) {
   263       AccessInternal::arraycopy_arrayof_conjoint_oops(src, dst, length);
   263       AccessInternal::arraycopy_arrayof_conjoint_oops(src, dst, length);
   264     } else {
   264     } else {
   265       typedef typename HeapOopType<decorators>::type OopType;
   265       typedef typename HeapOopType<decorators>::type OopType;
   269   }
   269   }
   270 
   270 
   271   template <DecoratorSet decorators, typename T>
   271   template <DecoratorSet decorators, typename T>
   272   static inline typename EnableIf<
   272   static inline typename EnableIf<
   273     !HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value>::type
   273     !HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value>::type
   274   arraycopy(T* src, T* dst, size_t length) {
   274   arraycopy(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) {
   275     if (HasDecorator<decorators, ARRAYCOPY_ARRAYOF>::value) {
   275     if (HasDecorator<decorators, ARRAYCOPY_ARRAYOF>::value) {
   276       AccessInternal::arraycopy_arrayof_conjoint(src, dst, length);
   276       AccessInternal::arraycopy_arrayof_conjoint(src, dst, length);
   277     } else if (HasDecorator<decorators, ARRAYCOPY_DISJOINT>::value && sizeof(T) == HeapWordSize) {
   277     } else if (HasDecorator<decorators, ARRAYCOPY_DISJOINT>::value && sizeof(T) == HeapWordSize) {
   278       // There is only a disjoint optimization for word granularity copying
   278       // There is only a disjoint optimization for word granularity copying
   279       if (HasDecorator<decorators, ARRAYCOPY_ATOMIC>::value) {
   279       if (HasDecorator<decorators, ARRAYCOPY_ATOMIC>::value) {
   287       } else {
   287       } else {
   288         AccessInternal::arraycopy_conjoint(src, dst, length);
   288         AccessInternal::arraycopy_conjoint(src, dst, length);
   289       }
   289       }
   290     }
   290     }
   291   }
   291   }
       
   292 
       
   293   template <DecoratorSet decorators>
       
   294   static inline typename EnableIf<
       
   295     !HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value>::type
       
   296   arraycopy(arrayOop src_obj, arrayOop dst_obj, void* src, void* dst, size_t length) {
       
   297     if (HasDecorator<decorators, ARRAYCOPY_ATOMIC>::value) {
       
   298       AccessInternal::arraycopy_conjoint_atomic(src, dst, length);
       
   299     } else {
       
   300       AccessInternal::arraycopy_conjoint(src, dst, length);
       
   301     }
       
   302   }
   292 };
   303 };
   293 
   304 
   294 template <DecoratorSet decorators>
   305 template <DecoratorSet decorators>
   295 template <typename T>
   306 template <typename T>
   296 inline bool RawAccessBarrier<decorators>::arraycopy(T* src, T* dst, size_t length) {
   307 inline bool RawAccessBarrier<decorators>::arraycopy(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) {
   297   RawAccessBarrierArrayCopy::arraycopy<decorators>(src, dst, length);
   308   RawAccessBarrierArrayCopy::arraycopy<decorators>(src_obj, dst_obj, src, dst, length);
   298   return true;
   309   return true;
   299 }
   310 }
   300 
   311 
   301 template <DecoratorSet decorators>
   312 template <DecoratorSet decorators>
   302 inline void RawAccessBarrier<decorators>::clone(oop src, oop dst, size_t size) {
   313 inline void RawAccessBarrier<decorators>::clone(oop src, oop dst, size_t size) {