hotspot/src/cpu/x86/vm/interp_masm_x86.cpp
changeset 37251 9fc139ad74b5
parent 37152 29e68f1d35bb
child 37480 291ee208fb72
equal deleted inserted replaced
37250:2fecd8bdc8e9 37251:9fc139ad74b5
  1097 
  1097 
  1098     // Save (object->mark() | 1) into BasicLock's displaced header
  1098     // Save (object->mark() | 1) into BasicLock's displaced header
  1099     movptr(Address(lock_reg, mark_offset), swap_reg);
  1099     movptr(Address(lock_reg, mark_offset), swap_reg);
  1100 
  1100 
  1101     assert(lock_offset == 0,
  1101     assert(lock_offset == 0,
  1102            "displached header must be first word in BasicObjectLock");
  1102            "displaced header must be first word in BasicObjectLock");
  1103 
  1103 
  1104     if (os::is_MP()) lock();
  1104     if (os::is_MP()) lock();
  1105     cmpxchgptr(lock_reg, Address(obj_reg, 0));
  1105     cmpxchgptr(lock_reg, Address(obj_reg, 0));
  1106     if (PrintBiasedLockingStatistics) {
  1106     if (PrintBiasedLockingStatistics) {
  1107       cond_inc32(Assembler::zero,
  1107       cond_inc32(Assembler::zero,
  1152 //      rdx, c_rarg1: BasicObjectLock for lock
  1152 //      rdx, c_rarg1: BasicObjectLock for lock
  1153 //
  1153 //
  1154 // Kills:
  1154 // Kills:
  1155 //      rax
  1155 //      rax
  1156 //      c_rarg0, c_rarg1, c_rarg2, c_rarg3, ... (param regs)
  1156 //      c_rarg0, c_rarg1, c_rarg2, c_rarg3, ... (param regs)
  1157 //      rscratch1, rscratch2 (scratch regs)
  1157 //      rscratch1 (scratch reg)
  1158 // rax, rbx, rcx, rdx
  1158 // rax, rbx, rcx, rdx
  1159 void InterpreterMacroAssembler::unlock_object(Register lock_reg) {
  1159 void InterpreterMacroAssembler::unlock_object(Register lock_reg) {
  1160   assert(lock_reg == LP64_ONLY(c_rarg1) NOT_LP64(rdx),
  1160   assert(lock_reg == LP64_ONLY(c_rarg1) NOT_LP64(rdx),
  1161          "The argument is only for looks. It must be c_rarg1");
  1161          "The argument is only for looks. It must be c_rarg1");
  1162 
  1162 
  1199 
  1199 
  1200     // Atomic swap back the old header
  1200     // Atomic swap back the old header
  1201     if (os::is_MP()) lock();
  1201     if (os::is_MP()) lock();
  1202     cmpxchgptr(header_reg, Address(obj_reg, 0));
  1202     cmpxchgptr(header_reg, Address(obj_reg, 0));
  1203 
  1203 
  1204     // zero for recursive case
  1204     // zero for simple unlock of a stack-lock case
  1205     jcc(Assembler::zero, done);
  1205     jcc(Assembler::zero, done);
  1206 
  1206 
  1207     // Call the runtime routine for slow case.
  1207     // Call the runtime routine for slow case.
  1208     movptr(Address(lock_reg, BasicObjectLock::obj_offset_in_bytes()),
  1208     movptr(Address(lock_reg, BasicObjectLock::obj_offset_in_bytes()),
  1209          obj_reg); // restore obj
  1209          obj_reg); // restore obj