--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp Tue Mar 01 10:27:15 2011 -0800
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp Tue Mar 01 14:56:48 2011 -0800
@@ -729,18 +729,19 @@
// Input:
// start - starting address
// count - element count
- void gen_write_ref_array_pre_barrier(Register start, Register count) {
+ void gen_write_ref_array_pre_barrier(Register start, Register count, bool uninitialized_target) {
assert_different_registers(start, count);
BarrierSet* bs = Universe::heap()->barrier_set();
switch (bs->kind()) {
case BarrierSet::G1SATBCT:
case BarrierSet::G1SATBCTLogging:
- {
- __ pusha(); // push registers
- __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre),
- start, count);
- __ popa();
- }
+ // With G1, don't generate the call if we statically know that the target in uninitialized
+ if (!uninitialized_target) {
+ __ pusha(); // push registers
+ __ call_VM_leaf(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre),
+ start, count);
+ __ popa();
+ }
break;
case BarrierSet::CardTableModRef:
case BarrierSet::CardTableExtension:
@@ -919,7 +920,8 @@
address generate_disjoint_copy(BasicType t, bool aligned,
Address::ScaleFactor sf,
- address* entry, const char *name) {
+ address* entry, const char *name,
+ bool dest_uninitialized = false) {
__ align(CodeEntryAlignment);
StubCodeMark mark(this, "StubRoutines", name);
address start = __ pc();
@@ -950,7 +952,7 @@
if (t == T_OBJECT) {
__ testl(count, count);
__ jcc(Assembler::zero, L_0_count);
- gen_write_ref_array_pre_barrier(to, count);
+ gen_write_ref_array_pre_barrier(to, count, dest_uninitialized);
__ mov(saved_to, to); // save 'to'
}
@@ -1084,7 +1086,8 @@
address generate_conjoint_copy(BasicType t, bool aligned,
Address::ScaleFactor sf,
address nooverlap_target,
- address* entry, const char *name) {
+ address* entry, const char *name,
+ bool dest_uninitialized = false) {
__ align(CodeEntryAlignment);
StubCodeMark mark(this, "StubRoutines", name);
address start = __ pc();
@@ -1128,7 +1131,7 @@
if (t == T_OBJECT) {
__ testl(count, count);
__ jcc(Assembler::zero, L_0_count);
- gen_write_ref_array_pre_barrier(dst, count);
+ gen_write_ref_array_pre_barrier(dst, count, dest_uninitialized);
}
// copy from high to low
@@ -1415,7 +1418,7 @@
// rax, == 0 - success
// rax, == -1^K - failure, where K is partial transfer count
//
- address generate_checkcast_copy(const char *name, address* entry) {
+ address generate_checkcast_copy(const char *name, address* entry, bool dest_uninitialized = false) {
__ align(CodeEntryAlignment);
StubCodeMark mark(this, "StubRoutines", name);
address start = __ pc();
@@ -1476,7 +1479,7 @@
Address elem_klass_addr(elem, oopDesc::klass_offset_in_bytes());
// Copy from low to high addresses, indexed from the end of each array.
- gen_write_ref_array_pre_barrier(to, count);
+ gen_write_ref_array_pre_barrier(to, count, dest_uninitialized);
__ lea(end_from, end_from_addr);
__ lea(end_to, end_to_addr);
assert(length == count, ""); // else fix next line:
@@ -2039,6 +2042,15 @@
generate_conjoint_copy(T_OBJECT, true, Address::times_ptr, entry,
&entry_oop_arraycopy, "oop_arraycopy");
+ StubRoutines::_oop_disjoint_arraycopy_uninit =
+ generate_disjoint_copy(T_OBJECT, true, Address::times_ptr, &entry,
+ "oop_disjoint_arraycopy_uninit",
+ /*dest_uninitialized*/true);
+ StubRoutines::_oop_arraycopy_uninit =
+ generate_conjoint_copy(T_OBJECT, true, Address::times_ptr, entry,
+ NULL, "oop_arraycopy_uninit",
+ /*dest_uninitialized*/true);
+
StubRoutines::_jlong_disjoint_arraycopy =
generate_disjoint_long_copy(&entry, "jlong_disjoint_arraycopy");
StubRoutines::_jlong_arraycopy =
@@ -2052,20 +2064,20 @@
StubRoutines::_arrayof_jshort_fill = generate_fill(T_SHORT, true, "arrayof_jshort_fill");
StubRoutines::_arrayof_jint_fill = generate_fill(T_INT, true, "arrayof_jint_fill");
- StubRoutines::_arrayof_jint_disjoint_arraycopy =
- StubRoutines::_jint_disjoint_arraycopy;
- StubRoutines::_arrayof_oop_disjoint_arraycopy =
- StubRoutines::_oop_disjoint_arraycopy;
- StubRoutines::_arrayof_jlong_disjoint_arraycopy =
- StubRoutines::_jlong_disjoint_arraycopy;
+ StubRoutines::_arrayof_jint_disjoint_arraycopy = StubRoutines::_jint_disjoint_arraycopy;
+ StubRoutines::_arrayof_oop_disjoint_arraycopy = StubRoutines::_oop_disjoint_arraycopy;
+ StubRoutines::_arrayof_oop_disjoint_arraycopy_uninit = StubRoutines::_oop_disjoint_arraycopy_uninit;
+ StubRoutines::_arrayof_jlong_disjoint_arraycopy = StubRoutines::_jlong_disjoint_arraycopy;
- StubRoutines::_arrayof_jint_arraycopy = StubRoutines::_jint_arraycopy;
- StubRoutines::_arrayof_oop_arraycopy = StubRoutines::_oop_arraycopy;
- StubRoutines::_arrayof_jlong_arraycopy = StubRoutines::_jlong_arraycopy;
+ StubRoutines::_arrayof_jint_arraycopy = StubRoutines::_jint_arraycopy;
+ StubRoutines::_arrayof_oop_arraycopy = StubRoutines::_oop_arraycopy;
+ StubRoutines::_arrayof_oop_arraycopy_uninit = StubRoutines::_oop_arraycopy_uninit;
+ StubRoutines::_arrayof_jlong_arraycopy = StubRoutines::_jlong_arraycopy;
StubRoutines::_checkcast_arraycopy =
- generate_checkcast_copy("checkcast_arraycopy",
- &entry_checkcast_arraycopy);
+ generate_checkcast_copy("checkcast_arraycopy", &entry_checkcast_arraycopy);
+ StubRoutines::_checkcast_arraycopy_uninit =
+ generate_checkcast_copy("checkcast_arraycopy_uninit", NULL, /*dest_uninitialized*/true);
StubRoutines::_unsafe_arraycopy =
generate_unsafe_copy("unsafe_arraycopy",