< prev index next >

src/hotspot/cpu/riscv/sharedRuntime_riscv.cpp

Print this page

1664     __ mv(oop_handle_reg, c_rarg1);
1665 
1666     // Get address of the box
1667 
1668     __ la(lock_reg, Address(sp, lock_slot_offset * VMRegImpl::stack_slot_size));
1669 
1670     // Load the oop from the handle
1671     __ ld(obj_reg, Address(oop_handle_reg, 0));
1672 
1673     if (LockingMode == LM_MONITOR) {
1674       __ j(slow_path_lock);
1675     } else if (LockingMode == LM_LEGACY) {
1676       // Load (object->mark() | 1) into swap_reg % x10
1677       __ ld(t0, Address(obj_reg, oopDesc::mark_offset_in_bytes()));
1678       __ ori(swap_reg, t0, 1);
1679 
1680       // Save (object->mark() | 1) into BasicLock's displaced header
1681       __ sd(swap_reg, Address(lock_reg, mark_word_offset));
1682 
1683       // src -> dest if dest == x10 else x10 <- dest
1684       __ cmpxchg_obj_header(x10, lock_reg, obj_reg, t0, count, /*fallthrough*/nullptr);
1685 
1686       // Test if the oopMark is an obvious stack pointer, i.e.,
1687       //  1) (mark & 3) == 0, and
1688       //  2) sp <= mark < mark + os::pagesize()
1689       // These 3 tests can be done by evaluating the following
1690       // expression: ((mark - sp) & (3 - os::vm_page_size())),
1691       // assuming both stack pointer and pagesize have their
1692       // least significant 2 bits clear.
1693       // NOTE: the oopMark is in swap_reg % 10 as the result of cmpxchg
1694 
1695       __ sub(swap_reg, swap_reg, sp);
1696       __ andi(swap_reg, swap_reg, 3 - (int)os::vm_page_size());
1697 
1698       // Save the test result, for recursive case, the result is zero
1699       __ sd(swap_reg, Address(lock_reg, mark_word_offset));
1700       __ bnez(swap_reg, slow_path_lock);
1701     } else {
1702       assert(LockingMode == LM_LIGHTWEIGHT, "");
1703       __ ld(swap_reg, Address(obj_reg, oopDesc::mark_offset_in_bytes()));
1704       __ fast_lock(obj_reg, swap_reg, tmp, t0, slow_path_lock);

1664     __ mv(oop_handle_reg, c_rarg1);
1665 
1666     // Get address of the box
1667 
1668     __ la(lock_reg, Address(sp, lock_slot_offset * VMRegImpl::stack_slot_size));
1669 
1670     // Load the oop from the handle
1671     __ ld(obj_reg, Address(oop_handle_reg, 0));
1672 
1673     if (LockingMode == LM_MONITOR) {
1674       __ j(slow_path_lock);
1675     } else if (LockingMode == LM_LEGACY) {
1676       // Load (object->mark() | 1) into swap_reg % x10
1677       __ ld(t0, Address(obj_reg, oopDesc::mark_offset_in_bytes()));
1678       __ ori(swap_reg, t0, 1);
1679 
1680       // Save (object->mark() | 1) into BasicLock's displaced header
1681       __ sd(swap_reg, Address(lock_reg, mark_word_offset));
1682 
1683       // src -> dest if dest == x10 else x10 <- dest
1684       __ cmpxchg_obj_header(x10, lock_reg, obj_reg, t0, count, /*fallthrough*/NULL);
1685 
1686       // Test if the oopMark is an obvious stack pointer, i.e.,
1687       //  1) (mark & 3) == 0, and
1688       //  2) sp <= mark < mark + os::pagesize()
1689       // These 3 tests can be done by evaluating the following
1690       // expression: ((mark - sp) & (3 - os::vm_page_size())),
1691       // assuming both stack pointer and pagesize have their
1692       // least significant 2 bits clear.
1693       // NOTE: the oopMark is in swap_reg % 10 as the result of cmpxchg
1694 
1695       __ sub(swap_reg, swap_reg, sp);
1696       __ andi(swap_reg, swap_reg, 3 - (int)os::vm_page_size());
1697 
1698       // Save the test result, for recursive case, the result is zero
1699       __ sd(swap_reg, Address(lock_reg, mark_word_offset));
1700       __ bnez(swap_reg, slow_path_lock);
1701     } else {
1702       assert(LockingMode == LM_LIGHTWEIGHT, "");
1703       __ ld(swap_reg, Address(obj_reg, oopDesc::mark_offset_in_bytes()));
1704       __ fast_lock(obj_reg, swap_reg, tmp, t0, slow_path_lock);
< prev index next >