3089 #endif |
3089 #endif |
3090 |
3090 |
3091 arraycopy_range_checks(src, src_pos, dst, dst_pos, length, |
3091 arraycopy_range_checks(src, src_pos, dst, dst_pos, length, |
3092 O5_temp, G4_dst_klass, L_failed); |
3092 O5_temp, G4_dst_klass, L_failed); |
3093 |
3093 |
3094 // typeArrayKlass |
3094 // TypeArrayKlass |
3095 // |
3095 // |
3096 // src_addr = (src + array_header_in_bytes()) + (src_pos << log2elemsize); |
3096 // src_addr = (src + array_header_in_bytes()) + (src_pos << log2elemsize); |
3097 // dst_addr = (dst + array_header_in_bytes()) + (dst_pos << log2elemsize); |
3097 // dst_addr = (dst + array_header_in_bytes()) + (dst_pos << log2elemsize); |
3098 // |
3098 // |
3099 |
3099 |
3140 } |
3140 } |
3141 #endif |
3141 #endif |
3142 __ br(Assembler::always, false, Assembler::pt, entry_jlong_arraycopy); |
3142 __ br(Assembler::always, false, Assembler::pt, entry_jlong_arraycopy); |
3143 __ delayed()->signx(length, count); // length |
3143 __ delayed()->signx(length, count); // length |
3144 |
3144 |
3145 // objArrayKlass |
3145 // ObjArrayKlass |
3146 __ BIND(L_objArray); |
3146 __ BIND(L_objArray); |
3147 // live at this point: G3_src_klass, G4_dst_klass, src[_pos], dst[_pos], length |
3147 // live at this point: G3_src_klass, G4_dst_klass, src[_pos], dst[_pos], length |
3148 |
3148 |
3149 Label L_plain_copy, L_checkcast_copy; |
3149 Label L_plain_copy, L_checkcast_copy; |
3150 // test array classes for subtyping |
3150 // test array classes for subtyping |
3196 int sco_offset = in_bytes(Klass::super_check_offset_offset()); |
3196 int sco_offset = in_bytes(Klass::super_check_offset_offset()); |
3197 __ lduw(G4_dst_klass, sco_offset, sco_temp); |
3197 __ lduw(G4_dst_klass, sco_offset, sco_temp); |
3198 generate_type_check(G3_src_klass, sco_temp, G4_dst_klass, |
3198 generate_type_check(G3_src_klass, sco_temp, G4_dst_klass, |
3199 O5_temp, L_plain_copy); |
3199 O5_temp, L_plain_copy); |
3200 |
3200 |
3201 // Fetch destination element klass from the objArrayKlass header. |
3201 // Fetch destination element klass from the ObjArrayKlass header. |
3202 int ek_offset = in_bytes(objArrayKlass::element_klass_offset()); |
3202 int ek_offset = in_bytes(ObjArrayKlass::element_klass_offset()); |
3203 |
3203 |
3204 // the checkcast_copy loop needs two extra arguments: |
3204 // the checkcast_copy loop needs two extra arguments: |
3205 __ ld_ptr(G4_dst_klass, ek_offset, O4); // dest elem klass |
3205 __ ld_ptr(G4_dst_klass, ek_offset, O4); // dest elem klass |
3206 // lduw(O4, sco_offset, O3); // sco of elem klass |
3206 // lduw(O4, sco_offset, O3); // sco of elem klass |
3207 |
3207 |