--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp Wed Feb 09 15:02:23 2011 -0800
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp Tue Feb 22 15:25:02 2011 -0800
@@ -945,6 +945,12 @@
__ movptr(from , Address(rsp, 12+ 4));
__ movptr(to , Address(rsp, 12+ 8));
__ movl(count, Address(rsp, 12+ 12));
+
+ if (entry != NULL) {
+ *entry = __ pc(); // Entry point from conjoint arraycopy stub.
+ BLOCK_COMMENT("Entry:");
+ }
+
if (t == T_OBJECT) {
__ testl(count, count);
__ jcc(Assembler::zero, L_0_count);
@@ -952,9 +958,6 @@
__ mov(saved_to, to); // save 'to'
}
- *entry = __ pc(); // Entry point from conjoint arraycopy stub.
- BLOCK_COMMENT("Entry:");
-
__ subptr(to, from); // to --> to_from
__ cmpl(count, 2<<shift); // Short arrays (< 8 bytes) copy by element
__ jcc(Assembler::below, L_copy_4_bytes); // use unsigned cmp
@@ -1108,23 +1111,17 @@
__ movptr(src , Address(rsp, 12+ 4)); // from
__ movptr(dst , Address(rsp, 12+ 8)); // to
__ movl2ptr(count, Address(rsp, 12+12)); // count
- if (t == T_OBJECT) {
- gen_write_ref_array_pre_barrier(dst, count);
- }
if (entry != NULL) {
*entry = __ pc(); // Entry point from generic arraycopy stub.
BLOCK_COMMENT("Entry:");
}
- if (t == T_OBJECT) {
- __ testl(count, count);
- __ jcc(Assembler::zero, L_0_count);
- }
+ // nooverlap_target expects arguments in rsi and rdi.
__ mov(from, src);
__ mov(to , dst);
- // arrays overlap test
+ // arrays overlap test: dispatch to disjoint stub if necessary.
RuntimeAddress nooverlap(nooverlap_target);
__ cmpptr(dst, src);
__ lea(end, Address(src, count, sf, 0)); // src + count * elem_size
@@ -1132,6 +1129,12 @@
__ cmpptr(dst, end);
__ jump_cc(Assembler::aboveEqual, nooverlap);
+ if (t == T_OBJECT) {
+ __ testl(count, count);
+ __ jcc(Assembler::zero, L_0_count);
+ gen_write_ref_array_pre_barrier(dst, count);
+ }
+
// copy from high to low
__ cmpl(count, 2<<shift); // Short arrays (< 8 bytes) copy by element
__ jcc(Assembler::below, L_copy_4_bytes); // use unsigned cmp
@@ -1451,8 +1454,10 @@
__ movptr(to, to_arg);
__ movl2ptr(length, length_arg);
- *entry = __ pc(); // Entry point from generic arraycopy stub.
- BLOCK_COMMENT("Entry:");
+ if (entry != NULL) {
+ *entry = __ pc(); // Entry point from generic arraycopy stub.
+ BLOCK_COMMENT("Entry:");
+ }
//---------------------------------------------------------------
// Assembler stub will be used for this call to arraycopy