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