Mercurial > hg > graal-jvmci-8
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); |