equal
deleted
inserted
replaced
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 |