2259 #ifdef ASSERT |
2259 #ifdef ASSERT |
2260 BLOCK_COMMENT("assert consistent ckoff/ckval"); |
2260 BLOCK_COMMENT("assert consistent ckoff/ckval"); |
2261 // The ckoff and ckval must be mutually consistent, |
2261 // The ckoff and ckval must be mutually consistent, |
2262 // even though caller generates both. |
2262 // even though caller generates both. |
2263 { Label L; |
2263 { Label L; |
2264 int sco_offset = (klassOopDesc::header_size() * HeapWordSize + |
2264 int sco_offset = in_bytes(Klass::super_check_offset_offset()); |
2265 Klass::super_check_offset_offset_in_bytes()); |
|
2266 __ cmpl(ckoff, Address(ckval, sco_offset)); |
2265 __ cmpl(ckoff, Address(ckval, sco_offset)); |
2267 __ jcc(Assembler::equal, L); |
2266 __ jcc(Assembler::equal, L); |
2268 __ stop("super_check_offset inconsistent"); |
2267 __ stop("super_check_offset inconsistent"); |
2269 __ bind(L); |
2268 __ bind(L); |
2270 } |
2269 } |
2570 // 32 30 24 16 8 2 0 |
2569 // 32 30 24 16 8 2 0 |
2571 // |
2570 // |
2572 // array_tag: typeArray = 0x3, objArray = 0x2, non-array = 0x0 |
2571 // array_tag: typeArray = 0x3, objArray = 0x2, non-array = 0x0 |
2573 // |
2572 // |
2574 |
2573 |
2575 const int lh_offset = klassOopDesc::header_size() * HeapWordSize + |
2574 const int lh_offset = in_bytes(Klass::layout_helper_offset()); |
2576 Klass::layout_helper_offset_in_bytes(); |
|
2577 |
2575 |
2578 // Handle objArrays completely differently... |
2576 // Handle objArrays completely differently... |
2579 const jint objArray_lh = Klass::array_layout_helper(T_OBJECT); |
2577 const jint objArray_lh = Klass::array_layout_helper(T_OBJECT); |
2580 __ cmpl(Address(r10_src_klass, lh_offset), objArray_lh); |
2578 __ cmpl(Address(r10_src_klass, lh_offset), objArray_lh); |
2581 __ jcc(Assembler::equal, L_objArray); |
2579 __ jcc(Assembler::equal, L_objArray); |
2720 assert_different_registers(from, to, count, sco_temp, |
2718 assert_different_registers(from, to, count, sco_temp, |
2721 r11_dst_klass, r10_src_klass); |
2719 r11_dst_klass, r10_src_klass); |
2722 assert_clean_int(count, sco_temp); |
2720 assert_clean_int(count, sco_temp); |
2723 |
2721 |
2724 // Generate the type check. |
2722 // Generate the type check. |
2725 const int sco_offset = (klassOopDesc::header_size() * HeapWordSize + |
2723 const int sco_offset = in_bytes(Klass::super_check_offset_offset()); |
2726 Klass::super_check_offset_offset_in_bytes()); |
|
2727 __ movl(sco_temp, Address(r11_dst_klass, sco_offset)); |
2724 __ movl(sco_temp, Address(r11_dst_klass, sco_offset)); |
2728 assert_clean_int(sco_temp, rax); |
2725 assert_clean_int(sco_temp, rax); |
2729 generate_type_check(r10_src_klass, sco_temp, r11_dst_klass, L_plain_copy); |
2726 generate_type_check(r10_src_klass, sco_temp, r11_dst_klass, L_plain_copy); |
2730 |
2727 |
2731 // Fetch destination element klass from the objArrayKlass header. |
2728 // Fetch destination element klass from the objArrayKlass header. |
2732 int ek_offset = (klassOopDesc::header_size() * HeapWordSize + |
2729 int ek_offset = in_bytes(objArrayKlass::element_klass_offset()); |
2733 objArrayKlass::element_klass_offset_in_bytes()); |
|
2734 __ movptr(r11_dst_klass, Address(r11_dst_klass, ek_offset)); |
2730 __ movptr(r11_dst_klass, Address(r11_dst_klass, ek_offset)); |
2735 __ movl( sco_temp, Address(r11_dst_klass, sco_offset)); |
2731 __ movl( sco_temp, Address(r11_dst_klass, sco_offset)); |
2736 assert_clean_int(sco_temp, rax); |
2732 assert_clean_int(sco_temp, rax); |
2737 |
2733 |
2738 // the checkcast_copy loop needs two extra arguments: |
2734 // the checkcast_copy loop needs two extra arguments: |