src/share/vm/opto/library_call.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
*** old/src/share/vm/opto/library_call.cpp Fri May 27 12:45:57 2011
--- new/src/share/vm/opto/library_call.cpp Fri May 27 12:45:57 2011
*** 5223,5241 ****
--- 5223,5242 ----
if (scale >= LogBytesPerLong)
return false; // it is already a block transfer
// Look at the alignment of the starting offsets.
int abase = arrayOopDesc::base_offset_in_bytes(basic_elem_type);
const intptr_t BIG_NEG = -128;
assert(BIG_NEG + 2*abase < 0, "neg enough");
! intptr_t src_off = abase + ((intptr_t) find_int_con(src_offset, -1) << scale);
! intptr_t dest_off = abase + ((intptr_t) find_int_con(dest_offset, -1) << scale);
! if (src_off < 0 || dest_off < 0)
! intptr_t src_off_con = (intptr_t) find_int_con(src_offset, -1);
! intptr_t dest_off_con = (intptr_t) find_int_con(dest_offset, -1);
! if (src_off_con < 0 || dest_off_con < 0)
// At present, we can only understand constants.
return false;
+ intptr_t src_off = abase + (src_off_con << scale);
+ intptr_t dest_off = abase + (dest_off_con << scale);
+
if (((src_off | dest_off) & (BytesPerLong-1)) != 0) {
// Non-aligned; too bad.
// One more chance: Pick off an initial 32-bit word.
// This is a common case, since abase can be odd mod 8.
if (((src_off | dest_off) & (BytesPerLong-1)) == BytesPerInt &&
src/share/vm/opto/library_call.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File