src/cpu/sparc/vm/assembler_sparc.cpp

changeset 2201
d55217dc206f
parent 2103
3e8fbc61cee8
child 2314
f95d63e2154a
     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");

mercurial