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