< prev index next >
src/hotspot/share/opto/library_call.cpp
Print this page
*** 4316,4326 ****
// Copy the fastest available way.
// TODO: generate fields copies for small objects instead.
Node* size = _gvn.transform(obj_size);
! access_clone(control(), obj, alloc_obj, size, is_array);
// Do not let reads from the cloned object float above the arraycopy.
if (alloc != NULL) {
// Do not let stores that initialize this object be reordered with
// a subsequent store that would make this object accessible by
--- 4316,4353 ----
// Copy the fastest available way.
// TODO: generate fields copies for small objects instead.
Node* size = _gvn.transform(obj_size);
! // Exclude the header but include array length to copy by 8 bytes words.
! // Can't use base_offset_in_bytes(bt) since basic type is unknown.
! int base_off = is_array ? arrayOopDesc::length_offset_in_bytes() :
! instanceOopDesc::base_offset_in_bytes();
! // base_off:
! // 8 - 32-bit VM
! // 12 - 64-bit VM, compressed klass
! // 16 - 64-bit VM, normal klass
! if (base_off % BytesPerLong != 0) {
! assert(UseCompressedClassPointers, "");
! if (is_array) {
! // Exclude length to copy by 8 bytes words.
! base_off += sizeof(int);
! } else {
! // Include klass to copy by 8 bytes words.
! base_off = instanceOopDesc::klass_offset_in_bytes();
! }
! assert(base_off % BytesPerLong == 0, "expect 8 bytes alignment");
! }
! Node* src_base = basic_plus_adr(obj, base_off);
! Node* dst_base = basic_plus_adr(alloc_obj, base_off);
!
! // Compute the length also, if needed:
! Node* countx = size;
! countx = _gvn.transform(new SubXNode(countx, MakeConX(base_off)));
! countx = _gvn.transform(new URShiftXNode(countx, intcon(LogBytesPerLong)));
!
! access_clone(control(), src_base, dst_base, countx, is_array);
// Do not let reads from the cloned object float above the arraycopy.
if (alloc != NULL) {
// Do not let stores that initialize this object be reordered with
// a subsequent store that would make this object accessible by
< prev index next >