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