1831 static void gen_special_dispatch(MacroAssembler* masm,
1832 methodHandle method,
1833 const BasicType* sig_bt,
1834 const VMRegPair* regs) {
1835 verify_oop_args(masm, method, sig_bt, regs);
1836 vmIntrinsics::ID iid = method->intrinsic_id();
1837
1838 // Now write the args into the outgoing interpreter space
1839 bool has_receiver = false;
1840 Register receiver_reg = noreg;
1841 int member_arg_pos = -1;
1842 Register member_reg = noreg;
1843 int ref_kind = MethodHandles::signature_polymorphic_intrinsic_ref_kind(iid);
1844 if (ref_kind != 0) {
1845 member_arg_pos = method->size_of_parameters() - 1; // trailing MemberName argument
1846 member_reg = rbx; // known to be free at this point
1847 has_receiver = MethodHandles::ref_kind_has_receiver(ref_kind);
1848 } else if (iid == vmIntrinsics::_invokeBasic) {
1849 has_receiver = true;
1850 } else {
1851 fatal(err_msg_res("unexpected intrinsic id %d", iid));
1852 }
1853
1854 if (member_reg != noreg) {
1855 // Load the member_arg into register, if necessary.
1856 SharedRuntime::check_member_name_argument_is_last_argument(method, sig_bt, regs);
1857 VMReg r = regs[member_arg_pos].first();
1858 if (r->is_stack()) {
1859 __ movptr(member_reg, Address(rsp, r->reg2stack() * VMRegImpl::stack_slot_size + wordSize));
1860 } else {
1861 // no data motion is needed
1862 member_reg = r->as_Register();
1863 }
1864 }
1865
1866 if (has_receiver) {
1867 // Make sure the receiver is loaded into a register.
1868 assert(method->size_of_parameters() > 0, "oob");
1869 assert(sig_bt[0] == T_OBJECT, "receiver argument must be an object");
1870 VMReg r = regs[0].first();
1871 assert(r->is_valid(), "bad receiver arg");
|
1831 static void gen_special_dispatch(MacroAssembler* masm,
1832 methodHandle method,
1833 const BasicType* sig_bt,
1834 const VMRegPair* regs) {
1835 verify_oop_args(masm, method, sig_bt, regs);
1836 vmIntrinsics::ID iid = method->intrinsic_id();
1837
1838 // Now write the args into the outgoing interpreter space
1839 bool has_receiver = false;
1840 Register receiver_reg = noreg;
1841 int member_arg_pos = -1;
1842 Register member_reg = noreg;
1843 int ref_kind = MethodHandles::signature_polymorphic_intrinsic_ref_kind(iid);
1844 if (ref_kind != 0) {
1845 member_arg_pos = method->size_of_parameters() - 1; // trailing MemberName argument
1846 member_reg = rbx; // known to be free at this point
1847 has_receiver = MethodHandles::ref_kind_has_receiver(ref_kind);
1848 } else if (iid == vmIntrinsics::_invokeBasic) {
1849 has_receiver = true;
1850 } else {
1851 fatal("unexpected intrinsic id %d", iid);
1852 }
1853
1854 if (member_reg != noreg) {
1855 // Load the member_arg into register, if necessary.
1856 SharedRuntime::check_member_name_argument_is_last_argument(method, sig_bt, regs);
1857 VMReg r = regs[member_arg_pos].first();
1858 if (r->is_stack()) {
1859 __ movptr(member_reg, Address(rsp, r->reg2stack() * VMRegImpl::stack_slot_size + wordSize));
1860 } else {
1861 // no data motion is needed
1862 member_reg = r->as_Register();
1863 }
1864 }
1865
1866 if (has_receiver) {
1867 // Make sure the receiver is loaded into a register.
1868 assert(method->size_of_parameters() > 0, "oob");
1869 assert(sig_bt[0] == T_OBJECT, "receiver argument must be an object");
1870 VMReg r = regs[0].first();
1871 assert(r->is_valid(), "bad receiver arg");
|