711
712 // Load object pointer into obj_reg %c_rarg3
713 movptr(obj_reg, Address(lock_reg, obj_offset));
714
715 if (UseBiasedLocking) {
716 biased_locking_enter(lock_reg, obj_reg, swap_reg, rscratch1, false, done, &slow_case);
717 }
718
719 // Load immediate 1 into swap_reg %rax
720 movl(swap_reg, 1);
721
722 // Load (object->mark() | 1) into swap_reg %rax
723 orptr(swap_reg, Address(obj_reg, 0));
724
725 // Save (object->mark() | 1) into BasicLock's displaced header
726 movptr(Address(lock_reg, mark_offset), swap_reg);
727
728 assert(lock_offset == 0,
729 "displached header must be first word in BasicObjectLock");
730
731 // obj_reg has been checked a few lines up.
732 if (os::is_MP()) lock();
733 cmpxchgptr(lock_reg, Address(obj_reg, 0));
734 if (PrintBiasedLockingStatistics) {
735 cond_inc32(Assembler::zero,
736 ExternalAddress((address) BiasedLocking::fast_path_entry_count_addr()));
737 }
738 jcc(Assembler::zero, done);
739
740 // Test if the oopMark is an obvious stack pointer, i.e.,
741 // 1) (mark & 7) == 0, and
742 // 2) rsp <= mark < mark + os::pagesize()
743 //
744 // These 3 tests can be done by evaluating the following
745 // expression: ((mark - rsp) & (7 - os::vm_page_size())),
746 // assuming both stack pointer and pagesize have their
747 // least significant 3 bits clear.
748 // NOTE: the oopMark is in swap_reg %rax as the result of cmpxchg
749 subptr(swap_reg, rsp);
750 andptr(swap_reg, 7 - os::vm_page_size());
751
|
711
712 // Load object pointer into obj_reg %c_rarg3
713 movptr(obj_reg, Address(lock_reg, obj_offset));
714
715 if (UseBiasedLocking) {
716 biased_locking_enter(lock_reg, obj_reg, swap_reg, rscratch1, false, done, &slow_case);
717 }
718
719 // Load immediate 1 into swap_reg %rax
720 movl(swap_reg, 1);
721
722 // Load (object->mark() | 1) into swap_reg %rax
723 orptr(swap_reg, Address(obj_reg, 0));
724
725 // Save (object->mark() | 1) into BasicLock's displaced header
726 movptr(Address(lock_reg, mark_offset), swap_reg);
727
728 assert(lock_offset == 0,
729 "displached header must be first word in BasicObjectLock");
730
731 if (os::is_MP()) lock();
732 cmpxchgptr(lock_reg, Address(obj_reg, 0));
733 if (PrintBiasedLockingStatistics) {
734 cond_inc32(Assembler::zero,
735 ExternalAddress((address) BiasedLocking::fast_path_entry_count_addr()));
736 }
737 jcc(Assembler::zero, done);
738
739 // Test if the oopMark is an obvious stack pointer, i.e.,
740 // 1) (mark & 7) == 0, and
741 // 2) rsp <= mark < mark + os::pagesize()
742 //
743 // These 3 tests can be done by evaluating the following
744 // expression: ((mark - rsp) & (7 - os::vm_page_size())),
745 // assuming both stack pointer and pagesize have their
746 // least significant 3 bits clear.
747 // NOTE: the oopMark is in swap_reg %rax as the result of cmpxchg
748 subptr(swap_reg, rsp);
749 andptr(swap_reg, 7 - os::vm_page_size());
750
|