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 |