|
1 /* |
|
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
|
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 * |
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
20 * or visit www.oracle.com if you need additional information or have any |
|
21 * questions. |
|
22 * |
|
23 */ |
|
24 |
|
25 #include "precompiled.hpp" |
|
26 #include "gc_interface/collectedHeap.hpp" |
|
27 #include "interpreter/templateTable.hpp" |
|
28 #include "runtime/timer.hpp" |
|
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; |
|
177 BarrierSet* TemplateTable::_bs; |
|
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 |
|
250 _bs = Universe::heap()->barrier_set(); |
|
251 |
|
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 ); |
|
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 ); |
|
447 def(Bytecodes::_invokedynamic , ubcp|disp|clvm|____, vtos, vtos, invokedynamic , f1_byte ); |
|
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 |
|
507 def(Bytecodes::_fast_invokevfinal , ubcp|disp|clvm|____, vtos, vtos, fast_invokevfinal , f2_byte ); |
|
508 |
|
509 def(Bytecodes::_fast_linearswitch , ubcp|disp|____|____, itos, vtos, fast_linearswitch , _ ); |
|
510 def(Bytecodes::_fast_binaryswitch , ubcp|disp|____|____, itos, vtos, fast_binaryswitch , _ ); |
|
511 |
|
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 |
|
515 def(Bytecodes::_return_register_finalizer , ____|disp|clvm|____, vtos, vtos, _return , vtos ); |
|
516 |
|
517 def(Bytecodes::_invokehandle , ubcp|disp|clvm|____, vtos, vtos, invokehandle , f1_byte ); |
|
518 |
|
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 */ |