Print this page
Split |
Close |
Expand all |
Collapse all |
--- old/src/share/vm/runtime/stubRoutines.cpp
+++ new/src/share/vm/runtime/stubRoutines.cpp
1 1 /*
2 - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
2 + * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
3 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 4 *
5 5 * This code is free software; you can redistribute it and/or modify it
6 6 * under the terms of the GNU General Public License version 2 only, as
7 7 * published by the Free Software Foundation.
8 8 *
9 9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 12 * version 2 for more details (a copy is included in the LICENSE file that
13 13 * accompanied this code).
14 14 *
15 15 * You should have received a copy of the GNU General Public License version
16 16 * 2 along with this work; if not, write to the Free Software Foundation,
17 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 18 *
19 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 20 * or visit www.oracle.com if you need additional information or have any
21 21 * questions.
22 22 *
23 23 */
24 24
25 25 #include "precompiled.hpp"
26 26 #include "asm/codeBuffer.hpp"
27 27 #include "memory/resourceArea.hpp"
28 28 #include "oops/oop.inline.hpp"
29 29 #include "runtime/interfaceSupport.hpp"
30 30 #include "runtime/sharedRuntime.hpp"
31 31 #include "runtime/stubRoutines.hpp"
32 32 #include "runtime/timer.hpp"
33 33 #include "utilities/copy.hpp"
34 34 #ifdef COMPILER2
35 35 #include "opto/runtime.hpp"
36 36 #endif
37 37
38 38
39 39 // Implementation of StubRoutines - for a description
40 40 // of how to extend it, see the header file.
41 41
42 42 // Class Variables
43 43
44 44 BufferBlob* StubRoutines::_code1 = NULL;
45 45 BufferBlob* StubRoutines::_code2 = NULL;
46 46
47 47 address StubRoutines::_call_stub_return_address = NULL;
48 48 address StubRoutines::_call_stub_entry = NULL;
49 49
50 50 address StubRoutines::_catch_exception_entry = NULL;
51 51 address StubRoutines::_forward_exception_entry = NULL;
52 52 address StubRoutines::_throw_AbstractMethodError_entry = NULL;
53 53 address StubRoutines::_throw_IncompatibleClassChangeError_entry = NULL;
54 54 address StubRoutines::_throw_ArithmeticException_entry = NULL;
55 55 address StubRoutines::_throw_NullPointerException_entry = NULL;
56 56 address StubRoutines::_throw_NullPointerException_at_call_entry = NULL;
57 57 address StubRoutines::_throw_StackOverflowError_entry = NULL;
58 58 address StubRoutines::_handler_for_unsafe_access_entry = NULL;
59 59 jint StubRoutines::_verify_oop_count = 0;
60 60 address StubRoutines::_verify_oop_subroutine_entry = NULL;
61 61 address StubRoutines::_atomic_xchg_entry = NULL;
62 62 address StubRoutines::_atomic_xchg_ptr_entry = NULL;
63 63 address StubRoutines::_atomic_store_entry = NULL;
64 64 address StubRoutines::_atomic_store_ptr_entry = NULL;
65 65 address StubRoutines::_atomic_cmpxchg_entry = NULL;
66 66 address StubRoutines::_atomic_cmpxchg_ptr_entry = NULL;
67 67 address StubRoutines::_atomic_cmpxchg_long_entry = NULL;
68 68 address StubRoutines::_atomic_add_entry = NULL;
69 69 address StubRoutines::_atomic_add_ptr_entry = NULL;
70 70 address StubRoutines::_fence_entry = NULL;
71 71 address StubRoutines::_d2i_wrapper = NULL;
72 72 address StubRoutines::_d2l_wrapper = NULL;
↓ open down ↓ |
60 lines elided |
↑ open up ↑ |
73 73
74 74 jint StubRoutines::_fpu_cntrl_wrd_std = 0;
75 75 jint StubRoutines::_fpu_cntrl_wrd_24 = 0;
76 76 jint StubRoutines::_fpu_cntrl_wrd_64 = 0;
77 77 jint StubRoutines::_fpu_cntrl_wrd_trunc = 0;
78 78 jint StubRoutines::_mxcsr_std = 0;
79 79 jint StubRoutines::_fpu_subnormal_bias1[3] = { 0, 0, 0 };
80 80 jint StubRoutines::_fpu_subnormal_bias2[3] = { 0, 0, 0 };
81 81
82 82 // Compiled code entry points default values
83 -// The dafault functions don't have separate disjoint versions.
83 +// The default functions don't have separate disjoint versions.
84 84 address StubRoutines::_jbyte_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jbyte_copy);
85 85 address StubRoutines::_jshort_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jshort_copy);
86 86 address StubRoutines::_jint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jint_copy);
87 87 address StubRoutines::_jlong_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jlong_copy);
88 88 address StubRoutines::_oop_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy);
89 +address StubRoutines::_oop_arraycopy_uninit = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy_uninit);
89 90 address StubRoutines::_jbyte_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jbyte_copy);
90 91 address StubRoutines::_jshort_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jshort_copy);
91 92 address StubRoutines::_jint_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jint_copy);
92 93 address StubRoutines::_jlong_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jlong_copy);
93 94 address StubRoutines::_oop_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy);
95 +address StubRoutines::_oop_disjoint_arraycopy_uninit = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy_uninit);
94 96
95 97 address StubRoutines::_arrayof_jbyte_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jbyte_copy);
96 98 address StubRoutines::_arrayof_jshort_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jshort_copy);
97 99 address StubRoutines::_arrayof_jint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jint_copy);
98 100 address StubRoutines::_arrayof_jlong_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jlong_copy);
99 101 address StubRoutines::_arrayof_oop_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy);
102 +address StubRoutines::_arrayof_oop_arraycopy_uninit = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy_uninit);
100 103 address StubRoutines::_arrayof_jbyte_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jbyte_copy);
101 104 address StubRoutines::_arrayof_jshort_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jshort_copy);
102 105 address StubRoutines::_arrayof_jint_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jint_copy);
103 106 address StubRoutines::_arrayof_jlong_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jlong_copy);
104 -address StubRoutines::_arrayof_oop_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy);
107 +address StubRoutines::_arrayof_oop_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy);
108 +address StubRoutines::_arrayof_oop_disjoint_arraycopy_uninit = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy_uninit);
109 +
105 110
106 111 address StubRoutines::_checkcast_arraycopy = NULL;
112 +address StubRoutines::_checkcast_arraycopy_uninit = NULL;
107 113 address StubRoutines::_unsafe_arraycopy = NULL;
108 114 address StubRoutines::_generic_arraycopy = NULL;
109 115
110 116
111 117 address StubRoutines::_jbyte_fill;
112 118 address StubRoutines::_jshort_fill;
113 119 address StubRoutines::_jint_fill;
114 120 address StubRoutines::_arrayof_jbyte_fill;
115 121 address StubRoutines::_arrayof_jshort_fill;
116 122 address StubRoutines::_arrayof_jint_fill;
117 123
118 124
119 125 double (* StubRoutines::_intrinsic_log )(double) = NULL;
120 126 double (* StubRoutines::_intrinsic_log10 )(double) = NULL;
121 127 double (* StubRoutines::_intrinsic_exp )(double) = NULL;
122 128 double (* StubRoutines::_intrinsic_pow )(double, double) = NULL;
123 129 double (* StubRoutines::_intrinsic_sin )(double) = NULL;
124 130 double (* StubRoutines::_intrinsic_cos )(double) = NULL;
125 131 double (* StubRoutines::_intrinsic_tan )(double) = NULL;
126 132
127 133 // Initialization
128 134 //
129 135 // Note: to break cycle with universe initialization, stubs are generated in two phases.
130 136 // The first one generates stubs needed during universe init (e.g., _handle_must_compile_first_entry).
131 137 // The second phase includes all other stubs (which may depend on universe being initialized.)
132 138
133 139 extern void StubGenerator_generate(CodeBuffer* code, bool all); // only interface to generators
134 140
135 141 void StubRoutines::initialize1() {
136 142 if (_code1 == NULL) {
137 143 ResourceMark rm;
138 144 TraceTime timer("StubRoutines generation 1", TraceStartupTime);
139 145 _code1 = BufferBlob::create("StubRoutines (1)", code_size1);
140 146 if (_code1 == NULL) {
141 147 vm_exit_out_of_memory(code_size1, "CodeCache: no room for StubRoutines (1)");
142 148 }
143 149 CodeBuffer buffer(_code1);
144 150 StubGenerator_generate(&buffer, false);
145 151 }
146 152 }
147 153
148 154
149 155 #ifdef ASSERT
150 156 typedef void (*arraycopy_fn)(address src, address dst, int count);
151 157
152 158 // simple tests of generated arraycopy functions
153 159 static void test_arraycopy_func(address func, int alignment) {
154 160 int v = 0xcc;
155 161 int v2 = 0x11;
156 162 jlong lbuffer[8];
157 163 jlong lbuffer2[8];
158 164 address fbuffer = (address) lbuffer;
159 165 address fbuffer2 = (address) lbuffer2;
160 166 unsigned int i;
161 167 for (i = 0; i < sizeof(lbuffer); i++) {
162 168 fbuffer[i] = v; fbuffer2[i] = v2;
163 169 }
164 170 // C++ does not guarantee jlong[] array alignment to 8 bytes.
165 171 // Use middle of array to check that memory before it is not modified.
166 172 address buffer = (address) round_to((intptr_t)&lbuffer[4], BytesPerLong);
167 173 address buffer2 = (address) round_to((intptr_t)&lbuffer2[4], BytesPerLong);
168 174 // do an aligned copy
169 175 ((arraycopy_fn)func)(buffer, buffer2, 0);
170 176 for (i = 0; i < sizeof(lbuffer); i++) {
171 177 assert(fbuffer[i] == v && fbuffer2[i] == v2, "shouldn't have copied anything");
172 178 }
173 179 // adjust destination alignment
174 180 ((arraycopy_fn)func)(buffer, buffer2 + alignment, 0);
175 181 for (i = 0; i < sizeof(lbuffer); i++) {
176 182 assert(fbuffer[i] == v && fbuffer2[i] == v2, "shouldn't have copied anything");
177 183 }
178 184 // adjust source alignment
179 185 ((arraycopy_fn)func)(buffer + alignment, buffer2, 0);
180 186 for (i = 0; i < sizeof(lbuffer); i++) {
181 187 assert(fbuffer[i] == v && fbuffer2[i] == v2, "shouldn't have copied anything");
182 188 }
183 189 }
184 190 #endif
185 191
186 192
187 193 void StubRoutines::initialize2() {
188 194 if (_code2 == NULL) {
189 195 ResourceMark rm;
190 196 TraceTime timer("StubRoutines generation 2", TraceStartupTime);
191 197 _code2 = BufferBlob::create("StubRoutines (2)", code_size2);
192 198 if (_code2 == NULL) {
193 199 vm_exit_out_of_memory(code_size2, "CodeCache: no room for StubRoutines (2)");
194 200 }
195 201 CodeBuffer buffer(_code2);
196 202 StubGenerator_generate(&buffer, true);
197 203 }
198 204
199 205 #ifdef ASSERT
200 206
201 207 #define TEST_ARRAYCOPY(type) \
202 208 test_arraycopy_func( type##_arraycopy(), sizeof(type)); \
203 209 test_arraycopy_func( type##_disjoint_arraycopy(), sizeof(type)); \
204 210 test_arraycopy_func(arrayof_##type##_arraycopy(), sizeof(HeapWord)); \
205 211 test_arraycopy_func(arrayof_##type##_disjoint_arraycopy(), sizeof(HeapWord))
206 212
207 213 // Make sure all the arraycopy stubs properly handle zero count
208 214 TEST_ARRAYCOPY(jbyte);
209 215 TEST_ARRAYCOPY(jshort);
210 216 TEST_ARRAYCOPY(jint);
211 217 TEST_ARRAYCOPY(jlong);
212 218
213 219 #undef TEST_ARRAYCOPY
214 220
215 221 #define TEST_FILL(type) \
216 222 if (_##type##_fill != NULL) { \
217 223 union { \
218 224 double d; \
219 225 type body[96]; \
220 226 } s; \
221 227 \
222 228 int v = 32; \
223 229 for (int offset = -2; offset <= 2; offset++) { \
224 230 for (int i = 0; i < 96; i++) { \
225 231 s.body[i] = 1; \
226 232 } \
227 233 type* start = s.body + 8 + offset; \
228 234 for (int aligned = 0; aligned < 2; aligned++) { \
229 235 if (aligned) { \
230 236 if (((intptr_t)start) % HeapWordSize == 0) { \
231 237 ((void (*)(type*, int, int))StubRoutines::_arrayof_##type##_fill)(start, v, 80); \
232 238 } else { \
233 239 continue; \
234 240 } \
235 241 } else { \
236 242 ((void (*)(type*, int, int))StubRoutines::_##type##_fill)(start, v, 80); \
237 243 } \
238 244 for (int i = 0; i < 96; i++) { \
239 245 if (i < (8 + offset) || i >= (88 + offset)) { \
240 246 assert(s.body[i] == 1, "what?"); \
241 247 } else { \
242 248 assert(s.body[i] == 32, "what?"); \
243 249 } \
244 250 } \
245 251 } \
246 252 } \
247 253 } \
248 254
249 255 TEST_FILL(jbyte);
250 256 TEST_FILL(jshort);
251 257 TEST_FILL(jint);
252 258
253 259 #undef TEST_FILL
254 260
255 261 #define TEST_COPYRTN(type) \
256 262 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::conjoint_##type##s_atomic), sizeof(type)); \
257 263 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::arrayof_conjoint_##type##s), (int)MAX2(sizeof(HeapWord), sizeof(type)))
258 264
259 265 // Make sure all the copy runtime routines properly handle zero count
260 266 TEST_COPYRTN(jbyte);
261 267 TEST_COPYRTN(jshort);
262 268 TEST_COPYRTN(jint);
263 269 TEST_COPYRTN(jlong);
264 270
265 271 #undef TEST_COPYRTN
266 272
267 273 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::conjoint_words), sizeof(HeapWord));
268 274 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::disjoint_words), sizeof(HeapWord));
269 275 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::disjoint_words_atomic), sizeof(HeapWord));
270 276 // Aligned to BytesPerLong
271 277 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::aligned_conjoint_words), sizeof(jlong));
272 278 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::aligned_disjoint_words), sizeof(jlong));
273 279
274 280 #endif
↓ open down ↓ |
158 lines elided |
↑ open up ↑ |
275 281 }
276 282
277 283
278 284 void stubRoutines_init1() { StubRoutines::initialize1(); }
279 285 void stubRoutines_init2() { StubRoutines::initialize2(); }
280 286
281 287 //
282 288 // Default versions of arraycopy functions
283 289 //
284 290
285 -static void gen_arraycopy_barrier_pre(oop* dest, size_t count) {
291 +static void gen_arraycopy_barrier_pre(oop* dest, size_t count, bool dest_uninitialized) {
286 292 assert(count != 0, "count should be non-zero");
287 293 assert(count <= (size_t)max_intx, "count too large");
288 294 BarrierSet* bs = Universe::heap()->barrier_set();
289 295 assert(bs->has_write_ref_array_pre_opt(), "Must have pre-barrier opt");
290 - bs->write_ref_array_pre(dest, (int)count);
296 + bs->write_ref_array_pre(dest, (int)count, dest_uninitialized);
291 297 }
292 298
293 299 static void gen_arraycopy_barrier(oop* dest, size_t count) {
294 300 assert(count != 0, "count should be non-zero");
295 301 BarrierSet* bs = Universe::heap()->barrier_set();
296 302 assert(bs->has_write_ref_array_opt(), "Barrier set must have ref array opt");
297 303 bs->write_ref_array((HeapWord*)dest, count);
298 304 }
299 305
300 306 JRT_LEAF(void, StubRoutines::jbyte_copy(jbyte* src, jbyte* dest, size_t count))
301 307 #ifndef PRODUCT
302 308 SharedRuntime::_jbyte_array_copy_ctr++; // Slow-path byte array copy
303 309 #endif // !PRODUCT
304 310 Copy::conjoint_jbytes_atomic(src, dest, count);
305 311 JRT_END
306 312
307 313 JRT_LEAF(void, StubRoutines::jshort_copy(jshort* src, jshort* dest, size_t count))
308 314 #ifndef PRODUCT
309 315 SharedRuntime::_jshort_array_copy_ctr++; // Slow-path short/char array copy
310 316 #endif // !PRODUCT
311 317 Copy::conjoint_jshorts_atomic(src, dest, count);
312 318 JRT_END
313 319
314 320 JRT_LEAF(void, StubRoutines::jint_copy(jint* src, jint* dest, size_t count))
315 321 #ifndef PRODUCT
316 322 SharedRuntime::_jint_array_copy_ctr++; // Slow-path int/float array copy
317 323 #endif // !PRODUCT
318 324 Copy::conjoint_jints_atomic(src, dest, count);
319 325 JRT_END
320 326
321 327 JRT_LEAF(void, StubRoutines::jlong_copy(jlong* src, jlong* dest, size_t count))
322 328 #ifndef PRODUCT
↓ open down ↓ |
22 lines elided |
↑ open up ↑ |
323 329 SharedRuntime::_jlong_array_copy_ctr++; // Slow-path long/double array copy
324 330 #endif // !PRODUCT
325 331 Copy::conjoint_jlongs_atomic(src, dest, count);
326 332 JRT_END
327 333
328 334 JRT_LEAF(void, StubRoutines::oop_copy(oop* src, oop* dest, size_t count))
329 335 #ifndef PRODUCT
330 336 SharedRuntime::_oop_array_copy_ctr++; // Slow-path oop array copy
331 337 #endif // !PRODUCT
332 338 assert(count != 0, "count should be non-zero");
333 - gen_arraycopy_barrier_pre(dest, count);
339 + gen_arraycopy_barrier_pre(dest, count, /*dest_uninitialized*/false);
340 + Copy::conjoint_oops_atomic(src, dest, count);
341 + gen_arraycopy_barrier(dest, count);
342 +JRT_END
343 +
344 +JRT_LEAF(void, StubRoutines::oop_copy_uninit(oop* src, oop* dest, size_t count))
345 +#ifndef PRODUCT
346 + SharedRuntime::_oop_array_copy_ctr++; // Slow-path oop array copy
347 +#endif // !PRODUCT
348 + assert(count != 0, "count should be non-zero");
349 + gen_arraycopy_barrier_pre(dest, count, /*dest_uninitialized*/true);
334 350 Copy::conjoint_oops_atomic(src, dest, count);
335 351 gen_arraycopy_barrier(dest, count);
336 352 JRT_END
337 353
338 354 JRT_LEAF(void, StubRoutines::arrayof_jbyte_copy(HeapWord* src, HeapWord* dest, size_t count))
339 355 #ifndef PRODUCT
340 356 SharedRuntime::_jbyte_array_copy_ctr++; // Slow-path byte array copy
341 357 #endif // !PRODUCT
342 358 Copy::arrayof_conjoint_jbytes(src, dest, count);
343 359 JRT_END
344 360
345 361 JRT_LEAF(void, StubRoutines::arrayof_jshort_copy(HeapWord* src, HeapWord* dest, size_t count))
346 362 #ifndef PRODUCT
347 363 SharedRuntime::_jshort_array_copy_ctr++; // Slow-path short/char array copy
348 364 #endif // !PRODUCT
349 365 Copy::arrayof_conjoint_jshorts(src, dest, count);
350 366 JRT_END
351 367
352 368 JRT_LEAF(void, StubRoutines::arrayof_jint_copy(HeapWord* src, HeapWord* dest, size_t count))
353 369 #ifndef PRODUCT
354 370 SharedRuntime::_jint_array_copy_ctr++; // Slow-path int/float array copy
355 371 #endif // !PRODUCT
356 372 Copy::arrayof_conjoint_jints(src, dest, count);
357 373 JRT_END
358 374
359 375 JRT_LEAF(void, StubRoutines::arrayof_jlong_copy(HeapWord* src, HeapWord* dest, size_t count))
360 376 #ifndef PRODUCT
↓ open down ↓ |
17 lines elided |
↑ open up ↑ |
361 377 SharedRuntime::_jlong_array_copy_ctr++; // Slow-path int/float array copy
362 378 #endif // !PRODUCT
363 379 Copy::arrayof_conjoint_jlongs(src, dest, count);
364 380 JRT_END
365 381
366 382 JRT_LEAF(void, StubRoutines::arrayof_oop_copy(HeapWord* src, HeapWord* dest, size_t count))
367 383 #ifndef PRODUCT
368 384 SharedRuntime::_oop_array_copy_ctr++; // Slow-path oop array copy
369 385 #endif // !PRODUCT
370 386 assert(count != 0, "count should be non-zero");
371 - gen_arraycopy_barrier_pre((oop *) dest, count);
387 + gen_arraycopy_barrier_pre((oop *) dest, count, /*dest_uninitialized*/false);
372 388 Copy::arrayof_conjoint_oops(src, dest, count);
373 389 gen_arraycopy_barrier((oop *) dest, count);
374 390 JRT_END
375 391
392 +JRT_LEAF(void, StubRoutines::arrayof_oop_copy_uninit(HeapWord* src, HeapWord* dest, size_t count))
393 +#ifndef PRODUCT
394 + SharedRuntime::_oop_array_copy_ctr++; // Slow-path oop array copy
395 +#endif // !PRODUCT
396 + assert(count != 0, "count should be non-zero");
397 + gen_arraycopy_barrier_pre((oop *) dest, count, /*dest_uninitialized*/true);
398 + Copy::arrayof_conjoint_oops(src, dest, count);
399 + gen_arraycopy_barrier((oop *) dest, count);
400 +JRT_END
376 401
377 402 address StubRoutines::select_fill_function(BasicType t, bool aligned, const char* &name) {
378 403 #define RETURN_STUB(xxx_fill) { \
379 404 name = #xxx_fill; \
380 405 return StubRoutines::xxx_fill(); }
381 406
382 407 switch (t) {
383 408 case T_BYTE:
384 409 case T_BOOLEAN:
385 410 if (!aligned) RETURN_STUB(jbyte_fill);
386 411 RETURN_STUB(arrayof_jbyte_fill);
387 412 case T_CHAR:
388 413 case T_SHORT:
389 414 if (!aligned) RETURN_STUB(jshort_fill);
390 415 RETURN_STUB(arrayof_jshort_fill);
391 416 case T_INT:
392 417 case T_FLOAT:
393 418 if (!aligned) RETURN_STUB(jint_fill);
394 419 RETURN_STUB(arrayof_jint_fill);
395 420 case T_DOUBLE:
396 421 case T_LONG:
397 422 case T_ARRAY:
398 423 case T_OBJECT:
399 424 case T_NARROWOOP:
400 425 case T_ADDRESS:
401 426 // Currently unsupported
402 427 return NULL;
403 428
404 429 default:
405 430 ShouldNotReachHere();
406 431 return NULL;
407 432 }
408 433
409 434 #undef RETURN_STUB
410 435 }
↓ open down ↓ |
25 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX