1.1 --- a/src/cpu/sparc/vm/assembler_sparc.cpp Fri Oct 08 02:42:17 2010 -0700 1.2 +++ b/src/cpu/sparc/vm/assembler_sparc.cpp Mon Oct 11 04:18:58 2010 -0700 1.3 @@ -3094,11 +3094,10 @@ 1.4 void MacroAssembler::check_method_handle_type(Register mtype_reg, Register mh_reg, 1.5 Register temp_reg, 1.6 Label& wrong_method_type) { 1.7 - if (UseCompressedOops) unimplemented("coop"); // field accesses must decode 1.8 assert_different_registers(mtype_reg, mh_reg, temp_reg); 1.9 // compare method type against that of the receiver 1.10 RegisterOrConstant mhtype_offset = delayed_value(java_dyn_MethodHandle::type_offset_in_bytes, temp_reg); 1.11 - ld_ptr(mh_reg, mhtype_offset, temp_reg); 1.12 + load_heap_oop(mh_reg, mhtype_offset, temp_reg); 1.13 cmp(temp_reg, mtype_reg); 1.14 br(Assembler::notEqual, false, Assembler::pn, wrong_method_type); 1.15 delayed()->nop(); 1.16 @@ -3112,16 +3111,15 @@ 1.17 void MacroAssembler::load_method_handle_vmslots(Register vmslots_reg, Register mh_reg, 1.18 Register temp_reg) { 1.19 assert_different_registers(vmslots_reg, mh_reg, temp_reg); 1.20 - if (UseCompressedOops) unimplemented("coop"); // field accesses must decode 1.21 // load mh.type.form.vmslots 1.22 if (java_dyn_MethodHandle::vmslots_offset_in_bytes() != 0) { 1.23 // hoist vmslots into every mh to avoid dependent load chain 1.24 - ld( Address(mh_reg, delayed_value(java_dyn_MethodHandle::vmslots_offset_in_bytes, temp_reg)), vmslots_reg); 1.25 + ld( Address(mh_reg, delayed_value(java_dyn_MethodHandle::vmslots_offset_in_bytes, temp_reg)), vmslots_reg); 1.26 } else { 1.27 Register temp2_reg = vmslots_reg; 1.28 - ld_ptr(Address(mh_reg, delayed_value(java_dyn_MethodHandle::type_offset_in_bytes, temp_reg)), temp2_reg); 1.29 - ld_ptr(Address(temp2_reg, delayed_value(java_dyn_MethodType::form_offset_in_bytes, temp_reg)), temp2_reg); 1.30 - ld( Address(temp2_reg, delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, temp_reg)), vmslots_reg); 1.31 + load_heap_oop(Address(mh_reg, delayed_value(java_dyn_MethodHandle::type_offset_in_bytes, temp_reg)), temp2_reg); 1.32 + load_heap_oop(Address(temp2_reg, delayed_value(java_dyn_MethodType::form_offset_in_bytes, temp_reg)), temp2_reg); 1.33 + ld( Address(temp2_reg, delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, temp_reg)), vmslots_reg); 1.34 } 1.35 } 1.36 1.37 @@ -3130,9 +3128,8 @@ 1.38 assert(mh_reg == G3_method_handle, "caller must put MH object in G3"); 1.39 assert_different_registers(mh_reg, temp_reg); 1.40 1.41 - if (UseCompressedOops) unimplemented("coop"); // field accesses must decode 1.42 - 1.43 // pick out the interpreted side of the handler 1.44 + // NOTE: vmentry is not an oop! 1.45 ld_ptr(mh_reg, delayed_value(java_dyn_MethodHandle::vmentry_offset_in_bytes, temp_reg), temp_reg); 1.46 1.47 // off we go... 1.48 @@ -4653,6 +4650,11 @@ 1.49 } 1.50 } 1.51 1.52 +void MacroAssembler::load_heap_oop(Register s1, RegisterOrConstant s2, Register d) { 1.53 + if (s2.is_constant()) load_heap_oop(s1, s2.as_constant(), d); 1.54 + else load_heap_oop(s1, s2.as_register(), d); 1.55 +} 1.56 + 1.57 void MacroAssembler::store_heap_oop(Register d, Register s1, Register s2) { 1.58 if (UseCompressedOops) { 1.59 assert(s1 != d && s2 != d, "not enough registers");