7033732: C1: When calling c2 arraycopy stubs offsets and length must have clear upper 32bits
Summary: With 7033154 we started calling c2 arraycopy stubs from c1. On sparcv9 we must clear the upper 32bits for offset (src_pos, dst_pos) and length parameters when calling them.
Reviewed-by: never, kvn
--- a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Mon Apr 04 03:02:00 2011 -0700
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Mon Apr 04 16:00:34 2011 -0700
@@ -2058,6 +2058,13 @@
BasicType basic_type = default_type != NULL ? default_type->element_type()->basic_type() : T_ILLEGAL;
if (basic_type == T_ARRAY) basic_type = T_OBJECT;
+#ifdef _LP64
+ // higher 32bits must be null
+ __ sra(dst_pos, 0, dst_pos);
+ __ sra(src_pos, 0, src_pos);
+ __ sra(length, 0, length);
+#endif
+
// set up the arraycopy stub information
ArrayCopyStub* stub = op->stub();
@@ -2151,11 +2158,6 @@
__ delayed()->nop();
}
-#ifndef _LP64
- __ sra(dst_pos, 0, dst_pos); //higher 32bits must be null
- __ sra(src_pos, 0, src_pos); //higher 32bits must be null
-#endif
-
int shift = shift_amount(basic_type);
if (flags & LIR_OpArrayCopy::type_check) {
@@ -2243,7 +2245,6 @@
__ sll(dst_pos, shift, tmp);
__ add(dst_ptr, tmp, dst_ptr);
}
- LP64_ONLY( __ sra(length, 0, length)); //higher 32bits must be null
__ mov(length, len);
__ load_klass(dst, tmp);