2703 __ cmpl(Address(r10_src_klass, lh_offset), objArray_lh);
2704 __ jcc(Assembler::equal, L_objArray);
2705
2706 // if (src->klass() != dst->klass()) return -1;
2707 __ load_klass(rax, dst);
2708 __ cmpq(r10_src_klass, rax);
2709 __ jcc(Assembler::notEqual, L_failed);
2710
2711 const Register rax_lh = rax; // layout helper
2712 __ movl(rax_lh, Address(r10_src_klass, lh_offset));
2713
2714 // if (!src->is_Array()) return -1;
2715 __ cmpl(rax_lh, Klass::_lh_neutral_value);
2716 __ jcc(Assembler::greaterEqual, L_failed);
2717
2718 // At this point, it is known to be a typeArray (array_tag 0x3).
2719 #ifdef ASSERT
2720 {
2721 BLOCK_COMMENT("assert primitive array {");
2722 Label L;
2723 __ cmpl(rax_lh, (Klass::_lh_array_tag_type_value << Klass::_lh_array_tag_shift));
2724 __ jcc(Assembler::greaterEqual, L);
2725 __ stop("must be a primitive array");
2726 __ bind(L);
2727 BLOCK_COMMENT("} assert primitive array done");
2728 }
2729 #endif
2730
2731 arraycopy_range_checks(src, src_pos, dst, dst_pos, r11_length,
2732 r10, L_failed);
2733
2734 // TypeArrayKlass
2735 //
2736 // src_addr = (src + array_header_in_bytes()) + (src_pos << log2elemsize);
2737 // dst_addr = (dst + array_header_in_bytes()) + (dst_pos << log2elemsize);
2738 //
2739
2740 const Register r10_offset = r10; // array offset
2741 const Register rax_elsize = rax_lh; // element size
2742
2743 __ movl(r10_offset, rax_lh);
|
2703 __ cmpl(Address(r10_src_klass, lh_offset), objArray_lh);
2704 __ jcc(Assembler::equal, L_objArray);
2705
2706 // if (src->klass() != dst->klass()) return -1;
2707 __ load_klass(rax, dst);
2708 __ cmpq(r10_src_klass, rax);
2709 __ jcc(Assembler::notEqual, L_failed);
2710
2711 const Register rax_lh = rax; // layout helper
2712 __ movl(rax_lh, Address(r10_src_klass, lh_offset));
2713
2714 // if (!src->is_Array()) return -1;
2715 __ cmpl(rax_lh, Klass::_lh_neutral_value);
2716 __ jcc(Assembler::greaterEqual, L_failed);
2717
2718 // At this point, it is known to be a typeArray (array_tag 0x3).
2719 #ifdef ASSERT
2720 {
2721 BLOCK_COMMENT("assert primitive array {");
2722 Label L;
2723 __ cmpl(rax_lh, ((juint)Klass::_lh_array_tag_type_value << Klass::_lh_array_tag_shift));
2724 __ jcc(Assembler::greaterEqual, L);
2725 __ stop("must be a primitive array");
2726 __ bind(L);
2727 BLOCK_COMMENT("} assert primitive array done");
2728 }
2729 #endif
2730
2731 arraycopy_range_checks(src, src_pos, dst, dst_pos, r11_length,
2732 r10, L_failed);
2733
2734 // TypeArrayKlass
2735 //
2736 // src_addr = (src + array_header_in_bytes()) + (src_pos << log2elemsize);
2737 // dst_addr = (dst + array_header_in_bytes()) + (dst_pos << log2elemsize);
2738 //
2739
2740 const Register r10_offset = r10; // array offset
2741 const Register rax_elsize = rax_lh; // element size
2742
2743 __ movl(r10_offset, rax_lh);
|