/*
 * Copyright (C) 2007 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.dex.code;

import com.android.dx.dex.code.form.Form10t;
import com.android.dx.dex.code.form.Form10x;
import com.android.dx.dex.code.form.Form11n;
import com.android.dx.dex.code.form.Form11x;
import com.android.dx.dex.code.form.Form12x;
import com.android.dx.dex.code.form.Form20t;
import com.android.dx.dex.code.form.Form21c;
import com.android.dx.dex.code.form.Form21h;
import com.android.dx.dex.code.form.Form21s;
import com.android.dx.dex.code.form.Form21t;
import com.android.dx.dex.code.form.Form22b;
import com.android.dx.dex.code.form.Form22c;
import com.android.dx.dex.code.form.Form22s;
import com.android.dx.dex.code.form.Form22t;
import com.android.dx.dex.code.form.Form22x;
import com.android.dx.dex.code.form.Form23x;
import com.android.dx.dex.code.form.Form30t;
import com.android.dx.dex.code.form.Form31c;
import com.android.dx.dex.code.form.Form31i;
import com.android.dx.dex.code.form.Form31t;
import com.android.dx.dex.code.form.Form32x;
import com.android.dx.dex.code.form.Form35c;
import com.android.dx.dex.code.form.Form3rc;
import com.android.dx.dex.code.form.Form51l;
import com.android.dx.dex.code.form.SpecialFormat;

/**
 * Standard instances of {@link Dop} and utility methods for getting
 * them.
 */
public final class Dops {
    /** {@code non-null;} array containing all the standard instances */
    private static final Dop[] DOPS;

    /**
     * pseudo-opcode used for nonstandard formatted "instructions"
     * (which are mostly not actually instructions, though they do
     * appear in instruction lists)
     */
    public static final Dop SPECIAL_FORMAT =
        new Dop(DalvOps.SPECIAL_FORMAT, DalvOps.SPECIAL_FORMAT,
                SpecialFormat.THE_ONE, false, "<special>");

    // BEGIN(dops); GENERATED AUTOMATICALLY BY opcode-gen
    public static final Dop NOP =
        new Dop(DalvOps.NOP, DalvOps.NOP,
            Form10x.THE_ONE, false, "nop");

    public static final Dop MOVE =
        new Dop(DalvOps.MOVE, DalvOps.MOVE,
            Form12x.THE_ONE, true, "move");

    public static final Dop MOVE_FROM16 =
        new Dop(DalvOps.MOVE_FROM16, DalvOps.MOVE,
            Form22x.THE_ONE, true, "move/from16");

    public static final Dop MOVE_16 =
        new Dop(DalvOps.MOVE_16, DalvOps.MOVE,
            Form32x.THE_ONE, true, "move/16");

    public static final Dop MOVE_WIDE =
        new Dop(DalvOps.MOVE_WIDE, DalvOps.MOVE_WIDE,
            Form12x.THE_ONE, true, "move-wide");

    public static final Dop MOVE_WIDE_FROM16 =
        new Dop(DalvOps.MOVE_WIDE_FROM16, DalvOps.MOVE_WIDE,
            Form22x.THE_ONE, true, "move-wide/from16");

    public static final Dop MOVE_WIDE_16 =
        new Dop(DalvOps.MOVE_WIDE_16, DalvOps.MOVE_WIDE,
            Form32x.THE_ONE, true, "move-wide/16");

    public static final Dop MOVE_OBJECT =
        new Dop(DalvOps.MOVE_OBJECT, DalvOps.MOVE_OBJECT,
            Form12x.THE_ONE, true, "move-object");

    public static final Dop MOVE_OBJECT_FROM16 =
        new Dop(DalvOps.MOVE_OBJECT_FROM16, DalvOps.MOVE_OBJECT,
            Form22x.THE_ONE, true, "move-object/from16");

    public static final Dop MOVE_OBJECT_16 =
        new Dop(DalvOps.MOVE_OBJECT_16, DalvOps.MOVE_OBJECT,
            Form32x.THE_ONE, true, "move-object/16");

    public static final Dop MOVE_RESULT =
        new Dop(DalvOps.MOVE_RESULT, DalvOps.MOVE_RESULT,
            Form11x.THE_ONE, true, "move-result");

    public static final Dop MOVE_RESULT_WIDE =
        new Dop(DalvOps.MOVE_RESULT_WIDE, DalvOps.MOVE_RESULT_WIDE,
            Form11x.THE_ONE, true, "move-result-wide");

    public static final Dop MOVE_RESULT_OBJECT =
        new Dop(DalvOps.MOVE_RESULT_OBJECT, DalvOps.MOVE_RESULT_OBJECT,
            Form11x.THE_ONE, true, "move-result-object");

    public static final Dop MOVE_EXCEPTION =
        new Dop(DalvOps.MOVE_EXCEPTION, DalvOps.MOVE_EXCEPTION,
            Form11x.THE_ONE, true, "move-exception");

    public static final Dop RETURN_VOID =
        new Dop(DalvOps.RETURN_VOID, DalvOps.RETURN_VOID,
            Form10x.THE_ONE, false, "return-void");

    public static final Dop RETURN =
        new Dop(DalvOps.RETURN, DalvOps.RETURN,
            Form11x.THE_ONE, false, "return");

    public static final Dop RETURN_WIDE =
        new Dop(DalvOps.RETURN_WIDE, DalvOps.RETURN_WIDE,
            Form11x.THE_ONE, false, "return-wide");

    public static final Dop RETURN_OBJECT =
        new Dop(DalvOps.RETURN_OBJECT, DalvOps.RETURN_OBJECT,
            Form11x.THE_ONE, false, "return-object");

    public static final Dop CONST_4 =
        new Dop(DalvOps.CONST_4, DalvOps.CONST,
            Form11n.THE_ONE, true, "const/4");

    public static final Dop CONST_16 =
        new Dop(DalvOps.CONST_16, DalvOps.CONST,
            Form21s.THE_ONE, true, "const/16");

    public static final Dop CONST =
        new Dop(DalvOps.CONST, DalvOps.CONST,
            Form31i.THE_ONE, true, "const");

    public static final Dop CONST_HIGH16 =
        new Dop(DalvOps.CONST_HIGH16, DalvOps.CONST,
            Form21h.THE_ONE, true, "const/high16");

    public static final Dop CONST_WIDE_16 =
        new Dop(DalvOps.CONST_WIDE_16, DalvOps.CONST_WIDE,
            Form21s.THE_ONE, true, "const-wide/16");

    public static final Dop CONST_WIDE_32 =
        new Dop(DalvOps.CONST_WIDE_32, DalvOps.CONST_WIDE,
            Form31i.THE_ONE, true, "const-wide/32");

    public static final Dop CONST_WIDE =
        new Dop(DalvOps.CONST_WIDE, DalvOps.CONST_WIDE,
            Form51l.THE_ONE, true, "const-wide");

    public static final Dop CONST_WIDE_HIGH16 =
        new Dop(DalvOps.CONST_WIDE_HIGH16, DalvOps.CONST_WIDE,
            Form21h.THE_ONE, true, "const-wide/high16");

    public static final Dop CONST_STRING =
        new Dop(DalvOps.CONST_STRING, DalvOps.CONST_STRING,
            Form21c.THE_ONE, true, "const-string");

    public static final Dop CONST_STRING_JUMBO =
        new Dop(DalvOps.CONST_STRING_JUMBO, DalvOps.CONST_STRING,
            Form31c.THE_ONE, true, "const-string/jumbo");

    public static final Dop CONST_CLASS =
        new Dop(DalvOps.CONST_CLASS, DalvOps.CONST_CLASS,
            Form21c.THE_ONE, true, "const-class");

    public static final Dop MONITOR_ENTER =
        new Dop(DalvOps.MONITOR_ENTER, DalvOps.MONITOR_ENTER,
            Form11x.THE_ONE, false, "monitor-enter");

    public static final Dop MONITOR_EXIT =
        new Dop(DalvOps.MONITOR_EXIT, DalvOps.MONITOR_EXIT,
            Form11x.THE_ONE, false, "monitor-exit");

    public static final Dop CHECK_CAST =
        new Dop(DalvOps.CHECK_CAST, DalvOps.CHECK_CAST,
            Form21c.THE_ONE, true, "check-cast");

    public static final Dop INSTANCE_OF =
        new Dop(DalvOps.INSTANCE_OF, DalvOps.INSTANCE_OF,
            Form22c.THE_ONE, true, "instance-of");

    public static final Dop ARRAY_LENGTH =
        new Dop(DalvOps.ARRAY_LENGTH, DalvOps.ARRAY_LENGTH,
            Form12x.THE_ONE, true, "array-length");

    public static final Dop NEW_INSTANCE =
        new Dop(DalvOps.NEW_INSTANCE, DalvOps.NEW_INSTANCE,
            Form21c.THE_ONE, true, "new-instance");

    public static final Dop NEW_ARRAY =
        new Dop(DalvOps.NEW_ARRAY, DalvOps.NEW_ARRAY,
            Form22c.THE_ONE, true, "new-array");

    public static final Dop FILLED_NEW_ARRAY =
        new Dop(DalvOps.FILLED_NEW_ARRAY, DalvOps.FILLED_NEW_ARRAY,
            Form35c.THE_ONE, false, "filled-new-array");

    public static final Dop FILLED_NEW_ARRAY_RANGE =
        new Dop(DalvOps.FILLED_NEW_ARRAY_RANGE, DalvOps.FILLED_NEW_ARRAY,
            Form3rc.THE_ONE, false, "filled-new-array/range");

    public static final Dop FILL_ARRAY_DATA =
        new Dop(DalvOps.FILL_ARRAY_DATA, DalvOps.FILL_ARRAY_DATA,
            Form31t.THE_ONE, false, "fill-array-data");

    public static final Dop THROW =
        new Dop(DalvOps.THROW, DalvOps.THROW,
            Form11x.THE_ONE, false, "throw");

    public static final Dop GOTO =
        new Dop(DalvOps.GOTO, DalvOps.GOTO,
            Form10t.THE_ONE, false, "goto");

    public static final Dop GOTO_16 =
        new Dop(DalvOps.GOTO_16, DalvOps.GOTO,
            Form20t.THE_ONE, false, "goto/16");

    public static final Dop GOTO_32 =
        new Dop(DalvOps.GOTO_32, DalvOps.GOTO,
            Form30t.THE_ONE, false, "goto/32");

    public static final Dop PACKED_SWITCH =
        new Dop(DalvOps.PACKED_SWITCH, DalvOps.PACKED_SWITCH,
            Form31t.THE_ONE, false, "packed-switch");

    public static final Dop SPARSE_SWITCH =
        new Dop(DalvOps.SPARSE_SWITCH, DalvOps.SPARSE_SWITCH,
            Form31t.THE_ONE, false, "sparse-switch");

    public static final Dop CMPL_FLOAT =
        new Dop(DalvOps.CMPL_FLOAT, DalvOps.CMPL_FLOAT,
            Form23x.THE_ONE, true, "cmpl-float");

    public static final Dop CMPG_FLOAT =
        new Dop(DalvOps.CMPG_FLOAT, DalvOps.CMPG_FLOAT,
            Form23x.THE_ONE, true, "cmpg-float");

    public static final Dop CMPL_DOUBLE =
        new Dop(DalvOps.CMPL_DOUBLE, DalvOps.CMPL_DOUBLE,
            Form23x.THE_ONE, true, "cmpl-double");

    public static final Dop CMPG_DOUBLE =
        new Dop(DalvOps.CMPG_DOUBLE, DalvOps.CMPG_DOUBLE,
            Form23x.THE_ONE, true, "cmpg-double");

    public static final Dop CMP_LONG =
        new Dop(DalvOps.CMP_LONG, DalvOps.CMP_LONG,
            Form23x.THE_ONE, true, "cmp-long");

    public static final Dop IF_EQ =
        new Dop(DalvOps.IF_EQ, DalvOps.IF_EQ,
            Form22t.THE_ONE, false, "if-eq");

    public static final Dop IF_NE =
        new Dop(DalvOps.IF_NE, DalvOps.IF_NE,
            Form22t.THE_ONE, false, "if-ne");

    public static final Dop IF_LT =
        new Dop(DalvOps.IF_LT, DalvOps.IF_LT,
            Form22t.THE_ONE, false, "if-lt");

    public static final Dop IF_GE =
        new Dop(DalvOps.IF_GE, DalvOps.IF_GE,
            Form22t.THE_ONE, false, "if-ge");

    public static final Dop IF_GT =
        new Dop(DalvOps.IF_GT, DalvOps.IF_GT,
            Form22t.THE_ONE, false, "if-gt");

    public static final Dop IF_LE =
        new Dop(DalvOps.IF_LE, DalvOps.IF_LE,
            Form22t.THE_ONE, false, "if-le");

    public static final Dop IF_EQZ =
        new Dop(DalvOps.IF_EQZ, DalvOps.IF_EQZ,
            Form21t.THE_ONE, false, "if-eqz");

    public static final Dop IF_NEZ =
        new Dop(DalvOps.IF_NEZ, DalvOps.IF_NEZ,
            Form21t.THE_ONE, false, "if-nez");

    public static final Dop IF_LTZ =
        new Dop(DalvOps.IF_LTZ, DalvOps.IF_LTZ,
            Form21t.THE_ONE, false, "if-ltz");

    public static final Dop IF_GEZ =
        new Dop(DalvOps.IF_GEZ, DalvOps.IF_GEZ,
            Form21t.THE_ONE, false, "if-gez");

    public static final Dop IF_GTZ =
        new Dop(DalvOps.IF_GTZ, DalvOps.IF_GTZ,
            Form21t.THE_ONE, false, "if-gtz");

    public static final Dop IF_LEZ =
        new Dop(DalvOps.IF_LEZ, DalvOps.IF_LEZ,
            Form21t.THE_ONE, false, "if-lez");

    public static final Dop AGET =
        new Dop(DalvOps.AGET, DalvOps.AGET,
            Form23x.THE_ONE, true, "aget");

    public static final Dop AGET_WIDE =
        new Dop(DalvOps.AGET_WIDE, DalvOps.AGET_WIDE,
            Form23x.THE_ONE, true, "aget-wide");

    public static final Dop AGET_OBJECT =
        new Dop(DalvOps.AGET_OBJECT, DalvOps.AGET_OBJECT,
            Form23x.THE_ONE, true, "aget-object");

    public static final Dop AGET_BOOLEAN =
        new Dop(DalvOps.AGET_BOOLEAN, DalvOps.AGET_BOOLEAN,
            Form23x.THE_ONE, true, "aget-boolean");

    public static final Dop AGET_BYTE =
        new Dop(DalvOps.AGET_BYTE, DalvOps.AGET_BYTE,
            Form23x.THE_ONE, true, "aget-byte");

    public static final Dop AGET_CHAR =
        new Dop(DalvOps.AGET_CHAR, DalvOps.AGET_CHAR,
            Form23x.THE_ONE, true, "aget-char");

    public static final Dop AGET_SHORT =
        new Dop(DalvOps.AGET_SHORT, DalvOps.AGET_SHORT,
            Form23x.THE_ONE, true, "aget-short");

    public static final Dop APUT =
        new Dop(DalvOps.APUT, DalvOps.APUT,
            Form23x.THE_ONE, false, "aput");

    public static final Dop APUT_WIDE =
        new Dop(DalvOps.APUT_WIDE, DalvOps.APUT_WIDE,
            Form23x.THE_ONE, false, "aput-wide");

    public static final Dop APUT_OBJECT =
        new Dop(DalvOps.APUT_OBJECT, DalvOps.APUT_OBJECT,
            Form23x.THE_ONE, false, "aput-object");

    public static final Dop APUT_BOOLEAN =
        new Dop(DalvOps.APUT_BOOLEAN, DalvOps.APUT_BOOLEAN,
            Form23x.THE_ONE, false, "aput-boolean");

    public static final Dop APUT_BYTE =
        new Dop(DalvOps.APUT_BYTE, DalvOps.APUT_BYTE,
            Form23x.THE_ONE, false, "aput-byte");

    public static final Dop APUT_CHAR =
        new Dop(DalvOps.APUT_CHAR, DalvOps.APUT_CHAR,
            Form23x.THE_ONE, false, "aput-char");

    public static final Dop APUT_SHORT =
        new Dop(DalvOps.APUT_SHORT, DalvOps.APUT_SHORT,
            Form23x.THE_ONE, false, "aput-short");

    public static final Dop IGET =
        new Dop(DalvOps.IGET, DalvOps.IGET,
            Form22c.THE_ONE, true, "iget");

    public static final Dop IGET_WIDE =
        new Dop(DalvOps.IGET_WIDE, DalvOps.IGET_WIDE,
            Form22c.THE_ONE, true, "iget-wide");

    public static final Dop IGET_OBJECT =
        new Dop(DalvOps.IGET_OBJECT, DalvOps.IGET_OBJECT,
            Form22c.THE_ONE, true, "iget-object");

    public static final Dop IGET_BOOLEAN =
        new Dop(DalvOps.IGET_BOOLEAN, DalvOps.IGET_BOOLEAN,
            Form22c.THE_ONE, true, "iget-boolean");

    public static final Dop IGET_BYTE =
        new Dop(DalvOps.IGET_BYTE, DalvOps.IGET_BYTE,
            Form22c.THE_ONE, true, "iget-byte");

    public static final Dop IGET_CHAR =
        new Dop(DalvOps.IGET_CHAR, DalvOps.IGET_CHAR,
            Form22c.THE_ONE, true, "iget-char");

    public static final Dop IGET_SHORT =
        new Dop(DalvOps.IGET_SHORT, DalvOps.IGET_SHORT,
            Form22c.THE_ONE, true, "iget-short");

    public static final Dop IPUT =
        new Dop(DalvOps.IPUT, DalvOps.IPUT,
            Form22c.THE_ONE, false, "iput");

    public static final Dop IPUT_WIDE =
        new Dop(DalvOps.IPUT_WIDE, DalvOps.IPUT_WIDE,
            Form22c.THE_ONE, false, "iput-wide");

    public static final Dop IPUT_OBJECT =
        new Dop(DalvOps.IPUT_OBJECT, DalvOps.IPUT_OBJECT,
            Form22c.THE_ONE, false, "iput-object");

    public static final Dop IPUT_BOOLEAN =
        new Dop(DalvOps.IPUT_BOOLEAN, DalvOps.IPUT_BOOLEAN,
            Form22c.THE_ONE, false, "iput-boolean");

    public static final Dop IPUT_BYTE =
        new Dop(DalvOps.IPUT_BYTE, DalvOps.IPUT_BYTE,
            Form22c.THE_ONE, false, "iput-byte");

    public static final Dop IPUT_CHAR =
        new Dop(DalvOps.IPUT_CHAR, DalvOps.IPUT_CHAR,
            Form22c.THE_ONE, false, "iput-char");

    public static final Dop IPUT_SHORT =
        new Dop(DalvOps.IPUT_SHORT, DalvOps.IPUT_SHORT,
            Form22c.THE_ONE, false, "iput-short");

    public static final Dop SGET =
        new Dop(DalvOps.SGET, DalvOps.SGET,
            Form21c.THE_ONE, true, "sget");

    public static final Dop SGET_WIDE =
        new Dop(DalvOps.SGET_WIDE, DalvOps.SGET_WIDE,
            Form21c.THE_ONE, true, "sget-wide");

    public static final Dop SGET_OBJECT =
        new Dop(DalvOps.SGET_OBJECT, DalvOps.SGET_OBJECT,
            Form21c.THE_ONE, true, "sget-object");

    public static final Dop SGET_BOOLEAN =
        new Dop(DalvOps.SGET_BOOLEAN, DalvOps.SGET_BOOLEAN,
            Form21c.THE_ONE, true, "sget-boolean");

    public static final Dop SGET_BYTE =
        new Dop(DalvOps.SGET_BYTE, DalvOps.SGET_BYTE,
            Form21c.THE_ONE, true, "sget-byte");

    public static final Dop SGET_CHAR =
        new Dop(DalvOps.SGET_CHAR, DalvOps.SGET_CHAR,
            Form21c.THE_ONE, true, "sget-char");

    public static final Dop SGET_SHORT =
        new Dop(DalvOps.SGET_SHORT, DalvOps.SGET_SHORT,
            Form21c.THE_ONE, true, "sget-short");

    public static final Dop SPUT =
        new Dop(DalvOps.SPUT, DalvOps.SPUT,
            Form21c.THE_ONE, false, "sput");

    public static final Dop SPUT_WIDE =
        new Dop(DalvOps.SPUT_WIDE, DalvOps.SPUT_WIDE,
            Form21c.THE_ONE, false, "sput-wide");

    public static final Dop SPUT_OBJECT =
        new Dop(DalvOps.SPUT_OBJECT, DalvOps.SPUT_OBJECT,
            Form21c.THE_ONE, false, "sput-object");

    public static final Dop SPUT_BOOLEAN =
        new Dop(DalvOps.SPUT_BOOLEAN, DalvOps.SPUT_BOOLEAN,
            Form21c.THE_ONE, false, "sput-boolean");

    public static final Dop SPUT_BYTE =
        new Dop(DalvOps.SPUT_BYTE, DalvOps.SPUT_BYTE,
            Form21c.THE_ONE, false, "sput-byte");

    public static final Dop SPUT_CHAR =
        new Dop(DalvOps.SPUT_CHAR, DalvOps.SPUT_CHAR,
            Form21c.THE_ONE, false, "sput-char");

    public static final Dop SPUT_SHORT =
        new Dop(DalvOps.SPUT_SHORT, DalvOps.SPUT_SHORT,
            Form21c.THE_ONE, false, "sput-short");

    public static final Dop INVOKE_VIRTUAL =
        new Dop(DalvOps.INVOKE_VIRTUAL, DalvOps.INVOKE_VIRTUAL,
            Form35c.THE_ONE, false, "invoke-virtual");

    public static final Dop INVOKE_SUPER =
        new Dop(DalvOps.INVOKE_SUPER, DalvOps.INVOKE_SUPER,
            Form35c.THE_ONE, false, "invoke-super");

    public static final Dop INVOKE_DIRECT =
        new Dop(DalvOps.INVOKE_DIRECT, DalvOps.INVOKE_DIRECT,
            Form35c.THE_ONE, false, "invoke-direct");

    public static final Dop INVOKE_STATIC =
        new Dop(DalvOps.INVOKE_STATIC, DalvOps.INVOKE_STATIC,
            Form35c.THE_ONE, false, "invoke-static");

    public static final Dop INVOKE_INTERFACE =
        new Dop(DalvOps.INVOKE_INTERFACE, DalvOps.INVOKE_INTERFACE,
            Form35c.THE_ONE, false, "invoke-interface");

    public static final Dop INVOKE_VIRTUAL_RANGE =
        new Dop(DalvOps.INVOKE_VIRTUAL_RANGE, DalvOps.INVOKE_VIRTUAL,
            Form3rc.THE_ONE, false, "invoke-virtual/range");

    public static final Dop INVOKE_SUPER_RANGE =
        new Dop(DalvOps.INVOKE_SUPER_RANGE, DalvOps.INVOKE_SUPER,
            Form3rc.THE_ONE, false, "invoke-super/range");

    public static final Dop INVOKE_DIRECT_RANGE =
        new Dop(DalvOps.INVOKE_DIRECT_RANGE, DalvOps.INVOKE_DIRECT,
            Form3rc.THE_ONE, false, "invoke-direct/range");

    public static final Dop INVOKE_STATIC_RANGE =
        new Dop(DalvOps.INVOKE_STATIC_RANGE, DalvOps.INVOKE_STATIC,
            Form3rc.THE_ONE, false, "invoke-static/range");

    public static final Dop INVOKE_INTERFACE_RANGE =
        new Dop(DalvOps.INVOKE_INTERFACE_RANGE, DalvOps.INVOKE_INTERFACE,
            Form3rc.THE_ONE, false, "invoke-interface/range");

    public static final Dop NEG_INT =
        new Dop(DalvOps.NEG_INT, DalvOps.NEG_INT,
            Form12x.THE_ONE, true, "neg-int");

    public static final Dop NOT_INT =
        new Dop(DalvOps.NOT_INT, DalvOps.NOT_INT,
            Form12x.THE_ONE, true, "not-int");

    public static final Dop NEG_LONG =
        new Dop(DalvOps.NEG_LONG, DalvOps.NEG_LONG,
            Form12x.THE_ONE, true, "neg-long");

    public static final Dop NOT_LONG =
        new Dop(DalvOps.NOT_LONG, DalvOps.NOT_LONG,
            Form12x.THE_ONE, true, "not-long");

    public static final Dop NEG_FLOAT =
        new Dop(DalvOps.NEG_FLOAT, DalvOps.NEG_FLOAT,
            Form12x.THE_ONE, true, "neg-float");

    public static final Dop NEG_DOUBLE =
        new Dop(DalvOps.NEG_DOUBLE, DalvOps.NEG_DOUBLE,
            Form12x.THE_ONE, true, "neg-double");

    public static final Dop INT_TO_LONG =
        new Dop(DalvOps.INT_TO_LONG, DalvOps.INT_TO_LONG,
            Form12x.THE_ONE, true, "int-to-long");

    public static final Dop INT_TO_FLOAT =
        new Dop(DalvOps.INT_TO_FLOAT, DalvOps.INT_TO_FLOAT,
            Form12x.THE_ONE, true, "int-to-float");

    public static final Dop INT_TO_DOUBLE =
        new Dop(DalvOps.INT_TO_DOUBLE, DalvOps.INT_TO_DOUBLE,
            Form12x.THE_ONE, true, "int-to-double");

    public static final Dop LONG_TO_INT =
        new Dop(DalvOps.LONG_TO_INT, DalvOps.LONG_TO_INT,
            Form12x.THE_ONE, true, "long-to-int");

    public static final Dop LONG_TO_FLOAT =
        new Dop(DalvOps.LONG_TO_FLOAT, DalvOps.LONG_TO_FLOAT,
            Form12x.THE_ONE, true, "long-to-float");

    public static final Dop LONG_TO_DOUBLE =
        new Dop(DalvOps.LONG_TO_DOUBLE, DalvOps.LONG_TO_DOUBLE,
            Form12x.THE_ONE, true, "long-to-double");

    public static final Dop FLOAT_TO_INT =
        new Dop(DalvOps.FLOAT_TO_INT, DalvOps.FLOAT_TO_INT,
            Form12x.THE_ONE, true, "float-to-int");

    public static final Dop FLOAT_TO_LONG =
        new Dop(DalvOps.FLOAT_TO_LONG, DalvOps.FLOAT_TO_LONG,
            Form12x.THE_ONE, true, "float-to-long");

    public static final Dop FLOAT_TO_DOUBLE =
        new Dop(DalvOps.FLOAT_TO_DOUBLE, DalvOps.FLOAT_TO_DOUBLE,
            Form12x.THE_ONE, true, "float-to-double");

    public static final Dop DOUBLE_TO_INT =
        new Dop(DalvOps.DOUBLE_TO_INT, DalvOps.DOUBLE_TO_INT,
            Form12x.THE_ONE, true, "double-to-int");

    public static final Dop DOUBLE_TO_LONG =
        new Dop(DalvOps.DOUBLE_TO_LONG, DalvOps.DOUBLE_TO_LONG,
            Form12x.THE_ONE, true, "double-to-long");

    public static final Dop DOUBLE_TO_FLOAT =
        new Dop(DalvOps.DOUBLE_TO_FLOAT, DalvOps.DOUBLE_TO_FLOAT,
            Form12x.THE_ONE, true, "double-to-float");

    public static final Dop INT_TO_BYTE =
        new Dop(DalvOps.INT_TO_BYTE, DalvOps.INT_TO_BYTE,
            Form12x.THE_ONE, true, "int-to-byte");

    public static final Dop INT_TO_CHAR =
        new Dop(DalvOps.INT_TO_CHAR, DalvOps.INT_TO_CHAR,
            Form12x.THE_ONE, true, "int-to-char");

    public static final Dop INT_TO_SHORT =
        new Dop(DalvOps.INT_TO_SHORT, DalvOps.INT_TO_SHORT,
            Form12x.THE_ONE, true, "int-to-short");

    public static final Dop ADD_INT =
        new Dop(DalvOps.ADD_INT, DalvOps.ADD_INT,
            Form23x.THE_ONE, true, "add-int");

    public static final Dop SUB_INT =
        new Dop(DalvOps.SUB_INT, DalvOps.SUB_INT,
            Form23x.THE_ONE, true, "sub-int");

    public static final Dop MUL_INT =
        new Dop(DalvOps.MUL_INT, DalvOps.MUL_INT,
            Form23x.THE_ONE, true, "mul-int");

    public static final Dop DIV_INT =
        new Dop(DalvOps.DIV_INT, DalvOps.DIV_INT,
            Form23x.THE_ONE, true, "div-int");

    public static final Dop REM_INT =
        new Dop(DalvOps.REM_INT, DalvOps.REM_INT,
            Form23x.THE_ONE, true, "rem-int");

    public static final Dop AND_INT =
        new Dop(DalvOps.AND_INT, DalvOps.AND_INT,
            Form23x.THE_ONE, true, "and-int");

    public static final Dop OR_INT =
        new Dop(DalvOps.OR_INT, DalvOps.OR_INT,
            Form23x.THE_ONE, true, "or-int");

    public static final Dop XOR_INT =
        new Dop(DalvOps.XOR_INT, DalvOps.XOR_INT,
            Form23x.THE_ONE, true, "xor-int");

    public static final Dop SHL_INT =
        new Dop(DalvOps.SHL_INT, DalvOps.SHL_INT,
            Form23x.THE_ONE, true, "shl-int");

    public static final Dop SHR_INT =
        new Dop(DalvOps.SHR_INT, DalvOps.SHR_INT,
            Form23x.THE_ONE, true, "shr-int");

    public static final Dop USHR_INT =
        new Dop(DalvOps.USHR_INT, DalvOps.USHR_INT,
            Form23x.THE_ONE, true, "ushr-int");

    public static final Dop ADD_LONG =
        new Dop(DalvOps.ADD_LONG, DalvOps.ADD_LONG,
            Form23x.THE_ONE, true, "add-long");

    public static final Dop SUB_LONG =
        new Dop(DalvOps.SUB_LONG, DalvOps.SUB_LONG,
            Form23x.THE_ONE, true, "sub-long");

    public static final Dop MUL_LONG =
        new Dop(DalvOps.MUL_LONG, DalvOps.MUL_LONG,
            Form23x.THE_ONE, true, "mul-long");

    public static final Dop DIV_LONG =
        new Dop(DalvOps.DIV_LONG, DalvOps.DIV_LONG,
            Form23x.THE_ONE, true, "div-long");

    public static final Dop REM_LONG =
        new Dop(DalvOps.REM_LONG, DalvOps.REM_LONG,
            Form23x.THE_ONE, true, "rem-long");

    public static final Dop AND_LONG =
        new Dop(DalvOps.AND_LONG, DalvOps.AND_LONG,
            Form23x.THE_ONE, true, "and-long");

    public static final Dop OR_LONG =
        new Dop(DalvOps.OR_LONG, DalvOps.OR_LONG,
            Form23x.THE_ONE, true, "or-long");

    public static final Dop XOR_LONG =
        new Dop(DalvOps.XOR_LONG, DalvOps.XOR_LONG,
            Form23x.THE_ONE, true, "xor-long");

    public static final Dop SHL_LONG =
        new Dop(DalvOps.SHL_LONG, DalvOps.SHL_LONG,
            Form23x.THE_ONE, true, "shl-long");

    public static final Dop SHR_LONG =
        new Dop(DalvOps.SHR_LONG, DalvOps.SHR_LONG,
            Form23x.THE_ONE, true, "shr-long");

    public static final Dop USHR_LONG =
        new Dop(DalvOps.USHR_LONG, DalvOps.USHR_LONG,
            Form23x.THE_ONE, true, "ushr-long");

    public static final Dop ADD_FLOAT =
        new Dop(DalvOps.ADD_FLOAT, DalvOps.ADD_FLOAT,
            Form23x.THE_ONE, true, "add-float");

    public static final Dop SUB_FLOAT =
        new Dop(DalvOps.SUB_FLOAT, DalvOps.SUB_FLOAT,
            Form23x.THE_ONE, true, "sub-float");

    public static final Dop MUL_FLOAT =
        new Dop(DalvOps.MUL_FLOAT, DalvOps.MUL_FLOAT,
            Form23x.THE_ONE, true, "mul-float");

    public static final Dop DIV_FLOAT =
        new Dop(DalvOps.DIV_FLOAT, DalvOps.DIV_FLOAT,
            Form23x.THE_ONE, true, "div-float");

    public static final Dop REM_FLOAT =
        new Dop(DalvOps.REM_FLOAT, DalvOps.REM_FLOAT,
            Form23x.THE_ONE, true, "rem-float");

    public static final Dop ADD_DOUBLE =
        new Dop(DalvOps.ADD_DOUBLE, DalvOps.ADD_DOUBLE,
            Form23x.THE_ONE, true, "add-double");

    public static final Dop SUB_DOUBLE =
        new Dop(DalvOps.SUB_DOUBLE, DalvOps.SUB_DOUBLE,
            Form23x.THE_ONE, true, "sub-double");

    public static final Dop MUL_DOUBLE =
        new Dop(DalvOps.MUL_DOUBLE, DalvOps.MUL_DOUBLE,
            Form23x.THE_ONE, true, "mul-double");

    public static final Dop DIV_DOUBLE =
        new Dop(DalvOps.DIV_DOUBLE, DalvOps.DIV_DOUBLE,
            Form23x.THE_ONE, true, "div-double");

    public static final Dop REM_DOUBLE =
        new Dop(DalvOps.REM_DOUBLE, DalvOps.REM_DOUBLE,
            Form23x.THE_ONE, true, "rem-double");

    public static final Dop ADD_INT_2ADDR =
        new Dop(DalvOps.ADD_INT_2ADDR, DalvOps.ADD_INT,
            Form12x.THE_ONE, true, "add-int/2addr");

    public static final Dop SUB_INT_2ADDR =
        new Dop(DalvOps.SUB_INT_2ADDR, DalvOps.SUB_INT,
            Form12x.THE_ONE, true, "sub-int/2addr");

    public static final Dop MUL_INT_2ADDR =
        new Dop(DalvOps.MUL_INT_2ADDR, DalvOps.MUL_INT,
            Form12x.THE_ONE, true, "mul-int/2addr");

    public static final Dop DIV_INT_2ADDR =
        new Dop(DalvOps.DIV_INT_2ADDR, DalvOps.DIV_INT,
            Form12x.THE_ONE, true, "div-int/2addr");

    public static final Dop REM_INT_2ADDR =
        new Dop(DalvOps.REM_INT_2ADDR, DalvOps.REM_INT,
            Form12x.THE_ONE, true, "rem-int/2addr");

    public static final Dop AND_INT_2ADDR =
        new Dop(DalvOps.AND_INT_2ADDR, DalvOps.AND_INT,
            Form12x.THE_ONE, true, "and-int/2addr");

    public static final Dop OR_INT_2ADDR =
        new Dop(DalvOps.OR_INT_2ADDR, DalvOps.OR_INT,
            Form12x.THE_ONE, true, "or-int/2addr");

    public static final Dop XOR_INT_2ADDR =
        new Dop(DalvOps.XOR_INT_2ADDR, DalvOps.XOR_INT,
            Form12x.THE_ONE, true, "xor-int/2addr");

    public static final Dop SHL_INT_2ADDR =
        new Dop(DalvOps.SHL_INT_2ADDR, DalvOps.SHL_INT,
            Form12x.THE_ONE, true, "shl-int/2addr");

    public static final Dop SHR_INT_2ADDR =
        new Dop(DalvOps.SHR_INT_2ADDR, DalvOps.SHR_INT,
            Form12x.THE_ONE, true, "shr-int/2addr");

    public static final Dop USHR_INT_2ADDR =
        new Dop(DalvOps.USHR_INT_2ADDR, DalvOps.USHR_INT,
            Form12x.THE_ONE, true, "ushr-int/2addr");

    public static final Dop ADD_LONG_2ADDR =
        new Dop(DalvOps.ADD_LONG_2ADDR, DalvOps.ADD_LONG,
            Form12x.THE_ONE, true, "add-long/2addr");

    public static final Dop SUB_LONG_2ADDR =
        new Dop(DalvOps.SUB_LONG_2ADDR, DalvOps.SUB_LONG,
            Form12x.THE_ONE, true, "sub-long/2addr");

    public static final Dop MUL_LONG_2ADDR =
        new Dop(DalvOps.MUL_LONG_2ADDR, DalvOps.MUL_LONG,
            Form12x.THE_ONE, true, "mul-long/2addr");

    public static final Dop DIV_LONG_2ADDR =
        new Dop(DalvOps.DIV_LONG_2ADDR, DalvOps.DIV_LONG,
            Form12x.THE_ONE, true, "div-long/2addr");

    public static final Dop REM_LONG_2ADDR =
        new Dop(DalvOps.REM_LONG_2ADDR, DalvOps.REM_LONG,
            Form12x.THE_ONE, true, "rem-long/2addr");

    public static final Dop AND_LONG_2ADDR =
        new Dop(DalvOps.AND_LONG_2ADDR, DalvOps.AND_LONG,
            Form12x.THE_ONE, true, "and-long/2addr");

    public static final Dop OR_LONG_2ADDR =
        new Dop(DalvOps.OR_LONG_2ADDR, DalvOps.OR_LONG,
            Form12x.THE_ONE, true, "or-long/2addr");

    public static final Dop XOR_LONG_2ADDR =
        new Dop(DalvOps.XOR_LONG_2ADDR, DalvOps.XOR_LONG,
            Form12x.THE_ONE, true, "xor-long/2addr");

    public static final Dop SHL_LONG_2ADDR =
        new Dop(DalvOps.SHL_LONG_2ADDR, DalvOps.SHL_LONG,
            Form12x.THE_ONE, true, "shl-long/2addr");

    public static final Dop SHR_LONG_2ADDR =
        new Dop(DalvOps.SHR_LONG_2ADDR, DalvOps.SHR_LONG,
            Form12x.THE_ONE, true, "shr-long/2addr");

    public static final Dop USHR_LONG_2ADDR =
        new Dop(DalvOps.USHR_LONG_2ADDR, DalvOps.USHR_LONG,
            Form12x.THE_ONE, true, "ushr-long/2addr");

    public static final Dop ADD_FLOAT_2ADDR =
        new Dop(DalvOps.ADD_FLOAT_2ADDR, DalvOps.ADD_FLOAT,
            Form12x.THE_ONE, true, "add-float/2addr");

    public static final Dop SUB_FLOAT_2ADDR =
        new Dop(DalvOps.SUB_FLOAT_2ADDR, DalvOps.SUB_FLOAT,
            Form12x.THE_ONE, true, "sub-float/2addr");

    public static final Dop MUL_FLOAT_2ADDR =
        new Dop(DalvOps.MUL_FLOAT_2ADDR, DalvOps.MUL_FLOAT,
            Form12x.THE_ONE, true, "mul-float/2addr");

    public static final Dop DIV_FLOAT_2ADDR =
        new Dop(DalvOps.DIV_FLOAT_2ADDR, DalvOps.DIV_FLOAT,
            Form12x.THE_ONE, true, "div-float/2addr");

    public static final Dop REM_FLOAT_2ADDR =
        new Dop(DalvOps.REM_FLOAT_2ADDR, DalvOps.REM_FLOAT,
            Form12x.THE_ONE, true, "rem-float/2addr");

    public static final Dop ADD_DOUBLE_2ADDR =
        new Dop(DalvOps.ADD_DOUBLE_2ADDR, DalvOps.ADD_DOUBLE,
            Form12x.THE_ONE, true, "add-double/2addr");

    public static final Dop SUB_DOUBLE_2ADDR =
        new Dop(DalvOps.SUB_DOUBLE_2ADDR, DalvOps.SUB_DOUBLE,
            Form12x.THE_ONE, true, "sub-double/2addr");

    public static final Dop MUL_DOUBLE_2ADDR =
        new Dop(DalvOps.MUL_DOUBLE_2ADDR, DalvOps.MUL_DOUBLE,
            Form12x.THE_ONE, true, "mul-double/2addr");

    public static final Dop DIV_DOUBLE_2ADDR =
        new Dop(DalvOps.DIV_DOUBLE_2ADDR, DalvOps.DIV_DOUBLE,
            Form12x.THE_ONE, true, "div-double/2addr");

    public static final Dop REM_DOUBLE_2ADDR =
        new Dop(DalvOps.REM_DOUBLE_2ADDR, DalvOps.REM_DOUBLE,
            Form12x.THE_ONE, true, "rem-double/2addr");

    public static final Dop ADD_INT_LIT16 =
        new Dop(DalvOps.ADD_INT_LIT16, DalvOps.ADD_INT,
            Form22s.THE_ONE, true, "add-int/lit16");

    public static final Dop RSUB_INT =
        new Dop(DalvOps.RSUB_INT, DalvOps.RSUB_INT,
            Form22s.THE_ONE, true, "rsub-int");

    public static final Dop MUL_INT_LIT16 =
        new Dop(DalvOps.MUL_INT_LIT16, DalvOps.MUL_INT,
            Form22s.THE_ONE, true, "mul-int/lit16");

    public static final Dop DIV_INT_LIT16 =
        new Dop(DalvOps.DIV_INT_LIT16, DalvOps.DIV_INT,
            Form22s.THE_ONE, true, "div-int/lit16");

    public static final Dop REM_INT_LIT16 =
        new Dop(DalvOps.REM_INT_LIT16, DalvOps.REM_INT,
            Form22s.THE_ONE, true, "rem-int/lit16");

    public static final Dop AND_INT_LIT16 =
        new Dop(DalvOps.AND_INT_LIT16, DalvOps.AND_INT,
            Form22s.THE_ONE, true, "and-int/lit16");

    public static final Dop OR_INT_LIT16 =
        new Dop(DalvOps.OR_INT_LIT16, DalvOps.OR_INT,
            Form22s.THE_ONE, true, "or-int/lit16");

    public static final Dop XOR_INT_LIT16 =
        new Dop(DalvOps.XOR_INT_LIT16, DalvOps.XOR_INT,
            Form22s.THE_ONE, true, "xor-int/lit16");

    public static final Dop ADD_INT_LIT8 =
        new Dop(DalvOps.ADD_INT_LIT8, DalvOps.ADD_INT,
            Form22b.THE_ONE, true, "add-int/lit8");

    public static final Dop RSUB_INT_LIT8 =
        new Dop(DalvOps.RSUB_INT_LIT8, DalvOps.RSUB_INT,
            Form22b.THE_ONE, true, "rsub-int/lit8");

    public static final Dop MUL_INT_LIT8 =
        new Dop(DalvOps.MUL_INT_LIT8, DalvOps.MUL_INT,
            Form22b.THE_ONE, true, "mul-int/lit8");

    public static final Dop DIV_INT_LIT8 =
        new Dop(DalvOps.DIV_INT_LIT8, DalvOps.DIV_INT,
            Form22b.THE_ONE, true, "div-int/lit8");

    public static final Dop REM_INT_LIT8 =
        new Dop(DalvOps.REM_INT_LIT8, DalvOps.REM_INT,
            Form22b.THE_ONE, true, "rem-int/lit8");

    public static final Dop AND_INT_LIT8 =
        new Dop(DalvOps.AND_INT_LIT8, DalvOps.AND_INT,
            Form22b.THE_ONE, true, "and-int/lit8");

    public static final Dop OR_INT_LIT8 =
        new Dop(DalvOps.OR_INT_LIT8, DalvOps.OR_INT,
            Form22b.THE_ONE, true, "or-int/lit8");

    public static final Dop XOR_INT_LIT8 =
        new Dop(DalvOps.XOR_INT_LIT8, DalvOps.XOR_INT,
            Form22b.THE_ONE, true, "xor-int/lit8");

    public static final Dop SHL_INT_LIT8 =
        new Dop(DalvOps.SHL_INT_LIT8, DalvOps.SHL_INT,
            Form22b.THE_ONE, true, "shl-int/lit8");

    public static final Dop SHR_INT_LIT8 =
        new Dop(DalvOps.SHR_INT_LIT8, DalvOps.SHR_INT,
            Form22b.THE_ONE, true, "shr-int/lit8");

    public static final Dop USHR_INT_LIT8 =
        new Dop(DalvOps.USHR_INT_LIT8, DalvOps.USHR_INT,
            Form22b.THE_ONE, true, "ushr-int/lit8");

    // END(dops)

    // Static initialization.
    static {
        DOPS = new Dop[DalvOps.MAX_VALUE - DalvOps.MIN_VALUE + 1];

        set(SPECIAL_FORMAT);

        // BEGIN(dops-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);
        // END(dops-init)
    }

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

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

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

        throw new IllegalArgumentException("bogus opcode");
    }

    /**
     * Gets the {@link Dop} with the given family/format combination, if
     * any.
     *
     * @param family {@code DalvOps.MIN_VALUE..DalvOps.MAX_VALUE;} the
     * opcode family
     * @param format {@code non-null;} the opcode's instruction format
     * @return {@code null-ok;} the corresponding opcode, or {@code null} if
     * there is none
     */
    public static Dop getOrNull(int family, InsnFormat format) {
        if (format == null) {
            throw new NullPointerException("format == null");
        }

        int len = DOPS.length;

        // TODO: Linear search is bad.
        for (int i = 0; i < len; i++) {
            Dop dop = DOPS[i];
            if ((dop != null) &&
                (dop.getFamily() == family) &&
                (dop.getFormat() == format)) {
                return dop;
            }
        }

        return null;
    }

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