提交 d64055bb 编写于 作者: I iveresov

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
上级 b19bba8c
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册