< prev index next >

src/hotspot/cpu/x86/stubGenerator_x86_64.cpp

Print this page
@@ -6799,10 +6799,62 @@
      __ jmp(Address(rsp, -1 * wordSize)); // jmp target should be callers verified_entry_point
  
      return start;
    }
  
+   // Call runtime to ensure lock-stack size.
+   // Arguments:
+   // - c_rarg0: the required _limit pointer
+   address generate_check_lock_stack() {
+     __ align(CodeEntryAlignment);
+     StubCodeMark mark(this, "StubRoutines", "check_lock_stack");
+     address start = __ pc();
+ 
+     BLOCK_COMMENT("Entry:");
+     __ enter(); // save rbp
+ 
+     __ pusha();
+ 
+     // The method may have floats as arguments, and we must spill them before calling
+     // the VM runtime.
+     __ push_FPU_state();
+     /*
+     assert(Argument::n_float_register_parameters_j == 8, "Assumption");
+     const int xmm_size = wordSize * 2;
+     const int xmm_spill_size = xmm_size * Argument::n_float_register_parameters_j;
+     __ subptr(rsp, xmm_spill_size);
+     __ movdqu(Address(rsp, xmm_size * 7), xmm7);
+     __ movdqu(Address(rsp, xmm_size * 6), xmm6);
+     __ movdqu(Address(rsp, xmm_size * 5), xmm5);
+     __ movdqu(Address(rsp, xmm_size * 4), xmm4);
+     __ movdqu(Address(rsp, xmm_size * 3), xmm3);
+     __ movdqu(Address(rsp, xmm_size * 2), xmm2);
+     __ movdqu(Address(rsp, xmm_size * 1), xmm1);
+     __ movdqu(Address(rsp, xmm_size * 0), xmm0);
+     */
+     __ call_VM_leaf(CAST_FROM_FN_PTR(address, static_cast<void (*)(oop*)>(LockStack::ensure_lock_stack_size)), rax);
+     /*
+     __ movdqu(xmm0, Address(rsp, xmm_size * 0));
+     __ movdqu(xmm1, Address(rsp, xmm_size * 1));
+     __ movdqu(xmm2, Address(rsp, xmm_size * 2));
+     __ movdqu(xmm3, Address(rsp, xmm_size * 3));
+     __ movdqu(xmm4, Address(rsp, xmm_size * 4));
+     __ movdqu(xmm5, Address(rsp, xmm_size * 5));
+     __ movdqu(xmm6, Address(rsp, xmm_size * 6));
+     __ movdqu(xmm7, Address(rsp, xmm_size * 7));
+     __ addptr(rsp, xmm_spill_size);
+     */
+     __ pop_FPU_state();
+     __ popa();
+ 
+     __ leave();
+ 
+     __ ret(0);
+ 
+     return start;
+   }
+ 
     /**
     *  Arguments:
     *
     *  Input:
     *    c_rarg0   - out address

@@ -7719,10 +7771,13 @@
  
      BarrierSetNMethod* bs_nm = BarrierSet::barrier_set()->barrier_set_nmethod();
      if (bs_nm != NULL) {
        StubRoutines::x86::_method_entry_barrier = generate_method_entry_barrier();
      }
+     if (UseFastLocking) {
+       StubRoutines::x86::_check_lock_stack = generate_check_lock_stack();
+     }
  #ifdef COMPILER2
      if (UseMultiplyToLenIntrinsic) {
        StubRoutines::_multiplyToLen = generate_multiplyToLen();
      }
      if (UseSquareToLenIntrinsic) {
< prev index next >