4918 xorl(swap_reg, tmp_reg); |
4918 xorl(swap_reg, tmp_reg); |
4919 if (swap_reg_contains_mark) { |
4919 if (swap_reg_contains_mark) { |
4920 null_check_offset = offset(); |
4920 null_check_offset = offset(); |
4921 } |
4921 } |
4922 movl(tmp_reg, klass_addr); |
4922 movl(tmp_reg, klass_addr); |
4923 xorl(swap_reg, Address(tmp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes())); |
4923 xorl(swap_reg, Address(tmp_reg, Klass::prototype_header_offset())); |
4924 andl(swap_reg, ~((int) markOopDesc::age_mask_in_place)); |
4924 andl(swap_reg, ~((int) markOopDesc::age_mask_in_place)); |
4925 if (need_tmp_reg) { |
4925 if (need_tmp_reg) { |
4926 pop(tmp_reg); |
4926 pop(tmp_reg); |
4927 } |
4927 } |
4928 if (counters != NULL) { |
4928 if (counters != NULL) { |
5005 if (need_tmp_reg) { |
5005 if (need_tmp_reg) { |
5006 push(tmp_reg); |
5006 push(tmp_reg); |
5007 } |
5007 } |
5008 get_thread(tmp_reg); |
5008 get_thread(tmp_reg); |
5009 movl(swap_reg, klass_addr); |
5009 movl(swap_reg, klass_addr); |
5010 orl(tmp_reg, Address(swap_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes())); |
5010 orl(tmp_reg, Address(swap_reg, Klass::prototype_header_offset())); |
5011 movl(swap_reg, saved_mark_addr); |
5011 movl(swap_reg, saved_mark_addr); |
5012 if (os::is_MP()) { |
5012 if (os::is_MP()) { |
5013 lock(); |
5013 lock(); |
5014 } |
5014 } |
5015 cmpxchgptr(tmp_reg, Address(obj_reg, 0)); |
5015 cmpxchgptr(tmp_reg, Address(obj_reg, 0)); |
5043 movl(swap_reg, saved_mark_addr); |
5043 movl(swap_reg, saved_mark_addr); |
5044 if (need_tmp_reg) { |
5044 if (need_tmp_reg) { |
5045 push(tmp_reg); |
5045 push(tmp_reg); |
5046 } |
5046 } |
5047 movl(tmp_reg, klass_addr); |
5047 movl(tmp_reg, klass_addr); |
5048 movl(tmp_reg, Address(tmp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes())); |
5048 movl(tmp_reg, Address(tmp_reg, Klass::prototype_header_offset())); |
5049 if (os::is_MP()) { |
5049 if (os::is_MP()) { |
5050 lock(); |
5050 lock(); |
5051 } |
5051 } |
5052 cmpxchgptr(tmp_reg, Address(obj_reg, 0)); |
5052 cmpxchgptr(tmp_reg, Address(obj_reg, 0)); |
5053 if (need_tmp_reg) { |
5053 if (need_tmp_reg) { |
8232 if (L_success == NULL) { L_success = &L_fallthrough; label_nulls++; } |
8232 if (L_success == NULL) { L_success = &L_fallthrough; label_nulls++; } |
8233 if (L_failure == NULL) { L_failure = &L_fallthrough; label_nulls++; } |
8233 if (L_failure == NULL) { L_failure = &L_fallthrough; label_nulls++; } |
8234 if (L_slow_path == NULL) { L_slow_path = &L_fallthrough; label_nulls++; } |
8234 if (L_slow_path == NULL) { L_slow_path = &L_fallthrough; label_nulls++; } |
8235 assert(label_nulls <= 1, "at most one NULL in the batch"); |
8235 assert(label_nulls <= 1, "at most one NULL in the batch"); |
8236 |
8236 |
8237 int sc_offset = (klassOopDesc::header_size() * HeapWordSize + |
8237 int sc_offset = in_bytes(Klass::secondary_super_cache_offset()); |
8238 Klass::secondary_super_cache_offset_in_bytes()); |
8238 int sco_offset = in_bytes(Klass::super_check_offset_offset()); |
8239 int sco_offset = (klassOopDesc::header_size() * HeapWordSize + |
|
8240 Klass::super_check_offset_offset_in_bytes()); |
|
8241 Address super_check_offset_addr(super_klass, sco_offset); |
8239 Address super_check_offset_addr(super_klass, sco_offset); |
8242 |
8240 |
8243 // Hacked jcc, which "knows" that L_fallthrough, at least, is in |
8241 // Hacked jcc, which "knows" that L_fallthrough, at least, is in |
8244 // range of a jccb. If this routine grows larger, reconsider at |
8242 // range of a jccb. If this routine grows larger, reconsider at |
8245 // least some of these. |
8243 // least some of these. |
8333 if (L_success == NULL) { L_success = &L_fallthrough; label_nulls++; } |
8331 if (L_success == NULL) { L_success = &L_fallthrough; label_nulls++; } |
8334 if (L_failure == NULL) { L_failure = &L_fallthrough; label_nulls++; } |
8332 if (L_failure == NULL) { L_failure = &L_fallthrough; label_nulls++; } |
8335 assert(label_nulls <= 1, "at most one NULL in the batch"); |
8333 assert(label_nulls <= 1, "at most one NULL in the batch"); |
8336 |
8334 |
8337 // a couple of useful fields in sub_klass: |
8335 // a couple of useful fields in sub_klass: |
8338 int ss_offset = (klassOopDesc::header_size() * HeapWordSize + |
8336 int ss_offset = in_bytes(Klass::secondary_supers_offset()); |
8339 Klass::secondary_supers_offset_in_bytes()); |
8337 int sc_offset = in_bytes(Klass::secondary_super_cache_offset()); |
8340 int sc_offset = (klassOopDesc::header_size() * HeapWordSize + |
|
8341 Klass::secondary_super_cache_offset_in_bytes()); |
|
8342 Address secondary_supers_addr(sub_klass, ss_offset); |
8338 Address secondary_supers_addr(sub_klass, ss_offset); |
8343 Address super_cache_addr( sub_klass, sc_offset); |
8339 Address super_cache_addr( sub_klass, sc_offset); |
8344 |
8340 |
8345 // Do a linear scan of the secondary super-klass chain. |
8341 // Do a linear scan of the secondary super-klass chain. |
8346 // This code is rarely used, so simplicity is a virtue here. |
8342 // This code is rarely used, so simplicity is a virtue here. |
9008 assert (Universe::heap() != NULL, "java heap should be initialized"); |
9004 assert (Universe::heap() != NULL, "java heap should be initialized"); |
9009 movl(dst, Address(src, oopDesc::klass_offset_in_bytes())); |
9005 movl(dst, Address(src, oopDesc::klass_offset_in_bytes())); |
9010 if (Universe::narrow_oop_shift() != 0) { |
9006 if (Universe::narrow_oop_shift() != 0) { |
9011 assert(LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong"); |
9007 assert(LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong"); |
9012 if (LogMinObjAlignmentInBytes == Address::times_8) { |
9008 if (LogMinObjAlignmentInBytes == Address::times_8) { |
9013 movq(dst, Address(r12_heapbase, dst, Address::times_8, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes())); |
9009 movq(dst, Address(r12_heapbase, dst, Address::times_8, Klass::prototype_header_offset())); |
9014 } else { |
9010 } else { |
9015 // OK to use shift since we don't need to preserve flags. |
9011 // OK to use shift since we don't need to preserve flags. |
9016 shlq(dst, LogMinObjAlignmentInBytes); |
9012 shlq(dst, LogMinObjAlignmentInBytes); |
9017 movq(dst, Address(r12_heapbase, dst, Address::times_1, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes())); |
9013 movq(dst, Address(r12_heapbase, dst, Address::times_1, Klass::prototype_header_offset())); |
9018 } |
9014 } |
9019 } else { |
9015 } else { |
9020 movq(dst, Address(dst, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes())); |
9016 movq(dst, Address(dst, Klass::prototype_header_offset())); |
9021 } |
9017 } |
9022 } else |
9018 } else |
9023 #endif |
9019 #endif |
9024 { |
9020 { |
9025 movptr(dst, Address(src, oopDesc::klass_offset_in_bytes())); |
9021 movptr(dst, Address(src, oopDesc::klass_offset_in_bytes())); |
9026 movptr(dst, Address(dst, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes())); |
9022 movptr(dst, Address(dst, Klass::prototype_header_offset())); |
9027 } |
9023 } |
9028 } |
9024 } |
9029 |
9025 |
9030 void MacroAssembler::store_klass(Register dst, Register src) { |
9026 void MacroAssembler::store_klass(Register dst, Register src) { |
9031 #ifdef _LP64 |
9027 #ifdef _LP64 |