Home | History | Annotate | Download | only in code
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.dx.dex.code;
     18 
     19 import com.android.dx.dex.DexOptions;
     20 import com.android.dx.dex.code.form.Form10t;
     21 import com.android.dx.dex.code.form.Form10x;
     22 import com.android.dx.dex.code.form.Form11n;
     23 import com.android.dx.dex.code.form.Form11x;
     24 import com.android.dx.dex.code.form.Form12x;
     25 import com.android.dx.dex.code.form.Form20t;
     26 import com.android.dx.dex.code.form.Form21c;
     27 import com.android.dx.dex.code.form.Form21h;
     28 import com.android.dx.dex.code.form.Form21s;
     29 import com.android.dx.dex.code.form.Form21t;
     30 import com.android.dx.dex.code.form.Form22b;
     31 import com.android.dx.dex.code.form.Form22c;
     32 import com.android.dx.dex.code.form.Form22s;
     33 import com.android.dx.dex.code.form.Form22t;
     34 import com.android.dx.dex.code.form.Form22x;
     35 import com.android.dx.dex.code.form.Form23x;
     36 import com.android.dx.dex.code.form.Form30t;
     37 import com.android.dx.dex.code.form.Form31c;
     38 import com.android.dx.dex.code.form.Form31i;
     39 import com.android.dx.dex.code.form.Form31t;
     40 import com.android.dx.dex.code.form.Form32x;
     41 import com.android.dx.dex.code.form.Form35c;
     42 import com.android.dx.dex.code.form.Form3rc;
     43 import com.android.dx.dex.code.form.Form45cc;
     44 import com.android.dx.dex.code.form.Form4rcc;
     45 import com.android.dx.dex.code.form.Form51l;
     46 import com.android.dx.dex.code.form.SpecialFormat;
     47 import com.android.dx.io.Opcodes;
     48 
     49 /**
     50  * Standard instances of {@link Dop} and utility methods for getting
     51  * them.
     52  */
     53 public final class Dops {
     54     /** {@code non-null;} array containing all the standard instances */
     55     private static final Dop[] DOPS;
     56 
     57     /**
     58      * pseudo-opcode used for nonstandard formatted "instructions"
     59      * (which are mostly not actually instructions, though they do
     60      * appear in instruction lists). TODO: Retire the usage of this
     61      * constant.
     62      */
     63     public static final Dop SPECIAL_FORMAT =
     64         new Dop(Opcodes.SPECIAL_FORMAT, Opcodes.SPECIAL_FORMAT,
     65                 Opcodes.NO_NEXT, SpecialFormat.THE_ONE, false);
     66 
     67     // BEGIN(dops); GENERATED AUTOMATICALLY BY opcode-gen
     68     public static final Dop NOP =
     69         new Dop(Opcodes.NOP, Opcodes.NOP,
     70             Opcodes.NO_NEXT, Form10x.THE_ONE, false);
     71 
     72     public static final Dop MOVE =
     73         new Dop(Opcodes.MOVE, Opcodes.MOVE,
     74             Opcodes.MOVE_FROM16, Form12x.THE_ONE, true);
     75 
     76     public static final Dop MOVE_FROM16 =
     77         new Dop(Opcodes.MOVE_FROM16, Opcodes.MOVE,
     78             Opcodes.MOVE_16, Form22x.THE_ONE, true);
     79 
     80     public static final Dop MOVE_16 =
     81         new Dop(Opcodes.MOVE_16, Opcodes.MOVE,
     82             Opcodes.NO_NEXT, Form32x.THE_ONE, true);
     83 
     84     public static final Dop MOVE_WIDE =
     85         new Dop(Opcodes.MOVE_WIDE, Opcodes.MOVE_WIDE,
     86             Opcodes.MOVE_WIDE_FROM16, Form12x.THE_ONE, true);
     87 
     88     public static final Dop MOVE_WIDE_FROM16 =
     89         new Dop(Opcodes.MOVE_WIDE_FROM16, Opcodes.MOVE_WIDE,
     90             Opcodes.MOVE_WIDE_16, Form22x.THE_ONE, true);
     91 
     92     public static final Dop MOVE_WIDE_16 =
     93         new Dop(Opcodes.MOVE_WIDE_16, Opcodes.MOVE_WIDE,
     94             Opcodes.NO_NEXT, Form32x.THE_ONE, true);
     95 
     96     public static final Dop MOVE_OBJECT =
     97         new Dop(Opcodes.MOVE_OBJECT, Opcodes.MOVE_OBJECT,
     98             Opcodes.MOVE_OBJECT_FROM16, Form12x.THE_ONE, true);
     99 
    100     public static final Dop MOVE_OBJECT_FROM16 =
    101         new Dop(Opcodes.MOVE_OBJECT_FROM16, Opcodes.MOVE_OBJECT,
    102             Opcodes.MOVE_OBJECT_16, Form22x.THE_ONE, true);
    103 
    104     public static final Dop MOVE_OBJECT_16 =
    105         new Dop(Opcodes.MOVE_OBJECT_16, Opcodes.MOVE_OBJECT,
    106             Opcodes.NO_NEXT, Form32x.THE_ONE, true);
    107 
    108     public static final Dop MOVE_RESULT =
    109         new Dop(Opcodes.MOVE_RESULT, Opcodes.MOVE_RESULT,
    110             Opcodes.NO_NEXT, Form11x.THE_ONE, true);
    111 
    112     public static final Dop MOVE_RESULT_WIDE =
    113         new Dop(Opcodes.MOVE_RESULT_WIDE, Opcodes.MOVE_RESULT_WIDE,
    114             Opcodes.NO_NEXT, Form11x.THE_ONE, true);
    115 
    116     public static final Dop MOVE_RESULT_OBJECT =
    117         new Dop(Opcodes.MOVE_RESULT_OBJECT, Opcodes.MOVE_RESULT_OBJECT,
    118             Opcodes.NO_NEXT, Form11x.THE_ONE, true);
    119 
    120     public static final Dop MOVE_EXCEPTION =
    121         new Dop(Opcodes.MOVE_EXCEPTION, Opcodes.MOVE_EXCEPTION,
    122             Opcodes.NO_NEXT, Form11x.THE_ONE, true);
    123 
    124     public static final Dop RETURN_VOID =
    125         new Dop(Opcodes.RETURN_VOID, Opcodes.RETURN_VOID,
    126             Opcodes.NO_NEXT, Form10x.THE_ONE, false);
    127 
    128     public static final Dop RETURN =
    129         new Dop(Opcodes.RETURN, Opcodes.RETURN,
    130             Opcodes.NO_NEXT, Form11x.THE_ONE, false);
    131 
    132     public static final Dop RETURN_WIDE =
    133         new Dop(Opcodes.RETURN_WIDE, Opcodes.RETURN_WIDE,
    134             Opcodes.NO_NEXT, Form11x.THE_ONE, false);
    135 
    136     public static final Dop RETURN_OBJECT =
    137         new Dop(Opcodes.RETURN_OBJECT, Opcodes.RETURN_OBJECT,
    138             Opcodes.NO_NEXT, Form11x.THE_ONE, false);
    139 
    140     public static final Dop CONST_4 =
    141         new Dop(Opcodes.CONST_4, Opcodes.CONST,
    142             Opcodes.CONST_16, Form11n.THE_ONE, true);
    143 
    144     public static final Dop CONST_16 =
    145         new Dop(Opcodes.CONST_16, Opcodes.CONST,
    146             Opcodes.CONST_HIGH16, Form21s.THE_ONE, true);
    147 
    148     public static final Dop CONST =
    149         new Dop(Opcodes.CONST, Opcodes.CONST,
    150             Opcodes.NO_NEXT, Form31i.THE_ONE, true);
    151 
    152     public static final Dop CONST_HIGH16 =
    153         new Dop(Opcodes.CONST_HIGH16, Opcodes.CONST,
    154             Opcodes.CONST, Form21h.THE_ONE, true);
    155 
    156     public static final Dop CONST_WIDE_16 =
    157         new Dop(Opcodes.CONST_WIDE_16, Opcodes.CONST_WIDE,
    158             Opcodes.CONST_WIDE_HIGH16, Form21s.THE_ONE, true);
    159 
    160     public static final Dop CONST_WIDE_32 =
    161         new Dop(Opcodes.CONST_WIDE_32, Opcodes.CONST_WIDE,
    162             Opcodes.CONST_WIDE, Form31i.THE_ONE, true);
    163 
    164     public static final Dop CONST_WIDE =
    165         new Dop(Opcodes.CONST_WIDE, Opcodes.CONST_WIDE,
    166             Opcodes.NO_NEXT, Form51l.THE_ONE, true);
    167 
    168     public static final Dop CONST_WIDE_HIGH16 =
    169         new Dop(Opcodes.CONST_WIDE_HIGH16, Opcodes.CONST_WIDE,
    170             Opcodes.CONST_WIDE_32, Form21h.THE_ONE, true);
    171 
    172     public static final Dop CONST_STRING =
    173         new Dop(Opcodes.CONST_STRING, Opcodes.CONST_STRING,
    174             Opcodes.CONST_STRING_JUMBO, Form21c.THE_ONE, true);
    175 
    176     public static final Dop CONST_STRING_JUMBO =
    177         new Dop(Opcodes.CONST_STRING_JUMBO, Opcodes.CONST_STRING,
    178             Opcodes.NO_NEXT, Form31c.THE_ONE, true);
    179 
    180     public static final Dop CONST_CLASS =
    181         new Dop(Opcodes.CONST_CLASS, Opcodes.CONST_CLASS,
    182             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
    183 
    184     public static final Dop MONITOR_ENTER =
    185         new Dop(Opcodes.MONITOR_ENTER, Opcodes.MONITOR_ENTER,
    186             Opcodes.NO_NEXT, Form11x.THE_ONE, false);
    187 
    188     public static final Dop MONITOR_EXIT =
    189         new Dop(Opcodes.MONITOR_EXIT, Opcodes.MONITOR_EXIT,
    190             Opcodes.NO_NEXT, Form11x.THE_ONE, false);
    191 
    192     public static final Dop CHECK_CAST =
    193         new Dop(Opcodes.CHECK_CAST, Opcodes.CHECK_CAST,
    194             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
    195 
    196     public static final Dop INSTANCE_OF =
    197         new Dop(Opcodes.INSTANCE_OF, Opcodes.INSTANCE_OF,
    198             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
    199 
    200     public static final Dop ARRAY_LENGTH =
    201         new Dop(Opcodes.ARRAY_LENGTH, Opcodes.ARRAY_LENGTH,
    202             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    203 
    204     public static final Dop NEW_INSTANCE =
    205         new Dop(Opcodes.NEW_INSTANCE, Opcodes.NEW_INSTANCE,
    206             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
    207 
    208     public static final Dop NEW_ARRAY =
    209         new Dop(Opcodes.NEW_ARRAY, Opcodes.NEW_ARRAY,
    210             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
    211 
    212     public static final Dop FILLED_NEW_ARRAY =
    213         new Dop(Opcodes.FILLED_NEW_ARRAY, Opcodes.FILLED_NEW_ARRAY,
    214             Opcodes.FILLED_NEW_ARRAY_RANGE, Form35c.THE_ONE, false);
    215 
    216     public static final Dop FILLED_NEW_ARRAY_RANGE =
    217         new Dop(Opcodes.FILLED_NEW_ARRAY_RANGE, Opcodes.FILLED_NEW_ARRAY,
    218             Opcodes.NO_NEXT, Form3rc.THE_ONE, false);
    219 
    220     public static final Dop FILL_ARRAY_DATA =
    221         new Dop(Opcodes.FILL_ARRAY_DATA, Opcodes.FILL_ARRAY_DATA,
    222             Opcodes.NO_NEXT, Form31t.THE_ONE, false);
    223 
    224     public static final Dop THROW =
    225         new Dop(Opcodes.THROW, Opcodes.THROW,
    226             Opcodes.NO_NEXT, Form11x.THE_ONE, false);
    227 
    228     public static final Dop GOTO =
    229         new Dop(Opcodes.GOTO, Opcodes.GOTO,
    230             Opcodes.GOTO_16, Form10t.THE_ONE, false);
    231 
    232     public static final Dop GOTO_16 =
    233         new Dop(Opcodes.GOTO_16, Opcodes.GOTO,
    234             Opcodes.GOTO_32, Form20t.THE_ONE, false);
    235 
    236     public static final Dop GOTO_32 =
    237         new Dop(Opcodes.GOTO_32, Opcodes.GOTO,
    238             Opcodes.NO_NEXT, Form30t.THE_ONE, false);
    239 
    240     public static final Dop PACKED_SWITCH =
    241         new Dop(Opcodes.PACKED_SWITCH, Opcodes.PACKED_SWITCH,
    242             Opcodes.NO_NEXT, Form31t.THE_ONE, false);
    243 
    244     public static final Dop SPARSE_SWITCH =
    245         new Dop(Opcodes.SPARSE_SWITCH, Opcodes.SPARSE_SWITCH,
    246             Opcodes.NO_NEXT, Form31t.THE_ONE, false);
    247 
    248     public static final Dop CMPL_FLOAT =
    249         new Dop(Opcodes.CMPL_FLOAT, Opcodes.CMPL_FLOAT,
    250             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    251 
    252     public static final Dop CMPG_FLOAT =
    253         new Dop(Opcodes.CMPG_FLOAT, Opcodes.CMPG_FLOAT,
    254             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    255 
    256     public static final Dop CMPL_DOUBLE =
    257         new Dop(Opcodes.CMPL_DOUBLE, Opcodes.CMPL_DOUBLE,
    258             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    259 
    260     public static final Dop CMPG_DOUBLE =
    261         new Dop(Opcodes.CMPG_DOUBLE, Opcodes.CMPG_DOUBLE,
    262             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    263 
    264     public static final Dop CMP_LONG =
    265         new Dop(Opcodes.CMP_LONG, Opcodes.CMP_LONG,
    266             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    267 
    268     public static final Dop IF_EQ =
    269         new Dop(Opcodes.IF_EQ, Opcodes.IF_EQ,
    270             Opcodes.NO_NEXT, Form22t.THE_ONE, false);
    271 
    272     public static final Dop IF_NE =
    273         new Dop(Opcodes.IF_NE, Opcodes.IF_NE,
    274             Opcodes.NO_NEXT, Form22t.THE_ONE, false);
    275 
    276     public static final Dop IF_LT =
    277         new Dop(Opcodes.IF_LT, Opcodes.IF_LT,
    278             Opcodes.NO_NEXT, Form22t.THE_ONE, false);
    279 
    280     public static final Dop IF_GE =
    281         new Dop(Opcodes.IF_GE, Opcodes.IF_GE,
    282             Opcodes.NO_NEXT, Form22t.THE_ONE, false);
    283 
    284     public static final Dop IF_GT =
    285         new Dop(Opcodes.IF_GT, Opcodes.IF_GT,
    286             Opcodes.NO_NEXT, Form22t.THE_ONE, false);
    287 
    288     public static final Dop IF_LE =
    289         new Dop(Opcodes.IF_LE, Opcodes.IF_LE,
    290             Opcodes.NO_NEXT, Form22t.THE_ONE, false);
    291 
    292     public static final Dop IF_EQZ =
    293         new Dop(Opcodes.IF_EQZ, Opcodes.IF_EQZ,
    294             Opcodes.NO_NEXT, Form21t.THE_ONE, false);
    295 
    296     public static final Dop IF_NEZ =
    297         new Dop(Opcodes.IF_NEZ, Opcodes.IF_NEZ,
    298             Opcodes.NO_NEXT, Form21t.THE_ONE, false);
    299 
    300     public static final Dop IF_LTZ =
    301         new Dop(Opcodes.IF_LTZ, Opcodes.IF_LTZ,
    302             Opcodes.NO_NEXT, Form21t.THE_ONE, false);
    303 
    304     public static final Dop IF_GEZ =
    305         new Dop(Opcodes.IF_GEZ, Opcodes.IF_GEZ,
    306             Opcodes.NO_NEXT, Form21t.THE_ONE, false);
    307 
    308     public static final Dop IF_GTZ =
    309         new Dop(Opcodes.IF_GTZ, Opcodes.IF_GTZ,
    310             Opcodes.NO_NEXT, Form21t.THE_ONE, false);
    311 
    312     public static final Dop IF_LEZ =
    313         new Dop(Opcodes.IF_LEZ, Opcodes.IF_LEZ,
    314             Opcodes.NO_NEXT, Form21t.THE_ONE, false);
    315 
    316     public static final Dop AGET =
    317         new Dop(Opcodes.AGET, Opcodes.AGET,
    318             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    319 
    320     public static final Dop AGET_WIDE =
    321         new Dop(Opcodes.AGET_WIDE, Opcodes.AGET_WIDE,
    322             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    323 
    324     public static final Dop AGET_OBJECT =
    325         new Dop(Opcodes.AGET_OBJECT, Opcodes.AGET_OBJECT,
    326             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    327 
    328     public static final Dop AGET_BOOLEAN =
    329         new Dop(Opcodes.AGET_BOOLEAN, Opcodes.AGET_BOOLEAN,
    330             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    331 
    332     public static final Dop AGET_BYTE =
    333         new Dop(Opcodes.AGET_BYTE, Opcodes.AGET_BYTE,
    334             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    335 
    336     public static final Dop AGET_CHAR =
    337         new Dop(Opcodes.AGET_CHAR, Opcodes.AGET_CHAR,
    338             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    339 
    340     public static final Dop AGET_SHORT =
    341         new Dop(Opcodes.AGET_SHORT, Opcodes.AGET_SHORT,
    342             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    343 
    344     public static final Dop APUT =
    345         new Dop(Opcodes.APUT, Opcodes.APUT,
    346             Opcodes.NO_NEXT, Form23x.THE_ONE, false);
    347 
    348     public static final Dop APUT_WIDE =
    349         new Dop(Opcodes.APUT_WIDE, Opcodes.APUT_WIDE,
    350             Opcodes.NO_NEXT, Form23x.THE_ONE, false);
    351 
    352     public static final Dop APUT_OBJECT =
    353         new Dop(Opcodes.APUT_OBJECT, Opcodes.APUT_OBJECT,
    354             Opcodes.NO_NEXT, Form23x.THE_ONE, false);
    355 
    356     public static final Dop APUT_BOOLEAN =
    357         new Dop(Opcodes.APUT_BOOLEAN, Opcodes.APUT_BOOLEAN,
    358             Opcodes.NO_NEXT, Form23x.THE_ONE, false);
    359 
    360     public static final Dop APUT_BYTE =
    361         new Dop(Opcodes.APUT_BYTE, Opcodes.APUT_BYTE,
    362             Opcodes.NO_NEXT, Form23x.THE_ONE, false);
    363 
    364     public static final Dop APUT_CHAR =
    365         new Dop(Opcodes.APUT_CHAR, Opcodes.APUT_CHAR,
    366             Opcodes.NO_NEXT, Form23x.THE_ONE, false);
    367 
    368     public static final Dop APUT_SHORT =
    369         new Dop(Opcodes.APUT_SHORT, Opcodes.APUT_SHORT,
    370             Opcodes.NO_NEXT, Form23x.THE_ONE, false);
    371 
    372     public static final Dop IGET =
    373         new Dop(Opcodes.IGET, Opcodes.IGET,
    374             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
    375 
    376     public static final Dop IGET_WIDE =
    377         new Dop(Opcodes.IGET_WIDE, Opcodes.IGET_WIDE,
    378             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
    379 
    380     public static final Dop IGET_OBJECT =
    381         new Dop(Opcodes.IGET_OBJECT, Opcodes.IGET_OBJECT,
    382             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
    383 
    384     public static final Dop IGET_BOOLEAN =
    385         new Dop(Opcodes.IGET_BOOLEAN, Opcodes.IGET_BOOLEAN,
    386             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
    387 
    388     public static final Dop IGET_BYTE =
    389         new Dop(Opcodes.IGET_BYTE, Opcodes.IGET_BYTE,
    390             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
    391 
    392     public static final Dop IGET_CHAR =
    393         new Dop(Opcodes.IGET_CHAR, Opcodes.IGET_CHAR,
    394             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
    395 
    396     public static final Dop IGET_SHORT =
    397         new Dop(Opcodes.IGET_SHORT, Opcodes.IGET_SHORT,
    398             Opcodes.NO_NEXT, Form22c.THE_ONE, true);
    399 
    400     public static final Dop IPUT =
    401         new Dop(Opcodes.IPUT, Opcodes.IPUT,
    402             Opcodes.NO_NEXT, Form22c.THE_ONE, false);
    403 
    404     public static final Dop IPUT_WIDE =
    405         new Dop(Opcodes.IPUT_WIDE, Opcodes.IPUT_WIDE,
    406             Opcodes.NO_NEXT, Form22c.THE_ONE, false);
    407 
    408     public static final Dop IPUT_OBJECT =
    409         new Dop(Opcodes.IPUT_OBJECT, Opcodes.IPUT_OBJECT,
    410             Opcodes.NO_NEXT, Form22c.THE_ONE, false);
    411 
    412     public static final Dop IPUT_BOOLEAN =
    413         new Dop(Opcodes.IPUT_BOOLEAN, Opcodes.IPUT_BOOLEAN,
    414             Opcodes.NO_NEXT, Form22c.THE_ONE, false);
    415 
    416     public static final Dop IPUT_BYTE =
    417         new Dop(Opcodes.IPUT_BYTE, Opcodes.IPUT_BYTE,
    418             Opcodes.NO_NEXT, Form22c.THE_ONE, false);
    419 
    420     public static final Dop IPUT_CHAR =
    421         new Dop(Opcodes.IPUT_CHAR, Opcodes.IPUT_CHAR,
    422             Opcodes.NO_NEXT, Form22c.THE_ONE, false);
    423 
    424     public static final Dop IPUT_SHORT =
    425         new Dop(Opcodes.IPUT_SHORT, Opcodes.IPUT_SHORT,
    426             Opcodes.NO_NEXT, Form22c.THE_ONE, false);
    427 
    428     public static final Dop SGET =
    429         new Dop(Opcodes.SGET, Opcodes.SGET,
    430             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
    431 
    432     public static final Dop SGET_WIDE =
    433         new Dop(Opcodes.SGET_WIDE, Opcodes.SGET_WIDE,
    434             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
    435 
    436     public static final Dop SGET_OBJECT =
    437         new Dop(Opcodes.SGET_OBJECT, Opcodes.SGET_OBJECT,
    438             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
    439 
    440     public static final Dop SGET_BOOLEAN =
    441         new Dop(Opcodes.SGET_BOOLEAN, Opcodes.SGET_BOOLEAN,
    442             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
    443 
    444     public static final Dop SGET_BYTE =
    445         new Dop(Opcodes.SGET_BYTE, Opcodes.SGET_BYTE,
    446             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
    447 
    448     public static final Dop SGET_CHAR =
    449         new Dop(Opcodes.SGET_CHAR, Opcodes.SGET_CHAR,
    450             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
    451 
    452     public static final Dop SGET_SHORT =
    453         new Dop(Opcodes.SGET_SHORT, Opcodes.SGET_SHORT,
    454             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
    455 
    456     public static final Dop SPUT =
    457         new Dop(Opcodes.SPUT, Opcodes.SPUT,
    458             Opcodes.NO_NEXT, Form21c.THE_ONE, false);
    459 
    460     public static final Dop SPUT_WIDE =
    461         new Dop(Opcodes.SPUT_WIDE, Opcodes.SPUT_WIDE,
    462             Opcodes.NO_NEXT, Form21c.THE_ONE, false);
    463 
    464     public static final Dop SPUT_OBJECT =
    465         new Dop(Opcodes.SPUT_OBJECT, Opcodes.SPUT_OBJECT,
    466             Opcodes.NO_NEXT, Form21c.THE_ONE, false);
    467 
    468     public static final Dop SPUT_BOOLEAN =
    469         new Dop(Opcodes.SPUT_BOOLEAN, Opcodes.SPUT_BOOLEAN,
    470             Opcodes.NO_NEXT, Form21c.THE_ONE, false);
    471 
    472     public static final Dop SPUT_BYTE =
    473         new Dop(Opcodes.SPUT_BYTE, Opcodes.SPUT_BYTE,
    474             Opcodes.NO_NEXT, Form21c.THE_ONE, false);
    475 
    476     public static final Dop SPUT_CHAR =
    477         new Dop(Opcodes.SPUT_CHAR, Opcodes.SPUT_CHAR,
    478             Opcodes.NO_NEXT, Form21c.THE_ONE, false);
    479 
    480     public static final Dop SPUT_SHORT =
    481         new Dop(Opcodes.SPUT_SHORT, Opcodes.SPUT_SHORT,
    482             Opcodes.NO_NEXT, Form21c.THE_ONE, false);
    483 
    484     public static final Dop INVOKE_VIRTUAL =
    485         new Dop(Opcodes.INVOKE_VIRTUAL, Opcodes.INVOKE_VIRTUAL,
    486             Opcodes.INVOKE_VIRTUAL_RANGE, Form35c.THE_ONE, false);
    487 
    488     public static final Dop INVOKE_SUPER =
    489         new Dop(Opcodes.INVOKE_SUPER, Opcodes.INVOKE_SUPER,
    490             Opcodes.INVOKE_SUPER_RANGE, Form35c.THE_ONE, false);
    491 
    492     public static final Dop INVOKE_DIRECT =
    493         new Dop(Opcodes.INVOKE_DIRECT, Opcodes.INVOKE_DIRECT,
    494             Opcodes.INVOKE_DIRECT_RANGE, Form35c.THE_ONE, false);
    495 
    496     public static final Dop INVOKE_STATIC =
    497         new Dop(Opcodes.INVOKE_STATIC, Opcodes.INVOKE_STATIC,
    498             Opcodes.INVOKE_STATIC_RANGE, Form35c.THE_ONE, false);
    499 
    500     public static final Dop INVOKE_INTERFACE =
    501         new Dop(Opcodes.INVOKE_INTERFACE, Opcodes.INVOKE_INTERFACE,
    502             Opcodes.INVOKE_INTERFACE_RANGE, Form35c.THE_ONE, false);
    503 
    504     public static final Dop INVOKE_VIRTUAL_RANGE =
    505         new Dop(Opcodes.INVOKE_VIRTUAL_RANGE, Opcodes.INVOKE_VIRTUAL,
    506             Opcodes.NO_NEXT, Form3rc.THE_ONE, false);
    507 
    508     public static final Dop INVOKE_SUPER_RANGE =
    509         new Dop(Opcodes.INVOKE_SUPER_RANGE, Opcodes.INVOKE_SUPER,
    510             Opcodes.NO_NEXT, Form3rc.THE_ONE, false);
    511 
    512     public static final Dop INVOKE_DIRECT_RANGE =
    513         new Dop(Opcodes.INVOKE_DIRECT_RANGE, Opcodes.INVOKE_DIRECT,
    514             Opcodes.NO_NEXT, Form3rc.THE_ONE, false);
    515 
    516     public static final Dop INVOKE_STATIC_RANGE =
    517         new Dop(Opcodes.INVOKE_STATIC_RANGE, Opcodes.INVOKE_STATIC,
    518             Opcodes.NO_NEXT, Form3rc.THE_ONE, false);
    519 
    520     public static final Dop INVOKE_INTERFACE_RANGE =
    521         new Dop(Opcodes.INVOKE_INTERFACE_RANGE, Opcodes.INVOKE_INTERFACE,
    522             Opcodes.NO_NEXT, Form3rc.THE_ONE, false);
    523 
    524     public static final Dop NEG_INT =
    525         new Dop(Opcodes.NEG_INT, Opcodes.NEG_INT,
    526             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    527 
    528     public static final Dop NOT_INT =
    529         new Dop(Opcodes.NOT_INT, Opcodes.NOT_INT,
    530             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    531 
    532     public static final Dop NEG_LONG =
    533         new Dop(Opcodes.NEG_LONG, Opcodes.NEG_LONG,
    534             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    535 
    536     public static final Dop NOT_LONG =
    537         new Dop(Opcodes.NOT_LONG, Opcodes.NOT_LONG,
    538             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    539 
    540     public static final Dop NEG_FLOAT =
    541         new Dop(Opcodes.NEG_FLOAT, Opcodes.NEG_FLOAT,
    542             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    543 
    544     public static final Dop NEG_DOUBLE =
    545         new Dop(Opcodes.NEG_DOUBLE, Opcodes.NEG_DOUBLE,
    546             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    547 
    548     public static final Dop INT_TO_LONG =
    549         new Dop(Opcodes.INT_TO_LONG, Opcodes.INT_TO_LONG,
    550             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    551 
    552     public static final Dop INT_TO_FLOAT =
    553         new Dop(Opcodes.INT_TO_FLOAT, Opcodes.INT_TO_FLOAT,
    554             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    555 
    556     public static final Dop INT_TO_DOUBLE =
    557         new Dop(Opcodes.INT_TO_DOUBLE, Opcodes.INT_TO_DOUBLE,
    558             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    559 
    560     public static final Dop LONG_TO_INT =
    561         new Dop(Opcodes.LONG_TO_INT, Opcodes.LONG_TO_INT,
    562             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    563 
    564     public static final Dop LONG_TO_FLOAT =
    565         new Dop(Opcodes.LONG_TO_FLOAT, Opcodes.LONG_TO_FLOAT,
    566             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    567 
    568     public static final Dop LONG_TO_DOUBLE =
    569         new Dop(Opcodes.LONG_TO_DOUBLE, Opcodes.LONG_TO_DOUBLE,
    570             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    571 
    572     public static final Dop FLOAT_TO_INT =
    573         new Dop(Opcodes.FLOAT_TO_INT, Opcodes.FLOAT_TO_INT,
    574             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    575 
    576     public static final Dop FLOAT_TO_LONG =
    577         new Dop(Opcodes.FLOAT_TO_LONG, Opcodes.FLOAT_TO_LONG,
    578             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    579 
    580     public static final Dop FLOAT_TO_DOUBLE =
    581         new Dop(Opcodes.FLOAT_TO_DOUBLE, Opcodes.FLOAT_TO_DOUBLE,
    582             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    583 
    584     public static final Dop DOUBLE_TO_INT =
    585         new Dop(Opcodes.DOUBLE_TO_INT, Opcodes.DOUBLE_TO_INT,
    586             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    587 
    588     public static final Dop DOUBLE_TO_LONG =
    589         new Dop(Opcodes.DOUBLE_TO_LONG, Opcodes.DOUBLE_TO_LONG,
    590             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    591 
    592     public static final Dop DOUBLE_TO_FLOAT =
    593         new Dop(Opcodes.DOUBLE_TO_FLOAT, Opcodes.DOUBLE_TO_FLOAT,
    594             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    595 
    596     public static final Dop INT_TO_BYTE =
    597         new Dop(Opcodes.INT_TO_BYTE, Opcodes.INT_TO_BYTE,
    598             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    599 
    600     public static final Dop INT_TO_CHAR =
    601         new Dop(Opcodes.INT_TO_CHAR, Opcodes.INT_TO_CHAR,
    602             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    603 
    604     public static final Dop INT_TO_SHORT =
    605         new Dop(Opcodes.INT_TO_SHORT, Opcodes.INT_TO_SHORT,
    606             Opcodes.NO_NEXT, Form12x.THE_ONE, true);
    607 
    608     public static final Dop ADD_INT =
    609         new Dop(Opcodes.ADD_INT, Opcodes.ADD_INT,
    610             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    611 
    612     public static final Dop SUB_INT =
    613         new Dop(Opcodes.SUB_INT, Opcodes.SUB_INT,
    614             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    615 
    616     public static final Dop MUL_INT =
    617         new Dop(Opcodes.MUL_INT, Opcodes.MUL_INT,
    618             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    619 
    620     public static final Dop DIV_INT =
    621         new Dop(Opcodes.DIV_INT, Opcodes.DIV_INT,
    622             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    623 
    624     public static final Dop REM_INT =
    625         new Dop(Opcodes.REM_INT, Opcodes.REM_INT,
    626             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    627 
    628     public static final Dop AND_INT =
    629         new Dop(Opcodes.AND_INT, Opcodes.AND_INT,
    630             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    631 
    632     public static final Dop OR_INT =
    633         new Dop(Opcodes.OR_INT, Opcodes.OR_INT,
    634             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    635 
    636     public static final Dop XOR_INT =
    637         new Dop(Opcodes.XOR_INT, Opcodes.XOR_INT,
    638             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    639 
    640     public static final Dop SHL_INT =
    641         new Dop(Opcodes.SHL_INT, Opcodes.SHL_INT,
    642             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    643 
    644     public static final Dop SHR_INT =
    645         new Dop(Opcodes.SHR_INT, Opcodes.SHR_INT,
    646             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    647 
    648     public static final Dop USHR_INT =
    649         new Dop(Opcodes.USHR_INT, Opcodes.USHR_INT,
    650             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    651 
    652     public static final Dop ADD_LONG =
    653         new Dop(Opcodes.ADD_LONG, Opcodes.ADD_LONG,
    654             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    655 
    656     public static final Dop SUB_LONG =
    657         new Dop(Opcodes.SUB_LONG, Opcodes.SUB_LONG,
    658             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    659 
    660     public static final Dop MUL_LONG =
    661         new Dop(Opcodes.MUL_LONG, Opcodes.MUL_LONG,
    662             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    663 
    664     public static final Dop DIV_LONG =
    665         new Dop(Opcodes.DIV_LONG, Opcodes.DIV_LONG,
    666             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    667 
    668     public static final Dop REM_LONG =
    669         new Dop(Opcodes.REM_LONG, Opcodes.REM_LONG,
    670             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    671 
    672     public static final Dop AND_LONG =
    673         new Dop(Opcodes.AND_LONG, Opcodes.AND_LONG,
    674             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    675 
    676     public static final Dop OR_LONG =
    677         new Dop(Opcodes.OR_LONG, Opcodes.OR_LONG,
    678             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    679 
    680     public static final Dop XOR_LONG =
    681         new Dop(Opcodes.XOR_LONG, Opcodes.XOR_LONG,
    682             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    683 
    684     public static final Dop SHL_LONG =
    685         new Dop(Opcodes.SHL_LONG, Opcodes.SHL_LONG,
    686             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    687 
    688     public static final Dop SHR_LONG =
    689         new Dop(Opcodes.SHR_LONG, Opcodes.SHR_LONG,
    690             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    691 
    692     public static final Dop USHR_LONG =
    693         new Dop(Opcodes.USHR_LONG, Opcodes.USHR_LONG,
    694             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    695 
    696     public static final Dop ADD_FLOAT =
    697         new Dop(Opcodes.ADD_FLOAT, Opcodes.ADD_FLOAT,
    698             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    699 
    700     public static final Dop SUB_FLOAT =
    701         new Dop(Opcodes.SUB_FLOAT, Opcodes.SUB_FLOAT,
    702             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    703 
    704     public static final Dop MUL_FLOAT =
    705         new Dop(Opcodes.MUL_FLOAT, Opcodes.MUL_FLOAT,
    706             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    707 
    708     public static final Dop DIV_FLOAT =
    709         new Dop(Opcodes.DIV_FLOAT, Opcodes.DIV_FLOAT,
    710             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    711 
    712     public static final Dop REM_FLOAT =
    713         new Dop(Opcodes.REM_FLOAT, Opcodes.REM_FLOAT,
    714             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    715 
    716     public static final Dop ADD_DOUBLE =
    717         new Dop(Opcodes.ADD_DOUBLE, Opcodes.ADD_DOUBLE,
    718             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    719 
    720     public static final Dop SUB_DOUBLE =
    721         new Dop(Opcodes.SUB_DOUBLE, Opcodes.SUB_DOUBLE,
    722             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    723 
    724     public static final Dop MUL_DOUBLE =
    725         new Dop(Opcodes.MUL_DOUBLE, Opcodes.MUL_DOUBLE,
    726             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    727 
    728     public static final Dop DIV_DOUBLE =
    729         new Dop(Opcodes.DIV_DOUBLE, Opcodes.DIV_DOUBLE,
    730             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    731 
    732     public static final Dop REM_DOUBLE =
    733         new Dop(Opcodes.REM_DOUBLE, Opcodes.REM_DOUBLE,
    734             Opcodes.NO_NEXT, Form23x.THE_ONE, true);
    735 
    736     public static final Dop ADD_INT_2ADDR =
    737         new Dop(Opcodes.ADD_INT_2ADDR, Opcodes.ADD_INT,
    738             Opcodes.ADD_INT, Form12x.THE_ONE, true);
    739 
    740     public static final Dop SUB_INT_2ADDR =
    741         new Dop(Opcodes.SUB_INT_2ADDR, Opcodes.SUB_INT,
    742             Opcodes.SUB_INT, Form12x.THE_ONE, true);
    743 
    744     public static final Dop MUL_INT_2ADDR =
    745         new Dop(Opcodes.MUL_INT_2ADDR, Opcodes.MUL_INT,
    746             Opcodes.MUL_INT, Form12x.THE_ONE, true);
    747 
    748     public static final Dop DIV_INT_2ADDR =
    749         new Dop(Opcodes.DIV_INT_2ADDR, Opcodes.DIV_INT,
    750             Opcodes.DIV_INT, Form12x.THE_ONE, true);
    751 
    752     public static final Dop REM_INT_2ADDR =
    753         new Dop(Opcodes.REM_INT_2ADDR, Opcodes.REM_INT,
    754             Opcodes.REM_INT, Form12x.THE_ONE, true);
    755 
    756     public static final Dop AND_INT_2ADDR =
    757         new Dop(Opcodes.AND_INT_2ADDR, Opcodes.AND_INT,
    758             Opcodes.AND_INT, Form12x.THE_ONE, true);
    759 
    760     public static final Dop OR_INT_2ADDR =
    761         new Dop(Opcodes.OR_INT_2ADDR, Opcodes.OR_INT,
    762             Opcodes.OR_INT, Form12x.THE_ONE, true);
    763 
    764     public static final Dop XOR_INT_2ADDR =
    765         new Dop(Opcodes.XOR_INT_2ADDR, Opcodes.XOR_INT,
    766             Opcodes.XOR_INT, Form12x.THE_ONE, true);
    767 
    768     public static final Dop SHL_INT_2ADDR =
    769         new Dop(Opcodes.SHL_INT_2ADDR, Opcodes.SHL_INT,
    770             Opcodes.SHL_INT, Form12x.THE_ONE, true);
    771 
    772     public static final Dop SHR_INT_2ADDR =
    773         new Dop(Opcodes.SHR_INT_2ADDR, Opcodes.SHR_INT,
    774             Opcodes.SHR_INT, Form12x.THE_ONE, true);
    775 
    776     public static final Dop USHR_INT_2ADDR =
    777         new Dop(Opcodes.USHR_INT_2ADDR, Opcodes.USHR_INT,
    778             Opcodes.USHR_INT, Form12x.THE_ONE, true);
    779 
    780     public static final Dop ADD_LONG_2ADDR =
    781         new Dop(Opcodes.ADD_LONG_2ADDR, Opcodes.ADD_LONG,
    782             Opcodes.ADD_LONG, Form12x.THE_ONE, true);
    783 
    784     public static final Dop SUB_LONG_2ADDR =
    785         new Dop(Opcodes.SUB_LONG_2ADDR, Opcodes.SUB_LONG,
    786             Opcodes.SUB_LONG, Form12x.THE_ONE, true);
    787 
    788     public static final Dop MUL_LONG_2ADDR =
    789         new Dop(Opcodes.MUL_LONG_2ADDR, Opcodes.MUL_LONG,
    790             Opcodes.MUL_LONG, Form12x.THE_ONE, true);
    791 
    792     public static final Dop DIV_LONG_2ADDR =
    793         new Dop(Opcodes.DIV_LONG_2ADDR, Opcodes.DIV_LONG,
    794             Opcodes.DIV_LONG, Form12x.THE_ONE, true);
    795 
    796     public static final Dop REM_LONG_2ADDR =
    797         new Dop(Opcodes.REM_LONG_2ADDR, Opcodes.REM_LONG,
    798             Opcodes.REM_LONG, Form12x.THE_ONE, true);
    799 
    800     public static final Dop AND_LONG_2ADDR =
    801         new Dop(Opcodes.AND_LONG_2ADDR, Opcodes.AND_LONG,
    802             Opcodes.AND_LONG, Form12x.THE_ONE, true);
    803 
    804     public static final Dop OR_LONG_2ADDR =
    805         new Dop(Opcodes.OR_LONG_2ADDR, Opcodes.OR_LONG,
    806             Opcodes.OR_LONG, Form12x.THE_ONE, true);
    807 
    808     public static final Dop XOR_LONG_2ADDR =
    809         new Dop(Opcodes.XOR_LONG_2ADDR, Opcodes.XOR_LONG,
    810             Opcodes.XOR_LONG, Form12x.THE_ONE, true);
    811 
    812     public static final Dop SHL_LONG_2ADDR =
    813         new Dop(Opcodes.SHL_LONG_2ADDR, Opcodes.SHL_LONG,
    814             Opcodes.SHL_LONG, Form12x.THE_ONE, true);
    815 
    816     public static final Dop SHR_LONG_2ADDR =
    817         new Dop(Opcodes.SHR_LONG_2ADDR, Opcodes.SHR_LONG,
    818             Opcodes.SHR_LONG, Form12x.THE_ONE, true);
    819 
    820     public static final Dop USHR_LONG_2ADDR =
    821         new Dop(Opcodes.USHR_LONG_2ADDR, Opcodes.USHR_LONG,
    822             Opcodes.USHR_LONG, Form12x.THE_ONE, true);
    823 
    824     public static final Dop ADD_FLOAT_2ADDR =
    825         new Dop(Opcodes.ADD_FLOAT_2ADDR, Opcodes.ADD_FLOAT,
    826             Opcodes.ADD_FLOAT, Form12x.THE_ONE, true);
    827 
    828     public static final Dop SUB_FLOAT_2ADDR =
    829         new Dop(Opcodes.SUB_FLOAT_2ADDR, Opcodes.SUB_FLOAT,
    830             Opcodes.SUB_FLOAT, Form12x.THE_ONE, true);
    831 
    832     public static final Dop MUL_FLOAT_2ADDR =
    833         new Dop(Opcodes.MUL_FLOAT_2ADDR, Opcodes.MUL_FLOAT,
    834             Opcodes.MUL_FLOAT, Form12x.THE_ONE, true);
    835 
    836     public static final Dop DIV_FLOAT_2ADDR =
    837         new Dop(Opcodes.DIV_FLOAT_2ADDR, Opcodes.DIV_FLOAT,
    838             Opcodes.DIV_FLOAT, Form12x.THE_ONE, true);
    839 
    840     public static final Dop REM_FLOAT_2ADDR =
    841         new Dop(Opcodes.REM_FLOAT_2ADDR, Opcodes.REM_FLOAT,
    842             Opcodes.REM_FLOAT, Form12x.THE_ONE, true);
    843 
    844     public static final Dop ADD_DOUBLE_2ADDR =
    845         new Dop(Opcodes.ADD_DOUBLE_2ADDR, Opcodes.ADD_DOUBLE,
    846             Opcodes.ADD_DOUBLE, Form12x.THE_ONE, true);
    847 
    848     public static final Dop SUB_DOUBLE_2ADDR =
    849         new Dop(Opcodes.SUB_DOUBLE_2ADDR, Opcodes.SUB_DOUBLE,
    850             Opcodes.SUB_DOUBLE, Form12x.THE_ONE, true);
    851 
    852     public static final Dop MUL_DOUBLE_2ADDR =
    853         new Dop(Opcodes.MUL_DOUBLE_2ADDR, Opcodes.MUL_DOUBLE,
    854             Opcodes.MUL_DOUBLE, Form12x.THE_ONE, true);
    855 
    856     public static final Dop DIV_DOUBLE_2ADDR =
    857         new Dop(Opcodes.DIV_DOUBLE_2ADDR, Opcodes.DIV_DOUBLE,
    858             Opcodes.DIV_DOUBLE, Form12x.THE_ONE, true);
    859 
    860     public static final Dop REM_DOUBLE_2ADDR =
    861         new Dop(Opcodes.REM_DOUBLE_2ADDR, Opcodes.REM_DOUBLE,
    862             Opcodes.REM_DOUBLE, Form12x.THE_ONE, true);
    863 
    864     public static final Dop ADD_INT_LIT16 =
    865         new Dop(Opcodes.ADD_INT_LIT16, Opcodes.ADD_INT,
    866             Opcodes.NO_NEXT, Form22s.THE_ONE, true);
    867 
    868     public static final Dop RSUB_INT =
    869         new Dop(Opcodes.RSUB_INT, Opcodes.RSUB_INT,
    870             Opcodes.NO_NEXT, Form22s.THE_ONE, true);
    871 
    872     public static final Dop MUL_INT_LIT16 =
    873         new Dop(Opcodes.MUL_INT_LIT16, Opcodes.MUL_INT,
    874             Opcodes.NO_NEXT, Form22s.THE_ONE, true);
    875 
    876     public static final Dop DIV_INT_LIT16 =
    877         new Dop(Opcodes.DIV_INT_LIT16, Opcodes.DIV_INT,
    878             Opcodes.NO_NEXT, Form22s.THE_ONE, true);
    879 
    880     public static final Dop REM_INT_LIT16 =
    881         new Dop(Opcodes.REM_INT_LIT16, Opcodes.REM_INT,
    882             Opcodes.NO_NEXT, Form22s.THE_ONE, true);
    883 
    884     public static final Dop AND_INT_LIT16 =
    885         new Dop(Opcodes.AND_INT_LIT16, Opcodes.AND_INT,
    886             Opcodes.NO_NEXT, Form22s.THE_ONE, true);
    887 
    888     public static final Dop OR_INT_LIT16 =
    889         new Dop(Opcodes.OR_INT_LIT16, Opcodes.OR_INT,
    890             Opcodes.NO_NEXT, Form22s.THE_ONE, true);
    891 
    892     public static final Dop XOR_INT_LIT16 =
    893         new Dop(Opcodes.XOR_INT_LIT16, Opcodes.XOR_INT,
    894             Opcodes.NO_NEXT, Form22s.THE_ONE, true);
    895 
    896     public static final Dop ADD_INT_LIT8 =
    897         new Dop(Opcodes.ADD_INT_LIT8, Opcodes.ADD_INT,
    898             Opcodes.ADD_INT_LIT16, Form22b.THE_ONE, true);
    899 
    900     public static final Dop RSUB_INT_LIT8 =
    901         new Dop(Opcodes.RSUB_INT_LIT8, Opcodes.RSUB_INT,
    902             Opcodes.RSUB_INT, Form22b.THE_ONE, true);
    903 
    904     public static final Dop MUL_INT_LIT8 =
    905         new Dop(Opcodes.MUL_INT_LIT8, Opcodes.MUL_INT,
    906             Opcodes.MUL_INT_LIT16, Form22b.THE_ONE, true);
    907 
    908     public static final Dop DIV_INT_LIT8 =
    909         new Dop(Opcodes.DIV_INT_LIT8, Opcodes.DIV_INT,
    910             Opcodes.DIV_INT_LIT16, Form22b.THE_ONE, true);
    911 
    912     public static final Dop REM_INT_LIT8 =
    913         new Dop(Opcodes.REM_INT_LIT8, Opcodes.REM_INT,
    914             Opcodes.REM_INT_LIT16, Form22b.THE_ONE, true);
    915 
    916     public static final Dop AND_INT_LIT8 =
    917         new Dop(Opcodes.AND_INT_LIT8, Opcodes.AND_INT,
    918             Opcodes.AND_INT_LIT16, Form22b.THE_ONE, true);
    919 
    920     public static final Dop OR_INT_LIT8 =
    921         new Dop(Opcodes.OR_INT_LIT8, Opcodes.OR_INT,
    922             Opcodes.OR_INT_LIT16, Form22b.THE_ONE, true);
    923 
    924     public static final Dop XOR_INT_LIT8 =
    925         new Dop(Opcodes.XOR_INT_LIT8, Opcodes.XOR_INT,
    926             Opcodes.XOR_INT_LIT16, Form22b.THE_ONE, true);
    927 
    928     public static final Dop SHL_INT_LIT8 =
    929         new Dop(Opcodes.SHL_INT_LIT8, Opcodes.SHL_INT,
    930             Opcodes.NO_NEXT, Form22b.THE_ONE, true);
    931 
    932     public static final Dop SHR_INT_LIT8 =
    933         new Dop(Opcodes.SHR_INT_LIT8, Opcodes.SHR_INT,
    934             Opcodes.NO_NEXT, Form22b.THE_ONE, true);
    935 
    936     public static final Dop USHR_INT_LIT8 =
    937         new Dop(Opcodes.USHR_INT_LIT8, Opcodes.USHR_INT,
    938             Opcodes.NO_NEXT, Form22b.THE_ONE, true);
    939 
    940     public static final Dop INVOKE_POLYMORPHIC =
    941         new Dop(Opcodes.INVOKE_POLYMORPHIC, Opcodes.INVOKE_POLYMORPHIC,
    942             Opcodes.INVOKE_POLYMORPHIC_RANGE, Form45cc.THE_ONE, false);
    943 
    944     public static final Dop INVOKE_POLYMORPHIC_RANGE =
    945         new Dop(Opcodes.INVOKE_POLYMORPHIC_RANGE, Opcodes.INVOKE_POLYMORPHIC,
    946             Opcodes.NO_NEXT, Form4rcc.THE_ONE, false);
    947 
    948     public static final Dop INVOKE_CUSTOM =
    949         new Dop(Opcodes.INVOKE_CUSTOM, Opcodes.INVOKE_CUSTOM,
    950             Opcodes.INVOKE_CUSTOM_RANGE, Form35c.THE_ONE, false);
    951 
    952     public static final Dop INVOKE_CUSTOM_RANGE =
    953         new Dop(Opcodes.INVOKE_CUSTOM_RANGE, Opcodes.INVOKE_CUSTOM,
    954             Opcodes.NO_NEXT, Form3rc.THE_ONE, false);
    955 
    956     public static final Dop CONST_METHOD_HANDLE =
    957         new Dop(Opcodes.CONST_METHOD_HANDLE, Opcodes.CONST_METHOD_HANDLE,
    958             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
    959 
    960     public static final Dop CONST_METHOD_TYPE =
    961         new Dop(Opcodes.CONST_METHOD_TYPE, Opcodes.CONST_METHOD_TYPE,
    962             Opcodes.NO_NEXT, Form21c.THE_ONE, true);
    963 
    964     // END(dops)
    965 
    966     // Static initialization.
    967     static {
    968         DOPS = new Dop[Opcodes.MAX_VALUE - Opcodes.MIN_VALUE + 1];
    969 
    970         set(SPECIAL_FORMAT);
    971 
    972         // BEGIN(dops-init); GENERATED AUTOMATICALLY BY opcode-gen
    973         set(NOP);
    974         set(MOVE);
    975         set(MOVE_FROM16);
    976         set(MOVE_16);
    977         set(MOVE_WIDE);
    978         set(MOVE_WIDE_FROM16);
    979         set(MOVE_WIDE_16);
    980         set(MOVE_OBJECT);
    981         set(MOVE_OBJECT_FROM16);
    982         set(MOVE_OBJECT_16);
    983         set(MOVE_RESULT);
    984         set(MOVE_RESULT_WIDE);
    985         set(MOVE_RESULT_OBJECT);
    986         set(MOVE_EXCEPTION);
    987         set(RETURN_VOID);
    988         set(RETURN);
    989         set(RETURN_WIDE);
    990         set(RETURN_OBJECT);
    991         set(CONST_4);
    992         set(CONST_16);
    993         set(CONST);
    994         set(CONST_HIGH16);
    995         set(CONST_WIDE_16);
    996         set(CONST_WIDE_32);
    997         set(CONST_WIDE);
    998         set(CONST_WIDE_HIGH16);
    999         set(CONST_STRING);
   1000         set(CONST_STRING_JUMBO);
   1001         set(CONST_CLASS);
   1002         set(MONITOR_ENTER);
   1003         set(MONITOR_EXIT);
   1004         set(CHECK_CAST);
   1005         set(INSTANCE_OF);
   1006         set(ARRAY_LENGTH);
   1007         set(NEW_INSTANCE);
   1008         set(NEW_ARRAY);
   1009         set(FILLED_NEW_ARRAY);
   1010         set(FILLED_NEW_ARRAY_RANGE);
   1011         set(FILL_ARRAY_DATA);
   1012         set(THROW);
   1013         set(GOTO);
   1014         set(GOTO_16);
   1015         set(GOTO_32);
   1016         set(PACKED_SWITCH);
   1017         set(SPARSE_SWITCH);
   1018         set(CMPL_FLOAT);
   1019         set(CMPG_FLOAT);
   1020         set(CMPL_DOUBLE);
   1021         set(CMPG_DOUBLE);
   1022         set(CMP_LONG);
   1023         set(IF_EQ);
   1024         set(IF_NE);
   1025         set(IF_LT);
   1026         set(IF_GE);
   1027         set(IF_GT);
   1028         set(IF_LE);
   1029         set(IF_EQZ);
   1030         set(IF_NEZ);
   1031         set(IF_LTZ);
   1032         set(IF_GEZ);
   1033         set(IF_GTZ);
   1034         set(IF_LEZ);
   1035         set(AGET);
   1036         set(AGET_WIDE);
   1037         set(AGET_OBJECT);
   1038         set(AGET_BOOLEAN);
   1039         set(AGET_BYTE);
   1040         set(AGET_CHAR);
   1041         set(AGET_SHORT);
   1042         set(APUT);
   1043         set(APUT_WIDE);
   1044         set(APUT_OBJECT);
   1045         set(APUT_BOOLEAN);
   1046         set(APUT_BYTE);
   1047         set(APUT_CHAR);
   1048         set(APUT_SHORT);
   1049         set(IGET);
   1050         set(IGET_WIDE);
   1051         set(IGET_OBJECT);
   1052         set(IGET_BOOLEAN);
   1053         set(IGET_BYTE);
   1054         set(IGET_CHAR);
   1055         set(IGET_SHORT);
   1056         set(IPUT);
   1057         set(IPUT_WIDE);
   1058         set(IPUT_OBJECT);
   1059         set(IPUT_BOOLEAN);
   1060         set(IPUT_BYTE);
   1061         set(IPUT_CHAR);
   1062         set(IPUT_SHORT);
   1063         set(SGET);
   1064         set(SGET_WIDE);
   1065         set(SGET_OBJECT);
   1066         set(SGET_BOOLEAN);
   1067         set(SGET_BYTE);
   1068         set(SGET_CHAR);
   1069         set(SGET_SHORT);
   1070         set(SPUT);
   1071         set(SPUT_WIDE);
   1072         set(SPUT_OBJECT);
   1073         set(SPUT_BOOLEAN);
   1074         set(SPUT_BYTE);
   1075         set(SPUT_CHAR);
   1076         set(SPUT_SHORT);
   1077         set(INVOKE_VIRTUAL);
   1078         set(INVOKE_SUPER);
   1079         set(INVOKE_DIRECT);
   1080         set(INVOKE_STATIC);
   1081         set(INVOKE_INTERFACE);
   1082         set(INVOKE_VIRTUAL_RANGE);
   1083         set(INVOKE_SUPER_RANGE);
   1084         set(INVOKE_DIRECT_RANGE);
   1085         set(INVOKE_STATIC_RANGE);
   1086         set(INVOKE_INTERFACE_RANGE);
   1087         set(NEG_INT);
   1088         set(NOT_INT);
   1089         set(NEG_LONG);
   1090         set(NOT_LONG);
   1091         set(NEG_FLOAT);
   1092         set(NEG_DOUBLE);
   1093         set(INT_TO_LONG);
   1094         set(INT_TO_FLOAT);
   1095         set(INT_TO_DOUBLE);
   1096         set(LONG_TO_INT);
   1097         set(LONG_TO_FLOAT);
   1098         set(LONG_TO_DOUBLE);
   1099         set(FLOAT_TO_INT);
   1100         set(FLOAT_TO_LONG);
   1101         set(FLOAT_TO_DOUBLE);
   1102         set(DOUBLE_TO_INT);
   1103         set(DOUBLE_TO_LONG);
   1104         set(DOUBLE_TO_FLOAT);
   1105         set(INT_TO_BYTE);
   1106         set(INT_TO_CHAR);
   1107         set(INT_TO_SHORT);
   1108         set(ADD_INT);
   1109         set(SUB_INT);
   1110         set(MUL_INT);
   1111         set(DIV_INT);
   1112         set(REM_INT);
   1113         set(AND_INT);
   1114         set(OR_INT);
   1115         set(XOR_INT);
   1116         set(SHL_INT);
   1117         set(SHR_INT);
   1118         set(USHR_INT);
   1119         set(ADD_LONG);
   1120         set(SUB_LONG);
   1121         set(MUL_LONG);
   1122         set(DIV_LONG);
   1123         set(REM_LONG);
   1124         set(AND_LONG);
   1125         set(OR_LONG);
   1126         set(XOR_LONG);
   1127         set(SHL_LONG);
   1128         set(SHR_LONG);
   1129         set(USHR_LONG);
   1130         set(ADD_FLOAT);
   1131         set(SUB_FLOAT);
   1132         set(MUL_FLOAT);
   1133         set(DIV_FLOAT);
   1134         set(REM_FLOAT);
   1135         set(ADD_DOUBLE);
   1136         set(SUB_DOUBLE);
   1137         set(MUL_DOUBLE);
   1138         set(DIV_DOUBLE);
   1139         set(REM_DOUBLE);
   1140         set(ADD_INT_2ADDR);
   1141         set(SUB_INT_2ADDR);
   1142         set(MUL_INT_2ADDR);
   1143         set(DIV_INT_2ADDR);
   1144         set(REM_INT_2ADDR);
   1145         set(AND_INT_2ADDR);
   1146         set(OR_INT_2ADDR);
   1147         set(XOR_INT_2ADDR);
   1148         set(SHL_INT_2ADDR);
   1149         set(SHR_INT_2ADDR);
   1150         set(USHR_INT_2ADDR);
   1151         set(ADD_LONG_2ADDR);
   1152         set(SUB_LONG_2ADDR);
   1153         set(MUL_LONG_2ADDR);
   1154         set(DIV_LONG_2ADDR);
   1155         set(REM_LONG_2ADDR);
   1156         set(AND_LONG_2ADDR);
   1157         set(OR_LONG_2ADDR);
   1158         set(XOR_LONG_2ADDR);
   1159         set(SHL_LONG_2ADDR);
   1160         set(SHR_LONG_2ADDR);
   1161         set(USHR_LONG_2ADDR);
   1162         set(ADD_FLOAT_2ADDR);
   1163         set(SUB_FLOAT_2ADDR);
   1164         set(MUL_FLOAT_2ADDR);
   1165         set(DIV_FLOAT_2ADDR);
   1166         set(REM_FLOAT_2ADDR);
   1167         set(ADD_DOUBLE_2ADDR);
   1168         set(SUB_DOUBLE_2ADDR);
   1169         set(MUL_DOUBLE_2ADDR);
   1170         set(DIV_DOUBLE_2ADDR);
   1171         set(REM_DOUBLE_2ADDR);
   1172         set(ADD_INT_LIT16);
   1173         set(RSUB_INT);
   1174         set(MUL_INT_LIT16);
   1175         set(DIV_INT_LIT16);
   1176         set(REM_INT_LIT16);
   1177         set(AND_INT_LIT16);
   1178         set(OR_INT_LIT16);
   1179         set(XOR_INT_LIT16);
   1180         set(ADD_INT_LIT8);
   1181         set(RSUB_INT_LIT8);
   1182         set(MUL_INT_LIT8);
   1183         set(DIV_INT_LIT8);
   1184         set(REM_INT_LIT8);
   1185         set(AND_INT_LIT8);
   1186         set(OR_INT_LIT8);
   1187         set(XOR_INT_LIT8);
   1188         set(SHL_INT_LIT8);
   1189         set(SHR_INT_LIT8);
   1190         set(USHR_INT_LIT8);
   1191         set(INVOKE_POLYMORPHIC);
   1192         set(INVOKE_POLYMORPHIC_RANGE);
   1193         set(INVOKE_CUSTOM);
   1194         set(INVOKE_CUSTOM_RANGE);
   1195         set(CONST_METHOD_HANDLE);
   1196         set(CONST_METHOD_TYPE);
   1197         // END(dops-init)
   1198     }
   1199 
   1200     /**
   1201      * This class is uninstantiable.
   1202      */
   1203     private Dops() {
   1204         // This space intentionally left blank.
   1205     }
   1206 
   1207     /**
   1208      * Gets the {@link Dop} for the given opcode value.
   1209      *
   1210      * @param opcode {@code Opcodes.MIN_VALUE..Opcodes.MAX_VALUE;} the
   1211      * opcode value
   1212      * @return {@code non-null;} the associated opcode instance
   1213      */
   1214     public static Dop get(int opcode) {
   1215         int idx = opcode - Opcodes.MIN_VALUE;
   1216 
   1217         try {
   1218             Dop result = DOPS[idx];
   1219             if (result != null) {
   1220                 return result;
   1221             }
   1222         } catch (ArrayIndexOutOfBoundsException ex) {
   1223             // Fall through.
   1224         }
   1225 
   1226         throw new IllegalArgumentException("bogus opcode");
   1227     }
   1228 
   1229     /**
   1230      * Gets the next {@link Dop} in the instruction fitting chain after the
   1231      * given instance, if any.
   1232      *
   1233      * @param opcode {@code non-null;} the opcode
   1234      * @param options {@code non-null;} options, used to determine
   1235      * which opcodes are potentially off-limits
   1236      * @return {@code null-ok;} the next opcode in the same family, in the
   1237      * chain of opcodes to try, or {@code null} if the given opcode is
   1238      * the last in its chain
   1239      */
   1240     public static Dop getNextOrNull(Dop opcode, DexOptions options) {
   1241       int nextOpcode = opcode.getNextOpcode();
   1242 
   1243       if (nextOpcode == Opcodes.NO_NEXT) {
   1244         return null;
   1245       }
   1246 
   1247       opcode = get(nextOpcode);
   1248 
   1249       return opcode;
   1250     }
   1251 
   1252     /**
   1253      * Puts the given opcode into the table of all ops.
   1254      *
   1255      * @param opcode {@code non-null;} the opcode
   1256      */
   1257     private static void set(Dop opcode) {
   1258         int idx = opcode.getOpcode() - Opcodes.MIN_VALUE;
   1259         DOPS[idx] = opcode;
   1260     }
   1261 }
   1262