106 template <class GCBarrierType, DecoratorSet decorators> 107 struct PostRuntimeDispatch<GCBarrierType, BARRIER_ATOMIC_CMPXCHG, decorators>: public AllStatic { 108 template <typename T> 109 static T access_barrier(T new_value, void* addr, T compare_value) { 110 return GCBarrierType::atomic_cmpxchg_in_heap(new_value, reinterpret_cast<T*>(addr), compare_value); 111 } 112 113 static oop oop_access_barrier(oop new_value, void* addr, oop compare_value) { 114 typedef typename HeapOopType<decorators>::type OopType; 115 if (HasDecorator<decorators, IN_HEAP>::value) { 116 return GCBarrierType::oop_atomic_cmpxchg_in_heap(new_value, reinterpret_cast<OopType*>(addr), compare_value); 117 } else { 118 return GCBarrierType::oop_atomic_cmpxchg_not_in_heap(new_value, reinterpret_cast<OopType*>(addr), compare_value); 119 } 120 } 121 }; 122 123 template <class GCBarrierType, DecoratorSet decorators> 124 struct PostRuntimeDispatch<GCBarrierType, BARRIER_ARRAYCOPY, decorators>: public AllStatic { 125 template <typename T> 126 static bool access_barrier(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) { 127 GCBarrierType::arraycopy_in_heap(src_obj, dst_obj, src, dst, length); 128 return true; 129 } 130 131 template <typename T> 132 static bool oop_access_barrier(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) { 133 typedef typename HeapOopType<decorators>::type OopType; 134 return GCBarrierType::oop_arraycopy_in_heap(src_obj, dst_obj, 135 reinterpret_cast<OopType*>(src), 136 reinterpret_cast<OopType*>(dst), length); 137 } 138 }; 139 140 template <class GCBarrierType, DecoratorSet decorators> 141 struct PostRuntimeDispatch<GCBarrierType, BARRIER_STORE_AT, decorators>: public AllStatic { 142 template <typename T> 143 static void access_barrier(oop base, ptrdiff_t offset, T value) { 144 GCBarrierType::store_in_heap_at(base, offset, value); 145 } 146 147 static void oop_access_barrier(oop base, ptrdiff_t offset, oop value) { 148 GCBarrierType::oop_store_in_heap_at(base, offset, value); 149 } 150 }; 151 152 template <class GCBarrierType, DecoratorSet decorators> 153 struct PostRuntimeDispatch<GCBarrierType, BARRIER_LOAD_AT, decorators>: public AllStatic { 154 template <typename T> 155 static T access_barrier(oop base, ptrdiff_t offset) { 156 return GCBarrierType::template load_in_heap_at<T>(base, offset); 320 func_t function = BarrierResolver<decorators, func_t, BARRIER_ATOMIC_CMPXCHG_AT>::resolve_barrier(); 321 _atomic_cmpxchg_at_func = function; 322 return function(new_value, base, offset, compare_value); 323 } 324 325 template <DecoratorSet decorators, typename T> 326 T RuntimeDispatch<decorators, T, BARRIER_ATOMIC_XCHG>::atomic_xchg_init(T new_value, void* addr) { 327 func_t function = BarrierResolver<decorators, func_t, BARRIER_ATOMIC_XCHG>::resolve_barrier(); 328 _atomic_xchg_func = function; 329 return function(new_value, addr); 330 } 331 332 template <DecoratorSet decorators, typename T> 333 T RuntimeDispatch<decorators, T, BARRIER_ATOMIC_XCHG_AT>::atomic_xchg_at_init(T new_value, oop base, ptrdiff_t offset) { 334 func_t function = BarrierResolver<decorators, func_t, BARRIER_ATOMIC_XCHG_AT>::resolve_barrier(); 335 _atomic_xchg_at_func = function; 336 return function(new_value, base, offset); 337 } 338 339 template <DecoratorSet decorators, typename T> 340 bool RuntimeDispatch<decorators, T, BARRIER_ARRAYCOPY>::arraycopy_init(arrayOop src_obj, arrayOop dst_obj, T *src, T* dst, size_t length) { 341 func_t function = BarrierResolver<decorators, func_t, BARRIER_ARRAYCOPY>::resolve_barrier(); 342 _arraycopy_func = function; 343 return function(src_obj, dst_obj, src, dst, length); 344 } 345 346 template <DecoratorSet decorators, typename T> 347 void RuntimeDispatch<decorators, T, BARRIER_CLONE>::clone_init(oop src, oop dst, size_t size) { 348 func_t function = BarrierResolver<decorators, func_t, BARRIER_CLONE>::resolve_barrier(); 349 _clone_func = function; 350 function(src, dst, size); 351 } 352 353 template <DecoratorSet decorators, typename T> 354 oop RuntimeDispatch<decorators, T, BARRIER_RESOLVE>::resolve_init(oop obj) { 355 func_t function = BarrierResolver<decorators, func_t, BARRIER_RESOLVE>::resolve_barrier(); 356 _resolve_func = function; 357 return function(obj); 358 } 359 360 template <DecoratorSet decorators, typename T> 361 bool RuntimeDispatch<decorators, T, BARRIER_EQUALS>::equals_init(oop o1, oop o2) { 362 func_t function = BarrierResolver<decorators, func_t, BARRIER_EQUALS>::resolve_barrier(); 363 _equals_func = function; | 106 template <class GCBarrierType, DecoratorSet decorators> 107 struct PostRuntimeDispatch<GCBarrierType, BARRIER_ATOMIC_CMPXCHG, decorators>: public AllStatic { 108 template <typename T> 109 static T access_barrier(T new_value, void* addr, T compare_value) { 110 return GCBarrierType::atomic_cmpxchg_in_heap(new_value, reinterpret_cast<T*>(addr), compare_value); 111 } 112 113 static oop oop_access_barrier(oop new_value, void* addr, oop compare_value) { 114 typedef typename HeapOopType<decorators>::type OopType; 115 if (HasDecorator<decorators, IN_HEAP>::value) { 116 return GCBarrierType::oop_atomic_cmpxchg_in_heap(new_value, reinterpret_cast<OopType*>(addr), compare_value); 117 } else { 118 return GCBarrierType::oop_atomic_cmpxchg_not_in_heap(new_value, reinterpret_cast<OopType*>(addr), compare_value); 119 } 120 } 121 }; 122 123 template <class GCBarrierType, DecoratorSet decorators> 124 struct PostRuntimeDispatch<GCBarrierType, BARRIER_ARRAYCOPY, decorators>: public AllStatic { 125 template <typename T> 126 static bool access_barrier(arrayOop src_obj, ptrdiff_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, ptrdiff_t dst_offset_in_bytes, T* dst_raw, size_t length) { 127 GCBarrierType::arraycopy_in_heap(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); 128 return true; 129 } 130 131 template <typename T> 132 static bool oop_access_barrier(arrayOop src_obj, ptrdiff_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, ptrdiff_t dst_offset_in_bytes, T* dst_raw, size_t length) { 133 typedef typename HeapOopType<decorators>::type OopType; 134 return GCBarrierType::oop_arraycopy_in_heap(src_obj, src_offset_in_bytes, reinterpret_cast<const OopType*>(src_raw), 135 dst_obj, dst_offset_in_bytes, reinterpret_cast<OopType*>(dst_raw), length); 136 } 137 }; 138 139 template <class GCBarrierType, DecoratorSet decorators> 140 struct PostRuntimeDispatch<GCBarrierType, BARRIER_STORE_AT, decorators>: public AllStatic { 141 template <typename T> 142 static void access_barrier(oop base, ptrdiff_t offset, T value) { 143 GCBarrierType::store_in_heap_at(base, offset, value); 144 } 145 146 static void oop_access_barrier(oop base, ptrdiff_t offset, oop value) { 147 GCBarrierType::oop_store_in_heap_at(base, offset, value); 148 } 149 }; 150 151 template <class GCBarrierType, DecoratorSet decorators> 152 struct PostRuntimeDispatch<GCBarrierType, BARRIER_LOAD_AT, decorators>: public AllStatic { 153 template <typename T> 154 static T access_barrier(oop base, ptrdiff_t offset) { 155 return GCBarrierType::template load_in_heap_at<T>(base, offset); 319 func_t function = BarrierResolver<decorators, func_t, BARRIER_ATOMIC_CMPXCHG_AT>::resolve_barrier(); 320 _atomic_cmpxchg_at_func = function; 321 return function(new_value, base, offset, compare_value); 322 } 323 324 template <DecoratorSet decorators, typename T> 325 T RuntimeDispatch<decorators, T, BARRIER_ATOMIC_XCHG>::atomic_xchg_init(T new_value, void* addr) { 326 func_t function = BarrierResolver<decorators, func_t, BARRIER_ATOMIC_XCHG>::resolve_barrier(); 327 _atomic_xchg_func = function; 328 return function(new_value, addr); 329 } 330 331 template <DecoratorSet decorators, typename T> 332 T RuntimeDispatch<decorators, T, BARRIER_ATOMIC_XCHG_AT>::atomic_xchg_at_init(T new_value, oop base, ptrdiff_t offset) { 333 func_t function = BarrierResolver<decorators, func_t, BARRIER_ATOMIC_XCHG_AT>::resolve_barrier(); 334 _atomic_xchg_at_func = function; 335 return function(new_value, base, offset); 336 } 337 338 template <DecoratorSet decorators, typename T> 339 bool RuntimeDispatch<decorators, T, BARRIER_ARRAYCOPY>::arraycopy_init(arrayOop src_obj, ptrdiff_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, ptrdiff_t dst_offset_in_bytes, T* dst_raw, size_t length) { 340 func_t function = BarrierResolver<decorators, func_t, BARRIER_ARRAYCOPY>::resolve_barrier(); 341 _arraycopy_func = function; 342 return function(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); 343 } 344 345 template <DecoratorSet decorators, typename T> 346 void RuntimeDispatch<decorators, T, BARRIER_CLONE>::clone_init(oop src, oop dst, size_t size) { 347 func_t function = BarrierResolver<decorators, func_t, BARRIER_CLONE>::resolve_barrier(); 348 _clone_func = function; 349 function(src, dst, size); 350 } 351 352 template <DecoratorSet decorators, typename T> 353 oop RuntimeDispatch<decorators, T, BARRIER_RESOLVE>::resolve_init(oop obj) { 354 func_t function = BarrierResolver<decorators, func_t, BARRIER_RESOLVE>::resolve_barrier(); 355 _resolve_func = function; 356 return function(obj); 357 } 358 359 template <DecoratorSet decorators, typename T> 360 bool RuntimeDispatch<decorators, T, BARRIER_EQUALS>::equals_init(oop o1, oop o2) { 361 func_t function = BarrierResolver<decorators, func_t, BARRIER_EQUALS>::resolve_barrier(); 362 _equals_func = function; |