Mercurial > hg > graal-jvmci-8
comparison src/cpu/sparc/vm/assembler_sparc.cpp @ 710:e5b0439ef4ae
6655638: dynamic languages need method handles
Summary: initial implementation, with known omissions (x86/64, sparc, compiler optim., c-oops, C++ interp.)
Reviewed-by: kvn, twisti, never
author | jrose |
---|---|
date | Wed, 08 Apr 2009 10:56:49 -0700 |
parents | a80d48f6fde1 |
children | 6b2273dd6fa9 |
comparison
equal
deleted
inserted
replaced
709:1d037ecd7960 | 710:e5b0439ef4ae |
---|---|
3024 } | 3024 } |
3025 | 3025 |
3026 bind(L_fallthrough); | 3026 bind(L_fallthrough); |
3027 } | 3027 } |
3028 | 3028 |
3029 | |
3030 | |
3031 | |
3032 void MacroAssembler::check_method_handle_type(Register mtype_reg, Register mh_reg, | |
3033 Register temp_reg, | |
3034 Label& wrong_method_type) { | |
3035 assert_different_registers(mtype_reg, mh_reg, temp_reg); | |
3036 // compare method type against that of the receiver | |
3037 RegisterOrConstant mhtype_offset = delayed_value(java_dyn_MethodHandle::type_offset_in_bytes, temp_reg); | |
3038 ld_ptr(mh_reg, mhtype_offset, temp_reg); | |
3039 cmp(temp_reg, mtype_reg); | |
3040 br(Assembler::notEqual, false, Assembler::pn, wrong_method_type); | |
3041 delayed()->nop(); | |
3042 } | |
3043 | |
3044 | |
3045 void MacroAssembler::jump_to_method_handle_entry(Register mh_reg, Register temp_reg) { | |
3046 assert(mh_reg == G3_method_handle, "caller must put MH object in G3"); | |
3047 assert_different_registers(mh_reg, temp_reg); | |
3048 | |
3049 // pick out the interpreted side of the handler | |
3050 ld_ptr(mh_reg, delayed_value(java_dyn_MethodHandle::vmentry_offset_in_bytes, temp_reg), temp_reg); | |
3051 | |
3052 // off we go... | |
3053 ld_ptr(temp_reg, MethodHandleEntry::from_interpreted_entry_offset_in_bytes(), temp_reg); | |
3054 jmp(temp_reg, 0); | |
3055 | |
3056 // for the various stubs which take control at this point, | |
3057 // see MethodHandles::generate_method_handle_stub | |
3058 | |
3059 // (Can any caller use this delay slot? If so, add an option for supression.) | |
3060 delayed()->nop(); | |
3061 } | |
3062 | |
3063 RegisterOrConstant MacroAssembler::argument_offset(RegisterOrConstant arg_slot, | |
3064 int extra_slot_offset) { | |
3065 // cf. TemplateTable::prepare_invoke(), if (load_receiver). | |
3066 int stackElementSize = Interpreter::stackElementWords() * wordSize; | |
3067 int offset = Interpreter::expr_offset_in_bytes(extra_slot_offset+0); | |
3068 int offset1 = Interpreter::expr_offset_in_bytes(extra_slot_offset+1); | |
3069 assert(offset1 - offset == stackElementSize, "correct arithmetic"); | |
3070 if (arg_slot.is_constant()) { | |
3071 offset += arg_slot.as_constant() * stackElementSize; | |
3072 return offset; | |
3073 } else { | |
3074 Register temp = arg_slot.as_register(); | |
3075 sll_ptr(temp, exact_log2(stackElementSize), temp); | |
3076 if (offset != 0) | |
3077 add(temp, offset, temp); | |
3078 return temp; | |
3079 } | |
3080 } | |
3029 | 3081 |
3030 | 3082 |
3031 | 3083 |
3032 void MacroAssembler::biased_locking_enter(Register obj_reg, Register mark_reg, | 3084 void MacroAssembler::biased_locking_enter(Register obj_reg, Register mark_reg, |
3033 Register temp_reg, | 3085 Register temp_reg, |