1780 Address mdo_arg_addr(mdp, in_bytes(TypeEntriesAtCall::argument_type_offset(i))-off_to_args);
1781 profile_obj_type(tmp, mdo_arg_addr, tmp, /*ltg did compare to 0*/ true);
1782
1783 int to_add = in_bytes(TypeStackSlotEntries::per_arg_size());
1784 add2reg(mdp, to_add);
1785 off_to_args += to_add;
1786 }
1787
1788 if (MethodData::profile_return()) {
1789 z_lg(tmp, in_bytes(TypeEntriesAtCall::cell_count_offset())-off_to_args, mdp);
1790 add2reg(tmp, -TypeProfileArgsLimit*TypeStackSlotEntries::per_arg_count());
1791 }
1792
1793 bind(done);
1794
1795 if (MethodData::profile_return()) {
1796 // We're right after the type profile for the last
1797 // argument. Tmp is the number of cells left in the
1798 // CallTypeData/VirtualCallTypeData to reach its end. Non null
1799 // if there's a return to profile.
1800 assert(ReturnTypeEntry::static_cell_count() < TypeStackSlotEntries::per_arg_count(), "can't move past ret type");
1801 z_sllg(tmp, tmp, exact_log2(DataLayout::cell_size));
1802 z_agr(mdp, tmp);
1803 }
1804 z_stg(mdp, _z_ijava_state_neg(mdx), Z_fp);
1805 } else {
1806 assert(MethodData::profile_return(), "either profile call args or call ret");
1807 update_mdp_by_constant(mdp, in_bytes(TypeEntriesAtCall::return_only_size()));
1808 }
1809
1810 // Mdp points right after the end of the
1811 // CallTypeData/VirtualCallTypeData, right after the cells for the
1812 // return value type if there's one.
1813 bind(profile_continue);
1814 }
1815 }
1816
1817 void InterpreterMacroAssembler::profile_return_type(Register mdp, Register ret, Register tmp) {
1818 assert_different_registers(mdp, ret, tmp);
1819 if (ProfileInterpreter && MethodData::profile_return()) {
1820 Label profile_continue;
1829 // length.
1830 NearLabel do_profile;
1831 Address bc(Z_bcp);
1832 z_lb(tmp, bc);
1833 compare32_and_branch(tmp, Bytecodes::_invokedynamic, Assembler::bcondEqual, do_profile);
1834 compare32_and_branch(tmp, Bytecodes::_invokehandle, Assembler::bcondEqual, do_profile);
1835 get_method(tmp);
1836 // Supplement to 8139891: _intrinsic_id exceeded 1-byte size limit.
1837 if (Method::intrinsic_id_size_in_bytes() == 1) {
1838 z_cli(in_bytes(Method::intrinsic_id_offset()), tmp, static_cast<int>(vmIntrinsics::_compiledLambdaForm));
1839 } else {
1840 assert(Method::intrinsic_id_size_in_bytes() == 2, "size error: check Method::_intrinsic_id");
1841 z_lh(tmp, in_bytes(Method::intrinsic_id_offset()), Z_R0, tmp);
1842 z_chi(tmp, static_cast<int>(vmIntrinsics::_compiledLambdaForm));
1843 }
1844 z_brne(profile_continue);
1845
1846 bind(do_profile);
1847 }
1848
1849 Address mdo_ret_addr(mdp, -in_bytes(ReturnTypeEntry::size()));
1850 profile_obj_type(ret, mdo_ret_addr, tmp);
1851
1852 bind(profile_continue);
1853 }
1854 }
1855
1856 void InterpreterMacroAssembler::profile_parameters_type(Register mdp, Register tmp1, Register tmp2) {
1857 if (ProfileInterpreter && MethodData::profile_parameters()) {
1858 Label profile_continue, done;
1859
1860 test_method_data_pointer(mdp, profile_continue);
1861
1862 // Load the offset of the area within the MDO used for
1863 // parameters. If it's negative we're not profiling any parameters.
1864 Address parm_di_addr(mdp, in_bytes(MethodData::parameters_type_data_di_offset()) - in_bytes(MethodData::data_offset()));
1865 load_and_test_int2long(tmp1, parm_di_addr);
1866 z_brl(profile_continue);
1867
1868 // Compute a pointer to the area for parameters from the offset
1869 // and move the pointer to the slot for the last
|
1780 Address mdo_arg_addr(mdp, in_bytes(TypeEntriesAtCall::argument_type_offset(i))-off_to_args);
1781 profile_obj_type(tmp, mdo_arg_addr, tmp, /*ltg did compare to 0*/ true);
1782
1783 int to_add = in_bytes(TypeStackSlotEntries::per_arg_size());
1784 add2reg(mdp, to_add);
1785 off_to_args += to_add;
1786 }
1787
1788 if (MethodData::profile_return()) {
1789 z_lg(tmp, in_bytes(TypeEntriesAtCall::cell_count_offset())-off_to_args, mdp);
1790 add2reg(tmp, -TypeProfileArgsLimit*TypeStackSlotEntries::per_arg_count());
1791 }
1792
1793 bind(done);
1794
1795 if (MethodData::profile_return()) {
1796 // We're right after the type profile for the last
1797 // argument. Tmp is the number of cells left in the
1798 // CallTypeData/VirtualCallTypeData to reach its end. Non null
1799 // if there's a return to profile.
1800 assert(SingleTypeEntry::static_cell_count() < TypeStackSlotEntries::per_arg_count(), "can't move past ret type");
1801 z_sllg(tmp, tmp, exact_log2(DataLayout::cell_size));
1802 z_agr(mdp, tmp);
1803 }
1804 z_stg(mdp, _z_ijava_state_neg(mdx), Z_fp);
1805 } else {
1806 assert(MethodData::profile_return(), "either profile call args or call ret");
1807 update_mdp_by_constant(mdp, in_bytes(TypeEntriesAtCall::return_only_size()));
1808 }
1809
1810 // Mdp points right after the end of the
1811 // CallTypeData/VirtualCallTypeData, right after the cells for the
1812 // return value type if there's one.
1813 bind(profile_continue);
1814 }
1815 }
1816
1817 void InterpreterMacroAssembler::profile_return_type(Register mdp, Register ret, Register tmp) {
1818 assert_different_registers(mdp, ret, tmp);
1819 if (ProfileInterpreter && MethodData::profile_return()) {
1820 Label profile_continue;
1829 // length.
1830 NearLabel do_profile;
1831 Address bc(Z_bcp);
1832 z_lb(tmp, bc);
1833 compare32_and_branch(tmp, Bytecodes::_invokedynamic, Assembler::bcondEqual, do_profile);
1834 compare32_and_branch(tmp, Bytecodes::_invokehandle, Assembler::bcondEqual, do_profile);
1835 get_method(tmp);
1836 // Supplement to 8139891: _intrinsic_id exceeded 1-byte size limit.
1837 if (Method::intrinsic_id_size_in_bytes() == 1) {
1838 z_cli(in_bytes(Method::intrinsic_id_offset()), tmp, static_cast<int>(vmIntrinsics::_compiledLambdaForm));
1839 } else {
1840 assert(Method::intrinsic_id_size_in_bytes() == 2, "size error: check Method::_intrinsic_id");
1841 z_lh(tmp, in_bytes(Method::intrinsic_id_offset()), Z_R0, tmp);
1842 z_chi(tmp, static_cast<int>(vmIntrinsics::_compiledLambdaForm));
1843 }
1844 z_brne(profile_continue);
1845
1846 bind(do_profile);
1847 }
1848
1849 Address mdo_ret_addr(mdp, -in_bytes(SingleTypeEntry::size()));
1850 profile_obj_type(ret, mdo_ret_addr, tmp);
1851
1852 bind(profile_continue);
1853 }
1854 }
1855
1856 void InterpreterMacroAssembler::profile_parameters_type(Register mdp, Register tmp1, Register tmp2) {
1857 if (ProfileInterpreter && MethodData::profile_parameters()) {
1858 Label profile_continue, done;
1859
1860 test_method_data_pointer(mdp, profile_continue);
1861
1862 // Load the offset of the area within the MDO used for
1863 // parameters. If it's negative we're not profiling any parameters.
1864 Address parm_di_addr(mdp, in_bytes(MethodData::parameters_type_data_di_offset()) - in_bytes(MethodData::data_offset()));
1865 load_and_test_int2long(tmp1, parm_di_addr);
1866 z_brl(profile_continue);
1867
1868 // Compute a pointer to the area for parameters from the offset
1869 // and move the pointer to the slot for the last
|