1007 1008 address c2i_entry = __ pc(); 1009 gen_c2i_adapter(masm, total_args_passed, comp_args_on_stack, sig_bt, regs, skip_fixup); 1010 1011 __ flush(); 1012 return AdapterHandlerLibrary::new_entry(fingerprint, i2c_entry, c2i_entry, c2i_unverified_entry); 1013 } 1014 1015 1016 static int reg2offset_in(VMReg r) { 1017 // Account for saved FP and LR 1018 return r->reg2stack() * VMRegImpl::stack_slot_size + 2*wordSize; 1019 } 1020 1021 static int reg2offset_out(VMReg r) { 1022 return (r->reg2stack() + SharedRuntime::out_preserve_stack_slots()) * VMRegImpl::stack_slot_size; 1023 } 1024 1025 1026 static void verify_oop_args(MacroAssembler* masm, 1027 methodHandle method, 1028 const BasicType* sig_bt, 1029 const VMRegPair* regs) { 1030 Register temp_reg = Rmethod; // not part of any compiled calling seq 1031 if (VerifyOops) { 1032 for (int i = 0; i < method->size_of_parameters(); i++) { 1033 if (sig_bt[i] == T_OBJECT || sig_bt[i] == T_ARRAY) { 1034 VMReg r = regs[i].first(); 1035 assert(r->is_valid(), "bad oop arg"); 1036 if (r->is_stack()) { 1037 __ ldr(temp_reg, Address(SP, r->reg2stack() * VMRegImpl::stack_slot_size)); 1038 __ verify_oop(temp_reg); 1039 } else { 1040 __ verify_oop(r->as_Register()); 1041 } 1042 } 1043 } 1044 } 1045 } 1046 1047 static void gen_special_dispatch(MacroAssembler* masm, 1048 methodHandle method, 1049 const BasicType* sig_bt, 1050 const VMRegPair* regs) { 1051 verify_oop_args(masm, method, sig_bt, regs); 1052 vmIntrinsics::ID iid = method->intrinsic_id(); 1053 1054 // Now write the args into the outgoing interpreter space 1055 bool has_receiver = false; 1056 Register receiver_reg = noreg; 1057 int member_arg_pos = -1; 1058 Register member_reg = noreg; 1059 int ref_kind = MethodHandles::signature_polymorphic_intrinsic_ref_kind(iid); 1060 if (ref_kind != 0) { 1061 member_arg_pos = method->size_of_parameters() - 1; // trailing MemberName argument 1062 member_reg = Rmethod; // known to be free at this point 1063 has_receiver = MethodHandles::ref_kind_has_receiver(ref_kind); 1064 } else if (iid == vmIntrinsics::_invokeBasic) { 1065 has_receiver = true; 1066 } else { 1067 fatal("unexpected intrinsic id %d", iid); 1068 } | 1007 1008 address c2i_entry = __ pc(); 1009 gen_c2i_adapter(masm, total_args_passed, comp_args_on_stack, sig_bt, regs, skip_fixup); 1010 1011 __ flush(); 1012 return AdapterHandlerLibrary::new_entry(fingerprint, i2c_entry, c2i_entry, c2i_unverified_entry); 1013 } 1014 1015 1016 static int reg2offset_in(VMReg r) { 1017 // Account for saved FP and LR 1018 return r->reg2stack() * VMRegImpl::stack_slot_size + 2*wordSize; 1019 } 1020 1021 static int reg2offset_out(VMReg r) { 1022 return (r->reg2stack() + SharedRuntime::out_preserve_stack_slots()) * VMRegImpl::stack_slot_size; 1023 } 1024 1025 1026 static void verify_oop_args(MacroAssembler* masm, 1027 const methodHandle& method, 1028 const BasicType* sig_bt, 1029 const VMRegPair* regs) { 1030 Register temp_reg = Rmethod; // not part of any compiled calling seq 1031 if (VerifyOops) { 1032 for (int i = 0; i < method->size_of_parameters(); i++) { 1033 if (sig_bt[i] == T_OBJECT || sig_bt[i] == T_ARRAY) { 1034 VMReg r = regs[i].first(); 1035 assert(r->is_valid(), "bad oop arg"); 1036 if (r->is_stack()) { 1037 __ ldr(temp_reg, Address(SP, r->reg2stack() * VMRegImpl::stack_slot_size)); 1038 __ verify_oop(temp_reg); 1039 } else { 1040 __ verify_oop(r->as_Register()); 1041 } 1042 } 1043 } 1044 } 1045 } 1046 1047 static void gen_special_dispatch(MacroAssembler* masm, 1048 const methodHandle& method, 1049 const BasicType* sig_bt, 1050 const VMRegPair* regs) { 1051 verify_oop_args(masm, method, sig_bt, regs); 1052 vmIntrinsics::ID iid = method->intrinsic_id(); 1053 1054 // Now write the args into the outgoing interpreter space 1055 bool has_receiver = false; 1056 Register receiver_reg = noreg; 1057 int member_arg_pos = -1; 1058 Register member_reg = noreg; 1059 int ref_kind = MethodHandles::signature_polymorphic_intrinsic_ref_kind(iid); 1060 if (ref_kind != 0) { 1061 member_arg_pos = method->size_of_parameters() - 1; // trailing MemberName argument 1062 member_reg = Rmethod; // known to be free at this point 1063 has_receiver = MethodHandles::ref_kind_has_receiver(ref_kind); 1064 } else if (iid == vmIntrinsics::_invokeBasic) { 1065 has_receiver = true; 1066 } else { 1067 fatal("unexpected intrinsic id %d", iid); 1068 } |