src/cpu/x86/vm/interp_masm_x86_32.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
hotspot Cdiff src/cpu/x86/vm/interp_masm_x86_32.cpp
src/cpu/x86/vm/interp_masm_x86_32.cpp
Print this page
rev 5462 : 8026251: New type profiling points: parameters to methods
Summary: x86 interpreter and c1 type profiling for parameters on method entries
Reviewed-by:
*** 1197,1206 ****
--- 1197,1252 ----
bind(profile_continue);
}
}
+ void InterpreterMacroAssembler::profile_parameters_type(Register mdp, Register tmp1, Register tmp2) {
+ if (ProfileInterpreter && MethodData::profile_parameters()) {
+ Label profile_continue, done;
+
+ test_method_data_pointer(mdp, profile_continue);
+
+ // Load the offset of the area within the MDO used for
+ // parameters. If it's negative we're not profiling any parameters
+ movl(tmp1, Address(mdp, in_bytes(MethodData::parameters_type_data_di_offset()) - in_bytes(MethodData::data_offset())));
+ testl(tmp1, tmp1);
+ jcc(Assembler::negative, profile_continue);
+
+ // Compute a pointer to the area for parameters from the offset
+ // and move the pointer to the slot for the last
+ // parameters. Collect profiling from last parameter down.
+ // mdo start + parameters offset + array length - 1
+ addptr(mdp, tmp1);
+ movl(tmp1, Address(mdp, in_bytes(ArrayData::array_len_offset())));
+ decrement(tmp1, TypeStackSlotEntries::per_arg_count());
+
+ Label loop;
+ bind(loop);
+
+ int off_base = in_bytes(ParametersTypeData::stack_slot_offset(0));
+ int type_base = in_bytes(ParametersTypeData::type_offset(0));
+ Address::ScaleFactor per_arg_scale = Address::times(DataLayout::cell_size);
+ Address arg_off(mdp, tmp1, per_arg_scale, off_base);
+ Address arg_type(mdp, tmp1, per_arg_scale, type_base);
+
+ // load offset on the stack from the slot for this parameter
+ movl(tmp2, arg_off);
+ negl(tmp2);
+ // read the parameter from the local area
+ movptr(tmp2, Address(rdi, tmp2, Interpreter::stackElementScale()));
+
+ // profile the parameter
+ profile_obj_type(tmp2, arg_type);
+
+ // go to next parameter
+ decrement(tmp1, TypeStackSlotEntries::per_arg_count());
+ jcc(Assembler::positive, loop);
+
+ bind(profile_continue);
+ }
+ }
+
void InterpreterMacroAssembler::profile_call(Register mdp) {
if (ProfileInterpreter) {
Label profile_continue;
// If no method data exists, go to profile_continue.
src/cpu/x86/vm/interp_masm_x86_32.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File