# HG changeset patch # User iveresov # Date 1301958034 25200 # Node ID bb22629531fa20ed1c757cef29d05b8f3864b2ba # Parent e863062e521d62c597b06cdf24369b77fe17b517 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 diff -r e863062e521d -r bb22629531fa src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp --- a/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Mon Apr 04 03:02:00 2011 -0700 +++ b/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);