src/cpu/sparc/vm/methodHandles_sparc.hpp

changeset 3969
1d7922586cf6
parent 3451
5dbed2f542ff
child 4037
da91efe96a93
     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;

mercurial