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, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_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, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_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, size_t src_offset_in_bytes, const T* src_raw, arrayOop dst_obj, size_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;
|