< prev index next >

src/hotspot/cpu/riscv/c2_MacroAssembler_riscv.cpp

Print this page
*** 321,29 ***
    }
  
    { // Handle inflated monitor.
      bind(inflated);
  
!     // mark contains the tagged ObjectMonitor*.
!     const Register tmp1_tagged_monitor = tmp1_mark;
!     const uintptr_t monitor_tag = markWord::monitor_value;
!     const Register tmp2_owner_addr = tmp2;
!     const Register tmp3_owner = tmp3;
! 
!     // Compute owner address.
!     la(tmp2_owner_addr, Address(tmp1_tagged_monitor, (in_bytes(ObjectMonitor::owner_offset()) - monitor_tag)));
! 
!     // CAS owner (null => current thread).
!     cmpxchg(/*addr*/ tmp2_owner_addr, /*expected*/ zr, /*new*/ xthread, Assembler::int64,
!             /*acquire*/ Assembler::aq, /*release*/ Assembler::relaxed, /*result*/ tmp3_owner);
!     beqz(tmp3_owner, locked);
! 
!     // Check if recursive.
!     bne(tmp3_owner, xthread, slow_path);
! 
!     // Recursive.
!     increment(Address(tmp1_tagged_monitor, in_bytes(ObjectMonitor::recursions_offset()) - monitor_tag), 1, tmp2, tmp3);
    }
  
    bind(locked);
    mv(flag, zr);
    increment(Address(xthread, JavaThread::held_monitor_count_offset()), 1, tmp2, tmp3);
--- 321,34 ---
    }
  
    { // Handle inflated monitor.
      bind(inflated);
  
!     if (!UseObjectMonitorTable) {
!       // mark contains the tagged ObjectMonitor*.
!       const Register tmp1_tagged_monitor = tmp1_mark;
!       const uintptr_t monitor_tag = markWord::monitor_value;
!       const Register tmp2_owner_addr = tmp2;
!       const Register tmp3_owner = tmp3;
! 
!       // Compute owner address.
!       la(tmp2_owner_addr, Address(tmp1_tagged_monitor, (in_bytes(ObjectMonitor::owner_offset()) - monitor_tag)));
! 
!       // CAS owner (null => current thread).
!       cmpxchg(/*addr*/ tmp2_owner_addr, /*expected*/ zr, /*new*/ xthread, Assembler::int64,
!               /*acquire*/ Assembler::aq, /*release*/ Assembler::relaxed, /*result*/ tmp3_owner);
!       beqz(tmp3_owner, locked);
! 
!       // Check if recursive.
!       bne(tmp3_owner, xthread, slow_path);
! 
!       // Recursive.
+       increment(Address(tmp1_tagged_monitor, in_bytes(ObjectMonitor::recursions_offset()) - monitor_tag), 1, tmp2, tmp3);
+     } else {
+       // OMCache lookup not supported yet. Take the slowpath.
+       j(slow_path);
+     }
    }
  
    bind(locked);
    mv(flag, zr);
    increment(Address(xthread, JavaThread::held_monitor_count_offset()), 1, tmp2, tmp3);

*** 451,53 ***
      bne(obj, tmp3_t, inflated);
      stop("Fast Unlock lock on stack");
      bind(check_done);
  #endif
  
!     // mark contains the tagged ObjectMonitor*.
!     const Register tmp1_monitor = tmp1_mark;
!     const uintptr_t monitor_tag = markWord::monitor_value;
! 
!     // Untag the monitor.
!     sub(tmp1_monitor, tmp1_mark, monitor_tag);
! 
!     const Register tmp2_recursions = tmp2;
!     Label not_recursive;
! 
!     // Check if recursive.
!     ld(tmp2_recursions, Address(tmp1_monitor, ObjectMonitor::recursions_offset()));
!     beqz(tmp2_recursions, not_recursive);
! 
!     // Recursive unlock.
!     addi(tmp2_recursions, tmp2_recursions, -1);
!     sd(tmp2_recursions, Address(tmp1_monitor, ObjectMonitor::recursions_offset()));
!     j(unlocked);
! 
!     bind(not_recursive);
! 
!     Label release;
!     const Register tmp2_owner_addr = tmp2;
! 
!     // Compute owner address.
!     la(tmp2_owner_addr, Address(tmp1_monitor, ObjectMonitor::owner_offset()));
! 
!     // Check if the entry lists are empty.
!     ld(t0, Address(tmp1_monitor, ObjectMonitor::EntryList_offset()));
!     ld(tmp3_t, Address(tmp1_monitor, ObjectMonitor::cxq_offset()));
!     orr(t0, t0, tmp3_t);
!     beqz(t0, 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.
!     sd(xthread, Address(tmp2_owner_addr));
!     j(slow_path);
! 
!     bind(release);
!     // Set owner to null.
!     membar(MacroAssembler::LoadStore | MacroAssembler::StoreStore);
!     sd(zr, Address(tmp2_owner_addr));
    }
  
    bind(unlocked);
    mv(flag, zr);
    decrement(Address(xthread, JavaThread::held_monitor_count_offset()), 1, tmp2, tmp3);
--- 456,58 ---
      bne(obj, tmp3_t, inflated);
      stop("Fast Unlock lock on stack");
      bind(check_done);
  #endif
  
!     if (!UseObjectMonitorTable) {
!       // mark contains the tagged ObjectMonitor*.
!       const Register tmp1_monitor = tmp1_mark;
!       const uintptr_t monitor_tag = markWord::monitor_value;
! 
!       // Untag the monitor.
!       sub(tmp1_monitor, tmp1_mark, monitor_tag);
! 
!       const Register tmp2_recursions = tmp2;
!       Label not_recursive;
! 
!       // Check if recursive.
!       ld(tmp2_recursions, Address(tmp1_monitor, ObjectMonitor::recursions_offset()));
!       beqz(tmp2_recursions, not_recursive);
! 
!       // Recursive unlock.
!       addi(tmp2_recursions, tmp2_recursions, -1);
!       sd(tmp2_recursions, Address(tmp1_monitor, ObjectMonitor::recursions_offset()));
!       j(unlocked);
! 
!       bind(not_recursive);
! 
!       Label release;
!       const Register tmp2_owner_addr = tmp2;
! 
!       // Compute owner address.
!       la(tmp2_owner_addr, Address(tmp1_monitor, ObjectMonitor::owner_offset()));
! 
!       // Check if the entry lists are empty.
!       ld(t0, Address(tmp1_monitor, ObjectMonitor::EntryList_offset()));
!       ld(tmp3_t, Address(tmp1_monitor, ObjectMonitor::cxq_offset()));
!       orr(t0, t0, tmp3_t);
!       beqz(t0, 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.
!       sd(xthread, Address(tmp2_owner_addr));
!       j(slow_path);
! 
!       bind(release);
!       // Set owner to null.
!       membar(MacroAssembler::LoadStore | MacroAssembler::StoreStore);
+       sd(zr, Address(tmp2_owner_addr));
+     } else {
+       // OMCache lookup not supported yet. Take the slowpath.
+       j(slow_path);
+     }
    }
  
    bind(unlocked);
    mv(flag, zr);
    decrement(Address(xthread, JavaThread::held_monitor_count_offset()), 1, tmp2, tmp3);
< prev index next >