/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.dx.io;

import com.android.dx.io.instructions.InstructionCodec;
import com.android.dx.util.Hex;

/**
 * Information about each Dalvik opcode.
 */
public final class OpcodeInfo {
    /*
     * TODO: Merge at least most of the info from the Dops class into
     * this one.
     */

    /** non-null; array containing all the information */
    private static final Info[] INFO;

    /**
     * pseudo-opcode used for nonstandard formatted "instructions"
     * (which are mostly not actually instructions, though they do
     * appear in instruction lists). TODO: Retire the usage of this
     * constant.
     */
    public static final Info SPECIAL_FORMAT =
        new Info(Opcodes.SPECIAL_FORMAT, "<special>",
                InstructionCodec.FORMAT_00X, IndexType.NONE);

    // TODO: These payload opcodes should be generated by opcode-gen.

    public static final Info PACKED_SWITCH_PAYLOAD =
        new Info(Opcodes.PACKED_SWITCH_PAYLOAD, "packed-switch-payload",
                InstructionCodec.FORMAT_PACKED_SWITCH_PAYLOAD,
                IndexType.NONE);

    public static final Info SPARSE_SWITCH_PAYLOAD =
        new Info(Opcodes.SPARSE_SWITCH_PAYLOAD, "sparse-switch-payload",
                InstructionCodec.FORMAT_SPARSE_SWITCH_PAYLOAD,
                IndexType.NONE);

    public static final Info FILL_ARRAY_DATA_PAYLOAD =
        new Info(Opcodes.FILL_ARRAY_DATA_PAYLOAD, "fill-array-data-payload",
                InstructionCodec.FORMAT_FILL_ARRAY_DATA_PAYLOAD,
                IndexType.NONE);

    // BEGIN(opcode-info-defs); GENERATED AUTOMATICALLY BY opcode-gen
    public static final Info NOP =
        new Info(Opcodes.NOP, "nop",
            InstructionCodec.FORMAT_10X, IndexType.NONE);

    public static final Info MOVE =
        new Info(Opcodes.MOVE, "move",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info MOVE_FROM16 =
        new Info(Opcodes.MOVE_FROM16, "move/from16",
            InstructionCodec.FORMAT_22X, IndexType.NONE);

    public static final Info MOVE_16 =
        new Info(Opcodes.MOVE_16, "move/16",
            InstructionCodec.FORMAT_32X, IndexType.NONE);

    public static final Info MOVE_WIDE =
        new Info(Opcodes.MOVE_WIDE, "move-wide",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info MOVE_WIDE_FROM16 =
        new Info(Opcodes.MOVE_WIDE_FROM16, "move-wide/from16",
            InstructionCodec.FORMAT_22X, IndexType.NONE);

    public static final Info MOVE_WIDE_16 =
        new Info(Opcodes.MOVE_WIDE_16, "move-wide/16",
            InstructionCodec.FORMAT_32X, IndexType.NONE);

    public static final Info MOVE_OBJECT =
        new Info(Opcodes.MOVE_OBJECT, "move-object",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info MOVE_OBJECT_FROM16 =
        new Info(Opcodes.MOVE_OBJECT_FROM16, "move-object/from16",
            InstructionCodec.FORMAT_22X, IndexType.NONE);

    public static final Info MOVE_OBJECT_16 =
        new Info(Opcodes.MOVE_OBJECT_16, "move-object/16",
            InstructionCodec.FORMAT_32X, IndexType.NONE);

    public static final Info MOVE_RESULT =
        new Info(Opcodes.MOVE_RESULT, "move-result",
            InstructionCodec.FORMAT_11X, IndexType.NONE);

    public static final Info MOVE_RESULT_WIDE =
        new Info(Opcodes.MOVE_RESULT_WIDE, "move-result-wide",
            InstructionCodec.FORMAT_11X, IndexType.NONE);

    public static final Info MOVE_RESULT_OBJECT =
        new Info(Opcodes.MOVE_RESULT_OBJECT, "move-result-object",
            InstructionCodec.FORMAT_11X, IndexType.NONE);

    public static final Info MOVE_EXCEPTION =
        new Info(Opcodes.MOVE_EXCEPTION, "move-exception",
            InstructionCodec.FORMAT_11X, IndexType.NONE);

    public static final Info RETURN_VOID =
        new Info(Opcodes.RETURN_VOID, "return-void",
            InstructionCodec.FORMAT_10X, IndexType.NONE);

    public static final Info RETURN =
        new Info(Opcodes.RETURN, "return",
            InstructionCodec.FORMAT_11X, IndexType.NONE);

    public static final Info RETURN_WIDE =
        new Info(Opcodes.RETURN_WIDE, "return-wide",
            InstructionCodec.FORMAT_11X, IndexType.NONE);

    public static final Info RETURN_OBJECT =
        new Info(Opcodes.RETURN_OBJECT, "return-object",
            InstructionCodec.FORMAT_11X, IndexType.NONE);

    public static final Info CONST_4 =
        new Info(Opcodes.CONST_4, "const/4",
            InstructionCodec.FORMAT_11N, IndexType.NONE);

    public static final Info CONST_16 =
        new Info(Opcodes.CONST_16, "const/16",
            InstructionCodec.FORMAT_21S, IndexType.NONE);

    public static final Info CONST =
        new Info(Opcodes.CONST, "const",
            InstructionCodec.FORMAT_31I, IndexType.NONE);

    public static final Info CONST_HIGH16 =
        new Info(Opcodes.CONST_HIGH16, "const/high16",
            InstructionCodec.FORMAT_21H, IndexType.NONE);

    public static final Info CONST_WIDE_16 =
        new Info(Opcodes.CONST_WIDE_16, "const-wide/16",
            InstructionCodec.FORMAT_21S, IndexType.NONE);

    public static final Info CONST_WIDE_32 =
        new Info(Opcodes.CONST_WIDE_32, "const-wide/32",
            InstructionCodec.FORMAT_31I, IndexType.NONE);

    public static final Info CONST_WIDE =
        new Info(Opcodes.CONST_WIDE, "const-wide",
            InstructionCodec.FORMAT_51L, IndexType.NONE);

    public static final Info CONST_WIDE_HIGH16 =
        new Info(Opcodes.CONST_WIDE_HIGH16, "const-wide/high16",
            InstructionCodec.FORMAT_21H, IndexType.NONE);

    public static final Info CONST_STRING =
        new Info(Opcodes.CONST_STRING, "const-string",
            InstructionCodec.FORMAT_21C, IndexType.STRING_REF);

    public static final Info CONST_STRING_JUMBO =
        new Info(Opcodes.CONST_STRING_JUMBO, "const-string/jumbo",
            InstructionCodec.FORMAT_31C, IndexType.STRING_REF);

    public static final Info CONST_CLASS =
        new Info(Opcodes.CONST_CLASS, "const-class",
            InstructionCodec.FORMAT_21C, IndexType.TYPE_REF);

    public static final Info MONITOR_ENTER =
        new Info(Opcodes.MONITOR_ENTER, "monitor-enter",
            InstructionCodec.FORMAT_11X, IndexType.NONE);

    public static final Info MONITOR_EXIT =
        new Info(Opcodes.MONITOR_EXIT, "monitor-exit",
            InstructionCodec.FORMAT_11X, IndexType.NONE);

    public static final Info CHECK_CAST =
        new Info(Opcodes.CHECK_CAST, "check-cast",
            InstructionCodec.FORMAT_21C, IndexType.TYPE_REF);

    public static final Info INSTANCE_OF =
        new Info(Opcodes.INSTANCE_OF, "instance-of",
            InstructionCodec.FORMAT_22C, IndexType.TYPE_REF);

    public static final Info ARRAY_LENGTH =
        new Info(Opcodes.ARRAY_LENGTH, "array-length",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info NEW_INSTANCE =
        new Info(Opcodes.NEW_INSTANCE, "new-instance",
            InstructionCodec.FORMAT_21C, IndexType.TYPE_REF);

    public static final Info NEW_ARRAY =
        new Info(Opcodes.NEW_ARRAY, "new-array",
            InstructionCodec.FORMAT_22C, IndexType.TYPE_REF);

    public static final Info FILLED_NEW_ARRAY =
        new Info(Opcodes.FILLED_NEW_ARRAY, "filled-new-array",
            InstructionCodec.FORMAT_35C, IndexType.TYPE_REF);

    public static final Info FILLED_NEW_ARRAY_RANGE =
        new Info(Opcodes.FILLED_NEW_ARRAY_RANGE, "filled-new-array/range",
            InstructionCodec.FORMAT_3RC, IndexType.TYPE_REF);

    public static final Info FILL_ARRAY_DATA =
        new Info(Opcodes.FILL_ARRAY_DATA, "fill-array-data",
            InstructionCodec.FORMAT_31T, IndexType.NONE);

    public static final Info THROW =
        new Info(Opcodes.THROW, "throw",
            InstructionCodec.FORMAT_11X, IndexType.NONE);

    public static final Info GOTO =
        new Info(Opcodes.GOTO, "goto",
            InstructionCodec.FORMAT_10T, IndexType.NONE);

    public static final Info GOTO_16 =
        new Info(Opcodes.GOTO_16, "goto/16",
            InstructionCodec.FORMAT_20T, IndexType.NONE);

    public static final Info GOTO_32 =
        new Info(Opcodes.GOTO_32, "goto/32",
            InstructionCodec.FORMAT_30T, IndexType.NONE);

    public static final Info PACKED_SWITCH =
        new Info(Opcodes.PACKED_SWITCH, "packed-switch",
            InstructionCodec.FORMAT_31T, IndexType.NONE);

    public static final Info SPARSE_SWITCH =
        new Info(Opcodes.SPARSE_SWITCH, "sparse-switch",
            InstructionCodec.FORMAT_31T, IndexType.NONE);

    public static final Info CMPL_FLOAT =
        new Info(Opcodes.CMPL_FLOAT, "cmpl-float",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info CMPG_FLOAT =
        new Info(Opcodes.CMPG_FLOAT, "cmpg-float",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info CMPL_DOUBLE =
        new Info(Opcodes.CMPL_DOUBLE, "cmpl-double",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info CMPG_DOUBLE =
        new Info(Opcodes.CMPG_DOUBLE, "cmpg-double",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info CMP_LONG =
        new Info(Opcodes.CMP_LONG, "cmp-long",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info IF_EQ =
        new Info(Opcodes.IF_EQ, "if-eq",
            InstructionCodec.FORMAT_22T, IndexType.NONE);

    public static final Info IF_NE =
        new Info(Opcodes.IF_NE, "if-ne",
            InstructionCodec.FORMAT_22T, IndexType.NONE);

    public static final Info IF_LT =
        new Info(Opcodes.IF_LT, "if-lt",
            InstructionCodec.FORMAT_22T, IndexType.NONE);

    public static final Info IF_GE =
        new Info(Opcodes.IF_GE, "if-ge",
            InstructionCodec.FORMAT_22T, IndexType.NONE);

    public static final Info IF_GT =
        new Info(Opcodes.IF_GT, "if-gt",
            InstructionCodec.FORMAT_22T, IndexType.NONE);

    public static final Info IF_LE =
        new Info(Opcodes.IF_LE, "if-le",
            InstructionCodec.FORMAT_22T, IndexType.NONE);

    public static final Info IF_EQZ =
        new Info(Opcodes.IF_EQZ, "if-eqz",
            InstructionCodec.FORMAT_21T, IndexType.NONE);

    public static final Info IF_NEZ =
        new Info(Opcodes.IF_NEZ, "if-nez",
            InstructionCodec.FORMAT_21T, IndexType.NONE);

    public static final Info IF_LTZ =
        new Info(Opcodes.IF_LTZ, "if-ltz",
            InstructionCodec.FORMAT_21T, IndexType.NONE);

    public static final Info IF_GEZ =
        new Info(Opcodes.IF_GEZ, "if-gez",
            InstructionCodec.FORMAT_21T, IndexType.NONE);

    public static final Info IF_GTZ =
        new Info(Opcodes.IF_GTZ, "if-gtz",
            InstructionCodec.FORMAT_21T, IndexType.NONE);

    public static final Info IF_LEZ =
        new Info(Opcodes.IF_LEZ, "if-lez",
            InstructionCodec.FORMAT_21T, IndexType.NONE);

    public static final Info AGET =
        new Info(Opcodes.AGET, "aget",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info AGET_WIDE =
        new Info(Opcodes.AGET_WIDE, "aget-wide",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info AGET_OBJECT =
        new Info(Opcodes.AGET_OBJECT, "aget-object",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info AGET_BOOLEAN =
        new Info(Opcodes.AGET_BOOLEAN, "aget-boolean",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info AGET_BYTE =
        new Info(Opcodes.AGET_BYTE, "aget-byte",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info AGET_CHAR =
        new Info(Opcodes.AGET_CHAR, "aget-char",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info AGET_SHORT =
        new Info(Opcodes.AGET_SHORT, "aget-short",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info APUT =
        new Info(Opcodes.APUT, "aput",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info APUT_WIDE =
        new Info(Opcodes.APUT_WIDE, "aput-wide",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info APUT_OBJECT =
        new Info(Opcodes.APUT_OBJECT, "aput-object",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info APUT_BOOLEAN =
        new Info(Opcodes.APUT_BOOLEAN, "aput-boolean",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info APUT_BYTE =
        new Info(Opcodes.APUT_BYTE, "aput-byte",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info APUT_CHAR =
        new Info(Opcodes.APUT_CHAR, "aput-char",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info APUT_SHORT =
        new Info(Opcodes.APUT_SHORT, "aput-short",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info IGET =
        new Info(Opcodes.IGET, "iget",
            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);

    public static final Info IGET_WIDE =
        new Info(Opcodes.IGET_WIDE, "iget-wide",
            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);

    public static final Info IGET_OBJECT =
        new Info(Opcodes.IGET_OBJECT, "iget-object",
            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);

    public static final Info IGET_BOOLEAN =
        new Info(Opcodes.IGET_BOOLEAN, "iget-boolean",
            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);

    public static final Info IGET_BYTE =
        new Info(Opcodes.IGET_BYTE, "iget-byte",
            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);

    public static final Info IGET_CHAR =
        new Info(Opcodes.IGET_CHAR, "iget-char",
            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);

    public static final Info IGET_SHORT =
        new Info(Opcodes.IGET_SHORT, "iget-short",
            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);

    public static final Info IPUT =
        new Info(Opcodes.IPUT, "iput",
            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);

    public static final Info IPUT_WIDE =
        new Info(Opcodes.IPUT_WIDE, "iput-wide",
            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);

    public static final Info IPUT_OBJECT =
        new Info(Opcodes.IPUT_OBJECT, "iput-object",
            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);

    public static final Info IPUT_BOOLEAN =
        new Info(Opcodes.IPUT_BOOLEAN, "iput-boolean",
            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);

    public static final Info IPUT_BYTE =
        new Info(Opcodes.IPUT_BYTE, "iput-byte",
            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);

    public static final Info IPUT_CHAR =
        new Info(Opcodes.IPUT_CHAR, "iput-char",
            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);

    public static final Info IPUT_SHORT =
        new Info(Opcodes.IPUT_SHORT, "iput-short",
            InstructionCodec.FORMAT_22C, IndexType.FIELD_REF);

    public static final Info SGET =
        new Info(Opcodes.SGET, "sget",
            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);

    public static final Info SGET_WIDE =
        new Info(Opcodes.SGET_WIDE, "sget-wide",
            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);

    public static final Info SGET_OBJECT =
        new Info(Opcodes.SGET_OBJECT, "sget-object",
            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);

    public static final Info SGET_BOOLEAN =
        new Info(Opcodes.SGET_BOOLEAN, "sget-boolean",
            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);

    public static final Info SGET_BYTE =
        new Info(Opcodes.SGET_BYTE, "sget-byte",
            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);

    public static final Info SGET_CHAR =
        new Info(Opcodes.SGET_CHAR, "sget-char",
            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);

    public static final Info SGET_SHORT =
        new Info(Opcodes.SGET_SHORT, "sget-short",
            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);

    public static final Info SPUT =
        new Info(Opcodes.SPUT, "sput",
            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);

    public static final Info SPUT_WIDE =
        new Info(Opcodes.SPUT_WIDE, "sput-wide",
            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);

    public static final Info SPUT_OBJECT =
        new Info(Opcodes.SPUT_OBJECT, "sput-object",
            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);

    public static final Info SPUT_BOOLEAN =
        new Info(Opcodes.SPUT_BOOLEAN, "sput-boolean",
            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);

    public static final Info SPUT_BYTE =
        new Info(Opcodes.SPUT_BYTE, "sput-byte",
            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);

    public static final Info SPUT_CHAR =
        new Info(Opcodes.SPUT_CHAR, "sput-char",
            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);

    public static final Info SPUT_SHORT =
        new Info(Opcodes.SPUT_SHORT, "sput-short",
            InstructionCodec.FORMAT_21C, IndexType.FIELD_REF);

    public static final Info INVOKE_VIRTUAL =
        new Info(Opcodes.INVOKE_VIRTUAL, "invoke-virtual",
            InstructionCodec.FORMAT_35C, IndexType.METHOD_REF);

    public static final Info INVOKE_SUPER =
        new Info(Opcodes.INVOKE_SUPER, "invoke-super",
            InstructionCodec.FORMAT_35C, IndexType.METHOD_REF);

    public static final Info INVOKE_DIRECT =
        new Info(Opcodes.INVOKE_DIRECT, "invoke-direct",
            InstructionCodec.FORMAT_35C, IndexType.METHOD_REF);

    public static final Info INVOKE_STATIC =
        new Info(Opcodes.INVOKE_STATIC, "invoke-static",
            InstructionCodec.FORMAT_35C, IndexType.METHOD_REF);

    public static final Info INVOKE_INTERFACE =
        new Info(Opcodes.INVOKE_INTERFACE, "invoke-interface",
            InstructionCodec.FORMAT_35C, IndexType.METHOD_REF);

    public static final Info INVOKE_VIRTUAL_RANGE =
        new Info(Opcodes.INVOKE_VIRTUAL_RANGE, "invoke-virtual/range",
            InstructionCodec.FORMAT_3RC, IndexType.METHOD_REF);

    public static final Info INVOKE_SUPER_RANGE =
        new Info(Opcodes.INVOKE_SUPER_RANGE, "invoke-super/range",
            InstructionCodec.FORMAT_3RC, IndexType.METHOD_REF);

    public static final Info INVOKE_DIRECT_RANGE =
        new Info(Opcodes.INVOKE_DIRECT_RANGE, "invoke-direct/range",
            InstructionCodec.FORMAT_3RC, IndexType.METHOD_REF);

    public static final Info INVOKE_STATIC_RANGE =
        new Info(Opcodes.INVOKE_STATIC_RANGE, "invoke-static/range",
            InstructionCodec.FORMAT_3RC, IndexType.METHOD_REF);

    public static final Info INVOKE_INTERFACE_RANGE =
        new Info(Opcodes.INVOKE_INTERFACE_RANGE, "invoke-interface/range",
            InstructionCodec.FORMAT_3RC, IndexType.METHOD_REF);

    public static final Info NEG_INT =
        new Info(Opcodes.NEG_INT, "neg-int",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info NOT_INT =
        new Info(Opcodes.NOT_INT, "not-int",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info NEG_LONG =
        new Info(Opcodes.NEG_LONG, "neg-long",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info NOT_LONG =
        new Info(Opcodes.NOT_LONG, "not-long",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info NEG_FLOAT =
        new Info(Opcodes.NEG_FLOAT, "neg-float",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info NEG_DOUBLE =
        new Info(Opcodes.NEG_DOUBLE, "neg-double",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info INT_TO_LONG =
        new Info(Opcodes.INT_TO_LONG, "int-to-long",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info INT_TO_FLOAT =
        new Info(Opcodes.INT_TO_FLOAT, "int-to-float",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info INT_TO_DOUBLE =
        new Info(Opcodes.INT_TO_DOUBLE, "int-to-double",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info LONG_TO_INT =
        new Info(Opcodes.LONG_TO_INT, "long-to-int",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info LONG_TO_FLOAT =
        new Info(Opcodes.LONG_TO_FLOAT, "long-to-float",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info LONG_TO_DOUBLE =
        new Info(Opcodes.LONG_TO_DOUBLE, "long-to-double",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info FLOAT_TO_INT =
        new Info(Opcodes.FLOAT_TO_INT, "float-to-int",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info FLOAT_TO_LONG =
        new Info(Opcodes.FLOAT_TO_LONG, "float-to-long",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info FLOAT_TO_DOUBLE =
        new Info(Opcodes.FLOAT_TO_DOUBLE, "float-to-double",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info DOUBLE_TO_INT =
        new Info(Opcodes.DOUBLE_TO_INT, "double-to-int",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info DOUBLE_TO_LONG =
        new Info(Opcodes.DOUBLE_TO_LONG, "double-to-long",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info DOUBLE_TO_FLOAT =
        new Info(Opcodes.DOUBLE_TO_FLOAT, "double-to-float",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info INT_TO_BYTE =
        new Info(Opcodes.INT_TO_BYTE, "int-to-byte",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info INT_TO_CHAR =
        new Info(Opcodes.INT_TO_CHAR, "int-to-char",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info INT_TO_SHORT =
        new Info(Opcodes.INT_TO_SHORT, "int-to-short",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info ADD_INT =
        new Info(Opcodes.ADD_INT, "add-int",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info SUB_INT =
        new Info(Opcodes.SUB_INT, "sub-int",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info MUL_INT =
        new Info(Opcodes.MUL_INT, "mul-int",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info DIV_INT =
        new Info(Opcodes.DIV_INT, "div-int",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info REM_INT =
        new Info(Opcodes.REM_INT, "rem-int",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info AND_INT =
        new Info(Opcodes.AND_INT, "and-int",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info OR_INT =
        new Info(Opcodes.OR_INT, "or-int",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info XOR_INT =
        new Info(Opcodes.XOR_INT, "xor-int",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info SHL_INT =
        new Info(Opcodes.SHL_INT, "shl-int",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info SHR_INT =
        new Info(Opcodes.SHR_INT, "shr-int",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info USHR_INT =
        new Info(Opcodes.USHR_INT, "ushr-int",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info ADD_LONG =
        new Info(Opcodes.ADD_LONG, "add-long",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info SUB_LONG =
        new Info(Opcodes.SUB_LONG, "sub-long",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info MUL_LONG =
        new Info(Opcodes.MUL_LONG, "mul-long",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info DIV_LONG =
        new Info(Opcodes.DIV_LONG, "div-long",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info REM_LONG =
        new Info(Opcodes.REM_LONG, "rem-long",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info AND_LONG =
        new Info(Opcodes.AND_LONG, "and-long",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info OR_LONG =
        new Info(Opcodes.OR_LONG, "or-long",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info XOR_LONG =
        new Info(Opcodes.XOR_LONG, "xor-long",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info SHL_LONG =
        new Info(Opcodes.SHL_LONG, "shl-long",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info SHR_LONG =
        new Info(Opcodes.SHR_LONG, "shr-long",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info USHR_LONG =
        new Info(Opcodes.USHR_LONG, "ushr-long",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info ADD_FLOAT =
        new Info(Opcodes.ADD_FLOAT, "add-float",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info SUB_FLOAT =
        new Info(Opcodes.SUB_FLOAT, "sub-float",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info MUL_FLOAT =
        new Info(Opcodes.MUL_FLOAT, "mul-float",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info DIV_FLOAT =
        new Info(Opcodes.DIV_FLOAT, "div-float",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info REM_FLOAT =
        new Info(Opcodes.REM_FLOAT, "rem-float",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info ADD_DOUBLE =
        new Info(Opcodes.ADD_DOUBLE, "add-double",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info SUB_DOUBLE =
        new Info(Opcodes.SUB_DOUBLE, "sub-double",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info MUL_DOUBLE =
        new Info(Opcodes.MUL_DOUBLE, "mul-double",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info DIV_DOUBLE =
        new Info(Opcodes.DIV_DOUBLE, "div-double",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info REM_DOUBLE =
        new Info(Opcodes.REM_DOUBLE, "rem-double",
            InstructionCodec.FORMAT_23X, IndexType.NONE);

    public static final Info ADD_INT_2ADDR =
        new Info(Opcodes.ADD_INT_2ADDR, "add-int/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info SUB_INT_2ADDR =
        new Info(Opcodes.SUB_INT_2ADDR, "sub-int/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info MUL_INT_2ADDR =
        new Info(Opcodes.MUL_INT_2ADDR, "mul-int/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info DIV_INT_2ADDR =
        new Info(Opcodes.DIV_INT_2ADDR, "div-int/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info REM_INT_2ADDR =
        new Info(Opcodes.REM_INT_2ADDR, "rem-int/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info AND_INT_2ADDR =
        new Info(Opcodes.AND_INT_2ADDR, "and-int/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info OR_INT_2ADDR =
        new Info(Opcodes.OR_INT_2ADDR, "or-int/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info XOR_INT_2ADDR =
        new Info(Opcodes.XOR_INT_2ADDR, "xor-int/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info SHL_INT_2ADDR =
        new Info(Opcodes.SHL_INT_2ADDR, "shl-int/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info SHR_INT_2ADDR =
        new Info(Opcodes.SHR_INT_2ADDR, "shr-int/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info USHR_INT_2ADDR =
        new Info(Opcodes.USHR_INT_2ADDR, "ushr-int/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info ADD_LONG_2ADDR =
        new Info(Opcodes.ADD_LONG_2ADDR, "add-long/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info SUB_LONG_2ADDR =
        new Info(Opcodes.SUB_LONG_2ADDR, "sub-long/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info MUL_LONG_2ADDR =
        new Info(Opcodes.MUL_LONG_2ADDR, "mul-long/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info DIV_LONG_2ADDR =
        new Info(Opcodes.DIV_LONG_2ADDR, "div-long/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info REM_LONG_2ADDR =
        new Info(Opcodes.REM_LONG_2ADDR, "rem-long/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info AND_LONG_2ADDR =
        new Info(Opcodes.AND_LONG_2ADDR, "and-long/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info OR_LONG_2ADDR =
        new Info(Opcodes.OR_LONG_2ADDR, "or-long/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info XOR_LONG_2ADDR =
        new Info(Opcodes.XOR_LONG_2ADDR, "xor-long/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info SHL_LONG_2ADDR =
        new Info(Opcodes.SHL_LONG_2ADDR, "shl-long/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info SHR_LONG_2ADDR =
        new Info(Opcodes.SHR_LONG_2ADDR, "shr-long/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info USHR_LONG_2ADDR =
        new Info(Opcodes.USHR_LONG_2ADDR, "ushr-long/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info ADD_FLOAT_2ADDR =
        new Info(Opcodes.ADD_FLOAT_2ADDR, "add-float/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info SUB_FLOAT_2ADDR =
        new Info(Opcodes.SUB_FLOAT_2ADDR, "sub-float/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info MUL_FLOAT_2ADDR =
        new Info(Opcodes.MUL_FLOAT_2ADDR, "mul-float/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info DIV_FLOAT_2ADDR =
        new Info(Opcodes.DIV_FLOAT_2ADDR, "div-float/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info REM_FLOAT_2ADDR =
        new Info(Opcodes.REM_FLOAT_2ADDR, "rem-float/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info ADD_DOUBLE_2ADDR =
        new Info(Opcodes.ADD_DOUBLE_2ADDR, "add-double/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info SUB_DOUBLE_2ADDR =
        new Info(Opcodes.SUB_DOUBLE_2ADDR, "sub-double/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info MUL_DOUBLE_2ADDR =
        new Info(Opcodes.MUL_DOUBLE_2ADDR, "mul-double/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info DIV_DOUBLE_2ADDR =
        new Info(Opcodes.DIV_DOUBLE_2ADDR, "div-double/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info REM_DOUBLE_2ADDR =
        new Info(Opcodes.REM_DOUBLE_2ADDR, "rem-double/2addr",
            InstructionCodec.FORMAT_12X, IndexType.NONE);

    public static final Info ADD_INT_LIT16 =
        new Info(Opcodes.ADD_INT_LIT16, "add-int/lit16",
            InstructionCodec.FORMAT_22S, IndexType.NONE);

    public static final Info RSUB_INT =
        new Info(Opcodes.RSUB_INT, "rsub-int",
            InstructionCodec.FORMAT_22S, IndexType.NONE);

    public static final Info MUL_INT_LIT16 =
        new Info(Opcodes.MUL_INT_LIT16, "mul-int/lit16",
            InstructionCodec.FORMAT_22S, IndexType.NONE);

    public static final Info DIV_INT_LIT16 =
        new Info(Opcodes.DIV_INT_LIT16, "div-int/lit16",
            InstructionCodec.FORMAT_22S, IndexType.NONE);

    public static final Info REM_INT_LIT16 =
        new Info(Opcodes.REM_INT_LIT16, "rem-int/lit16",
            InstructionCodec.FORMAT_22S, IndexType.NONE);

    public static final Info AND_INT_LIT16 =
        new Info(Opcodes.AND_INT_LIT16, "and-int/lit16",
            InstructionCodec.FORMAT_22S, IndexType.NONE);

    public static final Info OR_INT_LIT16 =
        new Info(Opcodes.OR_INT_LIT16, "or-int/lit16",
            InstructionCodec.FORMAT_22S, IndexType.NONE);

    public static final Info XOR_INT_LIT16 =
        new Info(Opcodes.XOR_INT_LIT16, "xor-int/lit16",
            InstructionCodec.FORMAT_22S, IndexType.NONE);

    public static final Info ADD_INT_LIT8 =
        new Info(Opcodes.ADD_INT_LIT8, "add-int/lit8",
            InstructionCodec.FORMAT_22B, IndexType.NONE);

    public static final Info RSUB_INT_LIT8 =
        new Info(Opcodes.RSUB_INT_LIT8, "rsub-int/lit8",
            InstructionCodec.FORMAT_22B, IndexType.NONE);

    public static final Info MUL_INT_LIT8 =
        new Info(Opcodes.MUL_INT_LIT8, "mul-int/lit8",
            InstructionCodec.FORMAT_22B, IndexType.NONE);

    public static final Info DIV_INT_LIT8 =
        new Info(Opcodes.DIV_INT_LIT8, "div-int/lit8",
            InstructionCodec.FORMAT_22B, IndexType.NONE);

    public static final Info REM_INT_LIT8 =
        new Info(Opcodes.REM_INT_LIT8, "rem-int/lit8",
            InstructionCodec.FORMAT_22B, IndexType.NONE);

    public static final Info AND_INT_LIT8 =
        new Info(Opcodes.AND_INT_LIT8, "and-int/lit8",
            InstructionCodec.FORMAT_22B, IndexType.NONE);

    public static final Info OR_INT_LIT8 =
        new Info(Opcodes.OR_INT_LIT8, "or-int/lit8",
            InstructionCodec.FORMAT_22B, IndexType.NONE);

    public static final Info XOR_INT_LIT8 =
        new Info(Opcodes.XOR_INT_LIT8, "xor-int/lit8",
            InstructionCodec.FORMAT_22B, IndexType.NONE);

    public static final Info SHL_INT_LIT8 =
        new Info(Opcodes.SHL_INT_LIT8, "shl-int/lit8",
            InstructionCodec.FORMAT_22B, IndexType.NONE);

    public static final Info SHR_INT_LIT8 =
        new Info(Opcodes.SHR_INT_LIT8, "shr-int/lit8",
            InstructionCodec.FORMAT_22B, IndexType.NONE);

    public static final Info USHR_INT_LIT8 =
        new Info(Opcodes.USHR_INT_LIT8, "ushr-int/lit8",
            InstructionCodec.FORMAT_22B, IndexType.NONE);

    public static final Info CONST_CLASS_JUMBO =
        new Info(Opcodes.CONST_CLASS_JUMBO, "const-class/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.TYPE_REF);

    public static final Info CHECK_CAST_JUMBO =
        new Info(Opcodes.CHECK_CAST_JUMBO, "check-cast/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.TYPE_REF);

    public static final Info INSTANCE_OF_JUMBO =
        new Info(Opcodes.INSTANCE_OF_JUMBO, "instance-of/jumbo",
            InstructionCodec.FORMAT_52C, IndexType.TYPE_REF);

    public static final Info NEW_INSTANCE_JUMBO =
        new Info(Opcodes.NEW_INSTANCE_JUMBO, "new-instance/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.TYPE_REF);

    public static final Info NEW_ARRAY_JUMBO =
        new Info(Opcodes.NEW_ARRAY_JUMBO, "new-array/jumbo",
            InstructionCodec.FORMAT_52C, IndexType.TYPE_REF);

    public static final Info FILLED_NEW_ARRAY_JUMBO =
        new Info(Opcodes.FILLED_NEW_ARRAY_JUMBO, "filled-new-array/jumbo",
            InstructionCodec.FORMAT_5RC, IndexType.TYPE_REF);

    public static final Info IGET_JUMBO =
        new Info(Opcodes.IGET_JUMBO, "iget/jumbo",
            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);

    public static final Info IGET_WIDE_JUMBO =
        new Info(Opcodes.IGET_WIDE_JUMBO, "iget-wide/jumbo",
            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);

    public static final Info IGET_OBJECT_JUMBO =
        new Info(Opcodes.IGET_OBJECT_JUMBO, "iget-object/jumbo",
            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);

    public static final Info IGET_BOOLEAN_JUMBO =
        new Info(Opcodes.IGET_BOOLEAN_JUMBO, "iget-boolean/jumbo",
            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);

    public static final Info IGET_BYTE_JUMBO =
        new Info(Opcodes.IGET_BYTE_JUMBO, "iget-byte/jumbo",
            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);

    public static final Info IGET_CHAR_JUMBO =
        new Info(Opcodes.IGET_CHAR_JUMBO, "iget-char/jumbo",
            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);

    public static final Info IGET_SHORT_JUMBO =
        new Info(Opcodes.IGET_SHORT_JUMBO, "iget-short/jumbo",
            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);

    public static final Info IPUT_JUMBO =
        new Info(Opcodes.IPUT_JUMBO, "iput/jumbo",
            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);

    public static final Info IPUT_WIDE_JUMBO =
        new Info(Opcodes.IPUT_WIDE_JUMBO, "iput-wide/jumbo",
            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);

    public static final Info IPUT_OBJECT_JUMBO =
        new Info(Opcodes.IPUT_OBJECT_JUMBO, "iput-object/jumbo",
            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);

    public static final Info IPUT_BOOLEAN_JUMBO =
        new Info(Opcodes.IPUT_BOOLEAN_JUMBO, "iput-boolean/jumbo",
            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);

    public static final Info IPUT_BYTE_JUMBO =
        new Info(Opcodes.IPUT_BYTE_JUMBO, "iput-byte/jumbo",
            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);

    public static final Info IPUT_CHAR_JUMBO =
        new Info(Opcodes.IPUT_CHAR_JUMBO, "iput-char/jumbo",
            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);

    public static final Info IPUT_SHORT_JUMBO =
        new Info(Opcodes.IPUT_SHORT_JUMBO, "iput-short/jumbo",
            InstructionCodec.FORMAT_52C, IndexType.FIELD_REF);

    public static final Info SGET_JUMBO =
        new Info(Opcodes.SGET_JUMBO, "sget/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);

    public static final Info SGET_WIDE_JUMBO =
        new Info(Opcodes.SGET_WIDE_JUMBO, "sget-wide/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);

    public static final Info SGET_OBJECT_JUMBO =
        new Info(Opcodes.SGET_OBJECT_JUMBO, "sget-object/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);

    public static final Info SGET_BOOLEAN_JUMBO =
        new Info(Opcodes.SGET_BOOLEAN_JUMBO, "sget-boolean/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);

    public static final Info SGET_BYTE_JUMBO =
        new Info(Opcodes.SGET_BYTE_JUMBO, "sget-byte/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);

    public static final Info SGET_CHAR_JUMBO =
        new Info(Opcodes.SGET_CHAR_JUMBO, "sget-char/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);

    public static final Info SGET_SHORT_JUMBO =
        new Info(Opcodes.SGET_SHORT_JUMBO, "sget-short/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);

    public static final Info SPUT_JUMBO =
        new Info(Opcodes.SPUT_JUMBO, "sput/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);

    public static final Info SPUT_WIDE_JUMBO =
        new Info(Opcodes.SPUT_WIDE_JUMBO, "sput-wide/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);

    public static final Info SPUT_OBJECT_JUMBO =
        new Info(Opcodes.SPUT_OBJECT_JUMBO, "sput-object/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);

    public static final Info SPUT_BOOLEAN_JUMBO =
        new Info(Opcodes.SPUT_BOOLEAN_JUMBO, "sput-boolean/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);

    public static final Info SPUT_BYTE_JUMBO =
        new Info(Opcodes.SPUT_BYTE_JUMBO, "sput-byte/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);

    public static final Info SPUT_CHAR_JUMBO =
        new Info(Opcodes.SPUT_CHAR_JUMBO, "sput-char/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);

    public static final Info SPUT_SHORT_JUMBO =
        new Info(Opcodes.SPUT_SHORT_JUMBO, "sput-short/jumbo",
            InstructionCodec.FORMAT_41C, IndexType.FIELD_REF);

    public static final Info INVOKE_VIRTUAL_JUMBO =
        new Info(Opcodes.INVOKE_VIRTUAL_JUMBO, "invoke-virtual/jumbo",
            InstructionCodec.FORMAT_5RC, IndexType.METHOD_REF);

    public static final Info INVOKE_SUPER_JUMBO =
        new Info(Opcodes.INVOKE_SUPER_JUMBO, "invoke-super/jumbo",
            InstructionCodec.FORMAT_5RC, IndexType.METHOD_REF);

    public static final Info INVOKE_DIRECT_JUMBO =
        new Info(Opcodes.INVOKE_DIRECT_JUMBO, "invoke-direct/jumbo",
            InstructionCodec.FORMAT_5RC, IndexType.METHOD_REF);

    public static final Info INVOKE_STATIC_JUMBO =
        new Info(Opcodes.INVOKE_STATIC_JUMBO, "invoke-static/jumbo",
            InstructionCodec.FORMAT_5RC, IndexType.METHOD_REF);

    public static final Info INVOKE_INTERFACE_JUMBO =
        new Info(Opcodes.INVOKE_INTERFACE_JUMBO, "invoke-interface/jumbo",
            InstructionCodec.FORMAT_5RC, IndexType.METHOD_REF);

    // END(opcode-info-defs)

    // Static initialization.
    static {
        INFO = new Info[Opcodes.MAX_VALUE - Opcodes.MIN_VALUE + 1];

        // TODO: Stop using this constant.
        set(SPECIAL_FORMAT);

        // TODO: These payload opcodes should be generated by opcode-gen.
        set(PACKED_SWITCH_PAYLOAD);
        set(SPARSE_SWITCH_PAYLOAD);
        set(FILL_ARRAY_DATA_PAYLOAD);

        // BEGIN(opcode-info-init); GENERATED AUTOMATICALLY BY opcode-gen
        set(NOP);
        set(MOVE);
        set(MOVE_FROM16);
        set(MOVE_16);
        set(MOVE_WIDE);
        set(MOVE_WIDE_FROM16);
        set(MOVE_WIDE_16);
        set(MOVE_OBJECT);
        set(MOVE_OBJECT_FROM16);
        set(MOVE_OBJECT_16);
        set(MOVE_RESULT);
        set(MOVE_RESULT_WIDE);
        set(MOVE_RESULT_OBJECT);
        set(MOVE_EXCEPTION);
        set(RETURN_VOID);
        set(RETURN);
        set(RETURN_WIDE);
        set(RETURN_OBJECT);
        set(CONST_4);
        set(CONST_16);
        set(CONST);
        set(CONST_HIGH16);
        set(CONST_WIDE_16);
        set(CONST_WIDE_32);
        set(CONST_WIDE);
        set(CONST_WIDE_HIGH16);
        set(CONST_STRING);
        set(CONST_STRING_JUMBO);
        set(CONST_CLASS);
        set(MONITOR_ENTER);
        set(MONITOR_EXIT);
        set(CHECK_CAST);
        set(INSTANCE_OF);
        set(ARRAY_LENGTH);
        set(NEW_INSTANCE);
        set(NEW_ARRAY);
        set(FILLED_NEW_ARRAY);
        set(FILLED_NEW_ARRAY_RANGE);
        set(FILL_ARRAY_DATA);
        set(THROW);
        set(GOTO);
        set(GOTO_16);
        set(GOTO_32);
        set(PACKED_SWITCH);
        set(SPARSE_SWITCH);
        set(CMPL_FLOAT);
        set(CMPG_FLOAT);
        set(CMPL_DOUBLE);
        set(CMPG_DOUBLE);
        set(CMP_LONG);
        set(IF_EQ);
        set(IF_NE);
        set(IF_LT);
        set(IF_GE);
        set(IF_GT);
        set(IF_LE);
        set(IF_EQZ);
        set(IF_NEZ);
        set(IF_LTZ);
        set(IF_GEZ);
        set(IF_GTZ);
        set(IF_LEZ);
        set(AGET);
        set(AGET_WIDE);
        set(AGET_OBJECT);
        set(AGET_BOOLEAN);
        set(AGET_BYTE);
        set(AGET_CHAR);
        set(AGET_SHORT);
        set(APUT);
        set(APUT_WIDE);
        set(APUT_OBJECT);
        set(APUT_BOOLEAN);
        set(APUT_BYTE);
        set(APUT_CHAR);
        set(APUT_SHORT);
        set(IGET);
        set(IGET_WIDE);
        set(IGET_OBJECT);
        set(IGET_BOOLEAN);
        set(IGET_BYTE);
        set(IGET_CHAR);
        set(IGET_SHORT);
        set(IPUT);
        set(IPUT_WIDE);
        set(IPUT_OBJECT);
        set(IPUT_BOOLEAN);
        set(IPUT_BYTE);
        set(IPUT_CHAR);
        set(IPUT_SHORT);
        set(SGET);
        set(SGET_WIDE);
        set(SGET_OBJECT);
        set(SGET_BOOLEAN);
        set(SGET_BYTE);
        set(SGET_CHAR);
        set(SGET_SHORT);
        set(SPUT);
        set(SPUT_WIDE);
        set(SPUT_OBJECT);
        set(SPUT_BOOLEAN);
        set(SPUT_BYTE);
        set(SPUT_CHAR);
        set(SPUT_SHORT);
        set(INVOKE_VIRTUAL);
        set(INVOKE_SUPER);
        set(INVOKE_DIRECT);
        set(INVOKE_STATIC);
        set(INVOKE_INTERFACE);
        set(INVOKE_VIRTUAL_RANGE);
        set(INVOKE_SUPER_RANGE);
        set(INVOKE_DIRECT_RANGE);
        set(INVOKE_STATIC_RANGE);
        set(INVOKE_INTERFACE_RANGE);
        set(NEG_INT);
        set(NOT_INT);
        set(NEG_LONG);
        set(NOT_LONG);
        set(NEG_FLOAT);
        set(NEG_DOUBLE);
        set(INT_TO_LONG);
        set(INT_TO_FLOAT);
        set(INT_TO_DOUBLE);
        set(LONG_TO_INT);
        set(LONG_TO_FLOAT);
        set(LONG_TO_DOUBLE);
        set(FLOAT_TO_INT);
        set(FLOAT_TO_LONG);
        set(FLOAT_TO_DOUBLE);
        set(DOUBLE_TO_INT);
        set(DOUBLE_TO_LONG);
        set(DOUBLE_TO_FLOAT);
        set(INT_TO_BYTE);
        set(INT_TO_CHAR);
        set(INT_TO_SHORT);
        set(ADD_INT);
        set(SUB_INT);
        set(MUL_INT);
        set(DIV_INT);
        set(REM_INT);
        set(AND_INT);
        set(OR_INT);
        set(XOR_INT);
        set(SHL_INT);
        set(SHR_INT);
        set(USHR_INT);
        set(ADD_LONG);
        set(SUB_LONG);
        set(MUL_LONG);
        set(DIV_LONG);
        set(REM_LONG);
        set(AND_LONG);
        set(OR_LONG);
        set(XOR_LONG);
        set(SHL_LONG);
        set(SHR_LONG);
        set(USHR_LONG);
        set(ADD_FLOAT);
        set(SUB_FLOAT);
        set(MUL_FLOAT);
        set(DIV_FLOAT);
        set(REM_FLOAT);
        set(ADD_DOUBLE);
        set(SUB_DOUBLE);
        set(MUL_DOUBLE);
        set(DIV_DOUBLE);
        set(REM_DOUBLE);
        set(ADD_INT_2ADDR);
        set(SUB_INT_2ADDR);
        set(MUL_INT_2ADDR);
        set(DIV_INT_2ADDR);
        set(REM_INT_2ADDR);
        set(AND_INT_2ADDR);
        set(OR_INT_2ADDR);
        set(XOR_INT_2ADDR);
        set(SHL_INT_2ADDR);
        set(SHR_INT_2ADDR);
        set(USHR_INT_2ADDR);
        set(ADD_LONG_2ADDR);
        set(SUB_LONG_2ADDR);
        set(MUL_LONG_2ADDR);
        set(DIV_LONG_2ADDR);
        set(REM_LONG_2ADDR);
        set(AND_LONG_2ADDR);
        set(OR_LONG_2ADDR);
        set(XOR_LONG_2ADDR);
        set(SHL_LONG_2ADDR);
        set(SHR_LONG_2ADDR);
        set(USHR_LONG_2ADDR);
        set(ADD_FLOAT_2ADDR);
        set(SUB_FLOAT_2ADDR);
        set(MUL_FLOAT_2ADDR);
        set(DIV_FLOAT_2ADDR);
        set(REM_FLOAT_2ADDR);
        set(ADD_DOUBLE_2ADDR);
        set(SUB_DOUBLE_2ADDR);
        set(MUL_DOUBLE_2ADDR);
        set(DIV_DOUBLE_2ADDR);
        set(REM_DOUBLE_2ADDR);
        set(ADD_INT_LIT16);
        set(RSUB_INT);
        set(MUL_INT_LIT16);
        set(DIV_INT_LIT16);
        set(REM_INT_LIT16);
        set(AND_INT_LIT16);
        set(OR_INT_LIT16);
        set(XOR_INT_LIT16);
        set(ADD_INT_LIT8);
        set(RSUB_INT_LIT8);
        set(MUL_INT_LIT8);
        set(DIV_INT_LIT8);
        set(REM_INT_LIT8);
        set(AND_INT_LIT8);
        set(OR_INT_LIT8);
        set(XOR_INT_LIT8);
        set(SHL_INT_LIT8);
        set(SHR_INT_LIT8);
        set(USHR_INT_LIT8);
        set(CONST_CLASS_JUMBO);
        set(CHECK_CAST_JUMBO);
        set(INSTANCE_OF_JUMBO);
        set(NEW_INSTANCE_JUMBO);
        set(NEW_ARRAY_JUMBO);
        set(FILLED_NEW_ARRAY_JUMBO);
        set(IGET_JUMBO);
        set(IGET_WIDE_JUMBO);
        set(IGET_OBJECT_JUMBO);
        set(IGET_BOOLEAN_JUMBO);
        set(IGET_BYTE_JUMBO);
        set(IGET_CHAR_JUMBO);
        set(IGET_SHORT_JUMBO);
        set(IPUT_JUMBO);
        set(IPUT_WIDE_JUMBO);
        set(IPUT_OBJECT_JUMBO);
        set(IPUT_BOOLEAN_JUMBO);
        set(IPUT_BYTE_JUMBO);
        set(IPUT_CHAR_JUMBO);
        set(IPUT_SHORT_JUMBO);
        set(SGET_JUMBO);
        set(SGET_WIDE_JUMBO);
        set(SGET_OBJECT_JUMBO);
        set(SGET_BOOLEAN_JUMBO);
        set(SGET_BYTE_JUMBO);
        set(SGET_CHAR_JUMBO);
        set(SGET_SHORT_JUMBO);
        set(SPUT_JUMBO);
        set(SPUT_WIDE_JUMBO);
        set(SPUT_OBJECT_JUMBO);
        set(SPUT_BOOLEAN_JUMBO);
        set(SPUT_BYTE_JUMBO);
        set(SPUT_CHAR_JUMBO);
        set(SPUT_SHORT_JUMBO);
        set(INVOKE_VIRTUAL_JUMBO);
        set(INVOKE_SUPER_JUMBO);
        set(INVOKE_DIRECT_JUMBO);
        set(INVOKE_STATIC_JUMBO);
        set(INVOKE_INTERFACE_JUMBO);
        // END(opcode-info-init)
    }

    /**
     * This class is uninstantiable.
     */
    private OpcodeInfo() {
        // This space intentionally left blank.
    }

    /**
     * Gets the {@link @Info} for the given opcode value.
     *
     * @param opcode {@code Opcodes.MIN_VALUE..Opcodes.MAX_VALUE;} the
     * opcode value
     * @return non-null; the associated opcode information instance
     */
    public static Info get(int opcode) {
        int idx = opcode - Opcodes.MIN_VALUE;

        try {
            Info result = INFO[idx];
            if (result != null) {
                return result;
            }
        } catch (ArrayIndexOutOfBoundsException ex) {
            // Fall through.
        }

        throw new IllegalArgumentException("bogus opcode: "
                + Hex.u2or4(opcode));
    }

    /**
     * Gets the name of the given opcode.
     */
    public static String getName(int opcode) {
        return get(opcode).getName();
    }

    /**
     * Gets the format (an {@link InstructionCodec}) for the given opcode
     * value.
     */
    public static InstructionCodec getFormat(int opcode) {
        return get(opcode).getFormat();
    }

    /**
     * Gets the {@link IndexType} for the given opcode value.
     */
    public static IndexType getIndexType(int opcode) {
        return get(opcode).getIndexType();
    }

    /**
     * Puts the given opcode into the table of all ops.
     *
     * @param opcode non-null; the opcode
     */
    private static void set(Info opcode) {
        int idx = opcode.getOpcode() - Opcodes.MIN_VALUE;
        INFO[idx] = opcode;
    }

    /**
     * Information about an opcode.
     */
    public static class Info {
        private final int opcode;
        private final String name;
        private final InstructionCodec format;
        private final IndexType indexType;

        public Info(int opcode, String name, InstructionCodec format,
                IndexType indexType) {
            this.opcode = opcode;
            this.name = name;
            this.format = format;
            this.indexType = indexType;
        }

        public int getOpcode() {
            return opcode;
        }

        public String getName() {
            return name;
        }

        public InstructionCodec getFormat() {
            return format;
        }

        public IndexType getIndexType() {
            return indexType;
        }
    }
}
