comparison src/cpu/x86/vm/assembler_x86_64.cpp @ 186:cf1821c649d9

Merge
author never
date Fri, 06 Jun 2008 14:34:24 -0700
parents 1f809e010142 44abbb0d4c18
children d1605aabd0a1 6aae2f9d0294
comparison
equal deleted inserted replaced
179:1f809e010142 186:cf1821c649d9
5005 andq(tmp_reg, markOopDesc::biased_lock_mask_in_place); 5005 andq(tmp_reg, markOopDesc::biased_lock_mask_in_place);
5006 cmpq(tmp_reg, markOopDesc::biased_lock_pattern); 5006 cmpq(tmp_reg, markOopDesc::biased_lock_pattern);
5007 jcc(Assembler::notEqual, cas_label); 5007 jcc(Assembler::notEqual, cas_label);
5008 // The bias pattern is present in the object's header. Need to check 5008 // The bias pattern is present in the object's header. Need to check
5009 // whether the bias owner and the epoch are both still current. 5009 // whether the bias owner and the epoch are both still current.
5010 load_klass(tmp_reg, obj_reg); 5010 load_prototype_header(tmp_reg, obj_reg);
5011 movq(tmp_reg, Address(tmp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
5012 orq(tmp_reg, r15_thread); 5011 orq(tmp_reg, r15_thread);
5013 xorq(tmp_reg, swap_reg); 5012 xorq(tmp_reg, swap_reg);
5014 andq(tmp_reg, ~((int) markOopDesc::age_mask_in_place)); 5013 andq(tmp_reg, ~((int) markOopDesc::age_mask_in_place));
5015 if (counters != NULL) { 5014 if (counters != NULL) {
5016 cond_inc32(Assembler::zero, 5015 cond_inc32(Assembler::zero,
5080 // bias in the current epoch. In other words, we allow transfer of 5079 // bias in the current epoch. In other words, we allow transfer of
5081 // the bias from one thread to another directly in this situation. 5080 // the bias from one thread to another directly in this situation.
5082 // 5081 //
5083 // FIXME: due to a lack of registers we currently blow away the age 5082 // FIXME: due to a lack of registers we currently blow away the age
5084 // bits in this situation. Should attempt to preserve them. 5083 // bits in this situation. Should attempt to preserve them.
5085 load_klass(tmp_reg, obj_reg); 5084 load_prototype_header(tmp_reg, obj_reg);
5086 movq(tmp_reg, Address(tmp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
5087 orq(tmp_reg, r15_thread); 5085 orq(tmp_reg, r15_thread);
5088 if (os::is_MP()) { 5086 if (os::is_MP()) {
5089 lock(); 5087 lock();
5090 } 5088 }
5091 cmpxchgq(tmp_reg, Address(obj_reg, 0)); 5089 cmpxchgq(tmp_reg, Address(obj_reg, 0));
5111 // bias of this particular object, so it's okay to continue in the 5109 // bias of this particular object, so it's okay to continue in the
5112 // normal locking code. 5110 // normal locking code.
5113 // 5111 //
5114 // FIXME: due to a lack of registers we currently blow away the age 5112 // FIXME: due to a lack of registers we currently blow away the age
5115 // bits in this situation. Should attempt to preserve them. 5113 // bits in this situation. Should attempt to preserve them.
5116 load_klass(tmp_reg, obj_reg); 5114 load_prototype_header(tmp_reg, obj_reg);
5117 movq(tmp_reg, Address(tmp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
5118 if (os::is_MP()) { 5115 if (os::is_MP()) {
5119 lock(); 5116 lock();
5120 } 5117 }
5121 cmpxchgq(tmp_reg, Address(obj_reg, 0)); 5118 cmpxchgq(tmp_reg, Address(obj_reg, 0));
5122 // Fall through to the normal CAS-based lock, because no matter what 5119 // Fall through to the normal CAS-based lock, because no matter what
5153 if (UseCompressedOops) { 5150 if (UseCompressedOops) {
5154 movl(dst, Address(src, oopDesc::klass_offset_in_bytes())); 5151 movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
5155 decode_heap_oop_not_null(dst); 5152 decode_heap_oop_not_null(dst);
5156 } else { 5153 } else {
5157 movq(dst, Address(src, oopDesc::klass_offset_in_bytes())); 5154 movq(dst, Address(src, oopDesc::klass_offset_in_bytes()));
5155 }
5156 }
5157
5158 void MacroAssembler::load_prototype_header(Register dst, Register src) {
5159 if (UseCompressedOops) {
5160 movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
5161 movq(dst, Address(r12_heapbase, dst, Address::times_8, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
5162 } else {
5163 movq(dst, Address(src, oopDesc::klass_offset_in_bytes()));
5164 movq(dst, Address(dst, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
5158 } 5165 }
5159 } 5166 }
5160 5167
5161 void MacroAssembler::store_klass(Register dst, Register src) { 5168 void MacroAssembler::store_klass(Register dst, Register src) {
5162 if (UseCompressedOops) { 5169 if (UseCompressedOops) {