1 | /* |
2 | * Copyright (c) 1997, 2019, 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/shared/barrierSet.hpp" |
27 | #include "interpreter/interp_masm.hpp" |
28 | #include "interpreter/templateTable.hpp" |
29 | #include "runtime/timerTrace.hpp" |
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 | void TemplateTable::initialize() { |
226 | if (_is_initialized) return; |
227 | |
228 | // Initialize table |
229 | TraceTime timer("TemplateTable initialization" , TRACETIME_LOG(Info, startuptime)); |
230 | |
231 | _bs = BarrierSet::barrier_set(); |
232 | |
233 | // For better readability |
234 | const char _ = ' '; |
235 | const int ____ = 0; |
236 | const int ubcp = 1 << Template::uses_bcp_bit; |
237 | const int disp = 1 << Template::does_dispatch_bit; |
238 | const int clvm = 1 << Template::calls_vm_bit; |
239 | const int iswd = 1 << Template::wide_bit; |
240 | // interpr. templates |
241 | // Java spec bytecodes ubcp|disp|clvm|iswd in out generator argument |
242 | def(Bytecodes::_nop , ____|____|____|____, vtos, vtos, nop , _ ); |
243 | def(Bytecodes::_aconst_null , ____|____|____|____, vtos, atos, aconst_null , _ ); |
244 | def(Bytecodes::_iconst_m1 , ____|____|____|____, vtos, itos, iconst , -1 ); |
245 | def(Bytecodes::_iconst_0 , ____|____|____|____, vtos, itos, iconst , 0 ); |
246 | def(Bytecodes::_iconst_1 , ____|____|____|____, vtos, itos, iconst , 1 ); |
247 | def(Bytecodes::_iconst_2 , ____|____|____|____, vtos, itos, iconst , 2 ); |
248 | def(Bytecodes::_iconst_3 , ____|____|____|____, vtos, itos, iconst , 3 ); |
249 | def(Bytecodes::_iconst_4 , ____|____|____|____, vtos, itos, iconst , 4 ); |
250 | def(Bytecodes::_iconst_5 , ____|____|____|____, vtos, itos, iconst , 5 ); |
251 | def(Bytecodes::_lconst_0 , ____|____|____|____, vtos, ltos, lconst , 0 ); |
252 | def(Bytecodes::_lconst_1 , ____|____|____|____, vtos, ltos, lconst , 1 ); |
253 | def(Bytecodes::_fconst_0 , ____|____|____|____, vtos, ftos, fconst , 0 ); |
254 | def(Bytecodes::_fconst_1 , ____|____|____|____, vtos, ftos, fconst , 1 ); |
255 | def(Bytecodes::_fconst_2 , ____|____|____|____, vtos, ftos, fconst , 2 ); |
256 | def(Bytecodes::_dconst_0 , ____|____|____|____, vtos, dtos, dconst , 0 ); |
257 | def(Bytecodes::_dconst_1 , ____|____|____|____, vtos, dtos, dconst , 1 ); |
258 | def(Bytecodes::_bipush , ubcp|____|____|____, vtos, itos, bipush , _ ); |
259 | def(Bytecodes::_sipush , ubcp|____|____|____, vtos, itos, sipush , _ ); |
260 | def(Bytecodes::_ldc , ubcp|____|clvm|____, vtos, vtos, ldc , false ); |
261 | def(Bytecodes::_ldc_w , ubcp|____|clvm|____, vtos, vtos, ldc , true ); |
262 | def(Bytecodes::_ldc2_w , ubcp|____|clvm|____, vtos, vtos, ldc2_w , _ ); |
263 | def(Bytecodes::_iload , ubcp|____|clvm|____, vtos, itos, iload , _ ); |
264 | def(Bytecodes::_lload , ubcp|____|____|____, vtos, ltos, lload , _ ); |
265 | def(Bytecodes::_fload , ubcp|____|____|____, vtos, ftos, fload , _ ); |
266 | def(Bytecodes::_dload , ubcp|____|____|____, vtos, dtos, dload , _ ); |
267 | def(Bytecodes::_aload , ubcp|____|clvm|____, vtos, atos, aload , _ ); |
268 | def(Bytecodes::_iload_0 , ____|____|____|____, vtos, itos, iload , 0 ); |
269 | def(Bytecodes::_iload_1 , ____|____|____|____, vtos, itos, iload , 1 ); |
270 | def(Bytecodes::_iload_2 , ____|____|____|____, vtos, itos, iload , 2 ); |
271 | def(Bytecodes::_iload_3 , ____|____|____|____, vtos, itos, iload , 3 ); |
272 | def(Bytecodes::_lload_0 , ____|____|____|____, vtos, ltos, lload , 0 ); |
273 | def(Bytecodes::_lload_1 , ____|____|____|____, vtos, ltos, lload , 1 ); |
274 | def(Bytecodes::_lload_2 , ____|____|____|____, vtos, ltos, lload , 2 ); |
275 | def(Bytecodes::_lload_3 , ____|____|____|____, vtos, ltos, lload , 3 ); |
276 | def(Bytecodes::_fload_0 , ____|____|____|____, vtos, ftos, fload , 0 ); |
277 | def(Bytecodes::_fload_1 , ____|____|____|____, vtos, ftos, fload , 1 ); |
278 | def(Bytecodes::_fload_2 , ____|____|____|____, vtos, ftos, fload , 2 ); |
279 | def(Bytecodes::_fload_3 , ____|____|____|____, vtos, ftos, fload , 3 ); |
280 | def(Bytecodes::_dload_0 , ____|____|____|____, vtos, dtos, dload , 0 ); |
281 | def(Bytecodes::_dload_1 , ____|____|____|____, vtos, dtos, dload , 1 ); |
282 | def(Bytecodes::_dload_2 , ____|____|____|____, vtos, dtos, dload , 2 ); |
283 | def(Bytecodes::_dload_3 , ____|____|____|____, vtos, dtos, dload , 3 ); |
284 | def(Bytecodes::_aload_0 , ubcp|____|clvm|____, vtos, atos, aload_0 , _ ); |
285 | def(Bytecodes::_aload_1 , ____|____|____|____, vtos, atos, aload , 1 ); |
286 | def(Bytecodes::_aload_2 , ____|____|____|____, vtos, atos, aload , 2 ); |
287 | def(Bytecodes::_aload_3 , ____|____|____|____, vtos, atos, aload , 3 ); |
288 | def(Bytecodes::_iaload , ____|____|____|____, itos, itos, iaload , _ ); |
289 | def(Bytecodes::_laload , ____|____|____|____, itos, ltos, laload , _ ); |
290 | def(Bytecodes::_faload , ____|____|____|____, itos, ftos, faload , _ ); |
291 | def(Bytecodes::_daload , ____|____|____|____, itos, dtos, daload , _ ); |
292 | def(Bytecodes::_aaload , ____|____|____|____, itos, atos, aaload , _ ); |
293 | def(Bytecodes::_baload , ____|____|____|____, itos, itos, baload , _ ); |
294 | def(Bytecodes::_caload , ____|____|____|____, itos, itos, caload , _ ); |
295 | def(Bytecodes::_saload , ____|____|____|____, itos, itos, saload , _ ); |
296 | def(Bytecodes::_istore , ubcp|____|clvm|____, itos, vtos, istore , _ ); |
297 | def(Bytecodes::_lstore , ubcp|____|____|____, ltos, vtos, lstore , _ ); |
298 | def(Bytecodes::_fstore , ubcp|____|____|____, ftos, vtos, fstore , _ ); |
299 | def(Bytecodes::_dstore , ubcp|____|____|____, dtos, vtos, dstore , _ ); |
300 | def(Bytecodes::_astore , ubcp|____|clvm|____, vtos, vtos, astore , _ ); |
301 | def(Bytecodes::_istore_0 , ____|____|____|____, itos, vtos, istore , 0 ); |
302 | def(Bytecodes::_istore_1 , ____|____|____|____, itos, vtos, istore , 1 ); |
303 | def(Bytecodes::_istore_2 , ____|____|____|____, itos, vtos, istore , 2 ); |
304 | def(Bytecodes::_istore_3 , ____|____|____|____, itos, vtos, istore , 3 ); |
305 | def(Bytecodes::_lstore_0 , ____|____|____|____, ltos, vtos, lstore , 0 ); |
306 | def(Bytecodes::_lstore_1 , ____|____|____|____, ltos, vtos, lstore , 1 ); |
307 | def(Bytecodes::_lstore_2 , ____|____|____|____, ltos, vtos, lstore , 2 ); |
308 | def(Bytecodes::_lstore_3 , ____|____|____|____, ltos, vtos, lstore , 3 ); |
309 | def(Bytecodes::_fstore_0 , ____|____|____|____, ftos, vtos, fstore , 0 ); |
310 | def(Bytecodes::_fstore_1 , ____|____|____|____, ftos, vtos, fstore , 1 ); |
311 | def(Bytecodes::_fstore_2 , ____|____|____|____, ftos, vtos, fstore , 2 ); |
312 | def(Bytecodes::_fstore_3 , ____|____|____|____, ftos, vtos, fstore , 3 ); |
313 | def(Bytecodes::_dstore_0 , ____|____|____|____, dtos, vtos, dstore , 0 ); |
314 | def(Bytecodes::_dstore_1 , ____|____|____|____, dtos, vtos, dstore , 1 ); |
315 | def(Bytecodes::_dstore_2 , ____|____|____|____, dtos, vtos, dstore , 2 ); |
316 | def(Bytecodes::_dstore_3 , ____|____|____|____, dtos, vtos, dstore , 3 ); |
317 | def(Bytecodes::_astore_0 , ____|____|____|____, vtos, vtos, astore , 0 ); |
318 | def(Bytecodes::_astore_1 , ____|____|____|____, vtos, vtos, astore , 1 ); |
319 | def(Bytecodes::_astore_2 , ____|____|____|____, vtos, vtos, astore , 2 ); |
320 | def(Bytecodes::_astore_3 , ____|____|____|____, vtos, vtos, astore , 3 ); |
321 | def(Bytecodes::_iastore , ____|____|____|____, itos, vtos, iastore , _ ); |
322 | def(Bytecodes::_lastore , ____|____|____|____, ltos, vtos, lastore , _ ); |
323 | def(Bytecodes::_fastore , ____|____|____|____, ftos, vtos, fastore , _ ); |
324 | def(Bytecodes::_dastore , ____|____|____|____, dtos, vtos, dastore , _ ); |
325 | def(Bytecodes::_aastore , ____|____|clvm|____, vtos, vtos, aastore , _ ); |
326 | def(Bytecodes::_bastore , ____|____|____|____, itos, vtos, bastore , _ ); |
327 | def(Bytecodes::_castore , ____|____|____|____, itos, vtos, castore , _ ); |
328 | def(Bytecodes::_sastore , ____|____|____|____, itos, vtos, sastore , _ ); |
329 | def(Bytecodes::_pop , ____|____|____|____, vtos, vtos, pop , _ ); |
330 | def(Bytecodes::_pop2 , ____|____|____|____, vtos, vtos, pop2 , _ ); |
331 | def(Bytecodes::_dup , ____|____|____|____, vtos, vtos, dup , _ ); |
332 | def(Bytecodes::_dup_x1 , ____|____|____|____, vtos, vtos, dup_x1 , _ ); |
333 | def(Bytecodes::_dup_x2 , ____|____|____|____, vtos, vtos, dup_x2 , _ ); |
334 | def(Bytecodes::_dup2 , ____|____|____|____, vtos, vtos, dup2 , _ ); |
335 | def(Bytecodes::_dup2_x1 , ____|____|____|____, vtos, vtos, dup2_x1 , _ ); |
336 | def(Bytecodes::_dup2_x2 , ____|____|____|____, vtos, vtos, dup2_x2 , _ ); |
337 | def(Bytecodes::_swap , ____|____|____|____, vtos, vtos, swap , _ ); |
338 | def(Bytecodes::_iadd , ____|____|____|____, itos, itos, iop2 , add ); |
339 | def(Bytecodes::_ladd , ____|____|____|____, ltos, ltos, lop2 , add ); |
340 | def(Bytecodes::_fadd , ____|____|____|____, ftos, ftos, fop2 , add ); |
341 | def(Bytecodes::_dadd , ____|____|____|____, dtos, dtos, dop2 , add ); |
342 | def(Bytecodes::_isub , ____|____|____|____, itos, itos, iop2 , sub ); |
343 | def(Bytecodes::_lsub , ____|____|____|____, ltos, ltos, lop2 , sub ); |
344 | def(Bytecodes::_fsub , ____|____|____|____, ftos, ftos, fop2 , sub ); |
345 | def(Bytecodes::_dsub , ____|____|____|____, dtos, dtos, dop2 , sub ); |
346 | def(Bytecodes::_imul , ____|____|____|____, itos, itos, iop2 , mul ); |
347 | def(Bytecodes::_lmul , ____|____|____|____, ltos, ltos, lmul , _ ); |
348 | def(Bytecodes::_fmul , ____|____|____|____, ftos, ftos, fop2 , mul ); |
349 | def(Bytecodes::_dmul , ____|____|____|____, dtos, dtos, dop2 , mul ); |
350 | def(Bytecodes::_idiv , ____|____|____|____, itos, itos, idiv , _ ); |
351 | def(Bytecodes::_ldiv , ____|____|____|____, ltos, ltos, ldiv , _ ); |
352 | def(Bytecodes::_fdiv , ____|____|____|____, ftos, ftos, fop2 , div ); |
353 | def(Bytecodes::_ddiv , ____|____|____|____, dtos, dtos, dop2 , div ); |
354 | def(Bytecodes::_irem , ____|____|____|____, itos, itos, irem , _ ); |
355 | def(Bytecodes::_lrem , ____|____|____|____, ltos, ltos, lrem , _ ); |
356 | def(Bytecodes::_frem , ____|____|____|____, ftos, ftos, fop2 , rem ); |
357 | def(Bytecodes::_drem , ____|____|____|____, dtos, dtos, dop2 , rem ); |
358 | def(Bytecodes::_ineg , ____|____|____|____, itos, itos, ineg , _ ); |
359 | def(Bytecodes::_lneg , ____|____|____|____, ltos, ltos, lneg , _ ); |
360 | def(Bytecodes::_fneg , ____|____|____|____, ftos, ftos, fneg , _ ); |
361 | def(Bytecodes::_dneg , ____|____|____|____, dtos, dtos, dneg , _ ); |
362 | def(Bytecodes::_ishl , ____|____|____|____, itos, itos, iop2 , shl ); |
363 | def(Bytecodes::_lshl , ____|____|____|____, itos, ltos, lshl , _ ); |
364 | def(Bytecodes::_ishr , ____|____|____|____, itos, itos, iop2 , shr ); |
365 | def(Bytecodes::_lshr , ____|____|____|____, itos, ltos, lshr , _ ); |
366 | def(Bytecodes::_iushr , ____|____|____|____, itos, itos, iop2 , ushr ); |
367 | def(Bytecodes::_lushr , ____|____|____|____, itos, ltos, lushr , _ ); |
368 | def(Bytecodes::_iand , ____|____|____|____, itos, itos, iop2 , _and ); |
369 | def(Bytecodes::_land , ____|____|____|____, ltos, ltos, lop2 , _and ); |
370 | def(Bytecodes::_ior , ____|____|____|____, itos, itos, iop2 , _or ); |
371 | def(Bytecodes::_lor , ____|____|____|____, ltos, ltos, lop2 , _or ); |
372 | def(Bytecodes::_ixor , ____|____|____|____, itos, itos, iop2 , _xor ); |
373 | def(Bytecodes::_lxor , ____|____|____|____, ltos, ltos, lop2 , _xor ); |
374 | def(Bytecodes::_iinc , ubcp|____|clvm|____, vtos, vtos, iinc , _ ); |
375 | def(Bytecodes::_i2l , ____|____|____|____, itos, ltos, convert , _ ); |
376 | def(Bytecodes::_i2f , ____|____|____|____, itos, ftos, convert , _ ); |
377 | def(Bytecodes::_i2d , ____|____|____|____, itos, dtos, convert , _ ); |
378 | def(Bytecodes::_l2i , ____|____|____|____, ltos, itos, convert , _ ); |
379 | def(Bytecodes::_l2f , ____|____|____|____, ltos, ftos, convert , _ ); |
380 | def(Bytecodes::_l2d , ____|____|____|____, ltos, dtos, convert , _ ); |
381 | def(Bytecodes::_f2i , ____|____|____|____, ftos, itos, convert , _ ); |
382 | def(Bytecodes::_f2l , ____|____|____|____, ftos, ltos, convert , _ ); |
383 | def(Bytecodes::_f2d , ____|____|____|____, ftos, dtos, convert , _ ); |
384 | def(Bytecodes::_d2i , ____|____|____|____, dtos, itos, convert , _ ); |
385 | def(Bytecodes::_d2l , ____|____|____|____, dtos, ltos, convert , _ ); |
386 | def(Bytecodes::_d2f , ____|____|____|____, dtos, ftos, convert , _ ); |
387 | def(Bytecodes::_i2b , ____|____|____|____, itos, itos, convert , _ ); |
388 | def(Bytecodes::_i2c , ____|____|____|____, itos, itos, convert , _ ); |
389 | def(Bytecodes::_i2s , ____|____|____|____, itos, itos, convert , _ ); |
390 | def(Bytecodes::_lcmp , ____|____|____|____, ltos, itos, lcmp , _ ); |
391 | def(Bytecodes::_fcmpl , ____|____|____|____, ftos, itos, float_cmp , -1 ); |
392 | def(Bytecodes::_fcmpg , ____|____|____|____, ftos, itos, float_cmp , 1 ); |
393 | def(Bytecodes::_dcmpl , ____|____|____|____, dtos, itos, double_cmp , -1 ); |
394 | def(Bytecodes::_dcmpg , ____|____|____|____, dtos, itos, double_cmp , 1 ); |
395 | def(Bytecodes::_ifeq , ubcp|____|clvm|____, itos, vtos, if_0cmp , equal ); |
396 | def(Bytecodes::_ifne , ubcp|____|clvm|____, itos, vtos, if_0cmp , not_equal ); |
397 | def(Bytecodes::_iflt , ubcp|____|clvm|____, itos, vtos, if_0cmp , less ); |
398 | def(Bytecodes::_ifge , ubcp|____|clvm|____, itos, vtos, if_0cmp , greater_equal); |
399 | def(Bytecodes::_ifgt , ubcp|____|clvm|____, itos, vtos, if_0cmp , greater ); |
400 | def(Bytecodes::_ifle , ubcp|____|clvm|____, itos, vtos, if_0cmp , less_equal ); |
401 | def(Bytecodes::_if_icmpeq , ubcp|____|clvm|____, itos, vtos, if_icmp , equal ); |
402 | def(Bytecodes::_if_icmpne , ubcp|____|clvm|____, itos, vtos, if_icmp , not_equal ); |
403 | def(Bytecodes::_if_icmplt , ubcp|____|clvm|____, itos, vtos, if_icmp , less ); |
404 | def(Bytecodes::_if_icmpge , ubcp|____|clvm|____, itos, vtos, if_icmp , greater_equal); |
405 | def(Bytecodes::_if_icmpgt , ubcp|____|clvm|____, itos, vtos, if_icmp , greater ); |
406 | def(Bytecodes::_if_icmple , ubcp|____|clvm|____, itos, vtos, if_icmp , less_equal ); |
407 | def(Bytecodes::_if_acmpeq , ubcp|____|clvm|____, atos, vtos, if_acmp , equal ); |
408 | def(Bytecodes::_if_acmpne , ubcp|____|clvm|____, atos, vtos, if_acmp , not_equal ); |
409 | def(Bytecodes::_goto , ubcp|disp|clvm|____, vtos, vtos, _goto , _ ); |
410 | def(Bytecodes::_jsr , ubcp|disp|____|____, vtos, vtos, jsr , _ ); // result is not an oop, so do not transition to atos |
411 | def(Bytecodes::_ret , ubcp|disp|____|____, vtos, vtos, ret , _ ); |
412 | def(Bytecodes::_tableswitch , ubcp|disp|____|____, itos, vtos, tableswitch , _ ); |
413 | def(Bytecodes::_lookupswitch , ubcp|disp|____|____, itos, itos, lookupswitch , _ ); |
414 | def(Bytecodes::_ireturn , ____|disp|clvm|____, itos, itos, _return , itos ); |
415 | def(Bytecodes::_lreturn , ____|disp|clvm|____, ltos, ltos, _return , ltos ); |
416 | def(Bytecodes::_freturn , ____|disp|clvm|____, ftos, ftos, _return , ftos ); |
417 | def(Bytecodes::_dreturn , ____|disp|clvm|____, dtos, dtos, _return , dtos ); |
418 | def(Bytecodes::_areturn , ____|disp|clvm|____, atos, atos, _return , atos ); |
419 | def(Bytecodes::_return , ____|disp|clvm|____, vtos, vtos, _return , vtos ); |
420 | def(Bytecodes::_getstatic , ubcp|____|clvm|____, vtos, vtos, getstatic , f1_byte ); |
421 | def(Bytecodes::_putstatic , ubcp|____|clvm|____, vtos, vtos, putstatic , f2_byte ); |
422 | def(Bytecodes::_getfield , ubcp|____|clvm|____, vtos, vtos, getfield , f1_byte ); |
423 | def(Bytecodes::_putfield , ubcp|____|clvm|____, vtos, vtos, putfield , f2_byte ); |
424 | def(Bytecodes::_invokevirtual , ubcp|disp|clvm|____, vtos, vtos, invokevirtual , f2_byte ); |
425 | def(Bytecodes::_invokespecial , ubcp|disp|clvm|____, vtos, vtos, invokespecial , f1_byte ); |
426 | def(Bytecodes::_invokestatic , ubcp|disp|clvm|____, vtos, vtos, invokestatic , f1_byte ); |
427 | def(Bytecodes::_invokeinterface , ubcp|disp|clvm|____, vtos, vtos, invokeinterface , f1_byte ); |
428 | def(Bytecodes::_invokedynamic , ubcp|disp|clvm|____, vtos, vtos, invokedynamic , f1_byte ); |
429 | def(Bytecodes::_new , ubcp|____|clvm|____, vtos, atos, _new , _ ); |
430 | def(Bytecodes::_newarray , ubcp|____|clvm|____, itos, atos, newarray , _ ); |
431 | def(Bytecodes::_anewarray , ubcp|____|clvm|____, itos, atos, anewarray , _ ); |
432 | def(Bytecodes::_arraylength , ____|____|____|____, atos, itos, arraylength , _ ); |
433 | def(Bytecodes::_athrow , ____|disp|____|____, atos, vtos, athrow , _ ); |
434 | def(Bytecodes::_checkcast , ubcp|____|clvm|____, atos, atos, checkcast , _ ); |
435 | def(Bytecodes::_instanceof , ubcp|____|clvm|____, atos, itos, instanceof , _ ); |
436 | def(Bytecodes::_monitorenter , ____|disp|clvm|____, atos, vtos, monitorenter , _ ); |
437 | def(Bytecodes::_monitorexit , ____|____|clvm|____, atos, vtos, monitorexit , _ ); |
438 | def(Bytecodes::_wide , ubcp|disp|____|____, vtos, vtos, wide , _ ); |
439 | def(Bytecodes::_multianewarray , ubcp|____|clvm|____, vtos, atos, multianewarray , _ ); |
440 | def(Bytecodes::_ifnull , ubcp|____|clvm|____, atos, vtos, if_nullcmp , equal ); |
441 | def(Bytecodes::_ifnonnull , ubcp|____|clvm|____, atos, vtos, if_nullcmp , not_equal ); |
442 | def(Bytecodes::_goto_w , ubcp|____|clvm|____, vtos, vtos, goto_w , _ ); |
443 | def(Bytecodes::_jsr_w , ubcp|____|____|____, vtos, vtos, jsr_w , _ ); |
444 | |
445 | // wide Java spec bytecodes |
446 | def(Bytecodes::_iload , ubcp|____|____|iswd, vtos, itos, wide_iload , _ ); |
447 | def(Bytecodes::_lload , ubcp|____|____|iswd, vtos, ltos, wide_lload , _ ); |
448 | def(Bytecodes::_fload , ubcp|____|____|iswd, vtos, ftos, wide_fload , _ ); |
449 | def(Bytecodes::_dload , ubcp|____|____|iswd, vtos, dtos, wide_dload , _ ); |
450 | def(Bytecodes::_aload , ubcp|____|____|iswd, vtos, atos, wide_aload , _ ); |
451 | def(Bytecodes::_istore , ubcp|____|____|iswd, vtos, vtos, wide_istore , _ ); |
452 | def(Bytecodes::_lstore , ubcp|____|____|iswd, vtos, vtos, wide_lstore , _ ); |
453 | def(Bytecodes::_fstore , ubcp|____|____|iswd, vtos, vtos, wide_fstore , _ ); |
454 | def(Bytecodes::_dstore , ubcp|____|____|iswd, vtos, vtos, wide_dstore , _ ); |
455 | def(Bytecodes::_astore , ubcp|____|____|iswd, vtos, vtos, wide_astore , _ ); |
456 | def(Bytecodes::_iinc , ubcp|____|____|iswd, vtos, vtos, wide_iinc , _ ); |
457 | def(Bytecodes::_ret , ubcp|disp|____|iswd, vtos, vtos, wide_ret , _ ); |
458 | def(Bytecodes::_breakpoint , ubcp|disp|clvm|____, vtos, vtos, _breakpoint , _ ); |
459 | |
460 | // JVM bytecodes |
461 | def(Bytecodes::_fast_agetfield , ubcp|____|____|____, atos, atos, fast_accessfield , atos ); |
462 | def(Bytecodes::_fast_bgetfield , ubcp|____|____|____, atos, itos, fast_accessfield , itos ); |
463 | def(Bytecodes::_fast_cgetfield , ubcp|____|____|____, atos, itos, fast_accessfield , itos ); |
464 | def(Bytecodes::_fast_dgetfield , ubcp|____|____|____, atos, dtos, fast_accessfield , dtos ); |
465 | def(Bytecodes::_fast_fgetfield , ubcp|____|____|____, atos, ftos, fast_accessfield , ftos ); |
466 | def(Bytecodes::_fast_igetfield , ubcp|____|____|____, atos, itos, fast_accessfield , itos ); |
467 | def(Bytecodes::_fast_lgetfield , ubcp|____|____|____, atos, ltos, fast_accessfield , ltos ); |
468 | def(Bytecodes::_fast_sgetfield , ubcp|____|____|____, atos, itos, fast_accessfield , itos ); |
469 | |
470 | def(Bytecodes::_fast_aputfield , ubcp|____|____|____, atos, vtos, fast_storefield , atos ); |
471 | def(Bytecodes::_fast_bputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); |
472 | def(Bytecodes::_fast_zputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); |
473 | def(Bytecodes::_fast_cputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); |
474 | def(Bytecodes::_fast_dputfield , ubcp|____|____|____, dtos, vtos, fast_storefield , dtos ); |
475 | def(Bytecodes::_fast_fputfield , ubcp|____|____|____, ftos, vtos, fast_storefield , ftos ); |
476 | def(Bytecodes::_fast_iputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); |
477 | def(Bytecodes::_fast_lputfield , ubcp|____|____|____, ltos, vtos, fast_storefield , ltos ); |
478 | def(Bytecodes::_fast_sputfield , ubcp|____|____|____, itos, vtos, fast_storefield , itos ); |
479 | |
480 | def(Bytecodes::_fast_aload_0 , ____|____|____|____, vtos, atos, aload , 0 ); |
481 | def(Bytecodes::_fast_iaccess_0 , ubcp|____|____|____, vtos, itos, fast_xaccess , itos ); |
482 | def(Bytecodes::_fast_aaccess_0 , ubcp|____|____|____, vtos, atos, fast_xaccess , atos ); |
483 | def(Bytecodes::_fast_faccess_0 , ubcp|____|____|____, vtos, ftos, fast_xaccess , ftos ); |
484 | |
485 | def(Bytecodes::_fast_iload , ubcp|____|____|____, vtos, itos, fast_iload , _ ); |
486 | def(Bytecodes::_fast_iload2 , ubcp|____|____|____, vtos, itos, fast_iload2 , _ ); |
487 | def(Bytecodes::_fast_icaload , ubcp|____|____|____, vtos, itos, fast_icaload , _ ); |
488 | |
489 | def(Bytecodes::_fast_invokevfinal , ubcp|disp|clvm|____, vtos, vtos, fast_invokevfinal , f2_byte ); |
490 | |
491 | def(Bytecodes::_fast_linearswitch , ubcp|disp|____|____, itos, vtos, fast_linearswitch , _ ); |
492 | def(Bytecodes::_fast_binaryswitch , ubcp|disp|____|____, itos, vtos, fast_binaryswitch , _ ); |
493 | |
494 | def(Bytecodes::_fast_aldc , ubcp|____|clvm|____, vtos, atos, fast_aldc , false ); |
495 | def(Bytecodes::_fast_aldc_w , ubcp|____|clvm|____, vtos, atos, fast_aldc , true ); |
496 | |
497 | def(Bytecodes::_return_register_finalizer , ____|disp|clvm|____, vtos, vtos, _return , vtos ); |
498 | |
499 | def(Bytecodes::_invokehandle , ubcp|disp|clvm|____, vtos, vtos, invokehandle , f1_byte ); |
500 | |
501 | def(Bytecodes::_nofast_getfield , ubcp|____|clvm|____, vtos, vtos, nofast_getfield , f1_byte ); |
502 | def(Bytecodes::_nofast_putfield , ubcp|____|clvm|____, vtos, vtos, nofast_putfield , f2_byte ); |
503 | |
504 | def(Bytecodes::_nofast_aload_0 , ____|____|clvm|____, vtos, atos, nofast_aload_0 , _ ); |
505 | def(Bytecodes::_nofast_iload , ubcp|____|clvm|____, vtos, itos, nofast_iload , _ ); |
506 | |
507 | def(Bytecodes::_shouldnotreachhere , ____|____|____|____, vtos, vtos, shouldnotreachhere , _ ); |
508 | // platform specific bytecodes |
509 | pd_initialize(); |
510 | |
511 | _is_initialized = true; |
512 | } |
513 | |
514 | void templateTable_init() { |
515 | TemplateTable::initialize(); |
516 | } |
517 | |
518 | |
519 | void TemplateTable::unimplemented_bc() { |
520 | _masm->unimplemented( Bytecodes::name(_desc->bytecode())); |
521 | } |
522 | #endif /* !CC_INTERP */ |
523 | |