annotate src/share/vm/interpreter/interpreter.cpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents 78bbf4d43a14
children 52b4284cb496
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 13010
diff changeset
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1135
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1135
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1135
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
25 #include "precompiled.hpp"
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 6926
diff changeset
26 #include "asm/macroAssembler.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 6926
diff changeset
27 #include "asm/macroAssembler.inline.hpp"
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 6926
diff changeset
28 #include "compiler/disassembler.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
29 #include "interpreter/bytecodeHistogram.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
30 #include "interpreter/bytecodeInterpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
31 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
32 #include "interpreter/interpreterRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
33 #include "interpreter/templateTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
34 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
35 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
36 #include "oops/arrayOop.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
37 #include "oops/methodData.hpp"
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
38 #include "oops/method.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
39 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
40 #include "prims/forte.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
41 #include "prims/jvmtiExport.hpp"
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
42 #include "prims/methodHandles.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
43 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
44 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
45 #include "runtime/stubRoutines.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
46 #include "runtime/timer.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
47
a61af66fc99e Initial load
duke
parents:
diff changeset
48 # define __ _masm->
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // Implementation of InterpreterCodelet
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 void InterpreterCodelet::initialize(const char* description, Bytecodes::Code bytecode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
55 _description = description;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 _bytecode = bytecode;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 }
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 void InterpreterCodelet::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
61 }
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
64 void InterpreterCodelet::print_on(outputStream* st) const {
6796
b31471cdc53e 7200163: add CodeComments functionality to assember stubs
kvn
parents: 6725
diff changeset
65 ttyLocker ttyl;
b31471cdc53e 7200163: add CodeComments functionality to assember stubs
kvn
parents: 6725
diff changeset
66
0
a61af66fc99e Initial load
duke
parents:
diff changeset
67 if (PrintInterpreter) {
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
68 st->cr();
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
69 st->print_cr("----------------------------------------------------------------------");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
70 }
a61af66fc99e Initial load
duke
parents:
diff changeset
71
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
72 if (description() != NULL) st->print("%s ", description());
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
73 if (bytecode() >= 0 ) st->print("%d %s ", bytecode(), Bytecodes::name(bytecode()));
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
74 st->print_cr("[" INTPTR_FORMAT ", " INTPTR_FORMAT "] %d bytes",
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 13010
diff changeset
75 p2i(code_begin()), p2i(code_end()), code_size());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 if (PrintInterpreter) {
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
78 st->cr();
8767
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 7199
diff changeset
79 Disassembler::decode(code_begin(), code_end(), st, DEBUG_ONLY(_strings) NOT_DEBUG(CodeStrings()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
80 }
a61af66fc99e Initial load
duke
parents:
diff changeset
81 }
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // Implementation of platform independent aspects of Interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 void AbstractInterpreter::initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
88 if (_code != NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // make sure 'imported' classes are initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
91 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) BytecodeCounter::reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
92 if (PrintBytecodeHistogram) BytecodeHistogram::reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
93 if (PrintBytecodePairHistogram) BytecodePairHistogram::reset();
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 InvocationCounter::reinitialize(DelayCompilationDuringStartup);
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 }
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 void AbstractInterpreter::print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
100 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
101 tty->print_cr("----------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
102 tty->print_cr("Interpreter");
a61af66fc99e Initial load
duke
parents:
diff changeset
103 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
104 tty->print_cr("code size = %6dK bytes", (int)_code->used_space()/1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
105 tty->print_cr("total space = %6dK bytes", (int)_code->total_space()/1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
106 tty->print_cr("wasted space = %6dK bytes", (int)_code->available_space()/1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
107 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
108 tty->print_cr("# of codelets = %6d" , _code->number_of_stubs());
a61af66fc99e Initial load
duke
parents:
diff changeset
109 tty->print_cr("avg codelet size = %6d bytes", _code->used_space() / _code->number_of_stubs());
a61af66fc99e Initial load
duke
parents:
diff changeset
110 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
111 _code->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
112 tty->print_cr("----------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
113 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 void interpreter_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
118 Interpreter::initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
119 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
120 if (TraceBytecodes) BytecodeTracer::set_closure(BytecodeTracer::std_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
121 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // need to hit every safepoint in order to call zapping routine
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // register the interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
124 Forte::register_stub(
a61af66fc99e Initial load
duke
parents:
diff changeset
125 "Interpreter",
a61af66fc99e Initial load
duke
parents:
diff changeset
126 AbstractInterpreter::code()->code_start(),
a61af66fc99e Initial load
duke
parents:
diff changeset
127 AbstractInterpreter::code()->code_end()
a61af66fc99e Initial load
duke
parents:
diff changeset
128 );
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // notify JVMTI profiler
a61af66fc99e Initial load
duke
parents:
diff changeset
131 if (JvmtiExport::should_post_dynamic_code_generated()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
132 JvmtiExport::post_dynamic_code_generated("Interpreter",
a61af66fc99e Initial load
duke
parents:
diff changeset
133 AbstractInterpreter::code()->code_start(),
a61af66fc99e Initial load
duke
parents:
diff changeset
134 AbstractInterpreter::code()->code_end());
a61af66fc99e Initial load
duke
parents:
diff changeset
135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Implementation of interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 StubQueue* AbstractInterpreter::_code = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
142 bool AbstractInterpreter::_notice_safepoints = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 address AbstractInterpreter::_rethrow_exception_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 address AbstractInterpreter::_native_entry_begin = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 address AbstractInterpreter::_native_entry_end = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
147 address AbstractInterpreter::_slow_signature_handler;
a61af66fc99e Initial load
duke
parents:
diff changeset
148 address AbstractInterpreter::_entry_table [AbstractInterpreter::number_of_method_entries];
a61af66fc99e Initial load
duke
parents:
diff changeset
149 address AbstractInterpreter::_native_abi_to_tosca [AbstractInterpreter::number_of_result_handlers];
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // Generation of complete interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 AbstractInterpreterGenerator::AbstractInterpreterGenerator(StubQueue* _code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
155 _masm = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159 static const BasicType types[Interpreter::number_of_result_handlers] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
160 T_BOOLEAN,
a61af66fc99e Initial load
duke
parents:
diff changeset
161 T_CHAR ,
a61af66fc99e Initial load
duke
parents:
diff changeset
162 T_BYTE ,
a61af66fc99e Initial load
duke
parents:
diff changeset
163 T_SHORT ,
a61af66fc99e Initial load
duke
parents:
diff changeset
164 T_INT ,
a61af66fc99e Initial load
duke
parents:
diff changeset
165 T_LONG ,
a61af66fc99e Initial load
duke
parents:
diff changeset
166 T_VOID ,
a61af66fc99e Initial load
duke
parents:
diff changeset
167 T_FLOAT ,
a61af66fc99e Initial load
duke
parents:
diff changeset
168 T_DOUBLE ,
a61af66fc99e Initial load
duke
parents:
diff changeset
169 T_OBJECT
a61af66fc99e Initial load
duke
parents:
diff changeset
170 };
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 void AbstractInterpreterGenerator::generate_all() {
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 { CodeletMark cm(_masm, "slow signature handler");
a61af66fc99e Initial load
duke
parents:
diff changeset
176 Interpreter::_slow_signature_handler = generate_slow_signature_handler();
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // Entry points
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // Abstract method?
a61af66fc99e Initial load
duke
parents:
diff changeset
186 if (m->is_abstract()) return abstract;
a61af66fc99e Initial load
duke
parents:
diff changeset
187
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
188 // Method handle primitive?
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
189 if (m->is_method_handle_intrinsic()) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
190 vmIntrinsics::ID id = m->intrinsic_id();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
191 assert(MethodHandles::is_signature_polymorphic(id), "must match an intrinsic");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
192 MethodKind kind = (MethodKind)( method_handle_invoke_FIRST +
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
193 ((int)id - vmIntrinsics::FIRST_MH_SIG_POLY) );
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
194 assert(kind <= method_handle_invoke_LAST, "parallel enum ranges");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
195 return kind;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
196 }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 0
diff changeset
197
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8767
diff changeset
198 #ifndef CC_INTERP
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8767
diff changeset
199 if (UseCRC32Intrinsics && m->is_native()) {
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8767
diff changeset
200 // Use optimized stub code for CRC32 native methods.
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8767
diff changeset
201 switch (m->intrinsic_id()) {
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8767
diff changeset
202 case vmIntrinsics::_updateCRC32 : return java_util_zip_CRC32_update;
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8767
diff changeset
203 case vmIntrinsics::_updateBytesCRC32 : return java_util_zip_CRC32_updateBytes;
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8767
diff changeset
204 case vmIntrinsics::_updateByteBufferCRC32 : return java_util_zip_CRC32_updateByteBuffer;
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8767
diff changeset
205 }
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8767
diff changeset
206 }
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8767
diff changeset
207 #endif
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8767
diff changeset
208
0
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // Native method?
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // Note: This test must come _before_ the test for intrinsic
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // methods. See also comments below.
a61af66fc99e Initial load
duke
parents:
diff changeset
212 if (m->is_native()) {
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
213 assert(!m->is_method_handle_intrinsic(), "overlapping bits here, watch out");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
214 return m->is_synchronized() ? native_synchronized : native;
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // Synchronized?
a61af66fc99e Initial load
duke
parents:
diff changeset
218 if (m->is_synchronized()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
219 return zerolocals_synchronized;
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 if (RegisterFinalizersAtInit && m->code_size() == 1 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
223 m->intrinsic_id() == vmIntrinsics::_Object_init) {
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // We need to execute the special return bytecode to check for
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // finalizer registration so create a normal frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
226 return zerolocals;
a61af66fc99e Initial load
duke
parents:
diff changeset
227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // Empty method?
a61af66fc99e Initial load
duke
parents:
diff changeset
230 if (m->is_empty_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
231 return empty;
a61af66fc99e Initial load
duke
parents:
diff changeset
232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // Special intrinsic method?
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // Note: This test must come _after_ the test for native methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // otherwise we will run into problems with JDK 1.2, see also
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // AbstractInterpreterGenerator::generate_method_entry() for
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // for details.
a61af66fc99e Initial load
duke
parents:
diff changeset
239 switch (m->intrinsic_id()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
240 case vmIntrinsics::_dsin : return java_lang_math_sin ;
a61af66fc99e Initial load
duke
parents:
diff changeset
241 case vmIntrinsics::_dcos : return java_lang_math_cos ;
a61af66fc99e Initial load
duke
parents:
diff changeset
242 case vmIntrinsics::_dtan : return java_lang_math_tan ;
a61af66fc99e Initial load
duke
parents:
diff changeset
243 case vmIntrinsics::_dabs : return java_lang_math_abs ;
a61af66fc99e Initial load
duke
parents:
diff changeset
244 case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ;
a61af66fc99e Initial load
duke
parents:
diff changeset
245 case vmIntrinsics::_dlog : return java_lang_math_log ;
a61af66fc99e Initial load
duke
parents:
diff changeset
246 case vmIntrinsics::_dlog10: return java_lang_math_log10;
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 3249
diff changeset
247 case vmIntrinsics::_dpow : return java_lang_math_pow ;
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 3249
diff changeset
248 case vmIntrinsics::_dexp : return java_lang_math_exp ;
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
250 case vmIntrinsics::_Reference_get:
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
251 return java_lang_ref_reference_get;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
252 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
253
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
254 // Accessor method?
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
255 if (m->is_accessor()) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
256 assert(m->size_of_parameters() == 1, "fast code for accessors assumes parameter size = 1");
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2177
diff changeset
257 return accessor;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // Note: for now: zero locals for all non-empty methods
a61af66fc99e Initial load
duke
parents:
diff changeset
261 return zerolocals;
a61af66fc99e Initial load
duke
parents:
diff changeset
262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
265 void AbstractInterpreter::set_entry_for_kind(AbstractInterpreter::MethodKind kind, address entry) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
266 assert(kind >= method_handle_invoke_FIRST &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
267 kind <= method_handle_invoke_LAST, "late initialization only for MH entry points");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
268 assert(_entry_table[kind] == _entry_table[abstract], "previous value must be AME entry");
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
269 _entry_table[kind] = entry;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
270 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
271
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
272
0
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // Return true if the interpreter can prove that the given bytecode has
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // not yet been executed (in Java semantics, not in actual operation).
a61af66fc99e Initial load
duke
parents:
diff changeset
275 bool AbstractInterpreter::is_not_reached(methodHandle method, int bci) {
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
276 Bytecodes::Code code = method()->code_at(bci);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
277
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
278 if (!Bytecodes::must_rewrite(code)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // might have been reached
a61af66fc99e Initial load
duke
parents:
diff changeset
280 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // the bytecode might not be rewritten if the method is an accessor, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
284 address ientry = method->interpreter_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
285 if (ientry != entry_for_kind(AbstractInterpreter::zerolocals) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
286 ientry != entry_for_kind(AbstractInterpreter::zerolocals_synchronized))
a61af66fc99e Initial load
duke
parents:
diff changeset
287 return false; // interpreter does not run this method!
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // otherwise, we can be sure this bytecode has never been executed
a61af66fc99e Initial load
duke
parents:
diff changeset
290 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
295 void AbstractInterpreter::print_method_kind(MethodKind kind) {
a61af66fc99e Initial load
duke
parents:
diff changeset
296 switch (kind) {
a61af66fc99e Initial load
duke
parents:
diff changeset
297 case zerolocals : tty->print("zerolocals" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
298 case zerolocals_synchronized: tty->print("zerolocals_synchronized"); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
299 case native : tty->print("native" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
300 case native_synchronized : tty->print("native_synchronized" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
301 case empty : tty->print("empty" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
302 case accessor : tty->print("accessor" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
303 case abstract : tty->print("abstract" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
304 case java_lang_math_sin : tty->print("java_lang_math_sin" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
305 case java_lang_math_cos : tty->print("java_lang_math_cos" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
306 case java_lang_math_tan : tty->print("java_lang_math_tan" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
307 case java_lang_math_abs : tty->print("java_lang_math_abs" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
308 case java_lang_math_sqrt : tty->print("java_lang_math_sqrt" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
309 case java_lang_math_log : tty->print("java_lang_math_log" ); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
310 case java_lang_math_log10 : tty->print("java_lang_math_log10" ); break;
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8767
diff changeset
311 case java_util_zip_CRC32_update : tty->print("java_util_zip_CRC32_update"); break;
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8767
diff changeset
312 case java_util_zip_CRC32_updateBytes : tty->print("java_util_zip_CRC32_updateBytes"); break;
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 8767
diff changeset
313 case java_util_zip_CRC32_updateByteBuffer : tty->print("java_util_zip_CRC32_updateByteBuffer"); break;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
314 default:
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
315 if (kind >= method_handle_invoke_FIRST &&
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
316 kind <= method_handle_invoke_LAST) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
317 const char* kind_name = vmIntrinsics::name_at(method_handle_intrinsic(kind));
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
318 if (kind_name[0] == '_') kind_name = &kind_name[1]; // '_invokeExact' => 'invokeExact'
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
319 tty->print("method_handle_%s", kind_name);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
320 break;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
321 }
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
322 ShouldNotReachHere();
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
323 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
326 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
327
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 //------------------------------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // Deoptimization support
a61af66fc99e Initial load
duke
parents:
diff changeset
331
13010
bd3237e0e18d 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 11080
diff changeset
332 /**
bd3237e0e18d 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 11080
diff changeset
333 * If a deoptimization happens, this function returns the point of next bytecode to continue execution.
bd3237e0e18d 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 11080
diff changeset
334 */
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
335 address AbstractInterpreter::deopt_continue_after_entry(Method* method, address bcp, int callee_parameters, bool is_top_frame) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
336 assert(method->contains(bcp), "just checkin'");
13010
bd3237e0e18d 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 11080
diff changeset
337
bd3237e0e18d 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 11080
diff changeset
338 // Get the original and rewritten bytecode.
bd3237e0e18d 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 11080
diff changeset
339 Bytecodes::Code code = Bytecodes::java_code_at(method, bcp);
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
340 assert(!Interpreter::bytecode_should_reexecute(code), "should not reexecute");
13010
bd3237e0e18d 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 11080
diff changeset
341
bd3237e0e18d 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 11080
diff changeset
342 const int bci = method->bci_from(bcp);
bd3237e0e18d 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 11080
diff changeset
343
0
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // compute continuation length
13010
bd3237e0e18d 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 11080
diff changeset
345 const int length = Bytecodes::length_at(method, bcp);
bd3237e0e18d 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 11080
diff changeset
346
0
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // compute result type
a61af66fc99e Initial load
duke
parents:
diff changeset
348 BasicType type = T_ILLEGAL;
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
349
0
a61af66fc99e Initial load
duke
parents:
diff changeset
350 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
351 case Bytecodes::_invokevirtual :
a61af66fc99e Initial load
duke
parents:
diff changeset
352 case Bytecodes::_invokespecial :
a61af66fc99e Initial load
duke
parents:
diff changeset
353 case Bytecodes::_invokestatic :
a61af66fc99e Initial load
duke
parents:
diff changeset
354 case Bytecodes::_invokeinterface: {
a61af66fc99e Initial load
duke
parents:
diff changeset
355 Thread *thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
356 ResourceMark rm(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
357 methodHandle mh(thread, method);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
358 type = Bytecode_invoke(mh, bci).result_type();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // since the cache entry might not be initialized:
a61af66fc99e Initial load
duke
parents:
diff changeset
360 // (NOT needed for the old calling convension)
a61af66fc99e Initial load
duke
parents:
diff changeset
361 if (!is_top_frame) {
a61af66fc99e Initial load
duke
parents:
diff changeset
362 int index = Bytes::get_native_u2(bcp+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
363 method->constants()->cache()->entry_at(index)->set_parameter_size(callee_parameters);
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
367
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
368 case Bytecodes::_invokedynamic: {
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
369 Thread *thread = Thread::current();
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
370 ResourceMark rm(thread);
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
371 methodHandle mh(thread, method);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
372 type = Bytecode_invoke(mh, bci).result_type();
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
373 // since the cache entry might not be initialized:
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
374 // (NOT needed for the old calling convension)
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
375 if (!is_top_frame) {
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
376 int index = Bytes::get_native_u4(bcp+1);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
377 method->constants()->invokedynamic_cp_cache_entry_at(index)->set_parameter_size(callee_parameters);
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
378 }
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
379 break;
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
380 }
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 900
diff changeset
381
0
a61af66fc99e Initial load
duke
parents:
diff changeset
382 case Bytecodes::_ldc :
a61af66fc99e Initial load
duke
parents:
diff changeset
383 case Bytecodes::_ldc_w : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
384 case Bytecodes::_ldc2_w:
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
385 {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
386 Thread *thread = Thread::current();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
387 ResourceMark rm(thread);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
388 methodHandle mh(thread, method);
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
389 type = Bytecode_loadconstant(mh, bci).result_type();
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
390 break;
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
391 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
392
a61af66fc99e Initial load
duke
parents:
diff changeset
393 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
394 type = Bytecodes::result_type(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
395 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
396 }
a61af66fc99e Initial load
duke
parents:
diff changeset
397
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // return entry point for computed continuation state & bytecode length
a61af66fc99e Initial load
duke
parents:
diff changeset
399 return
a61af66fc99e Initial load
duke
parents:
diff changeset
400 is_top_frame
a61af66fc99e Initial load
duke
parents:
diff changeset
401 ? Interpreter::deopt_entry (as_TosState(type), length)
13010
bd3237e0e18d 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 11080
diff changeset
402 : Interpreter::return_entry(as_TosState(type), length, code);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
404
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
405 // If deoptimization happens, this function returns the point where the interpreter reexecutes
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
406 // the bytecode.
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
407 // Note: Bytecodes::_athrow is a special case in that it does not return
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
408 // Interpreter::deopt_entry(vtos, 0) like others
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
409 address AbstractInterpreter::deopt_reexecute_entry(Method* method, address bcp) {
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
410 assert(method->contains(bcp), "just checkin'");
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
411 Bytecodes::Code code = Bytecodes::java_code_at(method, bcp);
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
412 #ifdef COMPILER1
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
413 if(code == Bytecodes::_athrow ) {
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
414 return Interpreter::rethrow_exception_entry();
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
415 }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
416 #endif /* COMPILER1 */
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
417 return Interpreter::deopt_entry(vtos, 0);
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
418 }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
419
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
420 // If deoptimization happens, the interpreter should reexecute these bytecodes.
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
421 // This function mainly helps the compilers to set up the reexecute bit.
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
422 bool AbstractInterpreter::bytecode_should_reexecute(Bytecodes::Code code) {
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
423 switch (code) {
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
424 case Bytecodes::_lookupswitch:
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
425 case Bytecodes::_tableswitch:
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
426 case Bytecodes::_fast_binaryswitch:
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
427 case Bytecodes::_fast_linearswitch:
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
428 // recompute condtional expression folded into _if<cond>
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
429 case Bytecodes::_lcmp :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
430 case Bytecodes::_fcmpl :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
431 case Bytecodes::_fcmpg :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
432 case Bytecodes::_dcmpl :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
433 case Bytecodes::_dcmpg :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
434 case Bytecodes::_ifnull :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
435 case Bytecodes::_ifnonnull :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
436 case Bytecodes::_goto :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
437 case Bytecodes::_goto_w :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
438 case Bytecodes::_ifeq :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
439 case Bytecodes::_ifne :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
440 case Bytecodes::_iflt :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
441 case Bytecodes::_ifge :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
442 case Bytecodes::_ifgt :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
443 case Bytecodes::_ifle :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
444 case Bytecodes::_if_icmpeq :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
445 case Bytecodes::_if_icmpne :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
446 case Bytecodes::_if_icmplt :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
447 case Bytecodes::_if_icmpge :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
448 case Bytecodes::_if_icmpgt :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
449 case Bytecodes::_if_icmple :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
450 case Bytecodes::_if_acmpeq :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
451 case Bytecodes::_if_acmpne :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
452 // special cases
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
453 case Bytecodes::_getfield :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
454 case Bytecodes::_putfield :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
455 case Bytecodes::_getstatic :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
456 case Bytecodes::_putstatic :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
457 case Bytecodes::_aastore :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
458 #ifdef COMPILER1
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
459 //special case of reexecution
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
460 case Bytecodes::_athrow :
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
461 #endif
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
462 return true;
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
463
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
464 default:
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
465 return false;
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
466 }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
467 }
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 710
diff changeset
468
0
a61af66fc99e Initial load
duke
parents:
diff changeset
469 void AbstractInterpreterGenerator::bang_stack_shadow_pages(bool native_call) {
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // Quick & dirty stack overflow checking: bang the stack & handle trap.
a61af66fc99e Initial load
duke
parents:
diff changeset
471 // Note that we do the banging after the frame is setup, since the exception
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // handling code expects to find a valid interpreter frame on the stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // Doing the banging earlier fails if the caller frame is not an interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // (Also, the exception throwing code expects to unlock any synchronized
a61af66fc99e Initial load
duke
parents:
diff changeset
476 // method receiever, so do the banging after locking the receiver.)
a61af66fc99e Initial load
duke
parents:
diff changeset
477
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // Bang each page in the shadow zone. We can't assume it's been done for
a61af66fc99e Initial load
duke
parents:
diff changeset
479 // an interpreter frame with greater than a page of locals, so each page
a61af66fc99e Initial load
duke
parents:
diff changeset
480 // needs to be checked. Only true for non-native.
a61af66fc99e Initial load
duke
parents:
diff changeset
481 if (UseStackBanging) {
a61af66fc99e Initial load
duke
parents:
diff changeset
482 const int start_page = native_call ? StackShadowPages : 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
483 const int page_size = os::vm_page_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
484 for (int pages = start_page; pages <= StackShadowPages ; pages++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
485 __ bang_stack_with_offset(pages*page_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
486 }
a61af66fc99e Initial load
duke
parents:
diff changeset
487 }
a61af66fc99e Initial load
duke
parents:
diff changeset
488 }
6926
a3e2f723f2a5 8000780: make Zero build and run with JDK8
twisti
parents: 6796
diff changeset
489
a3e2f723f2a5 8000780: make Zero build and run with JDK8
twisti
parents: 6796
diff changeset
490 void AbstractInterpreterGenerator::initialize_method_handle_entries() {
a3e2f723f2a5 8000780: make Zero build and run with JDK8
twisti
parents: 6796
diff changeset
491 // method handle entry kinds are generated later in MethodHandlesAdapterGenerator::generate:
a3e2f723f2a5 8000780: make Zero build and run with JDK8
twisti
parents: 6796
diff changeset
492 for (int i = Interpreter::method_handle_invoke_FIRST; i <= Interpreter::method_handle_invoke_LAST; i++) {
a3e2f723f2a5 8000780: make Zero build and run with JDK8
twisti
parents: 6796
diff changeset
493 Interpreter::MethodKind kind = (Interpreter::MethodKind) i;
a3e2f723f2a5 8000780: make Zero build and run with JDK8
twisti
parents: 6796
diff changeset
494 Interpreter::_entry_table[kind] = Interpreter::_entry_table[Interpreter::abstract];
a3e2f723f2a5 8000780: make Zero build and run with JDK8
twisti
parents: 6796
diff changeset
495 }
a3e2f723f2a5 8000780: make Zero build and run with JDK8
twisti
parents: 6796
diff changeset
496 }