< prev index next >

src/hotspot/cpu/x86/stubGenerator_x86_64.cpp

Print this page
*** 7412,10 ***
--- 7412,50 ---
  
      return start;
  
    }
  
+   // Call stub to call runtime oopDesc::load_nklass_runtime().
+   // rax: call argument (object)
+   // rax: return object's narrowKlass
+   // Preserves all caller-saved registers, except rax
+ #ifdef _LP64
+   address generate_load_nklass() {
+     __ align(CodeEntryAlignment);
+     StubCodeMark(this, "StubRoutines", "load_nklass");
+     address start = __ pc();
+     __ enter(); // save rbp
+ 
+     __ andptr(rsp, -(StackAlignmentInBytes));    // Align stack
+     __ push_FPU_state();
+ 
+     __ push(rdi);
+     __ push(rsi);
+     __ push(rdx);
+     __ push(rcx);
+     __ push(r8);
+     __ push(r9);
+     __ push(r10);
+     __ push(r11);
+     __ call_VM_leaf(CAST_FROM_FN_PTR(address, oopDesc::load_nklass_runtime), rax);
+     __ pop(r11);
+     __ pop(r10);
+     __ pop(r9);
+     __ pop(r8);
+     __ pop(rcx);
+     __ pop(rdx);
+     __ pop(rsi);
+     __ pop(rdi);
+ 
+     __ pop_FPU_state();
+ 
+     __ leave();
+     __ ret(0);
+     return start;
+   }
+ #endif // _LP64
+ 
  #undef __
  #define __ masm->
  
    // Continuation point for throwing of implicit exceptions that are
    // not handled in the current activation. Fabricates an exception

*** 7630,10 ***
--- 7670,14 ---
        }
        if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_dtan)) {
          StubRoutines::_dtan = generate_libmTan();
        }
      }
+ 
+ #ifdef _LP64
+     StubRoutines::_load_nklass = generate_load_nklass();
+ #endif
    }
  
    void generate_all() {
      // Generates all stubs and initializes the entry points
  
< prev index next >