1.1 --- a/src/cpu/sparc/vm/methodHandles_sparc.hpp Mon Jul 23 13:04:59 2012 -0700 1.2 +++ b/src/cpu/sparc/vm/methodHandles_sparc.hpp Tue Jul 24 10:51:00 2012 -0700 1.3 @@ -30,186 +30,9 @@ 1.4 adapter_code_size = NOT_LP64(23000 DEBUG_ONLY(+ 40000)) LP64_ONLY(35000 DEBUG_ONLY(+ 50000)) 1.5 }; 1.6 1.7 -public: 1.8 - 1.9 -class RicochetFrame : public ResourceObj { 1.10 - friend class MethodHandles; 1.11 - 1.12 - private: 1.13 - /* 1.14 - RF field x86 SPARC 1.15 - sender_pc *(rsp+0) I7-0x8 1.16 - sender_link rbp I6+BIAS 1.17 - exact_sender_sp rsi/r13 I5_savedSP 1.18 - conversion *(rcx+&amh_conv) L5_conv 1.19 - saved_args_base rax L4_sab (cf. Gargs = G4) 1.20 - saved_args_layout #NULL L3_sal 1.21 - saved_target *(rcx+&mh_vmtgt) L2_stgt 1.22 - continuation #STUB_CON L1_cont 1.23 - */ 1.24 - static const Register L1_continuation ; // what to do when control gets back here 1.25 - static const Register L2_saved_target ; // target method handle to invoke on saved_args 1.26 - static const Register L3_saved_args_layout; // caching point for MethodTypeForm.vmlayout cookie 1.27 - static const Register L4_saved_args_base ; // base of pushed arguments (slot 0, arg N) (-3) 1.28 - static const Register L5_conversion ; // misc. information from original AdapterMethodHandle (-2) 1.29 - 1.30 - frame _fr; 1.31 - 1.32 - RicochetFrame(const frame& fr) : _fr(fr) { } 1.33 - 1.34 - intptr_t* register_addr(Register reg) const { 1.35 - assert((_fr.sp() + reg->sp_offset_in_saved_window()) == _fr.register_addr(reg), "must agree"); 1.36 - return _fr.register_addr(reg); 1.37 - } 1.38 - intptr_t register_value(Register reg) const { return *register_addr(reg); } 1.39 - 1.40 - public: 1.41 - intptr_t* continuation() const { return (intptr_t*) register_value(L1_continuation); } 1.42 - oop saved_target() const { return (oop) register_value(L2_saved_target); } 1.43 - oop saved_args_layout() const { return (oop) register_value(L3_saved_args_layout); } 1.44 - intptr_t* saved_args_base() const { return (intptr_t*) register_value(L4_saved_args_base); } 1.45 - intptr_t conversion() const { return register_value(L5_conversion); } 1.46 - intptr_t* exact_sender_sp() const { return (intptr_t*) register_value(I5_savedSP); } 1.47 - intptr_t* sender_link() const { return _fr.sender_sp(); } // XXX 1.48 - address sender_pc() const { return _fr.sender_pc(); } 1.49 - 1.50 - // This value is not used for much, but it apparently must be nonzero. 1.51 - static int frame_size_in_bytes() { return wordSize * 4; } 1.52 - 1.53 - intptr_t* extended_sender_sp() const { return saved_args_base(); } 1.54 - 1.55 - intptr_t return_value_slot_number() const { 1.56 - return adapter_conversion_vminfo(conversion()); 1.57 - } 1.58 - BasicType return_value_type() const { 1.59 - return adapter_conversion_dest_type(conversion()); 1.60 - } 1.61 - bool has_return_value_slot() const { 1.62 - return return_value_type() != T_VOID; 1.63 - } 1.64 - intptr_t* return_value_slot_addr() const { 1.65 - assert(has_return_value_slot(), ""); 1.66 - return saved_arg_slot_addr(return_value_slot_number()); 1.67 - } 1.68 - intptr_t* saved_target_slot_addr() const { 1.69 - return saved_arg_slot_addr(saved_args_length()); 1.70 - } 1.71 - intptr_t* saved_arg_slot_addr(int slot) const { 1.72 - assert(slot >= 0, ""); 1.73 - return (intptr_t*)( (address)saved_args_base() + (slot * Interpreter::stackElementSize) ); 1.74 - } 1.75 - 1.76 - jint saved_args_length() const; 1.77 - jint saved_arg_offset(int arg) const; 1.78 - 1.79 - // GC interface 1.80 - oop* saved_target_addr() { return (oop*)register_addr(L2_saved_target); } 1.81 - oop* saved_args_layout_addr() { return (oop*)register_addr(L3_saved_args_layout); } 1.82 - 1.83 - oop compute_saved_args_layout(bool read_cache, bool write_cache); 1.84 - 1.85 -#ifdef ASSERT 1.86 - // The magic number is supposed to help find ricochet frames within the bytes of stack dumps. 1.87 - enum { MAGIC_NUMBER_1 = 0xFEED03E, MAGIC_NUMBER_2 = 0xBEEF03E }; 1.88 - static const Register L0_magic_number_1 ; // cookie for debugging, at start of RSA 1.89 - static Address magic_number_2_addr() { return Address(L4_saved_args_base, -wordSize); } 1.90 - intptr_t magic_number_1() const { return register_value(L0_magic_number_1); } 1.91 - intptr_t magic_number_2() const { return saved_args_base()[-1]; } 1.92 -#endif //ASSERT 1.93 - 1.94 - public: 1.95 - enum { RETURN_VALUE_PLACEHOLDER = (NOT_DEBUG(0) DEBUG_ONLY(42)) }; 1.96 - 1.97 - void verify() const NOT_DEBUG_RETURN; // check for MAGIC_NUMBER, etc. 1.98 - 1.99 - static void generate_ricochet_blob(MacroAssembler* _masm, 1.100 - // output params: 1.101 - int* bounce_offset, 1.102 - int* exception_offset, 1.103 - int* frame_size_in_words); 1.104 - 1.105 - static void enter_ricochet_frame(MacroAssembler* _masm, 1.106 - Register recv_reg, 1.107 - Register argv_reg, 1.108 - address return_handler); 1.109 - 1.110 - static void leave_ricochet_frame(MacroAssembler* _masm, 1.111 - Register recv_reg, 1.112 - Register new_sp_reg, 1.113 - Register sender_pc_reg); 1.114 - 1.115 - static RicochetFrame* from_frame(const frame& fr) { 1.116 - RicochetFrame* rf = new RicochetFrame(fr); 1.117 - rf->verify(); 1.118 - return rf; 1.119 - } 1.120 - 1.121 - static void verify_clean(MacroAssembler* _masm) NOT_DEBUG_RETURN; 1.122 - 1.123 - static void describe(const frame* fr, FrameValues& values, int frame_no) PRODUCT_RETURN; 1.124 -}; 1.125 - 1.126 // Additional helper methods for MethodHandles code generation: 1.127 public: 1.128 static void load_klass_from_Class(MacroAssembler* _masm, Register klass_reg, Register temp_reg, Register temp2_reg); 1.129 - static void load_conversion_vminfo(MacroAssembler* _masm, Address conversion_field_addr, Register reg); 1.130 - static void extract_conversion_vminfo(MacroAssembler* _masm, Register conversion_field_reg, Register reg); 1.131 - static void extract_conversion_dest_type(MacroAssembler* _masm, Register conversion_field_reg, Register reg); 1.132 - 1.133 - static void load_stack_move(MacroAssembler* _masm, 1.134 - Address G3_amh_conversion, 1.135 - Register G5_stack_move); 1.136 - 1.137 - static void insert_arg_slots(MacroAssembler* _masm, 1.138 - RegisterOrConstant arg_slots, 1.139 - Register argslot_reg, 1.140 - Register temp_reg, Register temp2_reg, Register temp3_reg); 1.141 - 1.142 - static void remove_arg_slots(MacroAssembler* _masm, 1.143 - RegisterOrConstant arg_slots, 1.144 - Register argslot_reg, 1.145 - Register temp_reg, Register temp2_reg, Register temp3_reg); 1.146 - 1.147 - static void push_arg_slots(MacroAssembler* _masm, 1.148 - Register argslot_reg, 1.149 - RegisterOrConstant slot_count, 1.150 - Register temp_reg, Register temp2_reg); 1.151 - 1.152 - static void move_arg_slots_up(MacroAssembler* _masm, 1.153 - Register bottom_reg, // invariant 1.154 - Address top_addr, // can use temp_reg 1.155 - RegisterOrConstant positive_distance_in_slots, 1.156 - Register temp_reg, Register temp2_reg); 1.157 - 1.158 - static void move_arg_slots_down(MacroAssembler* _masm, 1.159 - Address bottom_addr, // can use temp_reg 1.160 - Register top_reg, // invariant 1.161 - RegisterOrConstant negative_distance_in_slots, 1.162 - Register temp_reg, Register temp2_reg); 1.163 - 1.164 - static void move_typed_arg(MacroAssembler* _masm, 1.165 - BasicType type, bool is_element, 1.166 - Address value_src, Address slot_dest, 1.167 - Register temp_reg); 1.168 - 1.169 - static void move_return_value(MacroAssembler* _masm, BasicType type, 1.170 - Address return_slot); 1.171 - 1.172 - static void verify_argslot(MacroAssembler* _masm, Register argslot_reg, 1.173 - Register temp_reg, 1.174 - const char* error_message) NOT_DEBUG_RETURN; 1.175 - 1.176 - static void verify_argslots(MacroAssembler* _masm, 1.177 - RegisterOrConstant argslot_count, 1.178 - Register argslot_reg, 1.179 - Register temp_reg, 1.180 - Register temp2_reg, 1.181 - bool negate_argslot, 1.182 - const char* error_message) NOT_DEBUG_RETURN; 1.183 - 1.184 - static void verify_stack_move(MacroAssembler* _masm, 1.185 - RegisterOrConstant arg_slots, 1.186 - int direction) NOT_DEBUG_RETURN; 1.187 1.188 static void verify_klass(MacroAssembler* _masm, 1.189 Register obj_reg, KlassHandle klass, 1.190 @@ -223,8 +46,17 @@ 1.191 "reference is a MH"); 1.192 } 1.193 1.194 + static void verify_ref_kind(MacroAssembler* _masm, int ref_kind, Register member_reg, Register temp) NOT_DEBUG_RETURN; 1.195 + 1.196 // Similar to InterpreterMacroAssembler::jump_from_interpreted. 1.197 // Takes care of special dispatch from single stepping too. 1.198 - static void jump_from_method_handle(MacroAssembler* _masm, Register method, Register temp, Register temp2); 1.199 + static void jump_from_method_handle(MacroAssembler* _masm, Register method, 1.200 + Register temp, Register temp2, 1.201 + bool for_compiler_entry); 1.202 + 1.203 + static void jump_to_lambda_form(MacroAssembler* _masm, 1.204 + Register recv, Register method_temp, 1.205 + Register temp2, Register temp3, 1.206 + bool for_compiler_entry); 1.207 1.208 static void trace_method_handle(MacroAssembler* _masm, const char* adaptername) PRODUCT_RETURN;