1.1 --- a/src/share/vm/runtime/stubRoutines.cpp Tue Mar 01 10:27:15 2011 -0800 1.2 +++ b/src/share/vm/runtime/stubRoutines.cpp Tue Mar 01 14:56:48 2011 -0800 1.3 @@ -1,5 +1,5 @@ 1.4 /* 1.5 - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. 1.6 + * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. 1.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.8 * 1.9 * This code is free software; you can redistribute it and/or modify it 1.10 @@ -80,30 +80,36 @@ 1.11 jint StubRoutines::_fpu_subnormal_bias2[3] = { 0, 0, 0 }; 1.12 1.13 // Compiled code entry points default values 1.14 -// The dafault functions don't have separate disjoint versions. 1.15 +// The default functions don't have separate disjoint versions. 1.16 address StubRoutines::_jbyte_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jbyte_copy); 1.17 address StubRoutines::_jshort_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jshort_copy); 1.18 address StubRoutines::_jint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jint_copy); 1.19 address StubRoutines::_jlong_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jlong_copy); 1.20 address StubRoutines::_oop_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy); 1.21 +address StubRoutines::_oop_arraycopy_uninit = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy_uninit); 1.22 address StubRoutines::_jbyte_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jbyte_copy); 1.23 address StubRoutines::_jshort_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jshort_copy); 1.24 address StubRoutines::_jint_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jint_copy); 1.25 address StubRoutines::_jlong_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jlong_copy); 1.26 address StubRoutines::_oop_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy); 1.27 +address StubRoutines::_oop_disjoint_arraycopy_uninit = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy_uninit); 1.28 1.29 address StubRoutines::_arrayof_jbyte_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jbyte_copy); 1.30 address StubRoutines::_arrayof_jshort_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jshort_copy); 1.31 address StubRoutines::_arrayof_jint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jint_copy); 1.32 address StubRoutines::_arrayof_jlong_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jlong_copy); 1.33 address StubRoutines::_arrayof_oop_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy); 1.34 +address StubRoutines::_arrayof_oop_arraycopy_uninit = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy_uninit); 1.35 address StubRoutines::_arrayof_jbyte_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jbyte_copy); 1.36 address StubRoutines::_arrayof_jshort_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jshort_copy); 1.37 address StubRoutines::_arrayof_jint_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jint_copy); 1.38 address StubRoutines::_arrayof_jlong_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jlong_copy); 1.39 -address StubRoutines::_arrayof_oop_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy); 1.40 +address StubRoutines::_arrayof_oop_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy); 1.41 +address StubRoutines::_arrayof_oop_disjoint_arraycopy_uninit = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy_uninit); 1.42 + 1.43 1.44 address StubRoutines::_checkcast_arraycopy = NULL; 1.45 +address StubRoutines::_checkcast_arraycopy_uninit = NULL; 1.46 address StubRoutines::_unsafe_arraycopy = NULL; 1.47 address StubRoutines::_generic_arraycopy = NULL; 1.48 1.49 @@ -282,12 +288,12 @@ 1.50 // Default versions of arraycopy functions 1.51 // 1.52 1.53 -static void gen_arraycopy_barrier_pre(oop* dest, size_t count) { 1.54 +static void gen_arraycopy_barrier_pre(oop* dest, size_t count, bool dest_uninitialized) { 1.55 assert(count != 0, "count should be non-zero"); 1.56 assert(count <= (size_t)max_intx, "count too large"); 1.57 BarrierSet* bs = Universe::heap()->barrier_set(); 1.58 assert(bs->has_write_ref_array_pre_opt(), "Must have pre-barrier opt"); 1.59 - bs->write_ref_array_pre(dest, (int)count); 1.60 + bs->write_ref_array_pre(dest, (int)count, dest_uninitialized); 1.61 } 1.62 1.63 static void gen_arraycopy_barrier(oop* dest, size_t count) { 1.64 @@ -330,7 +336,17 @@ 1.65 SharedRuntime::_oop_array_copy_ctr++; // Slow-path oop array copy 1.66 #endif // !PRODUCT 1.67 assert(count != 0, "count should be non-zero"); 1.68 - gen_arraycopy_barrier_pre(dest, count); 1.69 + gen_arraycopy_barrier_pre(dest, count, /*dest_uninitialized*/false); 1.70 + Copy::conjoint_oops_atomic(src, dest, count); 1.71 + gen_arraycopy_barrier(dest, count); 1.72 +JRT_END 1.73 + 1.74 +JRT_LEAF(void, StubRoutines::oop_copy_uninit(oop* src, oop* dest, size_t count)) 1.75 +#ifndef PRODUCT 1.76 + SharedRuntime::_oop_array_copy_ctr++; // Slow-path oop array copy 1.77 +#endif // !PRODUCT 1.78 + assert(count != 0, "count should be non-zero"); 1.79 + gen_arraycopy_barrier_pre(dest, count, /*dest_uninitialized*/true); 1.80 Copy::conjoint_oops_atomic(src, dest, count); 1.81 gen_arraycopy_barrier(dest, count); 1.82 JRT_END 1.83 @@ -368,11 +384,20 @@ 1.84 SharedRuntime::_oop_array_copy_ctr++; // Slow-path oop array copy 1.85 #endif // !PRODUCT 1.86 assert(count != 0, "count should be non-zero"); 1.87 - gen_arraycopy_barrier_pre((oop *) dest, count); 1.88 + gen_arraycopy_barrier_pre((oop *) dest, count, /*dest_uninitialized*/false); 1.89 Copy::arrayof_conjoint_oops(src, dest, count); 1.90 gen_arraycopy_barrier((oop *) dest, count); 1.91 JRT_END 1.92 1.93 +JRT_LEAF(void, StubRoutines::arrayof_oop_copy_uninit(HeapWord* src, HeapWord* dest, size_t count)) 1.94 +#ifndef PRODUCT 1.95 + SharedRuntime::_oop_array_copy_ctr++; // Slow-path oop array copy 1.96 +#endif // !PRODUCT 1.97 + assert(count != 0, "count should be non-zero"); 1.98 + gen_arraycopy_barrier_pre((oop *) dest, count, /*dest_uninitialized*/true); 1.99 + Copy::arrayof_conjoint_oops(src, dest, count); 1.100 + gen_arraycopy_barrier((oop *) dest, count); 1.101 +JRT_END 1.102 1.103 address StubRoutines::select_fill_function(BasicType t, bool aligned, const char* &name) { 1.104 #define RETURN_STUB(xxx_fill) { \