hotspot/src/cpu/sparc/vm/assembler_sparc.cpp
changeset 8676 9098d4e927e1
parent 8328 478a1d29e5a3
child 9176 42d9d1010f38
equal deleted inserted replaced
8675:e9fef2a9bef7 8676:9098d4e927e1
  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