1 #ifdef USE_PRAGMA_IDENT_SRC
   2 #pragma ident "@(#)templateTable.cpp    1.108 07/05/05 17:05:37 JVM"
   3 #endif
   4 /*
   5  * Copyright 1997-2005 Sun Microsystems, Inc.  All Rights Reserved.
   6  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   7  *
   8  * This code is free software; you can redistribute it and/or modify it
   9  * under the terms of the GNU General Public License version 2 only, as
  10  * published by the Free Software Foundation.
  11  *
  12  * This code is distributed in the hope that it will be useful, but WITHOUT
  13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  15  * version 2 for more details (a copy is included in the LICENSE file that
  16  * accompanied this code).
  17  *
  18  * You should have received a copy of the GNU General Public License version
  19  * 2 along with this work; if not, write to the Free Software Foundation,
  20  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  21  *
  22  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  23  * CA 95054 USA or visit www.sun.com if you need additional information or
  24  * have any questions.
  25  *  
  26  */
  27 
  28 #include "incls/_precompiled.incl"
  29 #include "incls/_templateTable.cpp.incl"
  30 
  31 
  32 #ifdef CC_INTERP
  33 
  34 void templateTable_init() {
  35 }
  36 
  37 #else
  38 
  39 //----------------------------------------------------------------------------------------------------
  40 // Implementation of Template
  41 
  42 
  43 void 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 
  52 Bytecodes::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 
  59 void 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 
  72 void 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 
  78 void 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 
  84 void 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 
  90 void 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 
  96 void 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 
 102 void 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 
 108 void 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 
 114 void 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 
 123 void TemplateTable::float_cmp(int unordered_result) {
 124   transition(ftos, itos);
 125   float_cmp(true, unordered_result);
 126 }
 127 
 128 
 129 void TemplateTable::double_cmp(int unordered_result) {
 130   transition(dtos, itos);
 131   float_cmp(false, unordered_result);
 132 }
 133 
 134 
 135 void TemplateTable::_goto() {
 136   transition(vtos, vtos);
 137   branch(false, false);
 138 }
 139 
 140 
 141 void TemplateTable::goto_w() {
 142   transition(vtos, vtos);
 143   branch(false, true);
 144 }
 145 
 146 
 147 void 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 
 153 void 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 
 163 void 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 
 172 bool                       TemplateTable::_is_initialized = false;
 173 Template                   TemplateTable::_template_table     [Bytecodes::number_of_codes];
 174 Template                   TemplateTable::_template_table_wide[Bytecodes::number_of_codes];
 175 
 176 Template*                  TemplateTable::_desc;
 177 InterpreterMacroAssembler* TemplateTable::_masm;
 178 
 179 
 180 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(), char filler) {
 181   assert(filler == ' ', "just checkin'");
 182   def(code, flags, in, out, (Template::generator)gen, 0);
 183 }
 184 
 185 
 186 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(int arg), int arg) {
 187   // should factor out these constants
 188   const int ubcp = 1 << Template::uses_bcp_bit;
 189   const int disp = 1 << Template::does_dispatch_bit;
 190   const int clvm = 1 << Template::calls_vm_bit;
 191   const int iswd = 1 << Template::wide_bit;
 192   // determine which table to use
 193   bool is_wide = (flags & iswd) != 0;
 194   // make sure that wide instructions have a vtos entry point
 195   // (since they are executed extremely rarely, it doesn't pay out to have an
 196   // extra set of 5 dispatch tables for the wide instructions - for simplicity
 197   // they all go with one table)
 198   assert(in == vtos || !is_wide, "wide instructions have vtos entry point only");
 199   Template* t = is_wide ? template_for_wide(code) : template_for(code);
 200   // setup entry
 201   t->initialize(flags, in, out, gen, arg);
 202   assert(t->bytecode() == code, "just checkin'");
 203 }
 204 
 205 
 206 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(Operation op), Operation op) {
 207   def(code, flags, in, out, (Template::generator)gen, (int)op);
 208 }
 209 
 210 
 211 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(bool arg    ), bool arg) {
 212   def(code, flags, in, out, (Template::generator)gen, (int)arg);
 213 }
 214 
 215 
 216 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(TosState tos), TosState tos) {
 217   def(code, flags, in, out, (Template::generator)gen, (int)tos);
 218 }
 219 
 220 
 221 void TemplateTable::def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(Condition cc), Condition cc) {
 222   def(code, flags, in, out, (Template::generator)gen, (int)cc);
 223 }
 224 
 225 #if defined(TEMPLATE_TABLE_BUG)
 226 //
 227 // It appears that gcc (version 2.91) generates bad code for the template
 228 // table init if this macro is not defined.  My symptom was an assertion
 229 // assert(Universe::heap()->is_in(obj), "sanity check") in handles.cpp line 24.
 230 // when called from interpreterRuntime.resolve_invoke().
 231 //
 232   #define iload  TemplateTable::iload
 233   #define lload  TemplateTable::lload
 234   #define fload  TemplateTable::fload
 235   #define dload  TemplateTable::dload
 236   #define aload  TemplateTable::aload
 237   #define istore TemplateTable::istore
 238   #define lstore TemplateTable::lstore
 239   #define fstore TemplateTable::fstore
 240   #define dstore TemplateTable::dstore
 241   #define astore TemplateTable::astore
 242 #endif // TEMPLATE_TABLE_BUG
 243 
 244 void TemplateTable::initialize() {
 245   if (_is_initialized) return;
 246 
 247   // Initialize table
 248   TraceTime timer("TemplateTable initialization", TraceStartupTime);
 249 
 250   // For better readability
 251   const char _    = ' ';
 252   const int  ____ = 0;
 253   const int  ubcp = 1 << Template::uses_bcp_bit;
 254   const int  disp = 1 << Template::does_dispatch_bit;
 255   const int  clvm = 1 << Template::calls_vm_bit;
 256   const int  iswd = 1 << Template::wide_bit;
 257   //                                    interpr. templates                                                  
 258   // Java spec bytecodes                ubcp|disp|clvm|iswd  in    out   generator             argument     
 259   def(Bytecodes::_nop                 , ____|____|____|____, vtos, vtos, nop                 ,  _           );
 260   def(Bytecodes::_aconst_null         , ____|____|____|____, vtos, atos, aconst_null         ,  _           );
 261   def(Bytecodes::_iconst_m1           , ____|____|____|____, vtos, itos, iconst              , -1           );
 262   def(Bytecodes::_iconst_0            , ____|____|____|____, vtos, itos, iconst              ,  0           );
 263   def(Bytecodes::_iconst_1            , ____|____|____|____, vtos, itos, iconst              ,  1           );
 264   def(Bytecodes::_iconst_2            , ____|____|____|____, vtos, itos, iconst              ,  2           );
 265   def(Bytecodes::_iconst_3            , ____|____|____|____, vtos, itos, iconst              ,  3           );
 266   def(Bytecodes::_iconst_4            , ____|____|____|____, vtos, itos, iconst              ,  4           );
 267   def(Bytecodes::_iconst_5            , ____|____|____|____, vtos, itos, iconst              ,  5           );
 268   def(Bytecodes::_lconst_0            , ____|____|____|____, vtos, ltos, lconst              ,  0           );
 269   def(Bytecodes::_lconst_1            , ____|____|____|____, vtos, ltos, lconst              ,  1           );
 270   def(Bytecodes::_fconst_0            , ____|____|____|____, vtos, ftos, fconst              ,  0           );
 271   def(Bytecodes::_fconst_1            , ____|____|____|____, vtos, ftos, fconst              ,  1           );
 272   def(Bytecodes::_fconst_2            , ____|____|____|____, vtos, ftos, fconst              ,  2           );
 273   def(Bytecodes::_dconst_0            , ____|____|____|____, vtos, dtos, dconst              ,  0           );
 274   def(Bytecodes::_dconst_1            , ____|____|____|____, vtos, dtos, dconst              ,  1           );
 275   def(Bytecodes::_bipush              , ubcp|____|____|____, vtos, itos, bipush              ,  _           );
 276   def(Bytecodes::_sipush              , ubcp|____|____|____, vtos, itos, sipush              ,  _           );
 277   def(Bytecodes::_ldc                 , ubcp|____|clvm|____, vtos, vtos, ldc                 ,  false       );
 278   def(Bytecodes::_ldc_w               , ubcp|____|clvm|____, vtos, vtos, ldc                 ,  true        );
 279   def(Bytecodes::_ldc2_w              , ubcp|____|____|____, vtos, vtos, ldc2_w              ,  _           );
 280   def(Bytecodes::_iload               , ubcp|____|clvm|____, vtos, itos, iload               ,  _           );
 281   def(Bytecodes::_lload               , ubcp|____|____|____, vtos, ltos, lload               ,  _           );
 282   def(Bytecodes::_fload               , ubcp|____|____|____, vtos, ftos, fload               ,  _           );
 283   def(Bytecodes::_dload               , ubcp|____|____|____, vtos, dtos, dload               ,  _           );
 284   def(Bytecodes::_aload               , ubcp|____|clvm|____, vtos, atos, aload               ,  _           );
 285   def(Bytecodes::_iload_0             , ____|____|____|____, vtos, itos, iload               ,  0           );
 286   def(Bytecodes::_iload_1             , ____|____|____|____, vtos, itos, iload               ,  1           );
 287   def(Bytecodes::_iload_2             , ____|____|____|____, vtos, itos, iload               ,  2           );
 288   def(Bytecodes::_iload_3             , ____|____|____|____, vtos, itos, iload               ,  3           );
 289   def(Bytecodes::_lload_0             , ____|____|____|____, vtos, ltos, lload               ,  0           );
 290   def(Bytecodes::_lload_1             , ____|____|____|____, vtos, ltos, lload               ,  1           );
 291   def(Bytecodes::_lload_2             , ____|____|____|____, vtos, ltos, lload               ,  2           );
 292   def(Bytecodes::_lload_3             , ____|____|____|____, vtos, ltos, lload               ,  3           );
 293   def(Bytecodes::_fload_0             , ____|____|____|____, vtos, ftos, fload               ,  0           );
 294   def(Bytecodes::_fload_1             , ____|____|____|____, vtos, ftos, fload               ,  1           );
 295   def(Bytecodes::_fload_2             , ____|____|____|____, vtos, ftos, fload               ,  2           );
 296   def(Bytecodes::_fload_3             , ____|____|____|____, vtos, ftos, fload               ,  3           );
 297   def(Bytecodes::_dload_0             , ____|____|____|____, vtos, dtos, dload               ,  0           );
 298   def(Bytecodes::_dload_1             , ____|____|____|____, vtos, dtos, dload               ,  1           );
 299   def(Bytecodes::_dload_2             , ____|____|____|____, vtos, dtos, dload               ,  2           );
 300   def(Bytecodes::_dload_3             , ____|____|____|____, vtos, dtos, dload               ,  3           );
 301   def(Bytecodes::_aload_0             , ubcp|____|clvm|____, vtos, atos, aload_0             ,  _           );
 302   def(Bytecodes::_aload_1             , ____|____|____|____, vtos, atos, aload               ,  1           );
 303   def(Bytecodes::_aload_2             , ____|____|____|____, vtos, atos, aload               ,  2           );
 304   def(Bytecodes::_aload_3             , ____|____|____|____, vtos, atos, aload               ,  3           );
 305   def(Bytecodes::_iaload              , ____|____|____|____, itos, itos, iaload              ,  _           );
 306   def(Bytecodes::_laload              , ____|____|____|____, itos, ltos, laload              ,  _           );
 307   def(Bytecodes::_faload              , ____|____|____|____, itos, ftos, faload              ,  _           );
 308   def(Bytecodes::_daload              , ____|____|____|____, itos, dtos, daload              ,  _           );
 309   def(Bytecodes::_aaload              , ____|____|____|____, itos, atos, aaload              ,  _           );
 310   def(Bytecodes::_baload              , ____|____|____|____, itos, itos, baload              ,  _           );
 311   def(Bytecodes::_caload              , ____|____|____|____, itos, itos, caload              ,  _           );
 312   def(Bytecodes::_saload              , ____|____|____|____, itos, itos, saload              ,  _           );
 313   def(Bytecodes::_istore              , ubcp|____|clvm|____, itos, vtos, istore              ,  _           );
 314   def(Bytecodes::_lstore              , ubcp|____|____|____, ltos, vtos, lstore              ,  _           );
 315   def(Bytecodes::_fstore              , ubcp|____|____|____, ftos, vtos, fstore              ,  _           );
 316   def(Bytecodes::_dstore              , ubcp|____|____|____, dtos, vtos, dstore              ,  _           );
 317   def(Bytecodes::_astore              , ubcp|____|clvm|____, vtos, vtos, astore              ,  _           );
 318   def(Bytecodes::_istore_0            , ____|____|____|____, itos, vtos, istore              ,  0           );
 319   def(Bytecodes::_istore_1            , ____|____|____|____, itos, vtos, istore              ,  1           );
 320   def(Bytecodes::_istore_2            , ____|____|____|____, itos, vtos, istore              ,  2           );
 321   def(Bytecodes::_istore_3            , ____|____|____|____, itos, vtos, istore              ,  3           );
 322   def(Bytecodes::_lstore_0            , ____|____|____|____, ltos, vtos, lstore              ,  0           );
 323   def(Bytecodes::_lstore_1            , ____|____|____|____, ltos, vtos, lstore              ,  1           );
 324   def(Bytecodes::_lstore_2            , ____|____|____|____, ltos, vtos, lstore              ,  2           );
 325   def(Bytecodes::_lstore_3            , ____|____|____|____, ltos, vtos, lstore              ,  3           );
 326   def(Bytecodes::_fstore_0            , ____|____|____|____, ftos, vtos, fstore              ,  0           );
 327   def(Bytecodes::_fstore_1            , ____|____|____|____, ftos, vtos, fstore              ,  1           );
 328   def(Bytecodes::_fstore_2            , ____|____|____|____, ftos, vtos, fstore              ,  2           );
 329   def(Bytecodes::_fstore_3            , ____|____|____|____, ftos, vtos, fstore              ,  3           );
 330   def(Bytecodes::_dstore_0            , ____|____|____|____, dtos, vtos, dstore              ,  0           );
 331   def(Bytecodes::_dstore_1            , ____|____|____|____, dtos, vtos, dstore              ,  1           );
 332   def(Bytecodes::_dstore_2            , ____|____|____|____, dtos, vtos, dstore              ,  2           );
 333   def(Bytecodes::_dstore_3            , ____|____|____|____, dtos, vtos, dstore              ,  3           );
 334   def(Bytecodes::_astore_0            , ____|____|____|____, vtos, vtos, astore              ,  0           );
 335   def(Bytecodes::_astore_1            , ____|____|____|____, vtos, vtos, astore              ,  1           );
 336   def(Bytecodes::_astore_2            , ____|____|____|____, vtos, vtos, astore              ,  2           );
 337   def(Bytecodes::_astore_3            , ____|____|____|____, vtos, vtos, astore              ,  3           );
 338   def(Bytecodes::_iastore             , ____|____|____|____, itos, vtos, iastore             ,  _           );
 339   def(Bytecodes::_lastore             , ____|____|____|____, ltos, vtos, lastore             ,  _           );
 340   def(Bytecodes::_fastore             , ____|____|____|____, ftos, vtos, fastore             ,  _           );
 341   def(Bytecodes::_dastore             , ____|____|____|____, dtos, vtos, dastore             ,  _           );
 342   def(Bytecodes::_aastore             , ____|____|clvm|____, vtos, vtos, aastore             ,  _           );
 343   def(Bytecodes::_bastore             , ____|____|____|____, itos, vtos, bastore             ,  _           );
 344   def(Bytecodes::_castore             , ____|____|____|____, itos, vtos, castore             ,  _           );
 345   def(Bytecodes::_sastore             , ____|____|____|____, itos, vtos, sastore             ,  _           );
 346   def(Bytecodes::_pop                 , ____|____|____|____, vtos, vtos, pop                 ,  _           );
 347   def(Bytecodes::_pop2                , ____|____|____|____, vtos, vtos, pop2                ,  _           );
 348   def(Bytecodes::_dup                 , ____|____|____|____, vtos, vtos, dup                 ,  _           );
 349   def(Bytecodes::_dup_x1              , ____|____|____|____, vtos, vtos, dup_x1              ,  _           );
 350   def(Bytecodes::_dup_x2              , ____|____|____|____, vtos, vtos, dup_x2              ,  _           );
 351   def(Bytecodes::_dup2                , ____|____|____|____, vtos, vtos, dup2                ,  _           );
 352   def(Bytecodes::_dup2_x1             , ____|____|____|____, vtos, vtos, dup2_x1             ,  _           );
 353   def(Bytecodes::_dup2_x2             , ____|____|____|____, vtos, vtos, dup2_x2             ,  _           );
 354   def(Bytecodes::_swap                , ____|____|____|____, vtos, vtos, swap                ,  _           );
 355   def(Bytecodes::_iadd                , ____|____|____|____, itos, itos, iop2                , add          );
 356   def(Bytecodes::_ladd                , ____|____|____|____, ltos, ltos, lop2                , add          );
 357   def(Bytecodes::_fadd                , ____|____|____|____, ftos, ftos, fop2                , add          );
 358   def(Bytecodes::_dadd                , ____|____|____|____, dtos, dtos, dop2                , add          );
 359   def(Bytecodes::_isub                , ____|____|____|____, itos, itos, iop2                , sub          );
 360   def(Bytecodes::_lsub                , ____|____|____|____, ltos, ltos, lop2                , sub          );
 361   def(Bytecodes::_fsub                , ____|____|____|____, ftos, ftos, fop2                , sub          );
 362   def(Bytecodes::_dsub                , ____|____|____|____, dtos, dtos, dop2                , sub          );
 363   def(Bytecodes::_imul                , ____|____|____|____, itos, itos, iop2                , mul          );
 364   def(Bytecodes::_lmul                , ____|____|____|____, ltos, ltos, lmul                ,  _           );
 365   def(Bytecodes::_fmul                , ____|____|____|____, ftos, ftos, fop2                , mul          );
 366   def(Bytecodes::_dmul                , ____|____|____|____, dtos, dtos, dop2                , mul          );
 367   def(Bytecodes::_idiv                , ____|____|____|____, itos, itos, idiv                ,  _           );
 368   def(Bytecodes::_ldiv                , ____|____|____|____, ltos, ltos, ldiv                ,  _           );
 369   def(Bytecodes::_fdiv                , ____|____|____|____, ftos, ftos, fop2                , div          );
 370   def(Bytecodes::_ddiv                , ____|____|____|____, dtos, dtos, dop2                , div          );
 371   def(Bytecodes::_irem                , ____|____|____|____, itos, itos, irem                ,  _           );
 372   def(Bytecodes::_lrem                , ____|____|____|____, ltos, ltos, lrem                ,  _           );
 373   def(Bytecodes::_frem                , ____|____|____|____, ftos, ftos, fop2                , rem          );
 374   def(Bytecodes::_drem                , ____|____|____|____, dtos, dtos, dop2                , rem          );
 375   def(Bytecodes::_ineg                , ____|____|____|____, itos, itos, ineg                ,  _           );
 376   def(Bytecodes::_lneg                , ____|____|____|____, ltos, ltos, lneg                ,  _           );
 377   def(Bytecodes::_fneg                , ____|____|____|____, ftos, ftos, fneg                ,  _           );
 378   def(Bytecodes::_dneg                , ____|____|____|____, dtos, dtos, dneg                ,  _           );
 379   def(Bytecodes::_ishl                , ____|____|____|____, itos, itos, iop2                , shl          );
 380   def(Bytecodes::_lshl                , ____|____|____|____, itos, ltos, lshl                ,  _           );
 381   def(Bytecodes::_ishr                , ____|____|____|____, itos, itos, iop2                , shr          );
 382   def(Bytecodes::_lshr                , ____|____|____|____, itos, ltos, lshr                ,  _           );
 383   def(Bytecodes::_iushr               , ____|____|____|____, itos, itos, iop2                , ushr         );
 384   def(Bytecodes::_lushr               , ____|____|____|____, itos, ltos, lushr               ,  _           );
 385   def(Bytecodes::_iand                , ____|____|____|____, itos, itos, iop2                , _and         );
 386   def(Bytecodes::_land                , ____|____|____|____, ltos, ltos, lop2                , _and         );
 387   def(Bytecodes::_ior                 , ____|____|____|____, itos, itos, iop2                , _or          );
 388   def(Bytecodes::_lor                 , ____|____|____|____, ltos, ltos, lop2                , _or          );
 389   def(Bytecodes::_ixor                , ____|____|____|____, itos, itos, iop2                , _xor         );
 390   def(Bytecodes::_lxor                , ____|____|____|____, ltos, ltos, lop2                , _xor         );
 391   def(Bytecodes::_iinc                , ubcp|____|clvm|____, vtos, vtos, iinc                ,  _           );
 392   def(Bytecodes::_i2l                 , ____|____|____|____, itos, ltos, convert             ,  _           );
 393   def(Bytecodes::_i2f                 , ____|____|____|____, itos, ftos, convert             ,  _           );
 394   def(Bytecodes::_i2d                 , ____|____|____|____, itos, dtos, convert             ,  _           );
 395   def(Bytecodes::_l2i                 , ____|____|____|____, ltos, itos, convert             ,  _           );
 396   def(Bytecodes::_l2f                 , ____|____|____|____, ltos, ftos, convert             ,  _           );
 397   def(Bytecodes::_l2d                 , ____|____|____|____, ltos, dtos, convert             ,  _           );
 398   def(Bytecodes::_f2i                 , ____|____|____|____, ftos, itos, convert             ,  _           );
 399   def(Bytecodes::_f2l                 , ____|____|____|____, ftos, ltos, convert             ,  _           );
 400   def(Bytecodes::_f2d                 , ____|____|____|____, ftos, dtos, convert             ,  _           );
 401   def(Bytecodes::_d2i                 , ____|____|____|____, dtos, itos, convert             ,  _           );
 402   def(Bytecodes::_d2l                 , ____|____|____|____, dtos, ltos, convert             ,  _           );
 403   def(Bytecodes::_d2f                 , ____|____|____|____, dtos, ftos, convert             ,  _           );
 404   def(Bytecodes::_i2b                 , ____|____|____|____, itos, itos, convert             ,  _           );
 405   def(Bytecodes::_i2c                 , ____|____|____|____, itos, itos, convert             ,  _           );
 406   def(Bytecodes::_i2s                 , ____|____|____|____, itos, itos, convert             ,  _           );
 407   def(Bytecodes::_lcmp                , ____|____|____|____, ltos, itos, lcmp                ,  _           );
 408   def(Bytecodes::_fcmpl               , ____|____|____|____, ftos, itos, float_cmp           , -1           );
 409   def(Bytecodes::_fcmpg               , ____|____|____|____, ftos, itos, float_cmp           ,  1           );
 410   def(Bytecodes::_dcmpl               , ____|____|____|____, dtos, itos, double_cmp          , -1           );
 411   def(Bytecodes::_dcmpg               , ____|____|____|____, dtos, itos, double_cmp          ,  1           );
 412   def(Bytecodes::_ifeq                , ubcp|____|clvm|____, itos, vtos, if_0cmp             , equal        );
 413   def(Bytecodes::_ifne                , ubcp|____|clvm|____, itos, vtos, if_0cmp             , not_equal    );
 414   def(Bytecodes::_iflt                , ubcp|____|clvm|____, itos, vtos, if_0cmp             , less         );
 415   def(Bytecodes::_ifge                , ubcp|____|clvm|____, itos, vtos, if_0cmp             , greater_equal);
 416   def(Bytecodes::_ifgt                , ubcp|____|clvm|____, itos, vtos, if_0cmp             , greater      );
 417   def(Bytecodes::_ifle                , ubcp|____|clvm|____, itos, vtos, if_0cmp             , less_equal   );
 418   def(Bytecodes::_if_icmpeq           , ubcp|____|clvm|____, itos, vtos, if_icmp             , equal        );
 419   def(Bytecodes::_if_icmpne           , ubcp|____|clvm|____, itos, vtos, if_icmp             , not_equal    );
 420   def(Bytecodes::_if_icmplt           , ubcp|____|clvm|____, itos, vtos, if_icmp             , less         );
 421   def(Bytecodes::_if_icmpge           , ubcp|____|clvm|____, itos, vtos, if_icmp             , greater_equal);
 422   def(Bytecodes::_if_icmpgt           , ubcp|____|clvm|____, itos, vtos, if_icmp             , greater      );
 423   def(Bytecodes::_if_icmple           , ubcp|____|clvm|____, itos, vtos, if_icmp             , less_equal   );
 424   def(Bytecodes::_if_acmpeq           , ubcp|____|clvm|____, atos, vtos, if_acmp             , equal        );
 425   def(Bytecodes::_if_acmpne           , ubcp|____|clvm|____, atos, vtos, if_acmp             , not_equal    );
 426   def(Bytecodes::_goto                , ubcp|disp|clvm|____, vtos, vtos, _goto               ,  _           );
 427   def(Bytecodes::_jsr                 , ubcp|disp|____|____, vtos, vtos, jsr                 ,  _           ); // result is not an oop, so do not transition to atos
 428   def(Bytecodes::_ret                 , ubcp|disp|____|____, vtos, vtos, ret                 ,  _           );
 429   def(Bytecodes::_tableswitch         , ubcp|disp|____|____, itos, vtos, tableswitch         ,  _           );
 430   def(Bytecodes::_lookupswitch        , ubcp|disp|____|____, itos, itos, lookupswitch        ,  _           );
 431   def(Bytecodes::_ireturn             , ____|disp|clvm|____, itos, itos, _return             , itos         );
 432   def(Bytecodes::_lreturn             , ____|disp|clvm|____, ltos, ltos, _return             , ltos         );
 433   def(Bytecodes::_freturn             , ____|disp|clvm|____, ftos, ftos, _return             , ftos         );
 434   def(Bytecodes::_dreturn             , ____|disp|clvm|____, dtos, dtos, _return             , dtos         );
 435   def(Bytecodes::_areturn             , ____|disp|clvm|____, atos, atos, _return             , atos         );
 436   def(Bytecodes::_return              , ____|disp|clvm|____, vtos, vtos, _return             , vtos         );
 437   def(Bytecodes::_getstatic           , ubcp|____|clvm|____, vtos, vtos, getstatic           ,  1           );
 438   def(Bytecodes::_putstatic           , ubcp|____|clvm|____, vtos, vtos, putstatic           ,  2           );
 439   def(Bytecodes::_getfield            , ubcp|____|clvm|____, vtos, vtos, getfield            ,  1           );
 440   def(Bytecodes::_putfield            , ubcp|____|clvm|____, vtos, vtos, putfield            ,  2           );
 441   def(Bytecodes::_invokevirtual       , ubcp|disp|clvm|____, vtos, vtos, invokevirtual       ,  2           );
 442   def(Bytecodes::_invokespecial       , ubcp|disp|clvm|____, vtos, vtos, invokespecial       ,  1           );
 443   def(Bytecodes::_invokestatic        , ubcp|disp|clvm|____, vtos, vtos, invokestatic        ,  1           );
 444   def(Bytecodes::_invokeinterface     , ubcp|disp|clvm|____, vtos, vtos, invokeinterface     ,  1           );
 445   def(Bytecodes::_new                 , ubcp|____|clvm|____, vtos, atos, _new                ,  _           );
 446   def(Bytecodes::_newarray            , ubcp|____|clvm|____, itos, atos, newarray            ,  _           );
 447   def(Bytecodes::_anewarray           , ubcp|____|clvm|____, itos, atos, anewarray           ,  _           );
 448   def(Bytecodes::_arraylength         , ____|____|____|____, atos, itos, arraylength         ,  _           );
 449   def(Bytecodes::_athrow              , ____|disp|____|____, atos, vtos, athrow              ,  _           );
 450   def(Bytecodes::_checkcast           , ubcp|____|clvm|____, atos, atos, checkcast           ,  _           );
 451   def(Bytecodes::_instanceof          , ubcp|____|clvm|____, atos, itos, instanceof          ,  _           );
 452   def(Bytecodes::_monitorenter        , ____|disp|clvm|____, atos, vtos, monitorenter        ,  _           );
 453   def(Bytecodes::_monitorexit         , ____|____|clvm|____, atos, vtos, monitorexit         ,  _           );
 454   def(Bytecodes::_wide                , ubcp|disp|____|____, vtos, vtos, wide                ,  _           );
 455   def(Bytecodes::_multianewarray      , ubcp|____|clvm|____, vtos, atos, multianewarray      ,  _           );
 456   def(Bytecodes::_ifnull              , ubcp|____|clvm|____, atos, vtos, if_nullcmp          , equal        );
 457   def(Bytecodes::_ifnonnull           , ubcp|____|clvm|____, atos, vtos, if_nullcmp          , not_equal    );
 458   def(Bytecodes::_goto_w              , ubcp|____|clvm|____, vtos, vtos, goto_w              ,  _           );
 459   def(Bytecodes::_jsr_w               , ubcp|____|____|____, vtos, vtos, jsr_w               ,  _           );
 460      
 461   // wide Java spec bytecodes
 462   def(Bytecodes::_iload               , ubcp|____|____|iswd, vtos, itos, wide_iload          ,  _           );
 463   def(Bytecodes::_lload               , ubcp|____|____|iswd, vtos, ltos, wide_lload          ,  _           );
 464   def(Bytecodes::_fload               , ubcp|____|____|iswd, vtos, ftos, wide_fload          ,  _           );
 465   def(Bytecodes::_dload               , ubcp|____|____|iswd, vtos, dtos, wide_dload          ,  _           );
 466   def(Bytecodes::_aload               , ubcp|____|____|iswd, vtos, atos, wide_aload          ,  _           );
 467   def(Bytecodes::_istore              , ubcp|____|____|iswd, vtos, vtos, wide_istore         ,  _           );
 468   def(Bytecodes::_lstore              , ubcp|____|____|iswd, vtos, vtos, wide_lstore         ,  _           );
 469   def(Bytecodes::_fstore              , ubcp|____|____|iswd, vtos, vtos, wide_fstore         ,  _           );
 470   def(Bytecodes::_dstore              , ubcp|____|____|iswd, vtos, vtos, wide_dstore         ,  _           );
 471   def(Bytecodes::_astore              , ubcp|____|____|iswd, vtos, vtos, wide_astore         ,  _           );
 472   def(Bytecodes::_iinc                , ubcp|____|____|iswd, vtos, vtos, wide_iinc           ,  _           );
 473   def(Bytecodes::_ret                 , ubcp|disp|____|iswd, vtos, vtos, wide_ret            ,  _           );
 474   def(Bytecodes::_breakpoint          , ubcp|disp|clvm|____, vtos, vtos, _breakpoint         ,  _           );
 475   
 476   // JVM bytecodes
 477   def(Bytecodes::_fast_agetfield      , ubcp|____|____|____, atos, atos, fast_accessfield    ,  atos        );
 478   def(Bytecodes::_fast_bgetfield      , ubcp|____|____|____, atos, itos, fast_accessfield    ,  itos        );
 479   def(Bytecodes::_fast_cgetfield      , ubcp|____|____|____, atos, itos, fast_accessfield    ,  itos        );
 480   def(Bytecodes::_fast_dgetfield      , ubcp|____|____|____, atos, dtos, fast_accessfield    ,  dtos        );
 481   def(Bytecodes::_fast_fgetfield      , ubcp|____|____|____, atos, ftos, fast_accessfield    ,  ftos        );
 482   def(Bytecodes::_fast_igetfield      , ubcp|____|____|____, atos, itos, fast_accessfield    ,  itos        );
 483   def(Bytecodes::_fast_lgetfield      , ubcp|____|____|____, atos, ltos, fast_accessfield    ,  ltos        );
 484   def(Bytecodes::_fast_sgetfield      , ubcp|____|____|____, atos, itos, fast_accessfield    ,  itos        );
 485 
 486   def(Bytecodes::_fast_aputfield      , ubcp|____|____|____, atos, vtos, fast_storefield ,   atos        );
 487   def(Bytecodes::_fast_bputfield      , ubcp|____|____|____, itos, vtos, fast_storefield ,   itos        );
 488   def(Bytecodes::_fast_cputfield      , ubcp|____|____|____, itos, vtos, fast_storefield  ,  itos        );
 489   def(Bytecodes::_fast_dputfield      , ubcp|____|____|____, dtos, vtos, fast_storefield  ,  dtos        );
 490   def(Bytecodes::_fast_fputfield      , ubcp|____|____|____, ftos, vtos, fast_storefield  ,  ftos        );
 491   def(Bytecodes::_fast_iputfield      , ubcp|____|____|____, itos, vtos, fast_storefield  ,  itos        );
 492   def(Bytecodes::_fast_lputfield      , ubcp|____|____|____, ltos, vtos, fast_storefield  ,  ltos        );
 493   def(Bytecodes::_fast_sputfield      , ubcp|____|____|____, itos, vtos, fast_storefield  ,  itos        );
 494 
 495   def(Bytecodes::_fast_aload_0        , ____|____|____|____, vtos, atos, aload               ,  0           );
 496   def(Bytecodes::_fast_iaccess_0      , ubcp|____|____|____, vtos, itos, fast_xaccess        ,  itos        );
 497   def(Bytecodes::_fast_aaccess_0      , ubcp|____|____|____, vtos, atos, fast_xaccess        ,  atos        );
 498   def(Bytecodes::_fast_faccess_0      , ubcp|____|____|____, vtos, ftos, fast_xaccess        ,  ftos        );
 499 
 500   def(Bytecodes::_fast_iload          , ubcp|____|____|____, vtos, itos, fast_iload          ,  _       );
 501   def(Bytecodes::_fast_iload2         , ubcp|____|____|____, vtos, itos, fast_iload2         ,  _       );
 502   def(Bytecodes::_fast_icaload        , ubcp|____|____|____, vtos, itos, fast_icaload        ,  _       );
 503 
 504   def(Bytecodes::_fast_invokevfinal   , ubcp|disp|clvm|____, vtos, vtos, fast_invokevfinal   ,  2           );
 505 
 506 
 507   def(Bytecodes::_fast_linearswitch   , ubcp|disp|____|____, itos, vtos, fast_linearswitch   ,  _           );
 508   def(Bytecodes::_fast_binaryswitch   , ubcp|disp|____|____, itos, vtos, fast_binaryswitch   ,  _           );
 509 
 510   def(Bytecodes::_return_register_finalizer , ____|disp|clvm|____, vtos, vtos, _return       ,  vtos        );
 511 
 512   def(Bytecodes::_shouldnotreachhere   , ____|____|____|____, vtos, vtos, shouldnotreachhere ,  _           );
 513   // platform specific bytecodes
 514   pd_initialize();
 515 
 516   _is_initialized = true;
 517 }
 518 
 519 #if defined(TEMPLATE_TABLE_BUG)
 520   #undef iload
 521   #undef lload
 522   #undef fload
 523   #undef dload
 524   #undef aload
 525   #undef istore
 526   #undef lstore
 527   #undef fstore
 528   #undef dstore
 529   #undef astore
 530 #endif // TEMPLATE_TABLE_BUG
 531 
 532 
 533 void templateTable_init() {
 534   TemplateTable::initialize();
 535 }
 536 
 537 
 538 void TemplateTable::unimplemented_bc() {  
 539   _masm->unimplemented( Bytecodes::name(_desc->bytecode()));
 540 }
 541 #endif /* !CC_INTERP */