3044 // 32 30 24 16 8 2 0 |
3044 // 32 30 24 16 8 2 0 |
3045 // |
3045 // |
3046 // array_tag: typeArray = 0x3, objArray = 0x2, non-array = 0x0 |
3046 // array_tag: typeArray = 0x3, objArray = 0x2, non-array = 0x0 |
3047 // |
3047 // |
3048 |
3048 |
3049 int lh_offset = klassOopDesc::header_size() * HeapWordSize + |
3049 int lh_offset = in_bytes(Klass::layout_helper_offset()); |
3050 Klass::layout_helper_offset_in_bytes(); |
|
3051 |
3050 |
3052 // Load 32-bits signed value. Use br() instruction with it to check icc. |
3051 // Load 32-bits signed value. Use br() instruction with it to check icc. |
3053 __ lduw(G3_src_klass, lh_offset, G5_lh); |
3052 __ lduw(G3_src_klass, lh_offset, G5_lh); |
3054 |
3053 |
3055 if (UseCompressedOops) { |
3054 if (UseCompressedOops) { |
3192 Register sco_temp = O3; // this register is free now |
3191 Register sco_temp = O3; // this register is free now |
3193 assert_different_registers(from, to, count, sco_temp, |
3192 assert_different_registers(from, to, count, sco_temp, |
3194 G4_dst_klass, G3_src_klass); |
3193 G4_dst_klass, G3_src_klass); |
3195 |
3194 |
3196 // Generate the type check. |
3195 // Generate the type check. |
3197 int sco_offset = (klassOopDesc::header_size() * HeapWordSize + |
3196 int sco_offset = in_bytes(Klass::super_check_offset_offset()); |
3198 Klass::super_check_offset_offset_in_bytes()); |
|
3199 __ lduw(G4_dst_klass, sco_offset, sco_temp); |
3197 __ lduw(G4_dst_klass, sco_offset, sco_temp); |
3200 generate_type_check(G3_src_klass, sco_temp, G4_dst_klass, |
3198 generate_type_check(G3_src_klass, sco_temp, G4_dst_klass, |
3201 O5_temp, L_plain_copy); |
3199 O5_temp, L_plain_copy); |
3202 |
3200 |
3203 // Fetch destination element klass from the objArrayKlass header. |
3201 // Fetch destination element klass from the objArrayKlass header. |
3204 int ek_offset = (klassOopDesc::header_size() * HeapWordSize + |
3202 int ek_offset = in_bytes(objArrayKlass::element_klass_offset()); |
3205 objArrayKlass::element_klass_offset_in_bytes()); |
|
3206 |
3203 |
3207 // the checkcast_copy loop needs two extra arguments: |
3204 // the checkcast_copy loop needs two extra arguments: |
3208 __ ld_ptr(G4_dst_klass, ek_offset, O4); // dest elem klass |
3205 __ ld_ptr(G4_dst_klass, ek_offset, O4); // dest elem klass |
3209 // lduw(O4, sco_offset, O3); // sco of elem klass |
3206 // lduw(O4, sco_offset, O3); // sco of elem klass |
3210 |
3207 |