7033732: C1: When calling c2 arraycopy stubs offsets and length must have clear upper 32bits

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
This commit is contained in:
Igor Veresov 2011-04-04 16:00:34 -07:00
parent 80dfa0e342
commit 1875cfefc6

View File

@ -2058,6 +2058,13 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
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 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
__ 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 @@ void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
__ 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);