comparison src/cpu/sparc/vm/assembler_sparc.cpp @ 1846:d55217dc206f

6829194: JSR 292 needs to support compressed oops Reviewed-by: kvn, jrose
author twisti
date Mon, 11 Oct 2010 04:18:58 -0700
parents 3e8fbc61cee8
children f95d63e2154a
comparison
equal deleted inserted replaced
1845:a222fcfba398 1846:d55217dc206f
3092 3092
3093 3093
3094 void MacroAssembler::check_method_handle_type(Register mtype_reg, Register mh_reg, 3094 void MacroAssembler::check_method_handle_type(Register mtype_reg, Register mh_reg,
3095 Register temp_reg, 3095 Register temp_reg,
3096 Label& wrong_method_type) { 3096 Label& wrong_method_type) {
3097 if (UseCompressedOops) unimplemented("coop"); // field accesses must decode
3098 assert_different_registers(mtype_reg, mh_reg, temp_reg); 3097 assert_different_registers(mtype_reg, mh_reg, temp_reg);
3099 // compare method type against that of the receiver 3098 // compare method type against that of the receiver
3100 RegisterOrConstant mhtype_offset = delayed_value(java_dyn_MethodHandle::type_offset_in_bytes, temp_reg); 3099 RegisterOrConstant mhtype_offset = delayed_value(java_dyn_MethodHandle::type_offset_in_bytes, temp_reg);
3101 ld_ptr(mh_reg, mhtype_offset, temp_reg); 3100 load_heap_oop(mh_reg, mhtype_offset, temp_reg);
3102 cmp(temp_reg, mtype_reg); 3101 cmp(temp_reg, mtype_reg);
3103 br(Assembler::notEqual, false, Assembler::pn, wrong_method_type); 3102 br(Assembler::notEqual, false, Assembler::pn, wrong_method_type);
3104 delayed()->nop(); 3103 delayed()->nop();
3105 } 3104 }
3106 3105
3110 // in every method handle, or else is indirectly accessed through the 3109 // in every method handle, or else is indirectly accessed through the
3111 // method handle's MethodType. This macro hides the distinction. 3110 // method handle's MethodType. This macro hides the distinction.
3112 void MacroAssembler::load_method_handle_vmslots(Register vmslots_reg, Register mh_reg, 3111 void MacroAssembler::load_method_handle_vmslots(Register vmslots_reg, Register mh_reg,
3113 Register temp_reg) { 3112 Register temp_reg) {
3114 assert_different_registers(vmslots_reg, mh_reg, temp_reg); 3113 assert_different_registers(vmslots_reg, mh_reg, temp_reg);
3115 if (UseCompressedOops) unimplemented("coop"); // field accesses must decode
3116 // load mh.type.form.vmslots 3114 // load mh.type.form.vmslots
3117 if (java_dyn_MethodHandle::vmslots_offset_in_bytes() != 0) { 3115 if (java_dyn_MethodHandle::vmslots_offset_in_bytes() != 0) {
3118 // hoist vmslots into every mh to avoid dependent load chain 3116 // hoist vmslots into every mh to avoid dependent load chain
3119 ld( Address(mh_reg, delayed_value(java_dyn_MethodHandle::vmslots_offset_in_bytes, temp_reg)), vmslots_reg); 3117 ld( Address(mh_reg, delayed_value(java_dyn_MethodHandle::vmslots_offset_in_bytes, temp_reg)), vmslots_reg);
3120 } else { 3118 } else {
3121 Register temp2_reg = vmslots_reg; 3119 Register temp2_reg = vmslots_reg;
3122 ld_ptr(Address(mh_reg, delayed_value(java_dyn_MethodHandle::type_offset_in_bytes, temp_reg)), temp2_reg); 3120 load_heap_oop(Address(mh_reg, delayed_value(java_dyn_MethodHandle::type_offset_in_bytes, temp_reg)), temp2_reg);
3123 ld_ptr(Address(temp2_reg, delayed_value(java_dyn_MethodType::form_offset_in_bytes, temp_reg)), temp2_reg); 3121 load_heap_oop(Address(temp2_reg, delayed_value(java_dyn_MethodType::form_offset_in_bytes, temp_reg)), temp2_reg);
3124 ld( Address(temp2_reg, delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, temp_reg)), vmslots_reg); 3122 ld( Address(temp2_reg, delayed_value(java_dyn_MethodTypeForm::vmslots_offset_in_bytes, temp_reg)), vmslots_reg);
3125 } 3123 }
3126 } 3124 }
3127 3125
3128 3126
3129 void MacroAssembler::jump_to_method_handle_entry(Register mh_reg, Register temp_reg, bool emit_delayed_nop) { 3127 void MacroAssembler::jump_to_method_handle_entry(Register mh_reg, Register temp_reg, bool emit_delayed_nop) {
3130 assert(mh_reg == G3_method_handle, "caller must put MH object in G3"); 3128 assert(mh_reg == G3_method_handle, "caller must put MH object in G3");
3131 assert_different_registers(mh_reg, temp_reg); 3129 assert_different_registers(mh_reg, temp_reg);
3132 3130
3133 if (UseCompressedOops) unimplemented("coop"); // field accesses must decode
3134
3135 // pick out the interpreted side of the handler 3131 // pick out the interpreted side of the handler
3132 // NOTE: vmentry is not an oop!
3136 ld_ptr(mh_reg, delayed_value(java_dyn_MethodHandle::vmentry_offset_in_bytes, temp_reg), temp_reg); 3133 ld_ptr(mh_reg, delayed_value(java_dyn_MethodHandle::vmentry_offset_in_bytes, temp_reg), temp_reg);
3137 3134
3138 // off we go... 3135 // off we go...
3139 ld_ptr(temp_reg, MethodHandleEntry::from_interpreted_entry_offset_in_bytes(), temp_reg); 3136 ld_ptr(temp_reg, MethodHandleEntry::from_interpreted_entry_offset_in_bytes(), temp_reg);
3140 jmp(temp_reg, 0); 3137 jmp(temp_reg, 0);
4651 } else { 4648 } else {
4652 ld_ptr(s1, simm13a, d); 4649 ld_ptr(s1, simm13a, d);
4653 } 4650 }
4654 } 4651 }
4655 4652
4653 void MacroAssembler::load_heap_oop(Register s1, RegisterOrConstant s2, Register d) {
4654 if (s2.is_constant()) load_heap_oop(s1, s2.as_constant(), d);
4655 else load_heap_oop(s1, s2.as_register(), d);
4656 }
4657
4656 void MacroAssembler::store_heap_oop(Register d, Register s1, Register s2) { 4658 void MacroAssembler::store_heap_oop(Register d, Register s1, Register s2) {
4657 if (UseCompressedOops) { 4659 if (UseCompressedOops) {
4658 assert(s1 != d && s2 != d, "not enough registers"); 4660 assert(s1 != d && s2 != d, "not enough registers");
4659 encode_heap_oop(d); 4661 encode_heap_oop(d);
4660 st(d, s1, s2); 4662 st(d, s1, s2);