/*
 * 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 INVOKE_POLYMORPHIC =
        new Info(Opcodes.INVOKE_POLYMORPHIC, "invoke-polymorphic",
            InstructionCodec.FORMAT_45CC, IndexType.METHOD_AND_PROTO_REF);

    public static final Info INVOKE_POLYMORPHIC_RANGE =
        new Info(Opcodes.INVOKE_POLYMORPHIC_RANGE, "invoke-polymorphic/range",
            InstructionCodec.FORMAT_4RCC, IndexType.METHOD_AND_PROTO_REF);

    public static final Info INVOKE_CUSTOM =
        new Info(Opcodes.INVOKE_CUSTOM, "invoke-custom",
            InstructionCodec.FORMAT_35C, IndexType.CALL_SITE_REF);

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

    public static final Info CONST_METHOD_HANDLE =
        new Info(Opcodes.CONST_METHOD_HANDLE, "const-method-handle",
            InstructionCodec.FORMAT_21C, IndexType.METHOD_HANDLE_REF);

    public static final Info CONST_METHOD_TYPE =
        new Info(Opcodes.CONST_METHOD_TYPE, "const-method-type",
            InstructionCodec.FORMAT_21C, IndexType.PROTO_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(INVOKE_POLYMORPHIC);
        set(INVOKE_POLYMORPHIC_RANGE);
        set(INVOKE_CUSTOM);
        set(INVOKE_CUSTOM_RANGE);
        set(CONST_METHOD_HANDLE);
        set(CONST_METHOD_TYPE);
        // 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;
        }
    }
}
