@@ -57,7 +57,7 @@ void C2_MacroAssembler::fast_lock(Register objectReg, Register boxReg, Register
5757 Label count, no_count;
5858
5959 assert (LockingMode != LM_LIGHTWEIGHT, " lightweight locking should use fast_lock_lightweight" );
60- assert_different_registers (oop, box, tmp, disp_hdr);
60+ assert_different_registers (oop, box, tmp, disp_hdr, rscratch2 );
6161
6262 // Load markWord from object into displaced_header.
6363 ldr (disp_hdr, Address (oop, oopDesc::mark_offset_in_bytes ()));
@@ -111,11 +111,13 @@ void C2_MacroAssembler::fast_lock(Register objectReg, Register boxReg, Register
111111 bind (object_has_monitor);
112112
113113 // The object's monitor m is unlocked iff m->owner == nullptr,
114- // otherwise m->owner may contain a thread or a stack address.
114+ // otherwise m->owner may contain a thread id, a stack address for LM_LEGACY,
115+ // or the ANONYMOUS_OWNER constant for LM_LIGHTWEIGHT.
115116 //
116117 // Try to CAS m->owner from null to current thread.
118+ ldr (rscratch2, Address (rthread, JavaThread::lock_id_offset ()));
117119 add (tmp, disp_hdr, (in_bytes (ObjectMonitor::owner_offset ())-markWord::monitor_value));
118- cmpxchg (tmp, zr, rthread , Assembler::xword, /* acquire*/ true ,
120+ cmpxchg (tmp, zr, rscratch2 , Assembler::xword, /* acquire*/ true ,
119121 /* release*/ true , /* weak*/ false , tmp3Reg); // Sets flags for result
120122
121123 // Store a non-null value into the box to avoid looking like a re-entrant
@@ -127,7 +129,7 @@ void C2_MacroAssembler::fast_lock(Register objectReg, Register boxReg, Register
127129
128130 br (Assembler::EQ, cont); // CAS success means locking succeeded
129131
130- cmp (tmp3Reg, rthread );
132+ cmp (tmp3Reg, rscratch2 );
131133 br (Assembler::NE, cont); // Check for recursive locking
132134
133135 // Recursive lock case
@@ -140,7 +142,9 @@ void C2_MacroAssembler::fast_lock(Register objectReg, Register boxReg, Register
140142 br (Assembler::NE, no_count);
141143
142144 bind (count);
143- increment (Address (rthread, JavaThread::held_monitor_count_offset ()));
145+ if (LockingMode == LM_LEGACY) {
146+ inc_held_monitor_count ();
147+ }
144148
145149 bind (no_count);
146150}
@@ -247,15 +251,17 @@ void C2_MacroAssembler::fast_unlock(Register objectReg, Register boxReg, Registe
247251 br (Assembler::NE, no_count);
248252
249253 bind (count);
250- decrement (Address (rthread, JavaThread::held_monitor_count_offset ()));
254+ if (LockingMode == LM_LEGACY) {
255+ dec_held_monitor_count ();
256+ }
251257
252258 bind (no_count);
253259}
254260
255261void C2_MacroAssembler::fast_lock_lightweight (Register obj, Register box, Register t1,
256262 Register t2, Register t3) {
257263 assert (LockingMode == LM_LIGHTWEIGHT, " must be" );
258- assert_different_registers (obj, box, t1, t2, t3);
264+ assert_different_registers (obj, box, t1, t2, t3, rscratch2 );
259265
260266 // Handle inflated monitor.
261267 Label inflated;
@@ -371,13 +377,14 @@ void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, Regist
371377 // Compute owner address.
372378 lea (t2_owner_addr, owner_address);
373379
374- // CAS owner (null => current thread).
375- cmpxchg (t2_owner_addr, zr, rthread, Assembler::xword, /* acquire*/ true ,
380+ // CAS owner (null => current thread id).
381+ ldr (rscratch2, Address (rthread, JavaThread::lock_id_offset ()));
382+ cmpxchg (t2_owner_addr, zr, rscratch2, Assembler::xword, /* acquire*/ true ,
376383 /* release*/ false , /* weak*/ false , t3_owner);
377384 br (Assembler::EQ, monitor_locked);
378385
379386 // Check if recursive.
380- cmp (t3_owner, rthread );
387+ cmp (t3_owner, rscratch2 );
381388 br (Assembler::NE, slow_path);
382389
383390 // Recursive.
@@ -390,7 +397,6 @@ void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box, Regist
390397 }
391398
392399 bind (locked);
393- increment (Address (rthread, JavaThread::held_monitor_count_offset ()));
394400
395401#ifdef ASSERT
396402 // Check that locked label is reached with Flags == EQ.
@@ -559,7 +565,6 @@ void C2_MacroAssembler::fast_unlock_lightweight(Register obj, Register box, Regi
559565 }
560566
561567 bind (unlocked);
562- decrement (Address (rthread, JavaThread::held_monitor_count_offset ()));
563568 cmp (zr, zr); // Set Flags to EQ => fast path
564569
565570#ifdef ASSERT
0 commit comments