8002 // method handle's MethodType. This macro hides the distinction. |
8002 // method handle's MethodType. This macro hides the distinction. |
8003 void MacroAssembler::load_method_handle_vmslots(Register vmslots_reg, Register mh_reg, |
8003 void MacroAssembler::load_method_handle_vmslots(Register vmslots_reg, Register mh_reg, |
8004 Register temp_reg) { |
8004 Register temp_reg) { |
8005 assert_different_registers(vmslots_reg, mh_reg, temp_reg); |
8005 assert_different_registers(vmslots_reg, mh_reg, temp_reg); |
8006 // load mh.type.form.vmslots |
8006 // load mh.type.form.vmslots |
8007 if (java_lang_invoke_MethodHandle::vmslots_offset_in_bytes() != 0) { |
8007 Register temp2_reg = vmslots_reg; |
8008 // hoist vmslots into every mh to avoid dependent load chain |
8008 load_heap_oop(temp2_reg, Address(mh_reg, delayed_value(java_lang_invoke_MethodHandle::type_offset_in_bytes, temp_reg))); |
8009 movl(vmslots_reg, Address(mh_reg, delayed_value(java_lang_invoke_MethodHandle::vmslots_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 } else { |
8010 movl(vmslots_reg, Address(temp2_reg, delayed_value(java_lang_invoke_MethodTypeForm::vmslots_offset_in_bytes, temp_reg))); |
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 } |
8011 } |
8017 |
8012 |
8018 |
8013 |
8019 // registers on entry: |
8014 // registers on entry: |
8020 // - rcx: method handle |
8015 // - rcx: method handle |