author | stefank |
Mon, 26 Aug 2019 09:13:38 +0200 | |
changeset 57875 | 427b38332f20 |
parent 53075 | 747d29313e5a |
child 58176 | 470af058bd5f |
permissions | -rw-r--r-- |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
1 |
/* |
48628
69d65d9dcadb
8193063: Enabling narrowOop values for RawAccess accesses
eosterlund
parents:
48019
diff
changeset
|
2 |
* Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
4 |
* |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
7 |
* published by the Free Software Foundation. |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
8 |
* |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
9 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
10 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
11 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
12 |
* version 2 for more details (a copy is included in the LICENSE file that |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
13 |
* accompanied this code). |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
14 |
* |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
15 |
* You should have received a copy of the GNU General Public License version |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
16 |
* 2 along with this work; if not, write to the Free Software Foundation, |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
17 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
18 |
* |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
19 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
20 |
* or visit www.oracle.com if you need additional information or have any |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
21 |
* questions. |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
22 |
* |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
23 |
*/ |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
24 |
|
49658 | 25 |
#ifndef SHARE_OOPS_ACCESSBACKEND_HPP |
26 |
#define SHARE_OOPS_ACCESSBACKEND_HPP |
|
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
27 |
|
49658 | 28 |
#include "gc/shared/barrierSetConfig.hpp" |
29 |
#include "memory/allocation.hpp" |
|
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
30 |
#include "metaprogramming/conditional.hpp" |
49658 | 31 |
#include "metaprogramming/decay.hpp" |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
32 |
#include "metaprogramming/enableIf.hpp" |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
33 |
#include "metaprogramming/integralConstant.hpp" |
49658 | 34 |
#include "metaprogramming/isFloatingPoint.hpp" |
35 |
#include "metaprogramming/isIntegral.hpp" |
|
36 |
#include "metaprogramming/isPointer.hpp" |
|
48628
69d65d9dcadb
8193063: Enabling narrowOop values for RawAccess accesses
eosterlund
parents:
48019
diff
changeset
|
37 |
#include "metaprogramming/isSame.hpp" |
49658 | 38 |
#include "metaprogramming/isVolatile.hpp" |
39 |
#include "oops/accessDecorators.hpp" |
|
40 |
#include "oops/oopsHierarchy.hpp" |
|
57875
427b38332f20
8229836: Remove include of globals.hpp from allocation.hpp
stefank
parents:
53075
diff
changeset
|
41 |
#include "runtime/globals.hpp" |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
42 |
#include "utilities/debug.hpp" |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
43 |
#include "utilities/globalDefinitions.hpp" |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
44 |
|
49658 | 45 |
|
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
46 |
// This metafunction returns either oop or narrowOop depending on whether |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
47 |
// an access needs to use compressed oops or not. |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
48 |
template <DecoratorSet decorators> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
49 |
struct HeapOopType: AllStatic { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
50 |
static const bool needs_oop_compress = HasDecorator<decorators, INTERNAL_CONVERT_COMPRESSED_OOP>::value && |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
51 |
HasDecorator<decorators, INTERNAL_RT_USE_COMPRESSED_OOPS>::value; |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
52 |
typedef typename Conditional<needs_oop_compress, narrowOop, oop>::type type; |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
53 |
}; |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
54 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
55 |
namespace AccessInternal { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
56 |
enum BarrierType { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
57 |
BARRIER_STORE, |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
58 |
BARRIER_STORE_AT, |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
59 |
BARRIER_LOAD, |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
60 |
BARRIER_LOAD_AT, |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
61 |
BARRIER_ATOMIC_CMPXCHG, |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
62 |
BARRIER_ATOMIC_CMPXCHG_AT, |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
63 |
BARRIER_ATOMIC_XCHG, |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
64 |
BARRIER_ATOMIC_XCHG_AT, |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
65 |
BARRIER_ARRAYCOPY, |
49041
44122f767467
8198286: Direct memory accessors in typeArrayOop.hpp should use Access API
eosterlund
parents:
48628
diff
changeset
|
66 |
BARRIER_CLONE, |
49658 | 67 |
BARRIER_RESOLVE, |
68 |
BARRIER_EQUALS |
|
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
69 |
}; |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
70 |
|
48628
69d65d9dcadb
8193063: Enabling narrowOop values for RawAccess accesses
eosterlund
parents:
48019
diff
changeset
|
71 |
template <DecoratorSet decorators, typename T> |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
72 |
struct MustConvertCompressedOop: public IntegralConstant<bool, |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
73 |
HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value && |
48628
69d65d9dcadb
8193063: Enabling narrowOop values for RawAccess accesses
eosterlund
parents:
48019
diff
changeset
|
74 |
IsSame<typename HeapOopType<decorators>::type, narrowOop>::value && |
69d65d9dcadb
8193063: Enabling narrowOop values for RawAccess accesses
eosterlund
parents:
48019
diff
changeset
|
75 |
IsSame<T, oop>::value> {}; |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
76 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
77 |
// This metafunction returns an appropriate oop type if the value is oop-like |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
78 |
// and otherwise returns the same type T. |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
79 |
template <DecoratorSet decorators, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
80 |
struct EncodedType: AllStatic { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
81 |
typedef typename Conditional< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
82 |
HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value, |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
83 |
typename HeapOopType<decorators>::type, T>::type type; |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
84 |
}; |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
85 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
86 |
template <DecoratorSet decorators> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
87 |
inline typename HeapOopType<decorators>::type* |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
88 |
oop_field_addr(oop base, ptrdiff_t byte_offset) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
89 |
return reinterpret_cast<typename HeapOopType<decorators>::type*>( |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
90 |
reinterpret_cast<intptr_t>((void*)base) + byte_offset); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
91 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
92 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
93 |
// This metafunction returns whether it is possible for a type T to require |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
94 |
// locking to support wide atomics or not. |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
95 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
96 |
#ifdef SUPPORTS_NATIVE_CX8 |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
97 |
struct PossiblyLockedAccess: public IntegralConstant<bool, false> {}; |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
98 |
#else |
48019
827e4ac05579
8191663: Zero variant broken after 8189170 and 8189871
glaubitz
parents:
47998
diff
changeset
|
99 |
struct PossiblyLockedAccess: public IntegralConstant<bool, (sizeof(T) > 4)> {}; |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
100 |
#endif |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
101 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
102 |
template <DecoratorSet decorators, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
103 |
struct AccessFunctionTypes { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
104 |
typedef T (*load_at_func_t)(oop base, ptrdiff_t offset); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
105 |
typedef void (*store_at_func_t)(oop base, ptrdiff_t offset, T value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
106 |
typedef T (*atomic_cmpxchg_at_func_t)(T new_value, oop base, ptrdiff_t offset, T compare_value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
107 |
typedef T (*atomic_xchg_at_func_t)(T new_value, oop base, ptrdiff_t offset); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
108 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
109 |
typedef T (*load_func_t)(void* addr); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
110 |
typedef void (*store_func_t)(void* addr, T value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
111 |
typedef T (*atomic_cmpxchg_func_t)(T new_value, void* addr, T compare_value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
112 |
typedef T (*atomic_xchg_func_t)(T new_value, void* addr); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
113 |
|
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
114 |
typedef bool (*arraycopy_func_t)(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
115 |
arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
116 |
size_t length); |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
117 |
typedef void (*clone_func_t)(oop src, oop dst, size_t size); |
49041
44122f767467
8198286: Direct memory accessors in typeArrayOop.hpp should use Access API
eosterlund
parents:
48628
diff
changeset
|
118 |
typedef oop (*resolve_func_t)(oop obj); |
49658 | 119 |
typedef bool (*equals_func_t)(oop o1, oop o2); |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
120 |
}; |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
121 |
|
49383
bf2ff45e592f
8198445: Access API for primitive/native arraycopy
rkennke
parents:
49364
diff
changeset
|
122 |
template <DecoratorSet decorators> |
bf2ff45e592f
8198445: Access API for primitive/native arraycopy
rkennke
parents:
49364
diff
changeset
|
123 |
struct AccessFunctionTypes<decorators, void> { |
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
124 |
typedef bool (*arraycopy_func_t)(arrayOop src_obj, size_t src_offset_in_bytes, void* src, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
125 |
arrayOop dst_obj, size_t dst_offset_in_bytes, void* dst, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
126 |
size_t length); |
49383
bf2ff45e592f
8198445: Access API for primitive/native arraycopy
rkennke
parents:
49364
diff
changeset
|
127 |
}; |
bf2ff45e592f
8198445: Access API for primitive/native arraycopy
rkennke
parents:
49364
diff
changeset
|
128 |
|
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
129 |
template <DecoratorSet decorators, typename T, BarrierType barrier> struct AccessFunction {}; |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
130 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
131 |
#define ACCESS_GENERATE_ACCESS_FUNCTION(bt, func) \ |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
132 |
template <DecoratorSet decorators, typename T> \ |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
133 |
struct AccessFunction<decorators, T, bt>: AllStatic{ \ |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
134 |
typedef typename AccessFunctionTypes<decorators, T>::func type; \ |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
135 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
136 |
ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_STORE, store_func_t); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
137 |
ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_STORE_AT, store_at_func_t); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
138 |
ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_LOAD, load_func_t); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
139 |
ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_LOAD_AT, load_at_func_t); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
140 |
ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_ATOMIC_CMPXCHG, atomic_cmpxchg_func_t); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
141 |
ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_ATOMIC_CMPXCHG_AT, atomic_cmpxchg_at_func_t); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
142 |
ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_ATOMIC_XCHG, atomic_xchg_func_t); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
143 |
ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_ATOMIC_XCHG_AT, atomic_xchg_at_func_t); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
144 |
ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_ARRAYCOPY, arraycopy_func_t); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
145 |
ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_CLONE, clone_func_t); |
49041
44122f767467
8198286: Direct memory accessors in typeArrayOop.hpp should use Access API
eosterlund
parents:
48628
diff
changeset
|
146 |
ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_RESOLVE, resolve_func_t); |
49658 | 147 |
ACCESS_GENERATE_ACCESS_FUNCTION(BARRIER_EQUALS, equals_func_t); |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
148 |
#undef ACCESS_GENERATE_ACCESS_FUNCTION |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
149 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
150 |
template <DecoratorSet decorators, typename T, BarrierType barrier_type> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
151 |
typename AccessFunction<decorators, T, barrier_type>::type resolve_barrier(); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
152 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
153 |
template <DecoratorSet decorators, typename T, BarrierType barrier_type> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
154 |
typename AccessFunction<decorators, T, barrier_type>::type resolve_oop_barrier(); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
155 |
|
49364
601146c66cad
8173070: Remove ValueObj class for allocation subclassing for runtime code
coleenp
parents:
49041
diff
changeset
|
156 |
class AccessLocker { |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
157 |
public: |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
158 |
AccessLocker(); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
159 |
~AccessLocker(); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
160 |
}; |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
161 |
bool wide_atomic_needs_locking(); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
162 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
163 |
void* field_addr(oop base, ptrdiff_t offset); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
164 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
165 |
// Forward calls to Copy:: in the cpp file to reduce dependencies and allow |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
166 |
// faster build times, given how frequently included access is. |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
167 |
void arraycopy_arrayof_conjoint_oops(void* src, void* dst, size_t length); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
168 |
void arraycopy_conjoint_oops(oop* src, oop* dst, size_t length); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
169 |
void arraycopy_conjoint_oops(narrowOop* src, narrowOop* dst, size_t length); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
170 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
171 |
void arraycopy_disjoint_words(void* src, void* dst, size_t length); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
172 |
void arraycopy_disjoint_words_atomic(void* src, void* dst, size_t length); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
173 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
174 |
template<typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
175 |
void arraycopy_conjoint(T* src, T* dst, size_t length); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
176 |
template<typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
177 |
void arraycopy_arrayof_conjoint(T* src, T* dst, size_t length); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
178 |
template<typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
179 |
void arraycopy_conjoint_atomic(T* src, T* dst, size_t length); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
180 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
181 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
182 |
// This mask specifies what decorators are relevant for raw accesses. When passing |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
183 |
// accesses to the raw layer, irrelevant decorators are removed. |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
184 |
const DecoratorSet RAW_DECORATOR_MASK = INTERNAL_DECORATOR_MASK | MO_DECORATOR_MASK | |
50728 | 185 |
ARRAYCOPY_DECORATOR_MASK | IS_NOT_NULL; |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
186 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
187 |
// The RawAccessBarrier performs raw accesses with additional knowledge of |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
188 |
// memory ordering, so that OrderAccess/Atomic is called when necessary. |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
189 |
// It additionally handles compressed oops, and hence is not completely "raw" |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
190 |
// strictly speaking. |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
191 |
template <DecoratorSet decorators> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
192 |
class RawAccessBarrier: public AllStatic { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
193 |
protected: |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
194 |
static inline void* field_addr(oop base, ptrdiff_t byte_offset) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
195 |
return AccessInternal::field_addr(base, byte_offset); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
196 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
197 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
198 |
protected: |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
199 |
// Only encode if INTERNAL_VALUE_IS_OOP |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
200 |
template <DecoratorSet idecorators, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
201 |
static inline typename EnableIf< |
48628
69d65d9dcadb
8193063: Enabling narrowOop values for RawAccess accesses
eosterlund
parents:
48019
diff
changeset
|
202 |
AccessInternal::MustConvertCompressedOop<idecorators, T>::value, |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
203 |
typename HeapOopType<idecorators>::type>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
204 |
encode_internal(T value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
205 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
206 |
template <DecoratorSet idecorators, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
207 |
static inline typename EnableIf< |
48628
69d65d9dcadb
8193063: Enabling narrowOop values for RawAccess accesses
eosterlund
parents:
48019
diff
changeset
|
208 |
!AccessInternal::MustConvertCompressedOop<idecorators, T>::value, T>::type |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
209 |
encode_internal(T value) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
210 |
return value; |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
211 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
212 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
213 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
214 |
static inline typename AccessInternal::EncodedType<decorators, T>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
215 |
encode(T value) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
216 |
return encode_internal<decorators, T>(value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
217 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
218 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
219 |
// Only decode if INTERNAL_VALUE_IS_OOP |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
220 |
template <DecoratorSet idecorators, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
221 |
static inline typename EnableIf< |
48628
69d65d9dcadb
8193063: Enabling narrowOop values for RawAccess accesses
eosterlund
parents:
48019
diff
changeset
|
222 |
AccessInternal::MustConvertCompressedOop<idecorators, T>::value, T>::type |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
223 |
decode_internal(typename HeapOopType<idecorators>::type value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
224 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
225 |
template <DecoratorSet idecorators, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
226 |
static inline typename EnableIf< |
48628
69d65d9dcadb
8193063: Enabling narrowOop values for RawAccess accesses
eosterlund
parents:
48019
diff
changeset
|
227 |
!AccessInternal::MustConvertCompressedOop<idecorators, T>::value, T>::type |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
228 |
decode_internal(T value) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
229 |
return value; |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
230 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
231 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
232 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
233 |
static inline T decode(typename AccessInternal::EncodedType<decorators, T>::type value) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
234 |
return decode_internal<decorators, T>(value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
235 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
236 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
237 |
protected: |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
238 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
239 |
static typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
240 |
HasDecorator<ds, MO_SEQ_CST>::value, T>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
241 |
load_internal(void* addr); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
242 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
243 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
244 |
static typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
245 |
HasDecorator<ds, MO_ACQUIRE>::value, T>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
246 |
load_internal(void* addr); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
247 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
248 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
249 |
static typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
250 |
HasDecorator<ds, MO_RELAXED>::value, T>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
251 |
load_internal(void* addr); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
252 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
253 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
254 |
static inline typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
255 |
HasDecorator<ds, MO_VOLATILE>::value, T>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
256 |
load_internal(void* addr) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
257 |
return *reinterpret_cast<const volatile T*>(addr); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
258 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
259 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
260 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
261 |
static inline typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
262 |
HasDecorator<ds, MO_UNORDERED>::value, T>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
263 |
load_internal(void* addr) { |
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
264 |
return *reinterpret_cast<T*>(addr); |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
265 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
266 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
267 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
268 |
static typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
269 |
HasDecorator<ds, MO_SEQ_CST>::value>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
270 |
store_internal(void* addr, T value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
271 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
272 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
273 |
static typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
274 |
HasDecorator<ds, MO_RELEASE>::value>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
275 |
store_internal(void* addr, T value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
276 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
277 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
278 |
static typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
279 |
HasDecorator<ds, MO_RELAXED>::value>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
280 |
store_internal(void* addr, T value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
281 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
282 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
283 |
static inline typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
284 |
HasDecorator<ds, MO_VOLATILE>::value>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
285 |
store_internal(void* addr, T value) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
286 |
(void)const_cast<T&>(*reinterpret_cast<volatile T*>(addr) = value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
287 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
288 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
289 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
290 |
static inline typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
291 |
HasDecorator<ds, MO_UNORDERED>::value>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
292 |
store_internal(void* addr, T value) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
293 |
*reinterpret_cast<T*>(addr) = value; |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
294 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
295 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
296 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
297 |
static typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
298 |
HasDecorator<ds, MO_SEQ_CST>::value, T>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
299 |
atomic_cmpxchg_internal(T new_value, void* addr, T compare_value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
300 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
301 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
302 |
static typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
303 |
HasDecorator<ds, MO_RELAXED>::value, T>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
304 |
atomic_cmpxchg_internal(T new_value, void* addr, T compare_value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
305 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
306 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
307 |
static typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
308 |
HasDecorator<ds, MO_SEQ_CST>::value, T>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
309 |
atomic_xchg_internal(T new_value, void* addr); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
310 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
311 |
// The following *_locked mechanisms serve the purpose of handling atomic operations |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
312 |
// that are larger than a machine can handle, and then possibly opt for using |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
313 |
// a slower path using a mutex to perform the operation. |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
314 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
315 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
316 |
static inline typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
317 |
!AccessInternal::PossiblyLockedAccess<T>::value, T>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
318 |
atomic_cmpxchg_maybe_locked(T new_value, void* addr, T compare_value) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
319 |
return atomic_cmpxchg_internal<ds>(new_value, addr, compare_value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
320 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
321 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
322 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
323 |
static typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
324 |
AccessInternal::PossiblyLockedAccess<T>::value, T>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
325 |
atomic_cmpxchg_maybe_locked(T new_value, void* addr, T compare_value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
326 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
327 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
328 |
static inline typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
329 |
!AccessInternal::PossiblyLockedAccess<T>::value, T>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
330 |
atomic_xchg_maybe_locked(T new_value, void* addr) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
331 |
return atomic_xchg_internal<ds>(new_value, addr); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
332 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
333 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
334 |
template <DecoratorSet ds, typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
335 |
static typename EnableIf< |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
336 |
AccessInternal::PossiblyLockedAccess<T>::value, T>::type |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
337 |
atomic_xchg_maybe_locked(T new_value, void* addr); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
338 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
339 |
public: |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
340 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
341 |
static inline void store(void* addr, T value) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
342 |
store_internal<decorators>(addr, value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
343 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
344 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
345 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
346 |
static inline T load(void* addr) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
347 |
return load_internal<decorators, T>(addr); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
348 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
349 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
350 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
351 |
static inline T atomic_cmpxchg(T new_value, void* addr, T compare_value) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
352 |
return atomic_cmpxchg_maybe_locked<decorators>(new_value, addr, compare_value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
353 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
354 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
355 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
356 |
static inline T atomic_xchg(T new_value, void* addr) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
357 |
return atomic_xchg_maybe_locked<decorators>(new_value, addr); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
358 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
359 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
360 |
template <typename T> |
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
361 |
static bool arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
362 |
arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
363 |
size_t length); |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
364 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
365 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
366 |
static void oop_store(void* addr, T value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
367 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
368 |
static void oop_store_at(oop base, ptrdiff_t offset, T value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
369 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
370 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
371 |
static T oop_load(void* addr); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
372 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
373 |
static T oop_load_at(oop base, ptrdiff_t offset); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
374 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
375 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
376 |
static T oop_atomic_cmpxchg(T new_value, void* addr, T compare_value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
377 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
378 |
static T oop_atomic_cmpxchg_at(T new_value, oop base, ptrdiff_t offset, T compare_value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
379 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
380 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
381 |
static T oop_atomic_xchg(T new_value, void* addr); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
382 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
383 |
static T oop_atomic_xchg_at(T new_value, oop base, ptrdiff_t offset); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
384 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
385 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
386 |
static void store_at(oop base, ptrdiff_t offset, T value) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
387 |
store(field_addr(base, offset), value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
388 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
389 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
390 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
391 |
static T load_at(oop base, ptrdiff_t offset) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
392 |
return load<T>(field_addr(base, offset)); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
393 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
394 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
395 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
396 |
static T atomic_cmpxchg_at(T new_value, oop base, ptrdiff_t offset, T compare_value) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
397 |
return atomic_cmpxchg(new_value, field_addr(base, offset), compare_value); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
398 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
399 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
400 |
template <typename T> |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
401 |
static T atomic_xchg_at(T new_value, oop base, ptrdiff_t offset) { |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
402 |
return atomic_xchg(new_value, field_addr(base, offset)); |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
403 |
} |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
404 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
405 |
template <typename T> |
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
406 |
static bool oop_arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
407 |
arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
408 |
size_t length); |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
409 |
|
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
410 |
static void clone(oop src, oop dst, size_t size); |
49041
44122f767467
8198286: Direct memory accessors in typeArrayOop.hpp should use Access API
eosterlund
parents:
48628
diff
changeset
|
411 |
|
44122f767467
8198286: Direct memory accessors in typeArrayOop.hpp should use Access API
eosterlund
parents:
48628
diff
changeset
|
412 |
static oop resolve(oop obj) { return obj; } |
49658 | 413 |
|
52070 | 414 |
static bool equals(oop o1, oop o2) { return (void*)o1 == (void*)o2; } |
47998
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
415 |
}; |
fb0275c320a0
8189871: Refactor GC barriers to use declarative semantics
eosterlund
parents:
diff
changeset
|
416 |
|
49658 | 417 |
// Below is the implementation of the first 4 steps of the template pipeline: |
418 |
// * Step 1: Set default decorators and decay types. This step gets rid of CV qualifiers |
|
419 |
// and sets default decorators to sensible values. |
|
420 |
// * Step 2: Reduce types. This step makes sure there is only a single T type and not |
|
421 |
// multiple types. The P type of the address and T type of the value must |
|
422 |
// match. |
|
423 |
// * Step 3: Pre-runtime dispatch. This step checks whether a runtime call can be |
|
424 |
// avoided, and in that case avoids it (calling raw accesses or |
|
425 |
// primitive accesses in a build that does not require primitive GC barriers) |
|
426 |
// * Step 4: Runtime-dispatch. This step performs a runtime dispatch to the corresponding |
|
427 |
// BarrierSet::AccessBarrier accessor that attaches GC-required barriers |
|
428 |
// to the access. |
|
429 |
||
430 |
namespace AccessInternal { |
|
431 |
template <typename T> |
|
432 |
struct OopOrNarrowOopInternal: AllStatic { |
|
433 |
typedef oop type; |
|
434 |
}; |
|
435 |
||
436 |
template <> |
|
437 |
struct OopOrNarrowOopInternal<narrowOop>: AllStatic { |
|
438 |
typedef narrowOop type; |
|
439 |
}; |
|
440 |
||
441 |
// This metafunction returns a canonicalized oop/narrowOop type for a passed |
|
442 |
// in oop-like types passed in from oop_* overloads where the user has sworn |
|
443 |
// that the passed in values should be oop-like (e.g. oop, oopDesc*, arrayOop, |
|
444 |
// narrowOoop, instanceOopDesc*, and random other things). |
|
445 |
// In the oop_* overloads, it must hold that if the passed in type T is not |
|
446 |
// narrowOop, then it by contract has to be one of many oop-like types implicitly |
|
447 |
// convertible to oop, and hence returns oop as the canonical oop type. |
|
448 |
// If it turns out it was not, then the implicit conversion to oop will fail |
|
449 |
// to compile, as desired. |
|
450 |
template <typename T> |
|
451 |
struct OopOrNarrowOop: AllStatic { |
|
452 |
typedef typename OopOrNarrowOopInternal<typename Decay<T>::type>::type type; |
|
453 |
}; |
|
454 |
||
455 |
inline void* field_addr(oop base, ptrdiff_t byte_offset) { |
|
456 |
return reinterpret_cast<void*>(reinterpret_cast<intptr_t>((void*)base) + byte_offset); |
|
457 |
} |
|
458 |
// Step 4: Runtime dispatch |
|
459 |
// The RuntimeDispatch class is responsible for performing a runtime dispatch of the |
|
460 |
// accessor. This is required when the access either depends on whether compressed oops |
|
461 |
// is being used, or it depends on which GC implementation was chosen (e.g. requires GC |
|
462 |
// barriers). The way it works is that a function pointer initially pointing to an |
|
463 |
// accessor resolution function gets called for each access. Upon first invocation, |
|
464 |
// it resolves which accessor to be used in future invocations and patches the |
|
465 |
// function pointer to this new accessor. |
|
466 |
||
467 |
template <DecoratorSet decorators, typename T, BarrierType type> |
|
468 |
struct RuntimeDispatch: AllStatic {}; |
|
469 |
||
470 |
template <DecoratorSet decorators, typename T> |
|
471 |
struct RuntimeDispatch<decorators, T, BARRIER_STORE>: AllStatic { |
|
472 |
typedef typename AccessFunction<decorators, T, BARRIER_STORE>::type func_t; |
|
473 |
static func_t _store_func; |
|
474 |
||
475 |
static void store_init(void* addr, T value); |
|
476 |
||
477 |
static inline void store(void* addr, T value) { |
|
478 |
_store_func(addr, value); |
|
479 |
} |
|
480 |
}; |
|
481 |
||
482 |
template <DecoratorSet decorators, typename T> |
|
483 |
struct RuntimeDispatch<decorators, T, BARRIER_STORE_AT>: AllStatic { |
|
484 |
typedef typename AccessFunction<decorators, T, BARRIER_STORE_AT>::type func_t; |
|
485 |
static func_t _store_at_func; |
|
486 |
||
487 |
static void store_at_init(oop base, ptrdiff_t offset, T value); |
|
488 |
||
489 |
static inline void store_at(oop base, ptrdiff_t offset, T value) { |
|
490 |
_store_at_func(base, offset, value); |
|
491 |
} |
|
492 |
}; |
|
493 |
||
494 |
template <DecoratorSet decorators, typename T> |
|
495 |
struct RuntimeDispatch<decorators, T, BARRIER_LOAD>: AllStatic { |
|
496 |
typedef typename AccessFunction<decorators, T, BARRIER_LOAD>::type func_t; |
|
497 |
static func_t _load_func; |
|
498 |
||
499 |
static T load_init(void* addr); |
|
500 |
||
501 |
static inline T load(void* addr) { |
|
502 |
return _load_func(addr); |
|
503 |
} |
|
504 |
}; |
|
505 |
||
506 |
template <DecoratorSet decorators, typename T> |
|
507 |
struct RuntimeDispatch<decorators, T, BARRIER_LOAD_AT>: AllStatic { |
|
508 |
typedef typename AccessFunction<decorators, T, BARRIER_LOAD_AT>::type func_t; |
|
509 |
static func_t _load_at_func; |
|
510 |
||
511 |
static T load_at_init(oop base, ptrdiff_t offset); |
|
512 |
||
513 |
static inline T load_at(oop base, ptrdiff_t offset) { |
|
514 |
return _load_at_func(base, offset); |
|
515 |
} |
|
516 |
}; |
|
517 |
||
518 |
template <DecoratorSet decorators, typename T> |
|
519 |
struct RuntimeDispatch<decorators, T, BARRIER_ATOMIC_CMPXCHG>: AllStatic { |
|
520 |
typedef typename AccessFunction<decorators, T, BARRIER_ATOMIC_CMPXCHG>::type func_t; |
|
521 |
static func_t _atomic_cmpxchg_func; |
|
522 |
||
523 |
static T atomic_cmpxchg_init(T new_value, void* addr, T compare_value); |
|
524 |
||
525 |
static inline T atomic_cmpxchg(T new_value, void* addr, T compare_value) { |
|
526 |
return _atomic_cmpxchg_func(new_value, addr, compare_value); |
|
527 |
} |
|
528 |
}; |
|
529 |
||
530 |
template <DecoratorSet decorators, typename T> |
|
531 |
struct RuntimeDispatch<decorators, T, BARRIER_ATOMIC_CMPXCHG_AT>: AllStatic { |
|
532 |
typedef typename AccessFunction<decorators, T, BARRIER_ATOMIC_CMPXCHG_AT>::type func_t; |
|
533 |
static func_t _atomic_cmpxchg_at_func; |
|
534 |
||
535 |
static T atomic_cmpxchg_at_init(T new_value, oop base, ptrdiff_t offset, T compare_value); |
|
536 |
||
537 |
static inline T atomic_cmpxchg_at(T new_value, oop base, ptrdiff_t offset, T compare_value) { |
|
538 |
return _atomic_cmpxchg_at_func(new_value, base, offset, compare_value); |
|
539 |
} |
|
540 |
}; |
|
541 |
||
542 |
template <DecoratorSet decorators, typename T> |
|
543 |
struct RuntimeDispatch<decorators, T, BARRIER_ATOMIC_XCHG>: AllStatic { |
|
544 |
typedef typename AccessFunction<decorators, T, BARRIER_ATOMIC_XCHG>::type func_t; |
|
545 |
static func_t _atomic_xchg_func; |
|
546 |
||
547 |
static T atomic_xchg_init(T new_value, void* addr); |
|
548 |
||
549 |
static inline T atomic_xchg(T new_value, void* addr) { |
|
550 |
return _atomic_xchg_func(new_value, addr); |
|
551 |
} |
|
552 |
}; |
|
553 |
||
554 |
template <DecoratorSet decorators, typename T> |
|
555 |
struct RuntimeDispatch<decorators, T, BARRIER_ATOMIC_XCHG_AT>: AllStatic { |
|
556 |
typedef typename AccessFunction<decorators, T, BARRIER_ATOMIC_XCHG_AT>::type func_t; |
|
557 |
static func_t _atomic_xchg_at_func; |
|
558 |
||
559 |
static T atomic_xchg_at_init(T new_value, oop base, ptrdiff_t offset); |
|
560 |
||
561 |
static inline T atomic_xchg_at(T new_value, oop base, ptrdiff_t offset) { |
|
562 |
return _atomic_xchg_at_func(new_value, base, offset); |
|
563 |
} |
|
564 |
}; |
|
565 |
||
566 |
template <DecoratorSet decorators, typename T> |
|
567 |
struct RuntimeDispatch<decorators, T, BARRIER_ARRAYCOPY>: AllStatic { |
|
568 |
typedef typename AccessFunction<decorators, T, BARRIER_ARRAYCOPY>::type func_t; |
|
569 |
static func_t _arraycopy_func; |
|
570 |
||
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
571 |
static bool arraycopy_init(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
572 |
arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
573 |
size_t length); |
49658 | 574 |
|
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
575 |
static inline bool arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
576 |
arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
577 |
size_t length) { |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
578 |
return _arraycopy_func(src_obj, src_offset_in_bytes, src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
579 |
dst_obj, dst_offset_in_bytes, dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
580 |
length); |
49658 | 581 |
} |
582 |
}; |
|
583 |
||
584 |
template <DecoratorSet decorators, typename T> |
|
585 |
struct RuntimeDispatch<decorators, T, BARRIER_CLONE>: AllStatic { |
|
586 |
typedef typename AccessFunction<decorators, T, BARRIER_CLONE>::type func_t; |
|
587 |
static func_t _clone_func; |
|
588 |
||
589 |
static void clone_init(oop src, oop dst, size_t size); |
|
590 |
||
591 |
static inline void clone(oop src, oop dst, size_t size) { |
|
592 |
_clone_func(src, dst, size); |
|
593 |
} |
|
594 |
}; |
|
595 |
||
596 |
template <DecoratorSet decorators, typename T> |
|
597 |
struct RuntimeDispatch<decorators, T, BARRIER_RESOLVE>: AllStatic { |
|
598 |
typedef typename AccessFunction<decorators, T, BARRIER_RESOLVE>::type func_t; |
|
599 |
static func_t _resolve_func; |
|
600 |
||
601 |
static oop resolve_init(oop obj); |
|
602 |
||
603 |
static inline oop resolve(oop obj) { |
|
604 |
return _resolve_func(obj); |
|
605 |
} |
|
606 |
}; |
|
607 |
||
608 |
template <DecoratorSet decorators, typename T> |
|
609 |
struct RuntimeDispatch<decorators, T, BARRIER_EQUALS>: AllStatic { |
|
610 |
typedef typename AccessFunction<decorators, T, BARRIER_EQUALS>::type func_t; |
|
611 |
static func_t _equals_func; |
|
612 |
||
613 |
static bool equals_init(oop o1, oop o2); |
|
614 |
||
615 |
static inline bool equals(oop o1, oop o2) { |
|
616 |
return _equals_func(o1, o2); |
|
617 |
} |
|
618 |
}; |
|
619 |
||
620 |
// Initialize the function pointers to point to the resolving function. |
|
621 |
template <DecoratorSet decorators, typename T> |
|
622 |
typename AccessFunction<decorators, T, BARRIER_STORE>::type |
|
623 |
RuntimeDispatch<decorators, T, BARRIER_STORE>::_store_func = &store_init; |
|
624 |
||
625 |
template <DecoratorSet decorators, typename T> |
|
626 |
typename AccessFunction<decorators, T, BARRIER_STORE_AT>::type |
|
627 |
RuntimeDispatch<decorators, T, BARRIER_STORE_AT>::_store_at_func = &store_at_init; |
|
628 |
||
629 |
template <DecoratorSet decorators, typename T> |
|
630 |
typename AccessFunction<decorators, T, BARRIER_LOAD>::type |
|
631 |
RuntimeDispatch<decorators, T, BARRIER_LOAD>::_load_func = &load_init; |
|
632 |
||
633 |
template <DecoratorSet decorators, typename T> |
|
634 |
typename AccessFunction<decorators, T, BARRIER_LOAD_AT>::type |
|
635 |
RuntimeDispatch<decorators, T, BARRIER_LOAD_AT>::_load_at_func = &load_at_init; |
|
636 |
||
637 |
template <DecoratorSet decorators, typename T> |
|
638 |
typename AccessFunction<decorators, T, BARRIER_ATOMIC_CMPXCHG>::type |
|
639 |
RuntimeDispatch<decorators, T, BARRIER_ATOMIC_CMPXCHG>::_atomic_cmpxchg_func = &atomic_cmpxchg_init; |
|
640 |
||
641 |
template <DecoratorSet decorators, typename T> |
|
642 |
typename AccessFunction<decorators, T, BARRIER_ATOMIC_CMPXCHG_AT>::type |
|
643 |
RuntimeDispatch<decorators, T, BARRIER_ATOMIC_CMPXCHG_AT>::_atomic_cmpxchg_at_func = &atomic_cmpxchg_at_init; |
|
644 |
||
645 |
template <DecoratorSet decorators, typename T> |
|
646 |
typename AccessFunction<decorators, T, BARRIER_ATOMIC_XCHG>::type |
|
647 |
RuntimeDispatch<decorators, T, BARRIER_ATOMIC_XCHG>::_atomic_xchg_func = &atomic_xchg_init; |
|
648 |
||
649 |
template <DecoratorSet decorators, typename T> |
|
650 |
typename AccessFunction<decorators, T, BARRIER_ATOMIC_XCHG_AT>::type |
|
651 |
RuntimeDispatch<decorators, T, BARRIER_ATOMIC_XCHG_AT>::_atomic_xchg_at_func = &atomic_xchg_at_init; |
|
652 |
||
653 |
template <DecoratorSet decorators, typename T> |
|
654 |
typename AccessFunction<decorators, T, BARRIER_ARRAYCOPY>::type |
|
655 |
RuntimeDispatch<decorators, T, BARRIER_ARRAYCOPY>::_arraycopy_func = &arraycopy_init; |
|
656 |
||
657 |
template <DecoratorSet decorators, typename T> |
|
658 |
typename AccessFunction<decorators, T, BARRIER_CLONE>::type |
|
659 |
RuntimeDispatch<decorators, T, BARRIER_CLONE>::_clone_func = &clone_init; |
|
660 |
||
661 |
template <DecoratorSet decorators, typename T> |
|
662 |
typename AccessFunction<decorators, T, BARRIER_RESOLVE>::type |
|
663 |
RuntimeDispatch<decorators, T, BARRIER_RESOLVE>::_resolve_func = &resolve_init; |
|
664 |
||
665 |
template <DecoratorSet decorators, typename T> |
|
666 |
typename AccessFunction<decorators, T, BARRIER_EQUALS>::type |
|
667 |
RuntimeDispatch<decorators, T, BARRIER_EQUALS>::_equals_func = &equals_init; |
|
668 |
||
669 |
// Step 3: Pre-runtime dispatching. |
|
670 |
// The PreRuntimeDispatch class is responsible for filtering the barrier strength |
|
671 |
// decorators. That is, for AS_RAW, it hardwires the accesses without a runtime |
|
672 |
// dispatch point. Otherwise it goes through a runtime check if hardwiring was |
|
673 |
// not possible. |
|
674 |
struct PreRuntimeDispatch: AllStatic { |
|
675 |
template<DecoratorSet decorators> |
|
676 |
struct CanHardwireRaw: public IntegralConstant< |
|
677 |
bool, |
|
678 |
!HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value || // primitive access |
|
679 |
!HasDecorator<decorators, INTERNAL_CONVERT_COMPRESSED_OOP>::value || // don't care about compressed oops (oop* address) |
|
680 |
HasDecorator<decorators, INTERNAL_RT_USE_COMPRESSED_OOPS>::value> // we can infer we use compressed oops (narrowOop* address) |
|
681 |
{}; |
|
682 |
||
683 |
static const DecoratorSet convert_compressed_oops = INTERNAL_RT_USE_COMPRESSED_OOPS | INTERNAL_CONVERT_COMPRESSED_OOP; |
|
684 |
||
685 |
template<DecoratorSet decorators> |
|
686 |
static bool is_hardwired_primitive() { |
|
687 |
return !HasDecorator<decorators, INTERNAL_BT_BARRIER_ON_PRIMITIVES>::value && |
|
688 |
!HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value; |
|
689 |
} |
|
690 |
||
691 |
template <DecoratorSet decorators, typename T> |
|
692 |
inline static typename EnableIf< |
|
693 |
HasDecorator<decorators, AS_RAW>::value && CanHardwireRaw<decorators>::value>::type |
|
694 |
store(void* addr, T value) { |
|
695 |
typedef RawAccessBarrier<decorators & RAW_DECORATOR_MASK> Raw; |
|
696 |
if (HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value) { |
|
697 |
Raw::oop_store(addr, value); |
|
698 |
} else { |
|
699 |
Raw::store(addr, value); |
|
700 |
} |
|
701 |
} |
|
702 |
||
703 |
template <DecoratorSet decorators, typename T> |
|
704 |
inline static typename EnableIf< |
|
705 |
HasDecorator<decorators, AS_RAW>::value && !CanHardwireRaw<decorators>::value>::type |
|
706 |
store(void* addr, T value) { |
|
707 |
if (UseCompressedOops) { |
|
708 |
const DecoratorSet expanded_decorators = decorators | convert_compressed_oops; |
|
709 |
PreRuntimeDispatch::store<expanded_decorators>(addr, value); |
|
710 |
} else { |
|
711 |
const DecoratorSet expanded_decorators = decorators & ~convert_compressed_oops; |
|
712 |
PreRuntimeDispatch::store<expanded_decorators>(addr, value); |
|
713 |
} |
|
714 |
} |
|
715 |
||
716 |
template <DecoratorSet decorators, typename T> |
|
717 |
inline static typename EnableIf< |
|
718 |
!HasDecorator<decorators, AS_RAW>::value>::type |
|
719 |
store(void* addr, T value) { |
|
720 |
if (is_hardwired_primitive<decorators>()) { |
|
721 |
const DecoratorSet expanded_decorators = decorators | AS_RAW; |
|
722 |
PreRuntimeDispatch::store<expanded_decorators>(addr, value); |
|
723 |
} else { |
|
724 |
RuntimeDispatch<decorators, T, BARRIER_STORE>::store(addr, value); |
|
725 |
} |
|
726 |
} |
|
727 |
||
728 |
template <DecoratorSet decorators, typename T> |
|
729 |
inline static typename EnableIf< |
|
730 |
HasDecorator<decorators, AS_RAW>::value>::type |
|
731 |
store_at(oop base, ptrdiff_t offset, T value) { |
|
732 |
store<decorators>(field_addr(base, offset), value); |
|
733 |
} |
|
734 |
||
735 |
template <DecoratorSet decorators, typename T> |
|
736 |
inline static typename EnableIf< |
|
737 |
!HasDecorator<decorators, AS_RAW>::value>::type |
|
738 |
store_at(oop base, ptrdiff_t offset, T value) { |
|
739 |
if (is_hardwired_primitive<decorators>()) { |
|
740 |
const DecoratorSet expanded_decorators = decorators | AS_RAW; |
|
741 |
PreRuntimeDispatch::store_at<expanded_decorators>(base, offset, value); |
|
742 |
} else { |
|
743 |
RuntimeDispatch<decorators, T, BARRIER_STORE_AT>::store_at(base, offset, value); |
|
744 |
} |
|
745 |
} |
|
746 |
||
747 |
template <DecoratorSet decorators, typename T> |
|
748 |
inline static typename EnableIf< |
|
749 |
HasDecorator<decorators, AS_RAW>::value && CanHardwireRaw<decorators>::value, T>::type |
|
750 |
load(void* addr) { |
|
751 |
typedef RawAccessBarrier<decorators & RAW_DECORATOR_MASK> Raw; |
|
752 |
if (HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value) { |
|
753 |
return Raw::template oop_load<T>(addr); |
|
754 |
} else { |
|
755 |
return Raw::template load<T>(addr); |
|
756 |
} |
|
757 |
} |
|
758 |
||
759 |
template <DecoratorSet decorators, typename T> |
|
760 |
inline static typename EnableIf< |
|
761 |
HasDecorator<decorators, AS_RAW>::value && !CanHardwireRaw<decorators>::value, T>::type |
|
762 |
load(void* addr) { |
|
763 |
if (UseCompressedOops) { |
|
764 |
const DecoratorSet expanded_decorators = decorators | convert_compressed_oops; |
|
765 |
return PreRuntimeDispatch::load<expanded_decorators, T>(addr); |
|
766 |
} else { |
|
767 |
const DecoratorSet expanded_decorators = decorators & ~convert_compressed_oops; |
|
768 |
return PreRuntimeDispatch::load<expanded_decorators, T>(addr); |
|
769 |
} |
|
770 |
} |
|
771 |
||
772 |
template <DecoratorSet decorators, typename T> |
|
773 |
inline static typename EnableIf< |
|
774 |
!HasDecorator<decorators, AS_RAW>::value, T>::type |
|
775 |
load(void* addr) { |
|
776 |
if (is_hardwired_primitive<decorators>()) { |
|
777 |
const DecoratorSet expanded_decorators = decorators | AS_RAW; |
|
778 |
return PreRuntimeDispatch::load<expanded_decorators, T>(addr); |
|
779 |
} else { |
|
780 |
return RuntimeDispatch<decorators, T, BARRIER_LOAD>::load(addr); |
|
781 |
} |
|
782 |
} |
|
783 |
||
784 |
template <DecoratorSet decorators, typename T> |
|
785 |
inline static typename EnableIf< |
|
786 |
HasDecorator<decorators, AS_RAW>::value, T>::type |
|
787 |
load_at(oop base, ptrdiff_t offset) { |
|
788 |
return load<decorators, T>(field_addr(base, offset)); |
|
789 |
} |
|
790 |
||
791 |
template <DecoratorSet decorators, typename T> |
|
792 |
inline static typename EnableIf< |
|
793 |
!HasDecorator<decorators, AS_RAW>::value, T>::type |
|
794 |
load_at(oop base, ptrdiff_t offset) { |
|
795 |
if (is_hardwired_primitive<decorators>()) { |
|
796 |
const DecoratorSet expanded_decorators = decorators | AS_RAW; |
|
797 |
return PreRuntimeDispatch::load_at<expanded_decorators, T>(base, offset); |
|
798 |
} else { |
|
799 |
return RuntimeDispatch<decorators, T, BARRIER_LOAD_AT>::load_at(base, offset); |
|
800 |
} |
|
801 |
} |
|
802 |
||
803 |
template <DecoratorSet decorators, typename T> |
|
804 |
inline static typename EnableIf< |
|
805 |
HasDecorator<decorators, AS_RAW>::value && CanHardwireRaw<decorators>::value, T>::type |
|
806 |
atomic_cmpxchg(T new_value, void* addr, T compare_value) { |
|
807 |
typedef RawAccessBarrier<decorators & RAW_DECORATOR_MASK> Raw; |
|
808 |
if (HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value) { |
|
809 |
return Raw::oop_atomic_cmpxchg(new_value, addr, compare_value); |
|
810 |
} else { |
|
811 |
return Raw::atomic_cmpxchg(new_value, addr, compare_value); |
|
812 |
} |
|
813 |
} |
|
814 |
||
815 |
template <DecoratorSet decorators, typename T> |
|
816 |
inline static typename EnableIf< |
|
817 |
HasDecorator<decorators, AS_RAW>::value && !CanHardwireRaw<decorators>::value, T>::type |
|
818 |
atomic_cmpxchg(T new_value, void* addr, T compare_value) { |
|
819 |
if (UseCompressedOops) { |
|
820 |
const DecoratorSet expanded_decorators = decorators | convert_compressed_oops; |
|
821 |
return PreRuntimeDispatch::atomic_cmpxchg<expanded_decorators>(new_value, addr, compare_value); |
|
822 |
} else { |
|
823 |
const DecoratorSet expanded_decorators = decorators & ~convert_compressed_oops; |
|
824 |
return PreRuntimeDispatch::atomic_cmpxchg<expanded_decorators>(new_value, addr, compare_value); |
|
825 |
} |
|
826 |
} |
|
827 |
||
828 |
template <DecoratorSet decorators, typename T> |
|
829 |
inline static typename EnableIf< |
|
830 |
!HasDecorator<decorators, AS_RAW>::value, T>::type |
|
831 |
atomic_cmpxchg(T new_value, void* addr, T compare_value) { |
|
832 |
if (is_hardwired_primitive<decorators>()) { |
|
833 |
const DecoratorSet expanded_decorators = decorators | AS_RAW; |
|
834 |
return PreRuntimeDispatch::atomic_cmpxchg<expanded_decorators>(new_value, addr, compare_value); |
|
835 |
} else { |
|
836 |
return RuntimeDispatch<decorators, T, BARRIER_ATOMIC_CMPXCHG>::atomic_cmpxchg(new_value, addr, compare_value); |
|
837 |
} |
|
838 |
} |
|
839 |
||
840 |
template <DecoratorSet decorators, typename T> |
|
841 |
inline static typename EnableIf< |
|
842 |
HasDecorator<decorators, AS_RAW>::value, T>::type |
|
843 |
atomic_cmpxchg_at(T new_value, oop base, ptrdiff_t offset, T compare_value) { |
|
844 |
return atomic_cmpxchg<decorators>(new_value, field_addr(base, offset), compare_value); |
|
845 |
} |
|
846 |
||
847 |
template <DecoratorSet decorators, typename T> |
|
848 |
inline static typename EnableIf< |
|
849 |
!HasDecorator<decorators, AS_RAW>::value, T>::type |
|
850 |
atomic_cmpxchg_at(T new_value, oop base, ptrdiff_t offset, T compare_value) { |
|
851 |
if (is_hardwired_primitive<decorators>()) { |
|
852 |
const DecoratorSet expanded_decorators = decorators | AS_RAW; |
|
853 |
return PreRuntimeDispatch::atomic_cmpxchg_at<expanded_decorators>(new_value, base, offset, compare_value); |
|
854 |
} else { |
|
855 |
return RuntimeDispatch<decorators, T, BARRIER_ATOMIC_CMPXCHG_AT>::atomic_cmpxchg_at(new_value, base, offset, compare_value); |
|
856 |
} |
|
857 |
} |
|
858 |
||
859 |
template <DecoratorSet decorators, typename T> |
|
860 |
inline static typename EnableIf< |
|
861 |
HasDecorator<decorators, AS_RAW>::value && CanHardwireRaw<decorators>::value, T>::type |
|
862 |
atomic_xchg(T new_value, void* addr) { |
|
863 |
typedef RawAccessBarrier<decorators & RAW_DECORATOR_MASK> Raw; |
|
864 |
if (HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value) { |
|
865 |
return Raw::oop_atomic_xchg(new_value, addr); |
|
866 |
} else { |
|
867 |
return Raw::atomic_xchg(new_value, addr); |
|
868 |
} |
|
869 |
} |
|
870 |
||
871 |
template <DecoratorSet decorators, typename T> |
|
872 |
inline static typename EnableIf< |
|
873 |
HasDecorator<decorators, AS_RAW>::value && !CanHardwireRaw<decorators>::value, T>::type |
|
874 |
atomic_xchg(T new_value, void* addr) { |
|
875 |
if (UseCompressedOops) { |
|
876 |
const DecoratorSet expanded_decorators = decorators | convert_compressed_oops; |
|
877 |
return PreRuntimeDispatch::atomic_xchg<expanded_decorators>(new_value, addr); |
|
878 |
} else { |
|
879 |
const DecoratorSet expanded_decorators = decorators & ~convert_compressed_oops; |
|
880 |
return PreRuntimeDispatch::atomic_xchg<expanded_decorators>(new_value, addr); |
|
881 |
} |
|
882 |
} |
|
883 |
||
884 |
template <DecoratorSet decorators, typename T> |
|
885 |
inline static typename EnableIf< |
|
886 |
!HasDecorator<decorators, AS_RAW>::value, T>::type |
|
887 |
atomic_xchg(T new_value, void* addr) { |
|
888 |
if (is_hardwired_primitive<decorators>()) { |
|
889 |
const DecoratorSet expanded_decorators = decorators | AS_RAW; |
|
890 |
return PreRuntimeDispatch::atomic_xchg<expanded_decorators>(new_value, addr); |
|
891 |
} else { |
|
892 |
return RuntimeDispatch<decorators, T, BARRIER_ATOMIC_XCHG>::atomic_xchg(new_value, addr); |
|
893 |
} |
|
894 |
} |
|
895 |
||
896 |
template <DecoratorSet decorators, typename T> |
|
897 |
inline static typename EnableIf< |
|
898 |
HasDecorator<decorators, AS_RAW>::value, T>::type |
|
899 |
atomic_xchg_at(T new_value, oop base, ptrdiff_t offset) { |
|
900 |
return atomic_xchg<decorators>(new_value, field_addr(base, offset)); |
|
901 |
} |
|
902 |
||
903 |
template <DecoratorSet decorators, typename T> |
|
904 |
inline static typename EnableIf< |
|
905 |
!HasDecorator<decorators, AS_RAW>::value, T>::type |
|
906 |
atomic_xchg_at(T new_value, oop base, ptrdiff_t offset) { |
|
907 |
if (is_hardwired_primitive<decorators>()) { |
|
908 |
const DecoratorSet expanded_decorators = decorators | AS_RAW; |
|
909 |
return PreRuntimeDispatch::atomic_xchg<expanded_decorators>(new_value, base, offset); |
|
910 |
} else { |
|
911 |
return RuntimeDispatch<decorators, T, BARRIER_ATOMIC_XCHG_AT>::atomic_xchg_at(new_value, base, offset); |
|
912 |
} |
|
913 |
} |
|
914 |
||
915 |
template <DecoratorSet decorators, typename T> |
|
916 |
inline static typename EnableIf< |
|
917 |
HasDecorator<decorators, AS_RAW>::value && CanHardwireRaw<decorators>::value, bool>::type |
|
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
918 |
arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
919 |
arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
920 |
size_t length) { |
49658 | 921 |
typedef RawAccessBarrier<decorators & RAW_DECORATOR_MASK> Raw; |
922 |
if (HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value) { |
|
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
923 |
return Raw::oop_arraycopy(src_obj, src_offset_in_bytes, src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
924 |
dst_obj, dst_offset_in_bytes, dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
925 |
length); |
49658 | 926 |
} else { |
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
927 |
return Raw::arraycopy(src_obj, src_offset_in_bytes, src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
928 |
dst_obj, dst_offset_in_bytes, dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
929 |
length); |
49658 | 930 |
} |
931 |
} |
|
932 |
||
933 |
template <DecoratorSet decorators, typename T> |
|
934 |
inline static typename EnableIf< |
|
935 |
HasDecorator<decorators, AS_RAW>::value && !CanHardwireRaw<decorators>::value, bool>::type |
|
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
936 |
arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
937 |
arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
938 |
size_t length) { |
49658 | 939 |
if (UseCompressedOops) { |
940 |
const DecoratorSet expanded_decorators = decorators | convert_compressed_oops; |
|
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
941 |
return PreRuntimeDispatch::arraycopy<expanded_decorators>(src_obj, src_offset_in_bytes, src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
942 |
dst_obj, dst_offset_in_bytes, dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
943 |
length); |
49658 | 944 |
} else { |
945 |
const DecoratorSet expanded_decorators = decorators & ~convert_compressed_oops; |
|
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
946 |
return PreRuntimeDispatch::arraycopy<expanded_decorators>(src_obj, src_offset_in_bytes, src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
947 |
dst_obj, dst_offset_in_bytes, dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
948 |
length); |
49658 | 949 |
} |
950 |
} |
|
951 |
||
952 |
template <DecoratorSet decorators, typename T> |
|
953 |
inline static typename EnableIf< |
|
954 |
!HasDecorator<decorators, AS_RAW>::value, bool>::type |
|
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
955 |
arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
956 |
arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
957 |
size_t length) { |
49658 | 958 |
if (is_hardwired_primitive<decorators>()) { |
959 |
const DecoratorSet expanded_decorators = decorators | AS_RAW; |
|
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
960 |
return PreRuntimeDispatch::arraycopy<expanded_decorators>(src_obj, src_offset_in_bytes, src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
961 |
dst_obj, dst_offset_in_bytes, dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
962 |
length); |
49658 | 963 |
} else { |
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
964 |
return RuntimeDispatch<decorators, T, BARRIER_ARRAYCOPY>::arraycopy(src_obj, src_offset_in_bytes, src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
965 |
dst_obj, dst_offset_in_bytes, dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
966 |
length); |
49658 | 967 |
} |
968 |
} |
|
969 |
||
970 |
template <DecoratorSet decorators> |
|
971 |
inline static typename EnableIf< |
|
972 |
HasDecorator<decorators, AS_RAW>::value>::type |
|
973 |
clone(oop src, oop dst, size_t size) { |
|
974 |
typedef RawAccessBarrier<decorators & RAW_DECORATOR_MASK> Raw; |
|
975 |
Raw::clone(src, dst, size); |
|
976 |
} |
|
977 |
||
978 |
template <DecoratorSet decorators> |
|
979 |
inline static typename EnableIf< |
|
980 |
!HasDecorator<decorators, AS_RAW>::value>::type |
|
981 |
clone(oop src, oop dst, size_t size) { |
|
982 |
RuntimeDispatch<decorators, oop, BARRIER_CLONE>::clone(src, dst, size); |
|
983 |
} |
|
984 |
||
985 |
template <DecoratorSet decorators> |
|
986 |
inline static typename EnableIf< |
|
987 |
HasDecorator<decorators, INTERNAL_BT_TO_SPACE_INVARIANT>::value, oop>::type |
|
988 |
resolve(oop obj) { |
|
989 |
typedef RawAccessBarrier<decorators & RAW_DECORATOR_MASK> Raw; |
|
990 |
return Raw::resolve(obj); |
|
991 |
} |
|
992 |
||
993 |
template <DecoratorSet decorators> |
|
994 |
inline static typename EnableIf< |
|
995 |
!HasDecorator<decorators, INTERNAL_BT_TO_SPACE_INVARIANT>::value, oop>::type |
|
996 |
resolve(oop obj) { |
|
997 |
return RuntimeDispatch<decorators, oop, BARRIER_RESOLVE>::resolve(obj); |
|
998 |
} |
|
999 |
||
1000 |
template <DecoratorSet decorators> |
|
1001 |
inline static typename EnableIf< |
|
52100
62523934374c
8212054: Boilerplate to bind oopDesc::equals_raw() to actual raw implementation
rkennke
parents:
52070
diff
changeset
|
1002 |
HasDecorator<decorators, AS_RAW>::value || HasDecorator<decorators, INTERNAL_BT_TO_SPACE_INVARIANT>::value, bool>::type |
49658 | 1003 |
equals(oop o1, oop o2) { |
1004 |
typedef RawAccessBarrier<decorators & RAW_DECORATOR_MASK> Raw; |
|
1005 |
return Raw::equals(o1, o2); |
|
1006 |
} |
|
1007 |
||
1008 |
template <DecoratorSet decorators> |
|
1009 |
inline static typename EnableIf< |
|
52100
62523934374c
8212054: Boilerplate to bind oopDesc::equals_raw() to actual raw implementation
rkennke
parents:
52070
diff
changeset
|
1010 |
!HasDecorator<decorators, AS_RAW>::value && !HasDecorator<decorators, INTERNAL_BT_TO_SPACE_INVARIANT>::value, bool>::type |
49658 | 1011 |
equals(oop o1, oop o2) { |
1012 |
return RuntimeDispatch<decorators, oop, BARRIER_EQUALS>::equals(o1, o2); |
|
1013 |
} |
|
1014 |
}; |
|
1015 |
||
1016 |
// Step 2: Reduce types. |
|
1017 |
// Enforce that for non-oop types, T and P have to be strictly the same. |
|
1018 |
// P is the type of the address and T is the type of the values. |
|
1019 |
// As for oop types, it is allow to send T in {narrowOop, oop} and |
|
1020 |
// P in {narrowOop, oop, HeapWord*}. The following rules apply according to |
|
1021 |
// the subsequent table. (columns are P, rows are T) |
|
1022 |
// | | HeapWord | oop | narrowOop | |
|
1023 |
// | oop | rt-comp | hw-none | hw-comp | |
|
1024 |
// | narrowOop | x | x | hw-none | |
|
1025 |
// |
|
1026 |
// x means not allowed |
|
1027 |
// rt-comp means it must be checked at runtime whether the oop is compressed. |
|
1028 |
// hw-none means it is statically known the oop will not be compressed. |
|
1029 |
// hw-comp means it is statically known the oop will be compressed. |
|
1030 |
||
1031 |
template <DecoratorSet decorators, typename T> |
|
1032 |
inline void store_reduce_types(T* addr, T value) { |
|
1033 |
PreRuntimeDispatch::store<decorators>(addr, value); |
|
1034 |
} |
|
1035 |
||
1036 |
template <DecoratorSet decorators> |
|
1037 |
inline void store_reduce_types(narrowOop* addr, oop value) { |
|
1038 |
const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP | |
|
1039 |
INTERNAL_RT_USE_COMPRESSED_OOPS; |
|
1040 |
PreRuntimeDispatch::store<expanded_decorators>(addr, value); |
|
1041 |
} |
|
1042 |
||
1043 |
template <DecoratorSet decorators> |
|
1044 |
inline void store_reduce_types(narrowOop* addr, narrowOop value) { |
|
1045 |
const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP | |
|
1046 |
INTERNAL_RT_USE_COMPRESSED_OOPS; |
|
1047 |
PreRuntimeDispatch::store<expanded_decorators>(addr, value); |
|
1048 |
} |
|
1049 |
||
1050 |
template <DecoratorSet decorators> |
|
1051 |
inline void store_reduce_types(HeapWord* addr, oop value) { |
|
1052 |
const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP; |
|
1053 |
PreRuntimeDispatch::store<expanded_decorators>(addr, value); |
|
1054 |
} |
|
1055 |
||
1056 |
template <DecoratorSet decorators, typename T> |
|
1057 |
inline T atomic_cmpxchg_reduce_types(T new_value, T* addr, T compare_value) { |
|
1058 |
return PreRuntimeDispatch::atomic_cmpxchg<decorators>(new_value, addr, compare_value); |
|
1059 |
} |
|
1060 |
||
1061 |
template <DecoratorSet decorators> |
|
1062 |
inline oop atomic_cmpxchg_reduce_types(oop new_value, narrowOop* addr, oop compare_value) { |
|
1063 |
const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP | |
|
1064 |
INTERNAL_RT_USE_COMPRESSED_OOPS; |
|
1065 |
return PreRuntimeDispatch::atomic_cmpxchg<expanded_decorators>(new_value, addr, compare_value); |
|
1066 |
} |
|
1067 |
||
1068 |
template <DecoratorSet decorators> |
|
1069 |
inline narrowOop atomic_cmpxchg_reduce_types(narrowOop new_value, narrowOop* addr, narrowOop compare_value) { |
|
1070 |
const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP | |
|
1071 |
INTERNAL_RT_USE_COMPRESSED_OOPS; |
|
1072 |
return PreRuntimeDispatch::atomic_cmpxchg<expanded_decorators>(new_value, addr, compare_value); |
|
1073 |
} |
|
1074 |
||
1075 |
template <DecoratorSet decorators> |
|
1076 |
inline oop atomic_cmpxchg_reduce_types(oop new_value, |
|
1077 |
HeapWord* addr, |
|
1078 |
oop compare_value) { |
|
1079 |
const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP; |
|
1080 |
return PreRuntimeDispatch::atomic_cmpxchg<expanded_decorators>(new_value, addr, compare_value); |
|
1081 |
} |
|
1082 |
||
1083 |
template <DecoratorSet decorators, typename T> |
|
1084 |
inline T atomic_xchg_reduce_types(T new_value, T* addr) { |
|
1085 |
const DecoratorSet expanded_decorators = decorators; |
|
1086 |
return PreRuntimeDispatch::atomic_xchg<expanded_decorators>(new_value, addr); |
|
1087 |
} |
|
1088 |
||
1089 |
template <DecoratorSet decorators> |
|
1090 |
inline oop atomic_xchg_reduce_types(oop new_value, narrowOop* addr) { |
|
1091 |
const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP | |
|
1092 |
INTERNAL_RT_USE_COMPRESSED_OOPS; |
|
1093 |
return PreRuntimeDispatch::atomic_xchg<expanded_decorators>(new_value, addr); |
|
1094 |
} |
|
1095 |
||
1096 |
template <DecoratorSet decorators> |
|
1097 |
inline narrowOop atomic_xchg_reduce_types(narrowOop new_value, narrowOop* addr) { |
|
1098 |
const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP | |
|
1099 |
INTERNAL_RT_USE_COMPRESSED_OOPS; |
|
1100 |
return PreRuntimeDispatch::atomic_xchg<expanded_decorators>(new_value, addr); |
|
1101 |
} |
|
1102 |
||
1103 |
template <DecoratorSet decorators> |
|
1104 |
inline oop atomic_xchg_reduce_types(oop new_value, HeapWord* addr) { |
|
1105 |
const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP; |
|
1106 |
return PreRuntimeDispatch::atomic_xchg<expanded_decorators>(new_value, addr); |
|
1107 |
} |
|
1108 |
||
1109 |
template <DecoratorSet decorators, typename T> |
|
1110 |
inline T load_reduce_types(T* addr) { |
|
1111 |
return PreRuntimeDispatch::load<decorators, T>(addr); |
|
1112 |
} |
|
1113 |
||
1114 |
template <DecoratorSet decorators, typename T> |
|
1115 |
inline typename OopOrNarrowOop<T>::type load_reduce_types(narrowOop* addr) { |
|
1116 |
const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP | |
|
1117 |
INTERNAL_RT_USE_COMPRESSED_OOPS; |
|
1118 |
return PreRuntimeDispatch::load<expanded_decorators, typename OopOrNarrowOop<T>::type>(addr); |
|
1119 |
} |
|
1120 |
||
1121 |
template <DecoratorSet decorators, typename T> |
|
1122 |
inline oop load_reduce_types(HeapWord* addr) { |
|
1123 |
const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP; |
|
1124 |
return PreRuntimeDispatch::load<expanded_decorators, oop>(addr); |
|
1125 |
} |
|
1126 |
||
1127 |
template <DecoratorSet decorators, typename T> |
|
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1128 |
inline bool arraycopy_reduce_types(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1129 |
arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1130 |
size_t length) { |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1131 |
return PreRuntimeDispatch::arraycopy<decorators>(src_obj, src_offset_in_bytes, src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1132 |
dst_obj, dst_offset_in_bytes, dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1133 |
length); |
49658 | 1134 |
} |
1135 |
||
1136 |
template <DecoratorSet decorators> |
|
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1137 |
inline bool arraycopy_reduce_types(arrayOop src_obj, size_t src_offset_in_bytes, HeapWord* src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1138 |
arrayOop dst_obj, size_t dst_offset_in_bytes, HeapWord* dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1139 |
size_t length) { |
49658 | 1140 |
const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP; |
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1141 |
return PreRuntimeDispatch::arraycopy<expanded_decorators>(src_obj, src_offset_in_bytes, src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1142 |
dst_obj, dst_offset_in_bytes, dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1143 |
length); |
49658 | 1144 |
} |
1145 |
||
1146 |
template <DecoratorSet decorators> |
|
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1147 |
inline bool arraycopy_reduce_types(arrayOop src_obj, size_t src_offset_in_bytes, narrowOop* src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1148 |
arrayOop dst_obj, size_t dst_offset_in_bytes, narrowOop* dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1149 |
size_t length) { |
49658 | 1150 |
const DecoratorSet expanded_decorators = decorators | INTERNAL_CONVERT_COMPRESSED_OOP | |
1151 |
INTERNAL_RT_USE_COMPRESSED_OOPS; |
|
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1152 |
return PreRuntimeDispatch::arraycopy<expanded_decorators>(src_obj, src_offset_in_bytes, src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1153 |
dst_obj, dst_offset_in_bytes, dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1154 |
length); |
49658 | 1155 |
} |
1156 |
||
1157 |
// Step 1: Set default decorators. This step remembers if a type was volatile |
|
1158 |
// and then sets the MO_VOLATILE decorator by default. Otherwise, a default |
|
1159 |
// memory ordering is set for the access, and the implied decorator rules |
|
1160 |
// are applied to select sensible defaults for decorators that have not been |
|
1161 |
// explicitly set. For example, default object referent strength is set to strong. |
|
1162 |
// This step also decays the types passed in (e.g. getting rid of CV qualifiers |
|
1163 |
// and references from the types). This step also perform some type verification |
|
1164 |
// that the passed in types make sense. |
|
1165 |
||
1166 |
template <DecoratorSet decorators, typename T> |
|
1167 |
static void verify_types(){ |
|
1168 |
// If this fails to compile, then you have sent in something that is |
|
1169 |
// not recognized as a valid primitive type to a primitive Access function. |
|
1170 |
STATIC_ASSERT((HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value || // oops have already been validated |
|
1171 |
(IsPointer<T>::value || IsIntegral<T>::value) || |
|
1172 |
IsFloatingPoint<T>::value)); // not allowed primitive type |
|
1173 |
} |
|
1174 |
||
1175 |
template <DecoratorSet decorators, typename P, typename T> |
|
1176 |
inline void store(P* addr, T value) { |
|
1177 |
verify_types<decorators, T>(); |
|
1178 |
typedef typename Decay<P>::type DecayedP; |
|
1179 |
typedef typename Decay<T>::type DecayedT; |
|
1180 |
DecayedT decayed_value = value; |
|
1181 |
// If a volatile address is passed in but no memory ordering decorator, |
|
1182 |
// set the memory ordering to MO_VOLATILE by default. |
|
1183 |
const DecoratorSet expanded_decorators = DecoratorFixup< |
|
1184 |
(IsVolatile<P>::value && !HasDecorator<decorators, MO_DECORATOR_MASK>::value) ? |
|
1185 |
(MO_VOLATILE | decorators) : decorators>::value; |
|
1186 |
store_reduce_types<expanded_decorators>(const_cast<DecayedP*>(addr), decayed_value); |
|
1187 |
} |
|
1188 |
||
1189 |
template <DecoratorSet decorators, typename T> |
|
1190 |
inline void store_at(oop base, ptrdiff_t offset, T value) { |
|
1191 |
verify_types<decorators, T>(); |
|
1192 |
typedef typename Decay<T>::type DecayedT; |
|
1193 |
DecayedT decayed_value = value; |
|
1194 |
const DecoratorSet expanded_decorators = DecoratorFixup<decorators | |
|
1195 |
(HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value ? |
|
53075
747d29313e5a
8215492: Rename INTERNAL_EMPTY to something less "internal"
pliden
parents:
52100
diff
changeset
|
1196 |
INTERNAL_CONVERT_COMPRESSED_OOP : DECORATORS_NONE)>::value; |
49658 | 1197 |
PreRuntimeDispatch::store_at<expanded_decorators>(base, offset, decayed_value); |
1198 |
} |
|
1199 |
||
1200 |
template <DecoratorSet decorators, typename P, typename T> |
|
1201 |
inline T load(P* addr) { |
|
1202 |
verify_types<decorators, T>(); |
|
1203 |
typedef typename Decay<P>::type DecayedP; |
|
1204 |
typedef typename Conditional<HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value, |
|
1205 |
typename OopOrNarrowOop<T>::type, |
|
1206 |
typename Decay<T>::type>::type DecayedT; |
|
1207 |
// If a volatile address is passed in but no memory ordering decorator, |
|
1208 |
// set the memory ordering to MO_VOLATILE by default. |
|
1209 |
const DecoratorSet expanded_decorators = DecoratorFixup< |
|
1210 |
(IsVolatile<P>::value && !HasDecorator<decorators, MO_DECORATOR_MASK>::value) ? |
|
1211 |
(MO_VOLATILE | decorators) : decorators>::value; |
|
1212 |
return load_reduce_types<expanded_decorators, DecayedT>(const_cast<DecayedP*>(addr)); |
|
1213 |
} |
|
1214 |
||
1215 |
template <DecoratorSet decorators, typename T> |
|
1216 |
inline T load_at(oop base, ptrdiff_t offset) { |
|
1217 |
verify_types<decorators, T>(); |
|
1218 |
typedef typename Conditional<HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value, |
|
1219 |
typename OopOrNarrowOop<T>::type, |
|
1220 |
typename Decay<T>::type>::type DecayedT; |
|
1221 |
// Expand the decorators (figure out sensible defaults) |
|
1222 |
// Potentially remember if we need compressed oop awareness |
|
1223 |
const DecoratorSet expanded_decorators = DecoratorFixup<decorators | |
|
1224 |
(HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value ? |
|
53075
747d29313e5a
8215492: Rename INTERNAL_EMPTY to something less "internal"
pliden
parents:
52100
diff
changeset
|
1225 |
INTERNAL_CONVERT_COMPRESSED_OOP : DECORATORS_NONE)>::value; |
49658 | 1226 |
return PreRuntimeDispatch::load_at<expanded_decorators, DecayedT>(base, offset); |
1227 |
} |
|
1228 |
||
1229 |
template <DecoratorSet decorators, typename P, typename T> |
|
1230 |
inline T atomic_cmpxchg(T new_value, P* addr, T compare_value) { |
|
1231 |
verify_types<decorators, T>(); |
|
1232 |
typedef typename Decay<P>::type DecayedP; |
|
1233 |
typedef typename Decay<T>::type DecayedT; |
|
1234 |
DecayedT new_decayed_value = new_value; |
|
1235 |
DecayedT compare_decayed_value = compare_value; |
|
1236 |
const DecoratorSet expanded_decorators = DecoratorFixup< |
|
1237 |
(!HasDecorator<decorators, MO_DECORATOR_MASK>::value) ? |
|
1238 |
(MO_SEQ_CST | decorators) : decorators>::value; |
|
1239 |
return atomic_cmpxchg_reduce_types<expanded_decorators>(new_decayed_value, |
|
1240 |
const_cast<DecayedP*>(addr), |
|
1241 |
compare_decayed_value); |
|
1242 |
} |
|
1243 |
||
1244 |
template <DecoratorSet decorators, typename T> |
|
1245 |
inline T atomic_cmpxchg_at(T new_value, oop base, ptrdiff_t offset, T compare_value) { |
|
1246 |
verify_types<decorators, T>(); |
|
1247 |
typedef typename Decay<T>::type DecayedT; |
|
1248 |
DecayedT new_decayed_value = new_value; |
|
1249 |
DecayedT compare_decayed_value = compare_value; |
|
1250 |
// Determine default memory ordering |
|
1251 |
const DecoratorSet expanded_decorators = DecoratorFixup< |
|
1252 |
(!HasDecorator<decorators, MO_DECORATOR_MASK>::value) ? |
|
1253 |
(MO_SEQ_CST | decorators) : decorators>::value; |
|
1254 |
// Potentially remember that we need compressed oop awareness |
|
1255 |
const DecoratorSet final_decorators = expanded_decorators | |
|
1256 |
(HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value ? |
|
53075
747d29313e5a
8215492: Rename INTERNAL_EMPTY to something less "internal"
pliden
parents:
52100
diff
changeset
|
1257 |
INTERNAL_CONVERT_COMPRESSED_OOP : DECORATORS_NONE); |
49658 | 1258 |
return PreRuntimeDispatch::atomic_cmpxchg_at<final_decorators>(new_decayed_value, base, |
1259 |
offset, compare_decayed_value); |
|
1260 |
} |
|
1261 |
||
1262 |
template <DecoratorSet decorators, typename P, typename T> |
|
1263 |
inline T atomic_xchg(T new_value, P* addr) { |
|
1264 |
verify_types<decorators, T>(); |
|
1265 |
typedef typename Decay<P>::type DecayedP; |
|
1266 |
typedef typename Decay<T>::type DecayedT; |
|
1267 |
DecayedT new_decayed_value = new_value; |
|
1268 |
// atomic_xchg is only available in SEQ_CST flavour. |
|
1269 |
const DecoratorSet expanded_decorators = DecoratorFixup<decorators | MO_SEQ_CST>::value; |
|
1270 |
return atomic_xchg_reduce_types<expanded_decorators>(new_decayed_value, |
|
1271 |
const_cast<DecayedP*>(addr)); |
|
1272 |
} |
|
1273 |
||
1274 |
template <DecoratorSet decorators, typename T> |
|
1275 |
inline T atomic_xchg_at(T new_value, oop base, ptrdiff_t offset) { |
|
1276 |
verify_types<decorators, T>(); |
|
1277 |
typedef typename Decay<T>::type DecayedT; |
|
1278 |
DecayedT new_decayed_value = new_value; |
|
1279 |
// atomic_xchg is only available in SEQ_CST flavour. |
|
1280 |
const DecoratorSet expanded_decorators = DecoratorFixup<decorators | MO_SEQ_CST | |
|
1281 |
(HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value ? |
|
53075
747d29313e5a
8215492: Rename INTERNAL_EMPTY to something less "internal"
pliden
parents:
52100
diff
changeset
|
1282 |
INTERNAL_CONVERT_COMPRESSED_OOP : DECORATORS_NONE)>::value; |
49658 | 1283 |
return PreRuntimeDispatch::atomic_xchg_at<expanded_decorators>(new_decayed_value, base, offset); |
1284 |
} |
|
1285 |
||
1286 |
template <DecoratorSet decorators, typename T> |
|
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1287 |
inline bool arraycopy(arrayOop src_obj, size_t src_offset_in_bytes, const T* src_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1288 |
arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw, |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1289 |
size_t length) { |
49658 | 1290 |
STATIC_ASSERT((HasDecorator<decorators, INTERNAL_VALUE_IS_OOP>::value || |
1291 |
(IsSame<T, void>::value || IsIntegral<T>::value) || |
|
1292 |
IsFloatingPoint<T>::value)); // arraycopy allows type erased void elements |
|
1293 |
typedef typename Decay<T>::type DecayedT; |
|
50728 | 1294 |
const DecoratorSet expanded_decorators = DecoratorFixup<decorators | IS_ARRAY | IN_HEAP>::value; |
50389
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1295 |
return arraycopy_reduce_types<expanded_decorators>(src_obj, src_offset_in_bytes, const_cast<DecayedT*>(src_raw), |
7e8c0409a747
8198285: More consistent Access API for arraycopy
rkennke
parents:
49906
diff
changeset
|
1296 |
dst_obj, dst_offset_in_bytes, const_cast<DecayedT*>(dst_raw), |
49658 | 1297 |
length); |
1298 |
} |
|
1299 |
||
1300 |
template <DecoratorSet decorators> |
|
1301 |
inline void clone(oop src, oop dst, size_t size) { |
|
1302 |
const DecoratorSet expanded_decorators = DecoratorFixup<decorators>::value; |
|
1303 |
PreRuntimeDispatch::clone<expanded_decorators>(src, dst, size); |
|
1304 |
} |
|
1305 |
||
1306 |
template <DecoratorSet decorators> |
|
1307 |
inline oop resolve(oop obj) { |
|
1308 |
const DecoratorSet expanded_decorators = DecoratorFixup<decorators>::value; |
|
1309 |
return PreRuntimeDispatch::resolve<expanded_decorators>(obj); |
|
1310 |
} |
|
1311 |
||
1312 |
template <DecoratorSet decorators> |
|
1313 |
inline bool equals(oop o1, oop o2) { |
|
1314 |
const DecoratorSet expanded_decorators = DecoratorFixup<decorators>::value; |
|
1315 |
return PreRuntimeDispatch::equals<expanded_decorators>(o1, o2); |
|
1316 |
} |
|
1317 |
||
1318 |
// Infer the type that should be returned from an Access::oop_load. |
|
1319 |
template <typename P, DecoratorSet decorators> |
|
1320 |
class OopLoadProxy: public StackObj { |
|
1321 |
private: |
|
1322 |
P *const _addr; |
|
1323 |
public: |
|
1324 |
OopLoadProxy(P* addr) : _addr(addr) {} |
|
1325 |
||
1326 |
inline operator oop() { |
|
1327 |
return load<decorators | INTERNAL_VALUE_IS_OOP, P, oop>(_addr); |
|
1328 |
} |
|
1329 |
||
1330 |
inline operator narrowOop() { |
|
1331 |
return load<decorators | INTERNAL_VALUE_IS_OOP, P, narrowOop>(_addr); |
|
1332 |
} |
|
1333 |
||
1334 |
template <typename T> |
|
1335 |
inline bool operator ==(const T& other) const { |
|
1336 |
return load<decorators | INTERNAL_VALUE_IS_OOP, P, T>(_addr) == other; |
|
1337 |
} |
|
1338 |
||
1339 |
template <typename T> |
|
1340 |
inline bool operator !=(const T& other) const { |
|
1341 |
return load<decorators | INTERNAL_VALUE_IS_OOP, P, T>(_addr) != other; |
|
1342 |
} |
|
1343 |
}; |
|
1344 |
||
1345 |
// Infer the type that should be returned from an Access::load_at. |
|
1346 |
template <DecoratorSet decorators> |
|
1347 |
class LoadAtProxy: public StackObj { |
|
1348 |
private: |
|
1349 |
const oop _base; |
|
1350 |
const ptrdiff_t _offset; |
|
1351 |
public: |
|
1352 |
LoadAtProxy(oop base, ptrdiff_t offset) : _base(base), _offset(offset) {} |
|
1353 |
||
1354 |
template <typename T> |
|
1355 |
inline operator T() const { |
|
1356 |
return load_at<decorators, T>(_base, _offset); |
|
1357 |
} |
|
1358 |
||
1359 |
template <typename T> |
|
1360 |
inline bool operator ==(const T& other) const { return load_at<decorators, T>(_base, _offset) == other; } |
|
1361 |
||
1362 |
template <typename T> |
|
1363 |
inline bool operator !=(const T& other) const { return load_at<decorators, T>(_base, _offset) != other; } |
|
1364 |
}; |
|
1365 |
||
1366 |
// Infer the type that should be returned from an Access::oop_load_at. |
|
1367 |
template <DecoratorSet decorators> |
|
1368 |
class OopLoadAtProxy: public StackObj { |
|
1369 |
private: |
|
1370 |
const oop _base; |
|
1371 |
const ptrdiff_t _offset; |
|
1372 |
public: |
|
1373 |
OopLoadAtProxy(oop base, ptrdiff_t offset) : _base(base), _offset(offset) {} |
|
1374 |
||
1375 |
inline operator oop() const { |
|
1376 |
return load_at<decorators | INTERNAL_VALUE_IS_OOP, oop>(_base, _offset); |
|
1377 |
} |
|
1378 |
||
1379 |
inline operator narrowOop() const { |
|
1380 |
return load_at<decorators | INTERNAL_VALUE_IS_OOP, narrowOop>(_base, _offset); |
|
1381 |
} |
|
1382 |
||
1383 |
template <typename T> |
|
1384 |
inline bool operator ==(const T& other) const { |
|
1385 |
return load_at<decorators | INTERNAL_VALUE_IS_OOP, T>(_base, _offset) == other; |
|
1386 |
} |
|
1387 |
||
1388 |
template <typename T> |
|
1389 |
inline bool operator !=(const T& other) const { |
|
1390 |
return load_at<decorators | INTERNAL_VALUE_IS_OOP, T>(_base, _offset) != other; |
|
1391 |
} |
|
1392 |
}; |
|
1393 |
} |
|
1394 |
||
1395 |
#endif // SHARE_OOPS_ACCESSBACKEND_HPP |