3177 void MacroAssembler::check_method_handle_type(Register mtype_reg, Register mh_reg, |
3177 void MacroAssembler::check_method_handle_type(Register mtype_reg, Register mh_reg, |
3178 Register temp_reg, |
3178 Register temp_reg, |
3179 Label& wrong_method_type) { |
3179 Label& wrong_method_type) { |
3180 assert_different_registers(mtype_reg, mh_reg, temp_reg); |
3180 assert_different_registers(mtype_reg, mh_reg, temp_reg); |
3181 // compare method type against that of the receiver |
3181 // compare method type against that of the receiver |
3182 RegisterOrConstant mhtype_offset = delayed_value(java_dyn_MethodHandle::type_offset_in_bytes, temp_reg); |
3182 RegisterOrConstant mhtype_offset = delayed_value(java_lang_invoke_MethodHandle::type_offset_in_bytes, temp_reg); |
3183 load_heap_oop(mh_reg, mhtype_offset, temp_reg); |
3183 load_heap_oop(mh_reg, mhtype_offset, temp_reg); |
3184 cmp(temp_reg, mtype_reg); |
3184 cmp(temp_reg, mtype_reg); |
3185 br(Assembler::notEqual, false, Assembler::pn, wrong_method_type); |
3185 br(Assembler::notEqual, false, Assembler::pn, wrong_method_type); |
3186 delayed()->nop(); |
3186 delayed()->nop(); |
3187 } |
3187 } |
3193 // method handle's MethodType. This macro hides the distinction. |
3193 // method handle's MethodType. This macro hides the distinction. |
3194 void MacroAssembler::load_method_handle_vmslots(Register vmslots_reg, Register mh_reg, |
3194 void MacroAssembler::load_method_handle_vmslots(Register vmslots_reg, Register mh_reg, |
3195 Register temp_reg) { |
3195 Register temp_reg) { |
3196 assert_different_registers(vmslots_reg, mh_reg, temp_reg); |
3196 assert_different_registers(vmslots_reg, mh_reg, temp_reg); |
3197 // load mh.type.form.vmslots |
3197 // load mh.type.form.vmslots |
3198 if (java_dyn_MethodHandle::vmslots_offset_in_bytes() != 0) { |
3198 if (java_lang_invoke_MethodHandle::vmslots_offset_in_bytes() != 0) { |
3199 // hoist vmslots into every mh to avoid dependent load chain |
3199 // hoist vmslots into every mh to avoid dependent load chain |
3200 ld( Address(mh_reg, delayed_value(java_dyn_MethodHandle::vmslots_offset_in_bytes, temp_reg)), vmslots_reg); |
3200 ld( Address(mh_reg, delayed_value(java_lang_invoke_MethodHandle::vmslots_offset_in_bytes, temp_reg)), vmslots_reg); |
3201 } else { |
3201 } else { |
3202 Register temp2_reg = vmslots_reg; |
3202 Register temp2_reg = vmslots_reg; |
3203 load_heap_oop(Address(mh_reg, delayed_value(java_dyn_MethodHandle::type_offset_in_bytes, temp_reg)), temp2_reg); |
3203 load_heap_oop(Address(mh_reg, delayed_value(java_lang_invoke_MethodHandle::type_offset_in_bytes, temp_reg)), temp2_reg); |
3204 load_heap_oop(Address(temp2_reg, delayed_value(java_dyn_MethodType::form_offset_in_bytes, temp_reg)), temp2_reg); |
3204 load_heap_oop(Address(temp2_reg, delayed_value(java_lang_invoke_MethodType::form_offset_in_bytes, temp_reg)), temp2_reg); |
3205 ld( Address(temp2_reg, delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, temp_reg)), vmslots_reg); |
3205 ld( Address(temp2_reg, delayed_value(java_lang_invoke_MethodTypeForm::vmslots_offset_in_bytes, temp_reg)), vmslots_reg); |
3206 } |
3206 } |
3207 } |
3207 } |
3208 |
3208 |
3209 |
3209 |
3210 void MacroAssembler::jump_to_method_handle_entry(Register mh_reg, Register temp_reg, bool emit_delayed_nop) { |
3210 void MacroAssembler::jump_to_method_handle_entry(Register mh_reg, Register temp_reg, bool emit_delayed_nop) { |
3211 assert(mh_reg == G3_method_handle, "caller must put MH object in G3"); |
3211 assert(mh_reg == G3_method_handle, "caller must put MH object in G3"); |
3212 assert_different_registers(mh_reg, temp_reg); |
3212 assert_different_registers(mh_reg, temp_reg); |
3213 |
3213 |
3214 // pick out the interpreted side of the handler |
3214 // pick out the interpreted side of the handler |
3215 // NOTE: vmentry is not an oop! |
3215 // NOTE: vmentry is not an oop! |
3216 ld_ptr(mh_reg, delayed_value(java_dyn_MethodHandle::vmentry_offset_in_bytes, temp_reg), temp_reg); |
3216 ld_ptr(mh_reg, delayed_value(java_lang_invoke_MethodHandle::vmentry_offset_in_bytes, temp_reg), temp_reg); |
3217 |
3217 |
3218 // off we go... |
3218 // off we go... |
3219 ld_ptr(temp_reg, MethodHandleEntry::from_interpreted_entry_offset_in_bytes(), temp_reg); |
3219 ld_ptr(temp_reg, MethodHandleEntry::from_interpreted_entry_offset_in_bytes(), temp_reg); |
3220 jmp(temp_reg, 0); |
3220 jmp(temp_reg, 0); |
3221 |
3221 |