hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp
changeset 10004 190e88f7edd1
parent 8876 f82367de21f5
child 10545 fec876499aae
equal deleted inserted replaced
9982:edcf2d7e7b84 10004:190e88f7edd1
  2932   // AbstractMethodError on entry) are either at call sites or
  2932   // AbstractMethodError on entry) are either at call sites or
  2933   // otherwise assume that stack unwinding will be initiated, so
  2933   // otherwise assume that stack unwinding will be initiated, so
  2934   // caller saved registers were assumed volatile in the compiler.
  2934   // caller saved registers were assumed volatile in the compiler.
  2935   address generate_throw_exception(const char* name,
  2935   address generate_throw_exception(const char* name,
  2936                                    address runtime_entry,
  2936                                    address runtime_entry,
  2937                                    bool restore_saved_exception_pc) {
  2937                                    bool restore_saved_exception_pc,
       
  2938                                    Register arg1 = noreg,
       
  2939                                    Register arg2 = noreg) {
  2938     // Information about frame layout at time of blocking runtime call.
  2940     // Information about frame layout at time of blocking runtime call.
  2939     // Note that we only have to preserve callee-saved registers since
  2941     // Note that we only have to preserve callee-saved registers since
  2940     // the compilers are responsible for supplying a continuation point
  2942     // the compilers are responsible for supplying a continuation point
  2941     // if they expect all registers to be preserved.
  2943     // if they expect all registers to be preserved.
  2942     enum layout {
  2944     enum layout {
  2978 
  2980 
  2979     // Set up last_Java_sp and last_Java_fp
  2981     // Set up last_Java_sp and last_Java_fp
  2980     __ set_last_Java_frame(rsp, rbp, NULL);
  2982     __ set_last_Java_frame(rsp, rbp, NULL);
  2981 
  2983 
  2982     // Call runtime
  2984     // Call runtime
       
  2985     if (arg1 != noreg) {
       
  2986       assert(arg2 != c_rarg1, "clobbered");
       
  2987       __ movptr(c_rarg1, arg1);
       
  2988     }
       
  2989     if (arg2 != noreg) {
       
  2990       __ movptr(c_rarg2, arg2);
       
  2991     }
  2983     __ movptr(c_rarg0, r15_thread);
  2992     __ movptr(c_rarg0, r15_thread);
  2984     BLOCK_COMMENT("call runtime_entry");
  2993     BLOCK_COMMENT("call runtime_entry");
  2985     __ call(RuntimeAddress(runtime_entry));
  2994     __ call(RuntimeAddress(runtime_entry));
  2986 
  2995 
  2987     // Generate oop map
  2996     // Generate oop map
  3050 
  3059 
  3051     // platform dependent
  3060     // platform dependent
  3052     StubRoutines::x86::_get_previous_fp_entry = generate_get_previous_fp();
  3061     StubRoutines::x86::_get_previous_fp_entry = generate_get_previous_fp();
  3053 
  3062 
  3054     StubRoutines::x86::_verify_mxcsr_entry    = generate_verify_mxcsr();
  3063     StubRoutines::x86::_verify_mxcsr_entry    = generate_verify_mxcsr();
       
  3064 
       
  3065     // Build this early so it's available for the interpreter.  Stub
       
  3066     // expects the required and actual types as register arguments in
       
  3067     // j_rarg0 and j_rarg1 respectively.
       
  3068     StubRoutines::_throw_WrongMethodTypeException_entry =
       
  3069       generate_throw_exception("WrongMethodTypeException throw_exception",
       
  3070                                CAST_FROM_FN_PTR(address, SharedRuntime::throw_WrongMethodTypeException),
       
  3071                                false, rax, rcx);
  3055   }
  3072   }
  3056 
  3073 
  3057   void generate_all() {
  3074   void generate_all() {
  3058     // Generates all stubs and initializes the entry points
  3075     // Generates all stubs and initializes the entry points
  3059 
  3076