src/cpu/x86/vm/assembler_x86.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 7086585 Sdiff src/cpu/x86/vm

src/cpu/x86/vm/assembler_x86.cpp

Print this page




7987   Address type_addr(mh_reg, delayed_value(java_lang_invoke_MethodHandle::type_offset_in_bytes, temp_reg));
7988   // compare method type against that of the receiver
7989   if (UseCompressedOops) {
7990     load_heap_oop(temp_reg, type_addr);
7991     cmpptr(mtype_reg, temp_reg);
7992   } else {
7993     cmpptr(mtype_reg, type_addr);
7994   }
7995   jcc(Assembler::notEqual, wrong_method_type);
7996 }
7997 
7998 
7999 // A method handle has a "vmslots" field which gives the size of its
8000 // argument list in JVM stack slots.  This field is either located directly
8001 // in every method handle, or else is indirectly accessed through the
8002 // method handle's MethodType.  This macro hides the distinction.
8003 void MacroAssembler::load_method_handle_vmslots(Register vmslots_reg, Register mh_reg,
8004                                                 Register temp_reg) {
8005   assert_different_registers(vmslots_reg, mh_reg, temp_reg);
8006   // load mh.type.form.vmslots
8007   if (java_lang_invoke_MethodHandle::vmslots_offset_in_bytes() != 0) {
8008     // hoist vmslots into every mh to avoid dependent load chain
8009     movl(vmslots_reg, Address(mh_reg, delayed_value(java_lang_invoke_MethodHandle::vmslots_offset_in_bytes, temp_reg)));
8010   } else {
8011     Register temp2_reg = vmslots_reg;
8012     load_heap_oop(temp2_reg, Address(mh_reg,    delayed_value(java_lang_invoke_MethodHandle::type_offset_in_bytes, temp_reg)));
8013     load_heap_oop(temp2_reg, Address(temp2_reg, delayed_value(java_lang_invoke_MethodType::form_offset_in_bytes, temp_reg)));
8014     movl(vmslots_reg, Address(temp2_reg, delayed_value(java_lang_invoke_MethodTypeForm::vmslots_offset_in_bytes, temp_reg)));
8015   }
8016 }
8017 
8018 
8019 // registers on entry:
8020 //  - rcx: method handle
8021 //  - rdx: killable temp (interpreted only)
8022 //  - rax: killable temp (compiled only)
8023 void MacroAssembler::jump_to_method_handle_entry(Register mh_reg, Register temp_reg) {
8024   assert(mh_reg == rcx, "caller must put MH object in rcx");
8025   assert_different_registers(mh_reg, temp_reg);
8026 
8027   // pick out the interpreted side of the handler
8028   // NOTE: vmentry is not an oop!
8029   movptr(temp_reg, Address(mh_reg, delayed_value(java_lang_invoke_MethodHandle::vmentry_offset_in_bytes, temp_reg)));
8030 
8031   // off we go...
8032   jmp(Address(temp_reg, MethodHandleEntry::from_interpreted_entry_offset_in_bytes()));
8033 
8034   // for the various stubs which take control at this point,
8035   // see MethodHandles::generate_method_handle_stub




7987   Address type_addr(mh_reg, delayed_value(java_lang_invoke_MethodHandle::type_offset_in_bytes, temp_reg));
7988   // compare method type against that of the receiver
7989   if (UseCompressedOops) {
7990     load_heap_oop(temp_reg, type_addr);
7991     cmpptr(mtype_reg, temp_reg);
7992   } else {
7993     cmpptr(mtype_reg, type_addr);
7994   }
7995   jcc(Assembler::notEqual, wrong_method_type);
7996 }
7997 
7998 
7999 // A method handle has a "vmslots" field which gives the size of its
8000 // argument list in JVM stack slots.  This field is either located directly
8001 // in every method handle, or else is indirectly accessed through the
8002 // method handle's MethodType.  This macro hides the distinction.
8003 void MacroAssembler::load_method_handle_vmslots(Register vmslots_reg, Register mh_reg,
8004                                                 Register temp_reg) {
8005   assert_different_registers(vmslots_reg, mh_reg, temp_reg);
8006   // load mh.type.form.vmslots




8007   Register temp2_reg = vmslots_reg;
8008   load_heap_oop(temp2_reg, Address(mh_reg,    delayed_value(java_lang_invoke_MethodHandle::type_offset_in_bytes, temp_reg)));
8009   load_heap_oop(temp2_reg, Address(temp2_reg, delayed_value(java_lang_invoke_MethodType::form_offset_in_bytes, temp_reg)));
8010   movl(vmslots_reg, Address(temp2_reg, delayed_value(java_lang_invoke_MethodTypeForm::vmslots_offset_in_bytes, temp_reg)));

8011 }
8012 
8013 
8014 // registers on entry:
8015 //  - rcx: method handle
8016 //  - rdx: killable temp (interpreted only)
8017 //  - rax: killable temp (compiled only)
8018 void MacroAssembler::jump_to_method_handle_entry(Register mh_reg, Register temp_reg) {
8019   assert(mh_reg == rcx, "caller must put MH object in rcx");
8020   assert_different_registers(mh_reg, temp_reg);
8021 
8022   // pick out the interpreted side of the handler
8023   // NOTE: vmentry is not an oop!
8024   movptr(temp_reg, Address(mh_reg, delayed_value(java_lang_invoke_MethodHandle::vmentry_offset_in_bytes, temp_reg)));
8025 
8026   // off we go...
8027   jmp(Address(temp_reg, MethodHandleEntry::from_interpreted_entry_offset_in_bytes()));
8028 
8029   // for the various stubs which take control at this point,
8030   // see MethodHandles::generate_method_handle_stub


src/cpu/x86/vm/assembler_x86.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File