< prev index next >

src/cpu/x86/vm/macroAssembler_x86.cpp

Print this page

        

@@ -2031,11 +2031,11 @@
       lock();
     }
     cmpxchgptr(tmpReg, Address(objReg, 0));   // Uses RAX which is box
     bind(DONE_LABEL);
   } else {
-    Label DONE_LABEL, Stacked, CheckSucc;
+    Label DONE_LABEL, Stacked;
 
     // Critically, the biased locking test must have precedence over
     // and appear before the (box->dhw == 0) recursive stack-lock test.
     if (UseBiasedLocking && !UseOptoBiasInlining) {
        biased_locking_exit(objReg, tmpReg, DONE_LABEL);

@@ -2225,61 +2225,36 @@
     // Unfortunately none of our alignment mechanisms suffice.
     if ((EmitSync & 65536) == 0) {
        bind (CheckSucc);
     }
 #else // _LP64
+    Label LGoSlowPath;
+
     // It's inflated
     movptr(boxReg, Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2));
     xorptr(boxReg, r15_thread);
     orptr (boxReg, Address (tmpReg, ObjectMonitor::recursions_offset_in_bytes()-2));
     jccb  (Assembler::notZero, DONE_LABEL);
     movptr(boxReg, Address (tmpReg, ObjectMonitor::cxq_offset_in_bytes()-2));
     orptr (boxReg, Address (tmpReg, ObjectMonitor::EntryList_offset_in_bytes()-2));
-    jccb  (Assembler::notZero, CheckSucc);
+    orptr (boxReg, Address (tmpReg, ObjectMonitor::trace_exit_stack_offset_in_bytes()-2));
+    jccb  (Assembler::notZero, LGoSlowPath);
     movptr(Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), (int32_t)NULL_WORD);
     jmpb  (DONE_LABEL);
 
-    if ((EmitSync & 65536) == 0) {
-      Label LSuccess, LGoSlowPath ;
-      bind  (CheckSucc);
-      cmpptr(Address (tmpReg, ObjectMonitor::succ_offset_in_bytes()-2), (int32_t)NULL_WORD);
-      jccb  (Assembler::zero, LGoSlowPath);
-
-      // I'd much rather use lock:andl m->_owner, 0 as it's faster than the
-      // the explicit ST;MEMBAR combination, but masm doesn't currently support
-      // "ANDQ M,IMM".  Don't use MFENCE here.  lock:add to TOS, xchg, etc
-      // are all faster when the write buffer is populated.
-      movptr (Address (tmpReg, ObjectMonitor::owner_offset_in_bytes()-2), (int32_t)NULL_WORD);
-      if (os::is_MP()) {
-         lock (); addl (Address(rsp, 0), 0);
-      }
-      cmpptr(Address (tmpReg, ObjectMonitor::succ_offset_in_bytes()-2), (int32_t)NULL_WORD);
-      jccb  (Assembler::notZero, LSuccess);
-
-      movptr (boxReg, (int32_t)NULL_WORD);                   // box is really EAX
-      if (os::is_MP()) { lock(); }
-      cmpxchgptr(r15_thread, Address(tmpReg, ObjectMonitor::owner_offset_in_bytes()-2));
-      jccb  (Assembler::notEqual, LSuccess);
-      // Intentional fall-through into slow-path
-
+    // We had a fast path here for when _succ was set, but event tracing
+    // requires always generating an event when there are any threads
+    // blocked on the monitor. Hence we enter the slow path.
       bind  (LGoSlowPath);
       orl   (boxReg, 1);                      // set ICC.ZF=0 to indicate failure
       jmpb  (DONE_LABEL);
 
-      bind  (LSuccess);
-      testl (boxReg, 0);                      // set ICC.ZF=1 to indicate success
-      jmpb  (DONE_LABEL);
-    }
-
     bind  (Stacked);
     movptr(tmpReg, Address (boxReg, 0));      // re-fetch
     if (os::is_MP()) { lock(); }
     cmpxchgptr(tmpReg, Address(objReg, 0)); // Uses RAX which is box
 
-    if (EmitSync & 65536) {
-       bind (CheckSucc);
-    }
 #endif
     bind(DONE_LABEL);
     // Avoid branch to branch on AMD processors
     if (EmitSync & 32768) {
        nop();
< prev index next >