114 const DecoratorSet oop_decorators = AS_DECORATOR_MASK | IN_DECORATOR_MASK | 115 (ON_DECORATOR_MASK ^ ON_UNKNOWN_OOP_REF) | // no unknown oop refs outside of the heap 116 IS_ARRAY | IS_NOT_NULL | IS_DEST_UNINITIALIZED; 117 verify_decorators<expected_mo_decorators | oop_decorators>(); 118 } 119 120 template <DecoratorSet expected_mo_decorators> 121 static void verify_heap_oop_decorators() { 122 const DecoratorSet heap_oop_decorators = AS_DECORATOR_MASK | ON_DECORATOR_MASK | 123 IN_HEAP | IS_ARRAY | IS_NOT_NULL; 124 verify_decorators<expected_mo_decorators | heap_oop_decorators>(); 125 } 126 127 static const DecoratorSet load_mo_decorators = MO_UNORDERED | MO_VOLATILE | MO_RELAXED | MO_ACQUIRE | MO_SEQ_CST; 128 static const DecoratorSet store_mo_decorators = MO_UNORDERED | MO_VOLATILE | MO_RELAXED | MO_RELEASE | MO_SEQ_CST; 129 static const DecoratorSet atomic_xchg_mo_decorators = MO_SEQ_CST; 130 static const DecoratorSet atomic_cmpxchg_mo_decorators = MO_RELAXED | MO_SEQ_CST; 131 132 protected: 133 template <typename T> 134 static inline bool oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, 135 arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, 136 size_t length) { 137 verify_decorators<ARRAYCOPY_DECORATOR_MASK | IN_HEAP | 138 AS_DECORATOR_MASK | IS_ARRAY | IS_DEST_UNINITIALIZED>(); 139 return AccessInternal::arraycopy<decorators | INTERNAL_VALUE_IS_OOP>(src_obj, src_offset_in_bytes, src_raw, 140 dst_obj, dst_offset_in_bytes, dst_raw, 141 length); 142 } 143 144 template <typename T> 145 static inline void arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, 146 arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, 147 size_t length) { 148 verify_decorators<ARRAYCOPY_DECORATOR_MASK | IN_HEAP | 149 AS_DECORATOR_MASK | IS_ARRAY>(); 150 AccessInternal::arraycopy<decorators>(src_obj, src_offset_in_bytes, src_raw, 151 dst_obj, dst_offset_in_bytes, dst_raw, 152 length); 153 } 154 155 public: 156 // Primitive heap accesses 157 static inline AccessInternal::LoadAtProxy<decorators> load_at(oop base, ptrdiff_t offset) { 158 verify_primitive_decorators<load_mo_decorators>(); 159 return AccessInternal::LoadAtProxy<decorators>(base, offset); 312 } 313 314 template <typename T> 315 static inline void arraycopy_to_native(arrayOop src_obj, size_t src_offset_in_bytes, 316 T* dst, 317 size_t length) { 318 AccessT::arraycopy(src_obj, src_offset_in_bytes, reinterpret_cast<const T*>(NULL), 319 NULL, 0, dst, 320 length); 321 } 322 323 template <typename T> 324 static inline void arraycopy_from_native(const T* src, 325 arrayOop dst_obj, size_t dst_offset_in_bytes, 326 size_t length) { 327 AccessT::arraycopy(NULL, 0, src, 328 dst_obj, dst_offset_in_bytes, reinterpret_cast<T*>(NULL), 329 length); 330 } 331 332 static inline bool oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, 333 arrayOop dst_obj, size_t dst_offset_in_bytes, 334 size_t length) { 335 return AccessT::oop_arraycopy(src_obj, src_offset_in_bytes, reinterpret_cast<const HeapWord*>(NULL), 336 dst_obj, dst_offset_in_bytes, reinterpret_cast<HeapWord*>(NULL), 337 length); 338 } 339 340 template <typename T> 341 static inline bool oop_arraycopy_raw(T* src, T* dst, size_t length) { 342 return AccessT::oop_arraycopy(NULL, 0, src, 343 NULL, 0, dst, 344 length); 345 } 346 347 }; 348 349 template <DecoratorSet decorators> 350 template <DecoratorSet expected_decorators> 351 void Access<decorators>::verify_decorators() { 352 STATIC_ASSERT((~expected_decorators & decorators) == 0); // unexpected decorator used 353 const DecoratorSet barrier_strength_decorators = decorators & AS_DECORATOR_MASK; 354 STATIC_ASSERT(barrier_strength_decorators == 0 || ( // make sure barrier strength decorators are disjoint if set 355 (barrier_strength_decorators ^ AS_NO_KEEPALIVE) == 0 || 356 (barrier_strength_decorators ^ AS_RAW) == 0 || 357 (barrier_strength_decorators ^ AS_NORMAL) == 0 358 )); 359 const DecoratorSet ref_strength_decorators = decorators & ON_DECORATOR_MASK; 360 STATIC_ASSERT(ref_strength_decorators == 0 || ( // make sure ref strength decorators are disjoint if set 361 (ref_strength_decorators ^ ON_STRONG_OOP_REF) == 0 || 362 (ref_strength_decorators ^ ON_WEAK_OOP_REF) == 0 || | 114 const DecoratorSet oop_decorators = AS_DECORATOR_MASK | IN_DECORATOR_MASK | 115 (ON_DECORATOR_MASK ^ ON_UNKNOWN_OOP_REF) | // no unknown oop refs outside of the heap 116 IS_ARRAY | IS_NOT_NULL | IS_DEST_UNINITIALIZED; 117 verify_decorators<expected_mo_decorators | oop_decorators>(); 118 } 119 120 template <DecoratorSet expected_mo_decorators> 121 static void verify_heap_oop_decorators() { 122 const DecoratorSet heap_oop_decorators = AS_DECORATOR_MASK | ON_DECORATOR_MASK | 123 IN_HEAP | IS_ARRAY | IS_NOT_NULL; 124 verify_decorators<expected_mo_decorators | heap_oop_decorators>(); 125 } 126 127 static const DecoratorSet load_mo_decorators = MO_UNORDERED | MO_VOLATILE | MO_RELAXED | MO_ACQUIRE | MO_SEQ_CST; 128 static const DecoratorSet store_mo_decorators = MO_UNORDERED | MO_VOLATILE | MO_RELAXED | MO_RELEASE | MO_SEQ_CST; 129 static const DecoratorSet atomic_xchg_mo_decorators = MO_SEQ_CST; 130 static const DecoratorSet atomic_cmpxchg_mo_decorators = MO_RELAXED | MO_SEQ_CST; 131 132 protected: 133 template <typename T> 134 static inline void oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, 135 arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, 136 size_t length) { 137 verify_decorators<ARRAYCOPY_DECORATOR_MASK | IN_HEAP | 138 AS_DECORATOR_MASK | IS_ARRAY | IS_DEST_UNINITIALIZED>(); 139 AccessInternal::arraycopy<decorators | INTERNAL_VALUE_IS_OOP>(src_obj, src_offset_in_bytes, src_raw, 140 dst_obj, dst_offset_in_bytes, dst_raw, 141 length); 142 } 143 144 template <typename T> 145 static inline void arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, 146 arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, 147 size_t length) { 148 verify_decorators<ARRAYCOPY_DECORATOR_MASK | IN_HEAP | 149 AS_DECORATOR_MASK | IS_ARRAY>(); 150 AccessInternal::arraycopy<decorators>(src_obj, src_offset_in_bytes, src_raw, 151 dst_obj, dst_offset_in_bytes, dst_raw, 152 length); 153 } 154 155 public: 156 // Primitive heap accesses 157 static inline AccessInternal::LoadAtProxy<decorators> load_at(oop base, ptrdiff_t offset) { 158 verify_primitive_decorators<load_mo_decorators>(); 159 return AccessInternal::LoadAtProxy<decorators>(base, offset); 312 } 313 314 template <typename T> 315 static inline void arraycopy_to_native(arrayOop src_obj, size_t src_offset_in_bytes, 316 T* dst, 317 size_t length) { 318 AccessT::arraycopy(src_obj, src_offset_in_bytes, reinterpret_cast<const T*>(NULL), 319 NULL, 0, dst, 320 length); 321 } 322 323 template <typename T> 324 static inline void arraycopy_from_native(const T* src, 325 arrayOop dst_obj, size_t dst_offset_in_bytes, 326 size_t length) { 327 AccessT::arraycopy(NULL, 0, src, 328 dst_obj, dst_offset_in_bytes, reinterpret_cast<T*>(NULL), 329 length); 330 } 331 332 static inline void oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, 333 arrayOop dst_obj, size_t dst_offset_in_bytes, 334 size_t length) { 335 AccessT::oop_arraycopy(src_obj, src_offset_in_bytes, reinterpret_cast<const HeapWord*>(NULL), 336 dst_obj, dst_offset_in_bytes, reinterpret_cast<HeapWord*>(NULL), 337 length); 338 } 339 340 template <typename T> 341 static inline void oop_arraycopy_raw(T* src, T* dst, size_t length) { 342 AccessT::oop_arraycopy(NULL, 0, src, 343 NULL, 0, dst, 344 length); 345 } 346 347 }; 348 349 template <DecoratorSet decorators> 350 template <DecoratorSet expected_decorators> 351 void Access<decorators>::verify_decorators() { 352 STATIC_ASSERT((~expected_decorators & decorators) == 0); // unexpected decorator used 353 const DecoratorSet barrier_strength_decorators = decorators & AS_DECORATOR_MASK; 354 STATIC_ASSERT(barrier_strength_decorators == 0 || ( // make sure barrier strength decorators are disjoint if set 355 (barrier_strength_decorators ^ AS_NO_KEEPALIVE) == 0 || 356 (barrier_strength_decorators ^ AS_RAW) == 0 || 357 (barrier_strength_decorators ^ AS_NORMAL) == 0 358 )); 359 const DecoratorSet ref_strength_decorators = decorators & ON_DECORATOR_MASK; 360 STATIC_ASSERT(ref_strength_decorators == 0 || ( // make sure ref strength decorators are disjoint if set 361 (ref_strength_decorators ^ ON_STRONG_OOP_REF) == 0 || 362 (ref_strength_decorators ^ ON_WEAK_OOP_REF) == 0 || |