< prev index next >

src/hotspot/cpu/ppc/macroAssembler_ppc.cpp

Print this page
@@ -2807,36 +2807,43 @@
    }
  
    { // Handle inflated monitor.
      bind(inflated);
  
-     // mark contains the tagged ObjectMonitor*.
-     const Register tagged_monitor = mark;
-     const uintptr_t monitor_tag = markWord::monitor_value;
-     const Register owner_addr = tmp2;
- 
-     // Compute owner address.
-     addi(owner_addr, tagged_monitor, in_bytes(ObjectMonitor::owner_offset()) - monitor_tag);
- 
-     // CAS owner (null => current thread).
-     cmpxchgd(/*flag=*/flag,
-             /*current_value=*/t,
-             /*compare_value=*/(intptr_t)0,
-             /*exchange_value=*/R16_thread,
-             /*where=*/owner_addr,
-             MacroAssembler::MemBarRel | MacroAssembler::MemBarAcq,
-             MacroAssembler::cmpxchgx_hint_acquire_lock());
-     beq(flag, locked);
- 
-     // Check if recursive.
-     cmpd(flag, t, R16_thread);
-     bne(flag, slow_path);
- 
-     // Recursive.
-     ld(tmp1, in_bytes(ObjectMonitor::recursions_offset() - ObjectMonitor::owner_offset()), owner_addr);
-     addi(tmp1, tmp1, 1);
-     std(tmp1, in_bytes(ObjectMonitor::recursions_offset() - ObjectMonitor::owner_offset()), owner_addr);
+     if (!UseObjectMonitorTable) {
+       // mark contains the tagged ObjectMonitor*.
+       const Register tagged_monitor = mark;
+       const uintptr_t monitor_tag = markWord::monitor_value;
+       const Register owner_addr = tmp2;
+ 
+       // Compute owner address.
+       addi(owner_addr, tagged_monitor, in_bytes(ObjectMonitor::owner_offset()) - monitor_tag);
+ 
+       // CAS owner (null => current thread).
+       cmpxchgd(/*flag=*/flag,
+               /*current_value=*/t,
+               /*compare_value=*/(intptr_t)0,
+               /*exchange_value=*/R16_thread,
+               /*where=*/owner_addr,
+               MacroAssembler::MemBarRel | MacroAssembler::MemBarAcq,
+               MacroAssembler::cmpxchgx_hint_acquire_lock());
+       beq(flag, locked);
+ 
+       // Check if recursive.
+       cmpd(flag, t, R16_thread);
+       bne(flag, slow_path);
+ 
+       // Recursive.
+       ld(tmp1, in_bytes(ObjectMonitor::recursions_offset() - ObjectMonitor::owner_offset()), owner_addr);
+       addi(tmp1, tmp1, 1);
+       std(tmp1, in_bytes(ObjectMonitor::recursions_offset() - ObjectMonitor::owner_offset()), owner_addr);
+     } else {
+       // OMCache lookup not supported yet. Take the slowpath.
+       // Set flag to NE
+       crxor(flag, Assembler::equal, flag, Assembler::equal);
+       b(slow_path);
+     }
    }
  
    bind(locked);
    inc_held_monitor_count(tmp1);
  

@@ -2946,53 +2953,60 @@
      bne(flag, inflated);
      stop("Fast Unlock lock on stack");
      bind(check_done);
  #endif
  
-     // mark contains the tagged ObjectMonitor*.
-     const Register monitor = mark;
-     const uintptr_t monitor_tag = markWord::monitor_value;
- 
-     // Untag the monitor.
-     subi(monitor, mark, monitor_tag);
- 
-     const Register recursions = tmp2;
-     Label not_recursive;
- 
-     // Check if recursive.
-     ld(recursions, in_bytes(ObjectMonitor::recursions_offset()), monitor);
-     addic_(recursions, recursions, -1);
-     blt(CCR0, not_recursive);
- 
-     // Recursive unlock.
-     std(recursions, in_bytes(ObjectMonitor::recursions_offset()), monitor);
-     crorc(CCR0, Assembler::equal, CCR0, Assembler::equal);
-     b(unlocked);
- 
-     bind(not_recursive);
- 
-     Label release_;
-     const Register t2 = tmp2;
- 
-     // Check if the entry lists are empty.
-     ld(t, in_bytes(ObjectMonitor::EntryList_offset()), monitor);
-     ld(t2, in_bytes(ObjectMonitor::cxq_offset()), monitor);
-     orr(t, t, t2);
-     cmpdi(flag, t, 0);
-     beq(flag, release_);
- 
-     // The owner may be anonymous and we removed the last obj entry in
-     // the lock-stack. This loses the information about the owner.
-     // Write the thread to the owner field so the runtime knows the owner.
-     std(R16_thread, in_bytes(ObjectMonitor::owner_offset()), monitor);
-     b(slow_path);
- 
-     bind(release_);
-     // Set owner to null.
-     release();
-     // t contains 0
-     std(t, in_bytes(ObjectMonitor::owner_offset()), monitor);
+     if (!UseObjectMonitorTable) {
+       // mark contains the tagged ObjectMonitor*.
+       const Register monitor = mark;
+       const uintptr_t monitor_tag = markWord::monitor_value;
+ 
+       // Untag the monitor.
+       subi(monitor, mark, monitor_tag);
+ 
+       const Register recursions = tmp2;
+       Label not_recursive;
+ 
+       // Check if recursive.
+       ld(recursions, in_bytes(ObjectMonitor::recursions_offset()), monitor);
+       addic_(recursions, recursions, -1);
+       blt(CCR0, not_recursive);
+ 
+       // Recursive unlock.
+       std(recursions, in_bytes(ObjectMonitor::recursions_offset()), monitor);
+       crorc(CCR0, Assembler::equal, CCR0, Assembler::equal);
+       b(unlocked);
+ 
+       bind(not_recursive);
+ 
+       Label release_;
+       const Register t2 = tmp2;
+ 
+       // Check if the entry lists are empty.
+       ld(t, in_bytes(ObjectMonitor::EntryList_offset()), monitor);
+       ld(t2, in_bytes(ObjectMonitor::cxq_offset()), monitor);
+       orr(t, t, t2);
+       cmpdi(flag, t, 0);
+       beq(flag, release_);
+ 
+       // The owner may be anonymous and we removed the last obj entry in
+       // the lock-stack. This loses the information about the owner.
+       // Write the thread to the owner field so the runtime knows the owner.
+       std(R16_thread, in_bytes(ObjectMonitor::owner_offset()), monitor);
+       b(slow_path);
+ 
+       bind(release_);
+       // Set owner to null.
+       release();
+       // t contains 0
+       std(t, in_bytes(ObjectMonitor::owner_offset()), monitor);
+     } else {
+       // OMCache lookup not supported yet. Take the slowpath.
+       // Set flag to NE
+       crxor(flag, Assembler::equal, flag, Assembler::equal);
+       b(slow_path);
+     }
    }
  
    bind(unlocked);
    dec_held_monitor_count(t);
  
< prev index next >