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,