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