< prev index next >

src/cpu/arm/vm/sharedRuntime_arm.cpp

Print this page




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   }


< prev index next >