1 /*
   2  * Copyright (c) 2001, 2016, 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 package sun.jvm.hotspot.interpreter;
  26 
  27 import java.util.*;
  28 import sun.jvm.hotspot.oops.*;
  29 import sun.jvm.hotspot.runtime.*;
  30 import sun.jvm.hotspot.utilities.*;
  31 
  32 // Bytecodes specifies all bytecodes used in the VM and
  33 // provides utility functions to get bytecode attributes.
  34 
  35 public class Bytecodes {
  36   public static final int _illegal    =  -1;
  37 
  38   // Java bytecodes
  39   public static final int _nop                  =   0; // 0x00
  40   public static final int _aconst_null          =   1; // 0x01
  41   public static final int _iconst_m1            =   2; // 0x02
  42   public static final int _iconst_0             =   3; // 0x03
  43   public static final int _iconst_1             =   4; // 0x04
  44   public static final int _iconst_2             =   5; // 0x05
  45   public static final int _iconst_3             =   6; // 0x06
  46   public static final int _iconst_4             =   7; // 0x07
  47   public static final int _iconst_5             =   8; // 0x08
  48   public static final int _lconst_0             =   9; // 0x09
  49   public static final int _lconst_1             =  10; // 0x0a
  50   public static final int _fconst_0             =  11; // 0x0b
  51   public static final int _fconst_1             =  12; // 0x0c
  52   public static final int _fconst_2             =  13; // 0x0d
  53   public static final int _dconst_0             =  14; // 0x0e
  54   public static final int _dconst_1             =  15; // 0x0f
  55   public static final int _bipush               =  16; // 0x10
  56   public static final int _sipush               =  17; // 0x11
  57   public static final int _ldc                  =  18; // 0x12
  58   public static final int _ldc_w                =  19; // 0x13
  59   public static final int _ldc2_w               =  20; // 0x14
  60   public static final int _iload                =  21; // 0x15
  61   public static final int _lload                =  22; // 0x16
  62   public static final int _fload                =  23; // 0x17
  63   public static final int _dload                =  24; // 0x18
  64   public static final int _aload                =  25; // 0x19
  65   public static final int _iload_0              =  26; // 0x1a
  66   public static final int _iload_1              =  27; // 0x1b
  67   public static final int _iload_2              =  28; // 0x1c
  68   public static final int _iload_3              =  29; // 0x1d
  69   public static final int _lload_0              =  30; // 0x1e
  70   public static final int _lload_1              =  31; // 0x1f
  71   public static final int _lload_2              =  32; // 0x20
  72   public static final int _lload_3              =  33; // 0x21
  73   public static final int _fload_0              =  34; // 0x22
  74   public static final int _fload_1              =  35; // 0x23
  75   public static final int _fload_2              =  36; // 0x24
  76   public static final int _fload_3              =  37; // 0x25
  77   public static final int _dload_0              =  38; // 0x26
  78   public static final int _dload_1              =  39; // 0x27
  79   public static final int _dload_2              =  40; // 0x28
  80   public static final int _dload_3              =  41; // 0x29
  81   public static final int _aload_0              =  42; // 0x2a
  82   public static final int _aload_1              =  43; // 0x2b
  83   public static final int _aload_2              =  44; // 0x2c
  84   public static final int _aload_3              =  45; // 0x2d
  85   public static final int _iaload               =  46; // 0x2e
  86   public static final int _laload               =  47; // 0x2f
  87   public static final int _faload               =  48; // 0x30
  88   public static final int _daload               =  49; // 0x31
  89   public static final int _aaload               =  50; // 0x32
  90   public static final int _baload               =  51; // 0x33
  91   public static final int _caload               =  52; // 0x34
  92   public static final int _saload               =  53; // 0x35
  93   public static final int _istore               =  54; // 0x36
  94   public static final int _lstore               =  55; // 0x37
  95   public static final int _fstore               =  56; // 0x38
  96   public static final int _dstore               =  57; // 0x39
  97   public static final int _astore               =  58; // 0x3a
  98   public static final int _istore_0             =  59; // 0x3b
  99   public static final int _istore_1             =  60; // 0x3c
 100   public static final int _istore_2             =  61; // 0x3d
 101   public static final int _istore_3             =  62; // 0x3e
 102   public static final int _lstore_0             =  63; // 0x3f
 103   public static final int _lstore_1             =  64; // 0x40
 104   public static final int _lstore_2             =  65; // 0x41
 105   public static final int _lstore_3             =  66; // 0x42
 106   public static final int _fstore_0             =  67; // 0x43
 107   public static final int _fstore_1             =  68; // 0x44
 108   public static final int _fstore_2             =  69; // 0x45
 109   public static final int _fstore_3             =  70; // 0x46
 110   public static final int _dstore_0             =  71; // 0x47
 111   public static final int _dstore_1             =  72; // 0x48
 112   public static final int _dstore_2             =  73; // 0x49
 113   public static final int _dstore_3             =  74; // 0x4a
 114   public static final int _astore_0             =  75; // 0x4b
 115   public static final int _astore_1             =  76; // 0x4c
 116   public static final int _astore_2             =  77; // 0x4d
 117   public static final int _astore_3             =  78; // 0x4e
 118   public static final int _iastore              =  79; // 0x4f
 119   public static final int _lastore              =  80; // 0x50
 120   public static final int _fastore              =  81; // 0x51
 121   public static final int _dastore              =  82; // 0x52
 122   public static final int _aastore              =  83; // 0x53
 123   public static final int _bastore              =  84; // 0x54
 124   public static final int _castore              =  85; // 0x55
 125   public static final int _sastore              =  86; // 0x56
 126   public static final int _pop                  =  87; // 0x57
 127   public static final int _pop2                 =  88; // 0x58
 128   public static final int _dup                  =  89; // 0x59
 129   public static final int _dup_x1               =  90; // 0x5a
 130   public static final int _dup_x2               =  91; // 0x5b
 131   public static final int _dup2                 =  92; // 0x5c
 132   public static final int _dup2_x1              =  93; // 0x5d
 133   public static final int _dup2_x2              =  94; // 0x5e
 134   public static final int _swap                 =  95; // 0x5f
 135   public static final int _iadd                 =  96; // 0x60
 136   public static final int _ladd                 =  97; // 0x61
 137   public static final int _fadd                 =  98; // 0x62
 138   public static final int _dadd                 =  99; // 0x63
 139   public static final int _isub                 = 100; // 0x64
 140   public static final int _lsub                 = 101; // 0x65
 141   public static final int _fsub                 = 102; // 0x66
 142   public static final int _dsub                 = 103; // 0x67
 143   public static final int _imul                 = 104; // 0x68
 144   public static final int _lmul                 = 105; // 0x69
 145   public static final int _fmul                 = 106; // 0x6a
 146   public static final int _dmul                 = 107; // 0x6b
 147   public static final int _idiv                 = 108; // 0x6c
 148   public static final int _ldiv                 = 109; // 0x6d
 149   public static final int _fdiv                 = 110; // 0x6e
 150   public static final int _ddiv                 = 111; // 0x6f
 151   public static final int _irem                 = 112; // 0x70
 152   public static final int _lrem                 = 113; // 0x71
 153   public static final int _frem                 = 114; // 0x72
 154   public static final int _drem                 = 115; // 0x73
 155   public static final int _ineg                 = 116; // 0x74
 156   public static final int _lneg                 = 117; // 0x75
 157   public static final int _fneg                 = 118; // 0x76
 158   public static final int _dneg                 = 119; // 0x77
 159   public static final int _ishl                 = 120; // 0x78
 160   public static final int _lshl                 = 121; // 0x79
 161   public static final int _ishr                 = 122; // 0x7a
 162   public static final int _lshr                 = 123; // 0x7b
 163   public static final int _iushr                = 124; // 0x7c
 164   public static final int _lushr                = 125; // 0x7d
 165   public static final int _iand                 = 126; // 0x7e
 166   public static final int _land                 = 127; // 0x7f
 167   public static final int _ior                  = 128; // 0x80
 168   public static final int _lor                  = 129; // 0x81
 169   public static final int _ixor                 = 130; // 0x82
 170   public static final int _lxor                 = 131; // 0x83
 171   public static final int _iinc                 = 132; // 0x84
 172   public static final int _i2l                  = 133; // 0x85
 173   public static final int _i2f                  = 134; // 0x86
 174   public static final int _i2d                  = 135; // 0x87
 175   public static final int _l2i                  = 136; // 0x88
 176   public static final int _l2f                  = 137; // 0x89
 177   public static final int _l2d                  = 138; // 0x8a
 178   public static final int _f2i                  = 139; // 0x8b
 179   public static final int _f2l                  = 140; // 0x8c
 180   public static final int _f2d                  = 141; // 0x8d
 181   public static final int _d2i                  = 142; // 0x8e
 182   public static final int _d2l                  = 143; // 0x8f
 183   public static final int _d2f                  = 144; // 0x90
 184   public static final int _i2b                  = 145; // 0x91
 185   public static final int _i2c                  = 146; // 0x92
 186   public static final int _i2s                  = 147; // 0x93
 187   public static final int _lcmp                 = 148; // 0x94
 188   public static final int _fcmpl                = 149; // 0x95
 189   public static final int _fcmpg                = 150; // 0x96
 190   public static final int _dcmpl                = 151; // 0x97
 191   public static final int _dcmpg                = 152; // 0x98
 192   public static final int _ifeq                 = 153; // 0x99
 193   public static final int _ifne                 = 154; // 0x9a
 194   public static final int _iflt                 = 155; // 0x9b
 195   public static final int _ifge                 = 156; // 0x9c
 196   public static final int _ifgt                 = 157; // 0x9d
 197   public static final int _ifle                 = 158; // 0x9e
 198   public static final int _if_icmpeq            = 159; // 0x9f
 199   public static final int _if_icmpne            = 160; // 0xa0
 200   public static final int _if_icmplt            = 161; // 0xa1
 201   public static final int _if_icmpge            = 162; // 0xa2
 202   public static final int _if_icmpgt            = 163; // 0xa3
 203   public static final int _if_icmple            = 164; // 0xa4
 204   public static final int _if_acmpeq            = 165; // 0xa5
 205   public static final int _if_acmpne            = 166; // 0xa6
 206   public static final int _goto                 = 167; // 0xa7
 207   public static final int _jsr                  = 168; // 0xa8
 208   public static final int _ret                  = 169; // 0xa9
 209   public static final int _tableswitch          = 170; // 0xaa
 210   public static final int _lookupswitch         = 171; // 0xab
 211   public static final int _ireturn              = 172; // 0xac
 212   public static final int _lreturn              = 173; // 0xad
 213   public static final int _freturn              = 174; // 0xae
 214   public static final int _dreturn              = 175; // 0xaf
 215   public static final int _areturn              = 176; // 0xb0
 216   public static final int _return               = 177; // 0xb1
 217   public static final int _getstatic            = 178; // 0xb2
 218   public static final int _putstatic            = 179; // 0xb3
 219   public static final int _getfield             = 180; // 0xb4
 220   public static final int _putfield             = 181; // 0xb5
 221   public static final int _invokevirtual        = 182; // 0xb6
 222   public static final int _invokespecial        = 183; // 0xb7
 223   public static final int _invokestatic         = 184; // 0xb8
 224   public static final int _invokeinterface      = 185; // 0xb9
 225   public static final int _invokedynamic        = 186; // 0xba
 226   public static final int _new                  = 187; // 0xbb
 227   public static final int _newarray             = 188; // 0xbc
 228   public static final int _anewarray            = 189; // 0xbd
 229   public static final int _arraylength          = 190; // 0xbe
 230   public static final int _athrow               = 191; // 0xbf
 231   public static final int _checkcast            = 192; // 0xc0
 232   public static final int _instanceof           = 193; // 0xc1
 233   public static final int _monitorenter         = 194; // 0xc2
 234   public static final int _monitorexit          = 195; // 0xc3
 235   public static final int _wide                 = 196; // 0xc4
 236   public static final int _multianewarray       = 197; // 0xc5
 237   public static final int _ifnull               = 198; // 0xc6
 238   public static final int _ifnonnull            = 199; // 0xc7
 239   public static final int _goto_w               = 200; // 0xc8
 240   public static final int _jsr_w                = 201; // 0xc9
 241   public static final int _breakpoint           = 202; // 0xca
 242 
 243   public static final int number_of_java_codes  = 203;
 244 
 245   // JVM bytecodes
 246   public static final int _fast_agetfield       = number_of_java_codes;
 247   public static final int _fast_bgetfield       = 204;
 248   public static final int _fast_cgetfield       = 205;
 249   public static final int _fast_dgetfield       = 206;
 250   public static final int _fast_fgetfield       = 207;
 251   public static final int _fast_igetfield       = 208;
 252   public static final int _fast_lgetfield       = 209;
 253   public static final int _fast_sgetfield       = 210;
 254   public static final int _fast_aputfield       = 211;
 255   public static final int _fast_bputfield       = 212;
 256   public static final int _fast_zputfield       = 213;
 257   public static final int _fast_cputfield       = 214;
 258   public static final int _fast_dputfield       = 215;
 259   public static final int _fast_fputfield       = 216;
 260   public static final int _fast_iputfield       = 217;
 261   public static final int _fast_lputfield       = 218;
 262   public static final int _fast_sputfield       = 219;
 263   public static final int _fast_aload_0         = 220;
 264   public static final int _fast_iaccess_0       = 221;
 265   public static final int _fast_aaccess_0       = 222;
 266   public static final int _fast_faccess_0       = 223;
 267   public static final int _fast_iload           = 224;
 268   public static final int _fast_iload2          = 225;
 269   public static final int _fast_icaload         = 226;
 270   public static final int _fast_invokevfinal    = 227;
 271   public static final int _fast_linearswitch    = 228;
 272   public static final int _fast_binaryswitch    = 229;
 273   public static final int _fast_aldc            = 230;
 274   public static final int _fast_aldc_w          = 231;
 275   public static final int _return_register_finalizer = 232;
 276   public static final int _invokehandle         = 233;
 277   public static final int _shouldnotreachhere   = 234; // For debugging
 278 
 279   public static final int number_of_codes       = 235;
 280 
 281   // Flag bits derived from format strings, can_trap, can_rewrite, etc.:
 282   // semantic flags:
 283   static final int  _bc_can_trap      = 1<<0;     // bytecode execution can trap or block
 284   static final int  _bc_can_rewrite   = 1<<1;     // bytecode execution has an alternate form
 285 
 286   // format bits (determined only by the format string):
 287   static final int  _fmt_has_c        = 1<<2;     // constant, such as sipush "bcc"
 288   static final int  _fmt_has_j        = 1<<3;     // constant pool cache index, such as getfield "bjj"
 289   static final int  _fmt_has_k        = 1<<4;     // constant pool index, such as ldc "bk"
 290   static final int  _fmt_has_i        = 1<<5;     // local index, such as iload
 291   static final int  _fmt_has_o        = 1<<6;     // offset, such as ifeq
 292   static final int  _fmt_has_nbo      = 1<<7;     // contains native-order field(s)
 293   static final int  _fmt_has_u2       = 1<<8;     // contains double-byte field(s)
 294   static final int  _fmt_has_u4       = 1<<9;     // contains quad-byte field
 295   static final int  _fmt_not_variable = 1<<10;    // not of variable length (simple or wide)
 296   static final int  _fmt_not_simple   = 1<<11;    // either wide or variable length
 297   static final int  _all_fmt_bits     = (_fmt_not_simple*2 - _fmt_has_c);
 298 
 299   // Example derived format syndromes:
 300   static final int  _fmt_b      = _fmt_not_variable;
 301   static final int  _fmt_bc     = _fmt_b | _fmt_has_c;
 302   static final int  _fmt_bi     = _fmt_b | _fmt_has_i;
 303   static final int  _fmt_bkk    = _fmt_b | _fmt_has_k | _fmt_has_u2;
 304   static final int  _fmt_bJJ    = _fmt_b | _fmt_has_j | _fmt_has_u2 | _fmt_has_nbo;
 305   static final int  _fmt_bo2    = _fmt_b | _fmt_has_o | _fmt_has_u2;
 306   static final int  _fmt_bo4    = _fmt_b | _fmt_has_o | _fmt_has_u4;
 307 
 308 
 309   public static int specialLengthAt(Method method, int bci) {
 310     int code = codeAt(method, bci);
 311     switch (code) {
 312     case _wide:
 313       return wideLengthFor(method.getBytecodeOrBPAt(bci + 1));
 314     case _tableswitch:
 315       {
 316         int alignedBCI = Bits.roundTo(bci + 1, jintSize);
 317         int lo = method.getBytecodeIntArg(alignedBCI + 1*jintSize);
 318         int hi = method.getBytecodeIntArg(alignedBCI + 2*jintSize);
 319         return (alignedBCI - bci) + (3 + hi - lo + 1)*jintSize;
 320       }
 321 
 322     case _lookupswitch:      // fall through
 323     case _fast_binaryswitch: // fall through
 324     case _fast_linearswitch:
 325       {
 326         int alignedBCI = Bits.roundTo(bci + 1, jintSize);
 327         int npairs = method.getBytecodeIntArg(alignedBCI + jintSize);
 328         return (alignedBCI - bci) + (2 + 2*npairs)*jintSize;
 329       }
 330 
 331     }
 332     throw new RuntimeException("should not reach here");
 333   }
 334 
 335   // Conversion
 336   public static void check(int code) {
 337     if (Assert.ASSERTS_ENABLED) {
 338       Assert.that(isDefined(code), "illegal code " + code);
 339     }
 340   }
 341   public static void wideCheck(int code) {
 342     if (Assert.ASSERTS_ENABLED) {
 343       Assert.that(wideIsDefined(code), "illegal code " + code);
 344     }
 345   }
 346 
 347   /** Fetches a bytecode, hiding breakpoints as necessary */
 348   public static int codeAt(Method method, int bci) {
 349     int res = codeOrBPAt(method, bci);
 350     if (res == _breakpoint) {
 351       res = method.getOrigBytecodeAt(bci);
 352     }
 353     return res;
 354   }
 355 
 356   /** Fetches a bytecode or a breakpoint */
 357   public static int codeOrBPAt(Method method, int bci) {
 358     return method.getBytecodeOrBPAt(bci);
 359   }
 360 
 361   public static boolean isActiveBreakpointAt(Method method, int bci) {
 362     return (codeOrBPAt(method, bci) == _breakpoint);
 363   }
 364 
 365   // find a bytecode, behind a breakpoint if necessary:
 366   // FIXME: not yet implementable
 367   //   static Code       non_breakpoint_code_at(address bcp, Method* method = null);
 368 
 369   // Bytecode attributes
 370   public static boolean   isDefined    (int code) { return 0 <= code && code < number_of_codes && flags(code, false) != 0; }
 371   public static boolean   wideIsDefined(int code) { return isDefined(code) && flags(code, true) != 0; }
 372   public static String    name         (int code) { check(code);      return _name          [code]; }
 373   public static String    format       (int code) { check(code);      return _format        [code]; }
 374   public static String    wideFormat   (int code) { wideCheck(code);  return _wide_format   [code]; }
 375   public static int       resultType   (int code) { check(code);      return _result_type   [code]; }
 376   public static int       depth        (int code) { check(code);      return _depth         [code]; }
 377   public static int       lengthFor    (int code) { check(code);      return _lengths       [code] & 0xF; }
 378   public static int       wideLengthFor(int code) { check(code);      return _lengths       [code] >> 4; }
 379   public static boolean   canTrap      (int code) { check(code);      return has_all_flags(code, _bc_can_trap, false); }
 380   public static int       javaCode     (int code) { check(code);      return _java_code     [code]; }
 381   public static boolean   canRewrite   (int code) { check(code);      return has_all_flags(code, _bc_can_rewrite, false); }
 382   public static boolean   native_byte_order(int code)  { check(code);      return has_all_flags(code, _fmt_has_nbo, false); }
 383   public static boolean   uses_cp_cache  (int code)    { check(code);      return has_all_flags(code, _fmt_has_j, false); }
 384   public static int       lengthAt     (Method method, int bci) { int l = lengthFor(codeAt(method, bci)); return l > 0 ? l : specialLengthAt(method, bci); }
 385   public static int       javaLengthAt (Method method, int bci) { int l = lengthFor(javaCode(codeAt(method, bci))); return l > 0 ? l : specialLengthAt(method, bci); }
 386   public static boolean   isJavaCode   (int code) { return 0 <= code && code < number_of_java_codes; }
 387   public static boolean   isFastCode   (int code) { return number_of_java_codes <= code && code < number_of_codes; }
 388 
 389   public static boolean   isAload      (int code) { return (code == _aload  || code == _aload_0  || code == _aload_1
 390                                                                             || code == _aload_2  || code == _aload_3); }
 391   public static boolean   isAstore     (int code) { return (code == _astore || code == _astore_0 || code == _astore_1
 392                                                                             || code == _astore_2 || code == _astore_3); }
 393 
 394   public static boolean   isZeroConst  (int code) { return (code == _aconst_null || code == _iconst_0
 395                                                                                  || code == _fconst_0 || code == _dconst_0); }
 396 
 397   static int         flags          (int code, boolean is_wide) {
 398     assert code == (code & 0xff) : "must be a byte";
 399     return _flags[code + (is_wide ? 256 : 0)];
 400   }
 401   static int         format_bits    (int code, boolean is_wide) { return flags(code, is_wide) & _all_fmt_bits; }
 402   static boolean     has_all_flags  (int code, int test_flags, boolean is_wide) {
 403     return (flags(code, is_wide) & test_flags) == test_flags;
 404   }
 405 
 406   static char compute_flags(String format) {
 407     return compute_flags(format, 0);
 408   }
 409   static char compute_flags(String format, int more_flags) {
 410     if (format == null)  return 0;  // not even more_flags
 411     int flags = more_flags;
 412     int fp = 0;
 413     if (format.length() == 0) {
 414       flags |= _fmt_not_simple; // but variable
 415     } else {
 416       switch (format.charAt(fp)) {
 417       case 'b':
 418         flags |= _fmt_not_variable;  // but simple
 419         ++fp;  // skip 'b'
 420         break;
 421       case 'w':
 422         flags |= _fmt_not_variable | _fmt_not_simple;
 423         ++fp;  // skip 'w'
 424       assert(format.charAt(fp) == 'b') : "wide format must start with 'wb'";
 425         ++fp;  // skip 'b'
 426         break;
 427       }
 428     }
 429 
 430     boolean has_nbo = false, has_jbo = false;
 431     int has_size = 0;
 432     while (fp < format.length()) {
 433       int this_flag = 0;
 434       char fc = format.charAt(fp++);
 435       switch (fc) {
 436       case '_': continue;         // ignore these
 437 
 438       case 'j': this_flag = _fmt_has_j; has_jbo = true; break;
 439       case 'k': this_flag = _fmt_has_k; has_jbo = true; break;
 440       case 'i': this_flag = _fmt_has_i; has_jbo = true; break;
 441       case 'c': this_flag = _fmt_has_c; has_jbo = true; break;
 442       case 'o': this_flag = _fmt_has_o; has_jbo = true; break;
 443 
 444         // uppercase versions mark native byte order (from Rewriter)
 445         // actually, only the 'J' case happens currently
 446       case 'J': this_flag = _fmt_has_j; has_nbo = true; break;
 447       case 'K': this_flag = _fmt_has_k; has_nbo = true; break;
 448       case 'I': this_flag = _fmt_has_i; has_nbo = true; break;
 449       case 'C': this_flag = _fmt_has_c; has_nbo = true; break;
 450       case 'O': this_flag = _fmt_has_o; has_nbo = true; break;
 451       default:  assert false : "bad char in format";
 452       }
 453 
 454       flags |= this_flag;
 455 
 456       assert !(has_jbo && has_nbo) : "mixed byte orders in format";
 457       if (has_nbo)
 458         flags |= _fmt_has_nbo;
 459 
 460       int this_size = 1;
 461       if (fp < format.length() && format.charAt(fp) == fc) {
 462         // advance beyond run of the same characters
 463         this_size = 2;
 464         while (fp  + 1 < format.length() && format.charAt(++fp) == fc)  this_size++;
 465         switch (this_size) {
 466         case 2: flags |= _fmt_has_u2; break;
 467         case 4: flags |= _fmt_has_u4; break;
 468         default: assert false : "bad rep count in format";
 469         }
 470       }
 471       assert has_size == 0 ||                     // no field yet
 472         this_size == has_size ||             // same size
 473         this_size < has_size && fp == format.length() : // last field can be short
 474              "mixed field sizes in format";
 475       has_size = this_size;
 476     }
 477 
 478     assert flags == (char)flags : "change _format_flags";
 479     return (char)flags;
 480   }
 481 
 482 
 483   //----------------------------------------------------------------------
 484   // Internals only below this point
 485   //
 486 
 487   private static String[]    _name;
 488   private static String[]    _format;
 489   private static String[]    _wide_format;
 490   private static int[]       _result_type;
 491   private static byte[]      _depth;
 492   private static byte[]      _lengths;
 493   private static int[]       _java_code;
 494   private static char[]      _flags;
 495 
 496   static {
 497     _name           = new String [number_of_codes];
 498     _format         = new String [number_of_codes];
 499     _wide_format    = new String [number_of_codes];
 500     _result_type    = new int    [number_of_codes]; // See BasicType.java
 501     _depth          = new byte   [number_of_codes];
 502     _lengths        = new byte   [number_of_codes];
 503     _java_code      = new int    [number_of_codes];
 504     _flags          = new char[256 * 2]; // all second page for wide formats
 505 
 506     // In case we want to fetch this information from the VM in the
 507     // future
 508     VM.registerVMInitializedObserver(new Observer() {
 509         public void update(Observable o, Object data) {
 510           initialize();
 511         }
 512       });
 513   }
 514 
 515   private static final int jintSize    =   4;
 516 
 517   //  private static String[]    _name           = new String [number_of_codes];
 518   //  private static String[]    _format         = new String [number_of_codes];
 519   //  private static String[]    _wide_format    = new String [number_of_codes];
 520   //  private static int[]       _result_type    = new int    [number_of_codes]; // See BasicType.java
 521   //  private static byte[]      _depth          = new byte   [number_of_codes];
 522   //  private static byte[]      _length         = new byte   [number_of_codes];
 523   //  private static boolean[]   _can_trap       = new boolean[number_of_codes];
 524   //  private static int[]       _java_code      = new int    [number_of_codes];
 525   //  private static boolean[]   _can_rewrite    = new boolean[number_of_codes];
 526 
 527   // Initialization
 528   private static void initialize() {
 529     if (Assert.ASSERTS_ENABLED) {
 530       Assert.that(number_of_codes <= 256, "too many bytecodes");
 531     }
 532 
 533     // Format strings interpretation:
 534     //
 535     // b: bytecode
 536     // c: signed constant, Java byte-ordering
 537     // i: unsigned index , Java byte-ordering
 538     // j: unsigned index , native byte-ordering
 539     // o: branch offset  , Java byte-ordering
 540     // _: unused/ignored
 541     // w: wide bytecode
 542     //
 543     // Note: Right now the format strings are used for 2 purposes:
 544     //       1. to specify the length of the bytecode
 545     //          (= number of characters in format string)
 546     //       2. to specify the bytecode attributes
 547     //
 548     //       The bytecode attributes are currently used only for bytecode tracing
 549     //       (see BytecodeTracer); thus if more specific format information is
 550     //       used, one would also have to adjust the bytecode tracer.
 551     //
 552     // Note: For bytecodes with variable length, the format string is the empty string.
 553 
 554     // Note 1: null for the format string means the bytecode doesn't exist
 555     //         in that form.
 556     //
 557     // Note 2: The result type is T_ILLEGAL for bytecodes where the top of stack
 558     //         type after execution is not only determined by the bytecode itself.
 559 
 560     //  Java bytecodes
 561     //  bytecode               bytecode name           format   wide f.   result tp                stk traps
 562     def(_nop                 , "nop"                 , "b"    , null    , BasicType.getTVoid()   ,  0, false);
 563     def(_aconst_null         , "aconst_null"         , "b"    , null    , BasicType.getTObject() ,  1, false);
 564     def(_iconst_m1           , "iconst_m1"           , "b"    , null    , BasicType.getTInt()    ,  1, false);
 565     def(_iconst_0            , "iconst_0"            , "b"    , null    , BasicType.getTInt()    ,  1, false);
 566     def(_iconst_1            , "iconst_1"            , "b"    , null    , BasicType.getTInt()    ,  1, false);
 567     def(_iconst_2            , "iconst_2"            , "b"    , null    , BasicType.getTInt()    ,  1, false);
 568     def(_iconst_3            , "iconst_3"            , "b"    , null    , BasicType.getTInt()    ,  1, false);
 569     def(_iconst_4            , "iconst_4"            , "b"    , null    , BasicType.getTInt()    ,  1, false);
 570     def(_iconst_5            , "iconst_5"            , "b"    , null    , BasicType.getTInt()    ,  1, false);
 571     def(_lconst_0            , "lconst_0"            , "b"    , null    , BasicType.getTLong()   ,  2, false);
 572     def(_lconst_1            , "lconst_1"            , "b"    , null    , BasicType.getTLong()   ,  2, false);
 573     def(_fconst_0            , "fconst_0"            , "b"    , null    , BasicType.getTFloat()  ,  1, false);
 574     def(_fconst_1            , "fconst_1"            , "b"    , null    , BasicType.getTFloat()  ,  1, false);
 575     def(_fconst_2            , "fconst_2"            , "b"    , null    , BasicType.getTFloat()  ,  1, false);
 576     def(_dconst_0            , "dconst_0"            , "b"    , null    , BasicType.getTDouble() ,  2, false);
 577     def(_dconst_1            , "dconst_1"            , "b"    , null    , BasicType.getTDouble() ,  2, false);
 578     def(_bipush              , "bipush"              , "bc"   , null    , BasicType.getTInt()    ,  1, false);
 579     def(_sipush              , "sipush"              , "bcc"  , null    , BasicType.getTInt()    ,  1, false);
 580     def(_ldc                 , "ldc"                 , "bk"   , null    , BasicType.getTIllegal(),  1, true );
 581     def(_ldc_w               , "ldc_w"               , "bkk"  , null    , BasicType.getTIllegal(),  1, true );
 582     def(_ldc2_w              , "ldc2_w"              , "bkk"  , null    , BasicType.getTIllegal(),  2, true );
 583     def(_iload               , "iload"               , "bi"   , "wbii"  , BasicType.getTInt()    ,  1, false);
 584     def(_lload               , "lload"               , "bi"   , "wbii"  , BasicType.getTLong()   ,  2, false);
 585     def(_fload               , "fload"               , "bi"   , "wbii"  , BasicType.getTFloat()  ,  1, false);
 586     def(_dload               , "dload"               , "bi"   , "wbii"  , BasicType.getTDouble() ,  2, false);
 587     def(_aload               , "aload"               , "bi"   , "wbii"  , BasicType.getTObject() ,  1, false);
 588     def(_iload_0             , "iload_0"             , "b"    , null    , BasicType.getTInt()    ,  1, false);
 589     def(_iload_1             , "iload_1"             , "b"    , null    , BasicType.getTInt()    ,  1, false);
 590     def(_iload_2             , "iload_2"             , "b"    , null    , BasicType.getTInt()    ,  1, false);
 591     def(_iload_3             , "iload_3"             , "b"    , null    , BasicType.getTInt()    ,  1, false);
 592     def(_lload_0             , "lload_0"             , "b"    , null    , BasicType.getTLong()   ,  2, false);
 593     def(_lload_1             , "lload_1"             , "b"    , null    , BasicType.getTLong()   ,  2, false);
 594     def(_lload_2             , "lload_2"             , "b"    , null    , BasicType.getTLong()   ,  2, false);
 595     def(_lload_3             , "lload_3"             , "b"    , null    , BasicType.getTLong()   ,  2, false);
 596     def(_fload_0             , "fload_0"             , "b"    , null    , BasicType.getTFloat()  ,  1, false);
 597     def(_fload_1             , "fload_1"             , "b"    , null    , BasicType.getTFloat()  ,  1, false);
 598     def(_fload_2             , "fload_2"             , "b"    , null    , BasicType.getTFloat()  ,  1, false);
 599     def(_fload_3             , "fload_3"             , "b"    , null    , BasicType.getTFloat()  ,  1, false);
 600     def(_dload_0             , "dload_0"             , "b"    , null    , BasicType.getTDouble() ,  2, false);
 601     def(_dload_1             , "dload_1"             , "b"    , null    , BasicType.getTDouble() ,  2, false);
 602     def(_dload_2             , "dload_2"             , "b"    , null    , BasicType.getTDouble() ,  2, false);
 603     def(_dload_3             , "dload_3"             , "b"    , null    , BasicType.getTDouble() ,  2, false);
 604     def(_aload_0             , "aload_0"             , "b"    , null    , BasicType.getTObject() ,  1, true ); // rewriting in interpreter
 605     def(_aload_1             , "aload_1"             , "b"    , null    , BasicType.getTObject() ,  1, false);
 606     def(_aload_2             , "aload_2"             , "b"    , null    , BasicType.getTObject() ,  1, false);
 607     def(_aload_3             , "aload_3"             , "b"    , null    , BasicType.getTObject() ,  1, false);
 608     def(_iaload              , "iaload"              , "b"    , null    , BasicType.getTInt()    , -1, true );
 609     def(_laload              , "laload"              , "b"    , null    , BasicType.getTLong()   ,  0, true );
 610     def(_faload              , "faload"              , "b"    , null    , BasicType.getTFloat()  , -1, true );
 611     def(_daload              , "daload"              , "b"    , null    , BasicType.getTDouble() ,  0, true );
 612     def(_aaload              , "aaload"              , "b"    , null    , BasicType.getTObject() , -1, true );
 613     def(_baload              , "baload"              , "b"    , null    , BasicType.getTInt()    , -1, true );
 614     def(_caload              , "caload"              , "b"    , null    , BasicType.getTInt()    , -1, true );
 615     def(_saload              , "saload"              , "b"    , null    , BasicType.getTInt()    , -1, true );
 616     def(_istore              , "istore"              , "bi"   , "wbii"  , BasicType.getTVoid()   , -1, false);
 617     def(_lstore              , "lstore"              , "bi"   , "wbii"  , BasicType.getTVoid()   , -2, false);
 618     def(_fstore              , "fstore"              , "bi"   , "wbii"  , BasicType.getTVoid()   , -1, false);
 619     def(_dstore              , "dstore"              , "bi"   , "wbii"  , BasicType.getTVoid()   , -2, false);
 620     def(_astore              , "astore"              , "bi"   , "wbii"  , BasicType.getTVoid()   , -1, false);
 621     def(_istore_0            , "istore_0"            , "b"    , null    , BasicType.getTVoid()   , -1, false);
 622     def(_istore_1            , "istore_1"            , "b"    , null    , BasicType.getTVoid()   , -1, false);
 623     def(_istore_2            , "istore_2"            , "b"    , null    , BasicType.getTVoid()   , -1, false);
 624     def(_istore_3            , "istore_3"            , "b"    , null    , BasicType.getTVoid()   , -1, false);
 625     def(_lstore_0            , "lstore_0"            , "b"    , null    , BasicType.getTVoid()   , -2, false);
 626     def(_lstore_1            , "lstore_1"            , "b"    , null    , BasicType.getTVoid()   , -2, false);
 627     def(_lstore_2            , "lstore_2"            , "b"    , null    , BasicType.getTVoid()   , -2, false);
 628     def(_lstore_3            , "lstore_3"            , "b"    , null    , BasicType.getTVoid()   , -2, false);
 629     def(_fstore_0            , "fstore_0"            , "b"    , null    , BasicType.getTVoid()   , -1, false);
 630     def(_fstore_1            , "fstore_1"            , "b"    , null    , BasicType.getTVoid()   , -1, false);
 631     def(_fstore_2            , "fstore_2"            , "b"    , null    , BasicType.getTVoid()   , -1, false);
 632     def(_fstore_3            , "fstore_3"            , "b"    , null    , BasicType.getTVoid()   , -1, false);
 633     def(_dstore_0            , "dstore_0"            , "b"    , null    , BasicType.getTVoid()   , -2, false);
 634     def(_dstore_1            , "dstore_1"            , "b"    , null    , BasicType.getTVoid()   , -2, false);
 635     def(_dstore_2            , "dstore_2"            , "b"    , null    , BasicType.getTVoid()   , -2, false);
 636     def(_dstore_3            , "dstore_3"            , "b"    , null    , BasicType.getTVoid()   , -2, false);
 637     def(_astore_0            , "astore_0"            , "b"    , null    , BasicType.getTVoid()   , -1, false);
 638     def(_astore_1            , "astore_1"            , "b"    , null    , BasicType.getTVoid()   , -1, false);
 639     def(_astore_2            , "astore_2"            , "b"    , null    , BasicType.getTVoid()   , -1, false);
 640     def(_astore_3            , "astore_3"            , "b"    , null    , BasicType.getTVoid()   , -1, false);
 641     def(_iastore             , "iastore"             , "b"    , null    , BasicType.getTVoid()   , -3, true );
 642     def(_lastore             , "lastore"             , "b"    , null    , BasicType.getTVoid()   , -4, true );
 643     def(_fastore             , "fastore"             , "b"    , null    , BasicType.getTVoid()   , -3, true );
 644     def(_dastore             , "dastore"             , "b"    , null    , BasicType.getTVoid()   , -4, true );
 645     def(_aastore             , "aastore"             , "b"    , null    , BasicType.getTVoid()   , -3, true );
 646     def(_bastore             , "bastore"             , "b"    , null    , BasicType.getTVoid()   , -3, true );
 647     def(_castore             , "castore"             , "b"    , null    , BasicType.getTVoid()   , -3, true );
 648     def(_sastore             , "sastore"             , "b"    , null    , BasicType.getTVoid()   , -3, true );
 649     def(_pop                 , "pop"                 , "b"    , null    , BasicType.getTVoid()   , -1, false);
 650     def(_pop2                , "pop2"                , "b"    , null    , BasicType.getTVoid()   , -2, false);
 651     def(_dup                 , "dup"                 , "b"    , null    , BasicType.getTVoid()   ,  1, false);
 652     def(_dup_x1              , "dup_x1"              , "b"    , null    , BasicType.getTVoid()   ,  1, false);
 653     def(_dup_x2              , "dup_x2"              , "b"    , null    , BasicType.getTVoid()   ,  1, false);
 654     def(_dup2                , "dup2"                , "b"    , null    , BasicType.getTVoid()   ,  2, false);
 655     def(_dup2_x1             , "dup2_x1"             , "b"    , null    , BasicType.getTVoid()   ,  2, false);
 656     def(_dup2_x2             , "dup2_x2"             , "b"    , null    , BasicType.getTVoid()   ,  2, false);
 657     def(_swap                , "swap"                , "b"    , null    , BasicType.getTVoid()   ,  0, false);
 658     def(_iadd                , "iadd"                , "b"    , null    , BasicType.getTInt()    , -1, false);
 659     def(_ladd                , "ladd"                , "b"    , null    , BasicType.getTLong()   , -2, false);
 660     def(_fadd                , "fadd"                , "b"    , null    , BasicType.getTFloat()  , -1, false);
 661     def(_dadd                , "dadd"                , "b"    , null    , BasicType.getTDouble() , -2, false);
 662     def(_isub                , "isub"                , "b"    , null    , BasicType.getTInt()    , -1, false);
 663     def(_lsub                , "lsub"                , "b"    , null    , BasicType.getTLong()   , -2, false);
 664     def(_fsub                , "fsub"                , "b"    , null    , BasicType.getTFloat()  , -1, false);
 665     def(_dsub                , "dsub"                , "b"    , null    , BasicType.getTDouble() , -2, false);
 666     def(_imul                , "imul"                , "b"    , null    , BasicType.getTInt()    , -1, false);
 667     def(_lmul                , "lmul"                , "b"    , null    , BasicType.getTLong()   , -2, false);
 668     def(_fmul                , "fmul"                , "b"    , null    , BasicType.getTFloat()  , -1, false);
 669     def(_dmul                , "dmul"                , "b"    , null    , BasicType.getTDouble() , -2, false);
 670     def(_idiv                , "idiv"                , "b"    , null    , BasicType.getTInt()    , -1, true );
 671     def(_ldiv                , "ldiv"                , "b"    , null    , BasicType.getTLong()   , -2, true );
 672     def(_fdiv                , "fdiv"                , "b"    , null    , BasicType.getTFloat()  , -1, false);
 673     def(_ddiv                , "ddiv"                , "b"    , null    , BasicType.getTDouble() , -2, false);
 674     def(_irem                , "irem"                , "b"    , null    , BasicType.getTInt()    , -1, true );
 675     def(_lrem                , "lrem"                , "b"    , null    , BasicType.getTLong()   , -2, true );
 676     def(_frem                , "frem"                , "b"    , null    , BasicType.getTFloat()  , -1, false);
 677     def(_drem                , "drem"                , "b"    , null    , BasicType.getTDouble() , -2, false);
 678     def(_ineg                , "ineg"                , "b"    , null    , BasicType.getTInt()    ,  0, false);
 679     def(_lneg                , "lneg"                , "b"    , null    , BasicType.getTLong()   ,  0, false);
 680     def(_fneg                , "fneg"                , "b"    , null    , BasicType.getTFloat()  ,  0, false);
 681     def(_dneg                , "dneg"                , "b"    , null    , BasicType.getTDouble() ,  0, false);
 682     def(_ishl                , "ishl"                , "b"    , null    , BasicType.getTInt()    , -1, false);
 683     def(_lshl                , "lshl"                , "b"    , null    , BasicType.getTLong()   , -1, false);
 684     def(_ishr                , "ishr"                , "b"    , null    , BasicType.getTInt()    , -1, false);
 685     def(_lshr                , "lshr"                , "b"    , null    , BasicType.getTLong()   , -1, false);
 686     def(_iushr               , "iushr"               , "b"    , null    , BasicType.getTInt()    , -1, false);
 687     def(_lushr               , "lushr"               , "b"    , null    , BasicType.getTLong()   , -1, false);
 688     def(_iand                , "iand"                , "b"    , null    , BasicType.getTInt()    , -1, false);
 689     def(_land                , "land"                , "b"    , null    , BasicType.getTLong()   , -2, false);
 690     def(_ior                 , "ior"                 , "b"    , null    , BasicType.getTInt()    , -1, false);
 691     def(_lor                 , "lor"                 , "b"    , null    , BasicType.getTLong()   , -2, false);
 692     def(_ixor                , "ixor"                , "b"    , null    , BasicType.getTInt()    , -1, false);
 693     def(_lxor                , "lxor"                , "b"    , null    , BasicType.getTLong()   , -2, false);
 694     def(_iinc                , "iinc"                , "bic"  , "wbiicc", BasicType.getTVoid()   ,  0, false);
 695     def(_i2l                 , "i2l"                 , "b"    , null    , BasicType.getTLong()   ,  1, false);
 696     def(_i2f                 , "i2f"                 , "b"    , null    , BasicType.getTFloat()  ,  0, false);
 697     def(_i2d                 , "i2d"                 , "b"    , null    , BasicType.getTDouble() ,  1, false);
 698     def(_l2i                 , "l2i"                 , "b"    , null    , BasicType.getTInt()    , -1, false);
 699     def(_l2f                 , "l2f"                 , "b"    , null    , BasicType.getTFloat()  , -1, false);
 700     def(_l2d                 , "l2d"                 , "b"    , null    , BasicType.getTDouble() ,  0, false);
 701     def(_f2i                 , "f2i"                 , "b"    , null    , BasicType.getTInt()    ,  0, false);
 702     def(_f2l                 , "f2l"                 , "b"    , null    , BasicType.getTLong()   ,  1, false);
 703     def(_f2d                 , "f2d"                 , "b"    , null    , BasicType.getTDouble() ,  1, false);
 704     def(_d2i                 , "d2i"                 , "b"    , null    , BasicType.getTInt()    , -1, false);
 705     def(_d2l                 , "d2l"                 , "b"    , null    , BasicType.getTLong()   ,  0, false);
 706     def(_d2f                 , "d2f"                 , "b"    , null    , BasicType.getTFloat()  , -1, false);
 707     def(_i2b                 , "i2b"                 , "b"    , null    , BasicType.getTByte()   ,  0, false);
 708     def(_i2c                 , "i2c"                 , "b"    , null    , BasicType.getTChar()   ,  0, false);
 709     def(_i2s                 , "i2s"                 , "b"    , null    , BasicType.getTShort()  ,  0, false);
 710     def(_lcmp                , "lcmp"                , "b"    , null    , BasicType.getTVoid()   , -3, false);
 711     def(_fcmpl               , "fcmpl"               , "b"    , null    , BasicType.getTVoid()   , -1, false);
 712     def(_fcmpg               , "fcmpg"               , "b"    , null    , BasicType.getTVoid()   , -1, false);
 713     def(_dcmpl               , "dcmpl"               , "b"    , null    , BasicType.getTVoid()   , -3, false);
 714     def(_dcmpg               , "dcmpg"               , "b"    , null    , BasicType.getTVoid()   , -3, false);
 715     def(_ifeq                , "ifeq"                , "boo"  , null    , BasicType.getTVoid()   , -1, false);
 716     def(_ifne                , "ifne"                , "boo"  , null    , BasicType.getTVoid()   , -1, false);
 717     def(_iflt                , "iflt"                , "boo"  , null    , BasicType.getTVoid()   , -1, false);
 718     def(_ifge                , "ifge"                , "boo"  , null    , BasicType.getTVoid()   , -1, false);
 719     def(_ifgt                , "ifgt"                , "boo"  , null    , BasicType.getTVoid()   , -1, false);
 720     def(_ifle                , "ifle"                , "boo"  , null    , BasicType.getTVoid()   , -1, false);
 721     def(_if_icmpeq           , "if_icmpeq"           , "boo"  , null    , BasicType.getTVoid()   , -2, false);
 722     def(_if_icmpne           , "if_icmpne"           , "boo"  , null    , BasicType.getTVoid()   , -2, false);
 723     def(_if_icmplt           , "if_icmplt"           , "boo"  , null    , BasicType.getTVoid()   , -2, false);
 724     def(_if_icmpge           , "if_icmpge"           , "boo"  , null    , BasicType.getTVoid()   , -2, false);
 725     def(_if_icmpgt           , "if_icmpgt"           , "boo"  , null    , BasicType.getTVoid()   , -2, false);
 726     def(_if_icmple           , "if_icmple"           , "boo"  , null    , BasicType.getTVoid()   , -2, false);
 727     def(_if_acmpeq           , "if_acmpeq"           , "boo"  , null    , BasicType.getTVoid()   , -2, false);
 728     def(_if_acmpne           , "if_acmpne"           , "boo"  , null    , BasicType.getTVoid()   , -2, false);
 729     def(_goto                , "goto"                , "boo"  , null    , BasicType.getTVoid()   ,  0, false);
 730     def(_jsr                 , "jsr"                 , "boo"  , null    , BasicType.getTInt()    ,  0, false);
 731     def(_ret                 , "ret"                 , "bi"   , "wbii"  , BasicType.getTVoid()   ,  0, false);
 732     def(_tableswitch         , "tableswitch"         , ""     , null    , BasicType.getTVoid()   , -1, false); // may have backward branches
 733     def(_lookupswitch        , "lookupswitch"        , ""     , null    , BasicType.getTVoid()   , -1, false); // rewriting in interpreter
 734     def(_ireturn             , "ireturn"             , "b"    , null    , BasicType.getTInt()    , -1, true );
 735     def(_lreturn             , "lreturn"             , "b"    , null    , BasicType.getTLong()   , -2, true );
 736     def(_freturn             , "freturn"             , "b"    , null    , BasicType.getTFloat()  , -1, true );
 737     def(_dreturn             , "dreturn"             , "b"    , null    , BasicType.getTDouble() , -2, true );
 738     def(_areturn             , "areturn"             , "b"    , null    , BasicType.getTObject() , -1, true );
 739     def(_return              , "return"              , "b"    , null    , BasicType.getTVoid()   ,  0, true );
 740     def(_getstatic           , "getstatic"           , "bJJ"  , null    , BasicType.getTIllegal(),  1, true );
 741     def(_putstatic           , "putstatic"           , "bJJ"  , null    , BasicType.getTIllegal(), -1, true );
 742     def(_getfield            , "getfield"            , "bJJ"  , null    , BasicType.getTIllegal(),  0, true );
 743     def(_putfield            , "putfield"            , "bJJ"  , null    , BasicType.getTIllegal(), -2, true );
 744     def(_invokevirtual       , "invokevirtual"       , "bJJ"  , null    , BasicType.getTIllegal(), -1, true );
 745     def(_invokespecial       , "invokespecial"       , "bJJ"  , null    , BasicType.getTIllegal(), -1, true );
 746     def(_invokestatic        , "invokestatic"        , "bJJ"  , null    , BasicType.getTIllegal(),  0, true );
 747     def(_invokeinterface     , "invokeinterface"     , "bJJ__", null    , BasicType.getTIllegal(), -1, true );
 748     def(_invokedynamic       , "invokedynamic"       , "bJJJJ", null    , BasicType.getTIllegal(),  0, true );
 749     def(_new                 , "new"                 , "bkk"  , null    , BasicType.getTObject() ,  1, true );
 750     def(_newarray            , "newarray"            , "bc"   , null    , BasicType.getTObject() ,  0, true );
 751     def(_anewarray           , "anewarray"           , "bkk"  , null    , BasicType.getTObject() ,  0, true );
 752     def(_arraylength         , "arraylength"         , "b"    , null    , BasicType.getTVoid()   ,  0, true );
 753     def(_athrow              , "athrow"              , "b"    , null    , BasicType.getTVoid()   , -1, true );
 754     def(_checkcast           , "checkcast"           , "bkk"  , null    , BasicType.getTObject() ,  0, true );
 755     def(_instanceof          , "instanceof"          , "bkk"  , null    , BasicType.getTInt()    ,  0, true );
 756     def(_monitorenter        , "monitorenter"        , "b"    , null    , BasicType.getTVoid()   , -1, true );
 757     def(_monitorexit         , "monitorexit"         , "b"    , null    , BasicType.getTVoid()   , -1, true );
 758     def(_wide                , "wide"                , ""     , null    , BasicType.getTVoid()   ,  0, false);
 759     def(_multianewarray      , "multianewarray"      , "bkkc" , null    , BasicType.getTObject() ,  1, true );
 760     def(_ifnull              , "ifnull"              , "boo"  , null    , BasicType.getTVoid()   , -1, false);
 761     def(_ifnonnull           , "ifnonnull"           , "boo"  , null    , BasicType.getTVoid()   , -1, false);
 762     def(_goto_w              , "goto_w"              , "boooo", null    , BasicType.getTVoid()   ,  0, false);
 763     def(_jsr_w               , "jsr_w"               , "boooo", null    , BasicType.getTInt()    ,  0, false);
 764     def(_breakpoint          , "breakpoint"          , ""     , null    , BasicType.getTVoid()   ,  0, true );
 765 
 766     //  JVM bytecodes
 767     //  bytecode               bytecode name           format   wide f.   result tp               stk traps  std code
 768 
 769     def(_fast_agetfield      , "fast_agetfield"      , "bJJ"  , null    , BasicType.getTObject() ,  0, true , _getfield       );
 770     def(_fast_bgetfield      , "fast_bgetfield"      , "bJJ"  , null    , BasicType.getTInt()    ,  0, true , _getfield       );
 771     def(_fast_cgetfield      , "fast_cgetfield"      , "bJJ"  , null    , BasicType.getTChar()   ,  0, true , _getfield       );
 772     def(_fast_dgetfield      , "fast_dgetfield"      , "bJJ"  , null    , BasicType.getTDouble() ,  0, true , _getfield       );
 773     def(_fast_fgetfield      , "fast_fgetfield"      , "bJJ"  , null    , BasicType.getTFloat()  ,  0, true , _getfield       );
 774     def(_fast_igetfield      , "fast_igetfield"      , "bJJ"  , null    , BasicType.getTInt()    ,  0, true , _getfield       );
 775     def(_fast_lgetfield      , "fast_lgetfield"      , "bJJ"  , null    , BasicType.getTLong()   ,  0, true , _getfield       );
 776     def(_fast_sgetfield      , "fast_sgetfield"      , "bJJ"  , null    , BasicType.getTShort()  ,  0, true , _getfield       );
 777 
 778     def(_fast_aputfield      , "fast_aputfield"      , "bJJ"  , null    , BasicType.getTObject() ,  0, true , _putfield       );
 779     def(_fast_bputfield      , "fast_bputfield"      , "bJJ"  , null    , BasicType.getTInt()    ,  0, true , _putfield       );
 780     def(_fast_zputfield      , "fast_zputfield"      , "bJJ"  , null    , BasicType.getTInt()    ,  0, true , _putfield       );
 781     def(_fast_cputfield      , "fast_cputfield"      , "bJJ"  , null    , BasicType.getTChar()   ,  0, true , _putfield       );
 782     def(_fast_dputfield      , "fast_dputfield"      , "bJJ"  , null    , BasicType.getTDouble() ,  0, true , _putfield       );
 783     def(_fast_fputfield      , "fast_fputfield"      , "bJJ"  , null    , BasicType.getTFloat()  ,  0, true , _putfield       );
 784     def(_fast_iputfield      , "fast_iputfield"      , "bJJ"  , null    , BasicType.getTInt()    ,  0, true , _putfield       );
 785     def(_fast_lputfield      , "fast_lputfield"      , "bJJ"  , null    , BasicType.getTLong()   ,  0, true , _putfield       );
 786     def(_fast_sputfield      , "fast_sputfield"      , "bJJ"  , null    , BasicType.getTShort()  ,  0, true , _putfield       );
 787 
 788     def(_fast_aload_0        , "fast_aload_0"        , "b"    , null    , BasicType.getTObject() ,  1, true , _aload_0        );
 789     def(_fast_iaccess_0      , "fast_iaccess_0"      , "b_JJ" , null    , BasicType.getTInt()    ,  1, true , _aload_0        );
 790     def(_fast_aaccess_0      , "fast_aaccess_0"      , "b_JJ" , null    , BasicType.getTObject() ,  1, true , _aload_0        );
 791     def(_fast_faccess_0      , "fast_faccess_0"      , "b_JJ" , null    , BasicType.getTObject() ,  1, true , _aload_0        );
 792 
 793     def(_fast_iload          , "fast_iload"          , "bi"   , null    , BasicType.getTInt()    ,  1, false, _iload          );
 794     def(_fast_iload2         , "fast_iload2"         , "bi_i" , null    , BasicType.getTInt()    ,  2, false, _iload          );
 795     def(_fast_icaload        , "fast_icaload"        , "bi_"  , null    , BasicType.getTInt()    ,  0, false, _iload          );
 796 
 797     // Faster method invocation.
 798     def(_fast_invokevfinal   , "fast_invokevfinal"   , "bJJ"  , null    , BasicType.getTIllegal(), -1, true, _invokevirtual   );
 799 
 800     def(_fast_linearswitch   , "fast_linearswitch"   , ""     , null    , BasicType.getTVoid()   , -1, false, _lookupswitch   );
 801     def(_fast_binaryswitch   , "fast_binaryswitch"   , ""     , null    , BasicType.getTVoid()   , -1, false, _lookupswitch   );
 802     def(_fast_aldc           , "fast_aldc"           , "bj"   , null    , BasicType.getTObject(),   1, true,  _ldc            );
 803     def(_fast_aldc_w         , "fast_aldc_w"         , "bJJ"  , null    , BasicType.getTObject(),   1, true,  _ldc_w          );
 804 
 805     def(_return_register_finalizer, "return_register_finalizer", "b"    , null    , BasicType.getTVoid()   , 0, true, _return );
 806 
 807     // special handling of signature-polymorphic methods
 808     def(_invokehandle        , "invokehandle"        , "bJJ"  , null    , BasicType.getTIllegal(), -1, true, _invokevirtual   );
 809 
 810     def(_shouldnotreachhere  , "_shouldnotreachhere" , "b"    , null    , BasicType.getTVoid()   ,  0, false);
 811 
 812     if (Assert.ASSERTS_ENABLED) {
 813       // compare can_trap information for each bytecode with the
 814       // can_trap information for the corresponding base bytecode
 815       // (if a rewritten bytecode can trap, so must the base bytecode)
 816       for (int i = 0; i < number_of_codes; i++) {
 817         if (isDefined(i)) {
 818           int j = javaCode(i);
 819           if (canTrap(i) && !canTrap(j)) {
 820             Assert.that(false, name(i) + " can trap => " + name(j) + " can trap, too");
 821           }
 822         }
 823       }
 824     }
 825   }
 826 
 827   private static void def(int code, String name, String format, String wide_format, int result_type, int depth, boolean can_trap) {
 828     def(code, name, format, wide_format, result_type, depth, can_trap, code);
 829   }
 830 
 831   private static void def(int code, String name, String format, String wide_format, int result_type, int depth, boolean can_trap, int java_code) {
 832     if (Assert.ASSERTS_ENABLED) {
 833       Assert.that(wide_format == null || format != null, "short form must exist if there's a wide form");
 834     }
 835     int len  = (format      != null ? format.length()      : 0);
 836     int wlen = (wide_format != null ? wide_format.length() : 0);
 837     _name          [code] = name;
 838     _result_type   [code] = result_type;
 839     _depth         [code] = (byte) depth;
 840     _lengths       [code] = (byte)((wlen << 4) | (len & 0xF));
 841     _java_code     [code] = java_code;
 842     _format        [code] = format;
 843     _wide_format   [code] = wide_format;
 844     int bc_flags = 0;
 845     if (can_trap)           bc_flags |= _bc_can_trap;
 846     if (java_code != code)  bc_flags |= _bc_can_rewrite;
 847     _flags[code+0*256] = compute_flags(format,      bc_flags);
 848     _flags[code+1*256] = compute_flags(wide_format, bc_flags);
 849   }
 850 }