annotate src/cpu/x86/vm/interp_masm_x86.cpp @ 15388:769fc3629f59

Add phase FlowSensitiveReductionPhase. It is possible to remove GuardingPiNodes, CheckCastNodes, and FixedGuards during HighTier under certain conditions (control-flow sensitive conditions). The phase added in this commit (FlowSensitiveReductionPhase) does that, and in addition replaces usages with "downcasting" PiNodes when possible thus resulting in more precise object stamps (e.g., non-null). Finally, usages of floating, side-effects free, expressions are also simplified (as per control-flow sensitive conditions). The newly added phase runs only during HighTier and can be deactivated using Graal option FlowSensitiveReduction (it is active by default).
author Miguel Garcia <miguel.m.garcia@oracle.com>
date Fri, 25 Apr 2014 16:50:52 +0200
parents 4ca6dc0799b6
children 52b4284cb496
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12962
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
1 /*
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
4 *
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
7 * published by the Free Software Foundation.
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
8 *
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
13 * accompanied this code).
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
14 *
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
18 *
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
21 * questions.
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
22 *
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
23 */
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
24
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
25 #include "precompiled.hpp"
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
26 #include "interp_masm_x86.hpp"
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
27 #include "interpreter/interpreter.hpp"
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
28 #include "oops/methodData.hpp"
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
29
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
30 #ifndef CC_INTERP
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
31 void InterpreterMacroAssembler::profile_obj_type(Register obj, const Address& mdo_addr) {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
32 Label update, next, none;
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
33
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
34 verify_oop(obj);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
35
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
36 testptr(obj, obj);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
37 jccb(Assembler::notZero, update);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
38 orptr(mdo_addr, TypeEntries::null_seen);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
39 jmpb(next);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
40
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
41 bind(update);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
42 load_klass(obj, obj);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
43
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
44 xorptr(obj, mdo_addr);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
45 testptr(obj, TypeEntries::type_klass_mask);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
46 jccb(Assembler::zero, next); // klass seen before, nothing to
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
47 // do. The unknown bit may have been
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
48 // set already but no need to check.
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
49
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
50 testptr(obj, TypeEntries::type_unknown);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
51 jccb(Assembler::notZero, next); // already unknown. Nothing to do anymore.
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
52
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
53 cmpptr(mdo_addr, 0);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
54 jccb(Assembler::equal, none);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
55 cmpptr(mdo_addr, TypeEntries::null_seen);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
56 jccb(Assembler::equal, none);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
57 // There is a chance that the checks above (re-reading profiling
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
58 // data from memory) fail if another thread has just set the
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
59 // profiling to this obj's klass
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
60 xorptr(obj, mdo_addr);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
61 testptr(obj, TypeEntries::type_klass_mask);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
62 jccb(Assembler::zero, next);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
63
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
64 // different than before. Cannot keep accurate profile.
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
65 orptr(mdo_addr, TypeEntries::type_unknown);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
66 jmpb(next);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
67
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
68 bind(none);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
69 // first time here. Set profile type.
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
70 movptr(mdo_addr, obj);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
71
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
72 bind(next);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
73 }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
74
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
75 void InterpreterMacroAssembler::profile_arguments_type(Register mdp, Register callee, Register tmp, bool is_virtual) {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
76 if (!ProfileInterpreter) {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
77 return;
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
78 }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
79
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
80 if (MethodData::profile_arguments() || MethodData::profile_return()) {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
81 Label profile_continue;
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
82
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
83 test_method_data_pointer(mdp, profile_continue);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
84
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
85 int off_to_start = is_virtual ? in_bytes(VirtualCallData::virtual_call_data_size()) : in_bytes(CounterData::counter_data_size());
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
86
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
87 cmpb(Address(mdp, in_bytes(DataLayout::tag_offset()) - off_to_start), is_virtual ? DataLayout::virtual_call_type_data_tag : DataLayout::call_type_data_tag);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
88 jcc(Assembler::notEqual, profile_continue);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
89
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
90 if (MethodData::profile_arguments()) {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
91 Label done;
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
92 int off_to_args = in_bytes(TypeEntriesAtCall::args_data_offset());
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
93 addptr(mdp, off_to_args);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
94
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
95 for (int i = 0; i < TypeProfileArgsLimit; i++) {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
96 if (i > 0 || MethodData::profile_return()) {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
97 // If return value type is profiled we may have no argument to profile
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
98 movptr(tmp, Address(mdp, in_bytes(TypeEntriesAtCall::cell_count_offset())-off_to_args));
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
99 subl(tmp, i*TypeStackSlotEntries::per_arg_count());
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
100 cmpl(tmp, TypeStackSlotEntries::per_arg_count());
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
101 jcc(Assembler::less, done);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
102 }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
103 movptr(tmp, Address(callee, Method::const_offset()));
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
104 load_unsigned_short(tmp, Address(tmp, ConstMethod::size_of_parameters_offset()));
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
105 // stack offset o (zero based) from the start of the argument
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
106 // list, for n arguments translates into offset n - o - 1 from
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
107 // the end of the argument list
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
108 subptr(tmp, Address(mdp, in_bytes(TypeEntriesAtCall::stack_slot_offset(i))-off_to_args));
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
109 subl(tmp, 1);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
110 Address arg_addr = argument_address(tmp);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
111 movptr(tmp, arg_addr);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
112
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
113 Address mdo_arg_addr(mdp, in_bytes(TypeEntriesAtCall::argument_type_offset(i))-off_to_args);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
114 profile_obj_type(tmp, mdo_arg_addr);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
115
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
116 int to_add = in_bytes(TypeStackSlotEntries::per_arg_size());
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
117 addptr(mdp, to_add);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
118 off_to_args += to_add;
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
119 }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
120
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
121 if (MethodData::profile_return()) {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
122 movptr(tmp, Address(mdp, in_bytes(TypeEntriesAtCall::cell_count_offset())-off_to_args));
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
123 subl(tmp, TypeProfileArgsLimit*TypeStackSlotEntries::per_arg_count());
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
124 }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
125
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
126 bind(done);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
127
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
128 if (MethodData::profile_return()) {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
129 // We're right after the type profile for the last
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14260
diff changeset
130 // argument. tmp is the number of cell left in the
12962
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
131 // CallTypeData/VirtualCallTypeData to reach its end. Non null
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
132 // if there's a return to profile.
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
133 assert(ReturnTypeEntry::static_cell_count() < TypeStackSlotEntries::per_arg_count(), "can't move past ret type");
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
134 shll(tmp, exact_log2(DataLayout::cell_size));
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
135 addptr(mdp, tmp);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
136 }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
137 movptr(Address(rbp, frame::interpreter_frame_mdx_offset * wordSize), mdp);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
138 } else {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
139 assert(MethodData::profile_return(), "either profile call args or call ret");
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
140 update_mdp_by_constant(mdp, in_bytes(ReturnTypeEntry::size()));
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
141 }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
142
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
143 // mdp points right after the end of the
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
144 // CallTypeData/VirtualCallTypeData, right after the cells for the
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
145 // return value type if there's one
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
146
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
147 bind(profile_continue);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
148 }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
149 }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
150
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
151 void InterpreterMacroAssembler::profile_return_type(Register mdp, Register ret, Register tmp) {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
152 assert_different_registers(mdp, ret, tmp, _bcp_register);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
153 if (ProfileInterpreter && MethodData::profile_return()) {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
154 Label profile_continue, done;
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
155
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
156 test_method_data_pointer(mdp, profile_continue);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
157
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
158 if (MethodData::profile_return_jsr292_only()) {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
159 // If we don't profile all invoke bytecodes we must make sure
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
160 // it's a bytecode we indeed profile. We can't go back to the
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
161 // begining of the ProfileData we intend to update to check its
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
162 // type because we're right after it and we don't known its
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
163 // length
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
164 Label do_profile;
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
165 cmpb(Address(_bcp_register, 0), Bytecodes::_invokedynamic);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
166 jcc(Assembler::equal, do_profile);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
167 cmpb(Address(_bcp_register, 0), Bytecodes::_invokehandle);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
168 jcc(Assembler::equal, do_profile);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
169 get_method(tmp);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
170 cmpb(Address(tmp, Method::intrinsic_id_offset_in_bytes()), vmIntrinsics::_compiledLambdaForm);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
171 jcc(Assembler::notEqual, profile_continue);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
172
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
173 bind(do_profile);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
174 }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
175
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
176 Address mdo_ret_addr(mdp, -in_bytes(ReturnTypeEntry::size()));
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
177 mov(tmp, ret);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
178 profile_obj_type(tmp, mdo_ret_addr);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
179
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
180 bind(profile_continue);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
181 }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
182 }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
183
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
184 void InterpreterMacroAssembler::profile_parameters_type(Register mdp, Register tmp1, Register tmp2) {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
185 if (ProfileInterpreter && MethodData::profile_parameters()) {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
186 Label profile_continue, done;
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
187
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
188 test_method_data_pointer(mdp, profile_continue);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
189
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
190 // Load the offset of the area within the MDO used for
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
191 // parameters. If it's negative we're not profiling any parameters
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
192 movl(tmp1, Address(mdp, in_bytes(MethodData::parameters_type_data_di_offset()) - in_bytes(MethodData::data_offset())));
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
193 testl(tmp1, tmp1);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
194 jcc(Assembler::negative, profile_continue);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
195
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
196 // Compute a pointer to the area for parameters from the offset
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
197 // and move the pointer to the slot for the last
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
198 // parameters. Collect profiling from last parameter down.
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
199 // mdo start + parameters offset + array length - 1
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
200 addptr(mdp, tmp1);
14909
4ca6dc0799b6 Backout jdk9 merge
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14260
diff changeset
201 movptr(tmp1, Address(mdp, in_bytes(ArrayData::array_len_offset())));
12962
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
202 decrement(tmp1, TypeStackSlotEntries::per_arg_count());
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
203
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
204 Label loop;
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
205 bind(loop);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
206
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
207 int off_base = in_bytes(ParametersTypeData::stack_slot_offset(0));
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
208 int type_base = in_bytes(ParametersTypeData::type_offset(0));
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
209 Address::ScaleFactor per_arg_scale = Address::times(DataLayout::cell_size);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
210 Address arg_off(mdp, tmp1, per_arg_scale, off_base);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
211 Address arg_type(mdp, tmp1, per_arg_scale, type_base);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
212
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
213 // load offset on the stack from the slot for this parameter
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
214 movptr(tmp2, arg_off);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
215 negptr(tmp2);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
216 // read the parameter from the local area
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
217 movptr(tmp2, Address(_locals_register, tmp2, Interpreter::stackElementScale()));
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
218
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
219 // profile the parameter
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
220 profile_obj_type(tmp2, arg_type);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
221
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
222 // go to next parameter
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
223 decrement(tmp1, TypeStackSlotEntries::per_arg_count());
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
224 jcc(Assembler::positive, loop);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
225
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
226 bind(profile_continue);
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
227 }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
228 }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents:
diff changeset
229 #endif