annotate src/cpu/x86/vm/compiledIC_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 5c71dcf0915d
children 52b4284cb496
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10168
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
1 /*
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
4 *
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
7 * published by the Free Software Foundation.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
8 *
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
13 * accompanied this code).
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
14 *
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
18 *
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
21 * questions.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
22 *
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
23 */
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
24
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
25 #include "precompiled.hpp"
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
26 #include "asm/macroAssembler.inline.hpp"
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
27 #include "code/compiledIC.hpp"
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
28 #include "code/icBuffer.hpp"
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
29 #include "code/nmethod.hpp"
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
30 #include "memory/resourceArea.hpp"
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
31 #include "runtime/mutexLocker.hpp"
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
32 #include "runtime/safepoint.hpp"
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
33
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
34 // Release the CompiledICHolder* associated with this call site is there is one.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
35 void CompiledIC::cleanup_call_site(virtual_call_Relocation* call_site) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
36 // This call site might have become stale so inspect it carefully.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
37 NativeCall* call = nativeCall_at(call_site->addr());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
38 if (is_icholder_entry(call->destination())) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
39 NativeMovConstReg* value = nativeMovConstReg_at(call_site->cached_value());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
40 InlineCacheBuffer::queue_for_release((CompiledICHolder*)value->data());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
41 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
42 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
43
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
44 bool CompiledIC::is_icholder_call_site(virtual_call_Relocation* call_site) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
45 // This call site might have become stale so inspect it carefully.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
46 NativeCall* call = nativeCall_at(call_site->addr());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
47 return is_icholder_entry(call->destination());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
48 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
49
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
50 //-----------------------------------------------------------------------------
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
51 // High-level access to an inline cache. Guaranteed to be MT-safe.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
52
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
53 CompiledIC::CompiledIC(nmethod* nm, NativeCall* call)
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
54 : _ic_call(call)
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
55 {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
56 address ic_call = call->instruction_address();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
57
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
58 assert(ic_call != NULL, "ic_call address must be set");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
59 assert(nm != NULL, "must pass nmethod");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
60 assert(nm->contains(ic_call), "must be in nmethod");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
61
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
62 // Search for the ic_call at the given address.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
63 RelocIterator iter(nm, ic_call, ic_call+1);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
64 bool ret = iter.next();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
65 assert(ret == true, "relocInfo must exist at this address");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
66 assert(iter.addr() == ic_call, "must find ic_call");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
67 if (iter.type() == relocInfo::virtual_call_type) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
68 virtual_call_Relocation* r = iter.virtual_call_reloc();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
69 _is_optimized = false;
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
70 _value = nativeMovConstReg_at(r->cached_value());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
71 } else {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
72 assert(iter.type() == relocInfo::opt_virtual_call_type, "must be a virtual call");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
73 _is_optimized = true;
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
74 _value = NULL;
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
75 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
76 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
77
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
78 // ----------------------------------------------------------------------------
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
79
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
80 #define __ _masm.
15046
5c71dcf0915d use hotspot static stubs for call sites
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 12356
diff changeset
81 void CompiledStaticCall::emit_to_interp_stub(CodeBuffer &cbuf, address mark) {
10168
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
82 // Stub is fixed up when the corresponding call is converted from
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
83 // calling compiled code to calling interpreted code.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
84 // movq rbx, 0
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
85 // jmp -5 # to self
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
86
15046
5c71dcf0915d use hotspot static stubs for call sites
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 12356
diff changeset
87 if (mark == NULL) {
5c71dcf0915d use hotspot static stubs for call sites
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 12356
diff changeset
88 mark = cbuf.insts_mark(); // Get mark within main instrs section.
5c71dcf0915d use hotspot static stubs for call sites
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 12356
diff changeset
89 }
10168
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
90
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
91 // Note that the code buffer's insts_mark is always relative to insts.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
92 // That's why we must use the macroassembler to generate a stub.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
93 MacroAssembler _masm(&cbuf);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
94
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
95 address base =
15046
5c71dcf0915d use hotspot static stubs for call sites
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 12356
diff changeset
96 __ start_a_stub(to_interp_stub_size());
5c71dcf0915d use hotspot static stubs for call sites
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 12356
diff changeset
97 guarantee(base != NULL, "out of space");
5c71dcf0915d use hotspot static stubs for call sites
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 12356
diff changeset
98
10168
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
99 // Static stub relocation stores the instruction address of the call.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
100 __ relocate(static_stub_Relocation::spec(mark), Assembler::imm_operand);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
101 // Static stub relocation also tags the Method* in the code-stream.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
102 __ mov_metadata(rbx, (Metadata*) NULL); // Method is zapped till fixup time.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
103 // This is recognized as unresolved by relocs/nativeinst/ic code.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
104 __ jump(RuntimeAddress(__ pc()));
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
105
15046
5c71dcf0915d use hotspot static stubs for call sites
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 12356
diff changeset
106 assert(__ pc() - base <= to_interp_stub_size(), "wrong stub size");
5c71dcf0915d use hotspot static stubs for call sites
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 12356
diff changeset
107
10168
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
108 // Update current stubs pointer and restore insts_end.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
109 __ end_a_stub();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
110 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
111 #undef __
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
112
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
113 int CompiledStaticCall::to_interp_stub_size() {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
114 return NOT_LP64(10) // movl; jmp
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
115 LP64_ONLY(15); // movq (1+1+8); jmp (1+4)
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
116 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
117
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
118 // Relocation entries for call stub, compiled java to interpreter.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
119 int CompiledStaticCall::reloc_to_interp_stub() {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
120 return 4; // 3 in emit_to_interp_stub + 1 in emit_call
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
121 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
122
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
123 void CompiledStaticCall::set_to_interpreted(methodHandle callee, address entry) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
124 address stub = find_stub();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
125 guarantee(stub != NULL, "stub not found");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
126
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
127 if (TraceICs) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
128 ResourceMark rm;
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
129 tty->print_cr("CompiledStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s",
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
130 instruction_address(),
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
131 callee->name_and_sig_as_C_string());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
132 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
133
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
134 // Creation also verifies the object.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
135 NativeMovConstReg* method_holder = nativeMovConstReg_at(stub);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
136 NativeJump* jump = nativeJump_at(method_holder->next_instruction_address());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
137
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
138 assert(method_holder->data() == 0 || method_holder->data() == (intptr_t)callee(),
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
139 "a) MT-unsafe modification of inline cache");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
140 assert(jump->jump_destination() == (address)-1 || jump->jump_destination() == entry,
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
141 "b) MT-unsafe modification of inline cache");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
142
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
143 // Update stub.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
144 method_holder->set_data((intptr_t)callee());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
145 jump->set_jump_destination(entry);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
146
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
147 // Update jump to call.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
148 set_destination_mt_safe(stub);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
149 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
150
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
151 void CompiledStaticCall::set_stub_to_clean(static_stub_Relocation* static_stub) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
152 assert (CompiledIC_lock->is_locked() || SafepointSynchronize::is_at_safepoint(), "mt unsafe call");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
153 // Reset stub.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
154 address stub = static_stub->addr();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
155 assert(stub != NULL, "stub not found");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
156 // Creation also verifies the object.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
157 NativeMovConstReg* method_holder = nativeMovConstReg_at(stub);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
158 NativeJump* jump = nativeJump_at(method_holder->next_instruction_address());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
159 method_holder->set_data(0);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
160 jump->set_jump_destination((address)-1);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
161 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
162
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
163 //-----------------------------------------------------------------------------
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
164 // Non-product mode code
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
165 #ifndef PRODUCT
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
166
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
167 void CompiledStaticCall::verify() {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
168 // Verify call.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
169 NativeCall::verify();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
170 if (os::is_MP()) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
171 verify_alignment();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
172 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
173
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
174 // Verify stub.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
175 address stub = find_stub();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
176 assert(stub != NULL, "no stub found for static call");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
177 // Creation also verifies the object.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
178 NativeMovConstReg* method_holder = nativeMovConstReg_at(stub);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
179 NativeJump* jump = nativeJump_at(method_holder->next_instruction_address());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
180
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
181 // Verify state.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
182 assert(is_clean() || is_call_to_compiled() || is_call_to_interpreted(), "sanity check");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
183 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
184
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
185 #endif // !PRODUCT