# HG changeset patch # Parent 26ecc8a6826ac31906bbf56ca3b1e10e2833a9d7 diff --git a/src/hotspot/share/c1/c1_Runtime1.cpp b/src/hotspot/share/c1/c1_Runtime1.cpp --- a/src/hotspot/share/c1/c1_Runtime1.cpp +++ b/src/hotspot/share/c1/c1_Runtime1.cpp @@ -1402,13 +1402,8 @@ Klass* klass_oop = src->klass(); if (klass_oop != dst->klass()) return ac_failed; TypeArrayKlass* klass = TypeArrayKlass::cast(klass_oop); - const int l2es = klass->log2_element_size(); - const int ihs = klass->array_header_in_bytes() / wordSize; - char* src_addr = (char*) ((oopDesc**)src + ihs) + (src_pos << l2es); - char* dst_addr = (char*) ((oopDesc**)dst + ihs) + (dst_pos << l2es); - // Potential problem: memmove is not guaranteed to be word atomic - // Revisit in Merlin - return HeapAccess<>::arraycopy(arrayOop(src), arrayOop(dst), src_addr, dst_addr, length << l2es) ? ac_ok : ac_failed; + klass->copy_array(arrayOop(src), src_pos, arrayOop(dst), dst_pos, length, Thread::current()); + return ac_ok; } else if (src->is_objArray() && dst->is_objArray()) { if (UseCompressedOops) { narrowOop *src_addr = objArrayOop(src)->obj_at_addr(src_pos); diff --git a/src/hotspot/share/oops/typeArrayKlass.cpp b/src/hotspot/share/oops/typeArrayKlass.cpp --- a/src/hotspot/share/oops/typeArrayKlass.cpp +++ b/src/hotspot/share/oops/typeArrayKlass.cpp @@ -149,12 +149,37 @@ if (length == 0) return; - // This is an attempt to make the copy_array fast. - int l2es = log2_element_size(); - int ihs = array_header_in_bytes() / wordSize; - char* src = (char*) ((oop*)s + ihs) + ((size_t)src_pos << l2es); - char* dst = (char*) ((oop*)d + ihs) + ((size_t)dst_pos << l2es); - HeapAccess<>::arraycopy(s, d, src, dst, (size_t)length << l2es); + typeArrayOop src = typeArrayOop(s); + typeArrayOop dst = typeArrayOop(d); + + switch (element_type()) { + case T_BOOLEAN: + HeapAccess::arraycopy(s, d, src->bool_at_addr(src_pos), dst->bool_at_addr(dst_pos), length); + break; + case T_CHAR: + HeapAccess::arraycopy(s, d, src->char_at_addr(src_pos), dst->char_at_addr(dst_pos), length); + break; + case T_FLOAT: + HeapAccess::arraycopy(s, d, src->float_at_addr(src_pos), dst->float_at_addr(dst_pos), length); + break; + case T_DOUBLE: + HeapAccess::arraycopy(s, d, src->double_at_addr(src_pos), dst->double_at_addr(dst_pos), length); + break; + case T_BYTE: + HeapAccess::arraycopy(s, d, src->byte_at_addr(src_pos), dst->byte_at_addr(dst_pos), length); + break; + case T_SHORT: + HeapAccess::arraycopy(s, d, src->short_at_addr(src_pos), dst->short_at_addr(dst_pos), length); + break; + case T_INT: + HeapAccess::arraycopy(s, d, src->int_at_addr(src_pos), dst->int_at_addr(dst_pos), length); + break; + case T_LONG: + HeapAccess::arraycopy(s, d, src->long_at_addr(src_pos), dst->long_at_addr(dst_pos), length); + break; + default: + ShouldNotReachHere(); + } }