Mercurial > hg > truffle
annotate src/share/vm/interpreter/templateInterpreter.cpp @ 17546:46fa2940e686 jdk8u5-b07
Merge
author | asaha |
---|---|
date | Sun, 02 Feb 2014 22:45:03 -0800 |
parents | bd3237e0e18d |
children | 096c224171c4 78bbf4d43a14 |
rev | line source |
---|---|
0 | 1 /* |
11080
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
6926
diff
changeset
|
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1489
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1489
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:
1489
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "interpreter/interpreter.hpp" | |
27 #include "interpreter/interpreterGenerator.hpp" | |
28 #include "interpreter/interpreterRuntime.hpp" | |
29 #include "interpreter/templateTable.hpp" | |
0 | 30 |
31 #ifndef CC_INTERP | |
32 | |
33 # define __ _masm-> | |
34 | |
35 void TemplateInterpreter::initialize() { | |
36 if (_code != NULL) return; | |
37 // assertions | |
38 assert((int)Bytecodes::number_of_codes <= (int)DispatchTable::length, | |
39 "dispatch table too small"); | |
40 | |
41 AbstractInterpreter::initialize(); | |
42 | |
43 TemplateTable::initialize(); | |
44 | |
45 // generate interpreter | |
46 { ResourceMark rm; | |
47 TraceTime timer("Interpreter generation", TraceStartupTime); | |
48 int code_size = InterpreterCodeSize; | |
49 NOT_PRODUCT(code_size *= 4;) // debug uses extra interpreter code space | |
50 _code = new StubQueue(new InterpreterCodeletInterface, code_size, NULL, | |
51 "Interpreter"); | |
52 InterpreterGenerator g(_code); | |
53 if (PrintInterpreter) print(); | |
54 } | |
55 | |
56 // initialize dispatch table | |
57 _active_table = _normal_table; | |
58 } | |
59 | |
60 //------------------------------------------------------------------------------------------------------------------------ | |
61 // Implementation of EntryPoint | |
62 | |
63 EntryPoint::EntryPoint() { | |
64 assert(number_of_states == 9, "check the code below"); | |
65 _entry[btos] = NULL; | |
66 _entry[ctos] = NULL; | |
67 _entry[stos] = NULL; | |
68 _entry[atos] = NULL; | |
69 _entry[itos] = NULL; | |
70 _entry[ltos] = NULL; | |
71 _entry[ftos] = NULL; | |
72 _entry[dtos] = NULL; | |
73 _entry[vtos] = NULL; | |
74 } | |
75 | |
76 | |
77 EntryPoint::EntryPoint(address bentry, address centry, address sentry, address aentry, address ientry, address lentry, address fentry, address dentry, address ventry) { | |
78 assert(number_of_states == 9, "check the code below"); | |
79 _entry[btos] = bentry; | |
80 _entry[ctos] = centry; | |
81 _entry[stos] = sentry; | |
82 _entry[atos] = aentry; | |
83 _entry[itos] = ientry; | |
84 _entry[ltos] = lentry; | |
85 _entry[ftos] = fentry; | |
86 _entry[dtos] = dentry; | |
87 _entry[vtos] = ventry; | |
88 } | |
89 | |
90 | |
91 void EntryPoint::set_entry(TosState state, address entry) { | |
92 assert(0 <= state && state < number_of_states, "state out of bounds"); | |
93 _entry[state] = entry; | |
94 } | |
95 | |
96 | |
97 address EntryPoint::entry(TosState state) const { | |
98 assert(0 <= state && state < number_of_states, "state out of bounds"); | |
99 return _entry[state]; | |
100 } | |
101 | |
102 | |
103 void EntryPoint::print() { | |
104 tty->print("["); | |
105 for (int i = 0; i < number_of_states; i++) { | |
106 if (i > 0) tty->print(", "); | |
107 tty->print(INTPTR_FORMAT, _entry[i]); | |
108 } | |
109 tty->print("]"); | |
110 } | |
111 | |
112 | |
113 bool EntryPoint::operator == (const EntryPoint& y) { | |
114 int i = number_of_states; | |
115 while (i-- > 0) { | |
116 if (_entry[i] != y._entry[i]) return false; | |
117 } | |
118 return true; | |
119 } | |
120 | |
121 | |
122 //------------------------------------------------------------------------------------------------------------------------ | |
123 // Implementation of DispatchTable | |
124 | |
125 EntryPoint DispatchTable::entry(int i) const { | |
126 assert(0 <= i && i < length, "index out of bounds"); | |
127 return | |
128 EntryPoint( | |
129 _table[btos][i], | |
130 _table[ctos][i], | |
131 _table[stos][i], | |
132 _table[atos][i], | |
133 _table[itos][i], | |
134 _table[ltos][i], | |
135 _table[ftos][i], | |
136 _table[dtos][i], | |
137 _table[vtos][i] | |
138 ); | |
139 } | |
140 | |
141 | |
142 void DispatchTable::set_entry(int i, EntryPoint& entry) { | |
143 assert(0 <= i && i < length, "index out of bounds"); | |
144 assert(number_of_states == 9, "check the code below"); | |
145 _table[btos][i] = entry.entry(btos); | |
146 _table[ctos][i] = entry.entry(ctos); | |
147 _table[stos][i] = entry.entry(stos); | |
148 _table[atos][i] = entry.entry(atos); | |
149 _table[itos][i] = entry.entry(itos); | |
150 _table[ltos][i] = entry.entry(ltos); | |
151 _table[ftos][i] = entry.entry(ftos); | |
152 _table[dtos][i] = entry.entry(dtos); | |
153 _table[vtos][i] = entry.entry(vtos); | |
154 } | |
155 | |
156 | |
157 bool DispatchTable::operator == (DispatchTable& y) { | |
158 int i = length; | |
159 while (i-- > 0) { | |
160 EntryPoint t = y.entry(i); // for compiler compatibility (BugId 4150096) | |
161 if (!(entry(i) == t)) return false; | |
162 } | |
163 return true; | |
164 } | |
165 | |
166 address TemplateInterpreter::_remove_activation_entry = NULL; | |
167 address TemplateInterpreter::_remove_activation_preserving_args_entry = NULL; | |
168 | |
169 | |
170 address TemplateInterpreter::_throw_ArrayIndexOutOfBoundsException_entry = NULL; | |
171 address TemplateInterpreter::_throw_ArrayStoreException_entry = NULL; | |
172 address TemplateInterpreter::_throw_ArithmeticException_entry = NULL; | |
173 address TemplateInterpreter::_throw_ClassCastException_entry = NULL; | |
174 address TemplateInterpreter::_throw_NullPointerException_entry = NULL; | |
175 address TemplateInterpreter::_throw_StackOverflowError_entry = NULL; | |
176 address TemplateInterpreter::_throw_exception_entry = NULL; | |
177 | |
178 #ifndef PRODUCT | |
179 EntryPoint TemplateInterpreter::_trace_code; | |
180 #endif // !PRODUCT | |
181 EntryPoint TemplateInterpreter::_return_entry[TemplateInterpreter::number_of_return_entries]; | |
182 EntryPoint TemplateInterpreter::_earlyret_entry; | |
183 EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ]; | |
184 EntryPoint TemplateInterpreter::_continuation_entry; | |
185 EntryPoint TemplateInterpreter::_safept_entry; | |
186 | |
13010
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
187 address TemplateInterpreter::_invoke_return_entry[TemplateInterpreter::number_of_return_addrs]; |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
188 address TemplateInterpreter::_invokeinterface_return_entry[TemplateInterpreter::number_of_return_addrs]; |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
189 address TemplateInterpreter::_invokedynamic_return_entry[TemplateInterpreter::number_of_return_addrs]; |
0 | 190 |
191 DispatchTable TemplateInterpreter::_active_table; | |
192 DispatchTable TemplateInterpreter::_normal_table; | |
193 DispatchTable TemplateInterpreter::_safept_table; | |
194 address TemplateInterpreter::_wentry_point[DispatchTable::length]; | |
195 | |
196 TemplateInterpreterGenerator::TemplateInterpreterGenerator(StubQueue* _code): AbstractInterpreterGenerator(_code) { | |
197 _unimplemented_bytecode = NULL; | |
198 _illegal_bytecode_sequence = NULL; | |
199 } | |
200 | |
201 static const BasicType types[Interpreter::number_of_result_handlers] = { | |
202 T_BOOLEAN, | |
203 T_CHAR , | |
204 T_BYTE , | |
205 T_SHORT , | |
206 T_INT , | |
207 T_LONG , | |
208 T_VOID , | |
209 T_FLOAT , | |
210 T_DOUBLE , | |
211 T_OBJECT | |
212 }; | |
213 | |
214 void TemplateInterpreterGenerator::generate_all() { | |
215 AbstractInterpreterGenerator::generate_all(); | |
216 | |
217 { CodeletMark cm(_masm, "error exits"); | |
218 _unimplemented_bytecode = generate_error_exit("unimplemented bytecode"); | |
219 _illegal_bytecode_sequence = generate_error_exit("illegal bytecode sequence - method not verified"); | |
220 } | |
221 | |
222 #ifndef PRODUCT | |
223 if (TraceBytecodes) { | |
224 CodeletMark cm(_masm, "bytecode tracing support"); | |
225 Interpreter::_trace_code = | |
226 EntryPoint( | |
227 generate_trace_code(btos), | |
228 generate_trace_code(ctos), | |
229 generate_trace_code(stos), | |
230 generate_trace_code(atos), | |
231 generate_trace_code(itos), | |
232 generate_trace_code(ltos), | |
233 generate_trace_code(ftos), | |
234 generate_trace_code(dtos), | |
235 generate_trace_code(vtos) | |
236 ); | |
237 } | |
238 #endif // !PRODUCT | |
239 | |
240 { CodeletMark cm(_masm, "return entry points"); | |
13010
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
241 const int index_size = sizeof(u2); |
0 | 242 for (int i = 0; i < Interpreter::number_of_return_entries; i++) { |
243 Interpreter::_return_entry[i] = | |
244 EntryPoint( | |
13010
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
245 generate_return_entry_for(itos, i, index_size), |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
246 generate_return_entry_for(itos, i, index_size), |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
247 generate_return_entry_for(itos, i, index_size), |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
248 generate_return_entry_for(atos, i, index_size), |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
249 generate_return_entry_for(itos, i, index_size), |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
250 generate_return_entry_for(ltos, i, index_size), |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
251 generate_return_entry_for(ftos, i, index_size), |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
252 generate_return_entry_for(dtos, i, index_size), |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
253 generate_return_entry_for(vtos, i, index_size) |
0 | 254 ); |
255 } | |
256 } | |
257 | |
13010
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
258 { CodeletMark cm(_masm, "invoke return entry points"); |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
259 const TosState states[] = {itos, itos, itos, itos, ltos, ftos, dtos, atos, vtos}; |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
260 const int invoke_length = Bytecodes::length_for(Bytecodes::_invokestatic); |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
261 const int invokeinterface_length = Bytecodes::length_for(Bytecodes::_invokeinterface); |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
262 const int invokedynamic_length = Bytecodes::length_for(Bytecodes::_invokedynamic); |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
263 |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
264 for (int i = 0; i < Interpreter::number_of_return_addrs; i++) { |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
265 TosState state = states[i]; |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
266 Interpreter::_invoke_return_entry[i] = generate_return_entry_for(state, invoke_length, sizeof(u2)); |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
267 Interpreter::_invokeinterface_return_entry[i] = generate_return_entry_for(state, invokeinterface_length, sizeof(u2)); |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
268 Interpreter::_invokedynamic_return_entry[i] = generate_return_entry_for(state, invokedynamic_length, sizeof(u4)); |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
269 } |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
270 } |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
271 |
0 | 272 { CodeletMark cm(_masm, "earlyret entry points"); |
273 Interpreter::_earlyret_entry = | |
274 EntryPoint( | |
275 generate_earlyret_entry_for(btos), | |
276 generate_earlyret_entry_for(ctos), | |
277 generate_earlyret_entry_for(stos), | |
278 generate_earlyret_entry_for(atos), | |
279 generate_earlyret_entry_for(itos), | |
280 generate_earlyret_entry_for(ltos), | |
281 generate_earlyret_entry_for(ftos), | |
282 generate_earlyret_entry_for(dtos), | |
283 generate_earlyret_entry_for(vtos) | |
284 ); | |
285 } | |
286 | |
287 { CodeletMark cm(_masm, "deoptimization entry points"); | |
288 for (int i = 0; i < Interpreter::number_of_deopt_entries; i++) { | |
289 Interpreter::_deopt_entry[i] = | |
290 EntryPoint( | |
291 generate_deopt_entry_for(itos, i), | |
292 generate_deopt_entry_for(itos, i), | |
293 generate_deopt_entry_for(itos, i), | |
294 generate_deopt_entry_for(atos, i), | |
295 generate_deopt_entry_for(itos, i), | |
296 generate_deopt_entry_for(ltos, i), | |
297 generate_deopt_entry_for(ftos, i), | |
298 generate_deopt_entry_for(dtos, i), | |
299 generate_deopt_entry_for(vtos, i) | |
300 ); | |
301 } | |
302 } | |
303 | |
304 { CodeletMark cm(_masm, "result handlers for native calls"); | |
305 // The various result converter stublets. | |
306 int is_generated[Interpreter::number_of_result_handlers]; | |
307 memset(is_generated, 0, sizeof(is_generated)); | |
308 | |
309 for (int i = 0; i < Interpreter::number_of_result_handlers; i++) { | |
310 BasicType type = types[i]; | |
311 if (!is_generated[Interpreter::BasicType_as_index(type)]++) { | |
312 Interpreter::_native_abi_to_tosca[Interpreter::BasicType_as_index(type)] = generate_result_handler_for(type); | |
313 } | |
314 } | |
315 } | |
316 | |
317 { CodeletMark cm(_masm, "continuation entry points"); | |
318 Interpreter::_continuation_entry = | |
319 EntryPoint( | |
320 generate_continuation_for(btos), | |
321 generate_continuation_for(ctos), | |
322 generate_continuation_for(stos), | |
323 generate_continuation_for(atos), | |
324 generate_continuation_for(itos), | |
325 generate_continuation_for(ltos), | |
326 generate_continuation_for(ftos), | |
327 generate_continuation_for(dtos), | |
328 generate_continuation_for(vtos) | |
329 ); | |
330 } | |
331 | |
332 { CodeletMark cm(_masm, "safepoint entry points"); | |
333 Interpreter::_safept_entry = | |
334 EntryPoint( | |
335 generate_safept_entry_for(btos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)), | |
336 generate_safept_entry_for(ctos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)), | |
337 generate_safept_entry_for(stos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)), | |
338 generate_safept_entry_for(atos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)), | |
339 generate_safept_entry_for(itos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)), | |
340 generate_safept_entry_for(ltos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)), | |
341 generate_safept_entry_for(ftos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)), | |
342 generate_safept_entry_for(dtos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)), | |
343 generate_safept_entry_for(vtos, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)) | |
344 ); | |
345 } | |
346 | |
347 { CodeletMark cm(_masm, "exception handling"); | |
348 // (Note: this is not safepoint safe because thread may return to compiled code) | |
349 generate_throw_exception(); | |
350 } | |
351 | |
352 { CodeletMark cm(_masm, "throw exception entrypoints"); | |
353 Interpreter::_throw_ArrayIndexOutOfBoundsException_entry = generate_ArrayIndexOutOfBounds_handler("java/lang/ArrayIndexOutOfBoundsException"); | |
354 Interpreter::_throw_ArrayStoreException_entry = generate_klass_exception_handler("java/lang/ArrayStoreException" ); | |
355 Interpreter::_throw_ArithmeticException_entry = generate_exception_handler("java/lang/ArithmeticException" , "/ by zero"); | |
356 Interpreter::_throw_ClassCastException_entry = generate_ClassCastException_handler(); | |
357 Interpreter::_throw_NullPointerException_entry = generate_exception_handler("java/lang/NullPointerException" , NULL ); | |
358 Interpreter::_throw_StackOverflowError_entry = generate_StackOverflowError_handler(); | |
359 } | |
360 | |
361 | |
362 | |
363 #define method_entry(kind) \ | |
364 { CodeletMark cm(_masm, "method entry point (kind = " #kind ")"); \ | |
365 Interpreter::_entry_table[Interpreter::kind] = generate_method_entry(Interpreter::kind); \ | |
366 } | |
367 | |
368 // all non-native method kinds | |
369 method_entry(zerolocals) | |
370 method_entry(zerolocals_synchronized) | |
371 method_entry(empty) | |
372 method_entry(accessor) | |
373 method_entry(abstract) | |
374 method_entry(java_lang_math_sin ) | |
375 method_entry(java_lang_math_cos ) | |
376 method_entry(java_lang_math_tan ) | |
377 method_entry(java_lang_math_abs ) | |
378 method_entry(java_lang_math_sqrt ) | |
379 method_entry(java_lang_math_log ) | |
380 method_entry(java_lang_math_log10) | |
6084
6759698e3140
7133857: exp() and pow() should use the x87 ISA on x86
roland
parents:
3781
diff
changeset
|
381 method_entry(java_lang_math_exp ) |
6759698e3140
7133857: exp() and pow() should use the x87 ISA on x86
roland
parents:
3781
diff
changeset
|
382 method_entry(java_lang_math_pow ) |
3249
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2142
diff
changeset
|
383 method_entry(java_lang_ref_reference_get) |
0 | 384 |
11080
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
6926
diff
changeset
|
385 if (UseCRC32Intrinsics) { |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
6926
diff
changeset
|
386 method_entry(java_util_zip_CRC32_update) |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
6926
diff
changeset
|
387 method_entry(java_util_zip_CRC32_updateBytes) |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
6926
diff
changeset
|
388 method_entry(java_util_zip_CRC32_updateByteBuffer) |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
6926
diff
changeset
|
389 } |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
6926
diff
changeset
|
390 |
6926 | 391 initialize_method_handle_entries(); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
392 |
0 | 393 // all native method kinds (must be one contiguous block) |
394 Interpreter::_native_entry_begin = Interpreter::code()->code_end(); | |
395 method_entry(native) | |
396 method_entry(native_synchronized) | |
397 Interpreter::_native_entry_end = Interpreter::code()->code_end(); | |
398 | |
399 #undef method_entry | |
400 | |
401 // Bytecodes | |
402 set_entry_points_for_all_bytes(); | |
403 set_safepoints_for_all_bytes(); | |
404 } | |
405 | |
406 //------------------------------------------------------------------------------------------------------------------------ | |
407 | |
408 address TemplateInterpreterGenerator::generate_error_exit(const char* msg) { | |
409 address entry = __ pc(); | |
410 __ stop(msg); | |
411 return entry; | |
412 } | |
413 | |
414 | |
415 //------------------------------------------------------------------------------------------------------------------------ | |
416 | |
417 void TemplateInterpreterGenerator::set_entry_points_for_all_bytes() { | |
418 for (int i = 0; i < DispatchTable::length; i++) { | |
419 Bytecodes::Code code = (Bytecodes::Code)i; | |
420 if (Bytecodes::is_defined(code)) { | |
421 set_entry_points(code); | |
422 } else { | |
423 set_unimplemented(i); | |
424 } | |
425 } | |
426 } | |
427 | |
428 | |
429 void TemplateInterpreterGenerator::set_safepoints_for_all_bytes() { | |
430 for (int i = 0; i < DispatchTable::length; i++) { | |
431 Bytecodes::Code code = (Bytecodes::Code)i; | |
432 if (Bytecodes::is_defined(code)) Interpreter::_safept_table.set_entry(code, Interpreter::_safept_entry); | |
433 } | |
434 } | |
435 | |
436 | |
437 void TemplateInterpreterGenerator::set_unimplemented(int i) { | |
438 address e = _unimplemented_bytecode; | |
439 EntryPoint entry(e, e, e, e, e, e, e, e, e); | |
440 Interpreter::_normal_table.set_entry(i, entry); | |
441 Interpreter::_wentry_point[i] = _unimplemented_bytecode; | |
442 } | |
443 | |
444 | |
445 void TemplateInterpreterGenerator::set_entry_points(Bytecodes::Code code) { | |
446 CodeletMark cm(_masm, Bytecodes::name(code), code); | |
447 // initialize entry points | |
448 assert(_unimplemented_bytecode != NULL, "should have been generated before"); | |
449 assert(_illegal_bytecode_sequence != NULL, "should have been generated before"); | |
450 address bep = _illegal_bytecode_sequence; | |
451 address cep = _illegal_bytecode_sequence; | |
452 address sep = _illegal_bytecode_sequence; | |
453 address aep = _illegal_bytecode_sequence; | |
454 address iep = _illegal_bytecode_sequence; | |
455 address lep = _illegal_bytecode_sequence; | |
456 address fep = _illegal_bytecode_sequence; | |
457 address dep = _illegal_bytecode_sequence; | |
458 address vep = _unimplemented_bytecode; | |
459 address wep = _unimplemented_bytecode; | |
460 // code for short & wide version of bytecode | |
461 if (Bytecodes::is_defined(code)) { | |
462 Template* t = TemplateTable::template_for(code); | |
463 assert(t->is_valid(), "just checking"); | |
464 set_short_entry_points(t, bep, cep, sep, aep, iep, lep, fep, dep, vep); | |
465 } | |
466 if (Bytecodes::wide_is_defined(code)) { | |
467 Template* t = TemplateTable::template_for_wide(code); | |
468 assert(t->is_valid(), "just checking"); | |
469 set_wide_entry_point(t, wep); | |
470 } | |
471 // set entry points | |
472 EntryPoint entry(bep, cep, sep, aep, iep, lep, fep, dep, vep); | |
473 Interpreter::_normal_table.set_entry(code, entry); | |
474 Interpreter::_wentry_point[code] = wep; | |
475 } | |
476 | |
477 | |
478 void TemplateInterpreterGenerator::set_wide_entry_point(Template* t, address& wep) { | |
479 assert(t->is_valid(), "template must exist"); | |
1489
cff162798819
6888953: some calls to function-like macros are missing semicolons
jcoomes
parents:
1071
diff
changeset
|
480 assert(t->tos_in() == vtos, "only vtos tos_in supported for wide instructions"); |
0 | 481 wep = __ pc(); generate_and_dispatch(t); |
482 } | |
483 | |
484 | |
485 void TemplateInterpreterGenerator::set_short_entry_points(Template* t, address& bep, address& cep, address& sep, address& aep, address& iep, address& lep, address& fep, address& dep, address& vep) { | |
486 assert(t->is_valid(), "template must exist"); | |
487 switch (t->tos_in()) { | |
1071
b18963243361
6902000: use ShouldNotReachHere() for btos/ctos/stos in TemplateInterpreterGenerator::set_short_entry_points
twisti
parents:
1059
diff
changeset
|
488 case btos: |
b18963243361
6902000: use ShouldNotReachHere() for btos/ctos/stos in TemplateInterpreterGenerator::set_short_entry_points
twisti
parents:
1059
diff
changeset
|
489 case ctos: |
b18963243361
6902000: use ShouldNotReachHere() for btos/ctos/stos in TemplateInterpreterGenerator::set_short_entry_points
twisti
parents:
1059
diff
changeset
|
490 case stos: |
b18963243361
6902000: use ShouldNotReachHere() for btos/ctos/stos in TemplateInterpreterGenerator::set_short_entry_points
twisti
parents:
1059
diff
changeset
|
491 ShouldNotReachHere(); // btos/ctos/stos should use itos. |
b18963243361
6902000: use ShouldNotReachHere() for btos/ctos/stos in TemplateInterpreterGenerator::set_short_entry_points
twisti
parents:
1059
diff
changeset
|
492 break; |
0 | 493 case atos: vep = __ pc(); __ pop(atos); aep = __ pc(); generate_and_dispatch(t); break; |
494 case itos: vep = __ pc(); __ pop(itos); iep = __ pc(); generate_and_dispatch(t); break; | |
495 case ltos: vep = __ pc(); __ pop(ltos); lep = __ pc(); generate_and_dispatch(t); break; | |
496 case ftos: vep = __ pc(); __ pop(ftos); fep = __ pc(); generate_and_dispatch(t); break; | |
497 case dtos: vep = __ pc(); __ pop(dtos); dep = __ pc(); generate_and_dispatch(t); break; | |
498 case vtos: set_vtos_entry_points(t, bep, cep, sep, aep, iep, lep, fep, dep, vep); break; | |
499 default : ShouldNotReachHere(); break; | |
500 } | |
501 } | |
502 | |
503 | |
504 //------------------------------------------------------------------------------------------------------------------------ | |
505 | |
506 void TemplateInterpreterGenerator::generate_and_dispatch(Template* t, TosState tos_out) { | |
507 if (PrintBytecodeHistogram) histogram_bytecode(t); | |
508 #ifndef PRODUCT | |
509 // debugging code | |
510 if (CountBytecodes || TraceBytecodes || StopInterpreterAt > 0) count_bytecode(); | |
511 if (PrintBytecodePairHistogram) histogram_bytecode_pair(t); | |
512 if (TraceBytecodes) trace_bytecode(t); | |
513 if (StopInterpreterAt > 0) stop_interpreter_at(); | |
514 __ verify_FPU(1, t->tos_in()); | |
515 #endif // !PRODUCT | |
516 int step; | |
517 if (!t->does_dispatch()) { | |
518 step = t->is_wide() ? Bytecodes::wide_length_for(t->bytecode()) : Bytecodes::length_for(t->bytecode()); | |
519 if (tos_out == ilgl) tos_out = t->tos_out(); | |
520 // compute bytecode size | |
521 assert(step > 0, "just checkin'"); | |
522 // setup stuff for dispatching next bytecode | |
523 if (ProfileInterpreter && VerifyDataPointer | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
524 && MethodData::bytecode_has_profile(t->bytecode())) { |
0 | 525 __ verify_method_data_pointer(); |
526 } | |
527 __ dispatch_prolog(tos_out, step); | |
528 } | |
529 // generate template | |
530 t->generate(_masm); | |
531 // advance | |
532 if (t->does_dispatch()) { | |
533 #ifdef ASSERT | |
534 // make sure execution doesn't go beyond this point if code is broken | |
535 __ should_not_reach_here(); | |
536 #endif // ASSERT | |
537 } else { | |
538 // dispatch to next bytecode | |
539 __ dispatch_epilog(tos_out, step); | |
540 } | |
541 } | |
542 | |
543 //------------------------------------------------------------------------------------------------------------------------ | |
544 // Entry points | |
545 | |
13010
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
546 /** |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
547 * Returns the return entry table for the given invoke bytecode. |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
548 */ |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
549 address* TemplateInterpreter::invoke_return_entry_table_for(Bytecodes::Code code) { |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
550 switch (code) { |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
551 case Bytecodes::_invokestatic: |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
552 case Bytecodes::_invokespecial: |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
553 case Bytecodes::_invokevirtual: |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
554 case Bytecodes::_invokehandle: |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
555 return Interpreter::invoke_return_entry_table(); |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
556 case Bytecodes::_invokeinterface: |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
557 return Interpreter::invokeinterface_return_entry_table(); |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
558 case Bytecodes::_invokedynamic: |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
559 return Interpreter::invokedynamic_return_entry_table(); |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
560 default: |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
561 fatal(err_msg("invalid bytecode: %s", Bytecodes::name(code))); |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
562 return NULL; |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
563 } |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
564 } |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
565 |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
566 /** |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
567 * Returns the return entry address for the given top-of-stack state and bytecode. |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
568 */ |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
569 address TemplateInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) { |
0 | 570 guarantee(0 <= length && length < Interpreter::number_of_return_entries, "illegal length"); |
13010
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
571 const int index = TosState_as_index(state); |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
572 switch (code) { |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
573 case Bytecodes::_invokestatic: |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
574 case Bytecodes::_invokespecial: |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
575 case Bytecodes::_invokevirtual: |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
576 case Bytecodes::_invokehandle: |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
577 return _invoke_return_entry[index]; |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
578 case Bytecodes::_invokeinterface: |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
579 return _invokeinterface_return_entry[index]; |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
580 case Bytecodes::_invokedynamic: |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
581 return _invokedynamic_return_entry[index]; |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
582 default: |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
583 assert(!Bytecodes::is_invoke(code), err_msg("invoke instructions should be handled separately: %s", Bytecodes::name(code))); |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
584 return _return_entry[length].entry(state); |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
11080
diff
changeset
|
585 } |
0 | 586 } |
587 | |
588 | |
589 address TemplateInterpreter::deopt_entry(TosState state, int length) { | |
590 guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length"); | |
591 return _deopt_entry[length].entry(state); | |
592 } | |
593 | |
594 //------------------------------------------------------------------------------------------------------------------------ | |
595 // Suport for invokes | |
596 | |
597 int TemplateInterpreter::TosState_as_index(TosState state) { | |
598 assert( state < number_of_states , "Invalid state in TosState_as_index"); | |
599 assert(0 <= (int)state && (int)state < TemplateInterpreter::number_of_return_addrs, "index out of bounds"); | |
600 return (int)state; | |
601 } | |
602 | |
603 | |
604 //------------------------------------------------------------------------------------------------------------------------ | |
605 // Safepoint suppport | |
606 | |
607 static inline void copy_table(address* from, address* to, int size) { | |
608 // Copy non-overlapping tables. The copy has to occur word wise for MT safety. | |
609 while (size-- > 0) *to++ = *from++; | |
610 } | |
611 | |
612 void TemplateInterpreter::notice_safepoints() { | |
613 if (!_notice_safepoints) { | |
614 // switch to safepoint dispatch table | |
615 _notice_safepoints = true; | |
616 copy_table((address*)&_safept_table, (address*)&_active_table, sizeof(_active_table) / sizeof(address)); | |
617 } | |
618 } | |
619 | |
620 // switch from the dispatch table which notices safepoints back to the | |
621 // normal dispatch table. So that we can notice single stepping points, | |
622 // keep the safepoint dispatch table if we are single stepping in JVMTI. | |
623 // Note that the should_post_single_step test is exactly as fast as the | |
624 // JvmtiExport::_enabled test and covers both cases. | |
625 void TemplateInterpreter::ignore_safepoints() { | |
626 if (_notice_safepoints) { | |
627 if (!JvmtiExport::should_post_single_step()) { | |
628 // switch to normal dispatch table | |
629 _notice_safepoints = false; | |
630 copy_table((address*)&_normal_table, (address*)&_active_table, sizeof(_active_table) / sizeof(address)); | |
631 } | |
632 } | |
633 } | |
634 | |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
635 //------------------------------------------------------------------------------------------------------------------------ |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
636 // Deoptimization support |
0 | 637 |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
638 // If deoptimization happens, this function returns the point of next bytecode to continue execution |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
639 address TemplateInterpreter::deopt_continue_after_entry(Method* method, address bcp, int callee_parameters, bool is_top_frame) { |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
640 return AbstractInterpreter::deopt_continue_after_entry(method, bcp, callee_parameters, is_top_frame); |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
641 } |
0 | 642 |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
643 // 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:
726
diff
changeset
|
644 // the bytecode. |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
645 // Note: Bytecodes::_athrow (C1 only) and Bytecodes::_return are the special cases |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
646 // that do not return "Interpreter::deopt_entry(vtos, 0)" |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
647 address TemplateInterpreter::deopt_reexecute_entry(Method* method, address bcp) { |
0 | 648 assert(method->contains(bcp), "just checkin'"); |
2142 | 649 Bytecodes::Code code = Bytecodes::java_code_at(method, bcp); |
0 | 650 if (code == Bytecodes::_return) { |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
651 // This is used for deopt during registration of finalizers |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
652 // during Object.<init>. We simply need to resume execution at |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
653 // the standard return vtos bytecode to pop the frame normally. |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
654 // reexecuting the real bytecode would cause double registration |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
655 // of the finalizable object. |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
656 return _normal_table.entry(Bytecodes::_return).entry(vtos); |
0 | 657 } else { |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
658 return AbstractInterpreter::deopt_reexecute_entry(method, bcp); |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
659 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
660 } |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
661 |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
662 // If deoptimization happens, the interpreter should reexecute this bytecode. |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
663 // 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:
726
diff
changeset
|
664 bool TemplateInterpreter::bytecode_should_reexecute(Bytecodes::Code code) { |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
665 if (code == Bytecodes::_return) { |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
666 //Yes, we consider Bytecodes::_return as a special case of reexecution |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
667 return true; |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
668 } else { |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
669 return AbstractInterpreter::bytecode_should_reexecute(code); |
0 | 670 } |
671 } | |
672 | |
673 #endif // !CC_INTERP |