--- old/src/hotspot/share/oops/typeArrayKlass.cpp 2018-03-08 13:23:00.568517861 +0100 +++ new/src/hotspot/share/oops/typeArrayKlass.cpp 2018-03-08 13:23:00.350520600 +0100 @@ -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(); + } }