Mercurial > hg > graal-jvmci-8
annotate src/share/vm/runtime/stubRoutines.cpp @ 1716:be3f9c242c9d
6948538: CMS: BOT walkers can fall into object allocation and initialization cracks
Summary: GC workers now recognize an intermediate transient state of blocks which are allocated but have not yet completed initialization. blk_start() calls do not attempt to determine the size of a block in the transient state, rather waiting for the block to become initialized so that it is safe to query its size. Audited and ensured the order of initialization of object fields (klass, free bit and size) to respect block state transition protocol. Also included some new assertion checking code enabled in debug mode.
Reviewed-by: chrisphi, johnc, poonam
author | ysr |
---|---|
date | Mon, 16 Aug 2010 15:58:42 -0700 |
parents | d93949c5bdcc |
children | 3e8fbc61cee8 d6f45b55c972 |
rev | line source |
---|---|
0 | 1 /* |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1490
diff
changeset
|
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1490
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1490
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1490
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
25 #include "incls/_precompiled.incl" | |
26 #include "incls/_stubRoutines.cpp.incl" | |
27 | |
28 | |
29 // Implementation of StubRoutines - for a description | |
30 // of how to extend it, see the header file. | |
31 | |
32 // Class Variables | |
33 | |
34 BufferBlob* StubRoutines::_code1 = NULL; | |
35 BufferBlob* StubRoutines::_code2 = NULL; | |
36 | |
37 address StubRoutines::_call_stub_return_address = NULL; | |
38 address StubRoutines::_call_stub_entry = NULL; | |
39 | |
40 address StubRoutines::_catch_exception_entry = NULL; | |
41 address StubRoutines::_forward_exception_entry = NULL; | |
42 address StubRoutines::_throw_AbstractMethodError_entry = NULL; | |
16
f8236e79048a
6664627: Merge changes made only in hotspot 11 forward to jdk 7
dcubed
parents:
0
diff
changeset
|
43 address StubRoutines::_throw_IncompatibleClassChangeError_entry = NULL; |
0 | 44 address StubRoutines::_throw_ArithmeticException_entry = NULL; |
45 address StubRoutines::_throw_NullPointerException_entry = NULL; | |
46 address StubRoutines::_throw_NullPointerException_at_call_entry = NULL; | |
47 address StubRoutines::_throw_StackOverflowError_entry = NULL; | |
48 address StubRoutines::_handler_for_unsafe_access_entry = NULL; | |
49 jint StubRoutines::_verify_oop_count = 0; | |
50 address StubRoutines::_verify_oop_subroutine_entry = NULL; | |
51 address StubRoutines::_atomic_xchg_entry = NULL; | |
52 address StubRoutines::_atomic_xchg_ptr_entry = NULL; | |
53 address StubRoutines::_atomic_store_entry = NULL; | |
54 address StubRoutines::_atomic_store_ptr_entry = NULL; | |
55 address StubRoutines::_atomic_cmpxchg_entry = NULL; | |
56 address StubRoutines::_atomic_cmpxchg_ptr_entry = NULL; | |
57 address StubRoutines::_atomic_cmpxchg_long_entry = NULL; | |
58 address StubRoutines::_atomic_add_entry = NULL; | |
59 address StubRoutines::_atomic_add_ptr_entry = NULL; | |
60 address StubRoutines::_fence_entry = NULL; | |
61 address StubRoutines::_d2i_wrapper = NULL; | |
62 address StubRoutines::_d2l_wrapper = NULL; | |
63 | |
64 jint StubRoutines::_fpu_cntrl_wrd_std = 0; | |
65 jint StubRoutines::_fpu_cntrl_wrd_24 = 0; | |
66 jint StubRoutines::_fpu_cntrl_wrd_64 = 0; | |
67 jint StubRoutines::_fpu_cntrl_wrd_trunc = 0; | |
68 jint StubRoutines::_mxcsr_std = 0; | |
69 jint StubRoutines::_fpu_subnormal_bias1[3] = { 0, 0, 0 }; | |
70 jint StubRoutines::_fpu_subnormal_bias2[3] = { 0, 0, 0 }; | |
71 | |
72 // Compiled code entry points default values | |
73 // The dafault functions don't have separate disjoint versions. | |
74 address StubRoutines::_jbyte_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jbyte_copy); | |
75 address StubRoutines::_jshort_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jshort_copy); | |
76 address StubRoutines::_jint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jint_copy); | |
77 address StubRoutines::_jlong_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jlong_copy); | |
78 address StubRoutines::_oop_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy); | |
79 address StubRoutines::_jbyte_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jbyte_copy); | |
80 address StubRoutines::_jshort_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jshort_copy); | |
81 address StubRoutines::_jint_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jint_copy); | |
82 address StubRoutines::_jlong_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jlong_copy); | |
83 address StubRoutines::_oop_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy); | |
84 | |
85 address StubRoutines::_arrayof_jbyte_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jbyte_copy); | |
86 address StubRoutines::_arrayof_jshort_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jshort_copy); | |
87 address StubRoutines::_arrayof_jint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jint_copy); | |
88 address StubRoutines::_arrayof_jlong_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jlong_copy); | |
89 address StubRoutines::_arrayof_oop_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy); | |
90 address StubRoutines::_arrayof_jbyte_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jbyte_copy); | |
91 address StubRoutines::_arrayof_jshort_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jshort_copy); | |
92 address StubRoutines::_arrayof_jint_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jint_copy); | |
93 address StubRoutines::_arrayof_jlong_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jlong_copy); | |
94 address StubRoutines::_arrayof_oop_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy); | |
95 | |
96 address StubRoutines::_checkcast_arraycopy = NULL; | |
97 address StubRoutines::_unsafe_arraycopy = NULL; | |
98 address StubRoutines::_generic_arraycopy = NULL; | |
99 | |
1174
ddb7834449d0
6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents:
16
diff
changeset
|
100 double (* StubRoutines::_intrinsic_log )(double) = NULL; |
ddb7834449d0
6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents:
16
diff
changeset
|
101 double (* StubRoutines::_intrinsic_log10 )(double) = NULL; |
ddb7834449d0
6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents:
16
diff
changeset
|
102 double (* StubRoutines::_intrinsic_exp )(double) = NULL; |
ddb7834449d0
6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents:
16
diff
changeset
|
103 double (* StubRoutines::_intrinsic_pow )(double, double) = NULL; |
ddb7834449d0
6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents:
16
diff
changeset
|
104 double (* StubRoutines::_intrinsic_sin )(double) = NULL; |
ddb7834449d0
6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents:
16
diff
changeset
|
105 double (* StubRoutines::_intrinsic_cos )(double) = NULL; |
ddb7834449d0
6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents:
16
diff
changeset
|
106 double (* StubRoutines::_intrinsic_tan )(double) = NULL; |
ddb7834449d0
6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents:
16
diff
changeset
|
107 |
0 | 108 // Initialization |
109 // | |
110 // Note: to break cycle with universe initialization, stubs are generated in two phases. | |
111 // The first one generates stubs needed during universe init (e.g., _handle_must_compile_first_entry). | |
112 // The second phase includes all other stubs (which may depend on universe being initialized.) | |
113 | |
114 extern void StubGenerator_generate(CodeBuffer* code, bool all); // only interface to generators | |
115 | |
116 void StubRoutines::initialize1() { | |
117 if (_code1 == NULL) { | |
118 ResourceMark rm; | |
119 TraceTime timer("StubRoutines generation 1", TraceStartupTime); | |
120 _code1 = BufferBlob::create("StubRoutines (1)", code_size1); | |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
1245
diff
changeset
|
121 if (_code1 == NULL) { |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
1245
diff
changeset
|
122 vm_exit_out_of_memory(code_size1, |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
1245
diff
changeset
|
123 "CodeCache: no room for StubRoutines (1)"); |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
1245
diff
changeset
|
124 } |
0 | 125 CodeBuffer buffer(_code1->instructions_begin(), _code1->instructions_size()); |
126 StubGenerator_generate(&buffer, false); | |
127 } | |
128 } | |
129 | |
130 | |
131 #ifdef ASSERT | |
132 typedef void (*arraycopy_fn)(address src, address dst, int count); | |
133 | |
134 // simple tests of generated arraycopy functions | |
135 static void test_arraycopy_func(address func, int alignment) { | |
136 int v = 0xcc; | |
137 int v2 = 0x11; | |
1603
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
138 jlong lbuffer[8]; |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
139 jlong lbuffer2[8]; |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
140 address fbuffer = (address) lbuffer; |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
141 address fbuffer2 = (address) lbuffer2; |
0 | 142 unsigned int i; |
143 for (i = 0; i < sizeof(lbuffer); i++) { | |
1603
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
144 fbuffer[i] = v; fbuffer2[i] = v2; |
0 | 145 } |
1603
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
146 // C++ does not guarantee jlong[] array alignment to 8 bytes. |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
147 // Use middle of array to check that memory before it is not modified. |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
148 address buffer = (address) round_to((intptr_t)&lbuffer[4], BytesPerLong); |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
149 address buffer2 = (address) round_to((intptr_t)&lbuffer2[4], BytesPerLong); |
0 | 150 // do an aligned copy |
151 ((arraycopy_fn)func)(buffer, buffer2, 0); | |
152 for (i = 0; i < sizeof(lbuffer); i++) { | |
1603
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
153 assert(fbuffer[i] == v && fbuffer2[i] == v2, "shouldn't have copied anything"); |
0 | 154 } |
155 // adjust destination alignment | |
156 ((arraycopy_fn)func)(buffer, buffer2 + alignment, 0); | |
157 for (i = 0; i < sizeof(lbuffer); i++) { | |
1603
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
158 assert(fbuffer[i] == v && fbuffer2[i] == v2, "shouldn't have copied anything"); |
0 | 159 } |
160 // adjust source alignment | |
161 ((arraycopy_fn)func)(buffer + alignment, buffer2, 0); | |
162 for (i = 0; i < sizeof(lbuffer); i++) { | |
1603
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
163 assert(fbuffer[i] == v && fbuffer2[i] == v2, "shouldn't have copied anything"); |
0 | 164 } |
165 } | |
166 #endif | |
167 | |
168 | |
169 void StubRoutines::initialize2() { | |
170 if (_code2 == NULL) { | |
171 ResourceMark rm; | |
172 TraceTime timer("StubRoutines generation 2", TraceStartupTime); | |
173 _code2 = BufferBlob::create("StubRoutines (2)", code_size2); | |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
1245
diff
changeset
|
174 if (_code2 == NULL) { |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
1245
diff
changeset
|
175 vm_exit_out_of_memory(code_size2, |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
1245
diff
changeset
|
176 "CodeCache: no room for StubRoutines (2)"); |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
1245
diff
changeset
|
177 } |
0 | 178 CodeBuffer buffer(_code2->instructions_begin(), _code2->instructions_size()); |
179 StubGenerator_generate(&buffer, true); | |
180 } | |
181 | |
182 #ifdef ASSERT | |
183 | |
184 #define TEST_ARRAYCOPY(type) \ | |
185 test_arraycopy_func( type##_arraycopy(), sizeof(type)); \ | |
186 test_arraycopy_func( type##_disjoint_arraycopy(), sizeof(type)); \ | |
187 test_arraycopy_func(arrayof_##type##_arraycopy(), sizeof(HeapWord)); \ | |
188 test_arraycopy_func(arrayof_##type##_disjoint_arraycopy(), sizeof(HeapWord)) | |
189 | |
1603
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
190 // Make sure all the arraycopy stubs properly handle zero count |
0 | 191 TEST_ARRAYCOPY(jbyte); |
192 TEST_ARRAYCOPY(jshort); | |
193 TEST_ARRAYCOPY(jint); | |
194 TEST_ARRAYCOPY(jlong); | |
195 | |
196 #undef TEST_ARRAYCOPY | |
197 | |
1603
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
198 #define TEST_COPYRTN(type) \ |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
199 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::conjoint_##type##s_atomic), sizeof(type)); \ |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
200 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::arrayof_conjoint_##type##s), (int)MAX2(sizeof(HeapWord), sizeof(type))) |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
201 |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
202 // Make sure all the copy runtime routines properly handle zero count |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
203 TEST_COPYRTN(jbyte); |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
204 TEST_COPYRTN(jshort); |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
205 TEST_COPYRTN(jint); |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
206 TEST_COPYRTN(jlong); |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
207 |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
208 #undef TEST_COPYRTN |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
209 |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
210 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::conjoint_words), sizeof(HeapWord)); |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
211 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::disjoint_words), sizeof(HeapWord)); |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
212 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::disjoint_words_atomic), sizeof(HeapWord)); |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
213 // Aligned to BytesPerLong |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
214 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::aligned_conjoint_words), sizeof(jlong)); |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
215 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::aligned_disjoint_words), sizeof(jlong)); |
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
216 |
0 | 217 #endif |
218 } | |
219 | |
220 | |
221 void stubRoutines_init1() { StubRoutines::initialize1(); } | |
222 void stubRoutines_init2() { StubRoutines::initialize2(); } | |
223 | |
224 // | |
225 // Default versions of arraycopy functions | |
226 // | |
227 | |
1245
6484c4ee11cb
6904516: More object array barrier fixes, following up on 6906727
ysr
parents:
1174
diff
changeset
|
228 static void gen_arraycopy_barrier_pre(oop* dest, size_t count) { |
6484c4ee11cb
6904516: More object array barrier fixes, following up on 6906727
ysr
parents:
1174
diff
changeset
|
229 assert(count != 0, "count should be non-zero"); |
6484c4ee11cb
6904516: More object array barrier fixes, following up on 6906727
ysr
parents:
1174
diff
changeset
|
230 assert(count <= (size_t)max_intx, "count too large"); |
6484c4ee11cb
6904516: More object array barrier fixes, following up on 6906727
ysr
parents:
1174
diff
changeset
|
231 BarrierSet* bs = Universe::heap()->barrier_set(); |
6484c4ee11cb
6904516: More object array barrier fixes, following up on 6906727
ysr
parents:
1174
diff
changeset
|
232 assert(bs->has_write_ref_array_pre_opt(), "Must have pre-barrier opt"); |
6484c4ee11cb
6904516: More object array barrier fixes, following up on 6906727
ysr
parents:
1174
diff
changeset
|
233 bs->write_ref_array_pre(dest, (int)count); |
6484c4ee11cb
6904516: More object array barrier fixes, following up on 6906727
ysr
parents:
1174
diff
changeset
|
234 } |
6484c4ee11cb
6904516: More object array barrier fixes, following up on 6906727
ysr
parents:
1174
diff
changeset
|
235 |
0 | 236 static void gen_arraycopy_barrier(oop* dest, size_t count) { |
237 assert(count != 0, "count should be non-zero"); | |
238 BarrierSet* bs = Universe::heap()->barrier_set(); | |
239 assert(bs->has_write_ref_array_opt(), "Barrier set must have ref array opt"); | |
1245
6484c4ee11cb
6904516: More object array barrier fixes, following up on 6906727
ysr
parents:
1174
diff
changeset
|
240 bs->write_ref_array((HeapWord*)dest, count); |
0 | 241 } |
242 | |
243 JRT_LEAF(void, StubRoutines::jbyte_copy(jbyte* src, jbyte* dest, size_t count)) | |
244 #ifndef PRODUCT | |
245 SharedRuntime::_jbyte_array_copy_ctr++; // Slow-path byte array copy | |
246 #endif // !PRODUCT | |
1603
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
247 Copy::conjoint_jbytes_atomic(src, dest, count); |
0 | 248 JRT_END |
249 | |
250 JRT_LEAF(void, StubRoutines::jshort_copy(jshort* src, jshort* dest, size_t count)) | |
251 #ifndef PRODUCT | |
252 SharedRuntime::_jshort_array_copy_ctr++; // Slow-path short/char array copy | |
253 #endif // !PRODUCT | |
254 Copy::conjoint_jshorts_atomic(src, dest, count); | |
255 JRT_END | |
256 | |
257 JRT_LEAF(void, StubRoutines::jint_copy(jint* src, jint* dest, size_t count)) | |
258 #ifndef PRODUCT | |
259 SharedRuntime::_jint_array_copy_ctr++; // Slow-path int/float array copy | |
260 #endif // !PRODUCT | |
261 Copy::conjoint_jints_atomic(src, dest, count); | |
262 JRT_END | |
263 | |
264 JRT_LEAF(void, StubRoutines::jlong_copy(jlong* src, jlong* dest, size_t count)) | |
265 #ifndef PRODUCT | |
266 SharedRuntime::_jlong_array_copy_ctr++; // Slow-path long/double array copy | |
267 #endif // !PRODUCT | |
268 Copy::conjoint_jlongs_atomic(src, dest, count); | |
269 JRT_END | |
270 | |
271 JRT_LEAF(void, StubRoutines::oop_copy(oop* src, oop* dest, size_t count)) | |
272 #ifndef PRODUCT | |
273 SharedRuntime::_oop_array_copy_ctr++; // Slow-path oop array copy | |
274 #endif // !PRODUCT | |
275 assert(count != 0, "count should be non-zero"); | |
1245
6484c4ee11cb
6904516: More object array barrier fixes, following up on 6906727
ysr
parents:
1174
diff
changeset
|
276 gen_arraycopy_barrier_pre(dest, count); |
0 | 277 Copy::conjoint_oops_atomic(src, dest, count); |
278 gen_arraycopy_barrier(dest, count); | |
279 JRT_END | |
280 | |
281 JRT_LEAF(void, StubRoutines::arrayof_jbyte_copy(HeapWord* src, HeapWord* dest, size_t count)) | |
282 #ifndef PRODUCT | |
283 SharedRuntime::_jbyte_array_copy_ctr++; // Slow-path byte array copy | |
284 #endif // !PRODUCT | |
1603
d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents:
1552
diff
changeset
|
285 Copy::arrayof_conjoint_jbytes(src, dest, count); |
0 | 286 JRT_END |
287 | |
288 JRT_LEAF(void, StubRoutines::arrayof_jshort_copy(HeapWord* src, HeapWord* dest, size_t count)) | |
289 #ifndef PRODUCT | |
290 SharedRuntime::_jshort_array_copy_ctr++; // Slow-path short/char array copy | |
291 #endif // !PRODUCT | |
292 Copy::arrayof_conjoint_jshorts(src, dest, count); | |
293 JRT_END | |
294 | |
295 JRT_LEAF(void, StubRoutines::arrayof_jint_copy(HeapWord* src, HeapWord* dest, size_t count)) | |
296 #ifndef PRODUCT | |
297 SharedRuntime::_jint_array_copy_ctr++; // Slow-path int/float array copy | |
298 #endif // !PRODUCT | |
299 Copy::arrayof_conjoint_jints(src, dest, count); | |
300 JRT_END | |
301 | |
302 JRT_LEAF(void, StubRoutines::arrayof_jlong_copy(HeapWord* src, HeapWord* dest, size_t count)) | |
303 #ifndef PRODUCT | |
304 SharedRuntime::_jlong_array_copy_ctr++; // Slow-path int/float array copy | |
305 #endif // !PRODUCT | |
306 Copy::arrayof_conjoint_jlongs(src, dest, count); | |
307 JRT_END | |
308 | |
309 JRT_LEAF(void, StubRoutines::arrayof_oop_copy(HeapWord* src, HeapWord* dest, size_t count)) | |
310 #ifndef PRODUCT | |
311 SharedRuntime::_oop_array_copy_ctr++; // Slow-path oop array copy | |
312 #endif // !PRODUCT | |
313 assert(count != 0, "count should be non-zero"); | |
1245
6484c4ee11cb
6904516: More object array barrier fixes, following up on 6906727
ysr
parents:
1174
diff
changeset
|
314 gen_arraycopy_barrier_pre((oop *) dest, count); |
0 | 315 Copy::arrayof_conjoint_oops(src, dest, count); |
316 gen_arraycopy_barrier((oop *) dest, count); | |
317 JRT_END |