5223 if (scale >= LogBytesPerLong) |
5223 if (scale >= LogBytesPerLong) |
5224 return false; // it is already a block transfer |
5224 return false; // it is already a block transfer |
5225 |
5225 |
5226 // Look at the alignment of the starting offsets. |
5226 // Look at the alignment of the starting offsets. |
5227 int abase = arrayOopDesc::base_offset_in_bytes(basic_elem_type); |
5227 int abase = arrayOopDesc::base_offset_in_bytes(basic_elem_type); |
5228 const intptr_t BIG_NEG = -128; |
5228 |
5229 assert(BIG_NEG + 2*abase < 0, "neg enough"); |
5229 intptr_t src_off_con = (intptr_t) find_int_con(src_offset, -1); |
5230 |
5230 intptr_t dest_off_con = (intptr_t) find_int_con(dest_offset, -1); |
5231 intptr_t src_off = abase + ((intptr_t) find_int_con(src_offset, -1) << scale); |
5231 if (src_off_con < 0 || dest_off_con < 0) |
5232 intptr_t dest_off = abase + ((intptr_t) find_int_con(dest_offset, -1) << scale); |
|
5233 if (src_off < 0 || dest_off < 0) |
|
5234 // At present, we can only understand constants. |
5232 // At present, we can only understand constants. |
5235 return false; |
5233 return false; |
|
5234 |
|
5235 intptr_t src_off = abase + (src_off_con << scale); |
|
5236 intptr_t dest_off = abase + (dest_off_con << scale); |
5236 |
5237 |
5237 if (((src_off | dest_off) & (BytesPerLong-1)) != 0) { |
5238 if (((src_off | dest_off) & (BytesPerLong-1)) != 0) { |
5238 // Non-aligned; too bad. |
5239 // Non-aligned; too bad. |
5239 // One more chance: Pick off an initial 32-bit word. |
5240 // One more chance: Pick off an initial 32-bit word. |
5240 // This is a common case, since abase can be odd mod 8. |
5241 // This is a common case, since abase can be odd mod 8. |