117 addptr(mdp, to_add);
118 off_to_args += to_add;
119 }
120
121 if (MethodData::profile_return()) {
122 movptr(tmp, Address(mdp, in_bytes(TypeEntriesAtCall::cell_count_offset())-off_to_args));
123 subl(tmp, TypeProfileArgsLimit*TypeStackSlotEntries::per_arg_count());
124 }
125
126 bind(done);
127
128 if (MethodData::profile_return()) {
129 // We're right after the type profile for the last
130 // argument. tmp is the number of cells left in the
131 // CallTypeData/VirtualCallTypeData to reach its end. Non null
132 // if there's a return to profile.
133 assert(ReturnTypeEntry::static_cell_count() < TypeStackSlotEntries::per_arg_count(), "can't move past ret type");
134 shll(tmp, exact_log2(DataLayout::cell_size));
135 addptr(mdp, tmp);
136 }
137 movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), mdp);
138 } else {
139 assert(MethodData::profile_return(), "either profile call args or call ret");
140 update_mdp_by_constant(mdp, in_bytes(TypeEntriesAtCall::return_only_size()));
141 }
142
143 // mdp points right after the end of the
144 // CallTypeData/VirtualCallTypeData, right after the cells for the
145 // return value type if there's one
146
147 bind(profile_continue);
148 }
149 }
150
151 void InterpreterMacroAssembler::profile_return_type(Register mdp, Register ret, Register tmp) {
152 assert_different_registers(mdp, ret, tmp, _bcp_register);
153 if (ProfileInterpreter && MethodData::profile_return()) {
154 Label profile_continue, done;
155
156 test_method_data_pointer(mdp, profile_continue);
157
|
117 addptr(mdp, to_add);
118 off_to_args += to_add;
119 }
120
121 if (MethodData::profile_return()) {
122 movptr(tmp, Address(mdp, in_bytes(TypeEntriesAtCall::cell_count_offset())-off_to_args));
123 subl(tmp, TypeProfileArgsLimit*TypeStackSlotEntries::per_arg_count());
124 }
125
126 bind(done);
127
128 if (MethodData::profile_return()) {
129 // We're right after the type profile for the last
130 // argument. tmp is the number of cells left in the
131 // CallTypeData/VirtualCallTypeData to reach its end. Non null
132 // if there's a return to profile.
133 assert(ReturnTypeEntry::static_cell_count() < TypeStackSlotEntries::per_arg_count(), "can't move past ret type");
134 shll(tmp, exact_log2(DataLayout::cell_size));
135 addptr(mdp, tmp);
136 }
137 movptr(Address(rbp, frame::interpreter_frame_mdp_offset * wordSize), mdp);
138 } else {
139 assert(MethodData::profile_return(), "either profile call args or call ret");
140 update_mdp_by_constant(mdp, in_bytes(TypeEntriesAtCall::return_only_size()));
141 }
142
143 // mdp points right after the end of the
144 // CallTypeData/VirtualCallTypeData, right after the cells for the
145 // return value type if there's one
146
147 bind(profile_continue);
148 }
149 }
150
151 void InterpreterMacroAssembler::profile_return_type(Register mdp, Register ret, Register tmp) {
152 assert_different_registers(mdp, ret, tmp, _bcp_register);
153 if (ProfileInterpreter && MethodData::profile_return()) {
154 Label profile_continue, done;
155
156 test_method_data_pointer(mdp, profile_continue);
157
|