Mercurial > hg > truffle
annotate src/share/vm/interpreter/templateTable.cpp @ 9126:bc26f978b0ce
HotSpotResolvedObjectType: implement hasFinalizeSubclass() correctly
don't use the (wrong) cached value, but ask the runtime on each request.
Fixes regression on xml.* benchmarks @ specjvm2008. The problem was:
After the constructor of Object was deoptimized due to an assumption violation,
it was recompiled again after some time. However, on recompilation, the value
of hasFinalizeSubclass for the class was not updated and it was compiled again
with a, now wrong, assumption, which then triggers deoptimization again.
This was repeated until it hit the recompilation limit (defined by
PerMethodRecompilationCutoff), and therefore only executed by the interpreter
from now on, causing the performance regression.
author | Bernhard Urban <bernhard.urban@jku.at> |
---|---|
date | Mon, 15 Apr 2013 19:54:58 +0200 |
parents | 5d0bb7d52783 |
children |
rev | line source |
---|---|
0 | 1 /* |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
2 * Copyright (c) 1997, 2012, 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:
844
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
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:
844
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "gc_interface/collectedHeap.hpp" | |
27 #include "interpreter/templateTable.hpp" | |
28 #include "runtime/timer.hpp" | |
0 | 29 |
30 | |
31 #ifdef CC_INTERP | |
32 | |
33 void templateTable_init() { | |
34 } | |
35 | |
36 #else | |
37 | |
38 //---------------------------------------------------------------------------------------------------- | |
39 // Implementation of Template | |
40 | |
41 | |
42 void Template::initialize(int flags, TosState tos_in, TosState tos_out, generator gen, int arg) { | |
43 _flags = flags; | |
44 _tos_in = tos_in; | |
45 _tos_out = tos_out; | |
46 _gen = gen; | |
47 _arg = arg; | |
48 } | |
49 | |
50 | |
51 Bytecodes::Code Template::bytecode() const { | |
52 int i = this - TemplateTable::_template_table; | |
53 if (i < 0 || i >= Bytecodes::number_of_codes) i = this - TemplateTable::_template_table_wide; | |
54 return Bytecodes::cast(i); | |
55 } | |
56 | |
57 | |
58 void Template::generate(InterpreterMacroAssembler* masm) { | |
59 // parameter passing | |
60 TemplateTable::_desc = this; | |
61 TemplateTable::_masm = masm; | |
62 // code generation | |
63 _gen(_arg); | |
64 masm->flush(); | |
65 } | |
66 | |
67 | |
68 //---------------------------------------------------------------------------------------------------- | |
69 // Implementation of TemplateTable: Platform-independent helper routines | |
70 | |
71 void TemplateTable::call_VM(Register oop_result, address entry_point) { | |
72 assert(_desc->calls_vm(), "inconsistent calls_vm information"); | |
73 _masm->call_VM(oop_result, entry_point); | |
74 } | |
75 | |
76 | |
77 void TemplateTable::call_VM(Register oop_result, address entry_point, Register arg_1) { | |
78 assert(_desc->calls_vm(), "inconsistent calls_vm information"); | |
79 _masm->call_VM(oop_result, entry_point, arg_1); | |
80 } | |
81 | |
82 | |
83 void TemplateTable::call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2) { | |
84 assert(_desc->calls_vm(), "inconsistent calls_vm information"); | |
85 _masm->call_VM(oop_result, entry_point, arg_1, arg_2); | |
86 } | |
87 | |
88 | |
89 void TemplateTable::call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, Register arg_3) { | |
90 assert(_desc->calls_vm(), "inconsistent calls_vm information"); | |
91 _masm->call_VM(oop_result, entry_point, arg_1, arg_2, arg_3); | |
92 } | |
93 | |
94 | |
95 void TemplateTable::call_VM(Register oop_result, Register last_java_sp, address entry_point) { | |
96 assert(_desc->calls_vm(), "inconsistent calls_vm information"); | |
97 _masm->call_VM(oop_result, last_java_sp, entry_point); | |
98 } | |
99 | |
100 | |
101 void TemplateTable::call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1) { | |
102 assert(_desc->calls_vm(), "inconsistent calls_vm information"); | |
103 _masm->call_VM(oop_result, last_java_sp, entry_point, arg_1); | |
104 } | |
105 | |
106 | |
107 void TemplateTable::call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2) { | |
108 assert(_desc->calls_vm(), "inconsistent calls_vm information"); | |
109 _masm->call_VM(oop_result, last_java_sp, entry_point, arg_1, arg_2); | |
110 } | |
111 | |
112 | |
113 void TemplateTable::call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, Register arg_3) { | |
114 assert(_desc->calls_vm(), "inconsistent calls_vm information"); | |
115 _masm->call_VM(oop_result, last_java_sp, entry_point, arg_1, arg_2, arg_3); | |
116 } | |
117 | |
118 | |
119 //---------------------------------------------------------------------------------------------------- | |
120 // Implementation of TemplateTable: Platform-independent bytecodes | |
121 | |
122 void TemplateTable::float_cmp(int unordered_result) { | |
123 transition(ftos, itos); | |
124 float_cmp(true, unordered_result); | |
125 } | |
126 | |
127 | |
128 void TemplateTable::double_cmp(int unordered_result) { | |
129 transition(dtos, itos); | |
130 float_cmp(false, unordered_result); | |
131 } | |
132 | |
133 | |
134 void TemplateTable::_goto() { | |
135 transition(vtos, vtos); | |
136 branch(false, false); | |
137 } | |
138 | |
139 | |
140 void TemplateTable::goto_w() { | |
141 transition(vtos, vtos); | |
142 branch(false, true); | |
143 } | |
144 | |
145 | |
146 void TemplateTable::jsr_w() { | |
147 transition(vtos, vtos); // result is not an oop, so do not transition to atos | |
148 branch(true, true); | |
149 } | |
150 | |
151 | |
152 void TemplateTable::jsr() { | |
153 transition(vtos, vtos); // result is not an oop, so do not transition to atos | |
154 branch(true, false); | |
155 } | |
156 | |
157 | |
158 | |
159 //---------------------------------------------------------------------------------------------------- | |
160 // Implementation of TemplateTable: Debugging | |
161 | |
162 void TemplateTable::transition(TosState tos_in, TosState tos_out) { | |
163 assert(_desc->tos_in() == tos_in , "inconsistent tos_in information"); | |
164 assert(_desc->tos_out() == tos_out, "inconsistent tos_out information"); | |
165 } | |
166 | |
167 | |
168 //---------------------------------------------------------------------------------------------------- | |
169 // Implementation of TemplateTable: Initialization | |
170 | |
171 bool TemplateTable::_is_initialized = false; | |
172 Template TemplateTable::_template_table [Bytecodes::number_of_codes]; | |
173 Template TemplateTable::_template_table_wide[Bytecodes::number_of_codes]; | |
174 | |
175 Template* TemplateTable::_desc; | |
176 InterpreterMacroAssembler* TemplateTable::_masm; | |
342 | 177 BarrierSet* TemplateTable::_bs; |
0 | 178 |
179 | |
180 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(), char filler) { | |
181 assert(filler == ' ', "just checkin'"); | |
182 def(code, flags, in, out, (Template::generator)gen, 0); | |
183 } | |
184 | |
185 | |
186 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(int arg), int arg) { | |
187 // should factor out these constants | |
188 const int ubcp = 1 << Template::uses_bcp_bit; | |
189 const int disp = 1 << Template::does_dispatch_bit; | |
190 const int clvm = 1 << Template::calls_vm_bit; | |
191 const int iswd = 1 << Template::wide_bit; | |
192 // determine which table to use | |
193 bool is_wide = (flags & iswd) != 0; | |
194 // make sure that wide instructions have a vtos entry point | |
195 // (since they are executed extremely rarely, it doesn't pay out to have an | |
196 // extra set of 5 dispatch tables for the wide instructions - for simplicity | |
197 // they all go with one table) | |
198 assert(in == vtos || !is_wide, "wide instructions have vtos entry point only"); | |
199 Template* t = is_wide ? template_for_wide(code) : template_for(code); | |
200 // setup entry | |
201 t->initialize(flags, in, out, gen, arg); | |
202 assert(t->bytecode() == code, "just checkin'"); | |
203 } | |
204 | |
205 | |
206 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(Operation op), Operation op) { | |
207 def(code, flags, in, out, (Template::generator)gen, (int)op); | |
208 } | |
209 | |
210 | |
211 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(bool arg ), bool arg) { | |
212 def(code, flags, in, out, (Template::generator)gen, (int)arg); | |
213 } | |
214 | |
215 | |
216 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(TosState tos), TosState tos) { | |
217 def(code, flags, in, out, (Template::generator)gen, (int)tos); | |
218 } | |
219 | |
220 | |
221 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(Condition cc), Condition cc) { | |
222 def(code, flags, in, out, (Template::generator)gen, (int)cc); | |
223 } | |
224 | |
225 #if defined(TEMPLATE_TABLE_BUG) | |
226 // | |
227 // It appears that gcc (version 2.91) generates bad code for the template | |
228 // table init if this macro is not defined. My symptom was an assertion | |
229 // assert(Universe::heap()->is_in(obj), "sanity check") in handles.cpp line 24. | |
230 // when called from interpreterRuntime.resolve_invoke(). | |
231 // | |
232 #define iload TemplateTable::iload | |
233 #define lload TemplateTable::lload | |
234 #define fload TemplateTable::fload | |
235 #define dload TemplateTable::dload | |
236 #define aload TemplateTable::aload | |
237 #define istore TemplateTable::istore | |
238 #define lstore TemplateTable::lstore | |
239 #define fstore TemplateTable::fstore | |
240 #define dstore TemplateTable::dstore | |
241 #define astore TemplateTable::astore | |
242 #endif // TEMPLATE_TABLE_BUG | |
243 | |
244 void TemplateTable::initialize() { | |
245 if (_is_initialized) return; | |
246 | |
247 // Initialize table | |
248 TraceTime timer("TemplateTable initialization", TraceStartupTime); | |
249 | |
342 | 250 _bs = Universe::heap()->barrier_set(); |
251 | |
0 | 252 // For better readability |
253 const char _ = ' '; | |
254 const int ____ = 0; | |
255 const int ubcp = 1 << Template::uses_bcp_bit; | |
256 const int disp = 1 << Template::does_dispatch_bit; | |
257 const int clvm = 1 << Template::calls_vm_bit; | |
258 const int iswd = 1 << Template::wide_bit; | |
259 // interpr. templates | |
260 // Java spec bytecodes ubcp|disp|clvm|iswd in out generator argument | |
261 def(Bytecodes::_nop , ____|____|____|____, vtos, vtos, nop , _ ); | |
262 def(Bytecodes::_aconst_null , ____|____|____|____, vtos, atos, aconst_null , _ ); | |
263 def(Bytecodes::_iconst_m1 , ____|____|____|____, vtos, itos, iconst , -1 ); | |
264 def(Bytecodes::_iconst_0 , ____|____|____|____, vtos, itos, iconst , 0 ); | |
265 def(Bytecodes::_iconst_1 , ____|____|____|____, vtos, itos, iconst , 1 ); | |
266 def(Bytecodes::_iconst_2 , ____|____|____|____, vtos, itos, iconst , 2 ); | |
267 def(Bytecodes::_iconst_3 , ____|____|____|____, vtos, itos, iconst , 3 ); | |
268 def(Bytecodes::_iconst_4 , ____|____|____|____, vtos, itos, iconst , 4 ); | |
269 def(Bytecodes::_iconst_5 , ____|____|____|____, vtos, itos, iconst , 5 ); | |
270 def(Bytecodes::_lconst_0 , ____|____|____|____, vtos, ltos, lconst , 0 ); | |
271 def(Bytecodes::_lconst_1 , ____|____|____|____, vtos, ltos, lconst , 1 ); | |
272 def(Bytecodes::_fconst_0 , ____|____|____|____, vtos, ftos, fconst , 0 ); | |
273 def(Bytecodes::_fconst_1 , ____|____|____|____, vtos, ftos, fconst , 1 ); | |
274 def(Bytecodes::_fconst_2 , ____|____|____|____, vtos, ftos, fconst , 2 ); | |
275 def(Bytecodes::_dconst_0 , ____|____|____|____, vtos, dtos, dconst , 0 ); | |
276 def(Bytecodes::_dconst_1 , ____|____|____|____, vtos, dtos, dconst , 1 ); | |
277 def(Bytecodes::_bipush , ubcp|____|____|____, vtos, itos, bipush , _ ); | |
278 def(Bytecodes::_sipush , ubcp|____|____|____, vtos, itos, sipush , _ ); | |
279 def(Bytecodes::_ldc , ubcp|____|clvm|____, vtos, vtos, ldc , false ); | |
280 def(Bytecodes::_ldc_w , ubcp|____|clvm|____, vtos, vtos, ldc , true ); | |
281 def(Bytecodes::_ldc2_w , ubcp|____|____|____, vtos, vtos, ldc2_w , _ ); | |
282 def(Bytecodes::_iload , ubcp|____|clvm|____, vtos, itos, iload , _ ); | |
283 def(Bytecodes::_lload , ubcp|____|____|____, vtos, ltos, lload , _ ); | |
284 def(Bytecodes::_fload , ubcp|____|____|____, vtos, ftos, fload , _ ); | |
285 def(Bytecodes::_dload , ubcp|____|____|____, vtos, dtos, dload , _ ); | |
286 def(Bytecodes::_aload , ubcp|____|clvm|____, vtos, atos, aload , _ ); | |
287 def(Bytecodes::_iload_0 , ____|____|____|____, vtos, itos, iload , 0 ); | |
288 def(Bytecodes::_iload_1 , ____|____|____|____, vtos, itos, iload , 1 ); | |
289 def(Bytecodes::_iload_2 , ____|____|____|____, vtos, itos, iload , 2 ); | |
290 def(Bytecodes::_iload_3 , ____|____|____|____, vtos, itos, iload , 3 ); | |
291 def(Bytecodes::_lload_0 , ____|____|____|____, vtos, ltos, lload , 0 ); | |
292 def(Bytecodes::_lload_1 , ____|____|____|____, vtos, ltos, lload , 1 ); | |
293 def(Bytecodes::_lload_2 , ____|____|____|____, vtos, ltos, lload , 2 ); | |
294 def(Bytecodes::_lload_3 , ____|____|____|____, vtos, ltos, lload , 3 ); | |
295 def(Bytecodes::_fload_0 , ____|____|____|____, vtos, ftos, fload , 0 ); | |
296 def(Bytecodes::_fload_1 , ____|____|____|____, vtos, ftos, fload , 1 ); | |
297 def(Bytecodes::_fload_2 , ____|____|____|____, vtos, ftos, fload , 2 ); | |
298 def(Bytecodes::_fload_3 , ____|____|____|____, vtos, ftos, fload , 3 ); | |
299 def(Bytecodes::_dload_0 , ____|____|____|____, vtos, dtos, dload , 0 ); | |
300 def(Bytecodes::_dload_1 , ____|____|____|____, vtos, dtos, dload , 1 ); | |
301 def(Bytecodes::_dload_2 , ____|____|____|____, vtos, dtos, dload , 2 ); | |
302 def(Bytecodes::_dload_3 , ____|____|____|____, vtos, dtos, dload , 3 ); | |
303 def(Bytecodes::_aload_0 , ubcp|____|clvm|____, vtos, atos, aload_0 , _ ); | |
304 def(Bytecodes::_aload_1 , ____|____|____|____, vtos, atos, aload , 1 ); | |
305 def(Bytecodes::_aload_2 , ____|____|____|____, vtos, atos, aload , 2 ); | |
306 def(Bytecodes::_aload_3 , ____|____|____|____, vtos, atos, aload , 3 ); | |
307 def(Bytecodes::_iaload , ____|____|____|____, itos, itos, iaload , _ ); | |
308 def(Bytecodes::_laload , ____|____|____|____, itos, ltos, laload , _ ); | |
309 def(Bytecodes::_faload , ____|____|____|____, itos, ftos, faload , _ ); | |
310 def(Bytecodes::_daload , ____|____|____|____, itos, dtos, daload , _ ); | |
311 def(Bytecodes::_aaload , ____|____|____|____, itos, atos, aaload , _ ); | |
312 def(Bytecodes::_baload , ____|____|____|____, itos, itos, baload , _ ); | |
313 def(Bytecodes::_caload , ____|____|____|____, itos, itos, caload , _ ); | |
314 def(Bytecodes::_saload , ____|____|____|____, itos, itos, saload , _ ); | |
315 def(Bytecodes::_istore , ubcp|____|clvm|____, itos, vtos, istore , _ ); | |
316 def(Bytecodes::_lstore , ubcp|____|____|____, ltos, vtos, lstore , _ ); | |
317 def(Bytecodes::_fstore , ubcp|____|____|____, ftos, vtos, fstore , _ ); | |
318 def(Bytecodes::_dstore , ubcp|____|____|____, dtos, vtos, dstore , _ ); | |
319 def(Bytecodes::_astore , ubcp|____|clvm|____, vtos, vtos, astore , _ ); | |
320 def(Bytecodes::_istore_0 , ____|____|____|____, itos, vtos, istore , 0 ); | |
321 def(Bytecodes::_istore_1 , ____|____|____|____, itos, vtos, istore , 1 ); | |
322 def(Bytecodes::_istore_2 , ____|____|____|____, itos, vtos, istore , 2 ); | |
323 def(Bytecodes::_istore_3 , ____|____|____|____, itos, vtos, istore , 3 ); | |
324 def(Bytecodes::_lstore_0 , ____|____|____|____, ltos, vtos, lstore , 0 ); | |
325 def(Bytecodes::_lstore_1 , ____|____|____|____, ltos, vtos, lstore , 1 ); | |
326 def(Bytecodes::_lstore_2 , ____|____|____|____, ltos, vtos, lstore , 2 ); | |
327 def(Bytecodes::_lstore_3 , ____|____|____|____, ltos, vtos, lstore , 3 ); | |
328 def(Bytecodes::_fstore_0 , ____|____|____|____, ftos, vtos, fstore , 0 ); | |
329 def(Bytecodes::_fstore_1 , ____|____|____|____, ftos, vtos, fstore , 1 ); | |
330 def(Bytecodes::_fstore_2 , ____|____|____|____, ftos, vtos, fstore , 2 ); | |
331 def(Bytecodes::_fstore_3 , ____|____|____|____, ftos, vtos, fstore , 3 ); | |
332 def(Bytecodes::_dstore_0 , ____|____|____|____, dtos, vtos, dstore , 0 ); | |
333 def(Bytecodes::_dstore_1 , ____|____|____|____, dtos, vtos, dstore , 1 ); | |
334 def(Bytecodes::_dstore_2 , ____|____|____|____, dtos, vtos, dstore , 2 ); | |
335 def(Bytecodes::_dstore_3 , ____|____|____|____, dtos, vtos, dstore , 3 ); | |
336 def(Bytecodes::_astore_0 , ____|____|____|____, vtos, vtos, astore , 0 ); | |
337 def(Bytecodes::_astore_1 , ____|____|____|____, vtos, vtos, astore , 1 ); | |
338 def(Bytecodes::_astore_2 , ____|____|____|____, vtos, vtos, astore , 2 ); | |
339 def(Bytecodes::_astore_3 , ____|____|____|____, vtos, vtos, astore , 3 ); | |
340 def(Bytecodes::_iastore , ____|____|____|____, itos, vtos, iastore , _ ); | |
341 def(Bytecodes::_lastore , ____|____|____|____, ltos, vtos, lastore , _ ); | |
342 def(Bytecodes::_fastore , ____|____|____|____, ftos, vtos, fastore , _ ); | |
343 def(Bytecodes::_dastore , ____|____|____|____, dtos, vtos, dastore , _ ); | |
344 def(Bytecodes::_aastore , ____|____|clvm|____, vtos, vtos, aastore , _ ); | |
345 def(Bytecodes::_bastore , ____|____|____|____, itos, vtos, bastore , _ ); | |
346 def(Bytecodes::_castore , ____|____|____|____, itos, vtos, castore , _ ); | |
347 def(Bytecodes::_sastore , ____|____|____|____, itos, vtos, sastore , _ ); | |
348 def(Bytecodes::_pop , ____|____|____|____, vtos, vtos, pop , _ ); | |
349 def(Bytecodes::_pop2 , ____|____|____|____, vtos, vtos, pop2 , _ ); | |
350 def(Bytecodes::_dup , ____|____|____|____, vtos, vtos, dup , _ ); | |
351 def(Bytecodes::_dup_x1 , ____|____|____|____, vtos, vtos, dup_x1 , _ ); | |
352 def(Bytecodes::_dup_x2 , ____|____|____|____, vtos, vtos, dup_x2 , _ ); | |
353 def(Bytecodes::_dup2 , ____|____|____|____, vtos, vtos, dup2 , _ ); | |
354 def(Bytecodes::_dup2_x1 , ____|____|____|____, vtos, vtos, dup2_x1 , _ ); | |
355 def(Bytecodes::_dup2_x2 , ____|____|____|____, vtos, vtos, dup2_x2 , _ ); | |
356 def(Bytecodes::_swap , ____|____|____|____, vtos, vtos, swap , _ ); | |
357 def(Bytecodes::_iadd , ____|____|____|____, itos, itos, iop2 , add ); | |
358 def(Bytecodes::_ladd , ____|____|____|____, ltos, ltos, lop2 , add ); | |
359 def(Bytecodes::_fadd , ____|____|____|____, ftos, ftos, fop2 , add ); | |
360 def(Bytecodes::_dadd , ____|____|____|____, dtos, dtos, dop2 , add ); | |
361 def(Bytecodes::_isub , ____|____|____|____, itos, itos, iop2 , sub ); | |
362 def(Bytecodes::_lsub , ____|____|____|____, ltos, ltos, lop2 , sub ); | |
363 def(Bytecodes::_fsub , ____|____|____|____, ftos, ftos, fop2 , sub ); | |
364 def(Bytecodes::_dsub , ____|____|____|____, dtos, dtos, dop2 , sub ); | |
365 def(Bytecodes::_imul , ____|____|____|____, itos, itos, iop2 , mul ); | |
366 def(Bytecodes::_lmul , ____|____|____|____, ltos, ltos, lmul , _ ); | |
367 def(Bytecodes::_fmul , ____|____|____|____, ftos, ftos, fop2 , mul ); | |
368 def(Bytecodes::_dmul , ____|____|____|____, dtos, dtos, dop2 , mul ); | |
369 def(Bytecodes::_idiv , ____|____|____|____, itos, itos, idiv , _ ); | |
370 def(Bytecodes::_ldiv , ____|____|____|____, ltos, ltos, ldiv , _ ); | |
371 def(Bytecodes::_fdiv , ____|____|____|____, ftos, ftos, fop2 , div ); | |
372 def(Bytecodes::_ddiv , ____|____|____|____, dtos, dtos, dop2 , div ); | |
373 def(Bytecodes::_irem , ____|____|____|____, itos, itos, irem , _ ); | |
374 def(Bytecodes::_lrem , ____|____|____|____, ltos, ltos, lrem , _ ); | |
375 def(Bytecodes::_frem , ____|____|____|____, ftos, ftos, fop2 , rem ); | |
376 def(Bytecodes::_drem , ____|____|____|____, dtos, dtos, dop2 , rem ); | |
377 def(Bytecodes::_ineg , ____|____|____|____, itos, itos, ineg , _ ); | |
378 def(Bytecodes::_lneg , ____|____|____|____, ltos, ltos, lneg , _ ); | |
379 def(Bytecodes::_fneg , ____|____|____|____, ftos, ftos, fneg , _ ); | |
380 def(Bytecodes::_dneg , ____|____|____|____, dtos, dtos, dneg , _ ); | |
381 def(Bytecodes::_ishl , ____|____|____|____, itos, itos, iop2 , shl ); | |
382 def(Bytecodes::_lshl , ____|____|____|____, itos, ltos, lshl , _ ); | |
383 def(Bytecodes::_ishr , ____|____|____|____, itos, itos, iop2 , shr ); | |
384 def(Bytecodes::_lshr , ____|____|____|____, itos, ltos, lshr , _ ); | |
385 def(Bytecodes::_iushr , ____|____|____|____, itos, itos, iop2 , ushr ); | |
386 def(Bytecodes::_lushr , ____|____|____|____, itos, ltos, lushr , _ ); | |
387 def(Bytecodes::_iand , ____|____|____|____, itos, itos, iop2 , _and ); | |
388 def(Bytecodes::_land , ____|____|____|____, ltos, ltos, lop2 , _and ); | |
389 def(Bytecodes::_ior , ____|____|____|____, itos, itos, iop2 , _or ); | |
390 def(Bytecodes::_lor , ____|____|____|____, ltos, ltos, lop2 , _or ); | |
391 def(Bytecodes::_ixor , ____|____|____|____, itos, itos, iop2 , _xor ); | |
392 def(Bytecodes::_lxor , ____|____|____|____, ltos, ltos, lop2 , _xor ); | |
393 def(Bytecodes::_iinc , ubcp|____|clvm|____, vtos, vtos, iinc , _ ); | |
394 def(Bytecodes::_i2l , ____|____|____|____, itos, ltos, convert , _ ); | |
395 def(Bytecodes::_i2f , ____|____|____|____, itos, ftos, convert , _ ); | |
396 def(Bytecodes::_i2d , ____|____|____|____, itos, dtos, convert , _ ); | |
397 def(Bytecodes::_l2i , ____|____|____|____, ltos, itos, convert , _ ); | |
398 def(Bytecodes::_l2f , ____|____|____|____, ltos, ftos, convert , _ ); | |
399 def(Bytecodes::_l2d , ____|____|____|____, ltos, dtos, convert , _ ); | |
400 def(Bytecodes::_f2i , ____|____|____|____, ftos, itos, convert , _ ); | |
401 def(Bytecodes::_f2l , ____|____|____|____, ftos, ltos, convert , _ ); | |
402 def(Bytecodes::_f2d , ____|____|____|____, ftos, dtos, convert , _ ); | |
403 def(Bytecodes::_d2i , ____|____|____|____, dtos, itos, convert , _ ); | |
404 def(Bytecodes::_d2l , ____|____|____|____, dtos, ltos, convert , _ ); | |
405 def(Bytecodes::_d2f , ____|____|____|____, dtos, ftos, convert , _ ); | |
406 def(Bytecodes::_i2b , ____|____|____|____, itos, itos, convert , _ ); | |
407 def(Bytecodes::_i2c , ____|____|____|____, itos, itos, convert , _ ); | |
408 def(Bytecodes::_i2s , ____|____|____|____, itos, itos, convert , _ ); | |
409 def(Bytecodes::_lcmp , ____|____|____|____, ltos, itos, lcmp , _ ); | |
410 def(Bytecodes::_fcmpl , ____|____|____|____, ftos, itos, float_cmp , -1 ); | |
411 def(Bytecodes::_fcmpg , ____|____|____|____, ftos, itos, float_cmp , 1 ); | |
412 def(Bytecodes::_dcmpl , ____|____|____|____, dtos, itos, double_cmp , -1 ); | |
413 def(Bytecodes::_dcmpg , ____|____|____|____, dtos, itos, double_cmp , 1 ); | |
414 def(Bytecodes::_ifeq , ubcp|____|clvm|____, itos, vtos, if_0cmp , equal ); | |
415 def(Bytecodes::_ifne , ubcp|____|clvm|____, itos, vtos, if_0cmp , not_equal ); | |
416 def(Bytecodes::_iflt , ubcp|____|clvm|____, itos, vtos, if_0cmp , less ); | |
417 def(Bytecodes::_ifge , ubcp|____|clvm|____, itos, vtos, if_0cmp , greater_equal); | |
418 def(Bytecodes::_ifgt , ubcp|____|clvm|____, itos, vtos, if_0cmp , greater ); | |
419 def(Bytecodes::_ifle , ubcp|____|clvm|____, itos, vtos, if_0cmp , less_equal ); | |
420 def(Bytecodes::_if_icmpeq , ubcp|____|clvm|____, itos, vtos, if_icmp , equal ); | |
421 def(Bytecodes::_if_icmpne , ubcp|____|clvm|____, itos, vtos, if_icmp , not_equal ); | |
422 def(Bytecodes::_if_icmplt , ubcp|____|clvm|____, itos, vtos, if_icmp , less ); | |
423 def(Bytecodes::_if_icmpge , ubcp|____|clvm|____, itos, vtos, if_icmp , greater_equal); | |
424 def(Bytecodes::_if_icmpgt , ubcp|____|clvm|____, itos, vtos, if_icmp , greater ); | |
425 def(Bytecodes::_if_icmple , ubcp|____|clvm|____, itos, vtos, if_icmp , less_equal ); | |
426 def(Bytecodes::_if_acmpeq , ubcp|____|clvm|____, atos, vtos, if_acmp , equal ); | |
427 def(Bytecodes::_if_acmpne , ubcp|____|clvm|____, atos, vtos, if_acmp , not_equal ); | |
428 def(Bytecodes::_goto , ubcp|disp|clvm|____, vtos, vtos, _goto , _ ); | |
429 def(Bytecodes::_jsr , ubcp|disp|____|____, vtos, vtos, jsr , _ ); // result is not an oop, so do not transition to atos | |
430 def(Bytecodes::_ret , ubcp|disp|____|____, vtos, vtos, ret , _ ); | |
431 def(Bytecodes::_tableswitch , ubcp|disp|____|____, itos, vtos, tableswitch , _ ); | |
432 def(Bytecodes::_lookupswitch , ubcp|disp|____|____, itos, itos, lookupswitch , _ ); | |
433 def(Bytecodes::_ireturn , ____|disp|clvm|____, itos, itos, _return , itos ); | |
434 def(Bytecodes::_lreturn , ____|disp|clvm|____, ltos, ltos, _return , ltos ); | |
435 def(Bytecodes::_freturn , ____|disp|clvm|____, ftos, ftos, _return , ftos ); | |
436 def(Bytecodes::_dreturn , ____|disp|clvm|____, dtos, dtos, _return , dtos ); | |
437 def(Bytecodes::_areturn , ____|disp|clvm|____, atos, atos, _return , atos ); | |
438 def(Bytecodes::_return , ____|disp|clvm|____, vtos, vtos, _return , vtos ); | |
1565 | 439 def(Bytecodes::_getstatic , ubcp|____|clvm|____, vtos, vtos, getstatic , f1_byte ); |
440 def(Bytecodes::_putstatic , ubcp|____|clvm|____, vtos, vtos, putstatic , f2_byte ); | |
441 def(Bytecodes::_getfield , ubcp|____|clvm|____, vtos, vtos, getfield , f1_byte ); | |
442 def(Bytecodes::_putfield , ubcp|____|clvm|____, vtos, vtos, putfield , f2_byte ); | |
443 def(Bytecodes::_invokevirtual , ubcp|disp|clvm|____, vtos, vtos, invokevirtual , f2_byte ); | |
444 def(Bytecodes::_invokespecial , ubcp|disp|clvm|____, vtos, vtos, invokespecial , f1_byte ); | |
445 def(Bytecodes::_invokestatic , ubcp|disp|clvm|____, vtos, vtos, invokestatic , f1_byte ); | |
446 def(Bytecodes::_invokeinterface , ubcp|disp|clvm|____, vtos, vtos, invokeinterface , f1_byte ); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
447 def(Bytecodes::_invokedynamic , ubcp|disp|clvm|____, vtos, vtos, invokedynamic , f1_byte ); |
0 | 448 def(Bytecodes::_new , ubcp|____|clvm|____, vtos, atos, _new , _ ); |
449 def(Bytecodes::_newarray , ubcp|____|clvm|____, itos, atos, newarray , _ ); | |
450 def(Bytecodes::_anewarray , ubcp|____|clvm|____, itos, atos, anewarray , _ ); | |
451 def(Bytecodes::_arraylength , ____|____|____|____, atos, itos, arraylength , _ ); | |
452 def(Bytecodes::_athrow , ____|disp|____|____, atos, vtos, athrow , _ ); | |
453 def(Bytecodes::_checkcast , ubcp|____|clvm|____, atos, atos, checkcast , _ ); | |
454 def(Bytecodes::_instanceof , ubcp|____|clvm|____, atos, itos, instanceof , _ ); | |
455 def(Bytecodes::_monitorenter , ____|disp|clvm|____, atos, vtos, monitorenter , _ ); | |
456 def(Bytecodes::_monitorexit , ____|____|clvm|____, atos, vtos, monitorexit , _ ); | |
457 def(Bytecodes::_wide , ubcp|disp|____|____, vtos, vtos, wide , _ ); | |
458 def(Bytecodes::_multianewarray , ubcp|____|clvm|____, vtos, atos, multianewarray , _ ); | |
459 def(Bytecodes::_ifnull , ubcp|____|clvm|____, atos, vtos, if_nullcmp , equal ); | |
460 def(Bytecodes::_ifnonnull , ubcp|____|clvm|____, atos, vtos, if_nullcmp , not_equal ); | |
461 def(Bytecodes::_goto_w , ubcp|____|clvm|____, vtos, vtos, goto_w , _ ); | |
462 def(Bytecodes::_jsr_w , ubcp|____|____|____, vtos, vtos, jsr_w , _ ); | |
463 | |
464 // wide Java spec bytecodes | |
465 def(Bytecodes::_iload , ubcp|____|____|iswd, vtos, itos, wide_iload , _ ); | |
466 def(Bytecodes::_lload , ubcp|____|____|iswd, vtos, ltos, wide_lload , _ ); | |
467 def(Bytecodes::_fload , ubcp|____|____|iswd, vtos, ftos, wide_fload , _ ); | |
468 def(Bytecodes::_dload , ubcp|____|____|iswd, vtos, dtos, wide_dload , _ ); | |
469 def(Bytecodes::_aload , ubcp|____|____|iswd, vtos, atos, wide_aload , _ ); | |
470 def(Bytecodes::_istore , ubcp|____|____|iswd, vtos, vtos, wide_istore , _ ); | |
471 def(Bytecodes::_lstore , ubcp|____|____|iswd, vtos, vtos, wide_lstore , _ ); | |
472 def(Bytecodes::_fstore , ubcp|____|____|iswd, vtos, vtos, wide_fstore , _ ); | |
473 def(Bytecodes::_dstore , ubcp|____|____|iswd, vtos, vtos, wide_dstore , _ ); | |
474 def(Bytecodes::_astore , ubcp|____|____|iswd, vtos, vtos, wide_astore , _ ); | |
475 def(Bytecodes::_iinc , ubcp|____|____|iswd, vtos, vtos, wide_iinc , _ ); | |
476 def(Bytecodes::_ret , ubcp|disp|____|iswd, vtos, vtos, wide_ret , _ ); | |
477 def(Bytecodes::_breakpoint , ubcp|disp|clvm|____, vtos, vtos, _breakpoint , _ ); | |
478 | |
479 // JVM bytecodes | |
480 def(Bytecodes::_fast_agetfield , ubcp|____|____|____, atos, atos, fast_accessfield , atos ); | |
481 def(Bytecodes::_fast_bgetfield , ubcp|____|____|____, atos, itos, fast_accessfield , itos ); | |
482 def(Bytecodes::_fast_cgetfield , ubcp|____|____|____, atos, itos, fast_accessfield , itos ); | |
483 def(Bytecodes::_fast_dgetfield , ubcp|____|____|____, atos, dtos, fast_accessfield , dtos ); | |
484 def(Bytecodes::_fast_fgetfield , ubcp|____|____|____, atos, ftos, fast_accessfield , ftos ); | |
485 def(Bytecodes::_fast_igetfield , ubcp|____|____|____, atos, itos, fast_accessfield , itos ); | |
486 def(Bytecodes::_fast_lgetfield , ubcp|____|____|____, atos, ltos, fast_accessfield , ltos ); | |
487 def(Bytecodes::_fast_sgetfield , ubcp|____|____|____, atos, itos, fast_accessfield , itos ); | |
488 | |
489 def(Bytecodes::_fast_aputfield , ubcp|____|____|____, atos, vtos, fast_storefield , atos ); | |
490 def(Bytecodes::_fast_bputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); | |
491 def(Bytecodes::_fast_cputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); | |
492 def(Bytecodes::_fast_dputfield , ubcp|____|____|____, dtos, vtos, fast_storefield , dtos ); | |
493 def(Bytecodes::_fast_fputfield , ubcp|____|____|____, ftos, vtos, fast_storefield , ftos ); | |
494 def(Bytecodes::_fast_iputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); | |
495 def(Bytecodes::_fast_lputfield , ubcp|____|____|____, ltos, vtos, fast_storefield , ltos ); | |
496 def(Bytecodes::_fast_sputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); | |
497 | |
498 def(Bytecodes::_fast_aload_0 , ____|____|____|____, vtos, atos, aload , 0 ); | |
499 def(Bytecodes::_fast_iaccess_0 , ubcp|____|____|____, vtos, itos, fast_xaccess , itos ); | |
500 def(Bytecodes::_fast_aaccess_0 , ubcp|____|____|____, vtos, atos, fast_xaccess , atos ); | |
501 def(Bytecodes::_fast_faccess_0 , ubcp|____|____|____, vtos, ftos, fast_xaccess , ftos ); | |
502 | |
503 def(Bytecodes::_fast_iload , ubcp|____|____|____, vtos, itos, fast_iload , _ ); | |
504 def(Bytecodes::_fast_iload2 , ubcp|____|____|____, vtos, itos, fast_iload2 , _ ); | |
505 def(Bytecodes::_fast_icaload , ubcp|____|____|____, vtos, itos, fast_icaload , _ ); | |
506 | |
1565 | 507 def(Bytecodes::_fast_invokevfinal , ubcp|disp|clvm|____, vtos, vtos, fast_invokevfinal , f2_byte ); |
0 | 508 |
509 def(Bytecodes::_fast_linearswitch , ubcp|disp|____|____, itos, vtos, fast_linearswitch , _ ); | |
510 def(Bytecodes::_fast_binaryswitch , ubcp|disp|____|____, itos, vtos, fast_binaryswitch , _ ); | |
511 | |
1602 | 512 def(Bytecodes::_fast_aldc , ubcp|____|clvm|____, vtos, atos, fast_aldc , false ); |
513 def(Bytecodes::_fast_aldc_w , ubcp|____|clvm|____, vtos, atos, fast_aldc , true ); | |
514 | |
0 | 515 def(Bytecodes::_return_register_finalizer , ____|disp|clvm|____, vtos, vtos, _return , vtos ); |
516 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
517 def(Bytecodes::_invokehandle , ubcp|disp|clvm|____, vtos, vtos, invokehandle , f1_byte ); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
1972
diff
changeset
|
518 |
0 | 519 def(Bytecodes::_shouldnotreachhere , ____|____|____|____, vtos, vtos, shouldnotreachhere , _ ); |
520 // platform specific bytecodes | |
521 pd_initialize(); | |
522 | |
523 _is_initialized = true; | |
524 } | |
525 | |
526 #if defined(TEMPLATE_TABLE_BUG) | |
527 #undef iload | |
528 #undef lload | |
529 #undef fload | |
530 #undef dload | |
531 #undef aload | |
532 #undef istore | |
533 #undef lstore | |
534 #undef fstore | |
535 #undef dstore | |
536 #undef astore | |
537 #endif // TEMPLATE_TABLE_BUG | |
538 | |
539 | |
540 void templateTable_init() { | |
541 TemplateTable::initialize(); | |
542 } | |
543 | |
544 | |
545 void TemplateTable::unimplemented_bc() { | |
546 _masm->unimplemented( Bytecodes::name(_desc->bytecode())); | |
547 } | |
548 #endif /* !CC_INTERP */ |