src/cpu/x86/vm/methodHandles_x86.cpp

changeset 3005
341a57af9b0a
parent 2978
d83ac25d0304
child 3046
a19c671188cb
     1.1 --- a/src/cpu/x86/vm/methodHandles_x86.cpp	Thu Jul 14 15:39:40 2011 -0700
     1.2 +++ b/src/cpu/x86/vm/methodHandles_x86.cpp	Fri Jul 15 15:35:50 2011 -0700
     1.3 @@ -546,6 +546,28 @@
     1.4  }
     1.5  #endif //ASSERT
     1.6  
     1.7 +void MethodHandles::jump_from_method_handle(MacroAssembler* _masm, Register method, Register temp) {
     1.8 +  if (JvmtiExport::can_post_interpreter_events()) {
     1.9 +    Label run_compiled_code;
    1.10 +    // JVMTI events, such as single-stepping, are implemented partly by avoiding running
    1.11 +    // compiled code in threads for which the event is enabled.  Check here for
    1.12 +    // interp_only_mode if these events CAN be enabled.
    1.13 +#ifdef _LP64
    1.14 +    Register rthread = r15_thread;
    1.15 +#else
    1.16 +    Register rthread = temp;
    1.17 +    __ get_thread(rthread);
    1.18 +#endif
    1.19 +    // interp_only is an int, on little endian it is sufficient to test the byte only
    1.20 +    // Is a cmpl faster?
    1.21 +    __ cmpb(Address(rthread, JavaThread::interp_only_mode_offset()), 0);
    1.22 +    __ jccb(Assembler::zero, run_compiled_code);
    1.23 +    __ jmp(Address(method, methodOopDesc::interpreter_entry_offset()));
    1.24 +    __ bind(run_compiled_code);
    1.25 +  }
    1.26 +  __ jmp(Address(method, methodOopDesc::from_interpreted_offset()));
    1.27 +}
    1.28 +
    1.29  // Code generation
    1.30  address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler* _masm) {
    1.31    // rbx: methodOop
    1.32 @@ -1120,9 +1142,6 @@
    1.33    guarantee(java_lang_invoke_MethodHandle::vmentry_offset_in_bytes() != 0, "must have offsets");
    1.34  
    1.35    // some handy addresses
    1.36 -  Address rbx_method_fie(     rbx,      methodOopDesc::from_interpreted_offset() );
    1.37 -  Address rbx_method_fce(     rbx,      methodOopDesc::from_compiled_offset() );
    1.38 -
    1.39    Address rcx_mh_vmtarget(    rcx_recv, java_lang_invoke_MethodHandle::vmtarget_offset_in_bytes() );
    1.40    Address rcx_dmh_vmindex(    rcx_recv, java_lang_invoke_DirectMethodHandle::vmindex_offset_in_bytes() );
    1.41  
    1.42 @@ -1163,8 +1182,8 @@
    1.43        assert(raise_exception_method(), "must be set");
    1.44        assert(raise_exception_method()->from_compiled_entry(), "method must be linked");
    1.45  
    1.46 -      const Register rdi_pc = rax;
    1.47 -      __ pop(rdi_pc);  // caller PC
    1.48 +      const Register rax_pc = rax;
    1.49 +      __ pop(rax_pc);  // caller PC
    1.50        __ mov(rsp, saved_last_sp);  // cut the stack back to where the caller started
    1.51  
    1.52        Register rbx_method = rbx_temp;
    1.53 @@ -1172,11 +1191,15 @@
    1.54  
    1.55        const int jobject_oop_offset = 0;
    1.56        __ movptr(rbx_method, Address(rbx_method, jobject_oop_offset));  // dereference the jobject
    1.57 -      __ verify_oop(rbx_method);
    1.58  
    1.59 -      NOT_LP64(__ push(rarg2_required));
    1.60 -      __ push(rdi_pc);         // restore caller PC
    1.61 -      __ jmp(rbx_method_fce);  // jump to compiled entry
    1.62 +      __ movptr(rsi, rsp);
    1.63 +      __ subptr(rsp, 3 * wordSize);
    1.64 +      __ push(rax_pc);         // restore caller PC
    1.65 +
    1.66 +      __ movptr(__ argument_address(constant(2)), rarg0_code);
    1.67 +      __ movptr(__ argument_address(constant(1)), rarg1_actual);
    1.68 +      __ movptr(__ argument_address(constant(0)), rarg2_required);
    1.69 +      jump_from_method_handle(_masm, rbx_method, rax);
    1.70      }
    1.71      break;
    1.72  
    1.73 @@ -1195,7 +1218,7 @@
    1.74          __ null_check(rcx_recv);
    1.75          __ verify_oop(rcx_recv);
    1.76        }
    1.77 -      __ jmp(rbx_method_fie);
    1.78 +      jump_from_method_handle(_masm, rbx_method, rax);
    1.79      }
    1.80      break;
    1.81  
    1.82 @@ -1228,7 +1251,7 @@
    1.83        __ movptr(rbx_method, vtable_entry_addr);
    1.84  
    1.85        __ verify_oop(rbx_method);
    1.86 -      __ jmp(rbx_method_fie);
    1.87 +      jump_from_method_handle(_masm, rbx_method, rax);
    1.88      }
    1.89      break;
    1.90  
    1.91 @@ -1263,7 +1286,7 @@
    1.92                                   no_such_interface);
    1.93  
    1.94        __ verify_oop(rbx_method);
    1.95 -      __ jmp(rbx_method_fie);
    1.96 +      jump_from_method_handle(_masm, rbx_method, rax);
    1.97        __ hlt();
    1.98  
    1.99        __ bind(no_such_interface);
   1.100 @@ -1311,7 +1334,7 @@
   1.101          Register rbx_method = rbx_temp;
   1.102          __ load_heap_oop(rbx_method, rcx_mh_vmtarget);
   1.103          __ verify_oop(rbx_method);
   1.104 -        __ jmp(rbx_method_fie);
   1.105 +        jump_from_method_handle(_masm, rbx_method, rax);
   1.106        } else {
   1.107          __ load_heap_oop(rcx_recv, rcx_mh_vmtarget);
   1.108          __ verify_oop(rcx_recv);

mercurial